带有多个数字/标记的脚注超​​链接

带有多个数字/标记的脚注超​​链接

这个答案,我创建了两个命令\footnotenumber和,\multifootnote用于编写带有多个数字的脚注。这些命令的问题是超链接不能像通常的脚注那样工作:例如,如果您单击下面代码生成的文档中的红色方框“1”,则不会发生任何事情。

我尝试在这些命令中使用\hyperlink和,\hypertarget但没有成功。对我来说,困难在于:1) 我对 的内部结构了解不多\footnotemark,因此不知道将\hyperlinked 编号/标记放在哪里;2) 在行中\clist_put_right:Nn,如果我使用\ref*{ ##1 }作为 的文本\hypertarget,则会出现多个错误,例如Undefined control sequence. \@hyper@@anchor ...r@spot {#2#3}\let \put@me@back

因此我的问题是,应该怎么做才能使超链接正常工作?任何建议都非常感谢!

\documentclass{article}

\usepackage{hyperref}

\ExplSyntaxOn

\NewDocumentCommand \multifootnotemark { O{} }
  {
    \footnotemark
    \group_begin:
      \tl_if_blank:nF { #1 }
        {
          \addtocounter { footnote } { -1 }
          \refstepcounter { footnote }
          \label { #1 }
        }
    \group_end:
  }
\NewCommandCopy \footnotenumber \multifootnotemark

\NewDocumentCommand \multifootnotetext { O{} m }
  {
    \group_begin:
    \tl_if_blank:nF { #1 }
      {
        \clist_clear:N \l_tmpa_clist
        \clist_map_inline:nn { #1 }
          {
            \clist_put_right:Nn \l_tmpa_clist { \ref*{ ##1 } }
          }
        \def \thefootnote { \clist_use:Nn \l_tmpa_clist { , } }
      }
    \footnotetext { #2 }
    \group_end:
  }
\NewCommandCopy \multifootnote \multifootnotetext

\ExplSyntaxOff


\begin{document}

Lorem ipsum\footnotenumber[fn1] dolor sit amet\footnotenumber[fn2], consectetur adipiscing elit\footnotenumber[fn3].
\multifootnote[fn1,fn2,fn3]{Test footnote.}

\end{document}

在此处输入图片描述

在此处输入图片描述

答案1

您可以尝试这样的操作:

\documentclass{article}

\usepackage{hyperref}

\ExplSyntaxOn
\makeatletter

\NewDocumentCommand \multifootnotemark { O{} }
  {
    \footnotemark
    \group_begin:
      \tl_if_blank:nF { #1 }
        {
          \addtocounter { footnote } { -1 }
          \refstepcounter { footnote }
          \global\let\@currentHref\Hy@footnote@currentHref
          \label { #1 }
        }
    \group_end:
  }
\NewCommandCopy \footnotenumber \multifootnotemark

\NewDocumentCommand \multifootnotetext { O{} m }
  {
    \group_begin:
    \tl_if_blank:nF { #1 }
      {
        \clist_clear:N \l_tmpa_clist
        \clist_map_inline:nn { #1 }
          {
            \clist_put_right:Nn \l_tmpa_clist 
             { \ref*{ ##1 } }
            \clist_put_right:Nn \l_tmpb_clist
             { \hypertarget{\getrefbykeydefault{##1}{anchor}{Doc-Start}}{} } 
          }
        \def \thefootnote { \clist_use:Nn \l_tmpa_clist { , } }
      }
    \xdef\Hy@footnote@currentHref{x\Hy@footnote@currentHref}  
    \footnotetext { \clist_use:Nn\l_tmpb_clist{}\ignorespaces #2 }
    \group_end:
  }
\NewCommandCopy \multifootnote \multifootnotetext

\ExplSyntaxOff


\begin{document}

Lorem ipsum\footnotenumber[fn1] dolor sit amet\footnotenumber[fn2], consectetur adipiscing elit\footnotenumber[fn3].
\multifootnote[fn1,fn2,fn3]{\label{blub}Test footnote.}

\end{document}

答案2

我认为这是一种更简单、更方便的方法。

fn1,fn2,fn3我建议不要创建唯一的脚注,稍后再将其指定为逗号分隔列表( ),而是为分组脚注创建 ID 系统,即

  • 每当你需要合并多个脚注时,选择一个<id>
  • 现在,不再像平常那样\footnote使用\footnoteid{<id>}
  • 之后,使用另一个宏\addfootnotegroup{<id>}{<text>}将其添加到实际的脚注中
\documentclass{article}
\usepackage{hyperref}

\newcommand{\footnoteid}[1]{%
    {\footnotemark\def\thefootnote{}\footnotetext{\vspace{-\baselineskip}}}%
    \ifcsname gfnt#1\endcsname
        \expandafter\xdef\csname gfnt#1\endcsname{\csname gfnt#1\endcsname,\thefootnote}%
    \else
        \expandafter\xdef\csname gfnt#1\endcsname{\thefootnote}%
    \fi
}
\newcommand{\addfootnotegroup}[2]{%
    {\def\thefootnote{\csname gfnt#1\endcsname}\footnotetext{#2}}%
}

\begin{document}
Lorem\footnote{default} ipsum dolor sit amet\footnoteid{idI}, consectetur\footnote{another} adipiscing\footnoteid{idI} elit\footnoteid{idI}.

\addfootnotegroup{idI}{grouped footnote}

Lorem ipsum\footnote{one more} dolor sit amet, consectetur adipiscing elit.
\end{document}

在此处输入图片描述

不管有没有hyperref包装它都可以工作。

答案3

感谢 Ulrike Fischer 的精彩回答和 Frougon 在其下提出的有用评论,下面是这两个命令的更新版本,无论有无都可以使用hyperref

\NewDocumentCommand \multifootnotemark { O{} }
  {
    \footnotemark
    \group_begin:
      \tl_if_blank:nF { #1 }
        {
          \addtocounter { footnote } { -1 }
          \refstepcounter { footnote }
          \@ifpackageloaded { hyperref }
            {
              \cs_gset_eq:NN \@currentHref \Hy@footnote@currentHref
            } {}
          \label { #1 }
        }
    \group_end:
  }
\NewCommandCopy \footnotenumber \multifootnotemark

\NewDocumentCommand \multifootnotetext { O{} m }
  {
    \group_begin:
    \tl_if_blank:nF { #1 }
      {
        \clist_clear:N \l_tmpa_clist
        \clist_clear:N \l_tmpb_clist
        \clist_map_inline:nn { #1 }
          {
            \@ifpackageloaded { hyperref }
              {
                \clist_put_right:Nn \l_tmpa_clist
                  { \ref*{ ##1 } }
                \clist_put_right:Nn \l_tmpb_clist
                  { \Hy@raisedlink { \hypertarget { \getrefbykeydefault{##1}{anchor}{Doc-Start} } {} } }
              }
              {
                \clist_put_right:Nn \l_tmpa_clist
                  { \ref{ ##1 } }
              }
          }
        \def \thefootnote { \clist_use:Nn \l_tmpa_clist { , } }
      }
    \@ifpackageloaded { hyperref }
      {
        \xdef \Hy@footnote@currentHref { x\Hy@footnote@currentHref }
      } {}
    \footnotetext { \clist_use:Nn \l_tmpb_clist {} \ignorespaces #2 }
    \group_end:
  }
\NewCommandCopy \multifootnote \multifootnotetext

答案4

以下是expl3@antshar 方法的版本。此处的一个小改进是,可以<id>是逗号分隔的列表,因此例如,可以使用脚注 for,1,2,3然后1,4,5可以使用 for(尽管这可能是一种罕见的用例)。

\documentclass{article}
\usepackage{hyperref}
% \usepackage{footnotebackref}

\ExplSyntaxOn

\NewDocumentCommand \multifootnoteid { m }
  {
    \footnotemark
    \group_begin:
      \def \thefootnote {}
      \footnotetext { \vspace { -\baselineskip } }
    \group_end:
    \clist_map_inline:nn { #1 }
      {
        \cs_if_exist:cTF { multifootnote ##1 }
          {
            \tl_gput_right:cx { multifootnote ##1 } { , \thefootnote }
          }
          {
            \cs_gset:cpx { multifootnote ##1 } { \thefootnote }
          }
      }
  }
\NewCommandCopy \footnoteid \multifootnoteid

\NewDocumentCommand \multifootnotegroup { m m }
  {
    \group_begin:
      \def \thefootnote { \use:c { multifootnote #1 } }
      \footnotetext { #2 }
    \group_end:
  }
\NewCommandCopy \footnotegroup \multifootnotegroup

\ExplSyntaxOff


\begin{document}

Lorem ipsum\footnoteid{idI,idII} dolor sit amet\footnoteid{idI}, consectetur\footnoteid{idII} adipiscing elit\footnoteid{idI}.
\footnotegroup{idI}{Test footnote 1.}
\footnotegroup{idII}{Test footnote 2.}

\end{document}

在此处输入图片描述

在此处输入图片描述

相关内容