使用该glossaries
包,我想强调在运行文本和词汇表中第一次出现的条目。我可以在以下 MWE 中实现前者:
\documentclass{article}
\usepackage{glossaries}
\makeglossaries
\defglsentryfmt{%
\ifglsused{\glslabel}{%
\glsgenentryfmt%
}{%
% Typeset first use
\textit{\glsgenentryfmt}%
}%
}
\newglossaryentry{term}{name={technical term}, description=\nopostdesc}
\begin{document}
First occurrance of \gls{term}, second occurrance of \gls{term}.
\newpage
Third occurance of \gls{term}.
\printglossary{}
\end{document}
但这并没有强调词汇表中的页码。有什么想法可以做到这一点吗?
答案1
来自glossaries
版本 4.16 您可以在第一次使用时\glswriteentry
自动设置format=textit
:
\documentclass{article}
\usepackage{glossaries}
\makeglossaries
\defglsentryfmt{%
\ifglsused{\glslabel}{%
\glsgenentryfmt%
}{%
% Typeset first use
\textit{\glsgenentryfmt}%
}%
}
\renewcommand*{\glswriteentry}[2]{%
\ifglsused{#1}{}{\setkeys{glslink}{format=textit}}%
#2%
}
\newglossaryentry{term}{name={technical term},
description=\nopostdesc}
\begin{document}
First occurrance of \gls{term}, second occurrance of \gls{term}.
\newpage
Third occurance of \gls{term}.
\printglossary
\end{document}
这相当于:
\documentclass{article}
\usepackage{glossaries}
\makeglossaries
\defglsentryfmt{%
\ifglsused{\glslabel}{%
\glsgenentryfmt%
}{%
% Typeset first use
\textit{\glsgenentryfmt}%
}%
}
\newglossaryentry{term}{name={technical term},
description=\nopostdesc}
\begin{document}
First occurrance of \gls[format=textit]{term}, second occurrance of \gls{term}.
\newpage
Third occurance of \gls{term}.
\printglossary
\end{document}
在此示例中,存在一个问题。同一页面上有两个“term”实例,但它们具有不同的 encap ( format
) 值。第一个实例具有textit
作为封装的实例,第二个实例具有默认的封装glsnumberformat
。这意味着“term”的位置列表将为 1,1makeindex
,2. 文件中报告了这一点.glg
:
## Warning (input = test.glo, line = 1; output = test.gls, line = 5):
-- Conflicting entries: multiple encaps for the same page under same key.
如果切换到,xindy
它将默默地丢弃重复的位置,位置列表将为 1、2。位置textit
被丢弃。我不知道在这种情况下它的规则是什么,但显然不是保留第一个并丢弃其他的情况,否则它会保留该textit
位置。
我不知道如何在没有人工干预的情况下解决这个问题(例如使用非索引命令之一)。这与尝试在同一页面上执行的问题相同\index{term|textit}
。\index{term}
如果有某种方法可以判断xindy
哪个封装应该优先,那么这将是最简单的解决方案。
更新:在评论中回答您的问题:
在 4.16 之前的版本中,您必须手动将键添加format
到命令中\gls
,如上面的第二个示例所示。我认为这实际上更有意义,因为您可以在文档中该条目最重要的用途发生的位置设置格式,否则您可能还不如让读者从第一个位置开始并从那里继续。(第一次使用不一定是该术语的重要用途,因为第一次使用可能带有“在第 n 章后面更详细地描述”。)
斜体之间的微小空间1并且逗号是由于逗号位于命令 ( \delimN
) 内而导致的,我怀疑这会混淆在 中执行的斜体校正检查\textit
。这可以通过以下内容证明:
\documentclass{article}
\newcommand*{\delimN}{, }
\begin{document}
\textit{1}, 2.
\textit{1}\delimN 2.
{\itshape 1}\delimN 2.
\end{document}
可以通过提供使用声明而不是文本块命令的命令来避免这种情况:
\documentclass{article}
\usepackage{glossaries}
\makeglossaries
\defglsentryfmt{%
\ifglsused{\glslabel}{%
\glsgenentryfmt%
}{%
% Typeset first use
\textit{\glsgenentryfmt}%
}%
}
\newglossaryentry{term}{name={technical term},
description=\nopostdesc}
\newcommand*{\firstloc}[1]{{\itshape #1}}
\begin{document}
First occurrance of \gls[format=firstloc]{term}, second occurrance of
\gls{term}.
\newpage
Third occurance of \gls{term}.
\printglossary
\end{document}
得出的结果为:
答案2
我在用户手册中偶然发现了以下命令 - \glslinkcheckfirsthyperhook
- 以及有关如何使用它的示例。从中我得出了以下 MWE,它实际上可以完成我所寻找的功能:
\documentclass{article}
\usepackage{hyperref}
\usepackage{glossaries}
\makeglossaries
\defglsentryfmt{%
\ifglsused{\glslabel}{%
\glsgenentryfmt%
}{%
% Typeset first use
\textit{\glsgenentryfmt}%
}%
}
\newcommand{\firsttermformat}[1]{{\itshape\glshypernumber{#1}}}
\renewcommand*{\glslinkcheckfirsthyperhook}{%
\ifglsused{\glslabel}{%
% Do nothing
}{%
\setkeys{glslink}{format=firsttermformat}%
}%
}
\newglossaryentry{term}{name={technical term}, description=\nopostdesc}
\begin{document}
First occurrance of \gls{term}, second occurrance of \gls{term}.
\newpage
Third occurance of \gls{term}.
\printglossary{}
\end{document}
尽管该hyperref
包未包含在我的问题的 MWE 中,但我还是将其包含在这里,因为我在书中使用它,并且在那里我丢失了索引中首次出现的页码的链接。使用\glshypernumber
修复了这个问题。
但由于 Nicola Talbot 没有\glslinkcheckfirsthyperhook
在她的回答,我有点担心我使用这个命令的方式与它最初的意图不符。你能对此发表评论吗,Nicola Talbot?