我定义了自己的命令,允许我在带星号的多行方程环境中对单行进行编号和引用,而不是使用无星号的环境并\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
。