如何获取 hyperref 以允许我链接到使用 expex 创建的单个示例(https://www.ctan.org/pkg/expex)。
我知道一种基于 \label 的解决方法,但是我的完整文档中有太多例句,无法进行改造(几千个)
我想要的行为是 hyperref 允许我单击示例引用并将其链接到相关示例。
这是我使用的一个最简单的示例,如有任何指点或建议,敬请赞赏!
\documentclass[11pt,twoside,openany,notitlepage]{book}
\usepackage[]{geometry}
\usepackage{graphicx}
\usepackage{expex}
\usepackage[table,xcdraw]{xcolor}
\gathertags
\usepackage{hyperref}
\makeatother
\begin{document}
Here is a bunch of text! and now there's an example (\getref{adj-predicates}).
\ex \deftagex{adj-predicates}
\begingl
\gla This way please. //
\glft `Bitte hier entlang' \trailingcitation source //
\endgl
\xe
Here is another bit of text and one more example (\getref{ex2}). (\getfullref{ex2.a}) is much better than (\getref{adj-predicates}).
\pex[nopreamble=true] \deftagex{ex2}
\a
\begingl
\gla Oh no! \deftaglabel{b} //
\glft `Oh nein!' \trailingcitation source1 //
\endgl
\a
\begingl
\gla I'm sorry! \deftaglabel{a} //
\glft `Es tut mir leid.' \trailingcitation source2 //
\endgl
\xe
\end{document}
答案1
我尝试了您提供的链接中的修补方法,但对我来说也没有用。 另外,我遇到了类似的问题,因为我想使用\pageref
,但提供的解决方案仅适用于\getref
并且不适用于\getfullref
。
幸运的是,我能够通过修补两个命令来使它们正常工作:\deftag
和\ep@putlabel@b
。
第一个是修复\getref
。第二个是必需的,\getfullref
因为它处理由...定义的每个expex
部分。\pex
\xe
\a
这里的关键好处就是你所要求的:不需要\deftagex
或\deftaglabel
我提供的修复方法为您提供了两个选项。首先,您可以创建新的命令以保留旧的\getref
和\getfullref
功能(此方法更安全,但需要在您想要超链接的地方进行查找/替换)。其次,您可以全局修补命令,以便它们将全部处理超链接。我在本 MWE 中的第二个选项上方的评论中提出了第一个选项:
\documentclass[11pt,twoside,openany,notitlepage]{book}
\usepackage{geometry}
\usepackage{graphicx}
\usepackage{expex}
\usepackage[table,xcdraw]{xcolor}
\gathertags
\usepackage{hyperref}
\usepackage{etoolbox}
\makeatletter
\pretocmd\deftag{\hypertarget{#2}{}\label{#2}}{}{\fail}%
\patchcmd{\ep@putlabel@b}
{\deftaglabel{\@optionaltag}}
{\hypertarget{\@localextag.\@optionaltag}{}\label{\@localextag.\@optionaltag}\deftaglabel{\@optionaltag}}
{}
{\fail}%
%% Version 1: SAFE method - new methods for hyperlinking
%\def\gethyperref#1{\hyperlink{#1}{\getref{#1}}}%
%\def\getfullhyperref#1{\hyperlink{#1}{\getfullref{#1}}}%
%% Version 2: UNSAFE - overwrite \getref and \getfull ref globally
\let\old@getref\getref
\def\getref#1{\hyperlink{#1}{\old@getref{#1}}}%
\let\old@getfullref\getfullref
\def\getfullref#1{\hyperlink{#1}{\old@getfullref{#1}}}%
\makeatother
\begin{document}
Here is a bunch of text! and now there's an example (getref=\getref{adj-predicates}) (getfullref=\getfullref{adj-predicates}). Next page has (getref=\getref{ex2}) and (getfullref=\getfullref{ex2.A})--(getfullref=\getfullref{ex2.B}).
\ex<adj-predicates>
\begingl
\gla This way please. //
\glft `Bitte hier entlang' \trailingcitation source //
\endgl
\xe
\clearpage
Here is another bit of text and one more example (getref=\getref{ex2}). (getfullref=\getfullref{ex2.A})--(getfullref=\getfullref{ex2.B}) is much better than (getref=\getref{adj-predicates}) on previous page.
\pex<ex2>
\a<A>
\begingl
\gla Oh no! //
\glft `Oh nein!' \trailingcitation source1 //
\endgl
\a<B>
\begingl
\gla I'm sorry! //
\glft `Es tut mir leid.' \trailingcitation source2 //
\endgl
\xe
\end{document}
如果您出于某种原因不想使用etoolbox
,您需要复制并粘贴整个定义,然后\deftag
使用补丁重新定义它们。\ep@putlabel@b
expex
最后,我使用 XeLaTeX 进行了测试。这些链接在默认的 TeXworks(适用于 MiKTeX)、Adobe Acrobat 和 SumatraPDF 中对我有效。我认为这应该可以正常工作,但我还没有进行详尽的测试。