词汇表:glsreset 与 indexonlyfirst 冲突

词汇表:glsreset 与 indexonlyfirst 冲突

令我惊讶的是,缩写 TEST 在词汇表中出现了两次。这似乎是由于 glsreset 造成的。我怎样才能仍然只显示文档中第一次使用的内容?

文档第 94 页的红框中指出这是已知行为。但我不明白是否可以更改它。

\listfiles
\documentclass{article}

\usepackage[indexonlyfirst=true]{glossaries}
\makenoidxglossaries
\setacronymstyle{long-short}
\newacronym
    {TEST}{Short Test}{Long Test}
\newacronym
    {FOO}{Short Foo}{Long Foo}

\begin{document}

\gls{TEST}
\gls{FOO}
\glsreset{FOO}
\gls{FOO}
\newpage
a
\glsreset{TEST}
\gls{TEST}

\printnoidxglossaries

\end{document}

答案1

\glswriteentry红色框后面是手册中描述的负责将信息写入外部文件的命令。您可以在本地重新定义它,不执行任何操作

\listfiles
\documentclass{article}

\usepackage[indexonlyfirst=true]{glossaries}
\makenoidxglossaries
\setacronymstyle{long-short}
\newacronym
    {TEST}{Short Test}{Long Test}
\newacronym
    {FOO}{Short Foo}{Long Foo}

\begin{document}

\gls{TEST}
\gls{FOO}
\glsreset{FOO}
\gls{FOO}
\newpage
a
\glsreset{TEST}
{\renewcommand*{\glswriteentry}[2]{}\gls{TEST}}

\printnoidxglossaries

\end{document}

如果你要多次使用它,你可能应该为此创建一个宏,比如\newcommand\mygls[1]{\begingroup\renewcommand*{\glswriteentry}[2]{}\glslocalreset{#1}\gls{#1}\endgroup}

然后使用如下

\listfiles
\documentclass{article}

\usepackage[indexonlyfirst=true]{glossaries}
\newcommand\mygls[1]{\begingroup
        \renewcommand*{\glswriteentry}[2]{}%
        \glslocalreset{#1}%
        \gls{#1}\endgroup}
\makenoidxglossaries
\setacronymstyle{long-short}
\newacronym
    {TEST}{Short Test}{Long Test}
\newacronym
    {FOO}{Short Foo}{Long Foo}

\begin{document}

\gls{TEST}
\gls{FOO}
\glsreset{FOO}
\gls{FOO}
\newpage
a
\mygls{TEST}

\printnoidxglossaries

\end{document}

编辑

您可以为每个首字母缩略词添加一个条件,该条件将在首次使用首字母缩略词后设置为 true,然后重新定义\glswriteentry为仅当条件为 false 时才打印页码。以下代码可以做到这一点,但仅适用于首字母缩略词,而不是一般的词汇表条目

\listfiles
\documentclass{article}


\usepackage[indexonlyfirst=true]{glossaries}

\makeatletter
\def\@gls@#1#2[#3]{%
    \glsdoifexists{#2}%
    {%
        \let\do@gls@link@checkfirsthyper\@gls@link@checkfirsthyper
        \let\glsifplural\@secondoftwo
        \let\glscapscase\@firstofthree
        \let\glscustomtext\@empty
        \def\glsinsert{#3}%
        \def\@glo@text{\csname gls@\glstype @entryfmt\endcsname}%
        \@gls@link[#1]{#2}{\@glo@text}%
        \@gls@do@glsunset{#2}%
    }%
    \glspostlinkhook
    \csname #2@used@beforetrue\endcsname
}
\makeatother

\renewcommand*{\glswriteentry}[2]{%
    \csname if#1@used@before\endcsname
    \else
    #2%
    \fi
}

\makenoidxglossaries

\setacronymstyle{long-short}

\NewCommandCopy\oldnewacronym\newacronym % must be after \setacronymstyle
\renewcommand*\newacronym[4][]{\expandafter\newif\csname if#2@used@before\endcsname\oldnewacronym[#1]{#2}{#3}{#4}} % must be after \setacronymstyle

\newacronym
{TEST}{Short Test}{Long Test}
\newacronym
{FOO}{Short Foo}{Long Foo}

\begin{document}
    
    \gls{TEST}
    \gls{FOO}
    \glsreset{FOO}
    \gls{FOO}
    \newpage
    a
    \glsreset{TEST}
    \gls{TEST}
    
    \printnoidxglossaries
    
\end{document}

相关内容