从命令参数中删除数学运算以仅获取字母

从命令参数中删除数学运算以仅获取字母

我使用了一个小命令,它以粗体打印新定义的术语,添加标签并将它们添加到索引中。

\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}

相关内容