lineno 和语法包不兼容

lineno 和语法包不兼容

我使用的是 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根据\parLaTeX 内部的宏计算行数\@@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}

相关内容