使用 时enotez
,可以为尾注分配标签并引用它们。但是,我发现hyperref
链接到了意想不到的目标。
\documentclass{article}
\usepackage{expl3}
\usepackage[backref]{enotez}
\usepackage[hyperfootnotes=true]{hyperref}
\usepackage{cleveref}
\crefname{endnote}{endnote}{endnotes}
% This code by Andrew Swann (https://tex.stackexchange.com/questions/395662)
% makes \cref recognize counter `endnote`
\ExplSyntaxOn
\cs_set_protected:Npn \enotez_endnote_mark:n #1
{
\int_gincr:N \g__enotez_endnote_id_int
\quark_if_no_value:nTF {#1}
{
\refstepcounter {endnote}
\enotez_write_mark:xn
{ \int_use:N \g__enotez_endnote_id_int }
{ \theendnote }
}
{
\cs_gset:cpn {@currentlabel} {#1}
\enotez_write_mark:xn { \int_use:N \g__enotez_endnote_id_int } {#1}
}
\bool_if:NT \l__enotez_disable_bool
{
\int_gdecr:N \g__enotez_endnote_id_int
\addtocounter {endnote} {-1}
}
}
\ExplSyntaxOff
\begin{document}
This is an endnote with a labeldefinition inside the note.\endnote{Label in endnote\label{labelin}}
This endnote refers to the one with the labeldefinition inside.\endnote{See \cref{labelin}}
This is an endnote with a label defined after the note.\endnote{Label after endnote}\label{labelafter}
This endnote refers to the one with a following labeldefinition.\endnote{See \cref{labelafter}}
\newpage
\printendnotes
\end{document}
从图中可以看出,尾注2到尾注1的链接明显是错误的。似乎如果将标签放在里面\endnote{}
,它就会一直指向最后一个尾注。
尾注 4 中的链接乍一看似乎是正确的。但是,我以为链接会直接指向尾注 3(在第二页的“注释”下)。不幸的是,它指向了设置尾注的第 1 页。
有什么方法可以让我链接到尾注的实际文本而不是尾注定义?
答案1
如今,重新定义\enotez_endnote_mark:n
已经没有必要,但问题仍然存在:标签始终引用已重新步进的最后一个计数器。这种情况发生在标记生成时,而不是在注释列表中重复时。因此,实际上目标是非常可预期的。
enotez
使用自己的\hypertarget
s 创建指向列表的链接。它们可以被访问,并用于创建某种\label
/ \ref
,从而创建指向列表中位置的链接:
\documentclass{article}
\usepackage{enotez}
\usepackage{hyperref}
\setenotez{backref}
\ExplSyntaxOn
\prop_new:N \l_andreas_labels_prop
\cs_generate_variant:Nn \prop_item:Nn {Nx}
\NewDocumentCommand \endlabel {m} {
\prop_put:Nnx \l_andreas_labels_prop
{#1}
{ \int_use:N \g__enotez_endnote_id_int }
}
\NewDocumentCommand \endref {m} {
endnote \nobreakspace
\hyperlink
{ enz. \prop_item:Nn \l_andreas_labels_prop {#1} }
{
\prop_item:Nx \g__enotez_endnote_mark_prop
{ \prop_item:Nn \l_andreas_labels_prop {#1} }
}
}
\ExplSyntaxOff
\begin{document}
This is an endnote with a label defined after the note.\endnote{Label after
endnote.}\endlabel{labelafter} This endnote refers to the one with a
following label definition.\endnote{See \endref{labelafter}.}
\newpage
\printendnotes
\end{document}
上述代码的主要问题是它使用了内部变量\g__enotez_endnote_mark_prop
和\g__enotez_endnote_id_int
。我猜这两个变量都应该公开……