在我的文档中,我想突出显示特定单词并同时将它们添加到索引中。这个想法是用 引入关键词\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}