ams 环境中的内联列表在 mathescape 之前删除空格

ams 环境中的内联列表在 mathescape 之前删除空格

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}

产生这个输出

示例 1

在里面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}

示例 2

这样做非常烦人,特别是因为,例如,更改alignequation将显示反斜杠,并且必须再次将其删除。

相关内容