如何使索引条目引用章节编号和/或图表编号,并用前导符替换逗号?

如何使索引条目引用章节编号和/或图表编号,并用前导符替换逗号?

可以使用 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}

为了使它适用于图形/表格,我只需在包装器figuretable环境中重新定义命令即可。您已明确重新定义\thefigure\thetable,因为它们似乎\relax在图形/表格编号之前引入了尾随命令。

请注意,到目前为止,对于图形/表格索引条目,这还不能与超链接正确配合使用。

启用--shell 转义是强制性的。

在此处输入图片描述

答案2

好吧,从我的角度来看,我找到了另一个比 Hupfer 的解决方案更优雅的解决方案。

由于makeindex(.exe)只能处理正数作为页码,并且会对 之类的内容提出抱怨1.1,这通常是小节编号的形式,我们有两种选择:使用其他索引程序绕过这个障碍,例如xindy(由 Hupfer 描述);在处理文件之前1.1以 100 为基数的数字系统进行编码,即,并在 加载文件之前修改文件。101.idxmakeindex.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也是强制性的。

相关内容