全大写缩写在用于书籍章节/节时会导致控制序列不明确

全大写缩写在用于书籍章节/节时会导致控制序列不明确

我想在新电脑上编译一份旧文档,所以基本上我从 texlive 2021 切换到最新版本的 texlive 2023,以编译一份更长的文档(包括glossaries-extra许多其他软件包)。这导致了以下错误,我在一个相当小的例子中重现了它。但我不知道该怎么办……

我将其glossaries-extra用于缩写(和其他内容)。在文档的某个时刻,我只想访问小写版本、大写版本或全大写版本。以下代码使用三个宏\glsfmtname\Glsfmtname和来实现这一点。当尝试使用宏\GLSfmtname时,使用最后一个宏会出现错误。但并非总是如此,据我所知,只有在两种情况下才会出现错误:1)文档类必须是例如 book 或 scrbook(我也尝试了 article 但没有观察到)。2)文档中必须至少有一个或或类似的,否则它可以很好地编译。\GLSfmtname\GLSxtrtitlename\chapter\section

\documentclass{book} % also for scrbook
%\documentclass{article} % NOT for article! (has no chapter, but same behavior for book+\section)
\usepackage{glossaries-extra}
\newabbreviation{xxx}{asa}{a simple abbreviation}

\begin{document}
%\chapter{A chapter}
\section{A section} % uncomment for error


\gls{xxx}

\glsfmtname{xxx} 

\Glsfmtname{xxx} 

\GLSfmtname{xxx}  % <- error: \GLSxtrtitlename undefined

\end{document}

我收到错误信息:

! 未定义控制序列。\GLSxtrtitlename {xxx} l.14 \GLSfmtname{xxx}

我是不是漏掉了什么设置?或者这可能是一个 bug?谢谢你的帮助!

答案1

glossaries-extra在 之前存储某些定义\markboth,以防止在 中使用\markright时在标题中应用大小写更改(有关详细信息,请参阅“5.3. 标题、页眉、标题和内容中的条目”)。不幸的是,保存和恢复宏会忘记保存几个定义,这就是为什么需要使用分段命令 而不是 来以最小的方式演示错误的原因。\glsfmt<field>\sectionbookarticle

问题在于\glsxtrmarkhook,它仅存储\glsxtrtitlename\Glsxtrtitlename宏(而不是\GLSxtrtitlename)以便稍后通过恢复\glsxtrrestoremarkhook,而是\glsxtrrestoremarkhook最终尝试\GLSxtrtitlename通过将其设置为未定义的来恢复\@glsxtr@org@GLSxtrtitlename

可以使用以下方法进行修补(由于未保存,也会\GLSfmtfirst受到同样的影响):\GLSxtrtitlefirst

\documentclass{book}
\usepackage{glossaries-extra}
\newabbreviation{xxx}{asa}{a simple abbreviation}

\makeatletter
\apptocmd\glsxtrmarkhook{%
  \let\@glsxtr@org@GLSxtrtitlename\GLSxtrtitlename
  \let\@glsxtr@org@GLSxtrtitlefirst\GLSxtrtitlefirst
}{}{}
\makeatother

\begin{document}
\section{A section}

\gls{xxx}

\glsfmtname{xxx} 

\Glsfmtname{xxx} 

\GLSfmtname{xxx}

\GLSfmtfirst{xxx}

\end{document}

当和用于分段命令时(用户指南建议支持它们),也存在相关问题,因为\GLSfmtlong和既不能被保存也不能被恢复。\GLSfmtlongpl\GLSxtrtitlelong\GLSxtrtitlelongpl\glsxtrmarkhook\glsxtrrestoremarkhook

可以将其修补为

\documentclass{book}
\usepackage{glossaries-extra}
\newabbreviation{xxx}{asa}{a simple abbreviation}

\makeatletter
\apptocmd\glsxtrmarkhook{%
  \let\@glsxtr@org@GLSxtrtitlelong\GLSxtrtitlelong
  \let\@glsxtr@org@GLSxtrtitlelongpl\GLSxtrtitlelongpl
  \let\GLSxtrtitlelong\GLSxtrheadlong
  \let\GLSxtrtitlelongpl\GLSxtrheadlongpl
}{}{}
\apptocmd\glsxtrrestoremarkhook{%
  \let\GLSxtrtitlelong\@glsxtr@org@GLSxtrtitlelong
  \let\GLSxtrtitlelongpl\@glsxtr@org@GLSxtrtitlelongpl
}{}{}
\makeatother

\begin{document}
\section{A section \GLSfmtlong{xxx}}

\gls{xxx}

\GLSfmtlong{xxx}

\end{document}

相关内容