在https://tex.stackexchange.com/a/127018/83257有一个补丁可以使内联列表在数学模式下工作。当将其与列表选项一起使用时mathescape
,数学转义后的空格在 ams 环境中会被删除。该空格在常规数学块中保留,例如\[ ... \]
。我希望有人能帮我解决这个问题,我自己没有知识来弄清楚。MWE 如下:
\documentclass{article}
\usepackage{amsmath}
\usepackage{listings}
\lstset{mathescape,keepspaces}
%% patch from https://tex.stackexchange.com/a/127018/83257
\usepackage{etoolbox}
\expandafter\patchcmd\csname \string\lstinline\endcsname{%
\leavevmode
\bgroup
}{%
\leavevmode
\ifmmode\hbox\fi
\bgroup
}{}{%
\typeout{Patching of \string\lstinline\space failed!}%
}
%% end of patch
\begin{document}
Space before mathescape preserved:
\[
\lstinline|ifz $x$ then E$_2$ else E$_3$|
\]
Space before mathescape dropped:
\begin{align*}
\lstinline|ifz $x$ then E$_2$ else E$_3$|
\end{align*}
\end{document}
编辑:发现列表的选项keepspaces
解决了部分问题。数学符号后的空格不会被保留,但之前的空格仍然会被删除。
答案1
这不仅影响amsmath
环境。这个最小示例还展示了这个问题:
\documentclass[12pt,a4paper]{article}
\usepackage{listings}
\lstset{mathescape,keepspaces}
\newcommand\identity[1]{#1}
\begin{document}
\lstinline!let $v_1$ = 10 in $v_1$ + $v_2$!
\identity{\lstinline!let $v_1$ = 10 in $v_1$ + $v_2$!}
\end{document}
产生这个输出
在里面listings
文档,第 6.1 节中提到,如果\lstinline
在参数中使用,则必须通过使用 转义某些空格来保护它们\
。虽然它没有提到转义到数学模式,但这似乎是其中一种情况。使用 转义空格可以\
解决我的示例和两者的问题align
。
\lstinline!let $v_1$ = 10 in $v_1$ + $v_2$!
\identity{\lstinline!let\ $v_1$ = 10 in\ $v_1$ +\ $v_2$!}
\begin{align}
\lstinline!let\ $v_1$ = 10 in\ $v_1$ +\ $v_2$!
\end{align}
这样做非常烦人,特别是因为,例如,更改align
为equation
将显示反斜杠,并且必须再次将其删除。