最小工作示例:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{align}
&s + t &\text{foo}\\
&\sin x &\text{bar}
\end{align}
\end{document}
这里,\sin
(或用 声明的任何其他运算符\DeclareMathOperator
)未与 对齐s
,它在 前面有一些空格。我知道数学运算符会插入一些空格,这样 就x \sin y
可以按预期工作,但由于这里 前面没有任何内容\sin
,所以我不认为这会适用。段落排版\noindent\(s + t\)\\\(\sin x\)
也可以按预期工作,那么为什么在 align 环境中使用时无法正确对齐?
答案1
由于问题已经回答了空格的原因。在某些情况下,定义为的宏\DeclareMathOperator
被定义为带有附加空格。\mathop
这里添加了一个空的数学普通原子,以获得二进制或关系符号的正确间距。和align
之间还添加了一个空格。\mathord
\mathop
\mathopen
在这种情况下,可以在 前面使用一个空字符来避免出现空格\sin
。TeX 不会在\mathord
和之间以及和\mathopen
之间插入空格:\mathopen
\mathop
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{align}
&s + t &\text{foo}\\
&\mathopen{}\sin x &\text{bar}
\end{align}
\end{document}
答案2
环境align
期望在 之后有一个关系符号&
作为对齐点,因此{}
在第二列(以及所有其他偶数列)的开头有一个隐式的。
这会带来一个不良后果,即如果后面跟有数学运算符&
,则会添加一个细小的空格,这是 TeX 的间距规则造成的:当数学运算符跟在普通原子后面时,会添加一个细小的空格,例如
$3\sin x$
结果是
3
<thin space>
罪<thin space>
X
解决方案:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{align}
&s + t &&\text{foo}\\
&\!\sin x &&\text{bar}
\end{align}
\end{document}
由于会自动添加一个细空格,根据上面解释的规则,它\!
会取消它,因为它与细空格完全相反。
注意&&
之前\text
,因此条件是左对齐。
以下是一组未添加自动空组的变体环境:
\documentclass{article}
\usepackage{amsmath,etoolbox}
\makeatletter
\newcommand{\patch@align@preamble}{\patchcmd{\align@preamble}{{}}{}{}{}}
\newenvironment{varalign}
{\patch@align@preamble\start@align\@ne\st@rredfalse\m@ne}
{\endalign}
\newenvironment{varalign*}
{\patch@align@preamble\start@align\@ne\st@rredtrue\m@ne}
{\endalign}
\newenvironment{varalignat}
{\patch@align@preamble\start@align\z@\st@rredfalse}
{\endalign}
\newenvironment{varalignat*}
{\patch@align@preamble\start@align\z@\st@rredtrue}
{\endalign}
\makeatother
\begin{document}
\begin{varalign}
&s + t &&\text{foo}\\
&\sin x &&\text{bar}
\end{varalign}
text in between
\begin{varalign*}
&s + t &&\text{foo}\\
&\sin x &&\text{bar}
\end{varalign*}
text in between
\begin{varalignat}{2}
&s + t\qquad &&\text{foo}\\
&\sin x &&\text{bar}
\end{varalignat}
text in between
\begin{varalignat*}{2}
&s + t\qquad &&\text{foo}\\
&\sin x &&\text{bar}
\end{varalignat*}
\end{document}