review 0.9.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/.travis.yml +9 -0
  2. data/ChangeLog +326 -0
  3. data/Rakefile +3 -5
  4. data/VERSION +1 -1
  5. data/bin/review-compile +50 -50
  6. data/bin/review-epubmaker +62 -75
  7. data/bin/review-epubmaker-ng +185 -0
  8. data/bin/review-index +2 -1
  9. data/bin/review-pdfmaker +158 -101
  10. data/bin/review-vol +6 -2
  11. data/doc/format.rdoc +111 -46
  12. data/doc/libepubmaker/sample.yaml +90 -0
  13. data/doc/quickstart.rdoc +188 -0
  14. data/doc/sample.yaml +8 -0
  15. data/lib/epubmaker.rb +28 -0
  16. data/lib/epubmaker/content.rb +82 -0
  17. data/lib/epubmaker/epubv2.rb +419 -0
  18. data/lib/epubmaker/epubv3.rb +249 -0
  19. data/lib/epubmaker/producer.rb +204 -0
  20. data/lib/epubmaker/resource.rb +66 -0
  21. data/lib/review.rb +1 -1
  22. data/lib/review/book.rb +27 -4
  23. data/lib/review/builder.rb +153 -20
  24. data/lib/review/compiler.rb +61 -10
  25. data/lib/review/ewbbuilder.rb +3 -2
  26. data/lib/review/htmlbuilder.rb +174 -67
  27. data/lib/review/i18n.rb +30 -0
  28. data/lib/review/i18n.yaml +23 -0
  29. data/lib/review/idgxmlbuilder.rb +110 -63
  30. data/lib/review/index.rb +34 -12
  31. data/lib/review/latexbuilder.rb +128 -33
  32. data/lib/review/latexutils.rb +18 -1
  33. data/lib/review/textbuilder.rb +17 -0
  34. data/lib/review/tocparser.rb +3 -1
  35. data/lib/review/tocprinter.rb +1 -0
  36. data/lib/review/topbuilder.rb +397 -198
  37. data/review.gemspec +101 -100
  38. data/test/test_book.rb +27 -0
  39. data/test/test_epubmaker.rb +507 -0
  40. data/test/test_helper.rb +8 -0
  41. data/test/test_htmlbuilder.rb +295 -10
  42. data/test/test_i18n.rb +64 -0
  43. data/test/test_idgxmlbuilder.rb +268 -10
  44. data/test/test_latexbuilder.rb +316 -20
  45. data/test/test_preprocessor.rb +23 -0
  46. data/test/test_topbuilder.rb +246 -0
  47. metadata +46 -53
  48. data/doc/format.re +0 -505
  49. data/test/test_index.rb +0 -15
data/bin/review-index CHANGED
@@ -96,7 +96,8 @@ def _main
96
96
  error_exit '-a/-s option and file arguments are exclusive'
97
97
  end
98
98
  else
99
- source = ReVIEW::ChapterSet.for_argv
99
+ puts parser.help
100
+ exit 0
100
101
  end
101
102
 
102
103
  begin
data/bin/review-pdfmaker CHANGED
@@ -45,86 +45,51 @@ def main
45
45
  values = YAML.load_file(yamlfile)
46
46
  check_book(values)
47
47
  basedir = Dir.pwd
48
- path = build_path(values)
48
+ @path = build_path(values)
49
49
  bookname = values["bookname"]
50
- Dir.mkdir(path)
50
+ Dir.mkdir(@path)
51
51
 
52
- pre = 0
53
- body = 0
54
- post = 0
55
- @pre_str = ""
56
- @chap_str = ""
57
- @post_str = ""
58
- toccount = 2
52
+ @chaps_filenames = Hash.new{|h, key| h[key] = ""}
59
53
 
60
54
  if File.exists?("PREDEF")
