この記事では、LaTeX文章にコメントアウトでマジックコメントとしてTeX-style shebang %#! <typeset command>
を記述することで、主要なTeX編集環境のエディタ上で、明示的にLaTeX関連のコマンドを実行する一例を紹介します。
TeX-style shebangとは?
わたしは普段、テキストエディタEmacs上でTeX/LaTeX編集支援YaTeXを利用しています。YaTeXの便利な機能の一つに、LaTeX文章の最初の方に、例えば、
%#! lualatex --synctex=1 beefplate.tex
を書いておくと、Emacs上から、この行の「%#!
」を除いたlualatex --synctex=1 beefplate.tex
を実行することができます。
Unix系のスクリプトの #!
から始める1行目のことをshebang(しぇばん)と言います。shebangは、直接このスクリプトを起動してスクリプトを読み込むと、#!
で指定したインタプリタを指定できます。
YaTeXはTeXコメントアウト、いわばマジックコメントとして「%#!
」を記述することで、TeX/LaTeXのshebangを提供してくれています。ここではこの「%#!
」から始まる行のことをTeX-style shebangと呼ぶこととします。
実は、TeX-style shebangは、必ずしも1行目に記述しなくてもかまいません。例えば、
% #! ptex2pdf -l -u -ot '--synctex=1' -od '' beefplate
%#! lualatex --synctex=1 beefplate.tex
のように記述すると、YaTeXが読み取るTeX-style shebangは2行目で、lualatex --synctex=1 beefplate.tex
を実行します。
TeX-style shebangしてみた動機づけ
わたしはYaTeXのTeX-style shebangの機能がとても便利だと思っているので、他のTeX/LaTeX系エディタでも使えるかと思いきや、TeXworks、TeXShop、Visual Studio Codeの拡張機能LaTeX Workshopなど、ほとんどのエディタでそうなっていないことが分かりました。
ほとんどのTeX/LaTeX系エディタは、LaTeX文章をタイプセットするための方法や決まった手順書を、プロファイルやレシピという名前で予め用意されているか登録して、それを呼び出すことでLaTeX文章をタイプセットさせる方式をとっています。一応、それらのプロファイルやレシピなどを明示的に呼び出すためのマジックコメントが用意されています。
このプロファイルやレシピを選んで、TeX/LaTeX文章をタイプセットする方式は、一見便利なように見えますが、目次や索引を生成したりするなど、単純なLaTeX文章を1回タイプセットする以外の処理には、非常に不便で、かゆいところに手が届きにくいと思います。また、別途ターミナルを開いて、そこから別途なにか実行して、またTeXエディタに戻るのも面倒なことが多いです。
そこで、TeXworks、TeXShop、Visual Studio Codeの拡張機能LaTeX Workshopなどで、このTeX-shebangを使うことができれば、その場で明示的に実行するコマンドを柔軟に書き換えて、実行することができます。
- 索引を生成させる処理も実行する。
%#! uplatex foobook && upmendex foobook && uplatex foobook && uplatex foobok && dvipdfmx foobook
-
make
コマンドやrake
コマンド、llmk
コマンドなどで一連の処理を実行して、foobook.pdfをビルドする。%#! make foobook.pdf
- Dockerコンテナ内の
lualatex
コマンドで、foobook.texをタイプセットする。%#! docker run (中略) lualatex --synctex=1 foobook
TeX-style shebangするLuaスクリプトのインストール
2023年9月現在、runtexshebangは、
- GitHub: munepi/runtexshebangにリポジトリを移し1、
- CTAN: runtexshebangに登録され、
- TeX Live 2023にも収録されました。
TeX Live 2023をお使いの方は、runtexshebang
コマンドをすぐに利用可能な状態です。
例:TeXworks
設定
タイプセットの方法に「runtexshebang
」を追加して、「タイプセットの方法を設定する」において、以下のように設定します。
- 名前:
runtexshebang
- プログラム:
runtexshebang
- 引数:
$fullname
LaTeX文章
TeX-style shebang行「%#!」と合わせて、TeXworksのTeXエディタで有効なマジックコメント「% !TeX program = <タイプセットの方法の名前>
」も添えておくと、つぎにこのLaTeX文章ファイルをTeXworksで開いたときに、自動的に<タイプセットの方法の名前>
を指定してくれます。
%#! lualatex --synctex=1 beefplate
% !TEX program = runtexshebang
「&&」でつなげて、upmendex
コマンドも実行してりできますね。
例:TeXShop
設定
ここでは、「TeX+dvipdfmx」と「LaTeX」をruntexshebang
にしています。
LaTeX文章
TeXworksと同様に、TeXShopで有効なマジックコメントを与えておくと、便利です。
%#! lualatex --synctex=1 beefplate
% !TEX program = runtexshebang
例:Visual Studio Codeの拡張機能LaTeX Workshop
設定
何も設定する必要はありません。
個人的に、一見便利に思える「レシピ」を設定することを安易に勧められません。
通常のタイプセットであったしても、LaTeX Workshopで有効なマジックコメントにより、明示的にコマンドやオプションを与えてタイプセットしたほうが、なにか問題が起こったとしても、エディタ側の問題なのか、シェル側の問題なのか、TeX環境側の問題なのか、切り分けがしやすいと思います。
LaTeX文章
LaTeX Workshopで有効なマジックコメントを以下のようにします。
% !TEX program = runtexshebang
% !TEX options = "%DOC%".tex
これにより、beefplate.tex
に対して指定したマジックコメントから、
runtexshebang beefplate.tex
が実行されて、beefplate.tex
の TeX-style shebangの行が実行されます。
例:その他
本来、各TeXエディタ上の「タイプセット」「▶」はタイプセットするの用途ですが、TeX-shebangを実行することにより、TeXエディタ上の各種設定などを調べたりするなど、なにか問題があるときの問題解決の糸口を見いだせるかもしれません。
実際に、主要なTeXエディタで「なんかテフが動かない! なんで?」のとき、手元のTeXエディタでどういう状態になっているのか、把握しきれいない場合がほとんどです。
TeXエディタ上の各種設定を調べる
例えば、TeXエディタ上の環境変数 $PATH
をサクッと調べたりするのにも使えますね。
%#! echo $PATH
DockerコンテナでTeX/LaTeXしたり、各種設定を確認したりなど
例えば、Dockerコンテナ内で、lualatex
したり、OS情報をサクッと表示させたりできますね。
一例として、Docker HubにあるDockerイメージ munepi/tllangjapanese:2021
のOS情報を確認できますね。
%#! docker run -i --rm --platform linux/amd64 --workdir /data --mount type=bind,src=$(pwd)/,dst=/data/ munepi/tllangjapanese:2021 cat /etc/os-release
やっぱり、TeX-style shebangは便利!
昨今、主要なTeXエディタ TeXworks、TeXShop、VSCodeの拡張機能LaTeX Workshopで、TeX-style shebangをしてみたをまとめてみました。