考虑一下代码
\documentclass{book}
\usepackage{tcolorbox}
\usepackage{imakeidx}
\makeindex
\usepackage{idxlayout}
\newtcbox{\blackbox}[1][]{nobeforeafter, notitle, %sharpcorners,
colframe=yellow!20!black,
colback=yellow!50!black,
top=4pt,
left=5pt,
right=5pt,
bottom=2pt,
fontupper=\sffamily\bfseries,
colupper=white,
tcbox raise base,
#1}
\usepackage{enumitem}
\setlist{label*={\blackbox{\arabic*}}}
\begin{document}
\Large
\begin{enumerate}
\item Contains stuff to be indexed by item number.\index{1st item index entry}
\item Contains more stuff to be similarly indexed.\index{2nd item index entry}
\item And lots more stuff to be index the same way.\index{3rd item index entry}
\item etc.\index{4th item index entry}
\item etc. etc.\index{5th item index entry}
\item etc. etc. etc.\index{6th item index entry}
\end{enumerate}
\idxlayout{columns=2}
\printindex
\end{document}
在第一页产生以下输出:
连同指数
问题:我如何才能轻松地修改代码,pdflatex
以便在索引中划定具体的项目编号而不是页码(在本例中统一为 1)?
答案1
要做到这一点,需要对\index
命令进行一些小改动。首先,我们将查找其定义(texdoc source2e
然后转到文件 P 索引和词汇表生成(第 743 页)查找当前定义:
\def\makeindex{%
\newwrite\@indexfile
\immediate\openout\@indexfile=\jobname.idx
\def\index{% ❶
\@bsphack % ❷
\begingroup % ❸
\@sanitize % ❸
\@wrindex
}%
\typeout{Writing index file \jobname.idx}%
}
\def\@wrindex#1{%
\protected@write\@indexfile{}%
{\string\indexentry{#1}{\thepage}}% ❹
\endgroup % ❸
\@esphack % ❷
}
为了更加清晰,我对格式做了一些细微的更改。
一些值得注意的事情:
\index
在命令中(重新)定义 ❶\makeindex
。文件中稍低一点的默认定义\index
本质上是一个无操作。\@bsphack
…\@esphack
是 LaTeX 中用到的一个巧妙的装置,它有几个不同的命令,因此如果你写了类似这样的内容:this \index{index entry} that
输出中仍然只有一个空格。它甚至可以正确管理句末空格。但是,如果段落末尾有空格,有时会导致输出不良,因为本来应该丢弃的空格将被保留,并可能导致输出空白行。
\index
会将其输入中的任何特殊字符视为非特殊字符,这就是为什么所有内容周围都有一个组,\@sanitize
用于更改字符代码,并且\@wrindex
必须是单独的宏(否则在读取参数时类别代码就已经被冻结了)。但是,如果\index
出现在另一个命令的参数中,这种花哨的处理方法就不起作用了,这可能会导致令人惊讶的重复索引条目,例如,如果\index{\d{o}}
在文档中出现两次,一次在脚注中,一次在脚注之外。¹
但是,你会说,我不想写论文,我只想改变索引的内容。这很合理。我们需要做的是修改的定义以使用枚举计数器而不是页码。为此,我们只需更改 ❹\@wrindex
的位置即可。\thepage
你的第一个想法可能是写
\makeatletter
\def\@wrindex#1{%
\protected@write\@indexfile{}%
{\string\indexentry{#1}{\theenumi}}%
\endgroup
\@esphack}
\makeatother
并宣布胜利,但是如果您有嵌套的枚举,并且想要下面的 bar 的引用为 1(a),该怎么办?
福
A。 酒吧
b.baz
Bam
在这种情况下,我们可以改写\@currentlabel
为,这将导致写入的值成为可以用和\theenumi
引用的最新计数器(并且枚举项在该列表中)。\label
\ref
- 你能看出我最近花了很多时间做索引吗?