🌸

平のXeTeXで日本語横組み(改行と字間の設定)

に公開

平のXeTeXで日本語横組み(改行と字間の設定)

🌸#春のTeX言語キャンペーン🌸が始まったみたいです!
満開(expanded)のTeXの花🌸(⿱艹⿲亻E𠤎)がきれいに咲いていますね。

XeTeXで日本語横組みしたい

XeLaTeXでは日本語横組みができますが、平(plain)のXeTeXでもできないでしょうか。
LaTeXは手軽ですが、処理内容が分かりづらい煩(わずら)わしさもあります。
本来のTeXを使いたい使い手にとっては、Xe平eXで日本語を横組みできると嬉しいところでしょう。

自在に設定したい

組版に絶対的な決まりはありません。
組版設定は、単に読み込む使い方だけでなく、使い手が好みに合わせて自由に調節できるようなものが、より良いでしょう。

そのためには、なるべく分かりやすく小さな文量による設定が好ましいです。
明快TeX中国語版 https://ctan.org/tex-archive/info/impatient/cn の xeCJK-base.texでは、長大な原文量の設定で中国語のXeTeX組版を実現していますが、より小さな設計を目指します。

字間に糊を入れる

XeTeXでの日本語横組みは\XeTeXinterchartoksで字間に糊(グルー、伸び縮みする隙間)を入れることでできました。

まず\XeTeXinterchartokenstate=1\relaxで機能の効きを入りにします。

次に、各字間に入れるものを定めます。
例えば、第1類文字(XeTeXの文字分類)同士の間に\hskip0em plus .6emを入れたい時はこのように書きます。

\def\閉糊{\hskip0em plus .6em}
\XeTeXinterchartoks 1 1{\閉糊}

第1類は中日韓表意文字(CJK ideographs)とされています。
表意文字というより実際には「あ」などの全角文字のことです。
この場合、ああは自動的にあ\hskip0em plus .6emあに展開されます。

これを他の組み合わせについても書くことで日本語組版の設定ができます。

閉じた糊の役割り

糊は改行可能です。
糊を挟まないと、一単語とみなされてしまうため、自動で改行されません。
\hskip0emは幅の無い隙間ですが、改行してよいことを示すのに役立ちます。

\hskipplus .6emは隙間の幅を0.6em分まで伸ばしても良いことを表しています。
字間を空け、行の左端を美しく揃えるために役立ちます。

xeja.tex
%マ工大式許諾(MIT License) 著:津茶利休

\def\行頭禁則小字設定#1{%行頭禁則 適当な番号100への割り当て
  \ifx#1/\else \XeTeXcharclass`#1=100\expandafter\行頭禁則小字設定\fi}
\行頭禁則小字設定 ゃゅょぁぃぅぇぉャュョァィゥェォ/%一拍小書き文字(っッヵヶ)は禁則にしない 

