如何使 \lstinline 在数学模式中正常发挥作用?

如何使 \lstinline 在数学模式中正常发挥作用?

\lstinlinelistings在数学模式下不起作用。当我尝试使用它时,我收到\ttfamily数学模式下无效的错误。

然而,在推理程序语义时,通常需要将程序代码片段放入数学结构中,理想情况下,这样做是\lstinline为了保持内联片段和较大的代码块之间的一致样式。

当然,有几种临时的逐案解决方案。我能够在命令\lstinline中完成工作\text,并格外小心地转义某些字符。有时我\lstinline根本不使用,而是手动格式化代码片段。这两种方法都不太方便。

有没有普遍适用的解决方案?理想情况下,我可以\lstinline在数学模式下使用(好吧,\lstMakeShortInline无论如何,这是快捷方式),而不会出现任何错误。我偶尔会使用mathescape内部代码片段。如果仍然有效,那就太好了,但不是必需的。

答案1

如果您不需要的调整大小功能\text并且简单的\hbox\mbox)就足够了,那么以下重新定义修补第一个在数学模式中\bgroup添加的内容:\hbox

\documentclass{article}
\usepackage{listings}

\usepackage{letltxmacro}
\newcommand*{\SavedLstInline}{}
\LetLtxMacro\SavedLstInline\lstinline
\DeclareRobustCommand*{\lstinline}{%
  \ifmmode
    \let\SavedBGroup\bgroup
    \def\bgroup{%
      \let\bgroup\SavedBGroup
      \hbox\bgroup
    }%
  \fi
  \SavedLstInline
}

\lstset{basicstyle=\ttfamily}
\begin{document}
\centering
Text: \lstinline|\foo%&$bar|
\[
  x = \lstinline|\foo%&$bar|
\]
\end{document}

结果

通过软件包进行修补etoolbox

\documentclass{article}
\usepackage{listings}

\usepackage{etoolbox}
\expandafter\patchcmd\csname \string\lstinline\endcsname{%
  \leavevmode
  \bgroup
}{%
  \leavevmode
  \ifmmode\hbox\fi
  \bgroup
}{}{%
  \typeout{Patching of \string\lstinline\space failed!}%
}

\lstset{basicstyle=\ttfamily}
\begin{document}
\centering
Text: \lstinline|\foo%&$bar|
\[
  x = \lstinline|\foo%&$bar|
\]
\end{document}

相关内容