読者です 読者をやめる 読者になる 読者になる

TeXと異世界の交わり

TeX プログラミング

研究室のゼミでやった内容の加筆版.名称などはでっち上げなので注意.

はじめに

LISP on TeXがCTANに登録されてから,そろそろ一週間が経つ.TeXLiveやMikTeXに取り込まれるなどもした.更に,CTANのTopicsに「exec-foreign」が追加され,そこにlisp-on-texが配置された*1.しかし,これ以外にも,旧来からTeXと他の言語を組み合わせる試みは多数行われてきた.そこで,ここではそれらの紹介を行う.

まず,TeXと他の言語を組み合わせる手法は,TeXエンジンの中で解決するもの外部の処理系に頼るものに大別することができる*2.それぞれについて説明する.

TeXエンジンのみの中で解決する手法

これは,TeXエンジンやマクロの機能を用いて,TeXとして閉じたまま他の言語と交じり合う方式である.この手法の大きな特徴は,外部環境への依存性が少ないこと.そもそも外界との接触がないから当然だが,複数のOSで動くことを想定する際に,この性質は役に立つ.この手法は,インタプリタエンジン型に区別できる.

インタプリタ

インタプリタ型は,TeXのマクロを用いて,他の言語のインタプリタTeX上に実装してしまう形式である.既存のTeXエンジンの大半で動作するため,古い環境を使わざるを得ないユーザ*3でも簡単に導入できるメリットがある.問題は,実装するともれなくキチガイ呼ばわりされることと,TeXマクロの制約により,高度な文字列処理の実装が面倒であること.前者はともかく,後者は主な使用用途を考えると大問題である.
実装例としては,BASICほむほむ・Grassが挙げられる.もちろん,lisp-on-texもこれ.expl3は微妙な感じがするが,ここではインタプリタ型に分類する.

エンジン型

そもそも,TeXエンジンに他言語の実行機能をつけたもの.エンジンと密接に連携できる性質を持ち,マクロだけでは実現が困難なこともやってのける.実装例は言うまでもなくLuaTeX.この機能を用いて日本語組版の実現を行う取り組み(LuaTeX-ja)も有名.

外部の処理系に頼る手法

既存の言語処理系を用いて,TeXとその処理系を組み合わせる手法.利点は,実装がお手軽なところ.実際,スクリプト書いてLaTeXソース出力するとか位なら利用例は多い.この手法はプリプロセッサ外部ファイル型,および\write18型に分けることができる.

プリプロセッサ

Cプリプロセッサのように,TeXと違うプリプロセッサ言語を定義し,TeXエンジンにかける前に前処理を施す方式のこと.実装例はLISPで記述するものが挙げられる.

外部ファイル型

外部ファイルを通して,TeX処理系と他言語の処理系を連携させる方式.有名な例はもちろんPerlTeX.TeXLiveにも収録されているはず.PerlTeXの作者は論文?TeXと他言語の交わり方についてよく議論しているので,一度読むことをおすすめする.

\write18型

TeXにはなぜか,shell実行機能(\write18)がある.ファイルを通してなんてことをせずに,直接shellを叩いて他の言語とやり取りする方式が\write18型.問題は,悪意あるTeXソースによりシステム破壊が可能になる点.先の論文でもこの問題が指摘されている.CTANにPythonの実装がある.

*1:まさかのLISP on TeXのみのTopic

*2:私感.以下同様

*3:管理者が怠慢で,TeX環境が更新されない計算機を使うユーザとか