如何通过垂直线

如何通过垂直线

我有以下问题。一般的想法是测试 #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}

相关内容