数学模式下的混合垂直对齐

数学模式下的混合垂直对齐

我想介绍以下主要在数学模式下的内容:

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}

将 AMSmath 中的 Align* 环境与 \intertext 对齐

=由于您对和之间的水平对齐感兴趣|,我创建了一个新命令\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}

相关内容