\lstinline
包listings
在数学模式下不起作用。当我尝试使用它时,我收到\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}