使用 \usepackage{glossaries-extra} 代替 \usepackage{glossaries} 时,\glsenableentrycount 出现问题

使用 \usepackage{glossaries-extra} 代替 \usepackage{glossaries} 时,\glsenableentrycount 出现问题

glossaries-extra最近发布了一揽子计划,以补充glossaries

该文档的前几页中有以下示例:

\documentclass{文章}

\usepackage{glossaries-extra}

这就像:

\documentclass{文章}

\usepackage[toc,nopostdot]{词汇表}

\usepackage{glossaries-extra}

但我注意到,尝试使用\glsenableentrycount以下两行时并不等效。

%\usepackage[savewrites=true,nogroupskip,toc,nopostdot]{glossaries} % ====> THIS WORKS FINE
\usepackage[savewrites=true,nogroupskip,acronym]{glossaries-extra}  % ====> THIS DOESN'T WORK BUT I EXPECTED IT TO BE EQUIVALENT

使用下面 MWE 中的其中一行,我发现我无法使用调用usepackageglossaries-extra无论是否glossaries如引用的文档示例所示)并且无法\glsenableentrycount工作。

\documentclass{article}

%\usepackage[savewrites=true,nogroupskip,toc,nopostdot]{glossaries} % ====> THIS WORKS FINE
\usepackage[savewrites=true,nogroupskip,acronym]{glossaries-extra}  % ====> THIS DOESN'T WORK

\usepackage{scrwfile}%http://www.dickimaw-books.com/cgi-bin/faq.cgi?action=view&categorylabel=glossaries#glsnewwriteexceeded

\ifdefined\HCode    \usepackage{morewrites} \else   \fi

\makeindex % activate index-making
\makeglossaries

\glsenableentrycount % enable \cgls, \cglspl, \cGls, \cGlspl

% UPDATE:  TRY ENABLING ENTRYCOUNT ATTRIBUTE
% http://mirror.its.dal.ca/ctan/macros/latex/contrib/glossaries-extra/glossaries-extra-manual.html#sec:entrycountmods
%\glssetcategoryattribute{acronym}{entrycount}{1} 
\glssetcategoryattribute{abbreviation}{entrycount}{1} 

%%%%% define synonyms to use counts by default
%%%%% http://tex.stackexchange.com/questions/98494/glossaries-dont-print-single-occurences
    \let\gls\cgls
    \let\glspl\cglspl
    \let\Gls\cGls
    \let\Glspl\cGlspl

\glssetnoexpandfield{first}
\glssetnoexpandfield{firstpl}

\newglossaryentry{SRS}{ type={acronym}, sort={stimulated Raman scattering},  name={SRS}, short={SRS}, long={stimulated Raman scattering}, first={stimulated Raman scattering (SRS)}, description={stimulated Raman scattering  } }

\newglossaryentry{CARS}{ type={acronym}, sort={coherent anti-Stokes Raman scattering},  name={CARS}, short={CARS}, long={coherent anti-Stokes Raman scattering}, first={coherent anti-Stokes Raman scattering (CARS)}, description={coherent anti-Stokes Raman scattering  } }

\glssetexpandfield{first}
\glssetexpandfield{firstpl}

%=============================================================================
%   END GLOSSARY SETUP
%=============================================================================

\begin{document}\noindent\begin{sloppypar}

\gls{CARS} -- I shouldn't see the abbreviation

\cgls{SRS} -- I shouldn't see the abbreviation

\clearpage\end{sloppypar}\end{document}

答案1

2.3 入口计数修改

\glsenableentrycount命令已修改为允许 entrycount属性。这意味着您不仅需要使用 启用条目计数\glsenableentrycount,还需要设置适当的属性(请参阅§5 类别)。

例如,不要只做以下事情:

 \glsenableentrycount

你现在需要做的是:

 \glsenableentrycount
 \glssetcategoryattribute{abbreviation}{entrycount}{1}

这将启用该类别中条目的条目计数abbreviation ,但分配给其他类别的任何条目将保持不变。

这允许将条目计数应用于某些类型的条目,并且还允许您设置不同的触发值。您的成绩单文件中应该有一个警告:

