Игнорирование аббревиатур глоссариев при использовании записей глоссария

Игнорирование аббревиатур глоссариев при использовании записей глоссария

Я стараюсь игнорировать аббревиатуры, которые используются только один раз, как описано вэтот вопрос. К сожалению, у меня две проблемы:

  1. Аббревиатура, которая использовалась когда-то, по-прежнему отображается в качестве первой записи (длинный текст с аббревиатурой в скобках вместо простого длинного текста). Сообщение Patching failed (2)появилось, так что, возможно, \patchcmdнеобходимо обновить его, чтобы отразить последний код глоссариев?
  2. Etoolbox выдает 'Boolean '\ifglo@test@usedonlyonce' undefinedошибку для каждого \newglossaryentry.

Как можно использовать и аббревиатуры, и записи глоссария, игнорируя при этом однократно используемые аббревиатуры?глоссарийзаписи все равно должны отображаться в списке, ноаббревиатурыне должна.

Минимальный пример, выдающий ошибки:

\documentclass{article}

\usepackage{etoolbox}
\usepackage{glossaries}

\makeatletter

\appto\newacronymhook{%
  \newbool{glo@\the\glslabeltok @usedonlyonce}% define an additional switch per acronym
}

\patchcmd{\@gls@}{%
    \glsunset{#2}%
  }{% write appropriate information to the main auxiliary file
    \ifglsused{#2}{%
      \write\@auxout{\global\setbool{glo@#2@usedonlyonce}{false}}%
    }{%
      \write\@auxout{\global\setbool{glo@#2@usedonlyonce}{true}}%
    }%
    \glsunset{#2}%
  }{}{\message{^^JPatching failed (1)^^J}}

\patchcmd{\@gls@}{%
    \glsentryfirst{#2}%
  }{% print the long form of the acronym if the acronym is used only once
    \ifbool{glo@#2@usedonlyonce}{\glsentrylong{#2}}{\glsentryfirst{#2}}%
  }{}{\message{^^JPatching failed (2)^^J}}

\let\old@do@wrglossary\@do@wrglossary
\renewcommand{\@do@wrglossary}[1]{\ifbool{glo@#1@usedonlyonce}{}{\old@do@wrglossary{#1}}}


\makeatother

\newacronym{ANO}{ANO}{Acronym Number One}
\newacronym{ANT}{ANT}{Acronym Number Two}
\newglossaryentry{test} {
    name={test},
    description={A test is used for testing}
}

\makeglossaries

\begin{document}

\printglossaries

\noindent
\gls{ANO}, \gls{ANO}\\
\gls{ANT}\\
\gls{test}

\end{document}

У меня MikTeX и TeXnicCenter настроены так, как описаноздесь. Результат, который я получаю, когда \newglossaryentryи соответствующее \glsзакомментировано: результат компиляции tex

решение1

Благодаря глоссариям версии 4.14, выпущенным вскоре после публикации вопроса, можно игнорировать аббревиатуры и пункты глоссария, которые используются только один раз, и получать результаты, точно соответствующие запрошенным выше.

Приведенный выше пример преобразуется в следующее:

\documentclass{article}

\usepackage{glossaries}

\makeglossaries

\glsenableentrycount

\newacronym{ANO}{ANO}{Acronym Number One}
\newacronym{ANT}{ANT}{Acronym Number Two}
\newglossaryentry{test} {
    name={test},
    description={A test is used for testing}
}

\begin{document}

\printglossaries

\noindent
\cgls{ANO}, \cgls{ANO}\\
\cgls{ANT}\\
\gls{test}

\end{document}

Обратите внимание на различное положение \makeglossaries, добавление \glsenableentrycountи использование \cglsвместо \gls.

Ссылаясь на Николу из ответаздесь, где также можно найти более подробную информацию о том, как это работает.

Связанный контент