可靠地将标签添加到当前部分,即使标签没有放在部分名称之后

可靠地将标签添加到当前部分,即使标签没有放在部分名称之后

我有一个包,想放置对某个部分的引用。该包无法将标签放在部分标题后面,因此目前它只会删除\label{sec:mysection}。问题是,如果之前定义了一个方程,那么(使用\autoref{sec:mysection})标签指向前一个方程,而不是该部分。

使用\cref{sec:mysection}解决了问题的一部分:文本没有问题,但链接仍然指向方程式。有什么办法可以解决这个问题吗?

任何想法?

谢谢!

在此处输入图片描述

梅威瑟:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}

\usepackage{hyperref}
\usepackage{cleveref}

\begin{document}

\section{My section}

With autoref, the name is bad, and the link is bad: \autoref{section:shouldbeappendixA}.\\
With cleverref, the name is good, but the link is bad: \cref{section:shouldbeappendixA}.

\appendix
\section{Proofs}
Here is my appendix
\vspace{3cm}
\begin{equation}
  1+1=2
\end{equation}
\vspace{3cm}\\
I would like this label to point to the heading of the current section, not to the last equation I wrote\label{section:shouldbeappendixA}. But I don't want to move the label code, because it's inserted automatically by a script.

\end{document}

编辑 2021:原始问题的解释

为了澄清我遇到的原始问题,我写道这个图书馆允许用户在附录中移动证明。基本上,用户编写如下代码:

\section{My section A}
\begin{thmE}[Title][end,category=sectionA]
  My first theorem
\end{thmE}
\begin{proofE}
  My first proof
\end{proofE}

\section{My section B}
\begin{thmE}[Title][end,category=sectionB]
  My second theorem
\end{thmE}
\begin{proofE}
  My second proof
\end{proofE}

\section{Appendix: proof of section A}
Here are the proofs of section A:
\printProofs[sectionA]

\section{Appendix: proof of section B}
Here are the proofs of section B:
\printProofs[sectionB]

那么最终的输出将是:

在此处输入图片描述

在内部,库为每个类别(即证明组)创建一个文件。此文件稍后通过 包含\printProof[nameCategory],将包含此类别中每个证明的内容,如下所示:

\label{proofsection:prAtEndii}
\begin{proof}[Proof of \autoref{thm:prAtEndii}]\phantomsection\label{proof:prAtEndii}
  My first proof
\end{proof}

因此,如果我的类别中有 2 个库,则包含的代码将是:

\label{proofsection:prAtEndii}
\begin{proof}[Proof of \autoref{thm:prAtEndii}]\phantomsection\label{proof:prAtEndii}
  My first proof
\end{proof}
\label{proofsection:prAtEndiii}
\begin{proof}[Proof of \autoref{thm:prAtEndiii}]\phantomsection\label{proof:prAtEndiii}
  My third proof
\end{proof}

\autoref{proofsection:prAtEndii}然后,通过写定理或写定理之后立即链接到包含证明的部分\cref{proofsection:prAtEndii}。问题是标签proofsection:prAtEndii可能不真正指向第一部分,因为它不会写在该部分之后(proofsection:prAtEndiii上例中的标签就是这种情况)。

一种解决方案可能是创建另一个内部仅包含标签的文件,例如\label{proofsection:prAtEndii}\label{proofsection:prAtEndiii},创建另一个函数,例如\addLabelToSection[nameOfCategory],并要求用户通过类似以下方式将其包含在附录部分:

\section{Appendix: proof of section A}
\addLabelToSection[sectionA]
Here are the proofs of section A:
\printProofs[sectionA]

但我不太喜欢这种方法,因为用户必须编写两个命令来打印校样,而不是一个。此外,如果他们在某个时候更改了类别的名称,同时忘记在命令中替换名称\addLabelToSection,那么引用将会丢失,产生神秘的错误,例如Can't find label proofsection:prAtEndii……这对用户来说不是一个好的体验。有没有办法摆脱这个负担?

答案1

这是一条扩展评论,其中包含一个想法,供您参考做;我没有时间为你编写代码,但你似乎对 TeX 很熟练。

这个想法基本上就是要钩住它\label所做的事情:它.aux根据 的值将某些内容打印到文件中\@currentlabel,该值由 设定,\refstepcounter它本身被\section或许多环境隐式调用,并被围绕此类事物的包修改(例如\hyperref)。因此,您要做的就是\@currentlabel偷偷地交换 的值。

其中一种方法是使用\section类似的东西进行修补(未经测试,仅用于说明概念,可能有错误)

\let\old@tobias@section\section
\renewcommand\section[1]{\old@tobias@section{#1}\let\tobias@stored@label\@currentlabel}

然后,当您生成proof各个部分并准备打印时,请执行以下操作:

\let\@currentlabel\tobias@stored@label
\label{proofsection:...}

因此,当您进行标记时,实际上会调用最近存储的部分标签。


上面的代码不会像写的那样完美地工作,因为你还必须处理\thepage构造标签时使用的代码(参见\@currentlabel 如何工作?它如何连接到分段命令/标题?)。

LaTeX 的设计\label目的实际上是将标签准确地放在源代码中,并带有最近\refstep编辑的计数器。解决后者的问题相对容易;你可以作弊通过\refstep自己输入适当的计数器或者像上面建议的那样乱搞\@currentlabel。说服 LaTeX 你的标签确实不想出现在你放置它的地方,而是出现在其他页面的其他地方,这将需要更多的工作,并且可以与其他 ref 包进行有趣的交互(例如超链接)。

相关内容