我正在尝试为文档编写语法生成。我正在使用对齐环境来获取所需的语法生成,如下所示:
\begin{align*}
S\# &\rightarrow aA | bA\\
A\# &\rightarrow aA | bA\\
\# A &\rightarrow Aa | Ab \\
{A \above 0pt \#} &\rightarrow {a \above 0pt A} \mid {b \above 0pt A} \\
A &\rightarrow a | b
\end{align*}
但是 1. 有没有更好的方法可以做到这一点?
2. 我该怎么做才能得到符号一个在另一个符号上方的语法作品?目前我使用 ${a \above b}$ 来实现这一点。有没有更好的方法可以做到这一点?
3. 我需要附图中提到的形式的作品,其中一组作品与另一组作品相邻。如何在 中生成这样的语法作品\LaTeX
?
请帮忙。我找不到与此问题相关的帖子。谢谢
答案1
我并不认为这是最好的方法,但过去我排版 CFG 时,我倾向于使用\to
并定义\OR
分隔符的宏。我还用一个使用from 的\above
新宏替换了您的宏。\stack
\genfrac
amsmath
\documentclass{article}
\usepackage{amsmath}
\newcommand*\OR{\ |\ }
\newcommand*\stack[2]{\genfrac{}{}{0pt}{0}{#1}{#2}}
\begin{document}
\begin{align*}
S\# &\to aA \OR bA\\
A\# &\to aA \OR bA\\
\# A &\to Aa \OR Ab \\
\stack A\# &\to \stack aA \OR \stack bA \\
A &\to a \OR b
\end{align*}
\end{document}
我应该指出,LaTeX 纯粹主义者会反对 ,\stack aA
而会改写\stack{a}{A}
。 (并且可能\newcommand*{\OR}{\ |\ }
。)我倾向于对此类事情不那么挑剔。
答案2
\above
是一种堆叠字母/单词的方法。但由于这些公式看起来像数组,并且每个单元格只包含一个符号,为什么不使用 -environment array
?
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{align*}
\begin{array}{ccc}
\hphantom{\#} & \# & \# \\
& S & \# \\
&\#
\end{array}
&\rightarrow
\begin{array}{ccc}
\hphantom{\#} & \# & \# \\
& a & S \\
&S
\end{array}
\\
\begin{array}{ccc}
\\
\# & S & S \\
& \#
\end{array}
&\rightarrow
\begin{array}{ccc}
\\
\# & a & D \\
& S
\end{array}
\end{align*}
\end{document}
答案3
将其堆叠(在 内array
)。在这里,我使用空格作为列分隔符,并将其设置@
为空白占位符。我还将其设置#
为\catcode=12
在组内。
这让我可以在上面的组中建立方程式
\tC{@ # @\\a S #\\@ # @} \rightarrow \tC{@ # @\\a a #\\@ S @}
在下面一组中
S
\Rightarrow\lU{a S\\S @}
\Rightarrow\lU{a a S\\S S @}
妇女权利委员会:
\documentclass{article}
\usepackage{tabstackengine,array}
\let\tC\tabbedCenterstack
\let\lU\tabbedLongunderstack
\setstacktabbedgap{.7ex}%
\setstackgap{L}{1.2\normalbaselineskip}
\stackMath
\setstackTAB{ }%
\begin{document}
\noindent Rewriting rules:
\begin{center}
\bgroup
\extrarowheight=4ex\relax
\catcode`#=12 %
\arraycolsep=1.5em\relax%
\catcode`@=\active %
\def@{}%
$\begin{array}{ccc}
\tC{# # \\S # \\# @ } \rightarrow \tC{# # \\a S \\S @ } &
\tC{@ # @\\a S #\\@ # @} \rightarrow \tC{@ # @\\a a #\\@ S @} \\
\tC{@ @ @\\# S S\\@ # @} \rightarrow \tC{@ @ @\\# a D\\@ S @} &
\tC{@ @ @\\a D S\\@ # @} \rightarrow \tC{@ @ @\\a a D\\@ S @} &
\tC{a # \\D # \\# @ } \rightarrow \tC{a # \\a # \\S @ } \\
\end{array}$
\egroup
\end{center}
\bigskip
A derivation example:
\begin{center}
\bgroup
\extrarowheight=4ex\relax
\catcode`#=12 %
\arraycolsep=1.5em\relax%
\catcode`@=\active %
\def@{}%
$\begin{array}{l}
S
\Rightarrow\lU{a S\\S @}
\Rightarrow\lU{a a S\\S S @}
\Rightarrow\lU{a a a S\\S S S @}
\Rightarrow\lU{a a a a\\S S S S}
\Rightarrow\lU{a a a a\\a D S S\\S @ @ @}
\Rightarrow\lU{a a a a\\a a D S\\S S @ @}\\
\phantom{S}
\Rightarrow\lU{a a a a\\a a a D\\S S S @}
\Rightarrow\lU{a a a a\\a a a a\\S S S S}
\Rightarrow\lU{a a a a\\a a a a\\a E S S}
\Rightarrow\lU{a a a a\\a a a a\\a a E S}
\Rightarrow\lU{a a a a\\a a a a\\a a a E}
\Rightarrow\lU{a a a a\\a a a a\\a a a a}
\end{array}$
\egroup
\end{center}
\end{document}