我正在尝试使用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}
结果如下:
文档中有两次尝试。第一次排版似乎很麻烦(控制缩进会有些痛苦);第二次更容易输入,但是里面的第一行lstlisting
与 minipage
方程式不对齐(我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
。