我使用该包syntax
创建了以下 EBNF。
- 我想将其居中,但是
\begin{center}...\end{center}
其他命令似乎对grammar
环境不起作用。 - 当我将其设置
\grammarindent
为较大的值时::=
,也会缩进。您知道如何缩进\alt
后面的::=
吗?
\documentclass[a4paper,12pt]{article}
\usepackage[nounderscore]{syntax}
\begin{document}
\shortverb{\|}
\setlength{\grammarindent }{2cm}
\begin{grammar}
<stmt> ::= <stmt>; <stmt> | \textbf{skip} | $v := $ <expr> | \textbf{input} $\vec{v}$ | \textbf{output} $\vec{v}$
\alt \textbf{if} <expr> \textbf{then} <stmt> \textbf{else} <stmt> | \textbf{while} <expr> <stmt>
<expr> ::= $v$ | \textbf{tt} | \textbf{ff} | <expr> $\lor$ <expr> | $\lnot$<expr>.
\end{grammar}
\end{document}
答案1
环境grammar
基于list
结构,结构自然左对齐。获得居中效果的一种方法是将整个结构放入环境minipage
内部center
。
原始命令\alt
定义为
\\\llap{\textbar\quad}
即这会开始一个新行并在新列的左侧打印一个竖线,后面跟着一个\quad
=的空格1em
。您可以定义一个类似的命令来删除,\llap
这样竖线(和空格)就不会向左推出。但是,我建议使用一个功能更强大的命令:
\newcommand{\indalt}[1][2]{\\\hspace*{#1em}\textbar\quad}
这默认2em
在栏前提供了额外的空间,但采用可选参数,因此\indalt[0]
不会缩进,并且\indent[4]
会给出缩进4em
。
\documentclass[a4paper,12pt]{article}
\usepackage[nounderscore]{syntax}
\shortverb{\|}
\setlength{\grammarindent}{2cm}
\newcommand{\indalt}[1][2]{\\\hspace*{#1em}\textbar\quad}
\begin{document}
\hrule
\begin{center}
\begin{minipage}{0.8\linewidth}
\begin{grammar}
<stmt> ::= <stmt>; <stmt> | \textbf{skip} | $v := $ <expr>
\indalt \textbf{input} $\vec{v}$ | \textbf{output} $\vec{v}$
\indalt[4] \textbf{if} <expr> \textbf{then} <stmt> \textbf{else} <stmt>
\indalt \textbf{while} <expr> <stmt>
<expr> ::= $v$ | \textbf{tt} | \textbf{ff} | <expr> $\lor$
<expr> | $\lnot$<expr>.
\end{grammar}
\end{minipage}
\end{center}
\end{document}
如果您希望重新定义\alt
命令本身,则必须在grammar
环境本身中执行此操作,因为它不是全局定义的。