親文字揃へと肩付ルビとがきちんと出來てゐるPDF文書といふものを、僕は、梅雨空文庫にあるものくらゐしか知らない。これを自分でもLaTeXを使つて自動化出來ないものかといふのが、ここ何年かの懸案事項の一つだつた。
肩付ルビは、單語辭書を持たせる必要があるものの、LaTeXマクロが用意されてをり、比較的簡單に實現可能である。また、その副作用で行頭の親文字揃へは自動的に出來てしまふが、問題は行末である。LaTeXをコンパイルしただけだと、親文字(漢字)が浮いたり、ルビが下にはみ出たり見苦しい。これを避けるには、行末に來るルビと親文字に對し獨特の配置ルールを宛がふ必要がある。しかし、縦書きTeXで行末の檢知をうまくやるのは、ネットを漁つてみても、現状では難しいらしい。ここに書いてある通りを自分でも實驗してみたが、やはり期待通りには動かない。
記事を見る限りでは、和文TeX特有の問題らしいので、TeX或はLaTeXのソースを讀んで手を入れるのが一番正統な解決方法だとは思ふが、そこまでの根気はないので、筋がよくないとは知りつつ強硬策に出ることにした。一旦TeXにかけた後,その出力から行單位に情報を取り出し、揃つてゐない行末を強制するといふものである。TeXが吐くdviをいぢつても好いのだが、CL-PDFといふ使ひ慣れた道具があるので、dvipdfmxで出來上がつたPDFをパースして強制的に行末を揃へてやらうと思ひたつた。
親文字揃へが崩れるパターンには二つあつて、一つはルビが行末からはみ出るタイプ、もう一つは親文字(漢字)が行末から浮いてしまふタイプである。ルビに關しては、行内位置を計算しながら一つ一つ文字を追ひかけて行き、行末をはみ出たら、その文字を上に引き上げてやる、引き上げたとき、さらに上の文字と重なるといけないので、再歸的に見つつ重なりのなくなつたところで終了。漢字についてはルビよりは簡單で、浮いてゐる文字があれば少し下げて行末に落ち着かせてやる。このアルゴリズムで拾へないケースもあるが、それは實際に遭遇したときに考へることにする。
プログラムの檢證題材は明治元譯新約聖書である。WikisourceにあるテキストからLaTeXを組み立て、PDFにしたものを親文字揃へしてみた。dirty hack とも呼べないボロボロの program で、その都度 parameter tuning が必要な、自動化には程遠いものだが、とりあへず使徒行傳に適用してみたところ、まだまだ問題はあるものの、以前よりはずつと好い感じに仕上がつた。
肩付ルビは、單語辭書を持たせる必要があるものの、LaTeXマクロが用意されてをり、比較的簡單に實現可能である。また、その副作用で行頭の親文字揃へは自動的に出來てしまふが、問題は行末である。LaTeXをコンパイルしただけだと、親文字(漢字)が浮いたり、ルビが下にはみ出たり見苦しい。これを避けるには、行末に來るルビと親文字に對し獨特の配置ルールを宛がふ必要がある。しかし、縦書きTeXで行末の檢知をうまくやるのは、ネットを漁つてみても、現状では難しいらしい。ここに書いてある通りを自分でも實驗してみたが、やはり期待通りには動かない。
記事を見る限りでは、和文TeX特有の問題らしいので、TeX或はLaTeXのソースを讀んで手を入れるのが一番正統な解決方法だとは思ふが、そこまでの根気はないので、筋がよくないとは知りつつ強硬策に出ることにした。一旦TeXにかけた後,その出力から行單位に情報を取り出し、揃つてゐない行末を強制するといふものである。TeXが吐くdviをいぢつても好いのだが、CL-PDFといふ使ひ慣れた道具があるので、dvipdfmxで出來上がつたPDFをパースして強制的に行末を揃へてやらうと思ひたつた。
親文字揃へが崩れるパターンには二つあつて、一つはルビが行末からはみ出るタイプ、もう一つは親文字(漢字)が行末から浮いてしまふタイプである。ルビに關しては、行内位置を計算しながら一つ一つ文字を追ひかけて行き、行末をはみ出たら、その文字を上に引き上げてやる、引き上げたとき、さらに上の文字と重なるといけないので、再歸的に見つつ重なりのなくなつたところで終了。漢字についてはルビよりは簡單で、浮いてゐる文字があれば少し下げて行末に落ち着かせてやる。このアルゴリズムで拾へないケースもあるが、それは實際に遭遇したときに考へることにする。
プログラムの檢證題材は明治元譯新約聖書である。WikisourceにあるテキストからLaTeXを組み立て、PDFにしたものを親文字揃へしてみた。dirty hack とも呼べないボロボロの program で、その都度 parameter tuning が必要な、自動化には程遠いものだが、とりあへず使徒行傳に適用してみたところ、まだまだ問題はあるものの、以前よりはずつと好い感じに仕上がつた。
Comments
Post a Comment