\labelcref 不喜欢我的用户定义命令

\labelcref 不喜欢我的用户定义命令

我定义了自己的命令,允许我在带星号的多行方程环境中对单行进行编号和引用,而不是使用无星号的环境并\nonumber在每隔一行的末尾输入。命令如下:\newcommand{\TAG}[1]{\stepcounter{equation}\tag{\theequation}\label{#1}}

然后,我使用 用\labelcref单个命令引用多个方程。对于以“通常”方式(使用\label)标记的方程,该命令按预期工作;无论引用它们的顺序如何,它们始终按数字顺序打印。

\labelcref但是,当我使用 标记的方程式时,我遇到了问题\TAG。本质上,参考文献不再按数字顺序排列;通常的\label参考文献首先按数字顺序打印,然后\TAG按引用顺序打印任何参考文献。在打印 (x) 到 (y) 时labelcref也不包括\TAG方程式,即使它们是数字上的最后一个方程式。

我的 MWE 中的例子说明了我的意思。希望如此。

我宁愿使用一次命令,而不是\nonumber多次使用,尤其是在有很多行的环境中。我该如何让它工作?

\documentclass{article}
\usepackage{amsmath, amssymb, amsthm}
\usepackage{showlabels}
\usepackage{cleveref}
\usepackage{pifont}
\usepackage{fullpage}

\newcommand{\TAG}[1]{\stepcounter{equation}\tag{\theequation}\label{#1}}

\begin{document}

\begin{equation}\label{e:test1}
    y = x
\end{equation}
\begin{equation}\label{e:test2}
    y = x
\end{equation}
\begin{equation}\label{e:test3}
    y = x
\end{equation}
\begin{equation}\label{e:test4}
    y = x
\end{equation}
\verb+\labelcref+ gives `\labelcref{e:test3,e:test4,e:test2,e:test1}' no matter the order, because \verb+\label+ is used every time \ding{51}

\begin{align*}
    y &= x + x\\
    &= 2x\TAG{e:test5}
\end{align*}
\begin{equation}\label{e:test6}
    y = x
\end{equation}
\verb+\labelcref+ gives `\labelcref{e:test5,e:test6}' no matter the order, because test5 uses \verb+\TAG+ and so it always goes last \ding{55}

\begin{align*}
    y &= x + x\\
    &= 2x\TAG{e:test7}
\end{align*}
\begin{gather*}
    y = x + x\\
    \Rightarrow y = 2x\TAG{e:test8}
\end{gather*}
\verb+\labelcref{e:test8,e:test7}+ gives `\labelcref{e:test8,e:test7}', while \verb+\labelcref{e:test7,e:test8}+ gives `\labelcref{e:test7,e:test8}'; since both equations use \verb+\TAG+, the order of reference is printed \ding{55}

\begin{equation}\label{e:test9}
    y = x
\end{equation}
\begin{gather*}
    y = x + x\\
    \Rightarrow y = 2x\TAG{e:test10}
\end{gather*}
\begin{equation}\label{e:test11}
    y = x
\end{equation}
\verb+\labelcref+ gives `\labelcref{e:test9,e:test11,e:test10}' no matter the order; the two \verb+\label+ equations get printed first, in numerical order, and then the \verb+\TAG+ equation is printed last \ding{55}

\begin{equation}\label{e:test12}
    y = x
\end{equation}
\begin{equation}\label{e:test13}
    y = x
\end{equation}
\begin{equation}\label{e:test14}
    y = x
\end{equation}
\begin{gather*}
    y = x + x\\
    \Rightarrow y = 2x\TAG{e:test15}
\end{gather*}
\verb+\labelcref+ gives `\labelcref{e:test12,e:test14,e:test15,e:test13}' no matter the order; the \verb+\TAG+ equation doesn't get included in the `to' \ding{55}

\end{document}

答案1

交叉引用的基本工作原理如下:

\section诸如、等命令\subsection在内部调用名为 的宏\refstepcounter。此宏会增加关联的计数器,并重新定义名称以 开头的宏\@current...,例如 、\@currentlabel\@currentHref。这些宏的目的\@current...是始终保存属于\refstepcounter最后一个通过 增加计数器的分段项的一些数据。该命令\label将形式的条目放入\newlabel....aux 文件中,并在此使用这些宏的扩展\@current...来提供属于最后一个通过 增加计数器的分段项的数据\refstepcounter。在下一次 LaTeX 运行中,将从头读取 .aux 文件,并\r@<name of referencing label>从这些条目中定义宏\newlabel。引用命令诸如\ref依次扩展这些\r@<name of referencing label>宏并从扩展中提取它们所需的数据。

我在回答“如何防止在新环境中引用枚举?


cleveref 使用自己的机制,将用于内部目的所需的自己的引用标签的数据以条目形式写入 .aux 文件\newlabel

通常,该机制确保(在其他事物之下)通过作为最后一个递增的计数器的值\refstepcounter“被放入宏的定义中”,\cref@currentlabel而该宏又被 cleveref 包用于\newlabel将用于内部目的的条目写入 .aux 文件。

因此 cleveref 需要处理没有关联计数器的情况。默认情况下,在align*和等环境中就是这种情况gather*。在这样的环境中,cleveref 重新定义宏\make@df@tag@@\make@df@tag@@@,它们在内部由 amsmath 的\tag-command 调用,这会导致 cleveref\cref@currentlabel提供一个默认值,这会导致 cleveref 在执行 之类的操作时\labelcref,在为相同类型的引用范围形成/计算短语时以特殊方式处理该引用。

当您查看编译示例生成的 .aux 文件时,您会发现以下内容:

\relax 
\newlabel{e:test1}{{1}{1}}
\newlabel{e:test1@cref}{{[equation][1][]1}{[1][1][]1}}
\newlabel{e:test2}{{2}{1}}
\newlabel{e:test2@cref}{{[equation][2][]2}{[1][1][]1}}
\newlabel{e:test3}{{3}{1}}
\newlabel{e:test3@cref}{{[equation][3][]3}{[1][1][]1}}
\newlabel{e:test4}{{4}{1}}
\newlabel{e:test4@cref}{{[equation][4][]4}{[1][1][]1}}
\newlabel{e:test5}{{{5}}{1}}
\newlabel{e:test5@cref}{{[equation][2147483647][]{5}}{[1][1][]1}}
\newlabel{e:test6}{{6}{1}}
\newlabel{e:test6@cref}{{[equation][6][]6}{[1][1][]1}}
\newlabel{e:test7}{{{7}}{1}}
\newlabel{e:test7@cref}{{[equation][2147483647][]{7}}{[1][1][]1}}
\newlabel{e:test8}{{{8}}{1}}
\newlabel{e:test8@cref}{{[equation][2147483647][]{8}}{[1][1][]1}}
\newlabel{e:test9}{{9}{1}}
\newlabel{e:test9@cref}{{[equation][9][]9}{[1][1][]1}}
\newlabel{e:test10}{{{10}}{1}}
\newlabel{e:test10@cref}{{[equation][2147483647][]{10}}{[1][1][]1}}
\newlabel{e:test11}{{11}{1}}
\newlabel{e:test11@cref}{{[equation][11][]11}{[1][1][]1}}
\newlabel{e:test12}{{12}{1}}
\newlabel{e:test12@cref}{{[equation][12][]12}{[1][1][]1}}
\newlabel{e:test13}{{13}{1}}
\newlabel{e:test13@cref}{{[equation][13][]13}{[1][1][]1}}
\newlabel{e:test14}{{14}{1}}
\newlabel{e:test14@cref}{{[equation][14][]14}{[1][1][]1}}
\newlabel{e:test15}{{{15}}{1}}
\newlabel{e:test15@cref}{{[equation][2147483647][]{15}}{[1][1][]1}}

参赛作品

\newlabel{e:test5@cref}{{[equation][2147483647][]{5}}{[1][1][]1}}
\newlabel{e:test7@cref}{{[equation][2147483647][]{7}}{[1][1][]1}}
\newlabel{e:test8@cref}{{[equation][2147483647][]{8}}{[1][1][]1}}
\newlabel{e:test10@cref}{{[equation][2147483647][]{10}}{[1][1][]1}}
\newlabel{e:test15@cref}{{[equation][2147483647][]{15}}{[1][1][]1}}

align*在您的场景中肯定是正确的(在像和这样的环境中,gather*您希望与方程式计数器关联,而不是没有关联的计数器),它们来自于在环境和\tag中执行-command时cleveref所做的事情。align*gather*

\cref@currentlabel您可以通过重新定义这些宏来解决这个问题,使它们以与“方程”类型的引用相同的方式传递数据。

也许是这样的:

\documentclass{article}
\usepackage{amsmath, amssymb, amsthm}
%\usepackage{showlabels}
%\usepackage{hyperref}
\usepackage{cleveref}
\usepackage{pifont}
\usepackage{fullpage}

\makeatletter
\newcommand*\my@make@df@tag@@[1]{%
  \cref@old@make@df@tag@@{#1}%
  \let\cref@old@df@tag\df@tag
  \expandafter\gdef\expandafter\df@tag\expandafter{%
    \cref@old@df@tag
    \def\cref@currentlabel{%
      [equation][\theequation][]#1%
    }%
  }%
}%
\newcommand*\my@make@df@tag@@@[1]{%
  \cref@old@make@df@tag@@@{#1}%
  \let\cref@old@df@tag\df@tag
  \expandafter\gdef\expandafter\df@tag\expandafter{%
    \cref@old@df@tag
    \toks@\@xp{\p@equation{#1}}%
    \edef\cref@currentlabel{[equation][\theequation][]\the\toks@}%
  }%
}%
\newcommand{\TAG}[1]{%
  \refstepcounter{equation}%
  \begingroup
  \let\make@df@tag@@\my@make@df@tag@@
  \let\make@df@tag@@@\my@make@df@tag@@@
  \tag{\theequation}%
  \endgroup
  \label{#1}%
}%
\makeatother

\begin{document}

\begin{equation}\label{e:test1}
    y = x
\end{equation}
\begin{equation}\label{e:test2}
    y = x
\end{equation}
\begin{equation}\label{e:test3}
    y = x
\end{equation}
\begin{equation}\label{e:test4}
    y = x
\end{equation}
\verb+\labelcref{e:test3,e:test4,e:test2,e:test1}+ yields `\labelcref{e:test3,e:test4,e:test2,e:test1}' \ding{51}

\begin{align*}
    y &= x + x\\
    &= 2x\TAG{e:test5}
\end{align*}
\begin{equation}\label{e:test6}
    y = x
\end{equation}
\verb+\labelcref{e:test5,e:test6}+ yields `\labelcref{e:test5,e:test6}' \ding{51}

\begin{align*}
    y &= x + x\\
    &= 2x\TAG{e:test7}
\end{align*}
\begin{gather*}
    y = x + x\\
    \Rightarrow y = 2x\TAG{e:test8}
\end{gather*}
\verb+\labelcref{e:test8,e:test7}+ yields `\labelcref{e:test8,e:test7}', while \verb+\labelcref{e:test7,e:test8}+ yields `\labelcref{e:test7,e:test8}' \ding{51}

\begin{equation}\label{e:test9}
    y = x
\end{equation}
\begin{gather*}
    y = x + x\\
    \Rightarrow y = 2x\TAG{e:test10}
\end{gather*}
\begin{equation}\label{e:test11}
    y = x
\end{equation}
\verb+\labelcref{e:test9,e:test11,e:test10}+ yields `\labelcref{e:test9,e:test11,e:test10}' \ding{51}

\begin{equation}\label{e:test12}
    y = x
\end{equation}
\begin{equation}\label{e:test13}
    y = x
\end{equation}
\begin{equation}\label{e:test14}
    y = x
\end{equation}
\begin{gather*}
    y = x + x\\
    \Rightarrow y = 2x\TAG{e:test15}
\end{gather*}
\verb+\labelcref{e:test12,e:test14,e:test15,e:test13}+ yields `\labelcref{e:test12,e:test14,e:test15,e:test13}' \ding{51}

\begin{verbatim}
\labelcref{e:test1,e:test2,e:test3,e:test4,e:test5,e:test6,e:test7,%
           e:test8,e:test9,e:test10,e:test11,e:test12,e:test13,e:test14,e:test15}
\end{verbatim}
yields 
`\labelcref{e:test1,e:test2,e:test3,e:test4,e:test5,e:test6,e:test7,%
            e:test8,e:test9,e:test10,e:test11,e:test12,e:test13,e:test14,e:test15}' \ding{51}

\end{document}

在此处输入图片描述

答案2

[这确实是一条评论,但我没有所需的声誉。]

Ulrich Diez 的回答在正文中对我来说非常完美——谢谢!但我在附录中遇到了一些问题,例如无法将许多引用压缩到一个范围内。并且重新定义\theequation为非数字,例如\renewcommand{\theequation}{\Alph{equation}},会导致编译错误。

使固定:我相信将两个实例更改为[equation][\theequation][]可以[equation][\arabic{equation}][\cref@result]解决这两个问题。

  • 更改[][\cref@result]可修复排序问题。
  • 更改\theequation\arabic{equation}可解决因重新定义 而导致的问题\theequation

相关内容