aozora4reader 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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