review-retrovert 0.3.1 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/retrovert.yml +61 -0
  3. data/.gitignore +2 -2
  4. data/.ruby-version +1 -0
  5. data/Dockerfile +1 -1
  6. data/Gemfile +1 -0
  7. data/Gemfile.lock +82 -17
  8. data/README.md +6 -3
  9. data/lib/review/retrovert/cli.rb +4 -0
  10. data/lib/review/retrovert/converter.rb +375 -9
  11. data/lib/review/retrovert/version.rb +1 -1
  12. data/lib/review/retrovert/yamlconfig.rb +13 -1
  13. data/review-retrovert.gemspec +2 -2
  14. data/testdata/mybook/.gitignore +7 -0
  15. data/testdata/mybook/README.md +43 -0
  16. data/testdata/mybook/Rakefile +16 -0
  17. data/testdata/mybook/catalog.yml +33 -0
  18. data/testdata/mybook/config-starter.yml +139 -0
  19. data/testdata/mybook/config.yml +375 -0
  20. data/testdata/mybook/contents/00-preface.re +83 -0
  21. data/testdata/mybook/contents/01-install.re +272 -0
  22. data/testdata/mybook/contents/02-tutorial.re +1008 -0
  23. data/testdata/mybook/contents/03-syntax.re +2613 -0
  24. data/testdata/mybook/contents/04-customize.re +728 -0
  25. data/testdata/mybook/contents/05-faq.re +328 -0
  26. data/testdata/mybook/contents/06-bestpractice.re +971 -0
  27. data/testdata/mybook/contents/91-compare.re +18 -0
  28. data/testdata/mybook/contents/92-filelist.re +119 -0
  29. data/testdata/mybook/contents/93-background.re +267 -0
  30. data/testdata/mybook/contents/99-postface.re +38 -0
  31. data/testdata/mybook/css/normalize.css +349 -0
  32. data/testdata/mybook/css/webstyle.css +514 -0
  33. data/testdata/mybook/images/03-syntax/favicon-16x16.png +0 -0
  34. data/testdata/mybook/images/03-syntax/figure_heretop.png +0 -0
  35. data/testdata/mybook/images/03-syntax/tw-icon1.jpg +0 -0
  36. data/testdata/mybook/images/03-syntax/tw-icon2.jpg +0 -0
  37. data/testdata/mybook/images/03-syntax/tw-icon3.jpg +0 -0
  38. data/testdata/mybook/images/03-syntax/tw-icon4.jpg +0 -0
  39. data/testdata/mybook/images/04-customize/caption_pagebreak.png +0 -0
  40. data/testdata/mybook/images/04-customize/chaptitlepage_sample.png +0 -0
  41. data/testdata/mybook/images/05-faq/codeblock_rpadding1.png +0 -0
  42. data/testdata/mybook/images/05-faq/codeblock_rpadding2.png +0 -0
  43. data/testdata/mybook/images/06-bestpractice/figure_heretop.png +0 -0
  44. data/testdata/mybook/images/06-bestpractice/font_beramono.png +0 -0
  45. data/testdata/mybook/images/06-bestpractice/heading_design1.png +0 -0
  46. data/testdata/mybook/images/06-bestpractice/heading_design2.png +0 -0
  47. data/testdata/mybook/images/06-bestpractice/margin_book.png +0 -0
  48. data/testdata/mybook/images/06-bestpractice/multiline-title.png +0 -0
  49. data/testdata/mybook/images/06-bestpractice/preface_numbered.png +0 -0
  50. data/testdata/mybook/images/06-bestpractice/program_border.png +0 -0
  51. data/testdata/mybook/images/06-bestpractice/sechead_design_4.png +0 -0
  52. data/testdata/mybook/images/06-bestpractice/titlepage-samples.png +0 -0
  53. data/testdata/mybook/images/93-background/bug913.png +0 -0
  54. data/testdata/mybook/images/93-background/slide2.png +0 -0
  55. data/testdata/mybook/images/cover_a5.pdf +0 -0
  56. data/testdata/mybook/images/cover_b5.pdf +0 -0
  57. data/testdata/mybook/images/tw-icon.jpg +0 -0
  58. data/testdata/mybook/layouts/layout.epub.erb +29 -0
  59. data/testdata/mybook/layouts/layout.html5.erb +106 -0
  60. data/testdata/mybook/layouts/layout.tex.erb +546 -0
  61. data/testdata/mybook/lib/hooks/beforetexcompile.rb +55 -0
  62. data/testdata/mybook/lib/ruby/review-builder.rb +503 -0
  63. data/testdata/mybook/lib/ruby/review-cli.rb +58 -0
  64. data/testdata/mybook/lib/ruby/review-compiler.rb +523 -0
  65. data/testdata/mybook/lib/ruby/review-epubmaker.rb +606 -0
  66. data/testdata/mybook/lib/ruby/review-htmlbuilder.rb +661 -0
  67. data/testdata/mybook/lib/ruby/review-latexbuilder.rb +782 -0
  68. data/testdata/mybook/lib/ruby/review-maker.rb +235 -0
  69. data/testdata/mybook/lib/ruby/review-monkeypatch.rb +91 -0
  70. data/testdata/mybook/lib/ruby/review-pdfmaker.rb +468 -0
  71. data/testdata/mybook/lib/ruby/review-textbuilder.rb +36 -0
  72. data/testdata/mybook/lib/ruby/review-tocparser.rb +285 -0
  73. data/testdata/mybook/lib/ruby/review-webmaker.rb +433 -0
  74. data/testdata/mybook/lib/tasks/mytasks.rake +31 -0
  75. data/testdata/mybook/lib/tasks/review.rake +142 -0
  76. data/testdata/mybook/lib/tasks/review.rake.orig +72 -0
  77. data/testdata/mybook/lib/tasks/starter.rake +326 -0
  78. data/testdata/mybook/locale.yml +6 -0
  79. data/testdata/mybook/review-ext.rb +206 -0
  80. data/testdata/mybook/sty/jumoline.sty +310 -0
  81. data/testdata/mybook/sty/mycolophon.sty +81 -0
  82. data/testdata/mybook/sty/mystyle.sty +8 -0
  83. data/testdata/mybook/sty/mytextsize.sty +61 -0
  84. data/testdata/mybook/sty/mytitlepage.sty +103 -0
  85. data/testdata/mybook/sty/reviewmacro.sty +60 -0
  86. data/testdata/mybook/sty/starter-codeblock.sty +332 -0
  87. data/testdata/mybook/sty/starter-color.sty +79 -0
  88. data/testdata/mybook/sty/starter-font.sty +112 -0
  89. data/testdata/mybook/sty/starter-heading.sty +514 -0
  90. data/testdata/mybook/sty/starter-note.sty +127 -0
  91. data/testdata/mybook/sty/starter-section.sty +262 -0
  92. data/testdata/mybook/sty/starter-toc.sty +72 -0
  93. data/testdata/mybook/sty/starter.sty +554 -0
  94. data/testdata/mybook/style.css +597 -0
  95. metadata +100 -10
  96. data/.travis.yml +0 -6
