TeX(または LaTeX)におけるタイプセットでは,「TeX エンジン自身が持たない機能を外部コマンドの力を借りて補う」ということが時々行われます。 ここでは,そのような外部コマンドの実行についておおまかに説明します。
まずは(もっともよく知られている)画像挿入時の extractbb を例に説明し,それに続いて一般化した説明を加えます。 もし LaTeX入門/図表 でつまずいてこの項目を訪れたならば,最初の2項目を読めば多くの場合解決するでしょう。
LaTeX入門/図表の後半で述べているとおり,DVI ファイルを経由して画像を取り込む場合,それは TeX 自身ではなく,“DVI ファイルの中に書き込まれた画像の取り扱いに関する指示”を dvipdfmx などの DVI 処理ソフトウェアが解釈する,という仕組みになっています。 TeX が組版するうえで問題になるのはその図表を版面(紙面)に配置するためにどれくらいの幅と高さを確保するかだけで,そのために画像のサイズにあたる情報(いわゆるバウンディングボックス情報)を必要とします。
しかし,TeX 自身は EPS ファイル以外の画像から自前でバウンディングボックス情報を取得することができません*1。 そこで,外部コマンドの力を借りてバウンディングボックスを取得する仕組みを利用します。 以下,最近の TeX 環境(TeX Live 2015 以降あるいは W32TeX を想定)では知らなくてもよいことかもしれませんが,説明不足にならないように書いておきます。
LaTeX に続いて dvipdfmx で処理することが決まっている場合は,extractbb というコマンドによって画像のバウンディングボックスを取得します*2。 たとえば,apple.png という PNG 画像ファイルのバウンディングボックス情報は
extractbb apple.png
によって取得でき,apple.xbb というテキストファイルに書き込まれます。
%%Title: apple.png %%Creator: extractbb 20150315 %%BoundingBox: 0 0 204 238 %%HiResBoundingBox: 0.000000 0.000000 204.463098 238.060320 %%CreationDate: Tue Sep 01 06:42:17 2015
さきほど EPS ファイルからは自前でバウンディングボックス情報を取得できると述べましたが,それは EPS ファイルの冒頭に %%BoundingBox: という行が既に存在するからです。 extractbb は PNG/JPG/PDF ファイルのバウンディングボックスをこのような書式で書き出すことができるため,TeX はこの .xbb ファイルを読み込んで画像のサイズを把握することができるのです*3。
いま extractbb を例に,外部コマンドが必要となる例を説明しました。 TeX によるタイプセットの前に人の手で extractbb を実行して .xbb ファイルを作っておけば,TeX はその .xbb ファイルを読み取ってくれるのですが,いちいち実行するのは面倒です。 そこで,TeX によるタイプセット中に必要に応じて外部コマンドを実行する仕組みがあります。
しかし,なんでもかんでも外部プログラムを TeX から実行できてしまうとするとそれは危険です。 TeX Live や W32TeX では標準で restricted shell escape という仕組みが有効になっています*4。 これは,あらかじめ安全と認められるプログラムを一覧にしておき,それらだけ自動で TeX から呼び出せるようにするというものです。但し,restricted shell escape という 名前が示すように,コマンドラインの形式が単純なものに制限されています。 安全なプログラムの一覧は texmf.cnf というファイル*5に書かれていて
shell_escape_commands = \ bibtex,bibtex8,\ extractbb,\ gregorio,\ kpsewhich,\ makeindex,\ repstopdf,\ r-mpost,\ texosquery-jre8,\
shell_escape_commands = \ bibtex,pbibtex,repstopdf,epspdf,extractbb,gregorio,\ makeindex,mendex,kpsewhich,r-mpost,texosquery-jre8
のようになっています(行末の \ は “エスケープ” つまりその後の改行文字を無視するという意味)。 ここに extractbb が書き込まれていれば,TeX が自動で extractbb を実行することができる状態です*6。 具体的には
の場合が該当します(これ以外にも,TeX 入手法を参考にしてインストールした場合は,TeX Live 2014 が最新だった当時は extractbb を書き加えるように指示していたと思います)。 もし extractbb が自動実行プログラムに含まれていない場合は,こちらのアーカイブ情報を参考にしてください。
標準では restricted shell escape ですが,任意の外部プログラムを TeX から実行できるようにすることもできます。 それには LaTeX などの実行時に -shell-escape オプションを付けます。
platex -shell-escape test.tex
逆に,すべての外部プログラムの実行を禁止したい場合は -no-shell-escape オプションを付けます。
platex -no-shell-escape test.tex
2016年11月28日に,制限付きシェル実行 (restricted shell escape) に関する重大な問題が判明し,11月29日(日本時間では11月30日)に対策が講じられました (TeX Live r42605) . 具体的には shell_escape_commands のリストに従来入っていた MetaPost (mpost) の問題で,「-tex オプションに実行したいコマンドを指定することで,制限付きの状態でも任意のコマンドを実行できてしまう」というものです.W32TeX には mpost だけでなく,日本語対応の pmpost と upmpost も shell_escape_commands に追加されていたため,同様の問題が起きます。
この問題を回避するため,2016/11/30 以降の TeX Live および W32TeX では,「texmf.cnf ファイルの shell_escape_commands のリストから mpost (, pmpost, upmpost) を外す」という対策が施されています. したがって,TeX Live(MacTeX, BasicTeX も含む)や W32TeX を 2016/11/30 以降のものに更新することによってこの問題を解決することが可能です(TeX Live のアップデート方法は tlmgr の項を参照してください). このセキュリティホールはかなり危険なものなので,可能な限り速やかにアップデートを実行するようにしてください.
もしどうしても TeX Live をアップデートできない事情がある場合は texmf.cnf を編集することによってもこの問題に対処することも可能です.その具体的な方法についてはこちらをご覧ください.
また,さらに詳しい情報が以下の記事に記述されています.
なお,この修正によって mpost は restricted shell escape で実行できなくなりましたので,従来からこの仕組みを使っていた LaTeX パッケージ(MePoTeX など)は動かなくなります.
こうした mpost 依存パッケージを利用する場合は,セキュリティには十分配慮しながら -shell-escape オプションを付けて実行する必要があります.