我想在新电脑上编译一份旧文档,所以基本上我从 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>
\section
book
article
问题在于\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}