我使用的是 mdwtools 版本 1996/05/17 1.07 中的语法包。我成功设置了属性以正确显示语法定义,但当我尝试将其与 lineno 包结合使用时,我收到一个严重的错误,显示每个新规则的行号都为双倍。然后挖掘 syntax.sty 的代码,我发现我可以通过注释此行来修复“语法”定义中的问题:
\vskip-\baselineskip%
现在它工作得更好了,但是规则之间有多余的新行。事实上,定义从第 2 行开始,我无法删除这些多余的行!(这似乎与列表命令有关)我想这是一个错误。TeX 远远超出了我的专业知识,所以我报告了这个错误,想知道是否有人有解决方法或帮助我解决这个问题。
答案1
这是一个解决方案:
\documentclass{article}
\usepackage{syntax}
\usepackage{lineno}
\makeatletter
\def\gr@implitem<#1> #2 {%
\sbox\z@{\hskip\labelsep\grammarlabel{#1}{#2}}%
\strut\@@@par% lineno.sty redefines \@@par which was in the original code
\vspace{-\parskip}%
\vspace{-\baselineskip}%
\hrule\@height\z@\@depth\z@\relax%
\item[\unhbox\z@]%
\catcode`\<\active%
}
\makeatother
\begin{document}
\begin{linenumbers}
\begin{grammar}
<statement> ::= <ident> ‘=’ <expr>
\alt ‘for’ <ident> ‘=’ <expr> ‘to’ <expr> ‘do’ <statement>
\alt ‘{’ <stat-list> ‘}’
\alt <empty>
<stat-list> ::= <statement> ‘;’ <stat-list> | <statement>
<statement> ::= <ident> ‘=’ <expr>
\alt ‘for’ <ident> ‘=’ <expr> ‘to’ <expr> ‘do’ <statement>
\alt ‘{’ <stat-list> ‘}’
\alt <empty>
\end{grammar}
\end{linenumbers}
\end{document}
解释:lineno.sty
根据\par
LaTeX 内部的宏计算行数\@@par
。lineno.sty 需要使用其自己的版本,\@@@par
以跟踪虚假的空白行。syntax.sty
用 替换\@@par
可以\@@@par
修复此问题。
答案2
为什么你不使用一个像的listings
例子的包?
\documentclass{article}
\usepackage{listings}
\begin{document}
\begin{lstlisting}
<statement> ::= <ident> = <expr>
| for <ident> = <expr> to <expr> do <statement>
| <stat-list>
| <empty>
<stat-list> ::= <statement> ; <stat-list> | <statement>
<statement> ::= <ident> = <expr>
| for <ident> = <expr> to <expr> do <statement>
| <stat-list>
| <empty>
\end{lstlisting}
\end{document}