
Я пытаюсь набрать мелкошаговую семантику для языка программирования. Мой план состоял в том, чтобы использовать пакет mathpartir для написания правил вывода и пакет листинга для набирания фрагментов языка.
Если я использую два пакета вместе в обычной математической среде, все работает нормально, как показано в первом примере на следующем изображении. Однако, если я попытаюсь использовать среду mathpar из mathpartir, торезультат неправильно смещен вправо, как показано во втором примере.
Среда mathpartir очень удобна, поскольку она автоматически организует формулы, помещая столько формул в каждую строку, сколько в нее помещается.Есть ли какой-нибудь обходной путь, позволяющий заставить модуль листингов работать вместе с 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
значение, ожидаемое listings (сброс не отменяется, поэтому используйте только, как здесь, в группе):
\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}