我正在尝试手动创建索引,其中每个索引条目引用一个页面和相应的章节。因此,基本上我正在创建自己的 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 自动加载。 - 支持
encap
makeindex 的和页面范围功能。 - 在页面范围内,如果章节相同,则第二个章节前缀将被抑制。
- \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
谢谢。
抱歉 - 我知道这是在寻求帮助,不应该在这里做。但是评论框不允许我输入这么多内容。