当我将索引引用放在一行中时,例如
once upon a \index{time}midnight dreary,
关键字(上例中的“time”)未排版。但是,当我将词汇表术语放在一行中时,例如
once upon a \gls{time}midnight dreary
词汇表替换文本排版。
我可以让词汇表术语像索引引用一样工作吗?我只希望词汇表术语出现在文档末尾的词汇表列表中,而不是在文档正文中使用时出现。
MWE 与glossaries
v4.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.24
和4.35
中,这个错误已经被修复,我在这个答案中提供的补丁不再需要。glossaries-extra
glossaries
更新:
由于1.13
的版本glossaries-extra
导致了该答案中图像中显示的所需输出,因此最新版本1.23
也导致文本中写入了土豆和黄瓜(输出类似于\gls
使用 代替\glsadd
)。
因此,我尝试将解决方案调整到适合该包。这在下面的 MWE 中显示,它使用 version以及 versionglossaries
得到所需的输出。4.29
4.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
。
在此示例中,我使用了\makeglossaries
Nicola 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}
请注意,我已将该选项添加automake
到glossaries-extra
包中。这将自动为您运行makeindex
。xindy
然后按字母顺序对引用的参考文献进行排序。
您也可以makeglossaries
通过命令行自行运行该应用程序,或者向编辑器添加自定义条目。请注意,由于此应用程序是用 perl 编写的,因此您需要一个合适的 perl 解释器。
此外,您还可以选择makeglossaries-lite.lua
通过命令行或配置编辑器来运行 lua 应用程序。