Latex 词汇表:Hyperref/Link 仅链接每个部分中第一次出现的条目?

Latex 词汇表:Hyperref/Link 仅链接每个部分中第一次出现的条目?

默认情况下,该glossaries包会为每次出现的条目创建一个指向词汇表的链接(例如,每次我使用\gls{entry})。链接以可视化形式呈现(例如,使用hyperref颜色链接)。如果多次使用一个条目,这会变得非常混乱。

我希望只对条目的第一个出现位置进行超链接。这可能吗?

答案1

\glsentrytext{entry}虽然您可以使用、或\glsentryname{entry}、或\gls*{entry}代替来手动放弃超链接\gls{entry},但这很麻烦,因为人们必须自己追踪首次使用的位置。

一种自动的方法是修补\@gls@

\documentclass[a4paper,10pt]{article}

\usepackage[colorlinks]{hyperref}
\usepackage{glossaries}

\usepackage{etoolbox}
\makeatletter
%% patch first occurence of "\@gls@link[#1]{#2}{\@glo@text}", as this is the one for \glsused{#2}
\patchcmd{\@gls@}
  {\@gls@link[#1]{#2}{\@glo@text}}
  {\@gls@link[#1,hyper=false]{#2}{\@glo@text}}
  {}{}
\makeatother


\makeglossaries
\newglossaryentry{pear}{
  name=pear,
  description={an oddly shaped fruit}
}

\begin{document}
\gls{pear}, \gls{pear}, \gls{pear}, \gls{pear}.

\printglossaries
\end{document}

如果您还使用大写变体\Gls\GLS,则相应的内部宏\@Gls@\@GLS@需要类似的修补:

\patchcmd{\@Gls@}
  {\@gls@link[#1]{#2}}
  {\@gls@link[#1,hyper=false]{#2}}
  {}{}

\patchcmd{\@GLS@}
  {\@gls@link[#1]{#2}{\MakeUppercase{\@glo@text}}}
  {\@gls@link[#1,hyper=false]{#2}{\MakeUppercase{\@glo@text}}}
  {}{}

答案2

有一个钩子\glslinkcheckfirsthyperhook被像这样的命令使用\gls。它的最初目的是协助相反的事情(第一次使用时不要超链接),但它也可以在这种情况下使用:

\documentclass{article}

\usepackage[colorlinks]{hyperref}
\usepackage{glossaries}

\makeglossaries

\renewcommand*{\glslinkcheckfirsthyperhook}{%
  \ifglsused{\glslabel}%
  {%
    \setkeys{glslink}{hyper=false}%
  }%
  {}%
}

\newglossaryentry{sample}{name={sample},description={an example}}
\newglossaryentry{sample2}{name={another sample},description={another example}}

\begin{document}

First use: \gls{sample}, \gls{sample2}.

Next use: \gls{sample}, \gls{sample2}.

\printglossaries

\end{document}

得出的结果为:

带有超链接的文档图像仅供首次使用

编辑:这适用于所有\gls类似命令查询第一个使用标志(例如\Gls\glsdisp)。它不适用于\glstext类似命令不查询首次使用标志(例如\glstext\glslink)。

相关内容