如何获取指向准确位置而不是页面的索引条目

如何获取指向准确位置而不是页面的索引条目

阅读 PDF 版本时,很难找到我的文章中索引术语的确切定义。当您单击索引表中的链接时,例如关键字“拉普拉斯分布”,它指向的不是 \index{拉普拉斯分布} 的确切位置(例如,在第 17 页的中间或底部),而是第 17 页的顶部,这使得很难找到该术语的实际使用位置,尤其是如果它位于页面底部,并且每页都有密集的内容。

这个问题有好的解决办法吗?我通过将 \documentclass[10pt]{article} 中序言顶部的 10pt 改为 12pt 并加大页边距,取得了一些进步,因为这样页面包含的内容会少很多,而且由于每页上要浏览的文本较少,因此更容易直观地找到实际位置。但我认为还有更有效的解决方案。改善这种情况的另一种方法是使相关关键字(拉普拉斯分布)以斜体或红色显示。您有什么建议?理想情况下,我希望索引的工作效果与使用 \ref 和 \label 引用定理或方程时一样好:在这种情况下,单击引用链接会将您带到定理或方程的准确位置。

答案1

如果“手动”确保每个索引条目在命令中每页只出现一次\index,那么作为起点,我可以提供一个\Autodestinationindex带有可选参数和强制参数的宏。

强制参数是索引条目的短语。可选参数可以包含带有键Up=...和的键值列表Left=...

这只是一个起点,因为如果我明白制作索引工作正常,它没有考虑索引条目不指定页面列表(如)1, 7, 15而是指定页面范围(如)的情况7-9。(如果您需要更复杂的机制,您最好不要尝试在 TeX 宏级别上实现它,而是通过根据您的需要定制的索引样式文件来实现。)

\Autodestinationindex内部使用反宏\countallindexentries来创建一个命名的目的地,该目的地相对于文本中索引条目短语最左边项的参考点向上移动Up=...并向左移动Left=...
\Autodestinationindex还为索引条目的短语创建一个索引条目,其中页码形成指向目的地的超链接。

如果未指定可选参数,则\Hy@raisedlink使用 hyperref 的默认值。

在此处输入图片描述

使用基于 pdfTeX 的引擎进行编译,然后在生成的 .idx 文件上运行 makeindex,然后再次进行编译。

使用较大的缩放比例查看生成的 pdf 文件,以查看单击索引条目中的链接后Up=...出现的水平和垂直滚动行为。Left=...

可以省略 es/framed框\fbox,因为它们只是为了方便可视化滚动行为:的左下角\fbox接近文本短语最左侧项的参考点,因此您可以更轻松地判断命名的目的地/目标相对于该参考点的位置。

构成索引条目的短语不应该以断点开头,否则在构成指定目标的 pdf 文件中的(不可见)点(pdf 查看器将滚动到显示 pdf 文件的窗口的左上角)与单击超链接时显示 pdf 文件的窗口的左上角应看到的短语的最左边的项目之间可能会出现断点。

\documentclass{article}
%\usepackage[hyperindex=false]{hyperref}
\usepackage{hyperref}
\usepackage{makeidx}

\makeatletter
\newcommand*\countallindexentries{1}
\newcommand\globalstepcountallindexentries{%
  \xdef\countallindexentries{\number\numexpr\countallindexentries+1\relax}%
}%
\NewDocumentCommand\CreateAutodestinationindexentry{mmm}{%
  % #1 name of destination/target
  % #2 phrase forming the index-entry
  % #3 key-val-list for shifting the destination/target up/left
  \RaisedHypertarget{#1}{#3}#2\index{#2|hyperlinkwithhyperpageneutralized{#1}}%
}%
\newcommand\hyperlinkwithhyperpageneutralized[2]{%
  {\let\HyOrg@hyperpage=\@firstofone\hyperlink{#1}{#2}}%
}%
\ExplSyntaxOn
% key=value-interface by means of package l3keys:
%-------------------------------------------------------
% Macros holding default-values of keys
%   \cs_new:Nn here instead of Up.initialize etc
%   within \keys_define:nn in order to get an error-message
%   in case of overriding/redefining an already existing
%   control sequence.
\cs_new:Nn \__COUNTALLINDEXENTRIES_MOVEDESTINATIONUP: {\q_no_value}
\cs_new:Nn \__COUNTALLINDEXENTRIES_MOVEDESTINATIONLEFT: {\q_no_value}
\keys_define:nn { COUNTALLINDEXENTRIES } {
  Up.cs_set:Np =  \__COUNTALLINDEXENTRIES_MOVEDESTINATIONUP: {},
  Up.default:n = \q_no_value,
  Left.cs_set:Np =  \__COUNTALLINDEXENTRIES_MOVEDESTINATIONLEFT: {},
  Left.default:n = \q_no_value,
}
\cs_new:Npn \RaisedHypertarget #1#2 {%
  % #1 name of destination/target
  % #2 keyval-list 
  \group_begin:
  \keys_set:nn{ COUNTALLINDEXENTRIES }{#2}
  \exp_args:No 
  \quark_if_no_value:nTF{\__COUNTALLINDEXENTRIES_MOVEDESTINATIONUP:}
                        {}
                        {
                           \exp_args:NNo
                           \cs_set:Npn \HyperRaiseLinkDefault{\__COUNTALLINDEXENTRIES_MOVEDESTINATIONUP:}
                        }
  \exp_args:No 
  \quark_if_no_value:nTF{\__COUNTALLINDEXENTRIES_MOVEDESTINATIONLEFT:}
                        {\Hy@raisedlink{\hypertarget{#1}{}}}
                        {
                          \Hy@raisedlink{
                             \kern\dimexpr-\__COUNTALLINDEXENTRIES_MOVEDESTINATIONLEFT:\relax
                             \hypertarget{#1}{}
                             \kern\dimexpr\__COUNTALLINDEXENTRIES_MOVEDESTINATIONLEFT: \relax
                          }
                        }
  \group_end:
}
\NewDocumentCommand\Autodestinationindex{O{}m}{
  % #1 optional key-val-list for shifting the destination/target up/left
  % #2 phrase forming the index-entry
  \token_if_macro:NTF \hypertarget 
                      {
                        \legacy_if:nTF {Hy@hyperindex} 
                                       {
                                         \exp_args:Nx
                                         \CreateAutodestinationindexentry{IndexEntry\countallindexentries}{#2}{#1}
                                         \globalstepcountallindexentries
                                       } 
                      }
                      { \use:n }
                      {
                        #2\index{#2}
                      }
}
\ExplSyntaxOff
\makeatother

\makeindex

\begin{document}

Some text Some text Some text

\vspace{2cm}

In probability theory and statistics, the
\fbox{\Autodestinationindex{Laplace distribution}} is a continuous
probability distribution named after Pierre-Simon Laplace. 

\vspace{2cm}

In
\fbox{%
  \Autodestinationindex[Up=\dimexpr\baselineskip+\fboxrule+\fboxsep\relax,
                        Left=\dimexpr\fboxrule+\fboxsep\relax]{probability theory}%
} and statistics, the Laplace distribution
is a continuous probability distribution named after
Pierre-Simon Laplace. 

\vspace{2cm}

In probability theory and statistics, the Laplace distribution
is a continuous probability distribution named after
\fbox{\Autodestinationindex[Up=2cm, Left=1cm]{Pierre-Simon Laplace}}. 

\printindex
\end{document}

在此处输入图片描述

相关内容