如何使用语法包正确对齐替代产品?

如何使用语法包正确对齐替代产品?

我正在使用syntax包来描述我正在使用的编译文档中的语法pdftex。我的代码的精简版本是:

\documentclass[12pt]{article}
\usepackage{fullpage}
\usepackage{syntax}

\begin{document}
<program> ::= <expr>
    \alt <expr-list>
\end{document}

奇怪的是,当我编译它时,没有出现任何错误或警告,但\alt行上的左缩进比文档中显示的要小得多。

作为参考,这里是文档中显示的缩进(和相应的代码):

取自 <code>syntax</code> 包文档的语法的 BNF 描述

...这是我的代码运行后产生的结果pdftex

在此处输入图片描述

我能想到的唯一一个包可能干扰的是fullpage,但在序言中注释掉该行没有任何效果。

我也尝试过使用\grammarindentpreamble 命令,但是这并没有达到预期的效果;它确实修改了替代产品的缩进(可靠且可预测),但它的长度是固定的,而不是与相应的垂直对齐::=

我怎样才能使我的 BNF 语法描述像包文档中那样缩进syntax

答案1

从包文档的来源来看,示例中的缩进似乎是硬编码的(即不是根据第一个关键字的大小计算的)。但是,它::=也会尊重缩进,因此如果您将其设置得足够大,那么行将alt正确对齐(尽管第一个关键字和第一个定义之间可能存在间隙)。

如果您愿意提供第一个关键字作为附加参数,那么使用该calc包自动计算适当的缩进值相对简单。

梅威瑟:

\documentclass[12pt]{article}
\usepackage{fullpage}
\usepackage{calc}
\usepackage{syntax}

\newlength{\myl}

\newenvironment{indentgrammar}[1]
    {\setlength{\myl}{\widthof{#1}+2em}
    \grammarindent\the\myl
    \begin{grammar}}
    {\end{grammar}}

\begin{document}
\grammarindent1.5in
\begin{grammar}
<statement> ::= <ident> ‘=’ <expr>
\alt ‘for’ <ident> ‘=’ <expr> ‘to’ <expr> ‘do’ <statement>
\alt ‘{’ <stat-list> ‘}’
\alt <empty>

<stat-list> ::= <statement> ‘;’ <stat-list> | <statement>
\end{grammar}

\begin{indentgrammar}{<program>}
<program> ::= <expr>
    \alt <expr-list>
\end{indentgrammar}

\end{document}

结果:

在此处输入图片描述

笔记:

  • 顶部显示“足够大”选项,下面显示自动计算。
  • 为了自动计算,需要定义一个新环境。如果稍微麻烦一点,您也可以更改现有grammar 环境、使用renewenvironmentetoolbox包。
  • widthof由于有些保守,所以添加了额外的 2em 。
  • 可能可以从环境主体中读取第一个关键字,而不是作为额外的参数,但这留给读者练习:)
  • 您的 MWE 无法编译,因为它缺少\begin{grammar}\end{grammar}

相关内容