我正在尝试给出一个expl3
赋予我的答案我的问题:当多行公式中间出现分页符时添加边注。
LaTeX3
在此过程中,我注意到对 的整数和的计数器并行应用某些处理的结果存在差异LaTeX2e
:下面的最小化示例显示,尽管处理是并行的,但标签会影响环境的每一行align
:
0
从用计数器构建的标签开始LaTeX2
,n
从用整数构建的标签开始LaTeX3
(n
即环境中标记行的数量align
),
该.aux
文件包含:
\relax
\newlabel{LaTeX2-counter-line-1}{{}{1}}
\newlabel{LaTeX3-integer-line-4}{{}{1}}
\newlabel{LaTeX2-counter-line-2}{{}{1}}
\newlabel{LaTeX3-integer-line-5}{{}{1}}
\newlabel{LaTeX2-counter-line-3}{{}{1}}
\newlabel{LaTeX3-integer-line-6}{{}{1}}
你知道发生了什么吗?
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse,environ}
\ExplSyntaxOn
\makeatletter
% Each line of the `align' environment will have a unique number.
\newcounter{line@of@align}
\int_new:N \g_line_of_align_int
% Save the original `align' environment.
\cs_set_eq:cc {db_align_start:} {align}
\cs_set_eq:cc {db_align_end:} {endalign}
\NewDocumentEnvironment{amsmathalign}{}
{\db_align_start:}
{\db_align_end:}
% Redefine it.
\RenewEnviron{align}
{
\db_patch:nV {align} \BODY
}
\seq_new:N \l_db_patch_seq
\cs_new_protected:Nn \db_patch:nn
{
%
\seq_set_split:Nnn \l_db_patch_seq { \\ } { #2 }
\begin{amsmathalign}
\seq_use:Nnnn \l_db_patch_seq { \db@patch } { \db@patch } { \db@patch } \hfill
\end{amsmathalign}
}
\cs_generate_variant:Nn \db_patch:nn { nV }
\NewDocumentCommand{\db@patch}{so}{%
\IfValueTF{#2}{%
\IfBooleanTF{#1}{\\*[#2]}{\\[#2]}%
}{%
\IfBooleanTF{#1}{\\*}{\\}
}%
% We increment the number of the current line.
\stepcounter{line@of@align}%
\int_gincr:N \g_line_of_align_int
% We set the labels of the current line.
\ltx@label{ LaTeX2-counter-line-\theline@of@align }%
\ltx@label{ LaTeX3-integer-line-\int_use:N \g_line_of_align_int }%
}
\makeatother
\ExplSyntaxOff
\begin{document}
\begin{align}
1 + 1 & = 2 \\
2 + 1 & = 3 \\
3 + 1 & = 4 \\
4 + 1 & = 5
\end{align}
\end{document}
答案1
AMS 对齐设置了两次,一次是在“测量”过程中,然后再次进行排版。它知道所有 LaTeX2e 计数器(使用 LaTeX 用于重置计数器的基础结构,因此所有计数器在测量后都会恢复,但它不知道 expl3 分配,因此这些计数器在两次传递中都会增加。您会看到与其他一些环境\include
类似的情况。tabularx
也许最简单的解决方法是使用计数寄存器的混合分配
%\int_new:N \g_line_of_align_int
\newcounter{g_line_of_align_int}
\cs_set_eq:NN\g_line_of_align_int\c@g_line_of_align_int
生产
\relax
\newlabel{LaTeX2-counter-line-1}{{}{1}}
\newlabel{LaTeX3-integer-line-1}{{}{1}}
\newlabel{LaTeX2-counter-line-2}{{}{1}}
\newlabel{LaTeX3-integer-line-2}{{}{1}}
\newlabel{LaTeX2-counter-line-3}{{}{1}}
\newlabel{LaTeX3-integer-line-3}{{}{1}}
双重分配是解决这个问题的一般方法,但对于 AMS 对齐的具体情况,与其确保计数器重置,不如只增加一次,这样
\ifmeasuring@\else % do nothing on first pass
\stepcounter{line@of@align}%
\int_gincr:N \g_line_of_align_int
% We set the labels of the current line.
\ltx@label{ LaTeX2-counter-line-\theline@of@align }%
\ltx@label{ LaTeX3-integer-line-\int_use:N \g_line_of_align_int
\fi