bash lexer を備えた minted 環境内で escapeinside を使用するにはどうすればよいですか?

bash lexer を備えた minted 環境内で escapeinside を使用するにはどうすればよいですか?

escapeinside 機能は bash lexer では正しく動作しません。これを修正する方法はありますか?

MWE:

\documentclass{article}
\usepackage{minted}

\begin{document}

\begin{minted}[escapeinside=||]{bash}
#!/bin/bash
echo "Hello world!"
|\textrm{Some commentary here}|
\end{minted}

\end{document}

サンプル画像の出力

答え1

これは、Bash lexer が\シェルのエスケープ シーケンスを処理するためにバックスラッシュの catcode を再定義するために発生します。つまり、コマンドを開始するために escapeinside シーケンスで使用することはできません。

幸いなことに、回避策は別の文字をアクティブにし、 csname を使用してその引数をアクティブに定義します。選択した文字が、作成したコードの他の場所に表示されないようにすることが重要です。この例では、疑問符 を使用します?。たとえば、コマンドを呼び出すときは\textrm{arg}、代わりに を呼び出し?{textrm}{arg}、疑問符を選択した文字に置き換えます。

catcode の再定義がドキュメントの残りの部分に影響を与えないようにするには、全体を\begingroup/で囲むことが重要です。\endgroup

\documentclass{article}
\usepackage{minted}

\begin{document}

\begingroup
% REPLACE THE ? WITH YOUR CHOSEN CHARACTER ON BOTH OF THE FOLLOWING LINES
\catcode`\?=\active
\def?#1{\csname #1\endcsname}

\begin{minted}[escapeinside=||]{bash}
#!/bin/bash
echo "Hello world!"
|?{textrm}{Some commentary here}|
\end{minted}
\endgroup

\end{document}

修正後の結果

関連情報