TLDR;我想要一个类似索引的命令充分在执行之前进行扩展,以便
\newcommand{\words}{Some important Words}\indexCMD{\words}
是确切地就像
\indexCMD{Some important Words}
- 好像在做任何事情\words
之前已经完全展开\index
请提供普通的 LaTeX。
我有一个严重的问题,我不知道该如何解决:
我想使用 splitidx 在我的本科论文末尾创建几个索引,但是,为了合并和自动化索引的某些部分,我正在编写一个宏,如果我使用\gls
(glossaries-extra) 或\ac
(acro) 的等效项,它会自动将一些内容添加到相应的索引中。我的问题是,每个索引条目都应有大写单词,因为我混合了德语和英语,并且正确排序。我希望有一个命令使 \index{some Words here AND there} 等同于 \index{Some Words Here AND There}
例子:
\documentclass{article}
\usepackage{splitidx}\makeindex
\newindex[Stichwortverzeichnis]{stw}
\newcommand{\inindex}[1]{#1\sindex[stw]{#1}}
\begin{document}
\inindex{Words are} not as important as other \inindex{words are}.
\printindex[stw]
\end{document}
\newcommand{\inindex}[1]{#1\sindex[stw]{#1@\protect\capitalisewords{#1}}}
只是表面上起作用,因为它们是按照名称排序的,所以“some Words here AND there”与“Some Words Here AND There} 的条目不同,它们出现了两次,但完全相同。我只懂 LaTeX,对 TeX 了解不多,希望能得到一个我能完全理解(通过解释每个步骤)并从中学习的答案。我尝试了各种形式的 \expandafter、\expanded 和 \noexpand,但从未成功。
相同的问题,不同的场景:
\Acl
来自\Acs
acro 包
\DeclareAcronym{cfd}{
short = CFD,
long = numerische Strömungsmechanik
}
\newcommand{\newglossaryentryac}[2]{
\newglossaryentryacKeyCommand[
id = {#1},
description = {#2},
longName = \Acl{#1},
shortName = \Acs{#1}
]
}
\newglossaryentryac{cfd}{Beschreibung}
我需要如何修改它,才能使其等同于
\newcommand{\newglossaryentryac}{
\newglossaryentryacKeyCommand[
id = {cfd} ,
description = {Beschreibung},
longName = Numerische Strömungsmechanik,
shortName = CFD
]
}
\newglossaryentryac
答案1
我的建议是定义一个可以同时执行\DeclareAcronym
和\newglossaryentry
业务的单一命令。
\documentclass{article}
\usepackage{acro,glossaries}
\makeglossaries
\ExplSyntaxOn
\keys_define:nn { learex/glossac }
{
short .tl_set:N = \l__clearex_glossac_short_tl,
long .tl_set:N = \l__clearex_glossac_long_tl,
}
\tl_new:N \l__clearex_glossac_Short_tl
\tl_new:N \l__clearex_glossac_Long_tl
\NewDocumentCommand{\newglossaryentryac}{mmm}
{% #1 = key, #2 = options, #3 = description
\keys_set:nn { learex/glossac }
{% clear all keys
short={},long={},
% assign the values
#2,
}
\tl_set:Nx \l__clearex_glossac_Short_tl
{
\text_titlecase_first:V \l__clearex_glossac_short_tl
}
\tl_set:Nx \l__clearex_glossac_Long_tl
{
\text_titlecase_first:V \l__clearex_glossac_long_tl
}
\use:x
{
% acro
\DeclareAcronym{#1}
{
short = \text_expand:n {\l__clearex_glossac_short_tl},
long = \text_expand:n {\l__clearex_glossac_long_tl},
}
% glossaries
\exp_not:N \newglossaryentry {#1}
{
name = \text_expand:n {\l__clearex_glossac_Long_tl},
\exp_not:n { description = #3\glslink{#1s} },
}
\exp_not:N \newglossaryentry{#1s}
{
name = \text_expand:n {\l__clearex_glossac_Short_tl},
\exp_not:n { description = {siehe~\gls{#1}} },
}
}
}
\cs_generate_variant:Nn \text_titlecase_first:n { V }
\ExplSyntaxOff
\newglossaryentryac{cfd}{
short = CFD,
long = numerische Strömungsmechanik
}{Beschreibung}
\newglossaryentryac{tst}{
short = TST,
long = test
}{Test}
\newglossaryentryac{ubr}{
short = übr,
long = über
}{Über}
\begin{document}
\Acl{cfd} \Acl{cfd} \acl{cfd} \Acs{cfd} \acs{cfd}
\gls{cfd} \gls{cfds}
\Acl{tst} \Acs{tst}
\gls{tst} \gls{tsts}
\Acl{ubr} \Acs{ubr} \acl{ubr} \acs{ubr}
\gls{ubr} \gls{ubrs}
\printglossaries
\end{document}
使用 可以将首字母大写\text_titlecase_first:n
。\use:x
部分是因为我们想要的是变量的值,而不是变量本身。 使用\text_expand:n
可以确保特殊字符不会被破坏。