我想将 index 与 acro 一起使用:每当我使用首字母缩略词时,我都希望它自动出现在索引中。但是,不是缩写而是长名称!
我做了什么:我创建了一个新命令:
\newcommand{\acidx}[1]{\ac{#1}\index{\acl*{#1}}}
这有效。但是,latex 不会扩展 acl 宏前写入 ind 文件!混合index
和 acidx`idx 文件的内容为:
\begin{theindex}
\item \texttt {\acl *{ABC}}, \hyperpage{2}
\item \texttt {\acl *{DEF}}, \hyperpage{1, 2}
\indexspace
\item consetetur, \hyperpage{1}
\end{theindex}
可以看出,元素来自acidx
分组。我假设因为\acl
没有展开。如果展开了,它将被正确排序。
为了缓解这个问题,我尝试过
\newcommand{\acidx}[1]{\ac{#1}\index{#1@\acl*{#1}}}
但是,这并不十分清晰,因为(据我所知),索引现在是按照缩写而不是全名排序的,例如,对于 PHP,它将按照 PHP 而不是“超文本预处理器”排序。此外,这样做时,每个条目都用\indexspace
which 分隔,这也是不正确的。
有没有办法在写入 ind 文件之前强制索引扩展宏?
还有其他方法可以解决这个问题吗?
我真的很想避免使用像 xindy 这样的不同索引处理器!
答案1
包裹acronym
的内部可扩展版本\acl
是\AC@acl
。然后\index
在宏内部\acidx
将写入首字母缩略词的扩展长版本:
\documentclass{article}
\usepackage{acronym}
\usepackage{makeidx}
\makeindex
\makeatletter
\newcommand*{\acidx}[1]{%
\ac{#1}\index{\AC@acl{#1}}%
}
\makeatother
\acrodef{ABC}{alphabet}
\acrodef{DEF}{definition}
\begin{document}
The \acidx{ABC} contains all\index{all} letters. The \acidx{DEF}
is written with the help of the \acidx{ABC}.
\printindex
\end{document}
索引如下:
文件.idx
:
\indexentry{alphabet}{1}
\indexentry{all}{1}
\indexentry{definition}{1}
\indexentry{alphabet}{1}
包裹acro
acro
与基于 LaTeX3 的 包相同。从数据列表中\prop_get:NnNF
获取首字母缩略词 id 的属性并将结果存储在中,请参阅 的定义)。然后可以在 中使用结果标记列表变量:\l__acro_long_prop
#1
\l__acro_long_tl
\acro_get:n
\l__acro_long_tl
\index
\documentclass{article}
\usepackage{acro}
\usepackage{makeidx}
\makeindex
\ExplSyntaxOn
\newcommand*{\acidx}[1]{%
\ac{#1}%
\prop_get:NnNF \l__acro_long_prop {#1} \l__acro_long_tl {}
\index{\l__acro_long_tl}%
}
\ExplSyntaxOff
\DeclareAcronym{ABC}{short=ABC, long=alphabet}
\DeclareAcronym{DEF}{short=DEF, long=definition}
\begin{document}
The \acidx{ABC} contains all\index{all} letters. The \acidx{DEF}
is written with the help of the \acidx{ABC}.
\printindex
\end{document}