可以使用 makeidx 包和 makeindex 程序自动生成 LaTeX 文档中的索引表。它们是很棒的工具,但是我对默认的输出样式不满意。
默认样式使用逗号作为索引条目名称和页码的分隔符号,而我需要的是类似默认目录的东西 --- 使用前导符作为分隔符并引用章节编号(而不是页码)。
我在网上搜索并阅读了很多帖子,这个帖子似乎是问题的答案。但是,我不知道如何将它们迁移到我的文档中。出于这些原因,我可以请求分步解答吗?
答案1
为了使用章节编号而不是页码,必须重新定义索引条目的写入方式。如果使用\jobname.idx
包,这基本上很容易。imakeidx
在其手册中,imakeidx
作者写道,\imki@wrindexentry
应该重新定义 以适用于其他样式。查看包,有一个类似的命令用作\thepage
参数,因此使用 重新定义它\thesection
。
但是,makeindex
由于外部处理器对新格式有异议,如果\thesection
将其数字写为1.1
等,即带有点。使用xindy
解决了这个问题,通过应用新的字母表或位置类,这在中完成sectionindex_xindy.xdy
,以及删除,
分隔符并插入-----
。
内容sectionindex_xindy.xdy
(markup-locclass-list :open " ----- " :sep "")
( define-location-class "numericsections"
("arabic-numbers" :sep "." "arabic-numbers"))
( define-location-class "numericchapteralphasections"
("arabic-numbers" :sep "." "ALPHA"))
\documentclass[paper=a4,12pt]{scrbook}
\usepackage{letltxmacro}
\usepackage[xindy]{imakeidx}
%\usepackage{hyperref}% Leads to linking to wrong positions%
\makeatletter
% Global redefinition of indexentry to section instead of page%
\renewcommand{\imki@wrindexentrysplit}[3]{%
\expandafter\protected@write\csname#1@idxfile\endcsname{}%
{\string\indexentry{#2}{\thesection}}%
}%
\LetLtxMacro{\LaTeXStandardFigure}{\figure}
\let\LaTeXStandardEndFigure\endfigure%
\renewenvironment{figure}[1][tpb]{%
%redefine the index write command to use figure number instead of section number
\renewcommand{\imki@wrindexentrysplit}[3]{%
\expandafter\protected@write\csname##1@idxfile\endcsname{}%
{\string\indexentry{##2}{\thefigure}}
}%
\LaTeXStandardFigure[#1]%
}{%
\LaTeXStandardEndFigure%
}%
\LetLtxMacro{\LaTeXStandardTable}{\table}
\let\LaTeXStandardEndTable\endtable%
\renewenvironment{table}[1][tpb]{%
%redefine the index write command to use table number instead of section number
\renewcommand{\imki@wrindexentrysplit}[3]{%
\expandafter\protected@write\csname##1@idxfile\endcsname{}%
{\string\indexentry{##2}{\thetable}}
}%
\LaTeXStandardTable[#1]%
}{%
\LaTeXStandardEndTable%
}%
\makeatother
\makeindex[options=-M sectionindex_xindy.xdy]
\renewcommand{\thefigure}{\arabic{chapter}.\arabic{figure}}%
\renewcommand{\thesection}{\arabic{chapter}.\Alph{section}}%
\renewcommand{\thetable}{\arabic{chapter}.\arabic{table}}%
\begin{document}
\listoffigures
\listoftables
\chapter{First}
\begin{figure}
\caption{A first figure with index entry, say Figure\index{Figure!First}}
\end{figure}
\section{First section of chapter~\arabic{chapter}}
Here is a table (well, the environment actually)
\begin{table}
\centering
\begin{tabular}{lll}
\hline
A & dummy & table \tabularnewline
\hline
\end{tabular}
\caption{A table with some index entry in it: \index{Table}{First}}
\end{table}
See also the keyword Index\index{Index}
\chapter{Two}
\section{First}
Index\index{Index} and its usage\index{usage}
\begin{figure}
\caption{A dummy figure with an index entry, say DummyFigure\index{Figure!DummyFigure}}
\end{figure}
\printindex
\end{document}
为了使它适用于图形/表格,我只需在包装器figure
和table
环境中重新定义命令即可。您已明确重新定义\thefigure
和\thetable
,因为它们似乎\relax
在图形/表格编号之前引入了尾随命令。
请注意,到目前为止,对于图形/表格索引条目,这还不能与超链接正确配合使用。
启用--shell 转义是强制性的。
答案2
好吧,从我的角度来看,我找到了另一个比 Hupfer 的解决方案更优雅的解决方案。
由于makeindex(.exe)
只能处理正数作为页码,并且会对 之类的内容提出抱怨1.1
,这通常是小节编号的形式,我们有两种选择:使用其他索引程序绕过这个障碍,例如xindy
(由 Hupfer 描述);在处理文件之前1.1
以 100 为基数的数字系统进行编码,即,并在 加载文件之前修改文件。101
.idx
makeindex
.ind
\printindex
为了实现这一点,我的意思是,第二个选择,我借用了一些代码[电子邮件保护]和[电子邮件保护]。最后,我得到了以下信息:
\begin{filecontents*}{indexsec.ist}
preamble = "\begin{theindex}\def\seename{See}\def\alsoname{Also see}\providecommand*\indexgroup[1]{\indexspace\item \textbf{#1}\nopagebreak}"
postamble "\n\n\\end{theindex}\n"
group_skip "\n\n \\indexspace\n\n"
delim_0 "\\xleaders\\hbox{$\\cdot$}\\hfill "
delim_1 "\\xleaders\\hbox{$\\cdot$}\\hfill "
delim_2 "\\xleaders\\hbox{$\\cdot$}\\hfill "
headings_flag 1
heading_prefix "\\mbox{}\\hfill{}\\textbf{"
heading_suffix "}\\hfill\\mbox{}"
numhead_positive "Number"
numhead_negative "Number"
symhead_positive "Symbol"
symhead_negative "Symbol"
\end{filecontents*}
\documentclass{article}
\usepackage{imakeidx}
\makeindex[options = -s indexsec.ist, columns = 1]
\makeatletter
\def\idx@encode#1#2{%
\the\numexpr#1 * 100 + #2\relax}
\newcount\idx@low
\newcount\idx@high
\def\idx@decode#1{%
\idx@high=#1
\divide\idx@high by 100
\idx@low=\numexpr#1-100*\idx@high\relax}
\def\subsecindexpage#1{%
\idx@decode{#1}%
\the\idx@high.\the\idx@low}
\let\idx@wrindex@subsec\@wrindex
\patchcmd\idx@wrindex@subsec
{\thepage}
{\idx@encode{\arabic{section}}{\arabic{subsection}}}
{}{}
\patchcmd\idx@wrindex@subsec
{#2}
{#2|subsecindexpage}
{}{}
\newcommand\subsecindex[1][\imki@jobname]{%
\@bsphack
\@ifundefined{#1@idxfile}%
{\PackageWarning{imakeidx}{Undefined index file `#1'}%
\begingroup
\@sanitize
\imki@nowrindex}%
{\edef\@idxfile{#1}%
\begingroup
\@sanitize
\idx@wrindex@subsec\@idxfile}}
\makeatother
\begin{document}
\section{Foo}
\subsection{Bar}
foo, bar, baz
\subsecindex{foo}\subsecindex{bar}\subsecindex{baz}
\subsection{Hoge}
hoge, fuga, piyo
\subsecindex{hoge}\subsecindex{fuga}\subsecindex{piyo}
\printindex
\end{document}
顺便说一句,在这种情况下,启用--shell-escape
也是强制性的。