![在回忆录中使用自定义索引命令时必须采取哪些预防措施?](https://linux22.com/image/253440/%E5%9C%A8%E5%9B%9E%E5%BF%86%E5%BD%95%E4%B8%AD%E4%BD%BF%E7%94%A8%E8%87%AA%E5%AE%9A%E4%B9%89%E7%B4%A2%E5%BC%95%E5%91%BD%E4%BB%A4%E6%97%B6%E5%BF%85%E9%A1%BB%E9%87%87%E5%8F%96%E5%93%AA%E4%BA%9B%E9%A2%84%E9%98%B2%E6%8E%AA%E6%96%BD%EF%BC%9F.png)
我正在尝试编写自己的索引前端命令来执行诸如突出显示主要引用之类的操作,但排序似乎出了问题。这是我的 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}
结果是:
在检查.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}
我的问题是:
- 我怎样才能停止
\id{}
在这里扩张? - 无论如何,鉴于第一级键是一样的(我认为),在
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}}
这似乎是一个有效的解决方案,但是如果我需要额外的功能(例如另请参阅),它可能会给我带来麻烦。