![数学模式下的混合垂直对齐](https://linux22.com/image/239620/%E6%95%B0%E5%AD%A6%E6%A8%A1%E5%BC%8F%E4%B8%8B%E7%9A%84%E6%B7%B7%E5%90%88%E5%9E%82%E7%9B%B4%E5%AF%B9%E9%BD%90.png)
我想介绍以下主要在数学模式下的内容:
Label1...
name1 ::= choice11... comment11.
| choice12.. comment12..
| chocie13. comment13...
Label2..
name2.. ::= choice21... comment21.
| choice22.. comment22..
| choice23. comment23...
所以我希望所有的labels
都左对齐,并且所有的comments
都左对齐。... ::= ...
和| ...
的位置使得=
和|
对齐。
有人能告诉我如何实现这一点吗?非常感谢!
答案1
\documentclass{article}
\begin{document}
\(
\begin{array}{llcll}
\multicolumn{3}{l}{label1}\\
&name1& ::=& 1+1& \textsf{one plus one}\\
&& | & 2\times 2& \textsf{two times two}\\
&& | & 3^3 & \textsf{three raised to the power of three}\\
\multicolumn{3}{l}{label2}\\
&name2& ::=& choice2 & \textsf{foo}\\
&& | & choice2 & \textsf{bar}\\
&& | & choice3 & \textsf{qux}\\
\end{array}
\)
\end{document}
答案2
这amsmath
包裹提供命令\intertext{...}
,将其参数排版为左对齐,同时仍保留后续的数学对齐。从包装文档:
该命令
\intertext
用于在多行显示结构中间短暂插入一行或两行文本...其显著特点是保留对齐,如果您只是结束显示然后随后重新启动它,则不会发生这种情况。\intertext
可能仅出现在\\
或\\*
命令之后。
\intertext{...}
在环境中不起作用array
。我align*
在这里使用环境(以抑制方程编号):
\documentclass[10pt]{article}
\usepackage[showframe]{geometry}% Show page layout frames
\usepackage{calc}% For width calculations
\usepackage{amsmath}
\begin{document}
\newcommand*{\also}[1][|]{\makebox[\widthof{$=$}][c]{$#1$}}%
\begin{align*}
\intertext{Label 1.}% Text flush left
X_{\text{long subscript}} ::=&\ 1 &&\text{This is} \\
|&\ 2+3 && \text{a comment on the numbers that} \\
|&\ 4+5\times 6 &&\text{stretch on forever.} \\
\intertext{Label 2..}% Text flush left
\text{name2..} ::=&\ choice21... && \text{Here are some more comments} \\
\also&\ choice22.. && \text{that describe the numbers} \\
\also&\ \textstyle 1+3+5!+\binom{n}{n-1} && \text{in detail.}
\end{align*}
\end{document}
=
由于您对和之间的水平对齐感兴趣|
,我创建了一个新命令\also[<operator>]
,您可以使用它来居中可选的<operator>
(默认为|
)。第一个块没有使用\also
,而第二个块使用了 ,对齐了这两个运算符。使用geometry
包裹仅显示文本块内的水平对齐。
答案3
下面是一个简单的版本:
\def\mylabel#1{\noalign{\hbox{#1}}}
\def\mymid{\setbox0\hbox{$=$}\mathrel{\hbox to\wd0{\hfil$|$\hfil}}}
\catcode`@=11
\def\myalign#1{\displ@y\ialign{\strut\qquad
\@lign\hfil$\m@th\displaystyle##$&
\@lign$\m@th\displaystyle##$\hfil&
\@lign\qquad\ignorespaces##\ignorespaces\hfil\crcr
#1}}
\catcode`@=12
$$\myalign{
\mylabel{Label1...}
name1 ::&= choice11... & comment11. \cr
&\mymid choice 12.. & comment12.. \cr
&\mymid choice 13. & comment13...\cr
\mylabel{Label2..}
name2.. ::&= choice21... & comment21. \cr
&\mymid choice22.. & comment22.. \cr
&\mymid choice23. & comment23...\cr
}$$
\bye
答案4
这就是你要找的东西吗?第二种解决方案使用包newcolumnstype
中的 sarray
使表格定义更易于阅读。
\documentclass{article}
\usepackage[fleqn]{amsmath}
\usepackage{booktabs}
\usepackage{array}
\newcolumntype{L}{>{\begin{math}}l<{\end{math}}}%
\newcolumntype{R}{>{\begin{math}}r<{\end{math}}}%
\begin{document}
\[
\begin{array}{llr@{}llll}
\multicolumn{2}{l}{\text{Label1...}}\\
&name1 &::= &\,choice11... &comment11.\\
& &| &\,choice12.. &comment12..\\
& &| &\,chocie13. &comment13...\\
%
\multicolumn{2}{l}{\text{Label2...}}\\
&name2.. &::= &\,choice21... &comment21.\\
& &| &\,choice22.. &comment22..\\
& &| &\,choice23. &comment23...
\end{array}
\]
If it is desired that the label be flushleft, then can use the following
\begin{tabular}{lLR@{}LLLL}
\multicolumn{2}{l}{\text{Label1...}}\\
&name1 &::= &\,choice11... &comment11.\\
& &| &\,choice12.. &comment12..\\
& &| &\,chocie13. &comment13...\\
%
\multicolumn{2}{l}{\text{Label2...}}\\
&name2.. &::= &\,choice21... &comment21.\\
& &| &\,choice22.. &comment22..\\
& &| &\,choice23. &comment23...
\end{tabular}
\end{document}