![阻止自定义计数器在 align* 环境中增加两次](https://linux22.com/image/303707/%E9%98%BB%E6%AD%A2%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A1%E6%95%B0%E5%99%A8%E5%9C%A8%20align*%20%E7%8E%AF%E5%A2%83%E4%B8%AD%E5%A2%9E%E5%8A%A0%E4%B8%A4%E6%AC%A1.png)
我花了几个小时才找到原因,部分原因是我对 TeX 还不熟悉。我想了解为什么eqpart
以下代码中的自定义计数器在使用时无法正确递增mathclap
。计数器从 a 跳到 d。第一个等式只有正确的计数器,因为它没有包含在 中。从 中mathclap
删除会给出正确的计数,即 b。mathclap
ubrace
\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}