对于给定的作品,我使用计数器在整个文档中进行连续的数字旋转。我需要索引条目引用段落编号而不是页面编号。这与此主题,除了我没有使用memoir
但book
。不幸的是,从一个文档类切换到另一个文档类时,提出的解决方案不再起作用。
我一直在关注另一个线程。这个解决方案看起来确实不错,只不过它显示的是计数器的标题而不是计数器的数字。
以下是代码:
\begin{filecontents*}{raphink.ist}
delim_0 ""
\end{filecontents*}
\documentclass[a4paper]{report}
\usepackage{etoolbox}
\newcounter{subpara}
\newcommand\numsubpara[1]{%
\stepcounter{subpara}%
\expandafter\gdef\csname cursec\thesubpara\endcsname{#1}%
\thesubpara. \textbf{#1}}
\usepackage{imakeidx}
\makeindex[options=-s raphink]
\makeatletter
\let\@Index\@index
\patchcmd{\@Index}{\@wrindex}{\@Wrindex}{}{}
\let\@Wrindex\@wrindex
\patchcmd{\@Wrindex}{\thepage}{\thesubpara}{}{}
\let\xIndex\index
\patchcmd{\xIndex}{\@index}{\@Index}{}{}
\patchcmd{\xIndex}{\@index}{\@Index}{}{}
\let\protected@iwrite\protected@write
\patchcmd{\protected@iwrite}{\write}{\immediate\write}{}{}
\patchcmd{\@Wrindex}{\protected@write}{\protected@iwrite}{}{}
\makeatother
\newcommand{\Index}[1]{\xIndex{#1|transform}}
\newcommand{\transform}[1]{\forcsvlist\decodesec{#1}}
\newcommand{\decodesec}[1]{, \csname cursec#1\endcsname}
\begin{document}
\chapter{Test1}
\numsubpara{title1}
\Index{Test}
\chapter{Test2}
\numsubpara{title2}
\Index{Test}
\printindex
\end{document}
结果如下:
如果我理解得好的话,我就必须转换一下:
\newcommand\numsubpara[1]{%
\stepcounter{subpara}%
\expandafter\gdef\csname cursec\thesubpara\endcsname{#1}%
\thesubpara. \textbf{#1}}
为了那个原因 :
\newcommand\numsubpara[1]{%
\stepcounter{subpara}%
\expandafter\gdef\csname cursec\thesubpara\endcsname{\thesubpara}%
\thesubpara. \textbf{#1}}
但是当我这样做时,我得到了这个结果:
而不是“测试,1,2”。
有人知道如何让索引条目引用段落编号而不是页码吗?
答案1
了解输出的值\thesubpara
在您的示例中,\thesubpara
始终指计数器采用的最后一个值。如果您使用 4 个索引\subpara
(而不是示例中的 2 个)进行测试,则始终会得到 4 个值,这表明\thesubpara
索引中的值指的是文档中变量的“最后状态”,而不是它在设置位置的值(这是您想要获得的)- 因此它不指当前示例中的页面(这似乎是您最初的想法)。
顺便一提
使用您当前的配置,您最多只能使用相同的\Index
标签两次,因此只有在您之后将其切换出来时它才会起作用,例如\Index{Bla}
,如果您添加
\newpage bla \newpage bla
\chapter{Test3}
\numsubpara{title3}
\Index{Bla}
\chapter{Test4}
\numsubpara{title4}
\Index{Bla}
在您的文档中,您可以看到,即使使用\newpage
s,您仍然会得到值 4,而不是当前最后一页的 6。
快速解决方案
你看过这个(问题:对索引使用不同的计数器(makeidx))还没有?它似乎提供了想要的输出。添加:
\newcounter{NewCounter}
\makeatletter
\newcommand{\Indextest}[1]{\imki@wrindexentry{MyIndex}{#1}{\theNewCounter}}
\makeatother
\makeindex[name=MyIndex]
在当前示例之前\begin{document}
和之后添加(用于测试):\printindex
\stepcounter{NewCounter}\chapter{Test}\Indextest{Test}
\arabic{NewCounter}
\stepcounter{NewCounter}\chapter{Test}\Indextest{Test}
\arabic{NewCounter}
\newpage
\stepcounter{NewCounter}\chapter{Test}\Indextest{blurb}
\arabic{NewCounter}
\stepcounter{NewCounter}\chapter{Test}\Indextest{Test}
\arabic{NewCounter}
\printindex[MyIndex]
这应该会产生所需的行为,如下所示: