多词术语的自动索引输入

多词术语的自动索引输入

我是个懒人。输入的内容越少越好,所以我正在尝试制作一个宏来自动排列多词术语(实际上是复合名词)的索引条目。

通常你必须输入:

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

在此处输入图片描述

相关内容