\XeTeXinterchartokenstate=1\relax
\XeTeXcharclass`ー=1
\XeTeXcharclass` =1
\def\閉{\hskip0em plus .6em}
\def\半ぶら下げと任意詰{\vrule width -.7em \hskip .7em plus 0.1em minus 0.6em}%参考:impatient/cn/xeCJK-base.tex
\def\半詰め{\hskip-.5em plus.1em minus.1em}
\def\任意詰{\hskip0em minus.6em}
% 改行禁止 1 3 あ」 あ、 100 3  ょ」 ょ、 
% \XeTeXinterchartoks 1 100{}%あょ 禁則なしなら{\閉糊}
\XeTeXinterchartoks 1 1{\閉}%{\hskip0pt plus .4\zw\全角文字}%ああ
\XeTeXinterchartoks 100 100{\閉}%
\XeTeXinterchartoks 100 1{\閉}%
\XeTeXinterchartoks 1 0{\閉}%あa 勝手にあけない
\XeTeXinterchartoks 100 0{\閉}%ょa
\XeTeXinterchartoks 0 1{\閉}%aあ 勝手にあけない
\XeTeXinterchartoks 0 100{\閉}%aょ
\XeTeXinterchartoks 3 2{\半詰め}%、「
\XeTeXinterchartoks 3 1{\半ぶら下げと任意詰}%、あ
\XeTeXinterchartoks 3 0{\半ぶら下げと任意詰}%:a, :0
\XeTeXinterchartoks 0 3{\半ぶら下げと任意詰}%a:
\XeTeXinterchartoks 3 3{\半詰め}%。」、
\XeTeXinterchartoks 1 2{\任意詰}%あ「 やや詰めてもいい
\XeTeXinterchartoks 100 2{\任意詰}%ょ「
%未想定 3 100 、ょ  2 100 「ょ
%3:」。%2:「(%0:(

\def\^^M{}%行末に`\`で空白なしの改行回避
\parindent=1em

モリサワの組版例文を引いた例

%xetex
\input xeja
\pdfpagewidth=148mm\pdfpageheight=210mm%紙面縦横 A5

\def\明朝体{"IPAexMincho" }%
\def\ゴシック体{"IPAexGothic" }%
\font\ミン十=\明朝体 at 10pt
\font\ゴチ十=\ゴシック体 at 10pt
\ミン十

\def\定{%
  {\offinterlineskip\noindent\hskip-.25pt\dimen0=0pt
  \loop
  \rlap{\vrule height3pt depth0pt width0.5pt}\hskip10pt
    \advance\dimen0 by 10pt
    \ifdim\dimen0<\dimexpr\hsize+1pt\relax
  \repeat
  \par}
}
\def\見出し#1{\noindent {\ゴチ十 #1}\par\nobreak}
\def\横{{\offinterlineskip\noindent\hskip-.25pt
  \rlap{\vrule height.5pt width\dimexpr\hsize+.5pt\relax}\par}}
\long\def\組版例示#1{\vskip5pt\横\nobreak\定\nobreak\vskip-5pt
\nobreak#1\nobreak\定\nobreak\横\vskip5pt\par}


\hsize=110pt\baselineskip14pt%10pt 11文字
\見出し{行頭禁則}
\noindent 追い出す例\par
\組版例示{\noindent 昨日の朝食はパンでした丸今日の朝食はご飯です丸\par}
\組版例示{\noindent 昨日の朝食はパンでした。今日の朝食はご飯です。\par}
\vskip5pt
\noindent 追い込む例\par
\組版例示{\noindent 朝は「ベーグル」でした丸昼はバインミーです丸\par}
\組版例示{\noindent 朝は「ベーグル」でした。昼はバインミーです。\par}

\見出し{行末禁則}
\組版例示{\noindent いえ、朝のあいさつは始おはよう終です。\par}
\組版例示{\noindent いえ、朝のあいさつは「おはよう」です。\par}

\noindent 追い込む場合\par
{\XeTeXinterchartoks 3 1{\hskip-.5em}%、あ
\XeTeXinterchartoks 1 2{\hskip-.5em}%あ「 やや詰めてもいい
\組版例示{\noindent いえ、朝のあいさつは「おはよう」です。\par}}

\見出し{分離禁止の例}
\組版例示{\noindent S・バンタム級は約53.5kgまで。\par}

\bye

仕様を見るための例

%xetex
\input xeja
\input hologo.sty % sudo tlmgr install hologo 
\def\明朝体{"IPAexMincho" }%
\def\ゴシック体{"IPAexGothic" }%
\font\ミン十=\明朝体 at 10pt
\font\ゴチ十=\ゴシック体 at 10pt
\font\ゴチ十二=\ゴシック体 at 12pt
\font\ゴチ十四=\ゴシック体 at 14pt


\def\節#1{\vskip5pt\noindent {\ゴチ十二 #1}\par\nobreak}

\noindent\hfil\ゴチ十四 \hologo{XeTeX}で日本語横組み\hfil\par
\vskip4mm
\ミン十
\hfill 令和七年四月吉日\par
\hfill 津茶利休\par

\節{半角と全角の字間は手動で空ける}

ラテンを含んだ文章の例:Latin 文字 (moji)。場合や様式によってはLatin文字のように半角空白なしでも良い。数字もラテン文字と同じ \hologo{XeTeX}字類 0 番。\par

\def\今{2025}\vskip10pt
空け:\今\ 年 4 月\par
詰め:\今年 年4月\par
両用:\今年 年 4 月(1 桁前後のみ空け)\par

\vskip10pt
詰め:Knuthは\TeX の作者\par
空け:Donald Knuth は \TeX~の作者\par
両用:Donald Knuth は\TeX の作者(二語以上の欧文で空け)\par
両用:Knuth は \TeX 使い(和欧混用名詞でのみ詰め)\par

\節{句読点と括弧の間隔を試す}
「あああ。」、(あああ。)。いい感じ!(読点と括弧始まりの組『、(』は1.5全角幅くらいになると良いらしい。)

『、(』あ\par
ああああ


\節{改行文字の入力に対する空白の抑制}
良例:%
a.
b.
%->a. b.

悪例:%
a.%
b.
%->a.b.

悪例:%
あ。
い。
%結果:あ。 い。

良例:%
あ。%
い。
%結果:あ。い。

\catcode`🍚=14\relax %コメント開始文字
\catcode`\%=12\relax 🍚記号
100%あ\
い。
🍚結果:100%あい。

\bye

仕様の説明

半角と全角の字間は手動で空ける

欧文文字や半角数字と和文文字の間は、空ける様式も多いですが、空けなくても構いません。
LaTeXでよく使われる和文組版の様式では、aあと書くとa あと組まれるものが多いですが、柔軟にその都度決められるようにしたいです。
そこで、aあaあと組み、a あの時だけ空けてa あと、そのまま組むことにします。
書いた通りの見た目が得られる方が、組版の本来の思想に合っていて、勝手が良いと思います。

1 桁の数に役立つ

これは特に数字の処理に役立ちます。
私の出身大学では、数は 1 桁の時だけ全角にするという組版規則がありました。
しかし、全角と半角が混ざるのも不統一でおかしい気がします。

この決まりは、1 桁の数では方眼紙のマス目とのズレが目立つことを避けようとしたものと捉えられます。
(日本語組版は方眼紙を想定したベタ組みが基本のよう)
つまり、半角数字で統一し、2025年 4 月のように、1桁の時だけは左右に空白(糊)を入れれば良いのです。

改行文字の入力に対する空白の抑制

TeX規定の動作では、改行は空白として組まれます。
一つの段落を一文ずつTeX原文内で改行して書けるため便利です。

a.
b.
%->a. b.

ところが、和文の場合はこの空白がじゃまになるので、%で抑制します。

悪例:%
あ。
い。
%結果:あ。 い。

良例:%
あ。%
い。
%結果:あ。い。

自動での抑制はしないことにしました。
場合分けしない方が動作が分かりやすく、純粋に組版をしている感じがして心地よいです。

別の方法として\↵も使えるようにしました(\def\^^M{})。
plainTeXも字類(\catcode)の設定が複雑で煩わしいところがあります。
アスキー文字に縛られない現代においては、%は直に書けたほうが便利かもしれません。
改行を\で抑制する書き方は、他の言語でもよくある書き方であり、TeXでも字類が単純になり分かりやすいと思います。

\catcode`🍚=14\relax %コメント開始文字
\catcode`\%=12\relax 🍚記号
100%あ\
い。
🍚結果:100%あい。

小書き文字の行頭禁則

\行頭禁則小字設定 ゃゅょぁぃぅぇぉャュョァィゥェォ/%一拍小書き文字(っッヵヶ)は禁則にしない

小書き文字については、一拍を成さない文字のみを行頭禁則にしました。
これは独自の決まりです。
好みに合わせて変えることができます。

まとめ

XeTeXで全角文字言語の組版を自在に扱えるようになりました。
これでやっと東洋人もTeXブックに入門できそうです!

満足のゆく日本語の横組みができたと思います。
ただ、実のところ私は一般的な組版規則についてあまり知りません。
好みや必要に応じて改良してみてください。

より詳しく

\XeTeXinterchartoks

\XeTeXinterchartoksはXeTeX独自の機能です。
便利な機能ですが、LuaTeXやpTeXでは使えません。

XeTeXを選んだ理由

私は10年ほど前からXeLaTeXを使っています。
当時、自在な多言語組版環境を探した結果として XeLaTeX を選びました。
その際、p(La)TeXは、日本語に特化した特殊な仕様という認識で避け、Lua(La)TeXは、ただでさえ複雑なTeXやLaTeXの処理や機能を更に大きくすることに共感できず避けたのでした。

XeTeXは縦組みできない

XeTeXは、縦組みもどき機能はありますが、ちゃんとした縦組みはできません。
長らくXe(La)TeXを、万能な多言語組版環境と思って愛用してきましたが、これは残念です。
人におすすめできる理想の組版環境がなかなか見つかりません・・・。

XeTeXでも箱を縦に並べれば縦組みできるだろうと思って試しましたが、自動改行ができません。
pTeXやLuaTeXの\tateの凄さが分かりました。

でも諦めるのはまだ早いかもしれません。
(LuaTeXもいいと思いますが、)(Xe)TeXを分解して使えばできるかもしれません・・・。

またはnpTeXを待つ

pTeX後継のnpTeXをXeTeX基盤で作るという構想があるようです。
それはすごそうです!
(縦組みできるXeTeXなら、私個人としては日本語用でなく多言語用として、上下対称の意匠を意識して+eXǝ+のような名前で心のなかでこっそり呼びたいです。)

LaTeXを避ける理由(脱ラ論)

どうしてLaTeXでなく平のTeXで日本語が組めると嬉しいのでしょうか。

LaTeXを使うこと自体が良くないという考え方があります。
エイブラハム著『明快TeX』の謳(うた)い文句には

TeXの開発者KnuthはLaTeXを使いません!TeXの能力を最大限に引き出すにはPlainTeXが一番です!LaTeXのお仕着せの機能が煩わしい人に!本当のTeXの能力を活用したい人に!自由自在にTeXを操るために。

(https://books.google.co.jp/books/about/明快TEX.html?id=1mh4QgAACAAJ)
とあります。

TeX言語を基盤とするのは良くない

TeXは計算完備ですが、あくまでも組版専用の領域特化言語であり、複雑な計算には向きません。
LaTeXはTeXを基盤としてしているので、複雑で把握しづらく、また処理も遅く、細かな調節がしづらくなっています。

別言語で前処理器を作り平TeX原文(またはiniTeX原文)を出力するのが、正しい術(すべ)だったと思います。
大きな密結合(複数の役割りが引っ付いている設計)のものは扱いづらいのです(UNIX思想「小は美」)。

組版は「造りと見た目の突き合わせ」を目指す

文書作成においては、「造りと見た目の切り離し」が重要です。
これは物重視(オブジェクト指向)型言語などでもよく使われる言葉です。
記述から見た目の情報を切り離すことで、統一された形に仕上げ易くなり、また、状況に応じて見た目を変えることができます。
これはLaTeXや電子書籍など考え方です。

一方で、組版は「造りと見た目の突き合わせ」が重要です。
紙面というただ一つの媒体に向けて、まさに見た目を細かく作り込んでゆくことが目的だからです。
もちろん原始命令だけ使うのでなく、必要に応じて命令を作って、ある程度構造的に扱うことは必要です。

例えばLaTeXの\maketitleのような命令は、複数人で様式を統一するには有用ですが、一人で純粋に組版したい場合には使う意味はありません。
二冊目以降は必要に応じて\def\maketitle{...}を自分で作ることになるでしょう。
雛形で、手の届きやすいところに\def\maketitle{...}が含まれていれば、造りと見た目を突き合わせできる良い組版環境と言えます。
見た目の制御を手の届きにくいところに隠すような設計のものは、厳密には組版環境とは言えないところでしょう。

造字機能というTeXとMETAFONTの強み

そもそも、私がTeXを選んだ理由は、METAFONTとの連携による自由な造字機能があることでした。
(未だに使いこなせていませんが)
忘れがちかもしれませんが、組版環境の理想形は、紙に手書きするようにどんな文字や配置でも自在に組めるということです。
例えば、創作漢字のような部品を自在に組み合わせることの出来る文字体系を扱おうとする時、ユニコードのような符号方式では対応できません。

TeXで字の箱を自由に組む

『TeXブック』などを読みTeXを知るにつれて、LaTeXでなく平(plain)のTeX(またはiniTex)を使いたいと思うようになります。
一般的な文字だけを一般的な組み方だけで組むような普通の文書作成は、そもそも私の目的ではなかったのです。
便利でなくて構わないので、文字を作って箱を組み立てたいのです。

平eXの実践へ

平のTeXで実践的に組版するには、eplain https://ctan.org/pkg/eplain や明快TeX中国語版 https://ctan.org/tex-archive/info/impatient/cn が参考になりそうです。
今後使ってみようと思っています。

参考資料

おわりに

お読みくださりありがとうございました!
ハートやバッジを頂けますととても嬉しく思います。
ご感想、ご指摘などもお気軽にお寄せください。

Discussion