В руководстве пользователя glossaries
(v4.42) утверждается (стр. 48):
Примечание: суффиксы, используемые для образования форм множественного числа, если оно не указано, задаются
\glspluralsuffix
(для общих записей) [...]Это означает, что действующий суффикс будет соответствовать последнему загруженному языку, который переопределил эти команды.
Но следующий MCE:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[french,ngerman,dutch,english]{babel}
\usepackage{glossaries}
\newacronym{gnu}{GNU}{GNU's Not Unix}
\begin{document}
\gls{gnu}
\glspl{gnu}
\end{document}
указывает, что это не так с:
его
.log
файл показывает, что последний загруженный.ldf
файл — это файл с 1- го загруженного языка:(/usr/local/texlive/2018/texmf-dist/tex/latex/glossaries-english/glossaries-english.ldf) (/usr/local/texlive/2018/texmf-dist/tex/latex/glossaries-dutch/glossaries-dutch.ldf) (/usr/local/texlive/2018/texmf-dist/tex/latex/glossaries-german/glossaries-german.ldf) (/usr/local/texlive/2018/texmf-dist/tex/latex/glossaries-french/glossaries-french.ldf)
суффикс пустой, как в случае с французским языком, но не с английским, голландским или немецким.
Еще более странно, если список языков указан на уровне класса документа:
\documentclass[french,ngerman,dutch,english]{article}
...
\usepackage{babel}
...
порядок загрузки glossaries-*.ldf
кажется случайным:
(/usr/local/texlive/2018/texmf-dist/tex/latex/glossaries-dutch/glossaries-dutch.ldf)
(/usr/local/texlive/2018/texmf-dist/tex/latex/glossaries-english/glossaries-english.ldf)
(/usr/local/texlive/2018/texmf-dist/tex/latex/glossaries-french/glossaries-french.ldf)
(/usr/local/texlive/2018/texmf-dist/tex/latex/glossaries-german/glossaries-german.ldf)
Видите, что происходит?
решение1
Порядок загрузки определяется tracklang
списком отслеживаемых языков/диалектов (то есть списком идентифицированных языков/диалектов документа).
Пакет tracklang
(который используется glossaries
) пытается определить языки документа следующим образом:
Если
tracklang
явно загружены такие параметры, как:\usepackage[french,ngerman,dutch,english]{tracklang}
или если он выбирает параметры класса документа, такие как:
\documentclass[french,ngerman,dutch,english]{article} \usepackage{tracklang}
затем
tracklang.sty
будет отслеживать языки или диалекты в соответствии с порядком, в котором они были определеныtracklang.tex
(полный список предопределенных языков и диалектов можно найти в\@tracklang@declaredoptions
).Если
tracklang.sty
не подбирает никаких опций пакетов, то он проверит, загружены ли какие-либо известные языковые пакеты. Сначала он проверяет, определено ли\bbl@loaded
(предоставленоbabel
). Если это так, тоtracklang.sty
он будет перебирать список и отслеживать известные диалектные метки или предупреждать, если найдена нераспознанная метка. Это означает, что с:\usepackage[french,ngerman,dutch,english]{babel} \usepackage{tracklang}
тогда порядок будет соответствовать порядку
\bbl@loaded
.
Например, параметры класса документа:
\documentclass[french,ngerman,dutch,english]{article}
\usepackage{tracklang}
\makeatletter
\show\@tracklang@languages
\show\@tracklang@dialects
\begin{document}
\end{document}
Стенограмма показывает:
> \@tracklang@languages=macro:
->dutch,english,french,german.
l.5 \show\@tracklang@languages
?
> \@tracklang@dialects=macro:
->dutch,english,french,ngerman.
l.6 \show\@tracklang@dialects
С babel
:
\documentclass{article}
\usepackage[french,ngerman,dutch,english]{babel}
\usepackage{tracklang}
\makeatletter
\show\@tracklang@languages
\show\@tracklang@dialects
\show\bbl@loaded
\begin{document}
\end{document}
Теперь стенограмма показывает:
> \@tracklang@languages=macro:
->english,dutch,german,french.
l.6 \show\@tracklang@languages
?
> \@tracklang@dialects=macro:
->english,dutch,ngerman,french.
l.7 \show\@tracklang@dialects
?
> \bbl@loaded=macro:
->english,dutch,ngerman,french.
l.8 \show\bbl@loaded
Таким образом, этот порядок соответствует babel
порядку, указанному в \bbl@loaded
.
Явное отслеживание каждого диалекта:
\documentclass{article}
\usepackage{tracklang}
\TrackPredefinedDialect{french}
\TrackPredefinedDialect{ngerman}
\TrackPredefinedDialect{dutch}
\TrackPredefinedDialect{english}
\makeatletter
\show\@tracklang@languages
\show\@tracklang@dialects
\begin{document}
\end{document}
Теперь стенограмма показывает:
> \@tracklang@languages=macro:
->french,german,dutch,english.
l.9 \show\@tracklang@languages
?
> \@tracklang@dialects=macro:
->french,ngerman,dutch,english.
l.10 \show\@tracklang@dialects
Порядок всегда соответствует порядку, в котором отслеживался язык/диалект, но в этом случае становится понятнее, каков этот порядок.
Проблема пакета glossaries
в том, что команды суффикса не могут быть добавлены к языковым хукам, поскольку нет способа гарантировать, когда команда будет расширена, и она может только следовать порядку, предоставленному языковыми пакетами, чтобы определить, какие .ldf
файлы необходимо загрузить. Суффикс действительно следует за последним загруженным языком, но порядок не гарантирует соответствия порядку, указанному в babel
списке опций.