我正在使用syntax
包来描述我正在使用的编译文档中的语法pdftex
。我的代码的精简版本是:
\documentclass[12pt]{article}
\usepackage{fullpage}
\usepackage{syntax}
\begin{document}
<program> ::= <expr>
\alt <expr-list>
\end{document}
奇怪的是,当我编译它时,没有出现任何错误或警告,但\alt
行上的左缩进比文档中显示的要小得多。
作为参考,这里是文档中显示的缩进(和相应的代码):
...这是我的代码运行后产生的结果pdftex
:
我能想到的唯一一个包可能干扰的是fullpage
,但在序言中注释掉该行没有任何效果。
我也尝试过使用\grammarindent
preamble 命令,但是这并没有达到预期的效果;它确实修改了替代产品的缩进(可靠且可预测),但它的长度是固定的,而不是与相应的垂直对齐::=
。
我怎样才能使我的 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
环境、使用renewenvironment
或etoolbox
包。 widthof
由于有些保守,所以添加了额外的 2em 。- 可能可以从环境主体中读取第一个关键字,而不是作为额外的参数,但这留给读者练习:)
- 您的 MWE 无法编译,因为它缺少
\begin{grammar}
和\end{grammar}
。