XeTeXつまり、zxjatypeとzxjafontの解説であるが、その前に一つ重要な話。はじめに:zxjatypeは(ずっと昔から)壊れているzxjatypeの本来の主要機能は「少なくともpLaTeXと同等の品質の日本語組版をXeLaTeX上で実現すること」だった。その主要機能についてはもう何年も前から“壊れている”状態にある。詳細については以下のツイッタァーのスレッドを参照されたい。zxjatypeパッケージの目的は「xeCJKを基にして日本語の行組版規則を実現する」ことだけど、その肝心要の機能については現状“壊れている”んだよな。それももう7年前(0.6版)から。2019年8月9日これが意味するところは、「日本語文書用のLaTeXについて、本来ならばXeLaTeXも(pLaTeX/upLaTeX/LuaLaTeXと同列の)“主要な”エンジンの地位を得ているべきであるが、残念ながら現状はそうなっていない」ということである。何か理由があってどうしてもXeLaTeXで日本語文書を作る必要があるのなら、その場合の最善策としてzxjatypeは十分に機能するはずであり、その意味で現状のzxjatypeにも存在意義はあるといえる。この状況は「pdfLaTeXのbxcjkjatypeパッケージ」と同じということになる。“日本語LaTeX”としてXeLaTeXはLuaLaTeXと同じ地位を得るべきところがpdfLaTeXと同じ地位に甘んじているというわけである。zxjatype、または“XeLaTeXで日本語”をどうにかしてほしい件ネットを見る限りでは「XeLaTeXを日本語LaTeXの主流の選択の一つにしたい」という要望は存在する。いうわけでここでお願い。だれか「XeLaTeXでまともに日本語するやつ」をつくってください。実装の形については、zxjatypeの改良でも新しいパッケージの作製でもよく、またxeCJKを土台にするものでもしないものでも構わない。pTeXの品質以上で基本的な日本語の行組版ができる実装があってほしいと思う。新しいzxjatype(0.7版)の機能を語ってみる従来の0.6版の機能については以下の記事が参考になる。現状のzxjatypeの既定の設定においては、小書き仮名は行頭禁則処理の対象にならない。同じソースをxelatexでコンパイルすると以下のようになる:XeLaTeXでの組版結果なりゆきで改行すると小書きの「ュ」の前に改行位置がくることになるが、upLaTeXではここで(緩い1)禁則が適用されて前の「シ」が追い出される。ところがxelatexでは禁則がないため「ュ」の直前で実際に改行が起こる。zxjatypeにkanakinsokuオプションを指定すると、小書き仮名に対して(完全な)禁則が適用される。したがって、先ほどのソースでこのオプションを追加すれば、小書きの「ュ」の前での行分割が起こらなくなる。a4paper]{bxjsarticle}\begin{document}この場合、結果的にuplatexのときと同一の出力が得られる。小書き仮名で禁則するとアレしかし、このkanakinsokuオプションには重大な副作用がある。小書き仮名に対する行頭禁則は、内部で「小書き仮名を閉じ括弧類として扱う」ことで実現している。このため、小書き仮名と約物が並んでいると「約物同士が隣接している」と見なされて空きの調節が行われてしまうのである。これは慣習的な日本語の行組版規則に反していて好ましくない。a4paper]{bxjsarticle}\begin{document}ベジエ(Bézier)曲線\parベジェ(Bézier)曲線\par\end{document}小書き仮名と括弧が並ぶとアレこの不具合を回避するには、小書き仮名と約物の間に空のボックスを挿入する必要がある。ベジェ\mbox{}(Bézier)曲線\parkanakinsokuにはこのような副作用があり、また小書き仮名の行頭禁則は一般的に必須のものとは考えられていないという事情があるため、既定で有効にはなっていない。小書き仮名に対して(完全な)行頭禁則を適用する。kanakinsokuの否定。小書き仮名を行頭禁則から外す。adjustcharclassが無効の場合はxeCJKの既定設定がそのまま適用される。※xeCJKの既定における小書き仮名の禁則の設定は、昔の版ではkanakinsoku相当であったが、2016年頃にnokanakinsoku相当のものに変わっている。“(no)useinhibitglue”オプション現状の\inhibitglueの実装は問題があるので、0.6b版以降では既定で無効になっている。これを有効にするにはuseinhibitglueオプションの指定が必要である。\inhibitglueの実装を提供する。useinhibitglueの否定。この場合、\inhibitglueは何もしない命令になる。先述の通り、zxjatypeではxeCJKの“文字クラス”の設定を多少変更している。「文字が和文(CJK)か欧文か」の区別に関してはxeCJKの既定の設定をそのまま踏襲している。それに従うと、(u)pLaTeXやLuaTeX-jaよりも「欧文扱い」される文字が増えることになる。次のような「☃」や「♪」の記号を含んだ文書ソースがあったとする。a4paper]{bxjsarticle}\begin{document}☃っ☃☃☃っ☃っ☃~~♪\end{document}LuaTeX-jaの既定ではこれらの記号は和文扱いになるため、和文フォント(原ノ味明朝)で出力される。LuaLaTeXでの組版結果(素敵)ところがxeCJKの既定ではこれらの記号は欧文扱いになる。Roman)には「♪」の字形はあるが「☃」はないため、結果的に「☃」が出力されないという由々しき事態に陥ってしまう。XeLaTeXでの組版結果(ざんねん)xeCJKの「和文扱いの範囲」に関するトラブルを軽減する目的で、0.7版でprefercjkというオプションが導入された。このオプションを指定すると、「和文扱い」になる文字の範囲がLuaTeX-jaの既定により近いものに変更される2。prefercjk,a4paper]{bxjsarticle}\begin{document}☃っ☃☃☃っ☃っ☃~~♪\end{document}XeLaTeXでの組版結果(素敵)まとめ:“(no)prefercjk”オプション0.7版以降で追加された。prefercjk:「和文扱いの文字」の範囲をLuaTeX-jaのそれに近づける。prefercjkの否定。xeCJKの既定に従う。※このオプションは実験的で、仕様は将来変更される可能性がある。その他もろもろxeCJKの2.x版の使用を非推奨とした。2.x版のサポートは将来廃止される予定。ちなみに、xeCJKの3.0版がリリースされたのは2012年5月。(つづけ)(u)pTeXやLuaTeX-jaの既定で適用されている禁則処理は「行分割を完全に禁止はしないが、周りの状況が許す限りは当該の行分割を回避する」という性質のものであり、「禁則を適用すると逆に醜い出力になってしまう」場合には敢えて禁則が無視される。それに対して、zxjatypeのkanakinsokuが提供する禁則処理では禁則位置での行分割は完全に禁止される。↩ただしギリシャ文字・キリル文字は敢えて「欧文扱い」のままにしている。ソレのLuaLaTeXソース以前に述べたとおり、年賀状にはその年の数に関連した数学パズルを載せるのが通例である1。去年はパズルを作っている時間が2時間しかなかったので2、割と普通の(マジで)虫食い算で済ませた。肝心のパズル問題の部分の文字が小さくで読みづらいが、以下のように書かれている。以下の条件に従って、乗算の虫食い算を解きなさい。■には0または2が入る。□には0と2以外の数字が入る。(問題の図)一番上にあるのはチェロキー語での新年の挨拶。ぱんどっくのマニュアルを読破するのに時間を取られている人が多いためか、年を追うごとに年賀状で数学パズルを見ることが少なくなっているようで感じる。↩そのうち本腰を入れて数学パズルを作りたいですね......。某アドベントカレンダーの最終日の記事では、LuaTeXで「“1回展開”のマクロ」を実現する方法について解説した。マクロとプリミティブの間の壁を打破せよ―LuaTeXで“1回展開”のマクロを定義する話(Qiita)ただし、この記事にある方法では、機能の実現の部分(具体的には「YYYY/MM/DD形式で出力する」という機能)をLuaで実装する必要がある。tex.day))endLua言語自体はTeX言語よりもずっと習得しやすい言語ではあるが、それでも「LuaTeX上のLuaコードでTeXに関連した機能を実現する」にはそれなりの知識(例えばtexライブラリの使用法など)の習得が必要であり、決して自明ではない。何より、(例の記事の流れに従うと)機能要件を実現するための「完全展開可能(ただし“先頭~”ではない)なTeX言語のコード」が既に得られている。\the\year/\two@digits\month/\two@digits\day}そうであれば、この「完全展開可能なコードから“1回展開”のマクロが作れる」ほうが、フツーのTeX言語者(※要定義)にとっては便利なのは間違いないだろう。ixquickmacroパッケージというわけで、作ってみた。ixquickmacroパッケージixquickmacroパッケージは開発者用のパッケージで、以下の機能を提供する。\制御綴を1回展開すると「<定義本体>の完全展開」になるように、\制御綴の意味をローカルに定義する。\defquickmacroのグローバル定義版。※現状では、引数をもつマクロはサポートされない。このパッケージを利用すると、先に示した「TeX言語による完全展開可能な\todayYMDの定義」について、\defを\defquickmacroに変えるだけで、“1回展開”の\todayYMDが実現できる。\the\year/\two@digits\month/\two@digits\day}例の記事で使った\xInspectマクロをここでも利用して、“1回展開”が実現できているかを確かめてみよう。END\begin{document}\xInspect{\todayYMD}\stopこのソースをlualatexでコンパイルすると、\xInspectによる端末出力は以下のようになる。once->2019/12/31twice->2019/12/31full->2019/12/31ixquickmacroパッケージを利用することで、Luaを知らなくても、TeX言語の知識だけで“1回展開”のマクロを作ることができた。素敵なTeXネタを途絶えさせることなくやっぱり無事にクリスマスの日を迎えられました。今年の参加者は全部で23名、うち8名が初参加でした。参加者の皆様に心からの感謝をやっぱり捧げたいと思います。今年の重点テーマは「やっぱりLua(La)TeXしよう」でした。振り返ってみると、様々な面から「LuaTeXの特徴」を紹介した記事がやっぱり多く、テーマとして一定の役割をやっぱり果たせたのではないでしょうか。これをきっかけにしてLua(La)TeXにやっぱり興味を持つ人が増えることになればやっぱり幸いです。2019」を埋めてみた。adventar.orgアドベントカレンダー1日目の記事では、Pandocにおける「テンプレート変数」と「メタデータ」について詳しく解説されている。Pandocのテンプレート機能でYAMLから本の奥付を自動生成する(Qiita:@sky_y)そこには以下のような記述がある。Pandocフィルタはメタデータにアクセスできるが、テンプレートの変数にはアクセスできないしかし、実際に(LaTeX出力用の)フィルタを実装していると、「フィルタからテンプレート変数を設定したい」場合が時々ある。変数を使ったか否かに依らずに)行う方法はない、ということか。2019年11月30日もちろん、当該の記事に「テンプレート変数を与えるために、YAMLメタデータブロックで変数(=メタデータ)を定義する」というテクニックが便利です。書かれているように、「テンプレート変数の代わりにメタデータを使う」というテクニックは存在する。それはいつでも通用するのだろうか。Pandocのマニュアルには次のようにある。option.これを読む限りは「テンプレート変数の代わりにメタデータを使う」というテクニックは「ユーザが当該のテンプレート変数を(-Vオプションなどで)設定していない」ことが前提になりそうである。調べてみた※最新版(2.8.0.1版)のPandocを用いた。2.8.0.1版の挙動の一部は過去版の挙動と食い違っていて、どうやらこれは“不具合”だったようです。2019/12/05リリースの2.8.1版で“修正”されたため、この版の動作に基づいて記述を修正しました。次のテンプレートを用意する。[foo.html]$for(foo)$$foo$$endfor$※複数の値が指定されることを見越してループにしておく。このテンプレートを用いて、空のMarkdownファイル“empty.md”をHTMLに変換することを考える。out1.htmlその際に、テンプレート変数・メタデータの設定のオプションの組合せとして、次の4つを試してみる。1追加オプションなし。テンプレート変数のfooを設定する。メタデータのfooを設定する。テンプレート変数とメタデータの両方を設定する。V1マニュアルの記述の通りで、テンプレート変数が既に設定されている場合は、「メタデータを代わりに設定する」という技法は使えない、という結果になった。調べてみる結論は出たが、事のついでとして、もう少し複雑な場合を調べてみることにする。複数の値を指定してみた先の実験と同じ設定で、-V・-Mオプションを反復することで複数の値を指定してみることにする。1追加オプションなし。foo=M2結果は以下の通り。V1V2やはりテンプレート変数が設定済の場合はメタデータの値は使われない。テンプレート変数は1つの値しか保持できない。テンプレート変数とメタデータのいずれもオプション(-Vや-M)を繰り返すことで複数の値を保持できる。※2.8版~2.8.0.1版ではテンプレート変数が1つの値しか持てないという“不具合”があった。header-includesも試してみたheader-includes変数については、「テンプレート変数を指定する」「メタデータを指定する」の他に「ヘッダファイルを指定する(-Hオプション)」という方法も存在する。先ほどのテンプレートでfooをheader-includesに置き換えた新しいテンプレート“header.html”を用意する。H1だけ書かれたファイル“h1”とH2だけ書かれたファイル“h2”を用意する。-V・-M・-Hの各々について「2つ指定する」「指定しない」としたものの全ての組合せ(8通り)を試してみる。-V・-M・-Hの全てを2つ指定する場合のコマンド行は以下のようになる。h2結果は以下の通り。V1V2H1H2テンプレート変数での指定とヘッダファイルでの指定は共存する。それらの少なくとも一方が指定済の場合はメタデータの値は使われない。ヘッダファイルは複数指定できる。テンプレート変数の値(高々1つ指定順で複数)の後にヘッダファイルの値(指定順で複数)が並ぶ。2019TeX界における年末の恒例イベントとなったと言わんばかりのアドベントカレンダーが今年も始まりました。重点テーマ今年の重点テーマはコレです。Lua(La)TeXしよう「LuaTeXはいいぞ」とやっぱりよく言われますが、具体的に何がいいのかはやっぱり十分に知られていません。熱狂的なLuaTeXファンの皆さん、是非ともLuaTeXの魅力についてやっぱり熱く語りましょう!※例によって、重点テーマはやっぱり「必須」ではありません。LuaTeXでないTeXネタ、さっぱりLuaTeXでないTeXネタ、なんでもやっぱり歓迎しております。初日のネタはこちらになります。2019(#texadvent2019)はまだまだ参加者募集中です。LaTeXなネタ、TeX言語なネタ、expl3なネタ、Overleafなネタ、dvisvgmなネタ、lwarpなネタ、LuaHBTeXなネタ、tlmgrなネタ、その他ナントカカントカ、お持ちの方はぜひぜひ、やっぱりご参加おねがいします!もう空きが残りわずかとなっています。2019昨日は非アレでしたが、今度はアレな方の振り返り。Calendar」はこんな感じでした。21:55やっぱり去年のアレ(アレな方)を振り返ってみるTweet広告を非表示にするもっと読むコメントを書く次のページ検索プロフィール(アレ)id:zrbabbler某ZR氏。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。