在以下 MCE 示例中,acro
缩写列表\printacronyms
不是插入在文档主体中,而是插入在序言中,这要归功于钩子,\AtEndDocument
并且效果很好:
\documentclass{article}
\usepackage{acro}
\AtEndDocument{\printacronyms}
\DeclareAcronym{gnu}{
short = GNU ,
long = GNU's Not Unix
}
\begin{document}
\ac{gnu}.
\end{document}
在以下 MCE 示例中,“GPL”首字母缩略词是根据另一个首字母缩略词“GNU”定义的,并且效果很好:
\documentclass{article}
\usepackage{acro}
\DeclareAcronym{gnu}{
short = GNU ,
long = GNU's Not Unix
}
\DeclareAcronym{gpl}{
short = GPL ,
long = \acs{gnu} General Public License
}
\begin{document}
\ac{gpl}.
\printacronyms
\end{document}
但如果将这两个例子合并起来:
\documentclass{article}
\usepackage{acro}
\AtEndDocument{\printacronyms}
\DeclareAcronym{gnu}{
short = GNU ,
long = GNU's Not Unix
}
\DeclareAcronym{gpl}{
short = GPL ,
long = \acs{gnu} General Public License
}
\begin{document}
\ac{gpl}.
\end{document}
编译失败并出现错误:
! Missing number, treated as zero.
<to be read again>
\l__acro_pages_list_display_bool
l.17 \end{document}
请注意,问题不在于钩子\AtBeginDocument
。
您明白发生了什么事以及如何使最后一个例子发挥作用吗?
答案1
如果您\ShowHook{enddocument}
在示例中使用,则可以看到 acro 也使用了钩子。遗憾的是,它甚至在里面使用\printacronyms
,而且由于它是一个一次性钩子,因此\printacronyms
在这个钩子里面移动会弄乱代码顺序。我只能通过更改 acro 命令并将其代码移动到后面的钩子来避免错误。这并不是一个通用的解决方案,只是为了证明钩子很重要!重新定义可能会弄乱其他地方的代码:
\documentclass{article}
\usepackage{acro}
\AtEndDocument{\printacronyms}
\ExplSyntaxOn
\cs_set_protected:Npn \acro_record_page:n #1
{
\__acro_record_page:n {#1}
\hook_gput_code:nnn {enddocument/afterlastpage} {acro} %moved from endocument
{
\seq_gremove_duplicates:c {g__acro_#1_pages_seq}
\acro_property_set:nnx {#1} {pages}
{ \seq_use:cn {g__acro_#1_pages_seq} {|} }
}
}
\ExplSyntaxOff
\DeclareAcronym{gnu}{
short = GNU ,
long = GNU's Not Unix
}
\DeclareAcronym{gpl}{
short = GPL ,
long = \acs{gnu} General Public License
}
\begin{document}
\ac{gpl}.
\end{document}