―LuaMetaTeXを用いた縦組とLua機能を用いた組版前処理法の提示―
これは TeX & LaTeX アドベントカレンダー 2025 の 4 日目の企画です。 前の日は、Yarakashi_Kikohshi さんの otf パッケージの非公式マニュアルを作ってみた でした。 次の日は、masuipeo さんのLaTeXの数式画像を作るならRaycastの「LaTeX to Image」が便利でした。
本企画は、文字列原文を入力とする組版処理における、組版規則の自在性を備えた日本語組版環境の試作です。 汎用多言語組版処理器としてLuaMetaTeXを選び、その向き(orientation)機能を用いて東洋諸言語の縦組みを実現するための例を提示しています。
本企画には、Lua組込TeXのLua機能を用いて文章に任意の組版命令を埋め込むことによる組版前処理方法の提案が含まれます。 この方法は前処理と組版とが一度の実行で済む点で手軽(カンタン)です。
前処理では、組版する文書の文字列を元に、低水準な組版命令を主としたTeX原文を作ります。 この方法では、使い手が組版処理を制御し易い(カンタン)ため、自在な組版規則の設定ができます。
「カンタン」(簡単)はアドベントカレンダーの主題です。
日本語縦組み環境を開発中です。 まずはマス目状(方眼紙様)の縦ベタ組を作っています。
今は行き当たりばったりで何となく処理を追加して作っていますが、今のところ大方うまく行っています! 機能の整理や分離はまだ不完全です。
con1.pdf が現状の成果です。
\startbuffer[本文]
\def\tozihiraki#1#2{\discretionary{\rlap{#1}\hskip10pt}{#2}{#1\hskip-10pt#2}}
組版用例文\par
\hfill 作・ChatGPT、津茶利休
遥かな\yokomozi{aaaa}の向こうから、\tatesuuzi{1234}の刻が流れつづ\tatesuuzi{12345}していますが、フィルタをかけたファイ結果、その根拠は誰にも分かりませんね。
この段落はペナルティーを消し、ぶら下げでおわる行だ。
この地ァィゥェォッャュョヮぁぃぅぇぉっゃゅょゎヵヶの広場には、\tateitizi{7}個の石と\yokomozi{“qui\-et fi\-eld”}の文字が置かれていますが、意味は定かではありません。
人々は、\tateitizi{42}の数だけ足踏みをし、理由もなく\tateitizi{18}、\tatesuuzi{903}、\tatesuuzi{200040}といった数を書きつけます。
「あう。\hskip-5pt」\hskip-5ptえおか「きく」けこ「けこ。\hskip-5pt」\hskip-5pt。
さし「す\tozihiraki{」}{「}せみ\tozihiraki{」}{「}そ」\hskip-5pt。\hskip-5pt「せ\tozihiraki{」}{「}そ」
さし「す\tozihiraki{」}{「}せそたちつて\tozihiraki{」}{「}てとなに」
さしすせそたちつてとな「てとなに」
そう\tozihiraki{。}{「}ああああああああ\rlap{\hbox{」\hskip-5pt。\hskip-5pt}}\hskip10ptいい。
そう\tozihiraki{。}{「}ああああああああう\rlap{\hbox{」\hskip-5pt。\hskip-5pt}}\hskip10ptいい。
「東の道」では、\tateitizi{3}つの灯が昼でもともり、そばには\yokomozi{“sil\-ent-run”}や\yokomozi{“x1beta”}の表記が風に揺れています。
ある日には、900000の札が落ちており、翌日には\yokomozi{5, 77, 120004}の数字が砂に刻まれていました。
西の丘では、aaaa\zikan の名を持つ古い札が見つかり、その裏には\yokomozi{“alpha-note 55”}とだけ書かれていました。
丘の麓で拾われた紙片には、\tateitizi{16}と\yokomozi{ran\-dom\-text\-21}が並び、並べた者の意図は不明です。
夜になると、\tateitizi{8}万の数字だけがほのかに浮かび上がると伝えられていますが、確かめた者はいません。
\stopbufferNixをインストールしてnix-shellを実行し、context con1で組版を実行します。
従来の日本語組版環境とは少し異なる思想で開発しています。
- 組版規則を変えやすく設計
- 書体を選びやすく設計
- 全体の環境は多言語(日本語でなく)
- 各機能は初期では無効(使い手が有効化する)
- 機能読み込みでは副作用なし
\ctxlua{}内で使用者が決定- 和文欧文間の自動アキ
- 縦組み数字の処理
- など
- 文書をLuaで前処理しTeXの基本機能で組む
- 今のところLuaMetaTeX (ConTeXt)を使う(orientationやcontext()を使用)
- 必要知識はTeXブックとConTeXtのみ
- TeX原文を把握できるようにする(問題発見をし易く)
- 初期設定は原稿用紙に近いベタ組
- ぶら下げる
- 糊を伸ばさず追い出す
- 欧文が混ざる行の
pack quality > overfull hbox警告はとりあえず良いことにする
マ工大式許諾(MIT license)にしているので、再配布、分岐(フォーク)、改造など自由に転用できます。
部分的な発想については、著作権表示せず流用して構いません。
- やることや問題点を見つける
- 整理する
- 前処理をより安全にする
- ConTeXt脚注を試す、調節する
- ふりがな(ルビー)
- 各種前処理自動化関数と入り切り機構
- 割注を他からここへ移植
- 傍線自動化(各文字と字間へ)
- 様々な約物連続の処理と検証
- 長い改行禁止語句
- 数式を試す
- より体系的に構文解析して処理(段落の認識など)
- ConTeXt大命令を試す
- 雛形を作る
- 横組みとの切り替え
- 2段組を試す
- 標準MarkDown書き出し機能
- TeX命令混じりMarkDown読み込み機能
- 同じ事をLuaTeXでするには?
- 約物の処理は不十分で、警告もまだ直していない。
- orientationを使うと背景機能が使えない?
縦組みは、
\def\縦字#1{\hbox orientation 3 {\vrule width0pt height8.8pt depth1.2pt\kern-1.2pt\tatesyotai #1}}%
\def\字間{\hskip0pt plus.5pt minus.3pt\penalty0}%
\leavevmode\縦字{あ}\字間 \縦字{い}\字間 \縦字{う} のように各文字をorientation(向き)で回転させた上で、
\newbox\tatebako
\setbox\tatebako\vbox\bgroup\hsize=\vsize\switchtobodyfont[modern]
\tatesyotai \leavevmode
\ctxlua{...}\egroup
\starttext
\loop
\ifdim\ht\tatebako>0pt
\setbox0=\vsplit\tatebako to \hsize
\page
\vbox orientation 1 to \hsize
\bgroup\unvbox0\vfill\egroup
\repeat
\stoptextのように全体を箱に入れて、もう一度全体をorientation 1で回転させ、出力循環処理でページ分割することでできました。
本文を\startbuffer[本文]と\stopbufferで囲み、次のように\ctxlua{}内で文字列として処理します。
\ctxlua{
local 本文 = buffers.getcontent("本文")
本文 = nihongo.ぶら下げ(本文)
本文 = nihongo.追い出し(本文)
本文 = nihongo.縦組回転(本文)
本文 = nihongo.ぶら下げ後処理(本文)
本文 = nihongo.段落処理(本文)
texio.write_nl(本文)
context(本文)
}texio.write_nl(本文)で記録(.log)に出力し、TeX原文が把握できるようにします。Luaで前処理した後は、例えば次のようなTeX原文になり、端末で確認できます。
\縦字{し}\rlap{\縦字{、}\字間 }\hskip10pt\penalty0{}\縦字{理}\字間 \縦字{由}\字間 \縦字{も}\字間 \縦字{な}\字間 \縦字{く}\字間 \tateitizi{18}\rlap{\縦字{、}\字間 }\hskip10pt\penalty0{}\tatesuuzi{903}\rlap{\縦字{、}\字間 }\hskip10pt\penalty0{}\tatesuuzi{200040}\縦字{と}\字間 \縦字{い}\字間 \縦字{っ}\字間 \縦字{た}\字間 \縦字{数}\字間 \縦字{を}\字間 \縦字{書}\字間 \縦字{き}\字間 \縦字{つ}\字間 \縦字{け}\字間 \縦字{ま}\字間 \縦字{す}\rlap{\縦字{。}\字間 }\hskip10pt
\leavevmode\縦字{「}\字間 \縦字{あ}\字間 \縦字{う}\rlap{\縦字{。}\字間 }\hskip10pt\penalty0{}\hskip-5pt\縦字{」}\字間 \hskip-5pt\縦字{え}\字間 \縦字{お}\字間 \縦字{か}\discretionary{\hskip10pt}{\縦字{「}\字間 }{\縦字{「}\字間 }\縦字{き}\字間 \縦字{く}\字間 \縦字{」}\字間 \縦字{け}\字間 \縦字{こ}\discretionary{\hskip10pt}{\縦字{「}\字間 }{\縦字{「}\字間 }\縦字{け}\字間 \縦字{こ}\rlap{\縦字{。}\字間 }\hskip10pt\penalty0{}\hskip-5pt\縦字{」}\字間 \hskip-5pt\rlap{\縦字{。}\字間 }\hskip10pt
\leavevmode\縦字{さ}問題があればTeX原文を確認し、意図するTeX原文になるように前処理を修正することで、TeX(と文字列処理)の知識のみで解決できます。
TeX組版における別言語での前処理する例としては、九州大学文藝部のベスト文集制作記録⑥(本文の組み方③・ベタ組篇)|文藝部LaTeX研究会があります。