Как использовать escapeinside в среде minted с лексером bash?

Как использовать escapeinside в среде minted с лексером bash?

Функционал escapeinside не работает должным образом с bash lexer. Есть ли способ это исправить?

МВЭ:

\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 переопределяет catcode для обратной косой черты \, чтобы обрабатывать последовательности escape оболочки. Это означает, что его нельзя использовать в последовательности escapeinside для запуска команды.

К счастью, можно обойти эту проблему, сделавдругойактивный символ и определение его с помощью csname для активации его аргумента. Крайне важно, чтобы выбранный символ не встречался больше нигде в вашем коде. Для этого примера я использую вопросительный знак ?. При вызове команды, например \textrm{arg}, вместо этого вы вызовете ?{textrm}{arg}, заменив вопросительный знак выбранным вами символом.

Важно заключить все это в \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}

Результат после исправления

Связанный контент