我正在使用glossaries-extra
它来生成缩写列表,并且我想在每一章重置缩写,以便:
- 如果该条目在章节中只出现一次,则仅使用“长”形式(并且不要将其添加到列表中)。
- 如果该条目在章节中出现多次:
- 在章节第一次出现时使用“长(短)”形式
- 在后续章节中使用“短”形式
- 将条目添加到列表中
为了区分每个章节中“第一次”出现和后续出现的情况,我们可以:
\AddToHook{cmd/chapter/before}{\glsresetall}
为了区分“单次”使用和多次使用,我们可以使用以下方式启用引用计数:
\GlsXtrEnableEntryUnitCounting{abbreviation}{1}{chapter}
然而,虽然单独使用其中任何一个都可以解决部分问题,但同时使用两者则不再能达到预期效果。请考虑以下文档:
\documentclass{book}
\usepackage{hyperref}
\usepackage[
abbreviations,
shortcuts=abbr,
]{glossaries-extra}
\makeglossaries
\GlsXtrEnableEntryUnitCounting{abbreviation}{1}{chapter}
% This is what I'd like to do instead of manually resetting after each chapter
\AddToHook{cmd/chapter/before}{\glsresetall}
\newabbreviation{ABC}{ABC}{Aaaa Bbbb Cccc}
\newabbreviation{DEF}{DEF}{Dddd Eeee Ffff}
\newabbreviation{GHI}{GHI}{Gggg Hhhh Iiii}
\begin{document}
\chapter{Chapter 1}
\ab{ABC}, \ab{ABC}, \ab{ABC}
\ab{DEF}
\ab{GHI}
\chapter{Chapter 2}
% \glsresetall % resetting after \chapter works
\ab{ABC}
\ab{DEF}, \ab{DEF}, \ab{DEF}
\ab{GHI}
\chapter{Chapter 3}
% \glsresetall % ditto
\ab{ABC}
\ab{DEF}
\ab{GHI}, \ab{GHI}, \ab{GHI}
\printabbreviations
\end{document}
这导致全部缩写以“长”形式书写,并且仅GHI
出现在缩写列表中。(使用pdflatex
-> pdflatex
-> makeglossaries
-> pdflatex
-> pdflatex
-> makeglossaries
-> pdflatex
->编译pdflatex
)。
但手动重置后每章都会给我们预期的结果,例如:
\documentclass{book}
\usepackage{hyperref}
\usepackage[
abbreviations,
shortcuts=abbr,
]{glossaries-extra}
\makeglossaries
\GlsXtrEnableEntryUnitCounting{abbreviation}{1}{chapter}
% This is what I'd like to do instead of manually resetting after each chapter
% \AddToHook{cmd/chapter/before}{\glsresetall}
\newabbreviation{ABC}{ABC}{Aaaa Bbbb Cccc}
\newabbreviation{DEF}{DEF}{Dddd Eeee Ffff}
\newabbreviation{GHI}{GHI}{Gggg Hhhh Iiii}
\begin{document}
\chapter{Chapter 1}
\ab{ABC}, \ab{ABC}, \ab{ABC}
\ab{DEF}
\ab{GHI}
\chapter{Chapter 2}
\glsresetall % resetting after \chapter works
\ab{ABC}
\ab{DEF}, \ab{DEF}, \ab{DEF}
\ab{GHI}
\chapter{Chapter 3}
\glsresetall % ditto
\ab{ABC}
\ab{DEF}
\ab{GHI}, \ab{GHI}, \ab{GHI}
\printabbreviations
\end{document}
这里的问题是我们不能使用\AddToHook{cmd/chapter/after}{\glsresetall}
,因为\chapter
......
我一直在研究代码,据我所知,glossaries
/所做的跟踪glossaries-extra
与计数器的重置无关,其引用计数是在引用发生时触发的,并使用“unitcounter”的当前值。所以这种差异真的让我很困惑。
因此,问题有两个方面:
- 为什么会有这种差异?
- 是否有一种方便的方法可以同时获得这两件事,而不需要依赖于在每章之后手动重置词汇表条目?
答案1
终于!(原因见编辑历史)
将\glsresetall
每个章节都用于此目的,\GlsXtrEnableEntryUnitCounting
会产生两个问题:
- 首先,发出任何重置命令,也会重置
entrycount
,从而篡改计数。 - 第二,也是最重要的,
\@gls@write@entryunitcounts
运行\AtEndDocument
并遍历所有 gls 条目,但实际上只将当时“设置”或“使用”的条目的数据写入 .aux 文件。因此,如果我们在每一章重置所有条目,则只有上一章中使用的条目才会被写入,因此可用于下一次运行。从整个文档的角度来看,这是一个任意集合。
因此,混合使用这两种程序效果并不好。必须找到一种替代形式来“重置”每个章节中条目的第一次(但不是单一)使用。我能想到的最好的方法是:
\newcommand*{\restoreusedflag}{}
\preto\glslinkpresetkeys{%
\ifnumcomp{\glsentrycurrcount{\glslabel}}{=}{0}
{%
\ifglsused{\glslabel}
{\renewcommand*\restoreusedflag{\csuse{@@glsunset}{\glslabel}}}{}%
\glsreset{\glslabel}%
}{}%
}
\preto\glspostlinkhook{%
\ifglsused{\glslabel}{}{\restoreusedflag}%
\renewcommand*{\restoreusedflag}{}%
}
这实际上做了两件事。对于每个章节中给定条目的第一次出现(使用条目计数数据进行测试\ifnumcomp{\glsentrycurrcount{\glslabel}}{=}{0}
):设置一个宏\restoreusedflag
,该宏在需要时应执行名称所说的操作,然后重置条目。什么时候需要恢复?:当在命令开头(在\glslinkpresetkeys
)设置了 used 标志,但在结尾(在\glspostlinkhook
)没有设置 used 标志时。这意味着我们使用了一个\glstext-like
不设置 used 标志的命令,但由于我们重置了条目,因此我们必须恢复以前的状态。需要注意的是使用\@@glsunset
而不是\glsunset
不要影响条目计数器值(因为\glsreset
这没有区别,因为我们知道运行时条目计数为零)。
由于\glslinkpostsetkeys
仅对触发计数触发器的条目调用,因此这不会影响章节中“单个”条目的情况。
综合起来:
% arara: pdflatex
% arara: pdflatex
% arara: makeglossaries
% arara: pdflatex
\documentclass[oneside]{book}
\usepackage[a6paper]{geometry}
\usepackage{hyperref}
\usepackage[
abbreviations,
shortcuts=abbr,
]{glossaries-extra}
\makeglossaries
\newcounter{myuniquechapter}
\GlsXtrEnableEntryUnitCounting{abbreviation}{1}{myuniquechapter}
\AddToHook{cmd/chapter/before}{\stepcounter{myuniquechapter}}
\newcommand*{\restoreusedflag}{}
\preto\glslinkpresetkeys{%
\ifnumcomp{\glsentrycurrcount{\glslabel}}{=}{0}
{%
\ifglsused{\glslabel}
{\renewcommand*\restoreusedflag{\csuse{@@glsunset}{\glslabel}}}{}%
\glsreset{\glslabel}%
}{}%
}
\preto\glspostlinkhook{%
\ifglsused{\glslabel}{}{\restoreusedflag}%
\renewcommand*{\restoreusedflag}{}%
}
\newabbreviation{ABC}{ABC}{Aaaa Bbbb Cccc}
\newabbreviation{DEF}{DEF}{Dddd Eeee Ffff}
\newabbreviation{GHI}{GHI}{Gggg Hhhh Iiii}
\begin{document}
\chapter{Chapter 1}
\ab{ABC}, \ab{ABC}, \ab{ABC}
\ab{DEF}
\ab{GHI}
\chapter{Chapter 2}
\ab{ABC}
\ab{DEF}, \ab{DEF}, \ab{DEF}
\ab{GHI}
\chapter{Chapter 3}
\ab{ABC}
\ab{DEF}
\ab{GHI}, \ab{GHI}, \ab{GHI}
\printabbreviations
\end{document}
我使用myuniquechapter
而不是 ,chapter
这样未编号的章节也可以得到正确处理。但如果不需要,只需使用\GlsXtrEnableEntryUnitCounting{abbreviation}{1}{chapter}
并放开钩子即可。
答案2
重新定义\chapter
以便添加after
它有效
\documentclass[oneside]{book}
\usepackage[a6paper]{geometry}
\usepackage{hyperref}
\usepackage[
abbreviations,
shortcuts=abbr,
]{glossaries-extra}
\makeglossaries
\NewCommandCopy{\latexchapter}{\chapter}
\RenewDocumentCommand{\chapter}{sO{#3}m}{%
\IfBooleanTF{#1}{\latexchapter*{#3}}{\latexchapter[#2]{#3}}%
}
\AddToHook{cmd/chapter/after}{\glsresetall}
\GlsXtrEnableEntryUnitCounting{abbreviation}{1}{chapter}
\newabbreviation{ABC}{ABC}{Aaaa Bbbb Cccc}
\newabbreviation{DEF}{DEF}{Dddd Eeee Ffff}
\newabbreviation{GHI}{GHI}{Gggg Hhhh Iiii}
\begin{document}
\chapter{Chapter 1}
\ab{ABC}, \ab{ABC}, \ab{ABC}
\ab{DEF}
\ab{GHI}
\chapter{Chapter 2}
\ab{ABC}
\ab{DEF}, \ab{DEF}, \ab{DEF}
\ab{GHI}
\chapter{Chapter 3}
\ab{ABC}
\ab{DEF}
\ab{GHI}, \ab{GHI}, \ab{GHI}
\printabbreviations
\end{document}
注意:a6paper
和oneside
只是为了缩小图片。
答案3
我在用着pandoc-gls在 pandoc Markdown 文档中获得词汇表支持。
这就是我所使用的header-includes
,或者实际上,就我的情况而言,是基于 egreg 的回答的一个include-in-header
文件。config.yaml
\usepackage[
toc,
abbreviations,
shortcuts=abbr,
]{glossaries-extra}
\setabbreviationstyle[acronym]{long-short-desc}
\makenoidxglossaries
\include{glossary}
% reset glossary first-use expansion for each chapter
\NewCommandCopy{\latexchapter}{\chapter}
\RenewDocumentCommand{\chapter}{sO{#3}m}{%
\IfBooleanTF{#1}{\latexchapter*{#3}}{\latexchapter[#2]{#3}}%
}
\AddToHook{cmd/chapter/after}{\glsresetall}
\GlsXtrEnableEntryUnitCounting{abbreviation}{1}{chapter}
我已将其放入一个文件中并使用以下内容引用它--defaults config.yaml
:
include-in-header:
- '.filters/glossary-include-in-header.tex'