如何更改双重词汇表条目的超链接目标?

如何更改双重词汇表条目的超链接目标?

我正在写论文,最初使用的是基本glossaries软件包,最近改用了它,glossaries-extras因为它可以更有效地处理多个词汇表。我有一个与主词汇表分开的首字母缩略词列表,其中许多首字母缩略词在词汇表中都有相应的定义。glossaries用户手册提供双重入境示例对于这种具体情况:

\newcommand*{\newdualentry}[5][]{%
  % main entry:
  \newglossaryentry{main-#2}{name={#4},%
  text={#3\glsadd{#2}},%
  description={#5},%
  #1% additional options for main entry
  }%
  % abbreviation:
  \newacronym{#2}{#3\glsadd{main-#2}}{#4}%
}

以及观察结果:

对于这份简单的文档,这种双重输入是多余的,不必要地引导读者走一条路径,首先到首字母缩略词列表,然后读者必须从那里转到主词汇表来查找描述。

我试图通过直接链接到双重条目的主词汇表条目而不是链接到首字母缩略词来规避此问题。例如,在此文档中:

文档正文中所需排版结果的截图

我希望用于同步定位和地图构建 (SLAM) 的链接\gls{slam}能够定位到相应的词汇表条目。普通的词汇表和首字母缩略词链接行为按原样就可以了。

如何更改双重条目的超链接目标?

因此,自主移动机器人 (AMR) 参考\gls{amr}应继续针对首字母缩略词列表:

排版缩略词列表的屏幕截图

\gls{slam}\gls{end-effector}应该针对主要词汇表:

排版词汇表截图

以下 MWE 用于创建上述屏幕截图。该newdualentry示例已根据我的需要进行了调整:

\documentclass{report}

\usepackage[colorlinks]{hyperref}
\usepackage[acronym]{glossaries-extra}

\setabbreviationstyle[acronym]{long-short}

\newcommand*{\newdualentry}[5][]{%
  \newglossaryentry{main.#2}{%
    name={#4 (\glslink{#2}{#3})},%
    text={#3},%
    description={#5},%
    #1%
  }%
  \newacronym{#2}{#3}{#4}%
}

\makeglossaries

\newacronym{amr}{AMR}{autonomous mobile robot}

\newdualentry{slam}{SLAM}{simultaneous localization and mapping}{
  Update a map of an uncertain environment (mapping) while simultaneously
  maintaining an estimate of location within that environment (localization).
}

\newglossaryentry{end-effector}{
  name={end-effector},
  description={
    Device specifically designed for attachment to the mechanical-interface to
    enable the robot to perform its task.
  }
}

\setlength{\parindent}{0pt}

\begin{document}
\section{Current Effect}

Both of these link to the acronym listing, which I *do not* want: \\
  \hspace*{1cm} First use: \gls{slam}. \\
  \hspace*{1cm} Next use: \gls{slam}.

Acronym-only entires link to the acronym listing, which *is* what I want: \\
  \hspace*{1cm} First use: \gls{amr} \\
  \hspace*{1cm} Next use: \gls{amr}.

Glossary-only entries link to the glossary entry, which as also good: \\
  \hspace*{1cm} \gls{end-effector}


\section{Desired Effect}

I want the \texttt{\textbackslash gls\{slam\}} macro from above to behave as if
I had done: \\
  \hspace*{1cm} First use: \glslink{main.slam}{\glsxtrfull{slam}}. \\
  \hspace*{1cm} Next use: \gls{main.slam}. \\
where these two link to the full glossary entry, similar to \gls{end-effector}.

\printacronyms[title={List of Acronyms}]
\printglossary

\end{document}

澄清

评论来自@cfr建议在首字母缩略词标签上使用前缀,而不是主条目:

\newcommand*{\newdualentry}[5][]{%
  \newglossaryentry{#2}{%
    name={#4 (\glslink{acr-#2}{#3})},%
    text={#3},%
    description={#5},%
    #1%
  }%
  \newacronym{acr-#2}{#3}{#4}%
}

但这会在首次使用时自动扩展为完整的长短文本。使用此方法时比较 SLAM 和 AMR:

屏幕截图显示了用户 cfr 正在使用的建议

这是她的完整答案

答案1

您可以简单地修改用于定义双重条目的宏,以便它执行您想要的操作。\gls{<label>}想要链接到带有标签的条目<label>,那就让它链接吧。main.在这些情况下,删除前缀,而是在首字母缩略词前加上前缀。这与您在文档中所做的操作无关,因为在双重条目的情况下,链接到首字母缩略词的唯一内容是词汇表条目,我们只需在宏的定义中添加相应的前缀即可。

为了获得显示的精确输出,您还需要添加一个键以确保在第一次使用时获得正确的输出。但同样,只需修改双重设置宏即可完成此操作。

\newcommand*{\newdualentry}[5][]{%

删除main.前缀。我们想要#2链接到词汇表条目,因此我们应该在这里使用它。

  \newglossaryentry{#2}{%

显然,我们现在需要为首字母缩略词添加一个不同的标签,因此我们必须使我们的链接针对正确的位置(或者我们会有一个自引用的条目)。

    name={#4 (\glslink{acr-#2}{#3})},

我们还希望在第一次使用时获得正确的输出,默认情况下,这与首字母缩略词的输出不同。为了避免text在第一次使用时使用,我们需要指定first(因为在第一次使用时text会覆盖name)。

    first={#4 (\gls{acr-#2})},
    text={#3},
    description={#5},
    #1,
  }%

最后,我们需要确保首字母缩略词使用了正确的标签。

  \newacronym{acr-#2}{#3}{#4}%
}

任务完成。

完整代码

我只修改了文档源的最后一部分,其中你故意使用了你不想要的输入来产生你想要的输出。由于你想要的输入现在产生了那个输出,所以我做了相应的调整。

\documentclass{report}

\usepackage[colorlinks]{hyperref}
\usepackage[acronym]{glossaries-extra}

\setabbreviationstyle[acronym]{long-short}

\newcommand*{\newdualentry}[5][]{%
  \newglossaryentry{#2}{%
    name={#4 (\glslink{acr-#2}{#3})},
    first={#4 (\gls{acr-#2})},
    text={#3},
    description={#5},
    #1,
  }%
  \newacronym{acr-#2}{#3}{#4}%
}

\makeglossaries

\newacronym{amr}{AMR}{autonomous mobile robot}

\newdualentry{slam}{SLAM}{simultaneous localization and mapping}{
  Update a map of an uncertain environment (mapping) while simultaneously
  maintaining an estimate of location within that environment (localization).
}

\newglossaryentry{end-effector}{
  name={end-effector},
  description={
    Device specifically designed for attachment to the mechanical-interface to
    enable the robot to perform its task.
  }
}

\setlength{\parindent}{0pt}

\begin{document}
\section{Current Effect}

Both of these link to the acronym listing, which I *do not* want: 

  \hspace*{1cm} First use: \gls{slam}. 

  \hspace*{1cm} Next use: \gls{slam}.

Acronym-only entires link to the acronym listing, which *is* what I want: 

  \hspace*{1cm} First use: \gls{amr} 
  
  \hspace*{1cm} Next use: \gls{amr}.

Glossary-only entries link to the glossary entry, which as also good: 

  \hspace*{1cm} \gls{end-effector}


\section{Desired Effect}

I want the \texttt{\textbackslash gls\{slam\}} macro from above to behave as if
I had done: 

First use:  \glsreset{slam}\gls{slam}.

Next use: \gls{slam}. 

where these two link to the full glossary entry, similar to \gls{end-effector}.

\printacronyms[title={List of Acronyms}]
\printglossary

\end{document}

[请注意,由于 Okular 错误,我目前无法添加图像。我不确定这是否重要,因为图像无论如何都不会显示链接。]

答案2

cfr 的答案作为一个简单的解决方案非常棒,但是它\glsxtrfull在我的整个项目中导致了与宏相关的问题,我需要覆盖首次使用的行为——而且有很多。

浏览后词汇表-extra.sty v1.53:记录代码,我想到了另一个解决方案,同样以\newdualentry宏为中心。主要想法是设置alias钥匙首字母缩略词条目:

这类似于see键,但值只能是单个条目标签。除了自动索引交叉引用,此命令将导致具有此键的条目在使用以下命令引用时,超链接转到别名条目\gls. 每当使用以下命令对条目进行索引时\gls, 这索引将对目标条目(别名值)执行。请参阅§5.9了解更多详情。

任何具有seeseealso或键设置的条目在使用或 时alias都将默认添加到词汇表中。如果您不想要此行为,请使用makeindexxindyautoseeindex=false 包选项并实现后描述挂钩以插入交叉引用。

这使得它成为我项目的无缝解决方案,但缺点是链接到首字母缩略词列表中的条目会变得很麻烦。这对我来说不是问题,因为我不打算在双重词汇表条目之外这样做。完整的宏是:

\newcommand*{\newdualentry}[5][]{%
  \newglossaryentry{main.#2}{%
    name={#4 (\glsxtrhyperlink{glo:#2}{{\glsxtrprotectlinks#3}})%
      \glsadd{#2}%
    },%
    text={#3},%
    description={#5},%
    #1%
  }%
  \newacronym{#2}{#3}{#4}%
  \GlsXtrSetField{#2}{alias}{main.#2}%
}

打破这个...

\newcommand*{\newdualentry}[5][]{%
  \newglossaryentry{main.#2}{%

我保留main.前缀。

    name={#4 (\glsxtrhyperlink{glo:#2}{{\glsxtrprotectlinks#3}})%
      \glsadd{#2}%
    },%

name字段将被这个怪物替换。\glslink{#2}{#3}在这里不起作用,因为词汇表将替换#2为别名标签,main.#2这意味着主条目只会链接到其自身。

相反,我使用\glsxtrhyperlink{<target>}{<text>},其中glo:目标中的前缀由词汇表在后台使用。这是基于\glsxtrdohyperlink记录代码的 §1.3.4,其中完成了别名超链接替换。我花了几个小时试图找到一种方法来使用其他词汇表机制,但这是我能想到的最好的办法。

由于我没有使用\glslink,因此我使用\glsadd{#2}将此位置添加到首字母缩略词索引中。这将取代上面使用包选项时提到的后描述钩子autoseeindex=false

    text={#3},%
    description={#5},%
    #1%
  }%
  \newacronym{#2}{#3}{#4}%
  \GlsXtrSetField{#2}{alias}{main.#2}%
}

首字母缩略词不定义alias键,但底层字段仍按上述方式工作。因此,\GlsXtrSetField让我在创建首字母缩略词后定义该字段。

其余代码无需修改即可运行,并且完全符合我的要求。

相关内容