
Я хочу использовать индекс вместе с acro: Всякий раз, когда я использую аббревиатуру, я хочу, чтобы она автоматически была в индексе. Однако не аббревиатура, а длинное имя!
Что я сделал: Я создал новую команду:
\newcommand{\acidx}[1]{\ac{#1}\index{\acl*{#1}}}
Это работает. Однако латекс не расширяет макрос 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, а не по "Hypertext Preprocessor". Кроме того, при этом каждая запись разделяется, \indexspace
что также некорректно.
Есть ли способ заставить index раскрыть макрос перед записью 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
То же самое с package acro
, который основан на LaTeX3.
\prop_get:NnNF
получает свойство \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}