我想要表示一个规则已编号的语法(例如,以下语法: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}