61
- File.open("PREDEF") {|chaps|
62
- chaps.each_line {|l|
63
- next if l =~ /^#/
64
- pre = pre + 1
65
- toccount = toccount + 1
66
- fork {
67
- STDOUT.reopen("#{path}/pre#{pre}.tex")
68
- exec("review-compile --target=latex --level=1 #{values["params"]} #{l}")
69
- }
70
- Process.waitall
71
- @pre_str << %Q|\\input{pre#{pre}.tex}\n|
72
- }
73
- }
55
+ output_chaps("PREDEF", values)
74
56
  end
75
57
  if File.exists?("CHAPS")
76
- File.open("CHAPS") {|chaps|
77
- chaps.each_line {|l|
78
- body = body + 1
79
- toccount = toccount + 1
80
- next if l =~ /^#/
81
- fork {
82
- STDOUT.reopen("#{path}/chap#{body}.tex")
83
- exec("review-compile --target=latex --level=#{values["secnolevel"]} #{values["params"]} #{l}")
84
- }
85
- Process.waitall
86
- @chap_str << %Q|\\input{chap#{body}.tex}\n|
87
- }
88
- }
58
+ output_chaps("CHAPS", values)
89
59
  end
90
60
  if File.exists?("POSTDEF")
91
- File.open("POSTDEF") {|chaps|
92
- chaps.each_line {|l|
93
- next if l =~ /^#/
94
- post = post + 1
95
- toccount = toccount + 1
96
- fork {
97
- STDOUT.reopen("#{path}/post#{post}.tex")
98
- exec("review-compile --target=latex --level=1 #{values["params"]} #{l}")
99
- }
100
- Process.waitall
101
- @post_str << %Q|\\input{post#{post}.tex}\n|
102
- }
103
- }
61
+ output_chaps("POSTDEF", values)
104
62
  end
105
- values["pre_str"] = @pre_str
106
- values["chap_str"] = @chap_str
107
- values["post_str"] = @post_str
63
+ values["pre_str"] = @chaps_filenames["PREDEF"]
64
+ values["chap_str"] = @chaps_filenames["CHAPS"]
65
+ values["post_str"] = @chaps_filenames["POSTDEF"]
108
66
 
109
67
  values["usepackage"] = ""
110
68
  if values["texstyle"]
111
69
  values["usepackage"] = "\\usepackage{#{values['texstyle']}}"
112
70
  end
113
71
 
114
- copy_images("./images", "#{path}/images")
115
- copyStyToDir(Dir.pwd + "/sty", path)
72
+ copy_images("./images", "#{@path}/images")
73
+ copyStyToDir(Dir.pwd + "/sty", @path)
74
+ copyStyToDir(Dir.pwd, @path, "tex")
116
75
 
117
- Dir.chdir(path) {
76
+ Dir.chdir(@path) {
118
77
  template = get_template(values)
119
78
  File.open("./book.tex", "wb"){|f| f.write(template)}
120
79
 
121
80
  ## do compile
81
+ enc = values["params"].to_s.split(/\s+/).find{|i| i =~ /\A--outencoding=/ }
82
+ kanji = enc ? enc.split(/=/).last.gsub(/-/, '').downcase : 'utf8'
122
83
  fork {
123
- exec("platex book.tex")
84
+ exec("platex -kanji=#{kanji} book.tex")
124
85
  }
125
86
  Process.waitall
126
87
  fork {
127
- exec("platex book.tex")
88
+ exec("platex -kanji=#{kanji} book.tex")
89
+ }
90
+ Process.waitall
91
+ fork {
92
+ exec("platex -kanji=#{kanji} book.tex")
128
93
  }
129
94
  Process.waitall
130
95
  fork {
@@ -132,8 +97,24 @@ def main
132
97
  }
133
98
  Process.waitall
134
99
  }
135
- FileUtils.cp("#{path}/book.pdf", "#{basedir}/#{bookname}.pdf")
100
+ FileUtils.cp("#{@path}/book.pdf", "#{basedir}/#{bookname}.pdf")
101
+ end
136
102
 
103
+ def output_chaps(chapsfile, values)
104
+ File.open(chapsfile) {|chaps|
105
+ chaps.each_line {|l|
106
+ next if l =~ /^#/
107
+ file_id = File.basename(l.chomp.strip,".*")
108
+ filename = "#{file_id}.tex"
109
+ fork {
110
+ STDOUT.reopen("#{@path}/#{filename}")
111
+ $stderr.puts "compiling #{l}"
112
+ exec("review-compile --target=latex --level=#{values["secnolevel"]} #{values["params"]} #{l}")
113
+ }
114
+ Process.waitall
115
+ @chaps_filenames[chapsfile] << %Q|\\input{#{filename}}\n|
116
+ }
117
+ }
137
118
  end
138
119
 
139
120
  def copy_images(from, to)
@@ -142,16 +123,89 @@ def copy_images(from, to)
142
123
  copyImagesToDir(from, to)
143
124
  Dir.chdir(to) {
144
125
  fork {
145
- exec("ebb *.png *.jpg")
126
+ begin
127
+ exec("extractbb *.png *.jpg */*.jpg */*.png;extractbb -m *.png *.jpg */*.jpg */*.png")
128
+ rescue
129
+ exec("ebb *.png *.jpg */*.jpg */*.png")
130
+ end
146
131
  }
147
132
  }
148
133
  Process.waitall
149
134
  end
150
135
  end
151
136
 
137
+ def make_titlepage(values, authors)
138
+ coverfile = values["coverfile"]
139
+ if coverfile
140
+ coverfile_sty = coverfile.sub(/\.[^.]+$/, ".tex")
141
+ if File.exist?(coverfile_sty)
142
+ titlepage = File.read(coverfile_sty)
143
+ return titlepage
144
+ end
145
+ end
146
+
147
+ ## use default titlepage template
148
+ titlepage = <<EOB
149
+ \\begin{titlepage}
150
+ EOB
151
+ if values["coverimage"]
152
+ titlepage += <<EOB
153
+ \\begin{center}
154
+ %%%\\mbox{}\\vskip5zw%
155
+ \\includegraphics[width=\\textwidth,height=\\textheight,keepaspectratio]{./images/#{values["coverimage"]}}
156
+ \\end{center}
157
+ \\clearpage
158
+ EOB
159
+ end
160
+ titlepage += <<EOB
161
+ \\thispagestyle{empty}
162
+ \\begin{center}%
163
+ \\mbox{} \\vskip5zw
164
+ \\reviewtitlefont%
165
+ {\\Huge #{values["booktitle"]} \\par}%
166
+ \\vskip 15em%
167
+ {\\huge
168
+ \\lineskip .75em
169
+ \\begin{tabular}[t]{c}%
170
+ #{authors}
171
+ \\end{tabular}\\par}%
172
+ \\vfill
173
+ {\\large #{values["date"]} 版\\hspace{2zw}#{values["prt"]} 発行\\par}%
174
+ \\vskip4zw\\mbox{}
175
+ \\end{center}%
176
+ \\end{titlepage}
177
+ EOB
178
+
179
+ return titlepage
180
+ end
181
+
152
182
  def get_template(values)
183
+ dclass = values["texdocumentclass"] || []
184
+ documentclass = dclass[0] || "jsbook"
185
+ documentclassoption = dclass[1] || "oneside"
186
+
187
+ okuduke = ""
188
+ authors = ""
189
+
190
+ if values["aut"]
191
+ okuduke += "著 者 & #{values["aut"]} \\\\\n"
192
+ authors = values["aut"]+ "\\vspace*{1zh} 著"
193
+ end
194
+ if values["trl"]
195
+ authors += " \\\\\n"+values["trl"]+ "\\vspace*{1zh} 訳"
196
+ okuduke += "翻 訳 & #{values["trl"]} \\\\\n"
197
+ end
198
+ if values["edt"]
199
+ okuduke += "編集者 & #{values["edt"]} \\\\\n"
200
+ end
201
+ okuduke += <<EOB
202
+ 発行所 & #{values["prt"]} \\\\
203
+ EOB
204
+
205
+ titlepage = make_titlepage(values, authors)
206
+
153
207
  str = <<EOB
154
- \\documentclass[oneside]{jsbook}
208
+ \\documentclass[#{documentclassoption}]{#{documentclass}}
155
209
  \\usepackage[deluxe]{otf}
156
210
  \\usepackage[dvipdfmx]{color}
157
211
  \\usepackage[dvipdfmx]{graphicx}
@@ -182,17 +236,21 @@ def get_template(values)
182
236
  \\newcommand{\\parasep}{\\vspace*{3zh}}
183
237
  \\setlength{\\footskip}{30pt}
184
238
 
185
- \\usepackage[dvipdfm,bookmarks=true,bookmarksnumbered=true,colorlinks=true,%
186
- pdftitle={#{values["booktitle"]}},%
187
- pdfauthor={#{values["aut"]}}]{hyperref}
188
-
189
239
  %% Bookmarkの文字化け対策(日本語向け)
190
240
  \\ifnum 46273=\\euc"B4C1 % 46273 == 0xB4C1 == 漢(EUC-JP)
191
- \\AtBeginDvi{\\special{pdf:tounicode EUC-UCS2}}%
241
+ \\usepackage{atbegshi}%
242
+ \\AtBeginShipoutFirst{\\special{pdf:tounicode EUC-UCS2}}%
243
+ %%\\AtBeginDvi{\\special{pdf:tounicode EUC-UCS2}}%
192
244
  \\else
193
- \\AtBeginDvi{\\special{pdf:tounicode 90ms-RKSJ-UCS2}}%
245
+ \\usepackage{atbegshi}%
246
+ \\AtBeginShipoutFirst{\\special{pdf:tounicode 90ms-RKSJ-UCS2}}%
247
+ %%\\AtBeginDvi{\\special{pdf:tounicode 90ms-RKSJ-UCS2}}%
194
248
  \\fi
195
249
 
250
+ \\usepackage[dvipdfm,bookmarks=true,bookmarksnumbered=true,colorlinks=true,%
251
+ pdftitle={#{values["booktitle"]}},%
252
+ pdfauthor={#{values["aut"]}}]{hyperref}
253
+
196
254
  \\newenvironment{reviewimage}{%
197
255
  \\begin{figure}[H]
198
256
  \\begin{center}}{%
@@ -241,6 +299,12 @@ def get_template(values)
241
299
  \\newcommand{\\reviewlistcaption}[1]{%
242
300
  \\medskip{\\small\\noindent #1}\\vspace*{-1.3zw}}
243
301
 
302
+ \\newcommand{\\reviewemlistcaption}[1]{%
303
+ \\medskip{\\small\\noindent #1}\\vspace*{-1.3zw}}
304
+
305
+ \\newcommand{\\reviewcmdcaption}[1]{%
306
+ \\medskip{\\small\\noindent #1}\\vspace*{-1.3zw}}
307
+
244
308
  \\newcommand{\\reviewimageref}[1]{%
245
309
  図 #1}
246
310
  \\newcommand{\\reviewtableref}[1]{%
@@ -264,6 +328,22 @@ def get_template(values)
264
328
  \\newcommand{\\reviewmainfont}[0]{%
265
329
  }
266
330
 
331
+ \\newcommand{\\reviewcolophon}[0]{%
332
+ \\backmatter
333
+ \\clearpage}
334
+ \\newcommand{\\reviewappendix}[0]{%
335
+ \\appendix}
336
+
337
+ \\makeatletter
338
+ \\def\\maxwidth{%
339
+ \\ifdim\\Gin@nat@width>\\linewidth
340
+ \\linewidth
341
+ \\else
342
+ \\Gin@nat@width
343
+ \\fi
344
+ }
345
+ \\makeatother
346
+
267
347
  #{values["usepackage"]}
268
348
 
269
349
  \\usepackage[T1]{fontenc}
@@ -271,35 +351,10 @@ def get_template(values)
271
351
  \\begin{document}
272
352
 
273
353
  \\reviewmainfont
274
-
275
- \\begin{titlepage}
276
354
  EOB
277
- if values["coverimage"]
278
- str += <<EOB
279
- \\begin{center}
280
- \\mbox{}\\vskip5zw%
281
- \\includegraphics[scale=1.0]{./images/#{values["coverimage"]}}
282
- \\end{center}
283
- \\clearpage
284
- EOB
285
- end
355
+
356
+ str += titlepage
286
357
  str += <<EOB
287
- \\thispagestyle{empty}
288
- \\begin{center}%
289
- \\mbox{} \\vskip5zw
290
- \\reviewtitlefont%
291
- {\\Huge #{values["booktitle"]} \\par}%
292
- \\vskip 15em%
293
- {\\huge
294
- \\lineskip .75em
295
- \\begin{tabular}[t]{c}%
296
- #{values["aut"]}\\vspace*{1zh} 著
297
- \\end{tabular}\\par}%
298
- \\vfill
299
- {\\large #{values["date"]} 版\\hspace{2zw}#{values["prt"]} 発行\\par}%
300
- \\vskip4zw\\mbox{}
301
- \\end{center}%
302
- \\end{titlepage}
303
358
 
304
359
  \\renewcommand{\\chaptermark}[1]{{}}
305
360
  \\frontmatter
@@ -315,13 +370,12 @@ EOB
315
370
  #{values["chap_str"]}
316
371
 
317
372
  \\renewcommand{\\chaptermark}[1]{\\markboth{\\appendixname\\thechapter~#1}{}}
318
- \\appendix
373
+ \\reviewappendix
319
374
 
320
375
  #{values["post_str"]}
321
376
 
322
377
  %% okuduke
323
- \\backmatter
324
- \\clearpage
378
+ \\reviewcolophon
325
379
  \\thispagestyle{empty}
326
380
 
327
381
  \\vspace*{\\fill}
@@ -333,9 +387,7 @@ EOB
333
387
  }
334
388
 
335
389
  \\begin{tabular}{ll}
336
- 著 者 & #{values["aut"]} \\\\
337
- 編集者 & #{values["edt"]} \\\\
338
- 発行所 & #{values["prt"]} \\\\
390
+ #{okuduke}
339
391
  \\end{tabular}
340
392
   \\\\
341
393
  \\rule[0pt]{14cm}{1pt} \\\\
@@ -353,7 +405,7 @@ def copyImagesToDir(dirname, copybase)
353
405
  if FileTest.directory?("#{dirname}/#{fname}")
354
406
  copyImagesToDir("#{dirname}/#{fname}", "#{copybase}/#{fname}")
355
407
  else
356
- if fname =~ /\.(png|gif|jpg|jpeg|svg)$/i
408
+ if fname =~ /\.(png|gif|jpg|jpeg|svg|pdf)$/i
357
409
  Dir.mkdir(copybase) unless File.exist?(copybase)
358
410
  FileUtils.cp "#{dirname}/#{fname}", copybase
359
411
  end
@@ -362,11 +414,16 @@ def copyImagesToDir(dirname, copybase)
362
414
  }
363
415
  end
364
416
 
365
- def copyStyToDir(dirname, copybase)
417
+ def copyStyToDir(dirname, copybase, extname = "sty")
418
+ unless File.directory?(dirname)
419
+ $stderr.puts "No such directory - #{dirname}"
420
+ return
421
+ end
422
+
366
423
  Dir.open(dirname) {|dir|
367
424
  dir.each {|fname|
368
425
  next if fname =~ /^\./
369
- if fname =~ /\.(sty)$/i
426
+ if fname =~ /\.(#{extname})$/i
370
427
  Dir.mkdir(copybase) unless File.exist?(copybase)
371
428
  FileUtils.cp "#{dirname}/#{fname}", copybase
372
429
  end
data/bin/review-vol CHANGED
@@ -29,6 +29,7 @@ def main
29
29
  }
30
30
 
31
31
  part_sensitive = false
32
+ basedir = nil
32
33
  parser = OptionParser.new
33
34
  parser.on('-P', '--part-sensitive', 'Prints volume of each parts.') {
34
35
  part_sensitive = true
@@ -39,6 +40,9 @@ def main
39
40
  parser.on('--outencoding=ENCODING', 'Set output encoding. (UTF-8[default], EUC, JIS, and SJIS)') {|enc|
40
41
  @param["outencoding"] = enc
41
42
  }
43
+ parser.on('--directory=DIR', 'Compile all chapters in DIR.') {|path|
44
+ basedir = path
45
+ }
42
46
  parser.on('--help', 'Print this message and quit') {
43
47
  puts parser.help
44
48
  exit 0
@@ -51,13 +55,13 @@ def main
51
55
  exit 1
52
56
  end
53
57
 
54
- book = ReVIEW.book
58
+ book = basedir ? ReVIEW::Book.load(basedir) : ReVIEW.book
55
59
  ReVIEW.book.param = @param
56
60
  if part_sensitive
57
61
  sep = ""
58
62
  book.each_part do |part|
59
63
  print sep; sep = "\n"
60
- puts "Part #{part.number}" if part.number
64
+ puts "Part #{part.number} #{part.name}" if part.number
61
65
  part.each_chapter do |chap|
62
66
  print_chapter_volume chap
63
67
  end
data/doc/format.rdoc CHANGED
@@ -9,7 +9,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
9
9
  段落(本文)の間は英語の段落のように1行空けます。ただし、組版に
10
10
  まわすときは前処理して1段落を1行に変更してあります。
11
11
 
12
- [例]
12
+ 例:
13
13
 
14
14
  だんらくだんらく〜〜〜
15
15
  この行も同じ段落
@@ -22,7 +22,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
22
22
 
23
23
  章・節・項・段など、見出しは「=」「==」「===」「====」「=====」です。6 レベル以上は使えません。
24
24
 
25
- [例]
25
+ 例:
26
26
 
27
27
  = 章のキャプション
28
28
 
@@ -40,22 +40,34 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
40
40
 
41
41
  節や項の見出しに [column] を追加するとコラムのキャプションになります。
42
42
 
43
- [例]
43
+ 例:
44
44
 
45
45
  ===[column] コンパイラコンパイラ
46
46
 
47
47
  このとき、「=」と「[column]」は間を開けず、必ず続けて書かなければ
48
48
  なりません。空白があってもいけません。
49
49
 
50
+ 次の節や項を待たずにコラムを終了する場合は、「===[/column]」を記述します。
51
+
52
+ 例:
53
+
54
+ ===[column] コンパイラコンパイラ
55
+
56
+ コラムの内容
57
+
58
+ ===[/column]
59
+
50
60
  == 箇条書き
51
61
 
52
62
  箇条書き (HTML で言う ul) は「*」で表現します。
53
- ネストはしません。
63
+ ネストは「**」のように深さに応じて数を増やします。
54
64
 
55
- [例]
65
+ 例:
56
66
 
57
67
  * 第一の項目
68
+ ** 第一の項目のネスト
58
69
  * 第二の項目
70
+ ** 第二の項目のネスト
59
71
  * 第三の項目
60
72
 
61
73
  箇条書きを書くには、行頭に1つ以上の空白を必ず入れるようにします。
@@ -66,7 +78,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
66
78
  番号付きの箇条書き (HTML で言う ol) は「1. 〜」「2. 〜」
67
79
  「3. 〜」で示します。ネストはしません。
68
80
 
69
- [例]
81
+ 例:
70
82
 
71
83
  1. 第一の条件
72
84
  2. 第二の条件
@@ -78,7 +90,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
78
90
 
79
91
  用語リスト (HTML で言う dl) は「:」と、続く空白で始まる行を使って示します。
80
92
 
81
- [例]
93
+ 例:
82
94
 
83
95
  : Alpha
84
96
  DEC の作っていた RISC CPU。
@@ -105,7 +117,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
105
117
  連番なしリストは「//emlist[キャプション]{ 〜 //}」です。
106
118
  //emlistのキャプションは省略できます。
107
119
 
108
- [例]
120
+ 例:
109
121
 
110
122
  //list[main][main()]{ ←「main」が識別子で「main()」がキャプション
111
123
  int
@@ -116,7 +128,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
116
128
  }
117
129
  //}
118
130
 
119
- [例]
131
+ 例:
120
132
 
121
133
  //emlist{
122
134
  printf("hello");
@@ -132,7 +144,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
132
144
 
133
145
  ソースコードを引用する場合、ファイル名が必要です。
134
146
 
135
- [例]
147
+ 例:
136
148
 
137
149
  //source[/hello/world.rb]{
138
150
  puts "hello world!"
@@ -145,7 +157,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
145
157
 
146
158
  連番ありのリスト(list)で自動的に行番号がつきます。
147
159
 
148
- [例]
160
+ 例:
149
161
 
150
162
  //listnum[hello][ハローワールド]{
151
163
  puts "hello world!"
@@ -153,7 +165,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
153
165
 
154
166
  参照方法はlistと変わりません。
155
167
 
156
- [例]
168
+ 例:
157
169
 
158
170
  ..は@<list>{hello}をみてください。
159
171
 
@@ -161,7 +173,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
161
173
 
162
174
  連番なしのリスト(emlist)で自動的に行番号がつきます。
163
175
 
164
- [例]
176
+ 例:
165
177
 
166
178
  //emlistnum{
167
179
  puts "hello world!"
@@ -171,7 +183,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
171
183
 
172
184
  本文中でソースコードを引用して記述します。
173
185
 
174
- [例]
186
+ 例:
175
187
 
176
188
  @<code>{p = obj.ref_cnt}
177
189
 
@@ -179,7 +191,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
179
191
 
180
192
  コマンドラインの操作を示すときは //cmd{ 〜 //} を使います。
181
193
 
182
- [例]
194
+ 例:
183
195
 
184
196
  //cmd{
185
197
  $ ls /
@@ -193,16 +205,16 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
193
205
  代替しているため、ダミーのアスキーアートが入っていることがあり
194
206
  ます。この部分は、組版時には単に無視してください。
195
207
 
196
- [例]
208
+ 例:
197
209
 
198
210
  //image[unixhistory][UNIX系OSの簡単な系譜]{
199
- System V 系列
200
- +----------- SVr4 --> 各種商用UNIX(Solaris, AIX, HP-UX, ...)
211
+ System V 系列
212
+ +----------- SVr4 --> 各種商用UNIX(Solaris, AIX, HP-UX, ...)
201
213
  V1 --> V6 --|
202
- +--------- 4.4BSD --> FreeBSD, NetBSD, OpenBSD, ...
203
- BSD 系列
204
-
205
- --------------> Linux
214
+ +--------- 4.4BSD --> FreeBSD, NetBSD, OpenBSD, ...
215
+ BSD 系列
216
+
217
+ --------------> Linux
206
218
  //}
207
219
 
208
220
  3番目の引数として、画像の倍率・大きさを指定することができます。
@@ -218,17 +230,29 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
218
230
 
219
231
  //indepimage[ファイル名][キャプション] で番号が振られていない画像ファイルを生成します。キャプションは省略できます。
220
232
 
221
- [例]
233
+ 例:
222
234
 
223
235
  //indepimage[unixhistory2]
224
236
 
225
237
  同様のことは、//numberlessimageでも使えます。
226
238
 
227
- [例]
239
+ 例:
228
240
 
229
241
  //numberlessimage[door_image_path][扉絵]
230
242
 
231
- ※ただし、//indepimageと機能的にかぶっているので、将来は廃止され、//indexpimageに統合される予定です。
243
+ ※ただし、//indepimageと機能的にかぶっているので、将来は廃止され、//indepimageに統合される予定です。
244
+
245
+ == グラフ表現ツールを使った図
246
+
247
+ //graph[ファイル名][コマンド名][キャプション] で各種グラフ表現ツールを使った画像ファイルの生成ができます。キャプションは省略できます。
248
+
249
+ 例: gnuplotの使用
250
+
251
+ //graph[sin_x][gnuplot]{
252
+ plot sin(x)
253
+ //}
254
+
255
+ コマンド名には、「graphviz」「gnuplot」「blockdiag」「aafigure」のいずれかを指定できます。ツールはそれぞれ別途インストールする必要があります。
232
256
 
233
257
  == 表
234
258
 
@@ -240,7 +264,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
240
264
  付けてください。例えば「.」という内容のカラムは「..」と書きます。
241
265
  また、空のカラムは「.」と書けます。
242
266
 
243
- [例]
267
+ 例:
244
268
 
245
269
  //table[envvars][重要な環境変数]{
246
270
  名前 意味
@@ -265,7 +289,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
265
289
 
266
290
  引用は「//quote{ 〜 //}」を使って記述します。
267
291
 
268
- [例]
292
+ 例:
269
293
 
270
294
  //quote{
271
295
  百聞は一見に如かず。
@@ -278,7 +302,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
278
302
 
279
303
  脚注は「//footnote」を使って記述します。
280
304
 
281
- [例]
305
+ 例:
282
306
 
283
307
  パッケージは本書のサポートサイトから入手できます@<fn>{site}。
284
308
  各自ダウンロードしてインストールしておいてください。
@@ -294,7 +318,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
294
318
  コメントが無い場合も定義可能です。
295
319
  //bibpaper[site][キャプション]
296
320
 
297
- [例]
321
+ 例:
298
322
 
299
323
  //bibpaper[lins][Lins, 1991]{
300
324
  Refael D. Lins. A shared memory architecture for parallel study of
@@ -305,7 +329,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
305
329
 
306
330
  本文中で参考文献を参照したい場合は次のようにしてください。
307
331
 
308
- [例]
332
+ 例:
309
333
 
310
334
  …という研究が知られています(@<bib>{lins})
311
335
 
@@ -314,7 +338,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
314
338
  リード文は //lead{ 〜 //} で指定します。
315
339
  歴史的経緯により//read{ 〜 //} でも使えます。
316
340
 
317
- [例]
341
+ 例:
318
342
 
319
343
  //lead{
320
344
  本章ではまずこの本の概要について話し、
@@ -325,7 +349,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
325
349
 
326
350
  LaTeX の式を挿入するには、//texequation{ 〜 //} を使います。
327
351
 
328
- [例]
352
+ 例:
329
353
 
330
354
  //texequation{
331
355
  \sum_{i=1}^nf_n(x)
@@ -345,16 +369,42 @@ LaTeX の式を挿入するには、//texequation{ 〜 //} を使います。
345
369
 
346
370
  最終結果に出力されないコメントを記述したい場合は「#@#」を使ってください。
347
371
 
348
- [例]
372
+ 例:
349
373
 
350
374
  #@# ここで 1 行あける
351
375
 
352
376
  また、修正が必要な警告的コメントには#@warn(...)を使ってください。
353
377
 
354
- [例]
378
+ 例:
355
379
 
356
380
  #@warn(あとで書く)
357
381
 
382
+ == 生データ行
383
+
384
+ ReVIEW のタグ範囲を越えて何か特別な行を挿入したい場合、//raw を使います。
385
+
386
+ 例:
387
+
388
+ //raw[|html|<div class="special">\nここは特別な行です。\n</div>]
389
+
390
+ 「|ビルダ名|そのまま出力させる内容」という書式です。
391
+
392
+ ビルダ名には「html」「latex」「idgxml」「top」のいずれかが入り、(複数のビルダにまたがる指定が必要かは別として)「,」で区切って複数指定することも可能です。
393
+ 「バックスラッシュ+n」は改行に変換されます。
394
+ 該当のビルダを使用しているときのみ、内容が出力されます。
395
+
396
+ 例:
397
+
398
+ (HTMLビルダの場合:)
399
+ <div class="special">
400
+ ここは特別な行です。
401
+ </div>
402
+
403
+ (ほかのビルダの場合は単に無視されて何も出力されない)
404
+
405
+ //raw およびこの後に紹介する @<raw> インラインタグは、誤った内容を入れると
406
+ 構造化文書を容易に破壊し得ることに注意してください。
407
+
358
408
  == その他の文法
359
409
 
360
410
  ReVIEW は任意のブロックを追加可能なので、本によって専用ブロックを
@@ -389,7 +439,7 @@ ReVIEW は任意のブロックを追加可能なので、本によって専用
389
439
  @<icon>{samplephoto}:: インライン画像。
390
440
  @<uchar>{2460}:: Unicode文字の出力。引数は16進数で指定する。
391
441
  @<href>{http://www.google.com/}:: リンク。URLで指定できる
392
- @<raw>{@<foo>{bar\}}:: そのまま出力する。「}」は「\」でエスケープする。
442
+ @<raw>{|ビルダ名|<span>★</span>}:: そのまま出力する。「}」は「バックスラッシュ+}」でエスケープする。ビルダ名は「html」「latex」「idgxml」「top」のいずれかで、「,」で区切って複数指定することも可能。該当のビルダを使用時のみ、出力される。内容に「バックスラッシュ+n」を入れると改行に変換される。
393
443
 
394
444
  == 著者用タグ (プリプロセッサ命令)
395
445
 
@@ -409,13 +459,7 @@ ReVIEW は任意のブロックを追加可能なので、本によって専用
409
459
  CHAPSファイルが置かれているディレクトリに layouts/layout.erb
410
460
  を置くとその html を ERB で評価します。
411
461
 
412
- [例]
413
-
414
- <html>
415
- <head>
416
- <title><%= title %></title>
417
- </head>
418
- [例]
462
+ 例:
419
463
 
420
464
  <html>
421
465
  <head>
@@ -432,7 +476,7 @@ CHAPSファイルが置かれているディレクトリに layouts/layout.erb
432
476
  PART ファイルに定義してください。
433
477
  PART ファイルは CHAPS の部わけと対応しています。
434
478
 
435
- [例]
479
+ 例:
436
480
 
437
481
  CHAPS:
438
482
  intro.re
@@ -451,13 +495,13 @@ PART:
451
495
  見出し番号と見出しを生成します。
452
496
  見出しの階層は"|"で区切って指定してください。
453
497
 
454
- [例]
498
+ 例:
455
499
 
456
500
  @<hd>{はじめに|まずわ}
457
501
 
458
502
  他の章を参照したい場合は、先頭に章のidを指定してください。
459
503
 
460
- [例]
504
+ 例:
461
505
 
462
506
  @<hd>{preface|はじめに|まずわ}
463
507
 
@@ -468,10 +512,31 @@ Web ハイパーリンクを記述するには、リンクに @<href>、アン
468
512
  省略すると URL がそのまま使われます。URL 中に , を使いたいときには、\,
469
513
  と表記してください。
470
514
 
471
- [例]
515
+ 例:
472
516
 
473
517
  @<href>{http://github.com/, GitHub}
474
518
  @<href>{http://www.google.com/}
475
519
  @<href>{#point1, ドキュメント内ポイント}
476
520
  @<href>{chap1.html#point1, ドキュメント内ポイント}
477
521
  //label[point1]
522
+
523
+ == 国際化(i18n)
524
+
525
+ ReVIEWが出力する文字列(「第◯章」「図」「表」など)を、指定した言語に
526
+ 合わせて出力することができます。デフォルトは日本語です。
527
+
528
+ CHAPS などと同じディレクトリに locale.yaml というファイルを用意して、
529
+ 以下のように記述します(日本語の場合)。
530
+
531
+ 例:
532
+
533
+ locale: ja
534
+
535
+ 既存の表記を書き換えたい場合は、該当する項目を上書きします。
536
+ 既存の設定ファイルは lib/review/i18n.yaml にあります。
537
+
538
+ 例:
539
+
540
+ locale: ja
541
+ image: イメージ
542
+ table: テーブル