![带有多个数字/标记的脚注超链接](https://linux22.com/image/450641/%E5%B8%A6%E6%9C%89%E5%A4%9A%E4%B8%AA%E6%95%B0%E5%AD%97%2F%E6%A0%87%E8%AE%B0%E7%9A%84%E8%84%9A%E6%B3%A8%E8%B6%85%E2%80%8B%E2%80%8B%E9%93%BE%E6%8E%A5.png)
在这个答案,我创建了两个命令\footnotenumber
和,\multifootnote
用于编写带有多个数字的脚注。这些命令的问题是超链接不能像通常的脚注那样工作:例如,如果您单击下面代码生成的文档中的红色方框“1”,则不会发生任何事情。
我尝试在这些命令中使用\hyperlink
和,\hypertarget
但没有成功。对我来说,困难在于:1) 我对 的内部结构了解不多\footnotemark
,因此不知道将\hyperlink
ed 编号/标记放在哪里;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}