glossaries-extra – 使用 \ifglsused 加载从外部文件加载的缩写词会导致错误

glossaries-extra – 使用 \ifglsused 加载从外部文件加载的缩写词会导致错误

\ifglsused在我的文档中使用命令。只要它引用的条目已被使用(例如,当2. \ac{at}.\\MWE 主体中的行被取消注释时),它就可以正常工作。但是,如果文档中未使用此条目,则 LaTeX 将返回以下错误:

l.27包 etoolbox 错误:布尔值“\ifglo@at@flag”未定义。

诸如添加\glsadd{at}到序言中或更改\GlsXtrLoadResources[src={entries}]\newacronym{ao}{AO}{acronym one}和之类的解决方案\newacronym{at}{AT}{acronym two}是不够的,因为在这种情况下,不必要的(未使用的)at首字母缩略词条目将被添加到首字母缩略词列表中。

梅威瑟:

\documentclass{article}

\usepackage[record,acronym,shortcuts=ac]{glossaries-extra}

\usepackage{relsize}
\setabbreviationstyle[\acronymtype]{long-short-sm}

\usepackage{filecontents}
\begin{filecontents}{entries.bib}
    @acronym{ao,
        long      = {acronym one},
        short     = {AO}
    }

    @acronym{at,
        long      = {acronym two},
        short     = {AT}
    }
\end{filecontents}

\GlsXtrLoadResources[src={entries}]

\begin{document}

    1. \ac{ao}.\\
%   2. \ac{at}.\\
    3. \ifglsused{at}{Acronym 2 has been used}{Acronym 2 has \emph{not} been used}.

    \printunsrtglossary[type=\acronymtype]

\end{document}

所需输出文件: Desired result.

\ifglsused{at}{…}{…}是否有可能获得这样的结果,即即使在没有\ac{at}文档中的命令时也能够使用(但at首字母缩略词的 BIB 源文件中可能仍有一个条目以供将来使用)?

答案1

glossaries-extra该错误现已在(2018-07-26)的 1.33 版本中修复。

针对旧版本的补丁重新定义\ifglsused如下:

\renewcommand*{\ifglsused}[3]{%
  \glsdoifexists{#1}{\ifbool{glo@\glsdetoklabel{#1}@flag}{#2}{#3}}%
}

基础glossaries包仅将此命令定义为:

\newcommand*{\ifglsused}[3]{%
  \ifbool{glo@\glsdetoklabel{#1}@flag}{#2}{#3}%
}

如果提供的布尔变量不存在,则依赖于\ifbool生成错误并且不执行任何操作。

通常glossaries用于\glsdoifexists需要存在给定条目的情况。如果标签给出的条目未定义,此命令将触发错误。基础glossaries包省略了额外的检查,\ifglsused因为它可以推迟到\ifbool。(虽然省略代码中的一个测试并没有节省多少,但\ifglsused在内部使用了很多次,所以加起来,有些用户在创建使用该包的文档时抱怨构建时间glossaries。)

glossaries-extra包提供了包选项undefaction=warn,它将的行为更改为\glsdoifexists生成警告而不是错误消息,并且如果在环境中使用document,文本中将显示??。这意味着\ifglsused现在确实需要额外的测试来允许此设置。

如果仅\ifglsentryexists使用 (而不是\glsdoifexists),则当出现问题时您将不会收到任何提示。例如,如果标签拼写错误或bib2gls无法选择条目。这就是为什么新版本使用\glsdoifexists使其与基础包的行为一致。 的目的undefaction=warn是简单地将错误更改为警告并提供视觉指示,而不进行任何其他修改。此模式最初旨在作为处理参考不完整的草稿文档的方式。当bib2glsrecord后来被引入时,该选项方便地处理第一次 LaTeX 运行,其中没有定义任何条目(因为它们在创建关联文件undefaction=warn之前未定义)。bib2gls

版本 1.34(2018-07-29)¹ 提供\GlsXtrIfUnusedOrUndefined{标签}{真的}{错误的}确实真的如果给出的条目标签未定义或未标记为已使用。这可能是与 一起使用的更好命令bib2gls

在后链接钩子中,不应使用\ifglsused\GlsXtrIfUnusedOrUndefined来引用关联条目的首次使用标志,因为在使用钩子时该标志已被取消设置。相反,您可以使用\glsxtrifwasfirstuse。例如:

\documentclass{article}

\usepackage[undefaction=warn]{glossaries-extra}

\setabbreviationstyle{long-noshort}
\newabbreviation{ab}{AB}{Abbreviation}

\glsdefpostlink{abbreviation}{\glsxtrifwasfirstuse{ (\glsps{\glslabel})}{}}

\begin{document}
First use: \gls{ab}.
Next use: \gls{ab}.

\end{document}

First use: Abbreviation (AB). Next use: Abbreviation.


¹ 等待几天才能到达 TeX 发行版。

相关内容