如何让 hyperref 与 expex 一起发挥作用,以便 getref 超链接到 deftag

如何让 hyperref 与 expex 一起发挥作用,以便 getref 超链接到 deftag

如何获取 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}

第一页: 带有超链接的 expex pg1

第二页: 带有超链接的 expex pg2

如果您出于某种原因不想使用etoolbox,您需要复制并粘贴整个定义,然后\deftag使用补丁重新定义它们。\ep@putlabel@bexpex

最后,我使用 XeLaTeX 进行了测试。这些链接在默认的 TeXworks(适用于 MiKTeX)、Adobe Acrobat 和 SumatraPDF 中对我有效。我认为这应该可以正常工作,但我还没有进行详尽的测试。

相关内容