类似于首字母缩略词包:如果单独出现,则不写首字母缩略词我想避免列出我只在glossaries
包中使用过一次的缩写词。这个问题的答案忽略仅使用一次的首字母缩略词包含检测一次性使用的代码。我可以修改此代码片段以仅打印首字母缩略词描述而不将条目+页码放入词汇表中吗?
样本:
\documentclass[8pt]{scrartcl}
\usepackage[xindy,style=long,numberline,savewrites=true,acronym,nomain]{glossaries}
\makeglossaries
\newacronym{seqse}{SE}{spin echo}
\newacronym{seqffe}{FFE}{fast field echo}
\newacronym{mri}{MRI}{magnetic resonance imaging}
\begin{document}
\printglossaries
\begin{itemize}
\item Multiple use: \gls{seqse}, \gls{seqse}, \gls{seqse}.
\item Multiple use: \gls{seqffe}, \gls{seqffe}.
\item One-time use: \gls{mri}.
\end{itemize}
\end{document}
答案1
是的,这是可能的。我的第一个尝试是定义一种新样式,以抑制仅使用一次的项目的输出(请参阅 的定义mylong
)。但是当样式是“分组”时,即当有组标题或组间跳转时,这种方法会失败,因为如果组中只有一项被抑制,则会导致组标题多余。
因此,我们必须完全禁止将仅使用一次的项目写入文件acn
。为了实现这一点,我们侵入输出例程\@do@wrglossary
,让它只写入至少使用两次的项目。之后,我们使用来自这个答案。
\documentclass[8pt]{scrartcl}
\usepackage{etoolbox}
\usepackage[style=long,numberline,savewrites=true,acronym,nomain]{glossaries}
\makeatletter
%% code for \glo@LABEL@usedonlyonce from https://tex.stackexchange.com/a/26263/21591
\appto\newacronymhook{%
\newbool{glo@\the\glslabeltok @usedonlyonce}% define an additional switch per acronym
}
\patchcmd{\@gls@}{%
\glsunset{#2}%
}{% write appropriate information to the main auxiliary file
\ifglsused{#2}{%
\write\@auxout{\global\setbool{glo@#2@usedonlyonce}{false}}%
}{%
\write\@auxout{\global\setbool{glo@#2@usedonlyonce}{true}}%
}%
\glsunset{#2}%
}{}{\message{^^JPatching failed (1)^^J}}
\patchcmd{\@gls@}{%
\glsentryfirst{#2}%
}{% print the long form of the acronym if the acronym is used only once
\ifbool{glo@#2@usedonlyonce}{\glsentrylong{#2}}{\glsentryfirst{#2}}%
}{}{\message{^^JPatching failed (2)^^J}}
\let\old@do@wrglossary\@do@wrglossary
\renewcommand{\@do@wrglossary}[1]{\ifbool{glo@#1@usedonlyonce}{}{\old@do@wrglossary{#1}}}
% \newglossarystyle{mylong}{%
% \glossarystyle{long}%
% \renewcommand*{\glossaryentryfield}[5]{%
% \ifbool{glo@##1@usedonlyonce}{}{%
% \glsentryitem{##1}\glstarget{##1}{##2} & ##3\glspostdescription\space ##5\\%
% }}%
% \renewcommand*{\glsgroupskip}{}%
% }
\makeatother
\makeglossaries
\newacronym{seqse}{SE}{spin echo}
\newacronym{seqffe}{FFE}{fast field echo}
\newacronym{mri}{MRI}{magnetic resonance imaging}
\newacronym{goo}{GOO}{bar}
\begin{document}
% \printglossary[type=\acronymtype,style=mylong]
\printglossaries
\begin{itemize}
\item Multiple use: \gls{seqse}, \gls{seqse}, \gls{seqse}.
\item Multiple use: \gls{seqffe}, \gls{seqffe}.
\item One-time use: \gls{mri}.
\item Multiple use: \gls{goo}, \gls{goo}.
\end{itemize}
\end{document}
pdflatex
请注意,在使用 xindy/makeindex 创建索引之前,您必须运行两次。顺便说一句,这将是该glossaries
软件包的一个很好的功能请求 (@NicolaTalbot)。
答案2
升级到glossaries
4.14 版(我刚刚将其上传到 CTAN,因此您可能需要等待几天才能到达 TeX 发行版)。它有一个新的命令\glsenableentrycount
,可为每个条目启用两个额外字段:currcount
和prevcount
。该currcount
字段跟踪该条目迄今为止已被使用的次数。(“使用”表示\glsunset
该条目已被使用过多少次,因此这意味着由 -like 命令使用\gls
,但不是由其他命令使用,例如\glsadd
、\glstext
或\glsentrytext
。该值被重置为零\glsreset
。)该prevcount
字段存储该字段的最终值,currcount
就像它原来一样在上一次 LaTeX 运行结束时。
此外,\glsenableentrycount
还启用命令\cgls
、\cglspl
和,\cGls
它们\cGlspl
类似于\gls
、\glspl
和,\Gls
但\Glspl
它们测试的值是否prevcount
为 1。如果是,则它们只使用类似\glsentrylong
或\glsentryfirst
(后跟\glsunset
)的命令。如果不是,它们的行为与它们的\gls
etc 对应项相同。
因此您的示例可以进行如下修改:
% arara: pdflatex
% arara: pdflatex
% arara: makeglossaries
% arara: pdflatex
\documentclass{scrartcl}
\usepackage[xindy,style=long,numberline,savewrites=true,acronym,nomain]{glossaries}
\makeglossaries
\glsenableentrycount % enable \cgls, \cglspl, \cGls, \cGlspl
\newacronym{seqse}{SE}{spin echo}
\newacronym{seqffe}{FFE}{fast field echo}
\newacronym{mri}{MRI}{magnetic resonance imaging}
\begin{document}
\printglossaries
\begin{itemize}
\item Multiple use: \cgls{seqse}, \cgls{seqse}, \cgls{seqse}.
\item Multiple use: \cgls{seqffe}, \cgls{seqffe}.
\item One-time use: \cgls{mri}.
\end{itemize}
\end{document}
(我添加了arara
指令来提醒文档构建过程,但是如果您不使用,则可以忽略它们arara
。)如果\cgls
觉得输入太多,请记住您可以定义同义词。例如:
\let\ac\cgls
\let\acpl\cglspl
\let\Ac\cGls
\let\Acpl\cGlspl
结果如下:
笔记:
- 这种方法自然会花费更长的时间来构建您的文档(因为它需要额外的 LaTeX 运行并且在使用条目时必须做更多的事情)。
- 此方法将
\newglossaryentry
(因此)更改为仅有前导码的命令,以确保在读取文件\newacronym
之前定义条目。.aux
- 如果您使用其他命令,例如
\glsadd
或,则\glstext
一次性条目将被添加到首字母缩略词列表中。