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 中的其中一行,我发现我无法使用调用usepackage
(glossaries-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
该
\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}
现在,此条目包含缩写,尽管它只使用过一次:
编辑:如果您确实想使用\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 应该显示
如果没有,则检查category
中的元素\newglossaryentry
。
接下来检查entrycount
属性是否已正确设置。您可以通过将以下内容添加到文档中来执行此操作:
entrycount attribute for CARS: \glsgetattribute{CARS}{entrycount}.
entrycount attribute for SRS: \glsgetattribute{SRS}{entrycount}.
这应该显示
如果它不检查类别标签和属性标签的拼写
\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
。)
如果您需要使用复数形式,请记住,、 和long
键short
实际上是为 提供的,并且如果直接在 中使用则需要明确设置。这意味着如果您不使用缩写界面但明确使用(如上例所示),则必须在需要时明确设置和,否则它们将为空。longplural
shortplural
\newacronym
\newabbreviation
\newglossaryentry
\newglossaryentry
longplural
shortplural
没有与 等价的复数形式\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
字段:long
longplural
\renewcommand*{\cglsplformat}[2]{%
\ifglshaslong{#1}%
{\ifglshasfield{longplural}{#1}{\glsentrylongpl{#1}}{\glsentrylong{#1}}}%
{\glsentryfirstpl{#1}}#2%
}
\cGlsplformat
对于和 也类似\cGLSplformat
。