![为什么对齐方程式在这里不起作用?](https://linux22.com/image/258766/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%AF%B9%E9%BD%90%E6%96%B9%E7%A8%8B%E5%BC%8F%E5%9C%A8%E8%BF%99%E9%87%8C%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
\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
您需要使用双精度&&
:
原因是align
和alignat
环境都提供了对对齐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
命令。