我正在尝试修改复杂文档中的索引。重点是,我有一个目录等等。但我们还想为特定术语添加索引,例如:
“....所谓的方差分析 \index{方差分析}:......”。
现在,使用 hyperref 命令 index 通常会生成与页码关联的索引条目,然后在索引中单击页码即可转到正确的页面。非常好,但是我们想将超链接指向 SECTION 而不是页面。我发现我可以在 hyperref 下通过 makeindex 更改 .idx 文件的写入方式,但要到达它的末尾,我需要在命令中插入节的标签而不是页码。现在,当前版本使用“\thepage”命令执行页面,因此我希望通过引用节标签为节找到类似的内容,这样可以让事情正常工作(我曾尝试在 .idx 文件中手动插入标签,这是可以的,但我希望 makeindex 这样做.... ;) )。或者,当然,如果有人知道一种更简单的方法来解决我原来的问题,我会更高兴....
答案1
假设:
- 具有编号节、小节和小小节的文档类。
- 未编号的(子)(子)部分中没有索引条目。
- 索引中应该出现(子)(子)章节编号而不是页码。
hyperref
已加载。- 未指定节号的链接目标。链接应转到节的开头(可能是前面的一些页面)还是索引页面?示例提供了两者,请参见带有 的两行
\hyperlink
。 - 标准锚点生成
hyperref
(hypertexnames
,naturalnames=false
,pageanchor
)。 - 阿拉伯语(子)(子)部分编号。
基于这些假设,以下示例修补了索引写入,将(子)(子)部分值添加到页码,构建复合页码(Makeindex 最多支持十个部分)。这也应该自动禁用隐式页面范围(与部分编号没有太大关系)。
项目特定的样式文件\jobname.mst
重新定义了一些键,以在页码前面插入宏。由于页码的格式固定,因此参数周围的花括号是不需要的。
然后可以使用存储在索引条目的复合人工页码中的计数器值来计算锚点名称。
完整示例:
% Project specific makeindex style file "\jobname.mst"
% CAUTION: The file "\jobname.mst" will be overwritten
% without asking, if package "filecontents" is loaded.
\RequirePackage{filecontents}
\begin{filecontents*}{\jobname.mst}
delim_0 ", \\MyIndexPage "
delim_1 ", \\MyIndexPage "
delim_2 ", \\MyIndexPage "
delim_3 ", \\MyIndexPage "
delim_n ", \\MyIndexPage "
delim_r "--\\MyIndexPage "
encap_prefix "\\MyEncap\\"
encap_infix "{\\MyIndexPage "
encap_suffix "}"
\end{filecontents*}
\documentclass{article}
\usepackage{makeidx}
\makeindex
\usepackage{etoolbox}
\makeatletter
\patchcmd{\@wrindex}{\thepage}{%
\thepage
-% page compositor
\the\value{section}%
-% page compositor
\the\value{subsection}%
-% page compositor
\the\value{subsubsection}%
-42% end tag
}{}{%
\errmessage{Could not patch \string\@wrindex}%
}
\@addtoreset{subsubsection}{section}% before hyperref
\newcommand*{\MyEncap}{\@gobble{MyEncap}}
\newcommand*{\MyIndexPage}{%
\@ifnextchar{\MyEncap}{}{\@MyIndexPage}%
}
\def\@MyIndexPage #1-#2-#3-#4-42{%
% #1: \thepage
% #2: \value{section}
% #3: \value{subsection}
% #4: \value{subsubsection}
\edef\SectionNumber{%
\number#2%
\ifnum#3>0 %
.\number#3%
\ifnum#4>0 %
.\number#4%
\fi
\fi
}%
\edef\SectionAnchor{%
\ifnum#4>0 %
subsubsection.\number#2.\number#3.\number#4%
\else
\ifnum#3>0 %
subsection.\number#2.\number#3%
\else
section.\number#2%
\fi
\fi
}%
% \hyperlink{page.#1}{\SectionNumber}% link to page
\hyperlink{\SectionAnchor}{\SectionNumber}% link to start of section
}
\usepackage[
hyperindex=false,
colorlinks,
]{hyperref}
\usepackage{bookmark}
\bookmarksetup{
open,
numbered,
}
\begin{document}
\section{First section}
\index{First}
\index{Section}
\index{Section!First}
\index{Foo|see{bar}}
\section{Second section}
\index{Second}
\index{Section}
\index{Section!Second}
\subsection{First subsection}
\index{First}
\index{Subsection}
\index{Subsection!First|textbf}
\subsubsection{First subsubsection}
\index{First}
\index{Subsubsection}
\index{Subsubsection!First|textit}
\subsection{Second subsection}
\index{Second}
\index{Subsection}
\index{Subsection!Second}
\subsection{Third subsection}
\index{Third}
\index{Subsection}
\index{Subsection!Third}
\subsubsection{Second subsubsection}
\index{Second}
\index{Subsubsection}
\index{Subsubsection!Second}
\addtocounter{subsection}{6}
\subsection{Last subsection}
\index{Last|fbox}
\index{Subsection}
\index{Subsection!Last}
\printindex
\end{document}
原始索引文件\jobname.idx
:
\indexentry{First}{1-1-0-0-42}
\indexentry{Section}{1-1-0-0-42}
\indexentry{Section!First}{1-1-0-0-42}
\indexentry{Foo|see{bar}}{1-1-0-0-42}
\indexentry{Second}{1-2-0-0-42}
\indexentry{Section}{1-2-0-0-42}
\indexentry{Section!Second}{1-2-0-0-42}
\indexentry{First}{1-2-1-0-42}
\indexentry{Subsection}{1-2-1-0-42}
\indexentry{Subsection!First|textbf}{1-2-1-0-42}
\indexentry{First}{1-2-1-1-42}
\indexentry{Subsubsection}{1-2-1-1-42}
\indexentry{Subsubsection!First|textit}{1-2-1-1-42}
\indexentry{Second}{1-2-2-0-42}
\indexentry{Subsection}{1-2-2-0-42}
\indexentry{Subsection!Second}{1-2-2-0-42}
\indexentry{Third}{1-2-3-0-42}
\indexentry{Subsection}{1-2-3-0-42}
\indexentry{Subsection!Third}{1-2-3-0-42}
\indexentry{Second}{1-2-3-1-42}
\indexentry{Subsubsection}{1-2-3-1-42}
\indexentry{Subsubsection!Second}{1-2-3-1-42}
\indexentry{Last|fbox}{1-2-10-0-42}
\indexentry{Subsection}{1-2-10-0-42}
\indexentry{Subsection!Last}{1-2-10-0-42}
\jobname.ind
Makeindex生成的索引文件:
\begin{theindex}
\item First, \MyIndexPage 1-1-0-0-42, \MyIndexPage 1-2-1-0-42, \MyIndexPage
1-2-1-1-42
\item Foo, \MyIndexPage \MyEncap\see{bar}{\MyIndexPage 1-1-0-0-42}
\indexspace
\item Last, \MyIndexPage \MyEncap\fbox{\MyIndexPage 1-2-10-0-42}
\indexspace
\item Second, \MyIndexPage 1-2-0-0-42, \MyIndexPage 1-2-2-0-42, \MyIndexPage
1-2-3-1-42
\item Section, \MyIndexPage 1-1-0-0-42, \MyIndexPage 1-2-0-0-42
\subitem First, \MyIndexPage 1-1-0-0-42
\subitem Second, \MyIndexPage 1-2-0-0-42
\item Subsection, \MyIndexPage 1-2-1-0-42, \MyIndexPage 1-2-2-0-42, \MyIndexPage
1-2-3-0-42, \MyIndexPage 1-2-10-0-42
\subitem First, \MyIndexPage
\MyEncap\textbf{\MyIndexPage 1-2-1-0-42}
\subitem Last, \MyIndexPage 1-2-10-0-42
\subitem Second, \MyIndexPage 1-2-2-0-42
\subitem Third, \MyIndexPage 1-2-3-0-42
\item Subsubsection, \MyIndexPage 1-2-1-1-42, \MyIndexPage 1-2-3-1-42
\subitem First, \MyIndexPage
\MyEncap\textit{\MyIndexPage 1-2-1-1-42}
\subitem Second, \MyIndexPage 1-2-3-1-42
\indexspace
\item Third, \MyIndexPage 1-2-3-0-42
\end{theindex}
最后是页面索引:
更新\see
后面的第一个标记\MyIndexPage
是“encap”命令(例如\see
)。因此,更新的示例\MyEncap
在“encap”命令之前添加了宏,并\MyIndexPage
通过 makeindex 的样式文件在“encap”命令的参数中的页码之前添加了一个附加宏:
encap_prefix "\\MyEncap\\"
encap_infix "{\\MyIndexPage "
encap_suffix "}"
然后\MyIndexPage
以这样的方式重新定义,如果宏检测到后面跟着“encap”命令,它会忽略自身\MyEncap
:
\newcommand*{\MyEncap}{\@gobble{MyEncap}}
\newcommand*{\MyIndexPage}{%
\@ifnextchar{\MyEncap}{}{\@MyIndexPage}%
}
\def\@MyIndexPage #1-#2-#3-#4-42{%
...
}