aozora4reader 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/data/gaiji2.txt ADDED
@@ -0,0 +1,41 @@
1
+ 「穀」の「禾」に代えて「釆」 \UTF{7cd3} #方丈記
2
+ 「姉」の正字、「女+※[#第3水準1-85-57]のつくり」 \UTF{59ca} #最後の一句
3
+ ##さんずい+闊 \UTF{24103} #檸檬
4
+ ##「木+于」 \UTF{6745} #李陵
5
+ ##「革+干」 \UTF{976C} #李陵
6
+ ##「木+鑞のつくり」 \UTF{3bff} #01夜明け前
7
+ ##「くさかんむり/稾」 \UTF{85f3} #01夜明け前
8
+ ##「魚+昜」 \UTF{9c11} #01夜明け前
9
+ ##小書き濁点付き平仮名つ {\small{}づ} #それから
10
+ ##小書き平仮名ん {\small{}ん} #それから
11
+ 「口+堯」 \UTF{5635} #それから
12
+ 「口+斗」 \UTF{544c} #金色夜叉
13
+ ##「(夕+匕)/手」 \UTF{22ab8} #金色夜叉
14
+ ##「捏」の「日」に代えて「臼」 \UTF{63d8} #金色夜叉
15
+ ##「孛+鳥」 \UTF{9D53} #故郷
16
+ ローマ数字1 \rensuji{I} #山羊の歌
17
+ ローマ数字2 \rensuji{II} #山羊の歌
18
+ ローマ数字3 \rensuji{III} #山羊の歌
19
+ ローマ数字4 \rensuji{IV} #山羊の歌
20
+ ローマ数字5 \rensuji{V} #山羊の歌
21
+ ローマ数字6 \rensuji{VI} #山羊の歌
22
+ ローマ数字7 \rensuji{VII}
23
+ ローマ数字8 \rensuji{VIII}
24
+ ローマ数字9 \rensuji{IX}
25
+ ローマ数字10 \rensuji{X}
26
+ ##「にんべん+孱」 \UTF{50dd} #虞美人草
27
+ 「にんべん+愁」 \UTF{50fd} #虞美人草
28
+ ##「耳+吾」 \UTF{43b8} #虞美人草
29
+ ##「甘+舌」 \UTF{751b} #虞美人草
30
+ 「髟/胡」 \UTF{9b0d} #阿Q正伝
31
+ ##「さんずい+散」 \UTF{6f75} #高野聖
32
+ 「赤+報のつくり」 \UTF{8d67} #浮雲
33
+ 「血+半」 \UTF{8845} #最終戦争論
34
+ 蛇の目 \UTF{25c9} #青猫
35
+ 「糸+遂」 \UTF{7e78} #クリスマス・カロル
36
+ ##「木+余」 \UTF{688c} #茶の本
37
+ ##「くさかんむり/設」 \UTF{850e} #茶の本
38
+ ##「くさかんむり/舛」 \UTF{8348} #茶の本
39
+ ##「ころもへん+譫のつくり」 \UTF{895c} #茶の本
40
+ ##「囗<力」 \UTF{361e} #茶の本
41
+ ##「白+光」 \UTF{3fe0} #神州纐纈城
@@ -0,0 +1,741 @@
1
+ # encoding: utf-8
2
+
3
+ # Original source is "青空文庫→TeX(ver. 0.9.5 2004/5/5 psitau)"
4
+ # see: http://psitau.kitunebi.com/aozora.html
5
+ #
6
+ # Also another source is "青空キンドル [Beta]"
7
+ # see: http://a2k.aill.org/
8
+
9
+ require 'nkf'
10
+
11
+ class Aozora4Reader
12
+
13
+ PreambleLineNumber=13
14
+ KANJIPAT = "[々〇〻\u3400-\u9FFF\uF900-\uFAFF※ヶ〆]"
15
+ MAX_SAGE = 15
16
+
17
+ def self.a4r(file)
18
+ self.new(file).main
19
+ end
20
+
21
+ def initialize(file)
22
+ @inputfile_name = file
23
+
24
+ @jisage = false
25
+ @log_text = []
26
+ @line_num=0
27
+ @gaiji = {}
28
+ @gaiji2 = {}
29
+ end
30
+
31
+ # UTF-8で出力
32
+ def normalize(l)
33
+ ##l.gsub!(/&/, '\\\\&')
34
+ l.to_s
35
+ end
36
+
37
+ # 全角→半角
38
+ def to_single_byte(str)
39
+ s = str.dup
40
+ if s =~ /[0-9]/
41
+ s.tr!("1234567890", "1234567890")
42
+ elsif s =~ /[一二三四五六七八九〇]/
43
+ s.tr!("一二三四五六七八九〇", "1234567890")
44
+ end
45
+ case s
46
+ when /\d十\d/
47
+ s.sub!(/(\d)十(\d)/, '\1\2')
48
+ when /\d十/
49
+ s.sub!(/(\d)十/, '\{1}0')
50
+ when /十\d/
51
+ s.sub!(/十(\d)/, '1\1')
52
+ when /十/
53
+ s.sub!(/十/, "10")
54
+ end
55
+ if s =~/[!?]/
56
+ s.tr!("!?", "!?")
57
+ end
58
+
59
+ return s
60
+ end
61
+
62
+ # ルビの削除(表題等)
63
+ def remove_ruby(str)
64
+ str.gsub(/\\ruby{([^}]+)}{[^}]*}/i){$1}
65
+ end
66
+
67
+ # プリアンブルの出力
68
+ def preamble
69
+ title = remove_ruby(@title)
70
+ author = remove_ruby(@author)
71
+ str = <<"END_OF_PRE"
72
+ \\documentclass[a5paper]{tbook}
73
+ %\\documentclass[a5paper, twocolumn]{tbook}
74
+ %\\usepackage[deluxe]{otf}
75
+ \\usepackage[expert, deluxe]{otf}
76
+ %\\usepackage{utf}
77
+ % Bookmarkの文字化け対策(日本語向け)
78
+ \\ifnum 46273=\\euc"B4C1 % 46273 == 0xB4C1 == 漢(EUC-JP)
79
+ \\usepackage{atbegshi}%
80
+ \\AtBeginShipoutFirst{\\special{pdf:tounicode EUC-UCS2}}%
81
+ \\else
82
+ \\usepackage{atbegshi}%
83
+ \\AtBeginShipoutFirst{\\special{pdf:tounicode 90ms-RKSJ-UCS2}}%
84
+ \\fi
85
+ \\usepackage[dvipdfm,bookmarks=false,bookmarksnumbered=false,hyperfootnotes=false,%
86
+ pdftitle={#{title}},%
87
+ pdfauthor={#{author}}]{hyperref}
88
+ \\usepackage{furikana}
89
+ \\usepackage{type1cm}
90
+ \\usepackage[size=large]{aozora4reader}
91
+ \\def\\rubykatuji{\\rubyfamily\\tiny}
92
+ %\\def\\rubykatuji{\\tiny}%for UTF package
93
+ %\\renewenvironment{teihon}{\\comment}{\\endcomment}
94
+
95
+ END_OF_PRE
96
+
97
+ str
98
+ end
99
+
100
+ # 底本の表示用
101
+ def postamble
102
+ str = <<"END_OF_POST"
103
+ \\theendnotes
104
+ \\begin{teihon}
105
+ \\clearpage\\null\\newpage\\thispagestyle{empty}
106
+ \\begin{minipage}<y>{\\textheight}
107
+ \\vspace{1\\baselineskip}
108
+ \\scriptsize
109
+ END_OF_POST
110
+
111
+ str
112
+ end
113
+
114
+ # アクセントの処理用
115
+ # http://www.aozora.gr.jp/accent_separation.html
116
+ # http://cosmoshouse.com/tools/acc-conv-j.htm
117
+ def translate_accent(l)
118
+ l.gsub!(/([ij]):/){"\\\"{\\#{$1}}"}
119
+ l.gsub!(/([AIOEUaioeu])(['`~^])/){"\\#$2{#$1}"}
120
+ l.gsub!(/([AIOEUaioeu]):/){"\\\"{#$1}"}
121
+ l.gsub!(/([AIOEUaioeu])_/){"\\={#$1}"}
122
+ l.gsub!(/([!?])@/){"#$1'"}
123
+ l.gsub!(/([Aa])&/){"\\r{#$1}"}
124
+ l.gsub!(/AE&/){"\\AE{}"}
125
+ l.gsub!(/ae&/){"\\ae{}"}
126
+ l.gsub!(/OE&/){"\\OE{}"}
127
+ l.gsub!(/oe&/){"\\oe{}"}
128
+ l.gsub!(/s&/){"\\ss{}"}
129
+ l.gsub!(/([cC]),/){"\\c{#$1}"}
130
+ l.gsub!(/〔/,'')
131
+ l.gsub!(/〕/,'')
132
+ return l
133
+ end
134
+
135
+
136
+ # 外字の処理用
137
+ def translate_gaiji(l)
138
+ if l =~/※[#([^]]*)、([^、]]*)]/
139
+ if @gaiji2[$1]
140
+ l.gsub!(/※[#([^]]*)、([^、]]*)]/){@gaiji2[$1]}
141
+ end
142
+ end
143
+ ## ※[#「姉」の正字、「女+※[#第3水準1-85-57]のつくり」、256-下-16]
144
+ if l =~/※[#([^]]*※[#[^]]*][^]]*)、([^、]]*)]/
145
+ if @gaiji2[$1]
146
+ l.gsub!(/※[#([^]]*※[#[^]]*][^]]*)、([^、]]*)]/){@gaiji2[$1]}
147
+ end
148
+ end
149
+ ## ※[#「さんずい+闊」]
150
+ if l =~ /※[#「([^]]+?)」]/
151
+ if @gaiji2[$1]
152
+ l.gsub!(/※[#「([^]]+?)」]/){@gaiji2[$1]}
153
+ end
154
+ end
155
+
156
+ if l =~ /※[#[^]]*?※[#[^]]*?[12]\-\d{1,2}\-\d{1,2}[^]]*?][^]]*?]/
157
+ l.gsub!(/※[#([^]]*?)※[#([^]]*?([12]\-\d{1,2}\-\d{1,2})[^]]*?)]([^]]*?)]/){"※\\footnote{#$1"+@gaiji[$3]+"#$4}"}
158
+ end
159
+ if l =~ /※[#[^]]*?([12]\-\d{1,2}\-\d{1,2})[^]]*?]/
160
+ if @gaiji[$1]
161
+ l.gsub!(/※[#([^]]*?([12]\-\d{1,2}\-\d{1,2})[^]]*?)]/){@gaiji[$2]}
162
+ end
163
+ end
164
+ if l =~ /※[#濁点付き片仮名([ワヰヱヲ])、.*?]/
165
+ l.gsub!(/※[#濁点付き片仮名([ワヰヱヲ])、.*?]/){ "\\ajLig{#{$1}゛}"}
166
+ end
167
+ if l =~ /※[#感嘆符三つ.*]/
168
+ l.gsub!(/※[#感嘆符三つ.*?]/){ "\\rensuji{!!!}"}
169
+ end
170
+
171
+ if l =~ /※[#.*?([A-Za-z0-9_]+\.png).*?]/
172
+ l.gsub!(/※[#([^]]+?)]/, "\\includegraphics{#{$1}}")
173
+ end
174
+
175
+ if l =~ /※[#[^]]+?]/
176
+ l.gsub!(/※[#([^]]+?)]/, '※\\footnote{\1}')
177
+ end
178
+
179
+ if l =~ /※/
180
+ STDERR.puts("Remaining Unprocessed Gaiji Character in Line #@line_num.")
181
+ @log_text << normalize("未処理の外字が#{@line_num}行目にあります.\n")
182
+ end
183
+ return l
184
+ end
185
+
186
+ # ルビの処理用
187
+ def translate_ruby(l)
188
+
189
+ # 被ルビ文字列内に外字の注記があるばあい,ルビ文字列の後ろに移動する
190
+ # ただし,順番が入れ替わってしまう
191
+ while l =~ /※\\footnote\{[^(?:\\footnote)]+\}(?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))*?《.+?》/
192
+ l.sub!(/(※)(\\footnote\{[^(?:\\footnote)]+\})((?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))*?《.+?》)/, '\1\3\2')
193
+ end
194
+
195
+ # 被ルビ文字列内に誤記などの注記が存在する場合は、ルビの後ろに移動する
196
+ while l =~ /(?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?[#[^]]*?](?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))*?《.+?》/
197
+ l.sub!(/((?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?)([#[^]]*?])((?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))*?《.+?》)/, '\1\3\2')
198
+ end
199
+
200
+ # ルビ文字列内に誤記などの注記が存在する場合は、ルビの後ろに移動する
201
+ if l =~ /《[^》]*?[#[^]]*?][^》]*?》/
202
+ l.gsub!(/(《[^》]*?)([#[^]]*?])([^》]*?》)/, '\1\3\2')
203
+ end
204
+
205
+ # 一連のルビの処理
206
+ # 1 縦棒ありの場合
207
+ if l =~ /|/
208
+ l.gsub!(/|(.+?)《(.+?)》/, '\\ruby{\1}{\2}')
209
+ end
210
+
211
+ # 2 漢字および外字
212
+ if l =~ /(?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?《.+?》/
213
+ l.gsub!(/((?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?)《(.+?)》/, '\\ruby{\1}{\2}')
214
+ end
215
+
216
+ # 3 ひらがな
217
+ if l =~ /[あ-ん](?:[ぁ-んーヽヾ]|\\CID\{12107\})*?《.+?》/
218
+ l.gsub!(/([あ-ん](?:[ぁ-んーヽヾ]|\\CID\{12107\})*?)《(.+?)》/, '\\ruby{\1}{\2}')
219
+ end
220
+
221
+ # 4 カタカナ
222
+ if l =~ /[ア-ヴ](?:[ァ-ヴーゝゞ]|\\CID\{12107\})*?《.+?》/
223
+ l.gsub!(/([ア-ヴ](?:[ァ-ヴーゝゞ]|\\CID\{12107\})*?)《(.+?)》/, '\\ruby{\1}{\2}')
224
+ end
225
+
226
+ # 5 全角アルファベットなど
227
+ if l =~ /[A-Za-zΑ-Ωα-ωА-Яа-я・]+?《.+?》/
228
+ l.gsub!(/([A-Za-zΑ-Ωα-ωА-Яа-я・]+?)《(.+?)》/, '\\ruby{\1}{\2}')
229
+ end
230
+
231
+ # 6 半角英数字
232
+ if l =~ /[A-Za-z0-9#_\-\;\&.\'\^\`\\\{\} ]+?《.+?》/
233
+ l.gsub!(/([A-Za-z0-9#_\-\;\&.\'\^\`\\\{\} ]+?)《(.+?)》/, '\\ruby{\1}{\2}')
234
+ end
235
+ if l =~ /《.*?》/
236
+ STDERR.puts("Unknown ruby pattern found in #@line_num.")
237
+ @log_text << normalize("未処理のルビが#{@line_num}行目にあります.\n")
238
+ end
239
+
240
+ return l
241
+ end
242
+
243
+ # 傍点の処理用
244
+ def translate_bouten(l)
245
+ bouten_list = [
246
+ ["傍点", "bou"],
247
+ ["白ゴマ傍点","sirogomabou"],
248
+ ["丸傍点","marubou"],
249
+ ["白丸傍点","siromarubou"],
250
+ ["黒三角傍点","kurosankakubou"],
251
+ ["白三角傍点","sirosankakubou"],
252
+ ["二重丸傍点","nijyuumarubou"],
253
+ ["蛇の目傍点","jyanomebou"]]
254
+
255
+ bouten_list.each{ |name, fun|
256
+ if l =~ /[#「.+?」に#{name}]/
257
+ l.gsub!(/(.+?)[#.*?「\1」に#{name}]/){
258
+ str = $1
259
+ str.gsub!(/(\\UTF{.+?})/){ "{"+$1+"}"}
260
+ str.gsub!(/(\\ruby{.+?}{.+?})/i){ "{"+$1+"}"}
261
+ "\\#{fun}{"+str+"}"
262
+ }
263
+ end
264
+ }
265
+
266
+ if l =~ /[#傍点].+?[#傍点終わり]/
267
+ l.gsub!(/[#傍点](.+?)[#傍点終わり]/){
268
+ str = $1
269
+ str.gsub!(/(\\UTF{.+?})/){ "{"+$1+"}"}
270
+ str.gsub!(/(\\ruby{.+?}{.+?})/i){ "{"+$1+"}"}
271
+ "\\bou{"+str+"}"
272
+ }
273
+ end
274
+ return l
275
+ end
276
+
277
+ # 傍線の処理用
278
+ def translate_bousen(l)
279
+ if l =~ /[#「.+?」に傍線]/
280
+ l.gsub!(/(.+?)[#「\1」に傍線]/, '\\bousen{\1}')
281
+ end
282
+ if l =~ /[#「.+?」に二重傍線]/
283
+ l.gsub!(/(.+?)[#「\1」に二重傍線]/, '\\bousen{\1}')
284
+ end
285
+ if l =~ /[#「.+?」に鎖線]/
286
+ l.gsub!(/(.+?)[#「\1」に鎖線]/, '\\bousen{\1}')
287
+ end
288
+ if l =~ /[#「.+?」に破線]/
289
+ l.gsub!(/(.+?)[#「\1」に破線]/, '\\bousen{\1}')
290
+ end
291
+ if l =~ /[#「.+?」に波線]/
292
+ l.gsub!(/(.+?)[#「\1」に波線]/, '\\bousen{\1}')
293
+ end
294
+ return l
295
+ end
296
+
297
+ # ルビの調整
298
+ def tuning_ruby(l)
299
+
300
+ # 1 直前が漢字の場合
301
+ if l =~ /(?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))\\ruby/
302
+ l.gsub!(/((?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\})))\\ruby/, '\1\\Ruby')
303
+ end
304
+
305
+ # 2 直後が漢字の場合
306
+ if l =~ /\\ruby\{(?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?\}\{(?:[^\\\{\}]|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?\}(?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))/
307
+ l.gsub!(/\\ruby(\{(?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?\}\{(?:[^\\\{\}]|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?\}(?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\})))/, '\\Ruby\1')
308
+ end
309
+
310
+ # 3 ルビが連続する場合
311
+ while l =~ /\\(?:ruby|RUBY|Ruby)\{(?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?\}\{(?:[^\\{}]|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?\}\\ruby/
312
+ l.sub!(/\\(?:ruby|RUBY|Ruby)(\{(?:#{KANJIPAT}|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?\}\{(?:[^\\{}]|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?\})\\ruby/, '\\RUBY\1\\RUBY')
313
+ end
314
+ end
315
+
316
+ # 傍点の調整
317
+ def tuning_bou(l)
318
+ # 傍点の中の「くの字点」を変換
319
+ while l =~ /(\\[a-z]*?bou\{(?:\w|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?)(\\ajD?Kunoji)\{\}((?:\w|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))*?)\}/
320
+ l.gsub!(/((\\([a-z]*?)bou)\{(?:\w|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))+?)(\\ajD?Kunoji)\{\}((?:\w|(?:\\UTF\{[0-9a-fA-F]+\}|\\CID\{[0-9]+\}))*?)\}/, '\1}\4with\3Bou\2{\5}')
321
+ end
322
+ if l =~ /\\[a-z]*?bou\{\}/
323
+ l.gsub!(/\\([a-z]*?)bou\{\}/, '{}')
324
+ end
325
+ return l
326
+ end
327
+
328
+ # 外字用ハッシュを作成
329
+ def load_gaiji
330
+ datadir = File.dirname(__FILE__)+"/../data"
331
+ File.open(datadir+"/gaiji.txt", "r:UTF-8") do |f|
332
+ while gaiji_line = f.gets
333
+ gaiji_line.chomp!
334
+ key, data = gaiji_line.split
335
+ @gaiji[key] = data
336
+ end
337
+ end
338
+
339
+ File.open(datadir+"/gaiji2.txt", "r:UTF-8") do |f|
340
+ while gaiji_line = f.gets
341
+ gaiji_line.chomp!
342
+ key, data = gaiji_line.split
343
+ data.gsub(/#.*$/,'')
344
+ @gaiji2[key] = data
345
+ end
346
+ end
347
+
348
+ end
349
+
350
+ #
351
+ # メインパート
352
+ #
353
+ def main
354
+ load_gaiji()
355
+
356
+ # 入出力ファイルの定義
357
+ outputfile_name = @inputfile_name.sub(/\.txt$/, ".tex")
358
+ inputfile = File.open(@inputfile_name, "r:SJIS")
359
+ outputfile = File.open(outputfile_name, "w:UTF-8")
360
+
361
+ # プリアンブルの処理
362
+ empty_line = 0
363
+ in_note = false
364
+ meta_data = []
365
+ while empty_line < 2
366
+ line = inputfile.gets.chomp
367
+ line = NKF::nkf('-wS', line)
368
+ if in_note
369
+ if line =~ /^-+$/
370
+ in_note = false
371
+ break
372
+ end
373
+ else
374
+ if line =~ /^-+$/
375
+ in_note = true
376
+ else
377
+ if line =~ /^$/
378
+ empty_line += 1
379
+ else
380
+ if line =~ /《.*?》/
381
+ translate_ruby(line)
382
+ end
383
+ meta_data << line
384
+ end
385
+ end
386
+ end
387
+ end
388
+
389
+ @line_num += meta_data.size
390
+ @title = normalize(meta_data.shift)
391
+ case meta_data.size
392
+ when 1
393
+ @author = normalize(meta_data.shift)
394
+ when 2
395
+ @subtitle = normalize(meta_data.shift)
396
+ @author = normalize(meta_data.shift)
397
+ when 3
398
+ @subtitle = normalize(meta_data.shift)
399
+ @author = normalize(meta_data.shift)
400
+ @subauthor = normalize(meta_data.shift)
401
+ else
402
+ @subtitle = normalize(meta_data.shift)
403
+ @meta_data = []
404
+ until meta_data.empty?
405
+ @meta_data << normalize(meta_data.shift)
406
+ end
407
+ @subauthor = @meta_data.pop
408
+ @author = @meta_data.pop
409
+ end
410
+
411
+ outputfile.write(preamble())
412
+
413
+ outputfile.print "\\title{"+@title+"}\n"
414
+ outputfile.print "\\subtitle{"+@subtitle+"}\n" if @subtitle
415
+ outputfile.print "\\author{"+@author+"}\n"
416
+ outputfile.print "\\subauthor{"+@subauthor+"}\n" if @subauthor
417
+
418
+ if @meta_data
419
+ @meta_data.each do |data|
420
+ outputfile.print "\\metadata{"+data+"}\n"
421
+ end
422
+ end
423
+ outputfile.print "\\date{}\n"
424
+
425
+ # 本文の処理
426
+ outputfile.print "\\begin{document}\n\\maketitle\n"
427
+
428
+ @line_num += PreambleLineNumber
429
+ while line = inputfile.gets
430
+ @line_num += 1
431
+ line.chomp!
432
+ line = NKF::nkf('-wS', line)
433
+
434
+ break if line =~ /^底本/
435
+ if line =~ /^ 「/
436
+ line.sub!(/^ 「/, "\\mbox{ }\\kern0mm\\inhibitglue「")
437
+ end
438
+ if line =~ /[ワヰヱヲ]゛/
439
+ line.gsub!(/ワ゛/, "\\ajLig{ワ゛}")
440
+ line.gsub!(/ヰ゛/, "\\ajLig{ヰ゛}")
441
+ line.gsub!(/ヱ゛/, "\\ajLig{ヱ゛}")
442
+ line.gsub!(/ヲ゛/, "\\ajLig{ヲ゛}")
443
+ end
444
+ if line =~ /[?!] /
445
+ line.gsub!(/([?!]) /, '\1{}')
446
+ end
447
+ if line =~ /——/
448
+ line.gsub!(/——/, "\\——{}")
449
+ end
450
+ if line =~ //\/
451
+ line.gsub!(//\/, "\\ajKunoji{}")
452
+ end
453
+ if line =~ //″\/
454
+ line.gsub!(//″\/, "\\ajDKunoji{}")
455
+ end
456
+
457
+ =begin
458
+ if line =~ /^  +.+/
459
+ line.gsub!(/^  +([一二三四五六七八九〇十].*)/, '\\section*{\1}')
460
+ end
461
+ =end
462
+
463
+ while line =~ /(.+?)[#(「\1」は横?[1|一]文字[^]]*?)]/
464
+ line = line.sub(/(.+?)[#(「\1」は横?[1|一]文字[^]]*?)]/){"\\ajLig{"+to_single_byte($1)+"}"}
465
+ end
466
+ if line =~ /[#改丁.*?]/
467
+ line.sub!(/[#改丁.*?]/, "\\cleardoublepage")
468
+ end
469
+ if line =~ /[#改[頁|ページ].*?]/
470
+ line.sub!(/[#改[頁|ページ].*?]/, "\\clearpage")
471
+ end
472
+
473
+ if line =~ /〔.*?〕/
474
+ translate_accent(line)
475
+ end
476
+
477
+ if line =~ /※/
478
+ translate_gaiji(line)
479
+ end
480
+ if line =~ /《.*?》/
481
+ translate_ruby(line)
482
+ end
483
+ if line =~ /[#(.+?)傍点]/
484
+ translate_bouten(line)
485
+ end
486
+ if line =~ /[#傍点].+?[#傍点終わり]/
487
+ translate_bouten(line)
488
+ end
489
+ if line =~ /[#「(.+?)」に(?:二重)?[傍鎖破波]線]/
490
+ translate_bousen(line)
491
+ end
492
+ if line =~ /[#この行.*?([1234567890一二三四五六七八九〇十]*)字下げ]/
493
+ outputfile.print "\\begin{jisage}{"+to_single_byte($1)+"}\n"
494
+ line = line.sub(/[#この行.*?字下げ]/, "")+"\n\\end{jisage}"
495
+ @line_num += 2
496
+ end
497
+
498
+ if line =~ /[#ここから地から.+字上げ]/
499
+ line.sub!(/[#ここから地から([1234567890一二三四五六七八九〇十]*)字上げ]/){"\\begin{flushright}\\advance\\rightskip"+to_single_byte($1)+"zw"}
500
+ @jisage = true
501
+ end
502
+ if line =~ /[#ここで字上げ終わり]/
503
+ line.sub!(/[#ここで字上げ終わり]/){"\\end{flushright}"}
504
+ @jisage = false
505
+ end
506
+
507
+ if line =~ /[#ここから改行天付き、折り返して.*?字下げ]/
508
+ if @jisage
509
+ outputfile.print "\\end{jisage}\n"
510
+ @line_num += 1
511
+ end
512
+ line.sub!(/[#ここから改行天付き、折り返して([1234567890一二三四五六七八九〇十]*)字下げ]/){"\\begin{jisage}{#{to_single_byte($1)}}\\setlength\\parindent{-"+to_single_byte($1)+"zw}"}
513
+ @jisage = true
514
+ end
515
+
516
+ if line =~ /[#.*?字下げ[^]]*?(?:終わり|まで)[^]]*?]/
517
+ line = line.sub(/[#.*?字下げ.*?(?:終わり|まで).*?]/, "")+"\\end{jisage}"
518
+ @jisage = false
519
+ end
520
+ if line =~ /[#(ここから|これより|ここより|以下).+字下げ.*?]/
521
+ if @jisage
522
+ outputfile.print "\\end{jisage}\n"
523
+ @line_num += 1
524
+ end
525
+ line.sub!(/[#(ここから|これより|ここより|以下).*?([1234567890一二三四五六七八九〇十]*)字下げ.*?]/){"\\begin{jisage}{"+to_single_byte($2)+"}"}
526
+ @jisage = true
527
+ end
528
+ if line =~ /^[#ここから地付き]$/
529
+ @jisage = true
530
+ line = "\\begin{flushright}"
531
+ end
532
+ if line =~ /^[#ここで地付き終わり]$/
533
+ line = "\\end{flushright}"
534
+ @jisage = false
535
+ end
536
+
537
+ if line =~ /[#.*?地付き.*?]$/
538
+ line = "\\begin{flushright}\n"+line.sub(/[#.*?地付き.*?]$/, "\\end{flushright}")
539
+ @line_num += 1
540
+ elsif line =~ /[#.*?地付き.*?]/
541
+ line = line.sub(/[#.*?地付き.*?]/, "\\begin{flushright}\n")+"\\end{flushright}"
542
+ @line_num += 1
543
+ end
544
+ if line =~ /[#.*?(?:行末|地)(?:から|より).*?([1234567890一二三四五六七八九〇十]*)字上.*?]$$/
545
+ line = "\\begin{flushright}\\advance\\rightskip"+to_single_byte($1)+"zw\n"+line.sub(/[#.*?(?:行末|地)(?:から|より).*?字上.*?]$/, "\\end{flushright}")
546
+ @line_num += 1
547
+ elsif line =~ /^(.*?)[#.*?(?:行末|地)(?:から|より).*?([1234567890一二三四五六七八九〇十]*)字上.*?](.*)$/
548
+ line = $1+"\\begin{flushright}\\advance\\rightskip"+to_single_byte($2)+"zw\n"+$3+"\\end{flushright}"
549
+ @line_num += 1
550
+ end
551
+ if line =~ /[#「.+?」は返り点]/
552
+ line.gsub!(/(.+)[#「\1」は返り点]/, '\\kaeriten{\ajKunten{\1}}')
553
+ end
554
+ if line =~ /[#[一二三上中下甲乙丙丁レ]*]/
555
+ line.gsub!(/[#([一二三上中下甲乙丙丁レ]*)]/, '\\kaeriten{\ajKunten{\1}}')
556
+ end
557
+ if line =~ /[#(.*?)]/
558
+ line.gsub!(/[#((.*?))]/, '\\okurigana{\1}')
559
+ end
560
+ if line =~ /[#「.+?」.*?ママ.*?注記]/
561
+ line.gsub!(/(.+)[#「\1」.*?ママ.*?注記]/, '\\ruby{\1}{ママ}')
562
+ end
563
+
564
+ if line =~ /[#[^]]+(([^)]+.png).*?)[^]]+]/
565
+ line.gsub!(/[#[^]]+(([^)]+.png).*?)[^]]+]/, '\\sashie{\1}')
566
+ end
567
+
568
+ if line =~ /[#([1234567890一二三四五六七八九〇十]*)字下げ]/
569
+ num = to_single_byte($1).to_i
570
+ if num > MAX_SAGE
571
+ num = MAX_SAGE
572
+ end
573
+ outputfile.print "\\begin{jisage}{#{num}}\n"
574
+ line = line.sub(/[#.*?字下げ]/, "")+"\n\\end{jisage}"
575
+ end
576
+
577
+ ## ちょっと汚いけど二重指定の対策
578
+ if line =~ /[#「(.*?)」は縦中横][#「(.*?)」は中見出し]/
579
+ line.gsub!(/(.*?)[#「(\1)」は縦中横][#「(\1)」は中見出し]/){"{\\large \\rensuji{#{$1}}}"}
580
+ end
581
+
582
+ if line =~ /[#「(.*?)」は大見出し]/
583
+ line.gsub!(/(.*?)[#「(.*?)」は大見出し]/){"{\\Large #{$1}}"}
584
+ end
585
+ if line =~ /[#「(.*?)」は中見出し]/
586
+ line.gsub!(/(.*?)[#「(.*?)」は中見出し]/){"{\\large #{$1}}"}
587
+ end
588
+ if line =~ /[#「(.*?)」は小見出し]/
589
+ line.gsub!(/(.*?)[#「(.*?)」は小見出し]/){"{\\gtfamily #{$1}}"}
590
+ end
591
+ if line =~ /[#小見出し](.*?)[#小見出し終わり]/
592
+ line.gsub!(/[#小見出し](.*?)[#小見出し終わり]/){"{\\gtfamily #{$1}}"}
593
+ end
594
+ if line =~ /[#中見出し](.*?)[#中見出し終わり]/
595
+ line.gsub!(/[#中見出し](.*?)[#中見出し終わり]/){"{\\large #{$1}}"}
596
+ end
597
+
598
+ if line =~ /[#ここから中見出し]/
599
+ line.gsub!(/[#ここから中見出し]/){"{\\large"}
600
+ end
601
+ if line =~ /[#ここで中見出し終わり]/
602
+ line.gsub!(/[#ここで中見出し終わり]/){"}"}
603
+ end
604
+
605
+ if line =~ /[#ページの左右中央]/
606
+ ## XXX とりあえず無視
607
+ line.gsub!(/[#ページの左右中央]/, "")
608
+ end
609
+
610
+ ## XXX 字詰めは1行の文字数が少ないので無視
611
+ if line =~ /[#ここから([1234567890一二三四五六七八九〇十]*)字詰め]/
612
+ line.gsub!(/[#ここから([1234567890一二三四五六七八九〇十]*)字詰め]/, "")
613
+ end
614
+ if line =~ /[#ここで字詰め終わり]/
615
+ line.gsub!(/[#ここで字詰め終わり]/, "")
616
+ end
617
+
618
+ # XXX 割り注も無視
619
+ if line =~ /[#ここから割り注]/
620
+ line.gsub!(/[#ここから割り注]/, "")
621
+ end
622
+ if line =~ /[#ここで割り注終わり]/
623
+ line.gsub!(/[#ここで割り注終わり]/, "")
624
+ end
625
+
626
+ if line =~ /[#「(.*?)」は太字]/
627
+ line.gsub!(/(.+)[#「\1」は太字]/,'{\\textbf{\1}}')
628
+ end
629
+ if line =~ /[#「.+?」は縦中横]/
630
+ line.gsub!(/(.+)[#「\1」は縦中横]/, '\\rensuji{\1}')
631
+ end
632
+ if line =~ /[#「(1)(/)(\d+)」は分数]/
633
+ bunshi = to_single_byte($1)
634
+ bunbo = $3
635
+ line.gsub!(/(.+)[#「.+?」は分数]/, "\\rensuji{#{bunshi}/#{bunbo}}")
636
+ end
637
+ if line =~ /[#「.+?」は罫囲み]/
638
+ line.gsub!(/(.+)[#「\1」は罫囲み]/, '\\fbox{\1}')
639
+ end
640
+ if line =~ /[#「(.+?)」は(本文より)?([123456])段階大きな文字]/
641
+ line.gsub!(/([^[]+?)[#「\1」は(本文より)?([123456])段階大きな文字]/) {
642
+ num = to_single_byte($3).to_i
643
+ case num
644
+ when 1
645
+ "{\\large #{$1}}"
646
+ when 2
647
+ "{\\Large #{$1}}"
648
+ when 3
649
+ "{\\LARGE #{$1}}"
650
+ when 4
651
+ "{\\huge #{$1}}"
652
+ when 5
653
+ "{\\Huge #{$1}}"
654
+ when 6
655
+ "{\\Huge #{$1}}"
656
+ end
657
+ }
658
+ end
659
+
660
+ if line =~ /[#「.+?」は斜体]/
661
+ line.gsub!(/(.+)[#「\1」は斜体]/){
662
+ shatai = to_single_byte($1).tr("abcdefghijklmnopqrstuvwxyz","abcdefghijklmnopqrstuvwxyz")
663
+ "\\rensuji{\\textsl{"+shatai+"}}"
664
+ }
665
+ end
666
+ if line =~ /[#「[0-90-9]」は下付き小文字]/
667
+ line.gsub!(/([A-Za-za-zA-Zαβδγ])([0-90-9])[#「\2」は下付き小文字]/){
668
+ "$"+$1+"_{"+to_single_byte($2)+"}$"
669
+ }
670
+ end
671
+ if line =~ /([^ ]*)[#ゴシック体]$/
672
+ line.gsub!(/([^ ]*)[#ゴシック体]/){"{\\gtfamily #{$1}}"}
673
+ end
674
+ if line =~ /[#「.+?」はゴシック体]/
675
+ line.gsub!(/(.+?)[#「\1」はゴシック体]/){"{\\gtfamily #{$1}}"}
676
+ end
677
+
678
+ if line =~ /[#ここから横組み](.*?)[#ここで横組み終わり]/
679
+ line.gsub!(/[#ここから横組み](.*?)[#ここで横組み終わり]/){
680
+ yoko_str = $1
681
+ yoko_str.gsub!(/π/,"\\pi ")
682
+ yoko_str.gsub!(/=/,"=")
683
+ yoko_str.gsub!(/(\d+)[#「\1」は指数]/){"^{#{$1}}"}
684
+ "$"+yoko_str+"$"
685
+ }
686
+ end
687
+ line.tr!("┌┐┘└│─┏┓┛┗┃━→","┐┘└┌─│┓┛┗┏━┃↓")
688
+ if line =~ /[#改段]/
689
+ line.sub!(/[#改段]/, "\\clearpage")
690
+ end
691
+ if line =~ /[aioeu]\^/i
692
+ line.gsub!(/([aioeu])\^/i){ "\\\^{#{$1}}"}
693
+ end
694
+ if line =~ /[aioeu]\'/i
695
+ line.gsub!(/([aioeu])\'/i){ "\\\'{#{$1}}"}
696
+ end
697
+ if line =~ /[#天から.*?([1234567890一二三四五六七八九〇十]*)字下げ]/
698
+ num = to_single_byte($1).to_i
699
+ if num > MAX_SAGE
700
+ num = MAX_SAGE
701
+ end
702
+ outputfile.print "\\begin{jisage}{#{num}}\n"
703
+ line = line.sub(/[#天から.*?字下げ]/, "")+"\n\\end{jisage}"
704
+ end
705
+
706
+ line.gsub!(/[#図形 □(四角)に内接する◆]/, '{\setlength{\fboxsep}{0pt}\fbox{◆}}')
707
+
708
+ if line =~ /[#[^]]+?]/
709
+ line.gsub!(/[#([^]]+?)]/, '\\endnote{\1}')
710
+ end
711
+ if line =~ /\\[a-z]*?bou/
712
+ tuning_bou(line)
713
+ end
714
+ if line =~ /\\ajD?Kunoji\{\}\}/
715
+ line.gsub!(/(\\ajD?Kunoji)\{\}\}/, '\1}')
716
+ end
717
+ if line =~ /\\ruby/
718
+ tuning_ruby(line)
719
+ end
720
+ if line =~ /^$/
721
+ line = " "
722
+ end
723
+ outputfile.print normalize(line)+"\n"
724
+ end
725
+
726
+ # 底本の処理
727
+ outputfile.write(postamble())
728
+ outputfile.print normalize(line)+"\n"
729
+ while line = inputfile.gets
730
+ line.chomp!
731
+ line = NKF::nkf('-wS', line)
732
+ outputfile.print normalize(line)+"\n"
733
+ end
734
+ outputfile.print "\n\\end{minipage}\n\\end{teihon}\n\\end{document}\n"
735
+ if @log_text.size > 0
736
+ until @log_text.empty?
737
+ outputfile.print @log_text.shift
738
+ end
739
+ end
740
+ end
741
+ end