マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

「スヤァTeX」の作り方

「スヤァTeX」TeX拡張機能である「encTeX 拡張」という機能を用いて実現されている。現在利用されている TeX 配布物においては、非 Unicode な欧文 TeX エンジン(つまりオリジナル TeX と pdfTeX)でこの拡張が実装されているが、標準のフォーマット(つまり既存の texlatexpdflatex 等のコマンド)では無効になっているので、恐らくは世界中の TeX ユーザのほとんど全てがこの機能に気付いていないはずである。

encTeX 拡張

encTeX 拡張機能は、多バイトエンコーディングUTF-8 等)をエンジンでサポートする用途のために用意されている。(単バイトエンコーディングのエンジン内でのサポートについては、これとは別の「TCX ファイル」という機構が利用されている。((TCX ファイルは --translate-file というオプションで指定する。この機構を用いると、EBCDIC 等の「ASCII と互換のない」文字コードでの入力が可能になる。fmtutil.cnf の中でよく見かける --translate-file=cp227.tcx が TCX の指定で、「何も変換しない」(つまり入力ファイル中の 0〜255 のバイトがそのまま TeX の符号値 0〜255 の入力文字として扱われる)TCX ファイルの指定を表す。ちなみに、cp227 というのは「コードページ227」ではないらしい。))なお、LaTeX ではエンジン側の文字コード処理は用いずに TeX 上のマクロを用いて入力文字コードを処理している(inputenc パッケージ)ので、LaTeX ユーザはこれらのエンジン拡張機能に触れる機会は全くない。)核となるのが \mubyte というプリミティブで、これは入力ファイル中に現れる特定のバイト列を特定の制御綴(または文字)で置換することを指示する。例えばキリル文字の〈Д〉(U+0414;UTF-8 で〈D0 94〉)を出力するための命令 \CYRD が別に定義されていたとして、〈D0 94〉を \cyrd に置き換えるには次のコードを実行すればよい。

\mubyte \CYRD ^^d0^^94\endmubyte

あるいはこのコードを記したファイルが UTF-8 で書かれているなら次のように書いても同じことになる。

% 文字コードは UTF-8
\mubyte \CYRD Д\endmubyte

また \mubyte で指定した変換を実際に入力時に有効にするにはパラメタ \mubytein を設定する必要がある。((スヤァTeX では使っていないが、出力用の \mubyteout というパラメタもあり、これを正値にすると、\[write 実行時に「逆変換」が施されるようになる。))

\mubytein=1 % 1で有効, 0で無効

ここまでの内容が解れば、「スヤァTeX」の実装コードを書くのは容易い。これだけでよい。

\mubyte \relax ( ˘ω˘ )スヤァ…\endmubyte
\mubytein=1

ところが、これを単に LaTeX のパッケージにするのでは上手くいかない。((「\mybyte は未定義だ」とエラーが出る。))何故かというと、encTeX 拡張は既定では無効になっていてからである。有効にするには TeX のコマンドの起動時に --enc というオプションを指定しなければいけない。さらに、この指定が意味をもつのは、フォーマット作成時(INI モード)に限られるという制約がある。つまり、フォーマットには encTeX が有効であるかの情報が含まれていて、そのフォーマットを読んで TeX を起動した時にその情報に基づいて設定が決まるのである。*1既存の latex や pdflatex のフォーマットは既に encTeX が無効の状態で作成されているので、ここで \mubyte 命令を有効化することは不可能である。これが、「スヤァTeX」が新しいコマンド(つまりフォーマット)でなければならない理由である。

独自フォーマットの作り方

ここでは、「LaTeX に少しだけ修正を加えた独自フォーマット」の作り方を簡単に解説する。例として、次のようなフォーマット「TC-LaTeX」(コマンド名 tclatex)を作りたいとする。

!〉が既定でアクティブになっていて、!\expandafter と等価になっている。その他は LaTeX と全く同じ。

この場合、次のようなファイル tclatex.ini を用意する。

[tclatex.ini]
% 通常の latex フォーマット作成と同じ処理を行う.
% ただしダンプの実行を抑止する.
\input pdftexconfig
\pdfoutput=0
\scrollmode
\let\xxorgdump=\dump
\let\dump=\endinput % \dump を抑止する
\input latex.ltx
\let\dump=\xxorgdump

% ここに「修正部分」のコードを入れる
\catcode`\!=13
\let!\expandafter

% ダンプして終わり
\dump

拡張子 .ini のファイルはフォーマットの生成の際のソースとして使われる。LaTeX のフォーマット(コマンド名 latex)を作るための latex.ini はシステム標準で用意されていて、それはちょうど上記のソースの「修正部分」の 2 行を除いたものと(動作として)等価になっている。

あとは、「スヤァTeX」(suyahtex.ini)と同じ手順を踏めばよい。(suyahtex パッケージの README ファイルを参照)

  • fmtutil.cnf に次の行を加える。
    tclatex pdftex language.dat --etex --translate-file=cp227.tcx tclatex.ini
    %                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ここで、波線部分が「フォーマット作成時」に指定されるオプションの列である。通常は latex と同じ内容でよいが、「スヤァTeX」の場合は、ここで「--enc」オプションを追加することになる。
  • texmf.cnf に「TEXINPUTS.tclatex=...」の行を加える。
  • 実行ファイル tclatex を(pdftex のコピーとして)作成する。
  • fmtutil --byfmt tclatex」を実行する。

それぞれの設定や実行の意味の説明には長い前説明が必要となるので今は割愛する。とにかくこれで所望の「TC-LaTeX」を手に入れることができる。

[test-tclatex.tex]
\documentclass[a4paper]{article}
\def\A#1#2#3{#1#2#3a}\def\B#1#2{#1#2b}\def\C#1{#1c}\def\D{d}
\begin{document}
% 短く書けてとっても便利
\typeout{!!!!!!!\A!!!\B!\C\D}
\end{document}
>tclatex test-tclatex
This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012/W32TeX)
……(中略)……
No file test-tclatex.aux.
dcba
(./test-tclatex.aux) )
No pages of output.
Transcript written on test-tclatex.log.
練習問題

次のように、「\expandafter」の代わりに「ほむ」と記述できるような LaTeX である「ほむTeX」のフォーマット(コマンド名 homutex)を作成せよ。

\documentclass[a4paper]{article}
\def\A#1#2#3{#1#2#3a}\def\B#1#2{#1#2b}\def\C#1{#1c}\def\D{d}
\begin{document}
ほむほむほむほむほむほむほむ\A
ほむほむほむ\B ほむ\C\D
\end{document}

*1:ちなみに、e-TeX 拡張の有効性も同じようにして決まる。