我有以下问题。一般的想法是测试 #1 是否为空,如果不是,则写入垂直线“|”和 #1:
\documentclass{article}
\usepackage{makeidx,hyperref}
\makeindex
\newcommand{\textindex}[2][]{#2\index{#2%
\ifx\\#1\\%
% do nothing
\else
|#1%
\fi}}
\begin{document}
\textindex{Hello} \textindex[textbf]{World}
\printindex
\end{document}
\textindex{word}
应该制作word\index{word}
和\textindex[textbf]{word}
应该制作word\index{word|textbf}
。但在第二种情况下,我得到了Extra \else
错误。为什么?
编辑 将垂直线放入括号中{|}
有帮助,但括号仍保留在idx
文件中。
答案1
否\ifx\\#1\\
有xparse
:
\documentclass{article}
\usepackage{xparse,imakeidx,hyperref}
\makeindex
\NewDocumentCommand{\textindex}{om}{%
#2%
\IfNoValueTF{#1}
{\index{#2}}
{\index{#2|#1}}%
}
\begin{document}
\textindex{Hello} \textindex[textbf]{World}
\printindex
\end{document}
解释:该命令\textindex
有两个参数,一个是可选的o
,一个是必选的m
。如果传递了可选参数,即\textindex
后面跟着[...]
,则#1
具有传递的值并使条件为\IfNoValueTF{#1}
假,否则使条件为真\IfNoValueTF{#1}
。
如果你想使用这个\ifx\\#1\\
方法,那么只需要
\newcommand\textindex[2][]{%
#2%
\ifx\\#1\\%
\index{#2}%
\else
\index{#2|#1}%
\fi
}
但我不明白为什么在有更好的代码可用时还要使用笨拙的代码。
答案2
下面的例子可以正常工作:
\documentclass{article}
\usepackage{makeidx}
\makeindex
\newcommand{\textindex}[2][]{#2\index{#2%
\ifx\\#1\\%
% do nothing
\else
|#1%
\fi}}
\begin{document}
\textindex{Hello} \textindex[textbf]{World}
\printindex
\end{document}
如果|
处于活动状态,则\string
有助于:
\string|%
请注意,我已经注释掉行尾以避免插入不需要的空格。
另一种更具防御性的变体:
\makeatletter
\newcommand*{\textindex}[2][]{%
#2%
\def\testindex@param{#1}%
\index{%
\detokenize{#2}%
\ifx\testindex@param\@empty
\else
\detokenize{|#1}%
\fi
}%
}
\makeatother
- 对空虚的测试变得更加健全。
-
e-TeX 的 . 阻止了参数
#1
和的扩展(本来会逐字读取其参数,但定义阻止了这一点。)#2
\detokenize
\index
对于 来说,甚至更具防御性hyperref
,它需要解析 的内容\index
来找到封装命令,并\if
在此过程中破坏构造:
\documentclass{article}
\usepackage{makeidx}
\makeindex
\usepackage{hyperref}
\makeatletter
\newcommand*{\textindex}[2][]{%
#2%
\begingroup
\def\testindex@param{#1}%
\edef\x{%
\endgroup
\noexpand\index{%
\detokenize{#2}%
\ifx\testindex@param\@empty
\else
\detokenize{|#1}%
\fi
}%
}%
\x
}
\makeatother
\begin{document}
\textindex{Hello} \textindex[textbf]{World}
\printindex
\end{document}
原始索引文件.idx
:
\indexentry{Hello|hyperpage}{1}
\indexentry{World|hyperindexformat{\textbf}}{1}