自定义索引条目

自定义索引条目

我正在尝试手动创建索引,其中每个索引条目引用一个页面和相应的章节。因此,基本上我正在创建自己的 idx 文件,然后使用 Latex 的 MakeIndex 功能获取 ind 文件,然后生成相应的 PDF 文件。

所以我的 tex 文件看起来就像这样:

\documentclass[a4paper,10pt]{extarticle}
\usepackage[10pt]{extsizes}
\usepackage{makeidx}
\begin{document}
\printindex
\end{document}

我的 idx 文件包含以下条目:

\indexentry{Aims of regulation}{3}
\indexentry{Cost of regulation}{4}

现在我想知道如何编辑我的 indexentry 命令以允许章节编号,因此索引看起来像:

监管目的,...... Ch5.p3

监管成本,......Ch5.p4

我试图使用:

\indexentry{Aims of regulation}{Ch5.p3}
\indexentry{Cost of regulation}{Ch5.p4}

但这不起作用,因为我认为只接受数字。

我的目的只是利用 MakeIndex,这样就可以自动创建一个已排序的 .ind 文件,然后我只需将其打印为 PDF 文件即可。

有什么建议么?

谢谢。

答案1

Makeindex 支持复合页码。以下示例使用第一部分作为章节号,第二部分作为页码。创建 makeindex 的样式文件以添加宏标记,该标记定义为分析页码以添加格式(添加Ch、点和p)。

\documentclass[a4paper,10pt]{book}
\usepackage{makeidx}
\makeindex

\usepackage{etoolbox}
\makeatletter
% Write composite page numbers of the form <ch>-<pg>
\patchcmd\@wrindex{\thepage}{\thechapter-\thepage}{}{%
  \@latex@error{Patching `\string\@wrindex` failed}\@ehc
}

