Недавно я обновил l3kernel
и другие пакеты и установил biblatex-chem
и libertinust1math
. Теперь я получаю сообщение об ошибке с acro
пакетом.
В частности, я пытаюсь использовать \emph{\Iac{NFA}}
и получаю сообщение «ОШИБКА: Отсутствует число, рассматривается как ноль» \l__acro_article_Indefinite_bool
в следующем минимальном примере. (Полное сообщение об ошибке см. ниже.) До обновления и установки вышеуказанных пакетов все работало правильно с документом, из которого я взял этот пример.
Я не уверен, что происходит, хотя это, кажется, связано с biblatex
чем-то. Кто-нибудь знает, что является причиной этого?
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\addbibresource{biblatex-examples.bib}
\usepackage{acro}
\DeclareAcronym{NFA}{%
short = NFA,
short-indefinite = an,
long = nondeterministic finite automaton,
long-plural-form = nondeterministic finite automata%
}
\listfiles
\begin{document}
\emph{\Iac{NFA}} is a mathematical machine.
\cite{knuth:ct:a}
\end{document}
Вот часть файла, .log
связанного с ошибкой. Полный .log
файл можно найти по адресу.журнал ошибок
\openout3 = `thesis.bcf'.
Package biblatex Info: Trying to load bibliographic data...
Package biblatex Info: ... file 'thesis.bbl' found.
(./thesis.bbl)
Package biblatex Info: Reference section=0 on input line 16.
Package biblatex Info: Reference segment=0 on input line 16.
\l__acro_aux_file_iow=\write4
\openout4 = `thesis.acr'.
\AtBeginShipoutBox=\box46
(/usr/local/texlive/2020basic/texmf-dist/tex/latex/translations/translations-ba
sic-dictionary-english.trsl
File: translations-basic-dictionary-english.trsl (english translation file `tra
nslations-basic-dictionary')
)
Package translations Info: loading dictionary `translations-basic-dictionary' f
or `english'. on input line 16.
./thesis.tex:17: Missing number, treated as zero.
<to be read again>
\l__acro_article_Indefinite_bool
l.17 \emph{\Iac{NFA}}
is a mathematical machine.
A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)
Package atveryend Info: Empty hook `BeforeClearDocument' on input line 19.
[1{/usr/local/texlive/2020basic/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
Package atveryend Info: Executing hook `AfterLastShipout' on input line 19.
(./thesis.aux (./thesis.acr))
Package atveryend Info: Empty hook `AtVeryEndDocument' on input line 19.
решение1
Ой! Это подло.
Во-первых, проблема не связана (вроде как) с biblatex
. Проблема появляется там только потому, что biblatex
добавляется \NoCaseChange
к expl3
's \text_expand:n
. Если вы делаете это вручную с помощью
\ExplSyntaxOn
\tl_put_right:Nn \l_text_expand_exclude_tl { \NoCaseChange }
\tl_put_right:Nn \l_text_case_exclude_arg_tl { \NoCaseChange }
\cs_set_eq:NN \NoCaseChange \use:n
\ExplSyntaxOff
можно убрать biblatex
из уравнения.
Проблема в том, что \NoCaseChange
равно \use:n
, и \use:n
являетсяочень сильновездесущий макрос, так что он сделает что угодносмотретькак \NoCaseChange
, что нехорошо. В конкретном случае acro
он использует \tl_map_tokens:nn
для итерации списка, содержащего {indefinite}
, и в конечном итоге достигает кода, который выглядит так:
\use:n{\__acro_article:nnn {NFA}{long-acc}}{indefinite}
который должен передать {indefinite}
список токенов в \__acro_article:nnn {NFA}{long-acc}
, что отлично работает... если только не \use:n
означает пропустить аргумент при изменении регистра, что здесь и происходит: элемент \__acro_article:nnn
пропускается, а indefinite
его заглавные буквы меняются на Indefinite
, и все сходит с рельсов.
Я думаю, что правильным способом исправить это было бы сделать\NoCaseChange
другойот \use:n
и \@firstofone
так, чтобы не так легко было ошибиться:
\ExplSyntaxOn
\cs_gset:Npn \NoCaseChange #1 { \use:n {#1} }
\ExplSyntaxOff
Добавьте это в документ после загрузки biblatex
, и все должно работать нормально:
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\addbibresource{biblatex-examples.bib}
\usepackage{acro}
\DeclareAcronym{NFA}{%
short = NFA,
short-indefinite = an,
long = nondeterministic finite automaton,
long-plural-form = nondeterministic finite automata%
}
\listfiles
%% Workaround to \NoCaseChange and \tl_map_tokens:nn issue:
\ExplSyntaxOn
\cs_gset:Npn \NoCaseChange #1 { \use:n {#1} }
\ExplSyntaxOff
\begin{document}
\emph{\Iac{NFA}} is a mathematical machine.
\cite{knuth:ct:a}
\end{document}