我正在尝试为一种编程语言排版小步语义。我的计划是使用 mathpartir 包来编写推理规则,并使用 listing 包来排版语言片段。
如果我在常规数学环境中一起使用这两个包,一切似乎都运行正常,如下图第一个示例所示。但是,如果我尝试使用 mathpartir 中的 mathpar 环境,那么结果错误地向右移动,如第二个例子所示。
mathpartir 环境非常方便,因为它会自动组织公式,在每行上放置尽可能多的公式。是否有一些解决方法可以让 listings 模块与 mathpar 一起工作?如果没有,至少有一种方法可以让我弄清楚为什么结果看起来不对?如果这是软件包中的错误,我不知道应该归咎于哪个软件包。
平均能量损失
\documentclass{article}
\usepackage{mathpartir}
\usepackage{listings}
\lstset{
% without this the \hbox is not strictly necessary
basicstyle={\ttfamily},
}
\begin{document}
% Works fine:
\[
\infer{A \hbox{\lstinline!a!} A}{B \hbox{\lstinline!a!} B}
\]
% Weird shift:
\begin{mathpar}
\infer{A \hbox{\lstinline!a!} A}{B \hbox{\lstinline!a!} B}
\end{mathpar}
\end{document}
答案1
我没有追踪所有情况,但像往常一样,在这种情况下,先将有问题的代码放在一个框中会有所帮助
\documentclass{article}
\usepackage{mathpartir}
\usepackage{listings}
\lstset{
% without this the \hbox is not strictly necessary
basicstyle={\ttfamily},
}
\begin{document}
% Works fine:
\[
\infer{A \hbox{\lstinline!a!} A}{B \hbox{\lstinline!a!} B}
\]
% Weird shift:
\newbox\bA
\setbox\bA\hbox{\lstinline!a!}
\begin{mathpar}
\infer{A \usebox\bA{} B}{A \usebox\bA{} B}
\end{mathpar}
\end{document}
实际上,如果足以在本地恢复\par
到列表预期的值(重置不会被撤消,因此只能在组中使用,就像这里一样):
\documentclass{article}
\usepackage{mathpartir}
\usepackage{listings}
\lstset{
% without this the \hbox is not strictly necessary
basicstyle={\ttfamily},
}
\begin{document}
% Works fine:
\[
\infer{A \hbox{\lstinline!a!} A}{B \hbox{\lstinline!a!} B}
\]
% Weird shift:
\newcommand\zlstinline{\let\par\endgraf\lstinline}
\begin{mathpar}
\infer{A \hbox{\zlstinline!a!} B}{A \hbox{\zlstinline!a!} B}
\end{mathpar}
\end{document}