对“LaTeX3”的整数和“LaTeX2e”的计数器并行应用的处理会产生不同的结果

对“LaTeX3”的整数和“LaTeX2e”的计数器并行应用的处理会产生不同的结果

我正在尝试给出一个expl3赋予我的答案我的问题:当多行公式中间出现分页符时添加边注

LaTeX3在此过程中,我注意到对 的整数和的计数器并行应用某些处理的结果存在差异LaTeX2e:下面的最小化示例显示,尽管处理是并行的,但标签会影响环境的每一行align

  • 0从用计数器构建的标签开始LaTeX2
  • n从用整数构建的标签开始LaTeX3n即环境中标记行的数量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

相关内容