如何让 \glsadd 与 sort=use 一起工作?

如何让 \glsadd 与 sort=use 一起工作?

当我将索引引用放在一行中时,例如

once upon a \index{time}midnight dreary,

关键字(上例中的“time”)未排版。但是,当我将词汇表术语放在一行中时,例如

once upon a \gls{time}midnight dreary

词汇表替换文本排版。

我可以让词汇表术语像索引引用一样工作吗?我只希望词汇表术语出现在文档末尾的词汇表列表中,而不是在文档正文中使用时出现。

MWE 与glossariesv4.34 不兼容:

\documentclass{article}
\usepackage[automake,sort=use]{glossaries}

\makeglossaries
\newglossaryentry{potato}{name={potato},description={potato}}
\newglossaryentry{cucumber}{name={cucumber},description={cucumber}}
\newglossaryentry{onion}{name={onion},description={onion}}
\begin{document}
\glsadd{potato}tomato
\glsadd{cucumber}
\printglossaries
\end{document}

glossaries-extra如果您glossaries用替换 ,则 v1.23也同样如此glossaries-extra

答案1

更新:在和的最新版本1.244.35中,这个错误已经被修复,我在这个答案中提供的补丁不再需要。glossaries-extraglossaries

更新: 由于1.13的版本glossaries-extra导致了该答案中图像中显示的所需输出,因此最新版本1.23也导致文本中写入了土豆和黄瓜(输出类似于\gls使用 代替\glsadd)。

因此,我尝试将解决方案调整到适合该包。这在下面的 MWE 中显示,它使用 version以及 versionglossaries得到所需的输出。4.294.34

与之前的另一个例子一样,这个 MWE 只需要使用 编译两次pdflatex

\documentclass{article}
\usepackage[automake,sort=use]{glossaries}

\makeatletter
\renewrobustcmd*{\glsadd}[2][]{%
  \@gls@adjustmode
  \glsdoifexists{#2}%
  {%
    \def\@glsnumberformat{glsnumberformat}%
    \edef\@gls@counter{\csname glo@\glsdetoklabel{#2}@counter\endcsname}%
    \setkeys{glossadd}{#1}%
    \@gls@saveentrycounter%
    \@gls@setsort{#2}%
    \@@do@wrglossary{#2}%
  }%
}
\makeatother

\newglossaryentry{potato}{name={potato},description={potato}}
\newglossaryentry{cucumber}{name={cucumber},description={cucumber}}
\newglossaryentry{onion}{name={onion},description={onion}}
\makeglossaries
\begin{document}
\glsadd{potato}tomato
\glsadd{cucumber}
\printglossaries
\end{document}

glossaries-extra使用包的旧答案

由于我最初似乎误解了所需的输出(对此深表歉意),这里是 MWE 的更正版本,它仅打印 使用的条目\glsadd。此外,词汇表按外观排序,而不是按字母顺序排序。

\documentclass{article}
\usepackage[automake,sort=use]{glossaries-extra}

\makeatletter
\renewrobustcmd*{\glsadd}[2][]{%
  \@gls@adjustmode
  \@glsxtr@record{#1}{#2}%
  \glsdoifexists{#2}%
  {%
    \def\@glsnumberformat{glsnumberformat}%
    \edef\@gls@counter{\csname glo@\glsdetoklabel{#2}@counter\endcsname}%
    \setkeys{glossadd}{#1}%
    \@gls@saveentrycounter
    \@gls@setsort{#2}%
    \@@do@wrglossary{#2}%
  }%
}
\makeatother

\newglossaryentry{potato}{name={potato},description={potato}}
\newglossaryentry{cucumber}{name={cucumber},description={cucumber}}
\newglossaryentry{onion}{name={onion},description={onion}}
\makeglossaries
\begin{document}
\glsadd{potato}tomato
\glsadd{cucumber}
\printglossaries
\end{document}

在此处输入图片描述

正如您在输出图像中看到的,'potato' 和 'cucumber' 未打印在文本中,但按照它们在代码(选项sort=use)中使用的顺序出现在词汇表中。此外,'onion' 未出现在词汇表中,因为它未在命令中使用\glsadd

在此示例中,我使用了\makeglossariesNicola Talbot 在评论中建议的命令和错误修复。据她所述,该错误将在即将推出的版本中修复,因此在未来的版本中,\makeatletter和之间的整个代码\makeatother将不再需要。

此解决方案还需要排序程序,因此我添加了该automake选项。有关替代方案,请参阅下面的原始答案。


旧答案: 以下几行是我原来的答案。虽然它不是实现 Evan Aad 所寻找的输出所必需的,但我还是将其留在这里,以免让这个答案的评论显得脱离上下文。

以下 MWE 应该会给您所需的输出:

\documentclass{article}
\usepackage[automake]{glossaries-extra}
\newglossaryentry{potato}{name={potato},description={potato}}
\newglossaryentry{cucumber}{name={cucumber},description={cucumber}}
\makeglossaries
\begin{document}
\glsadd{cucumber}cucumber
\par
\glsadd{potato}tomato
\printglossaries
\end{document}

请注意,我已将该选项添加automakeglossaries-extra包中。这将自动为您运行makeindexxindy然后按字母顺序对引用的参考文献进行排序。

您也可以makeglossaries通过命令行自行运行该应用程序,或者向编辑器添加自定义条目。请注意,由于此应用程序是用 perl 编写的,因此您需要一个合适的 perl 解释器。

此外,您还可以选择makeglossaries-lite.lua通过命令行或配置编辑器来运行 lua 应用程序。

相关内容