我是个懒人。输入的内容越少越好,所以我正在尝试制作一个宏来自动排列多词术语(实际上是复合名词)的索引条目。
通常你必须输入:
...some others exhibit \textbf{complex behaviour}\index{behaviour!complex}
我想将其减少到
...some others exhibit \iterm{complex behaviour}
因此我提出了以下宏[MWE]:
\documentclass{book}
\usepackage{xspace,xstring,imakeidx}
\makeindex
\newcommand{\iterm}[1]{%
\def\myindex{#1}%
\IfSubStr{#1}{ }{%
\renewcommand{\myindex}{\StrBehind{#1}{ }!\StrBefore{#1}{ }}%
}{}%
#1\index{\myindex}\xspace%
}
\begin{document}
some others exhibit \iterm{behaviour!complex}
\printindex
\end{document}
还有一个可选参数,以防我必须强制输入,稍后我可能会添加代码来处理介词(例如\iterm{world of LaTeX} → \index{LaTex!world of}
,但它的解决方案是上述情况的特殊情况。
到目前为止我遇到了以下错误
\renewcommand\myindex
和\def\myindex
:- @index 的使用与其定义不符
- @firstoftwo 的参数有一个额外的}。
\edef\myindex
和\protected\edef\myindex
:- @xs@IfSubStr@@ 的使用与其定义不符
- @firstoftwo 的参数有一个额外的}。
- 段落在@firstoftwo 完成之前就结束了。
- } 太多。
\protected\def\myindex
和\DeclareRobustCommand
:- 不会导致错误,但不会将条目添加到索引中
\let\myindex
- 插入的控制序列丢失。
- } 太多。
我 100% 确信这是可行的,但还没有弄清楚。提前感谢您的建议和答案。
答案1
您需要将部分的拆分与索引制作命令分开。
\documentclass{book}
\usepackage{xstring,imakeidx}
\makeindex
\newcommand{\iterm}[1]{%
#1%
\IfSubStr{#1}{ }{%
\StrBehind{#1}{ }[\secondword]%
\StrBefore{#1}{ }[\firstword]%
\index{\secondword!\firstword}%
}{\index{#1}}%
}
\begin{document}
some others exhibit \iterm{complex behaviour}
Another \iterm{term}
And finish \iterm{z}
\printindex
\end{document}