TeXworks、TeXShop、VSCodeでTeX-style shebangしてみた

この記事では、LaTeX文章にコメントアウトでマジックコメントとしてTeX-style shebang `%#! <typeset command>` を記述することで、主要なTeX編集環境のエディタ上で、明示的にLaTeX関連のコマンドを実行する一例を紹介します。


## TeX-style shebangとは？

わたしは普段、テキストエディタEmacs上でTeX/LaTeX編集支援YaTeXを利用しています。YaTeXの便利な機能の一つに、LaTeX文章の最初の方に、例えば、

``` 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行目に記述しなくてもかまいません。例えば、

``` latex
%　#! 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](https://github.com/munepi/runtexshebang)にリポジトリを移し[^runtexshebang_v0.1]、
* [CTAN: runtexshebang](https://ctan.org/pkg/runtexshebang)に登録され、
* TeX Live 2023にも収録されました。

TeX Live 2023をお使いの方は、`runtexshebang`コマンドをすぐに利用可能な状態です。


[^runtexshebang_v0.1]: 2021年当初、簡単に書いた `runtexshebang.lua` を[GIST](https://gist.github.com/munepi/eed4af283ac7de2db0e3017e995239b1
)に置いていました。


## 例：TeXworks

### 設定
![ScreenShot 262.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43618/34d9c479-640e-fa5d-189f-ee881ab1ba6c.png)

タイプセットの方法に「`runtexshebang`」を追加して、「タイプセットの方法を設定する」において、以下のように設定します。

 * 名前：`runtexshebang`
 * プログラム：`runtexshebang`
 * 引数：`$fullname`

### LaTeX文章

TeX-style shebang行「%#!」と合わせて、TeXworksのTeXエディタで有効なマジックコメント「`% !TeX program = <タイプセットの方法の名前>`」も添えておくと、つぎにこのLaTeX文章ファイルをTeXworksで開いたときに、自動的に`<タイプセットの方法の名前>`を指定してくれます。

``` latex
%#! lualatex --synctex=1 beefplate
% !TEX program = runtexshebang
```

![ScreenShot 254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43618/9055eb8e-23cb-61f9-c26e-1f0c05b9079e.png)

「&&」でつなげて、`upmendex`コマンドも実行してりできますね。

![ScreenShot 255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43618/3c9b1564-5f14-f8ad-ded6-13679db14ec8.png)

## 例：TeXShop

### 設定
![ScreenShot 256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43618/22616a5e-b90c-139c-72ec-3712115055a1.png)

ここでは、「TeX+dvipdfmx」と「LaTeX」を`runtexshebang`にしています。

### LaTeX文章

TeXworksと同様に、TeXShopで有効なマジックコメントを与えておくと、便利です。

``` latex
%#! lualatex --synctex=1 beefplate
% !TEX program = runtexshebang
```

![ScreenShot 257.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43618/0e7f1ee8-2520-a3b0-59c9-b3f69072a717.png)

## 例：Visual Studio Codeの拡張機能LaTeX Workshop

### 設定
何も設定する必要はありません。

個人的に、一見便利に思える「レシピ」を設定することを安易に勧められません。
通常のタイプセットであったしても、LaTeX Workshopで有効なマジックコメントにより、明示的にコマンドやオプションを与えてタイプセットしたほうが、なにか問題が起こったとしても、エディタ側の問題なのか、シェル側の問題なのか、TeX環境側の問題なのか、切り分けがしやすいと思います。

### LaTeX文章

LaTeX Workshopで有効なマジックコメントを以下のようにします。

``` latex
% !TEX program = runtexshebang
% !TEX options = "%DOC%".tex
```

![ScreenShot 258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43618/7be30b85-5517-d9ed-2b65-f627d786502d.png)

これにより、`beefplate.tex` に対して指定したマジックコメントから、

``` bash
runtexshebang beefplate.tex
```

が実行されて、`beefplate.tex` の TeX-style shebangの行が実行されます。


## 例：その他

本来、各TeXエディタ上の「タイプセット」「▶」はタイプセットするの用途ですが、TeX-shebangを実行することにより、TeXエディタ上の各種設定などを調べたりするなど、なにか問題があるときの問題解決の糸口を見いだせるかもしれません。

実際に、主要なTeXエディタで「なんかテフが動かない！　なんで？」のとき、手元のTeXエディタでどういう状態になっているのか、把握しきれいない場合がほとんどです。


### TeXエディタ上の各種設定を調べる

例えば、TeXエディタ上の環境変数 `$PATH` をサクッと調べたりするのにも使えますね。

``` latex
%#! echo $PATH
```

![ScreenShot 261.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43618/6d315180-8fe4-33fb-72f6-03d6a9ea8ee3.png)

![ScreenShot 263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43618/194f299c-9aea-25d9-3895-dcadfbeea877.png)



### DockerコンテナでTeX/LaTeXしたり、各種設定を確認したりなど

例えば、Dockerコンテナ内で、`lualatex`したり、OS情報をサクッと表示させたりできますね。
一例として、Docker HubにあるDockerイメージ `munepi/tllangjapanese:2021` のOS情報を確認できますね。

``` latex
%#! docker run -i --rm --platform linux/amd64 --workdir /data --mount type=bind,src=$(pwd)/,dst=/data/  munepi/tllangjapanese:2021   cat /etc/os-release
```

![ScreenShot 260.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43618/9e7e715d-0dac-9ecb-2edd-64f3f44cdc68.png)

## やっぱり、TeX-style shebangは便利！

昨今、主要なTeXエディタ TeXworks、TeXShop、VSCodeの拡張機能LaTeX Workshopで、TeX-style shebangをしてみたをまとめてみました。