由于 \AtEndDocument 钩子的作用,acro 的 \printacronyms 在插入嵌套首字母缩略词时会失败

由于 \AtEndDocument 钩子的作用,acro 的 \printacronyms 在插入嵌套首字母缩略词时会失败

在以下 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}

相关内容