索引:反转名称

索引:反转名称

我已经定义\Index标记一个单词或短语以进行索引并将其保存在文本中:

\newcommand{\Index}[1]{#1\index{#1}}

我如何定义一个宏来反转索引条目?例如,\NewIndex{Tom Jones}在文本中放入“Tom Jones”,在索引中放入“Jones, Tom”。

我试过了,\newcommand{\N}[2]{#1 #2\index{#2, #1}}但是\N{Tom Jones}在文本中显示“汤姆·琼斯, ”,而在索引中显示“,,汤姆·琼斯”。

如果可能的话,是否也可以提供具有任意数量元素的名称,以便\NewIndex{Tom Jones}如上所述工作,但\NewIndex{Homer W. Simpson}在文本中放置“Homer W. Simpson”,在索引中放置“Simpson,Homer W.”?(我的文本中只有少数特殊形式,例如“Homer Simpson Jr”,我可以手动处理它们。)

答案1

最简单的解决方案是定义

\newcommand{\Index}[2]{\index{#1, #2}#2~#1}

并使用

\Index{Jones}{Tom}

在您的文档中。它也将更容易搜索。

答案2

这是一个NewIndex按照你所描述的方式精确定义命令的方法;我使用了xstring包来完成繁重的工作。

它的工作原理是计算空格的数量#1,如果:

  • 空格数正好是1 (就像 Tom Jones 一样),然后它#1space字符处分裂
  • 空格数为更大1(如 Homer W. Simpson)那么它#1第二空格字符。

以下是完整代码,包括 arara指令 - 假设您将其保存为myfile.tex,则只需运行:

arara myfile

获得 完整 的pdf.

% arara: pdflatex
% arara: makeindex
% arara: pdflatex
% !arara: indent: {overwrite: yes}
\documentclass{article}
\usepackage{xstring}
\usepackage{makeidx}

\newcommand{\NewIndex}[1]{%
    % output the name in the text (as is)
    #1%
    % write the name to the index in format: last name, first name
    %
    % count the number of spaces in #1
    \StrCount{#1}{\space}[\numberofspaces]
    \ifnum\numberofspaces=1
        % Tom Jones (just one space)
        % find the position of the space character
        \StrPosition{#1}{\space}[\spaceCharacterPos]
    \else
        % Homer W. Simpson (more than one space)
        % find the position of the SECOND space character
        \StrPosition[2]{#1}{\space}[\spaceCharacterPos]
    \fi%
    % split #1 at the appropriate space character
    \StrSplit{#1}{\spaceCharacterPos}{\firstName}{\lastName}%
    \index{\lastName, \firstName}%
}

\makeindex
\begin{document}

\NewIndex{Tom Jones}

\NewIndex{Homer W. Simpson}

\clearpage
\printindex
\end{document}

你没有提到你正在使用的索引包,所以我假设makeidx;如果不同,你可能需要更改arara指令。

答案3

我遵循了简单的解决方案(使用#1 = Name#2 = first name

newcommand{\Index}[2]{\index{#1, #2}#2~#1}

它可以正常工作,但有一个例外:它在名称后的文本中创建一个空格,就好像命令看起来像这样:

newcommand{\Index}[2]{\index{#1, #2}#2~#1~}

我该怎么做才能去掉空格?当名字出现在文本中的点或逗号之前时,这尤其令人讨厌。

相关内容