如何在正文中引用词汇表名称,后跟词汇表条目的确切页码,即而不仅仅是:
看
\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}
得出的结果为:
(建造过程:latex
,,,)makeglossaries
latex
latex
如果您不想使用glossaries-extra
(或者您的版本太旧而无法提供\glsxtrpageref
),那么您可以简单地执行以下操作:
See \gls{lorem} on page \pageref{glsentry-lorem}.
请注意,此方法仅适用于使用词汇表样式\glsentryitem
(所有预定义样式均使用)。