imakeidx:在将参数放入 .ind 文件之前对其进行扩展,以确保按字母顺序排列

imakeidx:在将参数放入 .ind 文件之前对其进行扩展,以确保按字母顺序排列

在我的文档中,我想突出显示特定单词并同时将它们添加到索引中。这个想法是用 引入关键词\foo{word},使其以不同的排版方式出现并出现在索引中,以便人们可以快速找到相应的定义。此外,我想要一个用于长关键词的可选参数,这样我就可以\foo[Word]{word with many adjectives}写成有很多形容词的单词打印在文档中并且“Word”出现在索引中。

但是,当不指定可选参数时,我希望将首字母大写,因为我想要大写的索引。当文本中有 (应该排版为小写)但在索引中应该大写时,这很有用。为此,我使用提供输出 的\foo{adjective}包。mfirstuc\makefirstuc{foo}Foo

我知道这\foo[Adjective]{adjective}可以完成工作,但是每次写出来都很繁琐。

我也知道

\NewDocumentCommand{\foo}{O{#2} m}{
\textbf{#2}
\index{\makefirstuc{#2}}
}

不起作用,因为它放入文件\makefirstuc{<#2>}.ind,使其按字母顺序排列,\这不是我想要的。imakeidx文档中也提到了这一点,但没有给出修复方法。

所以我尝试使用\expandafter给我

\NewDocumentCommand{\foo}{O{#2} m}{
\textbf{#2}
\index\expandafter{\makefirstuc{#2}}
}

但该参数在文本中打印了两次,并且没有出现在索引中。另外,这个问题还没有解决我的问题,我(真的)不明白它,而且我也没有能够expl3正常运行。

那么,如何\index在写入文件之前扩展其条目.ind,而不是将其扩展为纯文本(就像我的第二个宏那样)?

以下是 MWE:

\documentclass{article}

\usepackage{xparse}
\usepackage{mfirstuc}
\usepackage{imakeidx}
\makeindex[title = Index, columns =1]

\NewDocumentCommand{\fooa}{O{#2} m}{
    \textbf{#2}
    \index{\makefirstuc{#2}}
}

\NewDocumentCommand{\foob}{O{#2} m}{
    \textbf{#2}
    \index\expandafter{\makefirstuc{#2}}
}



\begin{document}
In this document i \fooa{highlight} some \foob{stuff} that i want to appear in the index in 
uppercase.
\index{Alphabetical order}
\printindex
\end{document}

请注意,结果的顺序不是按字母顺序排列的。

答案1

\makefirstuc不可扩展,但您可以使用\text_titlecase:n

\documentclass{article}

\usepackage{xparse}

\usepackage{imakeidx}
\makeindex[title = Index, columns =1]

\ExplSyntaxOn
\NewDocumentCommand{\fooa}{O{#2} m}{
    \textbf{#2}
    \index{\text_titlecase:n{#2}}
}

\NewDocumentCommand{\foob}{O{#2} m}{
    \textbf{#2}
    \index{\text_titlecase:n{#2}}
}
\ExplSyntaxOff


\begin{document}
In this document i \fooa{highlight} some \foob{stuff} that i want to appear in the index in
uppercase.
\index{Alphabetical order}
\printindex
\end{document}

在此处输入图片描述

相关内容