✒️

lstnewenvironmentとlatexindent.pl

2024/04/24に公開

LaTeX文書に新しいリスティング環境を作った際、Visual Studio CodeのLaTeX-Workshopが環境内部を自動整形してしまうトラブルに遭遇しました。解決したので記録に残しておきます。

LaTeX-Workshopの自動整形と問題

LaTeX-Workshopは、VS CodeでLaTeX文書を書く際に多くの支援をしてくれます。自動整形もその一つで、itemize環境においてitemを自動で追加してくれたり、適切なインデントを作ってくれたりと大助かりです。

いっぽうで、lstlisting環境の中に書いたコードは、自動整形の対象外となるため期待通りに出力されます。

ところが、lstnewenvironmentで新しいリスティング環境を作ったところ、内部のコードが勝手に整形されてしまうため期待通りの出力にならない問題が起きたのでした。

調査したところ、LaTeX-Workshopは内部でlatexindent.plを使って自動整形しており、latexindent.plに新しいリスティングを整形しないよう知らせれば済むと分かりました。

解決方法

例えば、LaTeX文書のプリアンブルで次のような環境を定義したとします。

% 文中に差し込む小規模のリスティング
\lstnewenvironment{lstlistinglet}[1][]%
{
  \noindent
  \minipage{\linewidth}
  \vspace{0.5\baselineskip}
  \lstset{
    basicstyle={\ttfamily},
    frame=single,
    #1 }}
{\endminipage}

新しい環境であるlstlistingletはプログラムのコードを囲む環境なので、自動整形してほしくありません。

そこで、次の手順を踏みます。

  1. latexindent.plに”-l”オプションを渡すよう、LaTeX-Wokrshopに指示する。
  2. プロジェクト・ルートに.latexindent.yamlファイルを置き、lstlistingletを自動整形対象から除外する。

LaTeX-Workshopの設定

latexindent.mlの“-l”(マイナス・エル)オプションは、ローカル・ディレクトリに自動整形ルールのファイルが存在することを教えます。このオプションを渡すために、.vscode/settings.jsonファイルに次の設定を追加します。

{
    "latex-workshop.latexindent.args": [
        "-c",
        "%DIR%/",
        "%TMPFILE%",
        "-y=defaultIndent: '%INDENT%'",
        "-l"
    ]
}

この設定はVS Codeのオプション設定画面から設定したもので、”-l”以外の設定はデフォルトの設定がそのままコピーされています。

.latexindent.yaml

続いて./.latexindent.yamlには以下のように記述します。verbatimEnvironmentsに列挙した環境の一つ一つに対して、自動整形するか否かを指定できます。1なら自動整形、0なら自動整形しません。

verbatimEnvironments:
  lstlistinglet: 1

これでlstlistinglet環境は自動整形されなくなります。

注意

カスタム環境はドキュメントに固有なものです。ですので、settings.jsonも.latexindent.yamlもグローバルではなく、ワークスペースに局所的な設定としなければなりません。

Discussion