我\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}
\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
是简单地将错误更改为警告并提供视觉指示,而不进行任何其他修改。此模式最初旨在作为处理参考不完整的草稿文档的方式。当bib2gls
和record
后来被引入时,该选项方便地处理第一次 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}
¹ 等待几天才能到达 TeX 发行版。