我使用了一个小命令,它以粗体打印新定义的术语,添加标签并将它们添加到索引中。
\newcommand*{\defined}[1]{{\bf #1}\label{#1}\index{#1}}
现在,如果我这样做,\defined{$G$-invariant}
标签将不起作用,索引条目的排序位置也不正确。我认为这与数学美元符号有关。有没有办法去掉它,让标签和索引只显示 G?
答案1
以下是我修复它的方法:添加第二个可选参数作为排序键和标签:
\documentclass{article}
\usepackage{makeidx}
\usepackage{xparse}
\NewDocumentCommand{\defined}{mg}{%
{\bfseries #1}%
\IfNoValueTF{#2}
{\index{#1}\label{#1}}
{\index{#2@#1}\label{#2}}
}
\makeindex
\begin{document}
\defined{$G$-invariant} % Probably does it wrong
\defined{$G$-invariant}{G-invariant}
\printindex
\end{document}
作为替代方案,根据@egreg 的建议,使用“传统”方式执行可选参数:
\documentclass{article}
\usepackage{makeidx}
\usepackage{xparse}
\NewDocumentCommand{\defined}{om}{%
{\bfseries #2}%
\IfNoValueTF{#1}
{\index{#2}\label{#2}}
{\index{#1@#2}\label{#1@#2}}
}
\makeindex
\begin{document}
\defined{$G$-invariant}
\defined[G-invariant]{$G$-invariant}
\printindex
\end{document}
答案2
我肯定会选择 Bianca Lobo 的解决方案(实际上是替代方案)。但是,为了好玩,这里还有另一种方法。
可以删除$
符号,但这不是唯一的问题:如果删除,$
您\defined{$\Gamma$-function}
将遇到麻烦。此外,简单地删除$
无论如何都会在索引中留下不正确的条目。
但是,可以使用:@
功能\index
\index{something@something else}
MakeIndex 将用于something
排序,同时将“其他内容”写入索引条目。
这是一个做你想做的事情的复杂方法:
\documentclass{article}
\usepackage{xparse,l3regex}
\usepackage{imakeidx}
\makeindex
\ExplSyntaxOn
\NewDocumentCommand{\defined}{om}
{
\textbf{#2}
\IfNoValueTF{#1}
% No optional argument: do the complicated test
{ \heinz_index:n {#2} }
% Optional argument: use the simplest way
{ \label{#1}\index{#1@#2} }
}
\tl_new:N \l__heinz_index_tl
\cs_new_protected:Npn \heinz_index:n #1
{
% test if a $ is present in the argument
\tl_if_in:nnTF { #1 } { $ }
{ \__heinz_strip:n { #1 } } % a $ is scanned
{ \index{#1} } % no $, simple case
}
\cs_new_protected:Npn \__heinz_strip:n #1
{
% stringify the argument
\tl_set:Nx \l__heinz_index_tl { \tl_to_str:n { #1 } }
% remove $, backslash, spaces
\regex_replace_all:nnN { ( \$ | \\ | \s ) } { } \l__heinz_index_tl
% produce the \index command and the label
\__heinz_do_double_index:nV { #1 } \l__heinz_index_tl
}
\cs_new_protected:Npn \__heinz_do_double_index:nn #1 #2
{
\exp_args:NV \label \l__heinz_index_tl
\index{#2@#1}
}
\cs_generate_variant:Nn \__heinz_do_double_index:nn { nV }
\ExplSyntaxOff
\begin{document}
\defined{face}
\defined{$G$-invariant}
\defined{group}
\defined{$\Gamma$-function}
\defined[C-transform]{$\mathcal{C}$-transform}
\pageref{G-invariant}
\clearpage
\printindex
\end{document}
然而,在某些情况下,你必须以以下形式表达
\defined[<sorting key>]{<argument>}
因为在这种情况下执行的剥离$\mathcal{C}$-transform
不会有任何好处。人们可能会将要剥离的标记添加到列表中,但这很容易出错,而且这似乎并不是一个明智的做法。
还请注意,您必须在 中使用“精简版” \pageref
,因此请\pageref{G-invariant}
而不是\pageref{$G$-invariant}
。无论如何,诸如 这样的标签$\Gamma$-function
都是非法的。
答案3
使用 etex,\scantokens
您可以本地设置$
为忽略。这会将其从标签键以及 makeindex 使用的排序键中删除。原始数学字符串在字段后使用,@
因此它在索引中排版。
\documentclass{article}
\usepackage{makeidx}
\newcommand*{\defined}[1]{%
{\catcode`\$=9
\scantokens{\gdef\tmp{#1}}}%
\textbf{#1}\label{\tmp}\index{\tmp@#1}}
\makeindex
\begin{document}
\defined{$G$-invariant}
\defined{foo-invariant}
\printindex
\end{document}