Package glossaries-extra Warning: Entry counting has been enabled 
(glossaries-extra)                with \glsenableentrycount but the 
(glossaries-extra)                attribute `entrycount' hasn't 
(glossaries-extra)                been assigned to any of the defined 
(glossaries-extra)                entries.

这是提醒您需要设置entrycount属性。

在您的示例中,您有如下条目定义

\newglossaryentry{SRS}{ type={acronym}, sort={stimulated Raman scattering},  name={SRS}, short={SRS}, long={stimulated Raman scattering}, first={stimulated Raman scattering (SRS)}, description={stimulated Raman scattering  } }

由于这没有明确设置类别,它默认为类别general,因此您需要添加:

\glssetcategoryattribute{general}{entrycount}{1}

但是,这种使用 的缩写的明确定义\newglossaryentry违背了条目计数的目的,因为first包含缩写,所以它将始终显示(因为它是常规条目,\cgls内部使用键的值first)。如果希望使用 隐藏缩写,则需要使用(或)\cgls定义缩写。\newabbreviation\newacronym

例子:

\documentclass{article}

\usepackage[savewrites=true,nogroupskip,acronym]{glossaries-extra}

\usepackage{scrwfile}

\ifdefined\HCode    \usepackage{morewrites} \else   \fi

\makeindex % activate index-making
\makeglossaries

\glsenableentrycount % enable \cgls, \cglspl, \cGls, \cGlspl
\glssetcategoryattribute{acronym}{entrycount}{1}

\let\gls\cgls
\let\glspl\cglspl
\let\Gls\cGls
\let\Glspl\cGlspl

\glssetnoexpandfield{first}
\glssetnoexpandfield{firstpl}

\setabbreviationstyle[acronym]{long-short}

\newacronym[sort={stimulated Raman scattering}]
 {SRS}{SRS}{stimulated Raman scattering}

\newacronym[sort={coherent anti-Stokes Raman scattering}]
 {CARS}{CARS}{coherent anti-Stokes Raman scattering}

\glssetexpandfield{first}
\glssetexpandfield{firstpl}

%=============================================================================
%   END GLOSSARY SETUP
%=============================================================================

\begin{document}\noindent\begin{sloppypar}

\gls{CARS} -- I shouldn't see the abbreviation

\cgls{SRS} -- I shouldn't see the abbreviation

\clearpage\end{sloppypar}\end{document}

得出的结果为:

图片显示没有缩写的长格式

现在假设我修改CARS条目,使其使用\newabbreviation而不是\newacronym。这会将类别设置为abbreviation,因此它不受条目计数机制(仅对类别启用acronym)的控制。

\newabbreviation[sort={coherent anti-Stokes Raman scattering}]
 {CARS}{CARS}{coherent anti-Stokes Raman scattering}

现在,此条目包含缩写,尽管它只使用过一次:

结果 CARS 条目的图像包括缩写

编辑:如果您确实想使用\newglossaryentry而不是\newabbreviation(或\newacronym),那么您需要重新定义\cglsformat为仅检查字段long(并忽略常规属性)。例如:

\documentclass{article}

\usepackage[savewrites=true,nogroupskip,acronym]{glossaries-extra}

\makeglossaries

\glsenableentrycount % enable \cgls, \cglspl, \cGls, \cGlspl
\glssetcategoryattribute{acronym}{entrycount}{1}

\let\gls\cgls
\let\glspl\cglspl
\let\Gls\cGls
\let\Glspl\cGlspl

\glssetnoexpandfield{first}
\glssetnoexpandfield{firstpl}

\newglossaryentry{SRS}{
  type={acronym},
  category={acronym},% <- category
  sort={stimulated Raman scattering},
  name={SRS},
  short={SRS},
  long={stimulated Raman scattering},
  first={stimulated Raman scattering (SRS)},
  description={stimulated Raman scattering}
}

\newglossaryentry{CARS}{
  type={acronym},
  category={acronym},% <- category
  sort={coherent anti-Stokes Raman scattering},
  name={CARS},
  short={CARS},
  long={coherent anti-Stokes Raman scattering},
  first={coherent anti-Stokes Raman scattering (CARS)},
  description={coherent anti-Stokes Raman scattering}
}

\glssetexpandfield{first}
\glssetexpandfield{firstpl}

% Not using \newabbreviation so redefine \cglsformat
% to just check for the long field.
\renewcommand*{\cglsformat}[2]{%
  \ifglshaslong{#1}{\glsentrylong{#1}}{\glsentryfirst{#1}}#2%
}

\begin{document}\noindent\begin{sloppypar}

\gls{CARS} -- I shouldn't see the abbreviation

\cgls{SRS} -- I shouldn't see the abbreviation

\clearpage\end{sloppypar}\end{document}

得出的结果为:

没有缩写的结果图像

如果您仍然收到上述警告,请首先检查是否category已正确设置您的条目。例如,如果您添加:

Category of CARS: \glscategory{CARS}.
Category of SRS: \glscategory{SRS}.

到您的文档,PDF 应该显示

CARS 类别:缩写。SRS 类别:缩写。

如果没有,则检查category中的元素\newglossaryentry

接下来检查entrycount属性是否已正确设置。您可以通过将以下内容添加到文档中来执行此操作:

entrycount attribute for CARS: \glsgetattribute{CARS}{entrycount}.
entrycount attribute for SRS: \glsgetattribute{SRS}{entrycount}.

这应该显示

CARS 的 entrycount 属性:1. SRS 的 entrycount 属性:1。

如果它不检查类别标签和属性标签的拼写

\glssetcategoryattribute{acronym}{entrycount}{1}

如果需要使用复数或大小写转换版本,同样需要重新定义类似的命令。首字母大写的命令\cGls使用\cGlsformat

\renewcommand*{\cGlsformat}[2]{%
  \ifglshaslong{#1}{\Glsentrylong{#1}}{\Glsentryfirst{#1}}#2%
}

(请确保您至少拥有glossaries-extra可以修复该错误的v1.14 版本\cGls。)

全大写版本\cGLS使用\cGLSformat

\renewcommand*{\cGLSformat}[2]{%
  \ifglshaslong{#1}%
  {\MakeUppercase{\glsentrylong{#1}}}
  {\MakeUppercase{\glsentryfirst{#1}}}\MakeUppercase{#2}%
}

(或者您可能更喜欢使用\mfirstucMakeUppercase与保持一致\GLS。)

如果您需要使用复数形式,请记住,、 和longshort实际上是为 提供的,并且如果直接在 中使用则需要明确设置。这意味着如果您不使用缩写界面但明确使用(如上例所示),则必须在需要时明确设置和,否则它们将为空。longpluralshortplural\newacronym\newabbreviation\newglossaryentry\newglossaryentrylongpluralshortplural

没有与 等价的复数形式\ifglshaslong,但你可以使用 来\ifglshasfield代替。有几种方法可以重新定义\cglsplformat。最简单的方法是:

\renewcommand*{\cglsplformat}[2]{%
  \ifglshaslong{#1}{\glsentrylongpl{#1}}{\glsentryfirstpl{#1}}#2%
}

这只是检查long字段是否已设置。在上面的例子中,字段long已设置(因此\ifglshaslong为真)但longplural尚未设置,这意味着\glsentrylongpl对于上面示例中的条目,将扩展为无。这实际上取决于您希望在这种情况下发生什么。您可以改为检查longplural

\renewcommand*{\cglsplformat}[2]{%
  \ifglshasfield{longplural}{#1}{\glsentrylongpl{#1}}{\glsentryfirstpl{#1}}#2%
}

或者您可能希望默认使用已设置但尚未设置的long字段:longlongplural

\renewcommand*{\cglsplformat}[2]{%
  \ifglshaslong{#1}%
  {\ifglshasfield{longplural}{#1}{\glsentrylongpl{#1}}{\glsentrylong{#1}}}%
  {\glsentryfirstpl{#1}}#2%
}

\cGlsplformat对于和 也类似\cGLSplformat

相关内容