Суффиксы аббревиатур глоссариев не относятся к последнему загруженному языку.

Суффиксы аббревиатур глоссариев не относятся к последнему загруженному языку.

В руководстве пользователя 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}

указывает, что это не так с:

  1. его .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)
    
  2. суффикс пустой, как в случае с французским языком, но не с английским, голландским или немецким.

Еще более странно, если список языков указан на уровне класса документа:

\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) пытается определить языки документа следующим образом:

  1. Если tracklangявно загружены такие параметры, как:

    \usepackage[french,ngerman,dutch,english]{tracklang}
    

    или если он выбирает параметры класса документа, такие как:

    \documentclass[french,ngerman,dutch,english]{article}
    \usepackage{tracklang}
    

    затем tracklang.styбудет отслеживать языки или диалекты в соответствии с порядком, в котором они были определены tracklang.tex(полный список предопределенных языков и диалектов можно найти в \@tracklang@declaredoptions).

  2. Если 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списке опций.

Связанный контент