在 align* 内的 minipage 中使用 lstlisting 时出错

在 align* 内的 minipage 中使用 lstlisting 时出错

我正在尝试使用lstlisting内部环境minipage里面an align*(fromo amsmath)...但是,lualatex会引发错误。这是最低限度的工作示例

\documentclass{article}

\usepackage{amsmath}
\usepackage{listingsutf8}

\begin{document}

\begin{align*}
f(a\in A) &= x\\
f(x\in X) &= \begin{minipage}[t]{4cm}
\begin{lstlisting}[mathescape=true]
(let $m$=mean($X$)
    $g(m) \circ h(x)$)
\end{lstlisting}
\end{minipage}
\end{align*}

\end{document}

错误如下:

! Argument of \lst@next has an extra }.
<inserted text> 
\par 
l.16 \end{align*}

? 
! Emergency stop.
<inserted text> 
\par 
l.16 \end{align*}

那么,有什么方法可以实现我的愿望吗?我想通过案例定义一个函数,使用align*,但在右侧缩进代码

我不确定是否有必要提及我正在排版一种语言的指称语义,在定义语义函数的等式右侧使用一些类似 Lisp 的语法。下面是一个格式化为纯文本的伪示例。

      C[ v := e ]s = s[ E[e]/v ]
C[ some-command ]s = (let x=...
                         (if ...
                          then ...
                          else ...))

编辑:按照egreg的建议,我尝试了以下tabbing环境:

\documentclass{article}

\usepackage{amsmath}
\usepackage{listingsutf8}
\lstset{%
    showstringspaces=false,
    basicstyle=\ttfamily,
    commentstyle=\fontfamily{cmtt}\fontshape{it}\selectfont,
    frame=single
}

\begin{document}

\begin{center}
\begin{tabbing}
$f(a\in A)$ = \= $x$\\
$f(x\in X)$ = \> (let $m$=mean($X$) in\\
\> $\;\;\;\;$    \= $g(m) \circ h(x)$)
\end{tabbing}
\end{center}

\begin{center}
    \begin{tabbing}
        $f(a\in A)$ = \= $x$\\
        $f(x\in X)$ = \> \begin{minipage}[t]{4cm}
\begin{lstlisting}[mathescape=true]
(let $m$=mean($X$) in:
    $g(m) \circ h(x)$)
\end{lstlisting}
\end{minipage}
\end{tabbing}
\end{center}
\end{document}

结果如下:

在此处输入图片描述

文档中有两次尝试。第一次排版似乎很麻烦(控制缩进会有些痛苦);第二次更容易输入,但是里面的第一行lstlistingminipage方程式不对齐(我lstlisting只是为了使对齐清晰而将框架包含在环境中)。

此外,两种情况下的等号似乎都没有对齐。

这容易修复吗?

答案1

您不能lstlisting在环境主体中使用align*,因为它与在命令参数中使用它相同,这是不允许的。

我建议tabbing

\documentclass{article}

\usepackage{amsmath}

\begin{document}

\begin{align*}
f(a\in A) &= x\\
f(x\in X) &=
  \begin{minipage}[t]{\textwidth}\ttfamily
  \begin{tabbing}
    (let \= $m=\texttt{mean}(X)$ in\\
         \> $g(m) \circ h(x)$)
  \end{tabbing}
  \end{minipage}
\end{align*}

\end{document}

这利用了这样一个事实:仅包含tabbing环境的迷你页面的宽度与 中最宽的行一样宽tabbing

在此处输入图片描述

相关内容