在回忆录中使用自定义索引命令时必须采取哪些预防措施?

在回忆录中使用自定义索引命令时必须采取哪些预防措施?

我正在尝试编写自己的索引前端命令来执行诸如突出显示主要引用之类的操作,但排序似乎出了问题。这是我的 MWE:

\documentclass[a4paper,12pt]{memoir}
\usepackage[x11names]{xcolor}
\colorlet{indexmain}{Red3}
\newcommand{\ixxmain}[1]{{\bfseries\color{indexmain}#1}}
\newcommand{\ixmain}[1]{\index{#1|ixxmain}}
\newcommand{\id}{\textsc{id}}
\makeindex
\begin{document}
Hallo! I need this to get some output on pass 1.
\ixmain{session id@session \id{}}
\index{session id@session \id{}!structure}
\ixmain{session id@session \id{}!uniqueness}
\backmatter
\printindex
\end{document}

结果是:

输出 pdf 的屏幕截图

在检查.idx文件时,thot plickens说:

\indexentry{session id@session \textsc  {id}{}|ixxmain}{1}
\indexentry{session id@session \id{}!structure}{1}
\indexentry{session id@session \textsc  {id}{}!uniqueness|ixxmain}{1}

我的问题是:

  1. 我怎样才能停止\id{}在这里扩张?
  2. 无论如何,鉴于第一级是一样的(我认为),在makeindex做什么(.ind当然,文件反映了输出)?

澄清:我尝试过makeindex使用和不使用-c参数来运行。

答案1

\index半逐字地读取其参数,这就是为什么基本\index阻止\id扩展,但在宏中 catcode 更改没有效果。

现在你可以使用\detokenize类似以下方法简化扩展控制

\documentclass[a4paper,12pt]{memoir}
\usepackage[x11names]{xcolor}
\colorlet{indexmain}{Red3}
\newcommand{\ixxmain}[1]{{\bfseries\color{indexmain}#1}}
\newcommand{\ixmain}[1]{\index{#1|ixxmain}}
\newcommand{\id}{\textsc{id}}
\AtBeginDocument{%
\let\oldindex\index
\def\index#1{\oldindex{\detokenize{#1}}}%
}
\makeindex
\begin{document}
Hallo! I need this to get some output on pass 1.
\ixmain{session id@session \id{}}
\index{session id@session \id{}!structure}
\ixmain{session id@session \id{}!uniqueness}
\backmatter
\printindex
\end{document}

产生

在此处输入图片描述

答案2

(对于评论来说这太长了。)

如果我按以下方式编写您的索引命令:

\ixmain{session id@session \string\id{}}
\index{session id@session \id{}!structure} 
\ixmain{session id@session \string\id{}!uniquenes}

那么.idx文件看起来是这样的:

\indexentry{session id@session \id{}|ixxmain}{1}
\indexentry{session id@session \id{}!structure}{1}  
\indexentry{session id@session \id{}!uniqueness|ixxmain}{1}

但我不确定这是否是你所希望的。

\documentclass[a4paper,12pt]{memoir}  
\usepackage[x11names]{xcolor} 
\colorlet{indexmain{Red3}  
\newcommand{\ixxmain}[1]{{\bfseries\color{indexmain}#1}} 
\newcommand{\ixmain}[1]{\index{#1|ixxmain}}
\newcommand{\id}{\textsc{id}}     
\newcommand{\sessionid}[1][]{session \id\ixmain{session id@session \string\id{}#1}}% 

%% to compare the difference between using \string or not
%% independent of \ixxmain's fontifying effects:
\newcommand{\sessionidd}[1][]{session \id\index{session id@session \string\id{}#1}}%
%% uncomment this one to see the difference:
% \renewcommand{\sessionidd}[1][]{session \id\index{session id@session \id{}#1}}%
\makeindex
\begin{document}      
Hallo! I need this to get some output on pass1.  
What about the \sessionid[!not unique]  
More about the \sessionid?!    
\newpage
\ixmain{session id@session \string\id{}}        
\index{session id@session \id{}!structure} 
\ixmain{session id@session \string\id{}!uniqueness}  
\backmatter 
\printindex   
\end{document}

答案3

大卫·卡莱尔的回答运行良好,直到我hyperref重新添加。(我把它拿出来用于 MWE。)使用 hyperref,解决方案会生成格式错误的.idx条目:

-->                                  ?       ?
\indexentry{session id@session \id {}|ixxmain|hyperpage}{8}

因此,使用 hyperref 时,我使用的解决方案是用\index我自己的 替换我的项目ixnorm,其操作方式ixmain与 David 的 类似,并且效果相同\detokenize

\newcommand*{\ixxnorm}[1]{{\hyperpage{#1}}}
\newcommand{\ixnorm}[1]{\index{#1|ixxnorm}}

这似乎是一个有效的解决方案,但是如果我需要额外的功能(例如另请参阅),它可能会给我带来麻烦。

相关内容