阻止自定义计数器在 align* 环境中增加两次

阻止自定义计数器在 align* 环境中增加两次

我花了几个小时才找到原因,部分原因是我对 TeX 还不熟悉。我想了解为什么eqpart 以下代码中的自定义计数器在使用时无法正确递增mathclap。计数器从 a 跳到 d。第一个等式只有正确的计数器,因为它没有包含在 中。从 中mathclap删除会给出正确的计数,即 b。mathclapubrace

\documentclass[10pt]{article}

\usepackage{unicode-math}
\usepackage{mathtools}
\usepackage{xcolor}

\newcounter{eqpart}[section]
\setcounter{eqpart}{0}
\renewcommand{\theeqpart}{\alph{eqpart}}

\newcommand*{\ubrace}[3][black]{
\colorlet{current}{.}
\color{#1}
\underbrace{#2}_{ \mathclap{ #3 } }
\color{current}
}

\makeatletter
\newcommand{\tageqpart}[1]{%
\ifmeasuring@\else
\refstepcounter{eqpart}
\displaystyle(\theeqpart)
\fi
\@bsphack
\protected@write\@auxout{}
{\string\newlabel{#1}{{(\theeqpart)}{\thepage}}}
\@esphack
}
\makeatother

\begin{document}
  \begin{align*}
    \underbrace{x + y}_{ \tageqpart{test1} } = 0
  \end{align*}
  \begin{align*}
    \ubrace{x + z}{\tageqpart{test2}} = 0
  \end{align*}
\end{document}

编辑:根据 David Carlisle 的建议,我将命令改进\ubrace如下:

\newcommand*{\ubrace}[3][black]{
  \begingroup
    \color{#1}
    \overbrace{#2}^{#3}
  \endgroup
}

答案1

我建议你

  • 替换\mathclap{#3}\makebox[0pt]{$#3$}——后一种方法不会干扰计数器eqpart;(另外:该\mathclap方法在通过自动调整结果大小方面可能具有的任何“优势”\mathchoice都是虚幻的,因为无论如何都会根据代码的后续部分#3进行设置。)\displaystyle

  • 在 的定义中添加括号\theeqpart,简化一些涉及 的后续代码\theeqpart

  • 应用 David Carlisle 的建议,用and包围\ubrace宏的实质性指令——让您摆脱and指令。\begingroup\endgroup\colorlet{current}{.}\color{current}

在此处输入图片描述

% !TEX TS-program = xelatex
\documentclass[10pt]{article}

\usepackage{unicode-math}
\usepackage{mathtools}
\usepackage{xcolor}

\newcounter{eqpart}[section]
\setcounter{eqpart}{0}
\renewcommand{\theeqpart}{(\alph{eqpart})}

\newcommand*{\ubrace}[3][black]{%
   \begingroup
   \color{#1}
   \underbrace{#2}_{ \makebox[0pt]{$#3$} }
   \endgroup
}
\makeatletter
\newcommand{\tageqpart}[1]{%
  \ifmeasuring@\else
     \refstepcounter{eqpart}
     \displaystyle\theeqpart
  \fi
  \@bsphack
  \protected@write\@auxout{}
    {\string\newlabel{#1}{\theeqpart\thepage}}
  \@esphack
}
\makeatother

\begin{document}
  \begin{align*}
    \underbrace{x + y}_{ \tageqpart{test1} } &= 0\\
    \ubrace{x + z}{ \tageqpart{test2} }      &= 0
    \end{align*}
\end{document}

相关内容