\newif\ifChapterPageRange
\def\ChapterPageRangetrue{\global\let\ifChapterPageRange\iftrue}
\def\ChapterPageRangefalse{\global\let\ifChapterPageRange\iffalse}
\newcommand*{\ChapterPage}[1]{%
  \expandafter\@ChapterPage\romannumeral-`\x#1\@nil
}
\def\@ChapterPage#1\@nil{%
  \@@ChapterPage#1--\@nil{#1}%
}
\def\@@ChapterPage#1-#2-#3\@nil#4{%
  \def\ChapterPage@Temp{#2}%
  \ifx\ChapterPage@Temp\@empty
    \global\let\ChapterPage@Chapter\@empty
    \romannumeral-`\x#4%
  \else
    \ifChapterPageRange
      \def\ChapterPage@Temp{#1}%
      \ifx\ChapterPage@Temp\ChapterPage@Chapter
        p#2%
      \else
        Ch#1.p#2%
      \fi
      \ChapterPageRangefalse
    \else
      Ch#1.p#2%
      \gdef\ChapterPage@Chapter{#1}%
    \fi
  \fi
}
\let\ChapterPage@Chapter\@empty
\makeatother

\usepackage{filecontents}
\begin{filecontents*}{\jobname.mst}
page_compositor "-"
delim_0 ", \\ChapterPage{"
delim_1 ", \\ChapterPage{"
delim_2 ", \\ChapterPage{"
delim_n "}, \\ChapterPage{"
delim_r "}--\\ChapterPageRangetrue\\ChapterPage{"
delim_t "}\\ChapterPageRangefalse"
encap_infix "{\\ChapterPage{"
encap_suffix "}}"
\end{filecontents*}

\begin{document}
\chapter{First chapter}
\index{Aims of regulation|textbf}
\newpage
\null\index{Aims of regulation|textbf}
\newpage
\null\index{Aims of regulation|textbf}
\addtocounter{chapter}{3}
\chapter{Regulation}
Aims of regulation\index{Aims of regulation}
\newpage
Cost of regulation\index{Cost of regulation}

\printindex
\end{document}

结果

原始索引文件\jobname.idx

\indexentry{Aims of regulation|textbf}{1-1}
\indexentry{Aims of regulation|textbf}{1-2}
\indexentry{Aims of regulation|textbf}{1-3}
\indexentry{Aims of regulation}{5-5}
\indexentry{Cost of regulation}{5-6}

已排序并格式化的索引文件\jobname.ind

\begin{theindex}

  \item Aims of regulation, \ChapterPage{
                \textbf{\ChapterPage{1-1}--\ChapterPageRangetrue\ChapterPage{1-3}}}, \ChapterPage{
                5-5}\ChapterPageRangefalse

  \indexspace

  \item Cost of regulation, \ChapterPage{5-6}\ChapterPageRangefalse

\end{theindex}

评论:

  • 索引样式文件\jobname.mst由 makeindex 自动加载。
  • 支持encapmakeindex 的和页面范围功能。
  • 在页面范围内,如果章节相同,则第二个章节前缀将被抑制。
  • \x`技巧\romannumeral-删除了起始空格。
  • “Ch.p”格式看起来不太好。

答案2

这是我能找到的最好的解决方法...希望它对你有用。

首先,创建一个自定义.ist文件,调用它myfile.ist并将其放在您的.tex文件所在的位置。

我的文件

delim_0 ", \\dotfill Ch0.p"
delim_1 ", \\dotfill Ch0.p"
delim_2 ", \\dotfill Ch0.p"
delim_n ", Ch0.p"

那么假设这是你的.tex文件

我的文件.tex

\documentclass{book}
\usepackage{makeidx}

\makeindex

\begin{document}

\chapter{First}

Cost of regulation\index{Cost of regulation}. Aims of regulation\index{Aims of regulation}.

\chapter{Second}

Aims of regulation\index{Aims of regulation}.

\printindex

\end{document} 

此时,运行该序列:

pdflatex 我的文件

makeindex -s myfile.ist myfile.idx

现在打开文件myfile.ind,其内容如下:

\begin{theindex}

  \item Aims of regulation, \dotfill Ch0.p1, Ch0.p3

  \indexspace

  \item Cost of regulation, \dotfill Ch0.p1

\end{theindex}

将章节编号替换为正确的编号:

\begin{theindex}

  \item Aims of regulation, \dotfill Ch1.p1, Ch2.p3

  \indexspace

  \item Cost of regulation, \dotfill Ch1.p1

\end{theindex}

此时再次运行

pdflatex 我的文件

你将拥有

在此处输入图片描述

答案3

我已将您的代码调整如下:

\usepackage{etoolbox}
\makeatletter
% Write composite page numbers of the form <ch>-<pg>
\patchcmd\@wrindex{\thepage}{\thechapter-\thepage}{}{%
  \@latex@error{Patching `\string\@wrindex` failed}\@ehc
}

\newif\ifChapterPageRange
\def\ChapterPageRangetrue{\global\let\ifChapterPageRange\iftrue}
\def\ChapterPageRangefalse{\global\let\ifChapterPageRange\iffalse}
\newcommand*{\ChapterPage}[1]{%
  \expandafter\@ChapterPage\romannumeral-`\x#1\@nil
}
\def\@ChapterPage#1\@nil{%
  \@@ChapterPage#1--\@nil{#1}%
}
\def\@@ChapterPage#1-#2-#3\@nil#4{%
  \def\ChapterPage@Temp{#2}%
  \ifx\ChapterPage@Temp\@empty
    \global\let\ChapterPage@Chapter\@empty
    \romannumeral-`\x#4%
  \else
    \ifChapterPageRange
      \def\ChapterPage@Temp{#1}%
      \ifx\ChapterPage@Temp\ChapterPage@Chapter
        #2%
                %p#2%
      \else
              \textbf{#1}:#2%
        %Ch#1:p#2%
      \fi
      \ChapterPageRangefalse
    \else
          \textbf{#1}:#2%
      %Ch#1:p#2%
      \gdef\ChapterPage@Chapter{#1}%
    \fi
  \fi
}
\let\ChapterPage@Chapter\@empty
\makeatother

\usepackage{filecontents}
\begin{filecontents*}{\jobname.mst}
heading_prefix "{\\bfseries\\hfil " % Insert in front of letter 
heading_suffix "\\hfil}\\nopagebreak\n" % Append after letter 
headings_flag 1 % Turn on headings (uppercase)

page_compositor "-"
delim_0 "\\dotfill \\ChapterPage{"
delim_1 "\\dotfill \\ChapterPage{"
delim_2 "\\dotfill \\ChapterPage{"
delim_n "}, \\ChapterPage{"
delim_r "}--\\ChapterPageRangetrue\\ChapterPage{"
delim_t "}\\ChapterPageRangefalse"
encap_infix "{\\ChapterPage{"
encap_suffix "}}"
\end{filecontents*}

因此现在生成一个索引条目,例如:

监管成本............1:1

但是例如,如果我在不同的页面上有相同的索引条目,比如第 4 页,那么我的索引条目将如下所示:

监管成本......1:1,1:4

我该如何调整代码来获得如下结果:

监管成本.........1:1,4

谢谢。

抱歉 - 我知道这是在寻求帮助,不应该在这里做。但是评论框不允许我输入这么多内容。

相关内容