如何排版词汇表中第一次出现的词汇表条目的页码?

如何排版词汇表中第一次出现的词汇表条目的页码?

使用该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?

相关内容