每章重置词汇表的缩写

每章重置词汇表的缩写

我正在使用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}

注意:a6paperoneside只是为了缩小图片。

在此处输入图片描述

答案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'

相关内容