enotez 尾注的超链接有意外目标

enotez 尾注的超链接有意外目标

使用 时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 和 4 中的引用有误

从图中可以看出,尾注2到尾注1的链接明显是错误的。似乎如果将标签放在里面\endnote{},它就会一直指向最后一个尾注。

尾注 4 中的链接乍一看似乎是正确的。但是,我以为链接会直接指向尾注 3(在第二页的“注释”下)。不幸的是,它指向了设置尾注的第 1 页。

有什么方法可以让我链接到尾注的实际文本而不是尾注定义?

答案1

如今,重新定义\enotez_endnote_mark:n已经没有必要,但问题仍然存在:标签始终引用已重新步进的最后一个计数器。这种情况发生在标记生成时,而不是在注释列表中重复时。因此,实际上目标是非常可预期的。

enotez使用自己的\hypertargets 创建指向列表的链接。它们可以被访问,并用于创建某种\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。我猜这两个变量都应该公开……

相关内容