枚举文档的索引

枚举文档的索引

考虑一下代码

\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 % ❷
}

为了更加清晰,我对格式做了一些细微的更改。

一些值得注意的事情:

  1. \index在命令中(重新)定义 ❶ \makeindex。文件中稍低一点的默认定义\index本质上是一个无操作。

  2. \@bsphack\@esphack是 LaTeX 中用到的一个巧妙的装置,它有几个不同的命令,因此如果你写了类似这样的内容:

    this
    \index{index entry}
    that
    

    输出中仍然只有一个空格。它甚至可以正确管理句末空格。但是,如果段落末尾有空格,有时会导致输出不良,因为本来应该丢弃的空格将被保留,并可能导致输出空白行。

  3. \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),该怎么办?

  1. A。 酒吧

    b.baz

  2. Bam

在这种情况下,我们可以改写\@currentlabel为,这将导致写入的值成为可以用和\theenumi引用的最新计数器(并且枚举项在该列表中)。\label\ref


  1. 你能看出我最近花了很多时间做索引吗?

相关内容