具有编号规则的语法

具有编号规则的语法

我想要表示一个规则已编号的语法(例如,以下语法:http://en.wikipedia.org/wiki/LR_parser#Additional_Example_1.2B1),以便稍后在操作表中引用这些规则。但是,我找不到任何正确执行此操作的方法。理想情况下,规则编号应该右对齐,就像在环境中一样alignat

目前,我只是直接将数字放入语法中,输出的结果不太可读。

我的代码:

\documentclass[11pt]{article}
\usepackage{syntax}

\begin{document}

\setlength{\grammarparsep}{20pt plus 1pt minus 1pt}
\setlength{\grammarindent}{12em}
\begin{grammar}
<E> ::= <E> \lit{*} <B>    (1)
    \alt <E> \lit{+} <B>   (2)
    \alt <B>               (3)

<B> ::= \lit{0}            (4)
    \alt \lit{1}           (5)
\end{grammar}

\end{document}

(请注意,E 和 B 位于“小于”和“大于”符号之间,我将它们从列表中删除,因为它们似乎与 stackexchange 交互不佳)。

答案1

这在很多情况下都应该有效;我不是这类语法的专家。

我建议您定义一个新的环境,修补该grammar环境以添加行号。

\documentclass[11pt]{article}
\usepackage[pass,showframe]{geometry} % just to show the margins

\usepackage{syntax}

\usepackage{etoolbox} % for patching
\makeatletter
% define the main command on the model of the original one
% we add stepping the counter and typesetting the number
\def\gr@implnumbereditem<#1> #2 {%
  \stepcounter{grammarline}%
  \sbox\z@{\hskip\labelsep\grammarlabel{#1}{#2}}
  \strut\@@par%
  \vskip-\parskip%
  \vskip-\baselineskip%
  \hrule\@height\z@\@depth\z@\relax%
  \item[%
    \rlap{\hskip\dimexpr\linewidth+\grammarindent\relax %% add the number
          \llap{(\thegrammarline)}}%
    \unhbox\z@]%
  \catcode`\<\active%
}
% copy the grammar environment under a new name
\let\numberedgrammar\grammar
\let\endnumberedgrammar\endgrammar
% now patch the new environment
\pretocmd\numberedgrammar{\setcounter{grammarline}{0}}{}{}
\patchcmd\numberedgrammar
  {\gr@implitem}
  {\gr@implnumbereditem}
  {}{}
\patchcmd\numberedgrammar
  {\def\alt{\\\llap{\textbar\quad}}}
  {\let\alt\alt@num}
  {}{}

% the command for numbering the \alt lines
\def\alt@num{\\\relax
  \stepcounter{grammarline}%
  \rlap{\hskip\dimexpr\linewidth-\labelwidth+\grammarindent-\labelsep\relax
        \llap{(\thegrammarline)}}% add the number
  \llap{\textbar\quad}}

\newcounter{grammarline}
\makeatother

\begin{document}

\setlength{\grammarparsep}{20pt plus 1pt minus 1pt}
\setlength{\grammarindent}{5em}
Some text above
\begin{numberedgrammar}
<E> ::= <E> \lit{*} <B>
  \alt <E> \lit{+} <B>
  \alt <B>

<B> ::= \lit{0}
  \alt \lit{1}
\end{numberedgrammar}
Some text below
\begin{enumerate}
\item a
\begin{numberedgrammar}
<E> ::= <E> \lit{*} <B>
  \alt <E> \lit{+} <B>
  \alt <B>

<B> ::= \lit{0}
  \alt \lit{1}
\end{numberedgrammar}
\end{enumerate}
\end{document}

在此处输入图片描述

相关内容