我想知道的是是否存在某种前言声明,允许我设置align
环境对齐的字符,而不必不断地输入与符号。
比如,如果我列出等式,我可以在序言中设置根据等号对齐所有内容吗?
答案1
这可能不是一个好主意,而且肯定会破坏一些东西,但你可以这样做
\documentclass{article}
\usepackage{amsmath}
\DeclareMathSymbol{\oldequals}{\mathrel}{operators}{`=}
\begin{document}
\begin{align}
a + b &= x\\
a + b + c &= x + y\\
c &= y
\end{align}
\catcode`\=\active
\def={&\oldequals}
\begin{align}
a + b = x\\
a + b + c = x + y\\
c = y
\end{align}
\end{document}
答案2
这不应该被太认真对待,但这是一个“通用解决方案”;我不知道它有多么强大。
\documentclass{article}
\usepackage{amsmath,xparse}
\ExplSyntaxOn
\NewDocumentCommand{\defaultalignmentchars}{m}
{
\seq_gset_split:Nnn \g_ben_align_chars_seq { , } { #1 }
}
\NewDocumentCommand{\notalignment}{m}
{
\use:c { __ben_saved_#1 }
}
\makeatletter
\NewDocumentEnvironment{alignatchars}{ o }
{
\IfValueTF{#1}
{
\seq_set_split:Nnn \l__ben_align_chars_seq { , } { #1 }
}
{
\seq_set_eq:NN \l__ben_align_chars_seq \g_ben_align_chars_seq
}
\ben_setup_alignment_chars:
\start@align\@ne\st@rredfalse\m@ne
}
{\endalign}
\makeatother
\seq_new:N \g_ben_align_chars_seq
\seq_new:N \l__ben_align_chars_seq
\cs_new_protected:Npn \ben_setup_alignment_chars:
{
\seq_map_inline:Nn \l__ben_align_chars_seq { \ben_setup_char:N ##1 }
}
\cs_new_protected:Npn \ben_setup_char:N #1
{
\token_if_mathchardef:NTF #1
{
\__ben_setup_cs:N #1
}
{
\__ben_setup_ch:N #1
}
}
\cs_new_protected:Npn \__ben_setup_cs:N #1
{
\cs_set:cpx { __ben_saved_ \cs_to_str:N #1 } { \mathchar\int_eval:n { #1 } \scan_stop: }
\cs_set:Npn #1 { & \use:c { __ben_saved_ \cs_to_str:N #1 } }
}
\cs_new_protected:Npn \__ben_setup_ch:N #1
{
\cs_set:cpx { __ben_saved_ #1 } { \mathchar\char_value_mathcode:n { `#1 } \scan_stop: }
\char_set_mathcode:nn { `#1 } { 32768 } % "8000
\__ben_redefine_ch:N #1
}
\group_begin:
\char_set_catcode_active:N \^^@
\cs_new:Npn \__ben_redefine_ch:N #1
{
\group_begin:
\char_set_lccode:nn { `^^@ } { `#1 }
\tl_to_lowercase:n { \group_end: \cs_set:Npn ^^@ } { & \use:c { __ben_saved_ #1 } }
}
\group_end:
\ExplSyntaxOff
\defaultalignmentchars{=,\le}
\begin{document}
\begin{align}
a + b &= x = t\\
a + b + c &= x + y\\
c &\le y \le z
\end{align}
\begin{alignatchars}
a + b = x \notalignment{=} t\\
a + b + c = x + y\\
c \le y \notalignment{le} z
\end{alignatchars}
\begin{alignatchars}[\le]
a + b = x\\
a + b + c = x + y\\
c \le y \notalignment{le} z
\end{alignatchars}
\end{document}
没有可选参数的环境alignatchars
使用用 声明的字符或控制序列作为对齐点\defaultalignmentchars
,它接受以逗号分隔的字符和控制序列列表(应该是简单的数学字符,例如\le
或\rightarrow
)。如果给出了可选参数,它应该是一个类似的列表,并且只有那些本地声明的字符或控制序列才会用于对齐。
如果声明的符号不应用于对齐,则可以将其用作参数\notalignment
(不带反斜杠),如示例中所示。
话虽如此,这是一个很好的练习,但我并不推荐使用它。&
输入中的是很适合查看需要对齐的位置。