lstnewenvironmentとlatexindent.pl

VS Codeの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を自動整形対象から除外する。

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

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

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

続いて./latexindent.yamlには以下のように記述します。

verbatimEnvironments:
  lstlistinglet: 1

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

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください