担当授業のこととか,なんかそういった話題。

主に自分の身の回りのことと担当講義に関する話題。時々,寒いギャグ。

Typst:改行=スペース問題

2025-04-05 13:28:59 | 情報系
奥村先生は Typst 紹介のページにおいて,日本語の文章において文の途中で改行すると,改行部分に余分な半角スペースが入る現象があることを注意喚起されている。

自分の手元でホントかどうか試してみたら,ホントだった!

この春に Typst をいじり始めたばかりの頃に UD デジタル教科書体で作成した,関数の逆数が極限値の逆数に収束することのεδ論法による証明を述べた短いお試し文書を作成してプレビューした時には全然気づかなかった!

日本語の文の途中で改行した際,改行した箇所や次の行の冒頭に #h(0pt) を入れて間隔が空かないようごまかそうとしたり,#(-5pt) などと入れて間隔を潰そうとしたり,あれやこれやと試みたのだが,無理だった。

そういえば VS Code で Markdown + KaTeX の文書を作成した際,同じ現象が起きることを思い出した。

Web で検索したところ,HTML 文書をブラウザで表示した際に同様の事象が見られることが広く知られているようであった。

そうか,単語ごとに空白を入れて区切る「分かち書き」スタイルの欧文だと,成形前のテキストファイルにおいて文中で改行をするとしたら基本的に
単語と単語の間であるから,文末の改行はスペースと同じ扱いにするのが合理的である。
本当に改行したければ空行を間に挟む,つまり改行を二回続けて行うことに取り決めればよい。

ということは,Knuth オリジナルの TeX でも同じ規則を採用しているのではないか?

そう考えて TeX で確認したところ,生成された DVI ファイルは確かにその通りの挙動になっていた。

対処方法としては,奥村先生が提案されている通り,元の日本語ソースファイルの段落は途中で改行せずに書けば済む話ではある。それは自動的に右端で折り返した表示をサポートしているエディタを使えばほとんど苦にならないであろう。ただし,私などは段落内においてある程度長い文の場合に句読点の直後に改行する癖がついてしまっているので,エディタの表示だけで解決する話ではない。

このような改行 to スペース問題は TeX/LaTeX を日本語化する過程の中で克服されていったものであろう。今後 Typst でこの問題がどう解消されていくのか注視していきたいと思う。

他の解決策として現時点で思い浮かぶのは次の二つである。

1) open source なのでそもそものシステム自体の改善を目指す。Apache Licence 2.0 らしいのでこれが一番現実的なのではなかろうか。もしくは日本語用パッチのようなものを作っていずれ本家に取り込んでもらう。

2) エディタと Typst システムを改変するのではなく,エディタで編集したソースを Typst に受け渡してコンパイルする際に,日本語の文字と文字の間に挟まれた 1 回分の改行だけを取り除く処理を介在させる。それが一番手っ取り早くて,かつ現実的な方策であろう。

さて,そろそろ Typst で遊ぶ時間は終わりを迎える。

今のところ気になっていることをズラズラ書き並べておく。

(い) 現在の Typst に出来なくて日本語 TeX/LaTeX に出来る大きな機能としては縦書きがある。だが,私個人に限っては LaTeX で縦書き文書を作成する機会がないためこの点は全く気にならない。

(ろ) 別行立て数式の表示位置が中央揃え以外に指定できるかどうかは不明であるが,LaTeX の document class オプションの fleqn のような左揃え表示のような機能は提供されていないと思われる。そこをなんとか他の機能を駆使して fleqn 相当の表示を得られるようにできるかどうかも分からない。

(は) 行列用の関数 mat には,行と行の間や列と列の間に横線や縦線を書き加える augment という機能が備わっている。横線と縦線は一つの行列内に同時に描くことが出来るが,stroke による色指定は hline と vline とで別々に指定することはできないように思われる。

それとは別に,行列の成分の並んでいる範囲を明示する区切りであるカッコの外側に何らかの文字列を付け加える機能も備わっていない。例えば行基本変形のコマンドを操作対象の行列の直後に書き加えるようなことはできない。代替策としては,対象となる行列の直後に delim: none に設定して外側のカッコを非表示にした行列を続けて表示する方法がある。それがうまくいくかどうか,現在模索中である。どうやら delim に none 値を指定するのは

#math.mat(delim: none)

と数式の外であらかじめ宣言しておかないとだめらしい。つまり,

$ mat(delim: none,
a, b ;
c, d
) $

のような記述はエラーになる。これは不具合ではないかと思われる。

あと,数式内で日本語を使うと(当たり前なのだろうが)本文とは異なるフォントが使われてしまう。数式用のフォントセットから無理やり日本語のグリフを探してきてそれをあてがっているのだと思うのだが,それをいちいち

#set text(font: "Harano Aji Mincho")[日本語の補足説明]

みたいに記述して直さなければならないのはめんどい。もっとも,この処理を関数として定義すればいいだけの話ではあるのだが。

これらの機能は LaTeX の nicematrix というとてもナイスなパッケージがサポートしてくれているので,結局は LaTeX に還ろうかな,と思い始めているところである。
コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 春はアップデートに乗って | トップ | AIすごいな~! »
最新の画像もっと見る

コメントを投稿

情報系」カテゴリの最新記事