我目前正在使用包hyperref
和imakeidx
创建我的书的索引。这个索引足够大,可以跨越多个页面。它包含一些条目,例如
% In the index under "B"...
\index{bar!foo|see {foobar}}%
% Several pages later in the index, under "F"...
\index{foobar}%
由于我使用的是包hyperref
,指向主内容中特定页面的索引条目在最终 PDF 中呈现为超链接。我想知道是否有办法将看条目。也就是说,我想渲染“bar,看foobar” 作为超链接,指向列出“foobar”的索引页面。
这可能吗?如果可以,最好的方法是什么?
答案1
初步版本仅适用于顶级索引项,不适用于bar!foo
与其类似的条目|see {foo}
。
有一个超目标被定义并用 检索\seelink
。
多次使用\index{foobar}
将防止出现相同的目标名称。
\documentclass{article}
\usepackage{blindtext}
\usepackage{imakeidx}
\usepackage{xparse}
\usepackage{letltxmacro}
\usepackage{hyperref}
\ExplSyntaxOn
\AtBeginDocument{%
\LetLtxMacro\indexorig\index
\newcommand{\hyperindextarget}[1]{%
\hypertarget{#1}{}%
}
\RenewDocumentCommand{\index}{om}{%
\IfValueTF{#1}{%
\addindextarget[#1]{#2}%
}{%
\addindextarget{#2}%
}%
}
}
\newcommand{\seelink}[2]{%
\seename\ \hyperlink{#1}{#1}%
}
\seq_new:N \g_quuxxplusone_target_seq
\NewDocumentCommand{\addindextarget}{om}{%
\IfValueTF{#1}{%
\seq_if_in:NnTF \g_quuxxplusone_target_seq {#2} {%
\indexorig[#1]{#2}%
}{% False branch
\seq_gput_right:Nn \g_quuxxplusone_target_seq {#2}
\indexorig[#1]{#2|hyperindextarget{#2}}%
}%
}{% No optional argument
\seq_if_in:NnTF \g_quuxxplusone_target_seq {#2} {%
\indexorig{#2}%
}{% False branch
\seq_gput_right:Nn \g_quuxxplusone_target_seq {#2}
\indexorig{#2|hyperindextarget{#2}}%
}%
}%
}
\ExplSyntaxOff
\makeindex
\begin{document}
Foo
\clearpage
\blindtext[5]
% In the index under "B"...
\index{bar}
\index{bar!foo|seelink {foobar}}%
% Several pages later in the index, under "F"...
\blindtext[15]
\index{foobar}%
\blindtext[15]
\index{foobar}
\index{zzz|seelink{bar}}
\printindex
\end{document}