通常的做法是索引条目链接到文本中出现该词的页面。我正在尝试索引文件列表,并索引文件名中的每个单词。在下面的 MWE 中,单击索引中的链接会将我带到文档中的相应部分,然后我可以单击该部分以打开文件。
由于本文件的正文在这种情况下没有实际意义(我仅有的我对索引感兴趣),我希望找到一种方法将这个两步过程修改为一步。因此,我希望索引中的链接成为指向文件的链接(因为它们现在位于文档的主体中)。我假设这只需要更改宏\ProcessWord
。
笔记:
datatool
这里只使用该包,因为我的实际用例是通过该包获取文件名的。- 要使输出链接打开实际文件,您需要使用支持此功能的 PDF 阅读器(例如 Acrobat)。带有 的 PDF 查看器
TeXShop 2.43
确实支持此功能,但带有 的 PDF 查看器不支持TeXWorks 2.3
。
参考:
代码:
\documentclass{article}
\usepackage{datatool}% database
\usepackage{imakeidx}% indexing
\usepackage{hyperref}% For cross references
\makeindex
% ---------- Process Each Word:
%
% https://tex.stackexchange.com/questions/12810/how-do-i-split-a-string
\makeatletter
\def\ProcessEachWord#1{%
\begingroup%
\edef\@tempa{#1\space}%
\gdef\@tempb{#1}%
\expandafter\endgroup%
\expandafter\ReadWords\@tempa\relax%
}%
\def\ReadWords#1 #2\relax{%
\ProcessWord[\@tempb]{#1}% #1 = substr, #2 = rest of string
\begingroup%
\ifx\relax#2\relax% is #2 empty?
\def\next{\endgroup\EndProcessWords}% your own end-macro if required
\else%
\def\next{\endgroup\ReadWords#2\relax}%
\fi%
\next%
}%
\makeatother
% ----------
\newcommand{\ProcessWord}[2][]{%
%\par\noindent\href{run:#1.pdf}{#1}% Moved Below
\index{#2!#1}%
%~#2%
}%
\newcommand{\EndProcessWords}{}
\begin{document}
\DTLnewdb{DB}%
\DTLnewrow{DB}%
\DTLnewdbentry{DB}{FileName}{Now good enough}%
\DTLnewrow{DB}%
\DTLnewdbentry{DB}{FileName}{Now good enough for you and me}%
\DTLforeach{DB}{\FileName=FileName}{%
\section{\FileName}%
\par\noindent\href{run:\FileName.pdf}{\FileName}%
\ProcessEachWord{\FileName}%
}%
\printindex
\end{document}
答案1
事实证明,最明显的解决方案确实有效——不确定为什么我之前没有想到这一点:
\newcommand{\ProcessWord}[2][]{%
\index{#2!\href{run:#1.pdf}{#1}}%
}%
进一步改进
- 对此的一个改进是消除索引中的页码。解决方案可以在以下网址找到:从索引条目中删除页码。