创建并集中良好的 EBNF

创建并集中良好的 EBNF

我使用该包syntax创建了以下 EBNF。

  1. 我想将其居中,但是\begin{center}...\end{center}其他命令似乎对grammar环境不起作用。
  2. 当我将其设置\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环境本身中执行此操作,因为它不是全局定义的。

相关内容