为什么对齐方程式在这里不起作用?

为什么对齐方程式在这里不起作用?
\documentclass{minimal}

\usepackage{amsmath}
\newcommand*{\op}[1]{\operatorname{#1}}

\begin{document}

\begin{align*}
    \noalign{$\quad \op{f} * \op{r} = \op{c}_{\op{f}*\op{r}} (x_1,...,x_k) = (\op{f}(a_1,...,a_k), \op{r}(b_1,...,b_k))$}
    &\text{if } x_i=(x^{\op{f}}_i,x^{\op{r}}_i), &\text{then } a_i=x^{\op{f}}_i \in \mathcal{S}, b_i=x^{\op{r}}_i \in (\mathcal{A}^*)^*, &1 \leq i \leq k\\
    &\text{if } x_i \in \mathcal{A}^*, &\text{then } a_i=b_i=x_i, &1 \leq i \leq k
\end{align*}

\end{document}

在此处输入图片描述

显然,“then”也应该对齐。我做错了什么?

我也尝试用aligned{alignat*}{2},但那里也不正确。

答案1

您需要使用双精度&&

在此处输入图片描述

原因是alignalignat环境都提供了对齐rl方程。因此,如果您想要一个l左对齐点,则需要跳过右r对齐点。

如果要控制列之间的间距,请使用,alignat在这种情况下您需要手动添加空间。这里我\quad为间距添加了一个:

在此处输入图片描述


根据评论中的要求,这里有一种替代用法,align可以确保最后两行的开头与=第一行的第一行对齐。

在此处输入图片描述

笔记:

  • 使用\phantom{{}={}}了 来确保最后两行与 右侧的文本对齐。中的=附加部分用于确保 周围应用了适当的间距。 我们也可以使用 来代替,但在这种情况下,两者都会产生相同的结果。{}\phantom=\hphantom{}
  • rlap这样做的目的是使得右侧不会影响后续行的对齐。

代码:

\documentclass{article}

\usepackage{amsmath}
\newcommand*{\op}[1]{\operatorname{#1}}

\begin{document}
\noindent
Using \verb|align|:
\begin{align*}
    \noalign{$\quad \op{f} * \op{r} = \op{c}_{\op{f}*\op{r}} (x_1,...,x_k) = (\op{f}(a_1,...,a_k), \op{r}(b_1,...,b_k))$}
    &\text{if } x_i=(x^{\op{f}}_i,x^{\op{r}}_i), &&\text{then } a_i=x^{\op{f}}_i \in \mathcal{S}, b_i=x^{\op{r}}_i \in (\mathcal{A}^*)^*, &&1 \leq i \leq k\\
    &\text{if } x_i \in \mathcal{A}^*, &&\text{then } a_i=b_i=x_i, &&1 \leq i \leq k
\end{align*}
Using \verb|alignat|:
\begin{alignat*}{3}
    \noalign{$\quad \op{f} * \op{r} = \op{c}_{\op{f}*\op{r}} (x_1,...,x_k) = (\op{f}(a_1,...,a_k), \op{r}(b_1,...,b_k))$}
    &\text{if } x_i=(x^{\op{f}}_i,x^{\op{r}}_i), &&\quad\text{then } a_i=x^{\op{f}}_i \in \mathcal{S}, b_i=x^{\op{r}}_i \in (\mathcal{A}^*)^*, &&\quad 1 \leq i \leq k\\
    &\text{if } x_i \in \mathcal{A}^*, &&\quad\text{then } a_i=b_i=x_i, &&\quad 1 \leq i \leq k
\end{alignat*}
\hrule\medskip\noindent
Alternate alignment with \verb|align|:
\begin{align*}
    \op{f} * \op{r} &= \op{c}_{\op{f}*\op{r}} (x_1,...,x_k) \rlap{${}= (\op{f}(a_1,...,a_k), \op{r}(b_1,...,b_k))$}\\
    &\phantom{{}={}}\text{if } x_i=(x^{\op{f}}_i,x^{\op{r}}_i), &&\text{then } a_i=x^{\op{f}}_i \in \mathcal{S}, b_i=x^{\op{r}}_i \in (\mathcal{A}^*)^*, &&1 \leq i \leq k\\
    &\phantom{{}={}}\text{if } x_i \in \mathcal{A}^*, &&\text{then } a_i=b_i=x_i, &&1 \leq i \leq k
\end{align*}
\end{document}

答案2

Peter Grill 已经回答了您关于 & 符号数量的基本问题。但是,我建议采用不同的方法,即引入一个aligned环境来包含第二行和第三行。然后可以使用封闭环境将此左侧与第一行对齐align。在等号右侧执行此操作是通过在= {}&该符号周围添加正确的间距来实现的。

\documentclass{article}

\usepackage{amsmath}

\begin{document}

Alignment to left of equals:
\begin{align*}
    f * r &=  c_{f*r} (x_1,...,x_k) = (f(a_1,...,a_k), r(b_1,...,b_k))\\
    &
    \begin{aligned}
      &\text{if } x_i=(x^f_i,x^r_i), &&\text{then } a_i=x^f_i
      \in \mathcal{S}, b_i=x^r_i \in (\mathcal{A}^*)^*,
        &1 \leq i \leq k,\\ 
      &\text{if } x_i \in \mathcal{A}^*, &&\text{then } a_i=b_i=x_i,
        &1 \leq i \leq k.
    \end{aligned}
\end{align*}

Alignment to right of equals:
\begin{align*}
    f * r = {}&  c_{f*r} (x_1,...,x_k) = (f(a_1,...,a_k), r(b_1,...,b_k))\\
    &
    \begin{aligned}
      &\text{if } x_i=(x^f_i,x^r_i), &&\text{then } a_i=x^f_i
      \in \mathcal{S}, b_i=x^r_i \in (\mathcal{A}^*)^*,
        &1 \leq i \leq k,\\ 
      &\text{if } x_i \in \mathcal{A}^*, &&\text{then } a_i=b_i=x_i,
        &1 \leq i \leq k.
    \end{aligned}
\end{align*}

\end{document}

示例输出

我利用对问题的评论来删除\op命令。

相关内容