我正在尝试弄清楚是否有可能在 amsmath 的 align 环境中(本地)重新定义 \\(双反斜杠)。一方面,我希望能够动态插入额外的列,另一方面,我希望操纵间距。这是一个不起作用的示例:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{align*}
\renewcommand{\\}{& x \\[1cm]}%
1 \\
2 \\
3
\end{align*}
\end{document}
调整后的 \\ 在第一行处于活动状态,但之后似乎被重置,因此输出为
1x
2
3
在第一行之后再次重新定义该命令会使其在第二行之后生效,但在第二行之后再次停止工作。
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{align*}
\renewcommand{\\}{& x \\[1cm]}%
1 \\ \renewcommand{\\}{& x \\[1cm]}%
2 \\
3 \\
4
\end{align*}
\end{document}
类似地,如果我首先存储原始的 \\ 并在重新定义中使用它
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\let\mylb\\
\begin{align*}
\renewcommand{\\}{& x \mylb[1cm]}%
1 \\
2 \\
3 \\
4
\end{align*}
\end{document}
结果并不像我所希望的那样,因为这似乎只是吞噬了换行符:
1x2
3
4
有什么办法可以实现我在这里尝试的目标吗?
答案1
环境align
(带或不带星号)通过表(TeX 基元)内部实现\halign
。每个单元格位于一个组内。因此单元格之后的局部定义会丢失。
此外,我也不想\\
通过全局定义来搞乱。方程式也可能出现在其他环境(center
、flushleft
、...)中,这些环境也会\\
进行局部重新定义。全局重新定义会破坏此类环境之后重新建立的先前含义。
以下示例通过使用不同的命令名称解决了该问题。全局重新定义在新行开始之前\NL
完成。\noalign
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\gdef\NL{\\}
\begin{align*}
a\NL
b\NL
\noalign{\gdef\NL{& x \\[1cm]}}%
1 \NL
2 \NL
3 \NL
\noalign{\gdef\NL{\\}}%
c \NL
d
\end{align*}
\end{document}
答案2
只是为了完整性。Heiko 指向 halign 的指针可以实现我想要的效果。以下是简短的代码片段。
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begingroup
\let\myhalign\halign
\def\halign{%
\let\mylb\\
\renewcommand{\\}{& x \mylb[1cm]}
\myhalign
}
\begin{align*}
1 \\
2 \\
3
\end{align*}
\endgroup
\begin{align*}
1 \\
2 \\
3
\end{align*}
\end{document}
在这里,我可以重新定义第一个对齐的 \\,而无需更改其他对齐。上面的输出是:
1x
2x
3
1
2
3