@@ -0,0 +1,328 @@
1
+ = FAQ
2
+
3
+ //abstract{
4
+ よくある質問とその回答(Frequentry Asked Question, FAQ)を紹介します。
5
+ //}
6
+
7
+ #@#//makechaptitlepage[toc=on]
8
+
9
+
10
+ =={sec-compileerror} コンパイルエラー
11
+
12
+
13
+ === コンパイルエラーが出たとき
14
+
15
+ PDFファイル生成時にコンパイルエラーになったときの対処方法について説明します。
16
+
17
+ PDFへのコンパイルは、内部では大きく3つのステージに分かれます。
18
+
19
+ - (1) 設定ファイルを読み込む(@<file>{config.yml}、@<file>{config-starter.yml}、@<file>{catalog.yml})
20
+ - (2) 原稿ファイル(@<file>{*.re})を@<LaTeX>{}ファイルへ変換する
21
+ - (3) @<LaTeX>{}ファイルからPDFファイルを生成する
22
+
23
+ (1)のステージでは、設定ファイルの書き方に間違いがあるとエラーが発生します。
24
+ たとえば次のような点に注意してください。
25
+
26
+ * タブ文字を使ってないか(使っているとエラー)
27
+ * インデントが揃っているか(揃ってないとエラー)
28
+ * 必要な空白が抜けてないか(「@<code>{-}」や「@<code>{:}」の直後)
29
+
30
+ (2)のステージでは、インライン命令やブロック命令の書き方に間違いがあるとエラーが発生します。
31
+ たとえば次のような点に注意してください。
32
+
33
+ * インライン命令がきちんと閉じているか
34
+ * ブロック命令の引数が足りているか、多すぎないか
35
+ * 「@<code>|//}|」が足りてないか、または多すぎないか
36
+ * 「@<code>|@@<nop>{}<fn>{}|」や「@<code>|@@<nop>{}<img>{}|」や「@<code>|@@<nop>{}<table>{}|」のラベルが合っているか
37
+ * 「@<code>|@@<nop>{}<chapref>{}|」で指定した章IDが合っているか
38
+ * 「@<code>|@@<nop>{}<secref>{}|」で指定した節や項が存在するか
39
+ * 脚注の中で「@<code>{]}」を「@<code>{\]}」とエスケープしているか
40
+ * 「@<code>|//image|」で指定した画像ファイルが存在するか
41
+ * 原稿ファイル名を間違っていないか
42
+ * 原稿ファイルの文字コードがUTF-8になっているか
43
+
44
+ このエラーの場合はエラーメッセージが出るので、それを@<bou>{注意深く読めば}解決の糸口が掴めます。
45
+
46
+ (3)のステージでのエラーはあまり発生しないものの、原因がとても分かりにくく、@<LaTeX>{}に慣れている人でないと解決は難しいです。
47
+ ときどきキャッシュファイル(@<file>{*-pdf/})のせいでおかしくなることがあるので、@<B>{困ったらキャッシュファイルを消して再コンパイル}してみましょう。
48
+
49
+ //terminal[][困ったらキャッシュファイルを消して再コンパイル]{
50
+ $ @<userinput>{rm -rf mybook-pdf} @<balloon>{キャッシュファイルを消す}
51
+ $ @<userinput>{rake pdf} @<balloon>{または rake docker:pdf}
52
+ //}
53
+
54
+ それでもエラーが解決できない場合は、ハッシュタグ「@<em>{#reviewstarter}」をつけてTwitterで聞いてみてください(宛先はなくて構いません)。
55
+
56
+
57
+ === 「@<code>|review-pdfmaker|」でPDFが生成できない
58
+
59
+ Starterでは、「@<code>|review-pdfmaker|」や「@<code>|review-epubmaker|」は使えません。
60
+ かわりに「@<code>|rake pdf|」や「@<code>|rake epub|」を使ってください。
61
+
62
+
63
+
64
+ == 本文
65
+
66
+
67
+ === 左右の余白が違う
68
+
69
+ 印刷用PDFファイルでは、左右の余白幅を意図的に変えています。
70
+ これは印刷時の読みやすさを確保したまま、本文の幅を最大限に広げているからです。
71
+ 詳しくは@<secref>{06-bestpractice|subsec-sidemargin}を見てください。
72
+
73
+
74
+ === 文章中のプログラムコードに背景色をつけたい
75
+
76
+ 「@<code>|@@<nop>{}<code>{...}|」を使って文章中に埋め込んだプログラムコードに、背景色をつけられます。
77
+ そのためには、「@<file>{config-starter.yml}」で「@<code>|inlinecode_gray: true|」を設定してください。
78
+
79
+ //list[][ファイル「@<file>{config-starter.yml}」]{
80
+ inlinecode_gray: true
81
+ //}
82
+
83
+ こうすると、@<file>{sty/starter.sty}において次のような@<LaTeX>{}マクロが有効になります。
84
+ 背景色を変えたい場合はこのマクロを変更してください。
85
+
86
+ //list[][ファイル「sty/starter.sty」]{
87
+ \renewcommand{\reviewcode}[1]{%
88
+ \,% % ほんの少しスペースを入れる
89
+ \colorbox{shadecolor}{% % 背景色を薄いグレーに変更
90
+ \texttt{#1}% % 文字種を等幅フォントに変更
91
+ }%
92
+ \,% % ほんの少しスペースを入れる
93
+ }
94
+ //}
95
+
96
+
97
+ === 索引をつけたい
98
+
99
+ Re:VIEWのWikiページを参照してください。
100
+
101
+ * @<href>{https://github.com/kmuto/review/blob/master/doc/makeindex.ja.md}
102
+
103
+
104
+
105
+ == プログラムコードとターミナル
106
+
107
+
108
+ === プログラムコードの見た目が崩れる
109
+
110
+ おそらく、プログラムコードの中でタブ文字が使われています。
111
+ タブ文字を半角空白に置き換えてみてください。
112
+
113
+ Starterでは、プログラム中のタブ文字は自動的に半角空白に置き換わります。
114
+ しかしインライン命令があるとどうしてもカラム幅を正しく計算できないので、意図したようには半角空白に置き換わらず、プログラムの見た目が崩れます。
115
+
116
+
117
+ === 右端に到達してないのに折り返しされる
118
+
119
+ Starterではプログラム中の長い行が自動的に右端で折り返されます。
120
+ このとき、右端にはまだ文字が入るだけのスペースがありそうなのに折り返しされることがあります(@<img>{codeblock_rpadding1})。
121
+
122
+ //image[codeblock_rpadding1][右端にはまだ文字が入るだけのスペースがありそうだが…][scale=0.7]
123
+
124
+ このような場合、プログラムやターミナルの表示幅をほんの少し広げるだけで、右端まで文字が埋まるようになります。
125
+
126
+ 具体的には、ファイル「@<file>{config-starter.yml}」の中の「@<code>{program_widen: 0.0mm}」や「@<code>{terminal_wide: 0.0mm}」を、たとえば「@<code>{0.3mm}」に設定してください(値は各自で調整してください)。
127
+
128
+ //list[][ファイル「config-starter.yml」]{
129
+ ## プログラム(//list)の表示幅をほんの少しだけ広げる。
130
+ @<del>{program_waiden: 0.0mm}
131
+ @<b>{program_widen: 0.3mm}
132
+
133
+ ## ターミナル(//terminal, //cmd)の表示幅をほんの少しだけ広げる。
134
+ @<del>{terminal_widen: 0.0mm}
135
+ @<b>{terminal_widen: 0.3mm}
136
+ //}
137
+
138
+ こうすると、プログラムやターミナルの表示幅が少しだけ広がり、文字が右端まで埋まるようになります(@<img>{codeblock_rpadding2})。
139
+
140
+ //image[codeblock_rpadding2][表示幅をほんの少し広げると、右端まで埋まるようになった][scale=0.7]
141
+
142
+
143
+ === 半角文字の幅を全角文字の半分にしたい
144
+
145
+ 英数字の幅が狭いフォントを使うと、半角文字の幅が全角文字の約半分になります(ぴったりにはなりません)。
146
+
147
+ @<file>{config-starter.yml}で、以下のうち必要なほうを設定してください。
148
+
149
+ //list[][]{
150
+ ## //list用
151
+ program_ttfont: inconsolata-narrow
152
+
153
+ ## //terminal用
154
+ terminal_ttfont: inconsolata-narrow
155
+ //}
156
+
157
+
158
+ === ターミナルの出力を折り返しせずに表示したい
159
+
160
+ ターミナルの出力結果を折り返しせずに表示するには、いくつか方法があります。
161
+
162
+ ===== 小さいフォントで表示する
163
+
164
+ 「@<code>|//terminal|」や「@<code>|//list|」では、小さいフォントで表示するオプションがあります。
165
+ フォントサイズは「@<code>|small|」「@<code>|x-small|」「@<code>|xx-small|」の3つが選べます。
166
+
167
+ //list[][サンプル]{
168
+ /@<nop>$$/terminal[][小さいフォントで表示する][@<b>|fontsize=x-small|]{
169
+ Table "public.customers"
170
+ Column | Type | Nullable | Default
171
+ ------------+---------+----------+---------------------------------------
172
+ id | integer | not null | nextval('customers_id_seq'::regclass)
173
+ name | text | not null |
174
+ created_on | date | not null | CURRENT_DATE
175
+ Indexes:
176
+ "customers_pkey" PRIMARY KEY, btree (id)
177
+ "customers_name_key" UNIQUE CONSTRAINT, btree (name)
178
+ /@<nop>$$/}
179
+ //}
180
+
181
+ //sampleoutputbegin[表示結果]
182
+
183
+ //terminal[][小さいフォントで表示する][fontsize=x-small]{
184
+ Table "public.customers"
185
+ Column | Type | Nullable | Default
186
+ ------------+---------+----------+---------------------------------------
187
+ id | integer | not null | nextval('customers_id_seq'::regclass)
188
+ name | text | not null |
189
+ created_on | date | not null | CURRENT_DATE
190
+ Indexes:
191
+ "customers_pkey" PRIMARY KEY, btree (id)
192
+ "customers_name_key" UNIQUE CONSTRAINT, btree (name)
193
+ //}
194
+
195
+ //sampleoutputend
196
+
197
+
198
+
199
+ ===== 幅の狭い等幅フォントを使う
200
+
201
+ Starterでは等幅フォントを複数の中から選べます。
202
+ このうち「@<em>{inconsolata-narrow}」は文字の表示幅が狭いので、できるだけ折り返しをさせたくない場合に有効です。
203
+
204
+ 「@<file>{config-starter.yml}」で「@<code>|terminal_ttfont:|」を「@<code>|inconsolata-narrow|」に設定してください。
205
+
206
+
207
+ === コードハイライトしたい
208
+
209
+ コードハイライトは、Starterでは未サポートです@<fn>{fn-rkpw8}。
210
+ 将来的にはサポートする予定ですが、時期は未定です。
211
+
212
+ //footnote[fn-rkpw8][Re:VIEWではコードハイライトができるそうです。]
213
+
214
+
215
+
216
+ == その他
217
+
218
+
219
+ === @<LaTeX>{}のスタイルファイルから環境変数を参照する
220
+
221
+ Starterでは、名前が「@<em>{STARTER_}」で始まる環境変数を@<LaTeX>{}のスタイルファイルから参照できます。
222
+
223
+ たとえば「@<code>{STARTER_FOO_BAR}」という環境変数を設定すると、@<code>{sty/mystyle.sty}や@<code>{sty/starter.sty}では「@<code>{\STARTER@FOO@BAR}」という名前で参照できます。
224
+ 想像がつくと思いますが、環境変数名の「@<code>{_}」は「@<code>{@}」に変換されます。
225
+
226
+ //terminal[][環境変数を設定する例(macOS, UNIX)]{
227
+ $ @<userinput>{export STARTER_FOO_BAR="foobar"}
228
+ //}
229
+
230
+ //list[][環境変数を参照する例]{
231
+ %% ファイル:sty/mystyle.sty
232
+ \newcommand\foobar[0]{% % 引数なしコマンドを定義
233
+ \@ifundefined{STARTER@FOO@BAR}{% % 未定義なら
234
+ foobar% % デフォルト値を使う
235
+ }{% % 定義済みなら
236
+ \STARTER@FOO@BAR% % その値を使う
237
+ }%
238
+ }
239
+ //}
240
+
241
+ この機能を使うと、出力や挙動を少し変更したい場合に環境変数でコントロールできます。
242
+ また値の中に「@<code>{$}」や「@<code>{\\}」が入っていてもエスケープはしないので注意してください。
243
+
244
+
245
+ === 高度なカスタマイズ
246
+
247
+ 設定ファイルや@<LaTeX>{}スタイルファイルでは対応できないようなカスタマイズが必要になることがあります。
248
+ たとえば次のような場合です。
249
+
250
+ * 印刷用とタブレット用でPDFファイルの仕様を大きく変えたい。
251
+ * B5サイズとA5サイズの両方のPDFファイルを生成したい。
252
+ * β版と本番用とで設定を切り替えたい。
253
+ * コンパイルするたびに、あるプログラムの実行結果を原稿ファイルに埋め込みたい。
254
+
255
+ このような要件を、Re:VIEWやStarterの機能を使い倒して実現してもいいですが、それよりも汎用的なやり方で実現しましょう。
256
+ 方針としては、設定ファイルや原稿ファイルを用途に応じて生成するのがいいでしょう。
257
+
258
+ ここでは例として「印刷用とタブレット用で@<file>{config-starter.yml}の内容を変える」ことを考えてみます。
259
+
260
+ //blankline
261
+ //noindent
262
+ (1) 「@<file>{config-starter.yml}」に拡張子「@<file>{.eruby}」をつけます。
263
+
264
+ //terminal{
265
+ $ @<userinput>{mv config-starter.yml config-starter.yml.eruby}
266
+ ## またはこうでもよい
267
+ $ @<userinput>$mv config-starter.yml{,.eruby}$
268
+ //}
269
+
270
+ //noindent
271
+ (2) 次に、そのファイルに次のような条件分岐を埋め込みます。
272
+
273
+ //list[][ファイル「config-starter.yml.eruby」]{
274
+ ....(省略)....
275
+ @<b>$<% if buildmode == 'printing' # 印刷向け %>$
276
+ target: pbook
277
+ pagesize: B5
278
+ fontsize: 10pt
279
+ textwidth: 44zw
280
+ @<b>$<% elsif buildmode == 'tablet' # タブレット向け %>$
281
+ target: tablet
282
+ pagesize: A5
283
+ fontsize: 10pt
284
+ textwidth: 42zw
285
+ @<b>$<% else abort "error: buildmode=#{buildmode.inspect}" %>$
286
+ @<b>$<% end %>$
287
+ //}
288
+
289
+ //noindent
290
+ (3) 「@<file>{config-starter.yml}」を生成するRakeタスクを定義します。
291
+ ここまでが準備です。
292
+
293
+ //source[lib/tasks/mytasks.rake]{
294
+ def render_eruby_files(param) # 要 Ruby >= 2.2
295
+ Dir.glob('**/*.eruby').each do |erubyfile|
296
+ origfile = erubyfile.sub(/\.eruby$/, '')
297
+ sh "erb -T 2 -P '#{param}' #{erubyfile} > #{origfile}"
298
+ end
299
+ end
300
+
301
+ namespace :setup do
302
+
303
+ desc "*印刷用に設定 (B5, 10pt, mono)"
304
+ task :printing do
305
+ render_eruby_files('buildmode=printing')
306
+ end
307
+
308
+ desc "*タブレット用に設定 (A5, 10pt, color)"
309
+ task :tablet do
310
+ render_eruby_files('buildmode=tablet')
311
+ end
312
+
313
+ end
314
+ //}
315
+
316
+ //noindent
317
+ (4)「@<code>{rake setup:printing}」または「@<code>{rake setup:tablet}」を実行すると、@<file>{config-starter.yml}が生成されます。
318
+ そのあとで「@<code>{rake pdf}」を実行すれば、用途に応じたPDFが生成されます。
319
+
320
+ //cmd{
321
+ $ @<b>{rake setup:printing # 印刷用}
322
+ $ rake pdf
323
+ $ mv mybook.pdf mybook_printing.pdf
324
+
325
+ $ @<b>{rake setup:tablet # タブレット用}
326
+ $ rake pdf
327
+ $ mv mybook.pdf mybook_tablet.pdf
328
+ //}
@@ -0,0 +1,971 @@
1
+ = よりよい本づくり
2
+
3
+ //abstract{
4
+ せっかく本を作るなら、よりよい本づくりを目指しましょう。
5
+
6
+ この章では、よりよい本にするためのポイントを紹介します。
7
+ //}
8
+
9
+ #@#//makechaptitlepage[toc=on]
10
+
11
+
12
+
13
+ == まえがき
14
+
15
+
16
+ === まえがきには章番号をつけない
17
+
18
+ ときどき、「まえがき」に章番号がついている技術系同人誌を見かけます(@<img>{preface_numbered})。
19
+ しかし一般的には、「まえがき」や「あとがき」には章番号はつけません。
20
+
21
+ //image[preface_numbered][間違って章番号がついた「まえがき」][scale=0.8,border=on]
22
+
23
+ Re:VIEWおよびStarterでは、「@<file>{catalog.yml}」の「@<code>|PREDEF:|」や「@<code>|POSTDEF:|」に指定した原稿ファイルには、章番号がつきません。
24
+ これを間違えて「@<code>|CHAPS:|」に含めてしまうと、「まえがき」や「あとがき」に章番号がついてしまうので気をつけてください。
25
+
26
+
27
+ === まえがきに「本書の目的」を入れる
28
+
29
+ 「まえがき」に本の概要や目的があると、本を手にとった人がその本を買うかどうかを判断できます。
30
+
31
+ 次のは「本書の目的」のサンプルです。
32
+
33
+ ===={notoc} 本書の目的
34
+
35
+ 本書の目的は、SQLを初めてさわる初心者が、簡単な検索と集計をSQLでできるようになることです。
36
+ マーケティング部に配属された新卒1年目の人が、SQLで簡単なデータ分析をできるようになりたいなら、この本はぴったりです。
37
+
38
+ SQLのチューニングや、データベース設計といった内容は、本書の範囲ではありません。
39
+
40
+
41
+ === まえがきに「対象読者」を入れる
42
+
43
+ 先ほどの話と似ていますが、「まえがき」に本の対象読者が書かれてあると、本を手にとった人は自分がその本の対象読者かどうか、判断しやすいです。
44
+
45
+ このとき、「初心者」と「初級者」をちゃんと区別するといいでしょう。
46
+
47
+ * 「初心者」は入門書をまだ読んでいない人や読んでる途中の人
48
+ * 「初級者」は入門書を読み終えた人、実務での経験が浅い人
49
+
50
+ 次のは「対象読者」のサンプルです。
51
+
52
+ ===={notoc} 本書の対象読者
53
+
54
+ 本書は、何らかのオブジェクト指向言語の入門書を読み終えた初級者を対象としています。
55
+ そのため、「オブジェクト」「クラス」「メソッド」などの用語は説明なしに使用します。
56
+ まったくの初心者は本書の対象ではないので注意してください。
57
+
58
+
59
+ === まえがきに「前提知識」を入れる
60
+
61
+ これまでの話と似ていますが、その本を読むのにどんな前提知識がどのくらいのレベルで必要かを「まえがき」に書いておくと、本を手にとった人は買うかどうかの判断がしやすいです。
62
+
63
+ このとき、具体例を添えておくといいでしょう。
64
+ たとえば「Linuxの基礎知識を前提とします」だけでは、どんな基礎知識がどのレベルで必要なのか、よくわかりません。
65
+ もしこれが「@<code>|ln -s|でシンボリックリンクが作れること」「@<code>{ps -ef|grep gzip}が何をしているのか分かること」「パイプとリダイレクトの違いが説明できること」だと、必要な前提知識のレベルがよく分かります。
66
+
67
+ 次のは「前提知識」のサンプルです。
68
+
69
+ ===={notoc} 本書の前提知識
70
+
71
+ 本書は、Python をある程度使いこなしている中級者以上を対象にしています。そのため、Pythonの基礎知識を持っていることを前提とします。
72
+
73
+ 具体的には、次のことがすべて分かることが前提となります。
74
+
75
+ * 「@<code>|[x for x in range(1, 11) if x % 2]|」の意味が分かる
76
+ * 「@<code>|(lambda x, y: x + y)(3, 4)|」の結果が予想できる
77
+ * 「@<code>|x=1|」と「@<code>|fn(x=1)|」の違いが分かる
78
+ * 「@<code>|return|」と「@<code>|yield|」の違いが説明できる
79
+ * 「@<code>|@property|」が何か分かる
80
+
81
+
82
+ === まえがきにサポートサイトのURLを載せる
83
+
84
+ 本の正誤表が載っていたり、サンプルコードがダウンロードできるサイトのことをここでは「サポートサイト」と呼ぶことにします。
85
+
86
+ 本や同人誌を書いたら、ぜひサポートサイトを用意しましょう。
87
+ そして正誤表とサンプルコード、できれば質問ができる連絡先を用意しましょう。
88
+
89
+ そしてそのURLをまえがき(と奥付)に載せましょう。
90
+
91
+ 次のはサポートサイト紹介文のサンプルです。
92
+
93
+ ==== サポートサイト
94
+
95
+ 本書の正誤表は次のサイトに載っています。
96
+ サンプルコードもここからダウンロードできます。
97
+
98
+ * @<href>{https://www.example.com/mygreatbook/}
99
+
100
+
101
+ === まえがきに謝辞を載せる
102
+
103
+ レビューしてくれた人や編集者がいたら、まえがきに謝辞を書きましょう。
104
+ 家族への謝辞を入れるのもよくあります。
105
+
106
+ 謝辞を忘れるのはかなり失礼な行為に当たります。
107
+ また名前を間違ったり、名前が抜けるのも大変失礼です。
108
+ 締切間際に謝辞を書くと間違える可能性が高いので、執筆期間の早いうちに謝辞を書いておきましょう。
109
+
110
+
111
+ === まえがきにソフトウェアのバージョンを載せる
112
+
113
+ まえがきに、使用した(または動作検証した)ソフトウェアのバージョンを載せるといいでしょう。
114
+
115
+ たとえばPythonの2.7なのか3.Xなのかは大きな問題です。
116
+ またLinuxだとCentOSなのかUbuntuなのか、Ubuntuなら18.04なのか20.04なのか、といった情報を、まえがきに書いておきましょう。
117
+
118
+
119
+ === まえがきの章タイトル以外は目次に載せない
120
+
121
+ 目次には「まえがき」だけが載っていればよく、「本書の目的」や「対象読者」や「謝辞」などは目次に載せる必要はありません。
122
+
123
+ これらを目次に載せないための方法は2つあります。
124
+
125
+ ひとつは、節(Section)や項(Subsection)のタイトルに「@<code>|[notoc]|」オプションをつけることです。
126
+ これをつけると、その節や項は目次に載りません。
127
+
128
+ //list[][]{
129
+ @<nop>{}= はじめに
130
+
131
+ @<nop>{}==@<b>|[notoc]| 本書の目的
132
+
133
+ @<nop>{}==@<b>|[notoc]| 対象読者
134
+
135
+ @<nop>{}==@<b>|[notoc]| 謝辞
136
+
137
+ //}
138
+
139
+ もうひとつは、節(Section)や項(Subsection)を飛ばして目(Subsubsection)を使うことです。
140
+ 通常、目次に乗るのは項までで目は載りません。
141
+ そこで、次のような見出しにすれば「本書の目的」や「対象読者」や「謝辞」は目次に載りません。
142
+
143
+ //list[][]{
144
+ @<nop>{}= はじめに
145
+
146
+ @<nop>{}@<b>|====| 本書の目的
147
+
148
+ @<nop>{}@<b>|====| 対象読者
149
+
150
+ @<nop>{}@<b>|====| 謝辞
151
+
152
+ //}
153
+
154
+ この方法は見出しのレベルを飛ばしているので、本文で使うのはよくありません。
155
+ しかし目次に載らないところで使うなら、あまり気にしなくてもいいでしょう。
156
+
157
+
158
+
159
+ == 初心者向け入門書
160
+
161
+
162
+ === 初心者向け入門書ではフォントを大きめにする
163
+
164
+ Starterでは、デフォルトでは次のようなフォントサイズにしています。
165
+
166
+ * ページがB5サイズなら、フォントは10pt
167
+ * ページがA5サイズなら、フォントは9pt
168
+
169
+ しかし初心者向けの入門書では、次のように少し大きめのフォントを使ったほうが、紙面から受ける圧迫感が減ります@<fn>{fn-8ow3e}。
170
+
171
+ * ページがB5サイズなら、フォントは11pt
172
+ * ページがA5サイズなら、フォントは10pt
173
+
174
+ //footnote[fn-8ow3e][興味のある人は本屋に行って、入門書とオライリー本の本文を比べてみるといいでしょう。]
175
+
176
+ とはいえフォントを大きくしていない入門書もよく見かけます。
177
+ フォントを大きくするとページ数が増えてその分印刷代が高くなるので、どうするかはよく考えてください。
178
+
179
+ Starterで本文のフォントサイズを変える方法は、@<secref>{04-customize|subsec-fontsize}を参照してください。
180
+ またそれに合わせて本文の幅も変更する必要があるので、@<secref>{04-customize|subsec-textwidth}を参照してください。
181
+
182
+
183
+ === 初心者向け入門書では節と項の見分けをつきやすくする
184
+
185
+ Re:VIEWでは@<LaTeX>{}のデザインをそのまま使っているので、節(Section)と項(Subsection)のデザインがよく似ており、見分けにくいです(@<img>{heading_design1})。
186
+ 初心者は本を読み慣れていないので、このデザインでは節と項の違いが分からず、結果として文書構造を理解しないまま読み進めてしまいます。
187
+
188
+ //image[heading_design1][Re:VIEWでは節(Section)と項(Subsection)が見分けにくい][scale=0.9,border=on]
189
+
190
+ Starterでは、節と項のデザインを大きく変えており、見分けやすくなっています(@<img>{heading_design2})。
191
+ これは、初心者でも節と項の違いがすぐに分かり、文書構造を把握できるようにするための配慮です。
192
+
193
+ //image[heading_design2][Starterでは節(Section)と項(Subsection)が見分けやすい][scale=0.9,border=on]
194
+
195
+
196
+ === 初心者向け入門書では節ごとに改ページする
197
+
198
+ 初心者向けの入門書では、節(Section)ごとに改ページしていることが多いです。
199
+ そもそも初心者は本自体を読み慣れていないことが多いので、節ごとに改ページしてあげることで、文章の構造を分かりやすく示せます。
200
+
201
+ Starterでは節ごとに改ページする設定が用意されています。
202
+ 詳しくは@<secref>{04-customize|subsec-newpagepersec}を参照してください。
203
+
204
+ ただし節ごとに改ページすると、当然ですが全体のページ数は増え、それを調整するために本文をあれこれ変更する必要があります。
205
+ 実践するのは時間とお金(印刷代)に余裕がある場合だけにしましょう@<fn>{fn-njede}。
206
+
207
+ //footnote[fn-njede][逆にいうと、商業の入門書はそれだけのコストを掛けて制作されているということです。]
208
+
209
+
210
+
211
+ == 箇条書き
212
+
213
+ === 箇条書きを正しく使い分ける
214
+
215
+ 箇条書きには「番号なし」「番号つき」「ラベルつき」の3つがあります。
216
+
217
+ 番号なしの箇条書きは、項目に順序がないか、あっても重要ではない場合に使います。
218
+ たとえば次の例では、公開された順に項目が並んでいますがそこはあまり重要ではなく、項目の順番を入れ替えても文章の意味は成り立つので、番号なしの箇条書きを使います。
219
+
220
+ //list[][サンプル]{
221
+ スタジオジブリ初期の代表作は次の通りです。
222
+
223
+ * 風の谷のナウシカ
224
+ * 天空の城ラピュタ
225
+ * となりのトトロ
226
+ //}
227
+
228
+ //sampleoutputbegin[表示結果]
229
+
230
+ スタジオジブリ初期の代表作は次の通りです。
231
+
232
+ * 風の谷のナウシカ
233
+ * 天空の城ラピュタ
234
+ * となりのトトロ
235
+
236
+ //sampleoutputend
237
+
238
+
239
+
240
+ 番号つきの箇条書きは、手順や順位など、項目の順序が重要な場合に使います。
241
+ たとえば次の例では項目の順序が重要なので、番号つきの箇条書きを使います。
242
+
243
+ //list[][サンプル]{
244
+ スタジオジブリ初期の代表作を、好きな順に並べました。
245
+
246
+ 1. 風の谷のナウシカ
247
+ 2. 天空の城ラピュタ
248
+ 3. となりのトトロ
249
+ //}
250
+
251
+ //sampleoutputbegin[表示結果]
252
+
253
+ スタジオジブリ初期の代表作を、好きな順に並べました。
254
+
255
+ 1. 風の谷のナウシカ
256
+ 2. 天空の城ラピュタ
257
+ 3. となりのトトロ
258
+
259
+ //sampleoutputend
260
+
261
+
262
+
263
+ ラベルつきの箇条書きは、一見すると番号つき箇条書きに似ていますが、数字ではなくアルファベットや文字を使う点が違います。
264
+ またラベルはあとから参照しやすくするために使い、順番を表すためには使いません。
265
+ そのため、ラベルつきの箇条書きは「番号なし箇条書きにラベルをつけたもの」として使います。
266
+
267
+ たとえば次の例では、項目の順序は重要ではないので番号なし箇条書きでもいいのですが、あとから項目を参照するのでラベルつき箇条書きにしています。
268
+
269
+ //list[][サンプル]{
270
+ スタジオジブリ初期の代表作は次の通りです。
271
+
272
+ - (A) 風の谷のナウシカ
273
+ - (B) 天空の城ラピュタ
274
+ - (C) となりのトトロ
275
+
276
+ 興行収入を調べると、(A)が14.8億円、(B)が11.6億円、(C)が11.7億円でした。
277
+ //}
278
+
279
+ //sampleoutputbegin[表示結果]
280
+
281
+ スタジオジブリ初期の代表作は次の通りです。
282
+
283
+ - (A) 風の谷のナウシカ
284
+ - (B) 天空の城ラピュタ
285
+ - (C) となりのトトロ
286
+
287
+ 興行収入を調べると、(A)が14.8億円、(B)が11.6億円、(C)が11.7億円でした。
288
+
289
+ //sampleoutputend
290
+
291
+
292
+
293
+ 番号つき箇条書きとラベルつき箇条書きは、きちんと使い分けましょう。
294
+ 前者は順序に強い意味がある場合、後者は意味がないか弱い場合に使います。
295
+
296
+
297
+ === 箇条書き直後に継続する段落は字下げしない
298
+
299
+ 段落の途中に箇条書きを入れる場合、箇条書きの直後は字下げ(インデント)をしないようにしましょう。
300
+
301
+ 次の例を見てください。
302
+ 箇条書きの直後に「@<code>|//noindent|」を入れることで、字下げしないようにしています。
303
+
304
+ //list[][サンプル]{
305
+ スタジオジブリ初期の代表作には、
306
+
307
+ * 風の谷のナウシカ
308
+ * 天空の城ラピュタ
309
+ * となりのトトロ
310
+
311
+ @<b>|//noindent|
312
+ が挙げられます。
313
+
314
+ しかしスタジオジブリが発足したのは実はトトロからであり、ナウシカとラピュタは厳密にはスタジオジブリの製作ではないのです。
315
+ //}
316
+
317
+ //sampleoutputbegin[表示結果]
318
+
319
+ スタジオジブリ初期の代表作には、
320
+
321
+ * 風の谷のナウシカ
322
+ * 天空の城ラピュタ
323
+ * となりのトトロ
324
+
325
+ //noindent
326
+ が挙げられます。
327
+
328
+ しかしスタジオジブリが発足したのは実はトトロからであり、ナウシカとラピュタは厳密にはスタジオジブリの製作ではないのです。
329
+
330
+ //sampleoutputend
331
+
332
+
333
+
334
+ 字下げは段落の始まりを表すために使います。
335
+ しかし上の例の「が挙げられます。」は段落の始まりではなく途中だと考えられるため、字下げは行いません。
336
+
337
+ もっとも、段落の途中に箇条書きを入れること自体がよくありません。
338
+ この例なら、次のように書き換えるといいでしょう。
339
+
340
+ //list[][サンプル]{
341
+ スタジオジブリ初期の代表作には、@<b>|次の3つが挙げられます。|
342
+
343
+ * 風の谷のナウシカ
344
+ * 天空の城ラピュタ
345
+ * となりのトトロ
346
+
347
+ しかしスタジオジブリが発足したのは実はトトロからであり、ナウシカとラピュタは厳密にはスタジオジブリの製作ではないのです。
348
+ //}
349
+
350
+
351
+
352
+
353
+
354
+ == 本文
355
+
356
+
357
+ === 強調箇所は太字のゴシック体にする
358
+
359
+ 日本語の文章では本文が明朝体の場合、強調箇所は太字にするだけでなく、ゴシック体にするのがよいとされています。
360
+ そのため、強調には「@<code>|@@<nop>{}<b>{...}|」ではなく「@<code>|@@<nop>{}<B>{...}|」または「@<code>|@@<nop>{}<strong>{...}|」を使ってください。
361
+
362
+ //list[][サンプル]{
363
+ 本文本文@<b>|@@<nop>$$<B>{強調}|本文本文。@@<nop>$$<balloon>{ゴシック体なので望ましい}
364
+
365
+ 本文本文@<b>|@@<nop>$$<b>{太字}|本文本文。@@<nop>$$<balloon>{明朝体のままなので望ましくない}
366
+ //}
367
+
368
+ //sampleoutputbegin[表示結果]
369
+
370
+ 本文本文@<B>{強調}本文本文。@<balloon>{ゴシック体なので望ましい}
371
+
372
+ 本文本文@<b>{太字}本文本文。@<balloon>{明朝体のままなので望ましくない}
373
+
374
+ //sampleoutputend
375
+
376
+
377
+
378
+
379
+ === 強調と傍点を使い分ける
380
+
381
+ 傍点とは@<bou>{このように}文章の上についた小さな点のことであり、Re:VIEWやStarterなら「@<code>|@@<nop>{}<bou>{...}|」でつけられます。
382
+
383
+ 傍点は強調とよく似ていますが、強調は「重要な箇所」を表すのに対し、傍点は「重要ではないけど他と区別したい、注意を向けたい」という用途で使います。
384
+
385
+ たとえば次の例では、否定文であることが見落とされないよう、傍点を使っています。
386
+ ここは重要箇所ではないので、強調は使わないほうがいいでしょう。
387
+
388
+ //quote{
389
+ //noindent
390
+ Re:VIEW Starterではアップグレード用スクリプトを用意して@<bou>{いません}。
391
+ //}
392
+
393
+ また技術系の文書ではほとんど見かけませんが、小説やエッセーや漫画では「何か含みを持たせた表現」や「のちの伏線になる箇所」に傍点を使います。
394
+ 参考までに、『ワールドトリガー』22巻@<fn>{fn-z94o3}から傍点を使った例を(ネタバレは避けつつ)引用します。
395
+
396
+ //quote{
397
+ //noindent
398
+ その@<ruby>{追尾弾, ハウンド}は@<bou>{相手を動かすため}の@<ruby>{追尾弾, ハウンド}なのよ @<small>{(p.132)}
399
+ //}
400
+
401
+ //quote{
402
+ //noindent
403
+ だとすると、@<ruby>{雨取, あまとり}ちゃんは人を@<bou>{狙って撃てない}のか? @<small>{(p.133)}
404
+ //}
405
+
406
+ //quote{
407
+ //noindent
408
+ 今の@<ruby>{千佳, ちか}は間違いなくちゃんと
409
+ @<bou>{戦う意志}を持ってますよ @<small>{(p.134)}
410
+ //}
411
+
412
+ //quote{
413
+ //noindent
414
+ #@#さっきの@<ruby>{弾, たま}は@<bou>{追尾性能を切った}@<ruby>{追尾弾, ハウンド}か……!? @<small>{(p.174)}
415
+ さっきの@<ruby>{弾, たま}は@<bou>{■■■■を■った}■■■か……!? @<small>{(p.174)}
416
+ //}
417
+
418
+ //footnote[fn-z94o3][『ワールドトリガー』22巻(葦原大介、集英社、2020年)]
419
+
420
+
421
+ === [PDF] 記号と日本語はくっつくことに注意する
422
+
423
+ PDFでは、読みやすさのために日本語と英数字の間に少しアキ(隙間)が入ります。
424
+ これは内部で使っている組版用ソフト「@<LaTeX>{}」の仕様です。
425
+
426
+ //list[][サンプル]{
427
+ あいうえおABC DEFかきくけこ123
428
+ //}
429
+
430
+ //sampleoutputbegin[表示結果]
431
+
432
+ あいうえおABC DEFかきくけこ123
433
+
434
+ //sampleoutputend
435
+
436
+
437
+
438
+ しかし記号の場合はアキが入りません。
439
+ たとえば次の例では、「ン」と「-」の間にはアキが入っていません。
440
+
441
+ //list[][サンプル]{
442
+ オプション-pを使う。
443
+ //}
444
+
445
+ //sampleoutputbegin[表示結果]
446
+
447
+ オプション-pを使う。
448
+
449
+ //sampleoutputend
450
+
451
+
452
+
453
+ このような場合は、半角空白を入れるか、またはカッコでくくるといいでしょう。
454
+
455
+ //list[][サンプル]{
456
+ オプション -p を使う。
457
+
458
+ オプション「-p」を使う。
459
+ //}
460
+
461
+ //sampleoutputbegin[表示結果]
462
+
463
+ オプション -p を使う。
464
+
465
+ オプション「-p」を使う。
466
+
467
+ //sampleoutputend
468
+
469
+
470
+
471
+
472
+ === [PDF] 等幅フォントで余計な空白が入るのを防ぐ
473
+
474
+ (TODO)
475
+
476
+
477
+ === 文章中のコードは折り返しする
478
+
479
+ (TODO)
480
+
481
+
482
+ === ノートとコラムを使い分ける
483
+
484
+ (TODO)
485
+
486
+
487
+
488
+ == 見出し
489
+
490
+ === 節タイトルが複数行になるなら下線や背景色を使わない
491
+
492
+ Starterでは節(Section)のタイトルに下線や背景色をつけられます。
493
+ しかしそれらは節タイトルが1行に収まる場合だけを想定しており、複数行の場合は考慮されていません。
494
+
495
+ タイトルが長い節(Section)がある場合は、節タイトルに下線も背景色も使わないものがいいでしょう。
496
+ 具体的には次のどちらかを選びましょう。
497
+
498
+ * 「@<code>{leftline}」… 節タイトル左に縦線を引く(@<img>{sechead_design_4}上)
499
+ * 「@<code>{numbox}」… 節番号を白ヌキ文字にする(@<img>{sechead_design_4}下)
500
+
501
+ //image[sechead_design_4][タイトルが複数行でも崩れない節デザインの例][scale=0.8,border=on]
502
+
503
+ Starterにおける節タイトルのデザインを変更する方法は、@<secref>{04-customize|subsec-sectitle}を参照してください。
504
+
505
+
506
+ === 項を参照するなら項番号をつける
507
+
508
+ 「@<code>|@@<nop>{}<secref>{}|」や「@<code>|@@<nop>{}<hd>{}|」で項(Subsection)を参照するなら、項にも番号をつけましょう。
509
+ 番号のついていない見出しを参照するのは止めておいたほうがいいでしょう。
510
+
511
+ 項に番号をつける方法は、@<secref>{04-customize|subsec-subsecnum}を参照してください。
512
+
513
+
514
+
515
+ == プログラムコード
516
+
517
+ === 0とOや1とlが見分けやすいフォントを使う
518
+
519
+ プログラムコードやターミナルでは、0とOや、1とlが見分けやすい等幅フォントを使ってください(@<img>{font_beramono})。
520
+ 具体的には「@<em>{beramono}」フォントか「@<em>{inconsolata}」フォントを使うといいでしょう。
521
+
522
+ //image[font_beramono][0とOや、1とlが見分けやすい等幅フォントを使う][scale=0.8]
523
+
524
+ Starterでは、プログラムコードやターミナルの等幅フォントを選べる設定を用意しています。
525
+ 詳しくは@<secref>{04-customize|subsec-ttfont}を参照してください。
526
+
527
+
528
+ === フォントを小さくしすぎない
529
+
530
+ プログラムコードやターミナルのフォントサイズが小さすぎると、とても読みづらくなります。
531
+ 具体的には、8pt以下@<fn>{fn-5c1j2}にするのはやめましょう。
532
+
533
+ //footnote[fn-5c1j2][念のために説明すると、「8pt以下」には8ptも含まれます。]
534
+
535
+ 昔は長い行をページ内に収める必要があったため、プログラムコードのフォントサイズを小さくする必要がありました。
536
+ しかし今は長い行を自動的に折り返す機能があるので、小さいフォントを使う必要性は薄れています。
537
+ また、たとえば「@<em>{inconsolata}」フォントは@<LaTeX>{}のデフォルトフォントと比べて小さめに表示されるため、このフォントを選ぶと必要以上に小さく見えます。
538
+
539
+ Starterのデフォルトでは、本文のフォントサイズに関わらず、A5サイズなら9pt、B5サイズなら10ptのフォントサイズが使われます。
540
+
541
+ * A5サイズなら、本文が9ptでも10ptでも、プログラムコードはデフォルトで9pt
542
+ * B5サイズなら、本文が10ptでも11ptでも、プログラムコードはデフォルトで10pt
543
+
544
+ この調整は、「@<file>{config-starter.yml}」の設定項目「@<code>|program_fontsize:|」と「@<code>|terminal_fontsize:|」で行われています。
545
+ 本文がA5サイズ10ptまたはB5サイズ11ptならこれらが「@<code>|small|」に設定され、A5サイズ9ptまたはB5サイズ10ptなら「@<code>|normal|」に設定されます。
546
+
547
+
548
+ === 重要箇所を目立たせる
549
+
550
+ プログラムコードが10行以上あると、読者はコードのどこに注目すればいいか、分からなくなります。
551
+ もし注目してほしい箇所が強調されていれば、読者にとってとても理解しやすくなります。
552
+
553
+ プログラムコードの中で注目してほしい箇所は、ぜひ太字にして目立たせましょう。
554
+ たとえば次の例は再帰プログラムの説明なので、再帰している箇所を太字にして目立たせています。
555
+
556
+ //list[][再帰プログラムの例]{
557
+ function @<b>|fib(n)| {
558
+ if (n <= 1) {
559
+ return n;
560
+ } else {
561
+ return @<b>|fib(n-1)| + @<b>|fib(n-2)|;
562
+ }
563
+ }
564
+ //}
565
+
566
+ なおプログラムコードを太字にするときは、「@<code>|@@<nop>{}<B>{}|」ではなく「@<code>|@@<nop>{}<b>{}|」を使ってください。
567
+ 「@<code>|@@<nop>{}<B>{}|」だと等幅フォントのはずがゴシック体に変わってしまいます。
568
+ 「@<code>|@@<nop>{}<b>{}|」だと太字にするだけなので等幅フォントのままで変わりません。
569
+
570
+ //note[太字では目立たないことがある]{
571
+ 太字にしても目立たない文字や記号があるので注意してください@<fn>{fn-owu4i}。
572
+
573
+ たとえば空白やタブ文字は、目に見えないので太字にしても見えません。
574
+ またピリオド「@<code>|.|」やカンマ「@<code>|,|」やハイフン「@<code>|-|」やクオート「@<code>|'"`|」などは、太字にしても目立たず、読者には気づいてもらえない可能性が高いです。
575
+
576
+ 解決策としては、文字の色を変えるか、背景色を変えることです。
577
+ Starterではどのような方法にするかを検討中です。
578
+
579
+ //footnote[fn-owu4i][重要でない箇所を薄く表示したり、削除したコードに取り消し線をつける場合でも、同様の問題が起こります。]
580
+ //}
581
+
582
+
583
+ === 重要でない箇所を目立たせない
584
+
585
+ Javaの「@<code>{public static void main(String[] args)}」や、PHPの「@<code>|<?php ?>|」は、プログラムコードの説明において重要ではないので、目立たせないようにするといいでしょう。
586
+
587
+ Starterでは「@<code>|@@<nop>{}<weak>{...}|」を使うと、プログラムコードの一部を目立たせないようにできます。
588
+
589
+ //list[][重要でない箇所を目立たせなくした例]{
590
+ @<weak>|public class Example {|
591
+ @<weak>| public static void main(String[] args) {|
592
+ System.out.println("Hello, world!");
593
+ @<weak>| }|
594
+ @<weak>|}|
595
+ //}
596
+
597
+
598
+ === 差分(追加と削除)の箇所を明示する
599
+
600
+ サンプルコードを徐々に改善するような内容の場合は、削除した行に取り消し線を引き、追加した行を太字で表示すると、差分が分かりやすくなります。
601
+
602
+ たとえば次のようなサンプルコードがあるとします。
603
+
604
+ //list[][最初のサンプルコード]{
605
+ /// ボタンを押すたびにラベルを入れ替える
606
+ $('#button').on('click', function(ev) {
607
+ let $this = $(this);
608
+ let prev = $this.text();
609
+ let next = $this.data('label');
610
+ $this.text(next).data('label', prev);
611
+ });
612
+ //}
613
+
614
+ これを改善して、次のようなコードにしました。
615
+ しかしこれだと、どこを変更したかを読者が探さないといけません。
616
+
617
+ //list[][改善したサンプルコード]{
618
+ /// ボタンを押すたびにラベルを入れ替える
619
+ function toggleLabel(ev) {
620
+ let $this = $(this);
621
+ let prev = $this.text();
622
+ let next = $this.data('label');
623
+ $this.text(next).data('label', prev);
624
+ }
625
+ $('#button').on('click', toggleLabel);
626
+ //}
627
+
628
+ もし次のように差分を分かりやすく表示すれば、読者は変更点をすぐに理解できるでしょう。
629
+
630
+ //list[][]{
631
+ /// ボタンを押すたびにラベルを入れ替える
632
+ @<del>|$('#button').on('click', function(ev) {|
633
+ @<b>|function toggleLabel(ev) {|
634
+ let $this = $(this);
635
+ let prev = $this.text();
636
+ let next = $this.data('label');
637
+ $this.text(next).data('label', prev);
638
+ @<del>|});|
639
+ @<b>|}|
640
+ @<b>|$('#button').on('click', toggleLabel);|
641
+ //}
642
+
643
+ この作業はとても面倒です。
644
+ それでもこの面倒を乗り切った本だけが、初心者にとって分かりやすい本になるのです。
645
+
646
+ このほか、Gitでの差分のような表示方法も考えられます。
647
+ 各自で工夫してみてください。
648
+
649
+
650
+ === 長い行の折り返し箇所を明示する
651
+
652
+ 長い行を折り返したとき、折り返した箇所が分かるような表示が望ましいです。
653
+ そのための方法は3つあります。
654
+
655
+ * 折り返し箇所に何らかの目印をつける
656
+ * 行番号をつける
657
+ * 行末を表す記号をつける
658
+
659
+ たとえば次の例では、あたかも複数行あるかのように見えます。
660
+
661
+ //list[][][foldmark=off]{
662
+ *********************************************************************************************************************************************************************************************
663
+ //}
664
+
665
+ しかし折り返した箇所に折り返し記号をつけてみると、実は1行であることが分かります。
666
+
667
+ //list[][][foldmark=on]{
668
+ *********************************************************************************************************************************************************************************************
669
+ //}
670
+
671
+ また行番号をつけても、1行であることが分かります。
672
+
673
+ //list[][][foldmark=off,lineno=on,linenowidth=0]{
674
+ *********************************************************************************************************************************************************************************************
675
+ //}
676
+
677
+ あるいは行末を表す記号をつける方法でも、折り返した行にはその記号がつかないので、1行であることが分かります。
678
+
679
+ //list[][][foldmark=off,eolmark=on]{
680
+ *********************************************************************************************************************************************************************************************
681
+ //}
682
+
683
+ このように、方法は何でもいいので折り返し箇所が分かるような仕組みを使いましょう。
684
+
685
+ Starterでは、デフォルトで折り返し箇所に折り返し記号がつくようになってます。
686
+ また折り返し記号がプログラムコードの一部だと間違って認識されないよう、次のような工夫をしています。
687
+
688
+ * フォントの色をグレーにして薄く表示する。
689
+ * フォントの種類を等幅でなくローマン体にする。
690
+
691
+
692
+ === 行番号を控えめに表示する
693
+
694
+ 行番号は、プログラムコードと同じフォント・同じ色で表示すべきではありません。
695
+ 行番号はあくまで脇役なので、主役であるプログラムコードよりも目立たないようにすべきです。
696
+
697
+ Starterでは、行番号をグレー表示しているので、行番号がプログラムコードよりも目立たちません。
698
+
699
+ //list[][][lineno=1,linenowidth=0]{
700
+ function fib(n) {
701
+ if (n <= 1) {
702
+ return n;
703
+ } else {
704
+ return fib(n-1) + fib(n-2);
705
+ }
706
+ }
707
+ //}
708
+
709
+
710
+ === 行番号を考慮して長い行を折り返す
711
+
712
+ 長い行を自動的に折り返すとき、もし行番号があればそれを考慮した表示にすべきです。
713
+
714
+ Starterではそのような表示になっています。
715
+
716
+ //list[][][lineno=1,linenowidth=0]{
717
+ if error:
718
+ sys.err.write("Something error raised. Please contact to system administrator.\n")
719
+ //}
720
+
721
+ この例を見ると、折り返した行が左端には行かず、行番号の表示スペースを避けて折り返されています。
722
+ これが、行番号つき折り返しの望ましい姿です。
723
+
724
+ これに対し、Re:VIEWでは折り返した行が左端に到達してしまい、行番号の表示スペースを侵食します。
725
+ これは行番号つき折り返しの望ましくない姿です。
726
+
727
+
728
+ ==={subsec-programborder} ページまたぎしていることを可視化する
729
+
730
+ プログラムコードがページまたぎしていることが分かるようにしましょう。
731
+
732
+ * プログラムコードに枠線がないと、ページまたぎしたときに次のページに続いているかどうか、次のページを見ないと分かりません(@<img>{program_border}左)。
733
+ * プログラムコードに枠線があれば、ページまたぎしても次のページに続いているかどうかが、次のページを見なくても分かります(@<img>{program_border}右)。
734
+
735
+ //image[program_border][プログラムコードに枠線がない場合とある場合の違い][scale=1.0]
736
+
737
+ Starterではデフォルトでプログラムコードに枠線がつきます。
738
+ 枠線をつけたくない場合は「@<file>{config-starter.yml}」の設定項目「@<code>{program_border:}」を「@<code>{false}」に設定します。
739
+
740
+ なお、プログラムコードの背景枠の四隅を角丸にすることでも、ページまたぎしていることを可視化できます。
741
+
742
+
743
+ === インデントを可視化する
744
+
745
+ PythonやYAMLではインデントでブロック構造を表すので、ブロックの終わりを表すキーワードや記号がありません。
746
+ そのため、プログラムコードがページをまたぐとインデントが分からなくなる(つまりブロックの構造が分からなくなる)ことがあります。
747
+
748
+ これを防ぐには、何らかの方法でインデントを可視化します。
749
+ そうすると、プログラムコードがページをまたいでもインデントが分からなくなることはありません。
750
+
751
+ Starterでは「@<code>|//list[][]@<b>{[indentwidth=4]}{ ... //}|」のようにすることで、インデントごとに薄い縦線をつけられます。
752
+
753
+ //list[][薄い縦線をつけてインデントを可視化する][indentwidth=4]{
754
+ class Fib:
755
+
756
+ def __call__(n):
757
+ if n <= 1:
758
+ return n
759
+ else:
760
+ return fib(n-1) + fib(n-2)
761
+ //}
762
+
763
+
764
+
765
+ == 図表
766
+
767
+ === 図表が次のページに送られてもスペースを空けない
768
+
769
+ Re:VIEWではデフォルトで、図は現在位置に置かれるよう強制されます。
770
+ もし現在位置に図を入れるスペースがない場合は、図は次のページに表示され、そのあとに本文が続きます。
771
+ この仕様のせいで、たくさんのスペースが空いて本文がスカスカになってしまうことがあります(@<img>{figure_heretop}上)。
772
+
773
+ これはよくないので、Starterでは図が次のページに送られた場合、後続の本文を現在位置に流し込みます。
774
+ 図が現在位置に入らないからといって、スペースを空けたままにする必要はありません(@<img>{figure_heretop}下)。
775
+
776
+ //image[figure_heretop][後続の本文を現在位置に流し込むかどうか]
777
+
778
+
779
+ === 大きい図表は独立したページに表示する
780
+
781
+ たとえば図がページの3/4を占めるようなら、そのページには後続のテキストを流しこまず、その図だけのページにしましょう。
782
+
783
+ Starterだと「@<code>|//image[ファイル名][説明文][scale=1.0,@<b>{pos=p}]|」とすると、その図だけの独立したページに表示されます。
784
+
785
+
786
+ === 図表は番号で参照する
787
+
788
+ 図や表は、現在位置に入り切らないとき、自動的に次のページに送られます。
789
+ その場合、たとえば「次の図を見てください」と書いてあると「次の図」がなくて読者が混乱します。
790
+
791
+ そのため、図や表は必ず番号で参照してください。
792
+ 図なら「@<code>|@@<nop>{}<img>{ファイル名}|」、表なら「@<code>|@@<nop>{}<table>{ラベル}|」で参照します。
793
+
794
+
795
+ === 表のカラム幅を指定する
796
+
797
+ 表に長い文章を入れると、ページ横にはみ出してしまいます。
798
+
799
+ このような場合は、「@<code>{//tsize[|latex|@<b>{p{70mm\}}]}」のようにカラムの幅を指定しましょう。
800
+
801
+ //list[][サンプル]{
802
+ /@<nop>$$/tsize[|latex||l|@<b>|p{70mm}||]
803
+ /@<nop>$$/table[tbl-jqqu9][長いテキストを使ったサンプル]{
804
+ 伝承地 伝承内容
805
+ -------------------------------------------
806
+ 風の谷 その者、蒼き衣を纏て金色の野に降り立つべし。失われた大地との絆を結び、ついに人々を清浄の地に導かん。
807
+ ゴンドアの谷 リーテ・ラトバリタ・ウルス・アリアロス・バル・ネロリール
808
+ /@<nop>$$/}
809
+ //}
810
+
811
+ //sampleoutputbegin[表示結果]
812
+
813
+ //tsize[|latex||l|p{70mm}|]
814
+ //table[tbl-jqqu9][長いテキストを使ったサンプル]{
815
+ 伝承地 伝承内容
816
+ -------------------------------------------
817
+ 風の谷 その者、蒼き衣を纏て金色の野に降り立つべし。失われた大地との絆を結び、ついに人々を清浄の地に導かん。
818
+ ゴンドアの谷 リーテ・ラトバリタ・ウルス・アリアロス・バル・ネロリール
819
+ //}
820
+
821
+ //sampleoutputend
822
+
823
+
824
+
825
+
826
+ === 表のカラムが数値なら右寄せにする
827
+
828
+ 表のカラムはデフォルトで左寄せ(l)ですが、右寄せ(r)や中央揃え(c)を指定できます。
829
+ 特にカラムが数値なら、右寄せにするのがいいでしょう。
830
+
831
+ //list[][サンプル]{
832
+ /@<nop>$$/tsize[|latex|@<b>{|l|c|r|}]
833
+ /@<nop>$$/table[tbl-o599k][左寄せ・中央揃え・右寄せのサンプル]{
834
+ 左寄せ 中央揃え 右寄せ
835
+ -------------------------------------------
836
+ 1 1 1
837
+ 10 10 10
838
+ 100 100 100
839
+ 1000 1000 1000
840
+ /@<nop>$$/}
841
+ //}
842
+
843
+ //sampleoutputbegin[表示結果]
844
+
845
+ //tsize[|latex||l|c|r|]
846
+ //table[tbl-o599k][左寄せ・中央揃え・右寄せのサンプル]{
847
+ 左寄せ 中央揃え 右寄せ
848
+ -------------------------------------------
849
+ 1 1 1
850
+ 10 10 10
851
+ 100 100 100
852
+ 1000 1000 1000
853
+ //}
854
+
855
+ //sampleoutputend
856
+
857
+
858
+
859
+
860
+
861
+ == ページデザイン
862
+
863
+ ==={subsec-sidemargin} [PDF] 印刷用では左右の余白幅を充分にとる
864
+
865
+ 紙の書籍では、左右いっぱいに本文を印刷してはいけません。
866
+ 必ずページ左右の余白を充分に確保してください(@<img>{margin_book})。
867
+
868
+ * 見開きにおいて内側の余白(つまり左ページの右余白と、右ページの左余白)は、最低20mm必要です。
869
+ それ以上切り詰めると、本を開いたときに内側の本文がとても読みにくくなります。
870
+ * 見開きにおいて外側の余白(つまり左ページの左余白と、右ページの右余白)は、10〜15mmくらい必要です。
871
+ それ以上切り詰めると、指が本文にかかってしまうので読みにくくなります。
872
+
873
+ //image[margin_book][紙の書籍ではページ左右の余白幅が必要][scale=0.8]
874
+
875
+ Starterではこのような制限を考慮しつつ、本文幅が最大になるよう設定しています。
876
+ そのため、@<b>{印刷用PDFファイルでは奇数ページと偶数ページで左右の余白幅が違います}。
877
+ これは意図した仕様でありバグではありません。
878
+
879
+ 電子用PDFファイルではこのようなことを考慮する必要はありません。
880
+ そのため、電子用PDFでは左右の余白幅は同じです。
881
+
882
+
883
+ === [PDF] タブレット向けでは余白を切り詰める
884
+
885
+ (TODO)
886
+
887
+
888
+ === 電子書籍ではページ番号の位置を揃える
889
+
890
+ (TODO)
891
+
892
+
893
+ === 非Retina向けには本文をゴシック体にする
894
+
895
+ Re:VIEWやStarterでは、本文のフォントを明朝体にしています。
896
+ 明朝体は、印刷物やRetinaディスプレイのように解像度が高いと読みやすいですが、Retinaでない(つまり高解像度でない)ディスプレイだと読みづらいです。
897
+
898
+ スマートフォンやノートパソコンではRetinaディスプレイが普及しましたが、外部ディスプレイでは高解像度ではないものがまだ一般的です。
899
+
900
+ もし高解像度でないディスプレイでも読みやすくしたいなら、本文をゴシック体にすることを検討しましょう。
901
+ Starterでは「@<file>{config-starter.yml}」の設定を変えるだけで変更できます。
902
+ 詳しくは@<secref>{04-customize|subsec-fontfamily}を参照してください。
903
+
904
+
905
+
906
+ == 大扉
907
+
908
+
909
+ === 長いタイトルでは改行箇所を明示する
910
+
911
+ 本や同人誌のタイトルが長いと、大扉(タイトルページ)において不自然な箇所で改行されてしまいます(@<img>{multiline-title}上)。
912
+
913
+ これを防ぐために、Starterではタイトルを複数行で指定できるようになっています。
914
+ この場合、大扉(タイトルページ)ではタイトルが1行ずつ表示されるので、自然な位置を指定して改行できます(@<img>{multiline-title}下)。
915
+
916
+ //image[multiline-title][タイトルの改行位置を指定しなかった場合(上)とした場合(下)][scale=0.7,border=on]
917
+
918
+
919
+ === 大扉を別のソフトで作成する
920
+
921
+ Re:VIEWやStarterが生成する大扉(タイトルページ)は、デザインがよくありません。
922
+ PhotoshopやIllustratorやKeynoteで作成したほうが、見栄えのいいデザインになります(@<img>{titlepage-samples})。
923
+
924
+ //image[titlepage-samples][Keynoteで作成した大扉の例][scale=0.9]
925
+
926
+
927
+
928
+ == 奥付
929
+
930
+
931
+ === 奥付は最後のページに置く
932
+
933
+ 紙の本は必ず偶数ページになります。
934
+ たとえば、ページ数が100ページの本はあっても101ページの本はありません。
935
+ そのため、本の最終ページも偶数ページになります。
936
+
937
+ そして奥付は、本の最後のページに置きます。
938
+ 言い換えると、奥付は本の最後の偶数ページに置かれるはずです。
939
+ しかし、このことが考慮されていない同人誌がたまにあります。
940
+
941
+ 実は素のRe:VIEWではこれが考慮されておらず、奥付が奇数ページに置かれることがあります@<fn>{fn-qzmgo}。
942
+ Starterではこのようなことはありません。
943
+ 奥付は必ず最後の偶数ページに置かれるようになっています。
944
+
945
+ //footnote[fn-qzmgo][TechBoosterのテンプレートでは偶数ページに置かれるように修正されています。]
946
+
947
+
948
+ === 奥付に更新履歴とイベント名を記載する
949
+
950
+ 奥付には、本の更新履歴が記載されるのが一般的です。
951
+
952
+ 同人誌ならそれに加えて、初出のイベント名も記載するといいでしょう。
953
+ そうすると、どのイベントで手に入れたかが分かりやすくなります@<fn>{fn-ksg34}。
954
+
955
+ //footnote[fn-ksg34][少なくとも新刊はこれが当てはまります。既刊だと当てはまりませんが、初出のイベント名が分かるだけでも読者の助けになります。]
956
+
957
+
958
+ === 利用した素材の作者とURLを奥付に記載する
959
+
960
+ 本の作成に使用した素材があれば、作者名とURLを奥付に記載するといいでしょう。
961
+
962
+ たとえば表紙に写真やイラストを使ったのであれば、その作者と素材へのURLを奥付に記載しましょう。
963
+
964
+
965
+ === 利用したソフトウェアを奥付に記載する
966
+
967
+ 本や同人誌をどんなソフトウェアで作ったかを奥付に記載すると、他の人の参考になります。
968
+
969
+ たとえば「InDesignで作った」「MS Word 2016で作った」「Pages 10.0で作った」「Vivliostyleで作った」という情報があると、これから本や同人誌を作ろうとする人にとって大きな手がかりとなります。
970
+
971
+ またエディタに強いこだわりがある人なら「VS Codeで執筆した」「Vimで執筆した」のようにアピールするのもいいでしょう。