我已经定义\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 一样),然后它#1
在space
字符处分裂 - 空格数为更大比
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}
答案3
我遵循了简单的解决方案(使用#1 = Name
和#2 = first name
)
newcommand{\Index}[2]{\index{#1, #2}#2~#1}
它可以正常工作,但有一个例外:它在名称后的文本中创建一个空格,就好像命令看起来像这样:
newcommand{\Index}[2]{\index{#1, #2}#2~#1~}
我该怎么做才能去掉空格?当名字出现在文本中的点或逗号之前时,这尤其令人讨厌。