如何在文本中的 \gls 条目后附加特定的词汇表条目页码?

如何在文本中的 \gls 条目后附加特定的词汇表条目页码?

如何在正文中引用词汇表名称,后跟词汇表条目的确切页码,即而不仅仅是:

\gls{<label>}

它的工作原理如下:

参见\gls{<label>}第页\pagenumber{<label>}

但是\pageref{<label>}总是返回??词汇表条目标签。也许我遗漏了什么?

答案1

这只是一个部分解决方案——它\gls{foo}仅适用于第一次使用标签,以后使用相同标签的调用将被“忽略”或不执行任何操作。

glossaries确实在使用时定义了一个glsentry-foo标签——但这指的是词汇表中的位置,而不是调用页面上的位置。\gls{foo}foo

我抓住了一些xparse等等和其他expl3代码并“重新定义”gls以自动添加附加标签glscall:foo,然后可以引用该标签\pageref{glscall:foo}

请注意,它\gls*仍能照常工作,我还没碰过它(到目前为止)

\documentclass{article}

\usepackage{letltxmacro}
\usepackage{xparse}

\usepackage{glossaries}

\newcounter{someglscallcounter}

\makeatletter

\ExplSyntaxOn
\seq_new:N \g_glslabel_seq
\LetLtxMacro\orig@gls\gls
\RenewDocumentCommand{\gls}{omo}{%
  \IfValueTF{#1}{%
    \IfValueTF{#3}{%
      \orig@gls[#1]{#2}[#3]%
    }{%
      \orig@gls[#1]{#2}
    }%
  }{%
    \IfValueTF{#3}{%
      \orig@gls{#2}[#3]%
    }{%
      \orig@gls{#2}
    }% 
  }%
  \seq_if_in:NnTF{\g_glslabel_seq}{glscall:#2}{%
    % The label is already used, do nothing. 
  }{%
    \seq_gput_left:Nn{\g_glslabel_seq}{glscall:#2}%
    \typeout{Adding glscall:#2}
    \refstepcounter{someglscallcounter}%
    \label{glscall:#2}%
  }%
}

\ExplSyntaxOff
\makeatother


\makeglossaries

\newglossaryentry{duck}{%
name={Duck},
description={Ducks are great}
}

\newglossaryentry{cat}{%
name={Cat},
description={cats are great too}
}



\newglossaryentry{Elephant}{%
name={Elephant},
description={Elephants are huge!}
}

\begin{document}
A \gls{cat} is a cute animal.

A \gls{duck} is a quacking animal 

\gls{Elephant} and \gls{cat} are mammals. 

The entry for  \gls{duck} is on page \pageref{glsentry-duck} but it was used the first time on page \pageref{glscall:duck}

\clearpage

\printglossaries

\end{document}

在此处输入图片描述

答案2

glossaries包有一个选项entrycounter,它定义并使用计数器自动对词汇表中的每个条目进行编号。这用于\refstepcounter增加计数器并自动添加标签,这意味着使用此选项,您可以使用 引用标签\pageref

您可以通过重新定义为不执行任何操作来阻止数字出现在词汇表中\glsentrycounterlabel,但计数器仍将递增并标记。的参数\label不仅仅是词汇表标签,而是由它加上前缀构成的。最简单的方法是使用扩展包glossaries-extra,它\glsxtrpageref易于使用。

下面的示例使用了在包example-glossaries-brief.tex中提供的中定义的虚拟条目glossaries

\documentclass{article}

\usepackage[entrycounter]{glossaries-extra}

\renewcommand{\glsentrycounterlabel}{}

\makeglossaries

\loadglsentries{example-glossaries-brief}
\glsaddall % add all to pad the glossary to two pages.

\begin{document}
See \gls{lorem} on page \glsxtrpageref{lorem}.

\printglossaries
\end{document}

得出的结果为:

请参阅第 2 页的 lorem。

(建造过程:latex,,,)makeglossarieslatexlatex

如果您不想使用glossaries-extra(或者您的版本太旧而无法提供\glsxtrpageref),那么您可以简单地执行以下操作:

See \gls{lorem} on page \pageref{glsentry-lorem}.

请注意,此方法仅适用于使用词汇表样式\glsentryitem(所有预定义样式均使用)。

相关内容