我正在使用 LaTeX 中的形式语法,为了节省空间,我想在同一行中编写一些较短的规则。规则使用环境进行对齐array
,我想定义某种可选列,以便正确对齐行中的规则和多个规则。
例子麦格:
\documentclass{article}
\begin{document}
\[\begin{array}{rl}
S \rightarrow& aaaaaABbbbbb | aaaaABbbbb | aaaABbbb | aaABbb | aABb | ab\\
A \rightarrow& aaCbb | aDb | ab, B \rightarrow aaEbb | aFb | ab\\
C \rightarrow& c, D \rightarrow d, E \rightarrow e, F \rightarrow f\\
\end{array}\]
\end{document}
我发现这个相关问题,但它似乎是一个相当丑陋的黑客并且很难自动应用,因为实际工作文档使用了比这个 MWE 更多的规则。
我也尝试嵌套数组但使用三个缩进的嵌套数组编译文件会产生损坏的 PDF,我无法查看或删除
答案1
您可以使用alignat
环境和以下\mathrlap
命令来执行此操作mathtools
:
\documentclass{article}
\usepackage{geometry}
\usepackage{mathtools}
\begin{document}
\begin{alignat*}{4}
S &\rightarrow \mathrlap{aaaaaABbbbbb | aaaaABbbbb | aaaABbbb | aaABbb | aABb | ab} \\
A &\rightarrow \mathrlap{aaCbb | aDb | ab,} & & &B &\rightarrow \mathrlap{aaEbb | aFb | ab} \\
C &\rightarrow c, &\hspace{3.25em} D & \rightarrow d, &\hspace{3.25em} E & \rightarrow e, &\hspace{3.25em} F & \rightarrow f \\
\end{alignat*}
\end{document}
答案2
我理解您的目的如下:第二行符号右侧的两个逗号分隔块&
应放置在宽度为第一行包含长块的单元格一半的单元格中,第三行中四个逗号分隔块中的每一个应放置在宽度为第二行单元格一半的单元格中。此外,所有块都应在各自的单元格中左对齐。
假设这种理解是正确的,您可以按照下面代码中的步骤进行操作,该代码使用一个tabularx
环境,其宽度是根据第一行中长块的宽度计算出来的。
\documentclass{article}
\newcommand\longchunk{$aaaaaABbbbbb | aaaaABbbbb | aaaABbbb | aaABbb | aABb | ab$}
\newlength\mylena
\settowidth{\mylena}{\longchunk} % save width of "\longchunk"
\newlength\mylenb
\settowidth\mylenb{$C\to$}
\newlength\mylenc
%%% Calculate width of tabularx environment
\addtolength\mylenc{\dimexpr\mylena+\mylenb+4\tabcolsep}
\usepackage{tabularx}
\begin{document}
\begin{center}
\setlength\tabcolsep\arraycolsep % (6pt-> 5pt)
\begin{tabularx}{\mylenc}{ >{$}r<{$} *{4}{>{$}X<{$}} }
S \to & \multicolumn{4}{l}{\longchunk}\\
A \to & \multicolumn{2}{l}{$aaCbb | aDb | ab,$} & \multicolumn{2}{l}{$B \to aaEbb | aFb | ab$}\\
C \to & c, & D\to d, & E\to e, & F\to f\\
\end{tabularx}
\end{center}
\end{document}
答案3
这是一个使用纯 TeX 的简单解决方案halign
- 有时您可以使用“旧”方法获得不错的解决方案。在这个特定情况下,我认为用字符分隔规则&
可以提供更直接的语义标记。
\documentclass{article}
\begin{document}
\[\vbox{\let\\\cr\openup4pt\halign{&\makebox[1in][l]{$#$}\\
S \to aaaaaABbbbbb \mid aaaaABbbbb \mid aaaABbbb \mid aaABbb \mid aABb \mid ab\\
A \to aaCbb \mid aDb \mid ab && B \to aaEbb \mid aFb \mid ab\\
C \to c & D \to d & E \to e & F \to f\\
}}\]
\end{document}
笔记
要将
halign
数学展示放在里面,最好将其包裹在垂直盒子中在里面
vbox
,我可以做一些局部定义:\let\\\cr
允许您继续使用\\
来结束行;\openup4pt
在对齐的每一行之间添加 4pt 的额外空间对齐的标题将每个“单元格”设置为一英寸左对齐水平框,而不管内容的实际宽度是多少。由于标题以 开头,因此
&
它会根据需要重复多次。所以我假设每行不会有太多单元格。表格主体的主要变化是移动字符,
&
使它们分隔每个单元格;请注意“A”和“B”规则之间有一个空白单元格。我还做了一些小的改进:我把所有
|
字符都改成了,这样它们的间距就更好了;为了节省空间\mid
,我使用了缩写形式\rightarrow
最后,关闭和
}}
后的左括号。\vbox
\halign