%\iffalse
% glossaries-extra.dtx generated using makedtx version 1.3 (c) Nicola Talbot
% Command line args:
%   -author "Nicola Talbot"
%   -src "glossaries-extra.sty\Z=>glossaries-extra.sty"
%   -src "(.+)\.def\Z=>\$1.def"
%   -src "glossaries-extra-bib2gls.sty\Z=>glossaries-extra-bib2gls.sty"
%   -src "glossaries-extra-stylemods.sty\Z=>glossaries-extra-stylemods.sty"
%   -src "glossary-bookindex.sty\Z=>glossary-bookindex.sty"
%   -src "glossary-longextra.sty\Z=>glossary-longextra.sty"
%   -src "glossary-topic.sty\Z=>glossary-topic.sty"
%   -src "glossary-table.sty\Z=>glossary-table.sty"
%   -src "(example-glossaries-.+\.tex)\Z=>\$1"
%   -src "(example-glossaries-.+\.bib)\Z=>\$1"
%   -src "(glossar.+-2021-11-22.sty)\Z=>\$1"
%   -macrocode ".*\.tex"
%   -comment ".*\.tex"
%   -setambles ".*\.bib=>\nopreamble\nopostamble"
%   -macrocode ".*\.bib"
%   -comment ".*\.bib"
%   -codetitle "Main Package Code (glossaries-extra.sty)"
%   -section section
%   -doc glossaries-extra-codedoc.tex
%   glossaries-extra
% Created on 2026/3/6 16:34
%\fi
%\iffalse
%<*package>
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%</package>
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
% Copyright (C) 2026 Nicola Talbot, all rights reserved.
% \fi
% \iffalse
%<*driver>
\iffalse
glossaries-extra-codedoc.tex is a stub file used by makedtx to create
glossaries-extra.dtx
\fi

\documentclass{article}
\usepackage{doc}

\CheckSum{72077}

\RecordChanges
\PageIndex
\SetupDoc{reportchangedates}
\setcounter{IndexColumns}{2}

\usepackage[T1]{fontenc}
\usepackage{etoolbox}
\usepackage{tcolorbox}
\usepackage[colorlinks]{hyperref}

\definecolor{defbackground}{rgb}{1,1,0.75}

\newtcolorbox{definition}{halign=flush left,
 colframe=black,colback=defbackground,
 fontupper=\ttfamily,
 before upper={\frenchspacing\obeylines},
 after={\par\noindent\ignorespacesafterend}
}

\NewDocElement{Option}{option}
\NewDocElement{AbbrvStyle}{abbrvstyle}
\NewDocElement{Style}{style}
\NewDocElement{BlockStyle}{blockstyle}

\pdfstringdefDisableCommands{%
 \let\sty\@firstofone
 \let\app\@firstofone
 \let\ctr\@firstofone
 \let\category\@firstofone
 \let\catattr\@firstofone
 \let\glostyle\@firstofone
 \let\abbrstyle\@firstofone
 \let\pkgoptfmt\@firstofone
 \renewcommand{\marg}[1]{\string<#1\string>}%
 \renewcommand{\oarg}[1]{\string[#1\string]}%
}

\newcommand{\sty}[1]{\textsf{#1}}
\newcommand{\app}[1]{\texttt{#1}}
\newcommand{\ctr}[1]{\textsf{#1}}
\newcommand{\env}[1]{\textsf{#1}}
\newcommand{\category}[1]{\textsf{#1}}
\newcommand{\catattr}[1]{\textsf{#1}}
\newcommand{\glostyle}[1]{\textsf{#1}}
\newcommand{\abbrstyle}[1]{\textsf{#1}}
\newcommand{\pkgoptfmt}[1]{\textsf{#1}}
\newcommand{\pkgopt}[2][]{\pkgoptfmt{#2\ifstrempty{#1}{}{=#1}}}
\newcommand{\gloskey}[2][]{\textsf{#2}}
\newcommand{\qt}[1]{``#1''}
\newcommand{\sectionref}[1]{\S\ref{#1}}
\newcommand{\dequals}{=}

\providecommand\marg[1]{%
  \allowbreak{\ttfamily\char`\{}\meta{#1}{\ttfamily\char`\}}}
\providecommand\oarg[1]{%
  \allowbreak{\ttfamily[}\meta{#1}{\ttfamily]}}

\title{glossaries-extra.sty v2.0:
 documented code}
\author{Nicola L.C. Talbot\\[10pt]
Dickimaw Books\\
\url{http://www.dickimaw-books.com/}}

\date{2026-03-06}

\begin{document}
\DocInput{glossaries-extra.dtx}
\end{document}
%</driver>
%\fi
%\maketitle
%
%This is the documented code for the \sty{glossaries-extra} package.
%See \texttt{glossaries-extra-manual.pdf} for the user manual.
%
%\tableofcontents
%
%\StopEventually{\PrintChanges \PrintIndex}
%
%
%\section{Main Package Code (glossaries-extra.sty)}
%\iffalse
%    \begin{macrocode}
%<*glossaries-extra.sty>
%    \end{macrocode}
%\fi
%\changes{0.1}{2015-11-22}{Initial experimental release}
%\subsection{Package Initialisation and Options}
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
%    \end{macrocode}
% Rollback releases:
%    \begin{macrocode}
\DeclareRelease{v1.48}{2021-11-22}{glossaries-extra-2021-11-22.sty}
\DeclareCurrentRelease{1.9}{2025-11-03}
%    \end{macrocode}
% Declare package:
%    \begin{macrocode}
\ProvidesPackage{glossaries-extra}[2026/03/06 v2.0 (NLCT)]
%    \end{macrocode}
% Requires \sty{xkeyval} to define package options.
%    \begin{macrocode}
\RequirePackage{xkeyval}
%    \end{macrocode}
% Requires \sty{etoolbox} package.
%    \begin{macrocode}
\RequirePackage{etoolbox}
%    \end{macrocode}
% Has \sty{glossaries} already been loaded?
%    \begin{macrocode}
\@ifpackageloaded{glossaries}
{%
%    \end{macrocode}
% Already loaded so pass any options to \cs{setupglossaries}.
% This means that the options that can only be set when
% \sty{glossaries} is loaded can't be used.
%    \begin{macrocode}
   \newcommand{\glsxtr@dooption}[1]{\setupglossaries{#1}}%
   \let\@glsxtr@declareoption\@gls@declareoption
}
{%
%    \end{macrocode}
% Not already loaded, so pass options to \sty{glossaries}.
%    \begin{macrocode}
   \newcommand{\glsxtr@dooption}[1]{%
     \PassOptionsToPackage{#1}{glossaries}%
   }%
%    \end{macrocode}
% Set the defaults.
%    \begin{macrocode}
   \PassOptionsToPackage{toc}{glossaries}
   \PassOptionsToPackage{nopostdot}{glossaries}
   \PassOptionsToPackage{noredefwarn}{glossaries}
   \@ifpackageloaded{polyglossia}%
   {}%
   {%
     \@ifpackageloaded{babel}%
     {\PassOptionsToPackage{translate=babel}{glossaries}}%
     {}%
   }%
   \newcommand*{\@glsxtr@declareoption}[2]{%
     \DeclareOptionX{#1}{#2}%
     \DeclareOption{#1}{#2}%
   }
}
%    \end{macrocode}
% Declare package options.
%\begin{macro}{\glsxtrundefaction}
% Determines what to do if an entry hasn't been defined.
% The two arguments are the error or warning message and the help
% message if an error should be produced.
%    \begin{macrocode}
\newcommand*{\glsxtrundefaction}[2]{%
  \@glsxtrundeftag\PackageError{glossaries-extra}{#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtr@warnonexistsordo}
% If user wants \pkgopt[warn]{undefaction}, then \sty{glossaries}
% v4.19 is required.
%    \begin{macrocode}
\newcommand*{\glsxtr@warnonexistsordo}[1]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrundeftag}
% Text to display when an entry doesn't exist.
%    \begin{macrocode}
\newcommand*{\glsxtrundeftag}{??}
\newcommand*{\@glsxtrundeftag}{}
%    \end{macrocode}
% This text is switched on at the start of the document to prevent
% unwanted text inserted into the preamble if any tests are made
% before the start of the document.
%\end{macro}
%
%\begin{macro}{\@glsxtr@warn@undefaction}
%This is how \cs{glsxtrundefaction} should behave if
%\pkgopt[warn]{undefaction} is set.
%\changes{1.08}{2016-12-13}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@warn@undefaction}[2]{%
  \@glsxtrundeftag\GlossariesExtraWarning{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@err@undefaction}
%This is how \cs{glsxtrundefaction} should behave if
%\pkgopt[error]{undefaction} is set.
%\changes{1.08}{2016-12-13}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@err@undefaction}[2]{%
  \@glsxtrundeftag\PackageError{glossaries-extra}{#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@warn@onexistsordo}
%This is how \cs{glsxtr@warnonexistsordo} should behave if
%\pkgopt[warn]{undefaction} is set.
%\changes{1.08}{2016-12-13}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@warn@onexistsordo}[1]{%
  \GlossariesExtraWarning{\string#1\space hasn't been defined, so
  some errors won't be converted to warnings. 
  (This most likely means your version of
  glossaries.sty is below version 4.19.)}%
}
%    \end{macrocode}
%\end{macro}

%\begin{macro}{\@glsxtr@redef@forglsentries}
%\changes{1.11}{2017-01-19}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@redef@forglsentries}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@do@redef@forglsentries}
%\changes{1.11}{2017-01-19}{new}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
\newcommand*{\@glsxtr@do@redef@forglsentries}{%
  \renewcommand*{\forglsentries}[3][\glsdefaulttype]{%
    \protected@edef\@@glo@list{\csname glolist@##1\endcsname}%
    \ifdefstring{\@@glo@list}{,}%
    {%
      \GlossariesExtraWarning{\string\forglsentries:
        No entries defined in glossary `##1'}%
    }%
    {%
      \@for##2:=\@@glo@list\do
      {%
        \ifdefempty{##2}{}{##3}%
      }%
    }%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{undefaction}
%    \begin{macrocode}
\define@choicekey{glossaries-extra.sty}{undefaction}%
 [\glsxtr@undefaction@val\glsxtr@undefaction@nr]%
 {warn,error}%
 {%
   \ifcase\glsxtr@undefaction@nr\relax
     \let\glsxtrundefaction\@glsxtr@warn@undefaction
     \let\glsxtr@warnonexistsordo\@glsxtr@warn@onexistsordo
     \let\@glsxtr@redef@forglsentries\@glsxtr@do@redef@forglsentries
   \or
     \let\glsxtrundefaction\@glsxtr@err@undefaction
     \let\glsxtr@warnonexistsordo\@gobble
     \let\@glsxtr@redef@forglsentries\relax
   \fi
 }
%    \end{macrocode}
%\end{option}
%
%To assist bib2gls, v1.08 introduces the \pkgopt{record} option, which will write
%information to the aux file whenever an entry needs to be indexed.
%
%\begin{macro}{\@glsxtr@record}
%\changes{1.08}{2016-12-13}{new}
%\changes{1.14}{2017-04-18}{added third arg}
%Does nothing by default.
%    \begin{macrocode}
\newcommand*{\@glsxtr@record}[3]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@recordsee}
%\changes{1.14}{2017-04-18}{new}
%Does nothing by default.
%    \begin{macrocode}
\newcommand*{\glsxtr@recordsee}[2]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@defaultnumberformat}
%\changes{1.19}{2017-09-09}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@defaultnumberformat}{glsnumberformat}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrSetDefaultNumberFormat}
%\changes{1.19}{2017-09-09}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrSetDefaultNumberFormat}[1]{%
  \renewcommand*{\@glsxtr@defaultnumberformat}{#1}%
}%
%    \end{macrocode}
%\end{macro}
%
%The \pkgopt{record} option is somewhat problematic. On the first
%\LaTeX\ run the entries aren't defined. This isn't as
%straight-forward as commands like \cs{cite} since attributes
%associated with the entry's category may switch off the indexing
%or the entry's glossary type might require a particular counter.
%This kind of information can't be determined until the entry has
%been defined. So there are two different commands here. One that's
%used if the entry hasn't been defined, which tries to use sensible
%defaults, and one which is used when the entry has been defined.
%
%\begin{macro}{\@glsxtr@do@record@wrglossary}
%\changes{1.21}{2017-11-03}{new}
%The \pkgopt[only]{record} option sets \cs{@@do@wrglossary} to this
%command, which means it's done within \cs{glsadd} and
%\cs{@gls@link}, and so is only done if the entry exists.
%    \begin{macrocode}
\newcommand*{\@glsxtr@do@record@wrglossary}[1]{%
 \begingroup
   \ifKV@glslink@noindex
   \else
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
     \protected@edef\@gls@label{\glsdetoklabel{#1}}%
     \let\glslabel\@gls@label
     \glswriteentry{#1}%
     {%
       \ifdefempty{\@glsxtr@thevalue}%
       {%
         \ifx\@glsxtr@org@theHvalue\@glsxtr@theHvalue
         \else
           \let\theHglsentrycounter\@glsxtr@theHvalue
         \fi
         \glsxtr@saveentrycounter
         \let\@@do@@wrglossary\@glsxtr@dorecord
       }%
       {%
         \let\theglsentrycounter\@glsxtr@thevalue
         \let\theHglsentrycounter\@glsxtr@theHvalue
         \let\@@do@@wrglossary\@glsxtr@dorecordnodefer
       }%
       \ifx\@glsxtr@record@setting\@glsxtr@record@setting@alsoindex
         \glsxtr@@do@wrglossary{#1}%
       \else
         \@@glsxtrwrglossmark
%    \end{macrocode}
%Increment associated counter.
%    \begin{macrocode}
         \glsxtr@inc@wrglossaryctr{#1}%
         \@@do@@wrglossary
       \fi
     }%
   \fi
 \endgroup
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@do@alsoindex@wrglossary}
%\changes{1.21}{2017-11-03}{new}
%The \pkgopt[alsoindex]{record} option needs to both record and
%index.
%    \begin{macrocode}
\newcommand*{\glsxtr@do@alsoindex@wrglossary}[1]{%
  \glsxtr@@do@wrglossary{#1}%
  \@glsxtr@do@record@wrglossary{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@glsxtr@record}
%\changes{1.08}{2016-12-13}{new}
%The \pkgopt[only]{record} option sets \cs{@glsxtr@record} to this.
%This performs the recording if the entry \emph{doesn't exist} and is done
%at the start of \cs{@gls@field@link} and commands like \cs{@gls@}
%(before the existence test). This means that it disregards the
%\gloskey[glslink]{wrgloss} key.
%
%The first argument is the option list (as passed in the first optional
%argument to commands like \cs{gls}). This allows the \gloskey[glslink]{noindex}
%setting to be picked up. The second argument is the entry's label.
% The third argument is the key family
%(\texttt{glslink} in most cases, \texttt{glossadd} for \cs{glsadd}).
%    \begin{macrocode}
\newcommand*{\@@glsxtr@record}[3]{%
%    \end{macrocode}
%Save the label in case it's needed. This needs to be outside the
%existence check to allow the post-link hook to reference it.
%\changes{1.42}{2020-02-03}{moved label definition outside of conditional}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
 \protected@edef\@gls@label{\glsdetoklabel{#2}}%
 \let\glslabel\@gls@label
 \ifglsentryexists{#2}{}%
 {%
   \@@glsxtrwrglossmark
   \begingroup
     \let\@glsnumberformat\@glsxtr@defaultnumberformat
     \def\@glsxtr@thevalue{}%
     \def\@glsxtr@theHvalue{\@glsxtr@thevalue}%
     \let\@glsxtr@org@theHvalue\@glsxtr@theHvalue
%    \end{macrocode}
%Entry hasn't been defined, so we'll have to assume it's
%\cs{glscounter} by default.
%    \begin{macrocode}
     \let\@gls@counter\glscounter
%    \end{macrocode}
%Unless the \pkgopt{equations} option is on and this is inside a
%numbered maths environment.
%    \begin{macrocode}
     \if@glsxtr@equations
       \@glsxtr@use@equation@counter
     \fi
%    \end{macrocode}
%Check for default options (which may switch off indexing).
%\changes{1.21}{2017-11-03}{added check for default options}
%    \begin{macrocode}
     \@gls@setdefault@glslink@opts
%    \end{macrocode}
%Implement any pre-key settings.
%\changes{1.30}{2018-04-25}{added check for pre-key hook}
%    \begin{macrocode}
     \csuse{@glsxtr@#3@prekeys}%
%    \end{macrocode}
%Assign keys.
%    \begin{macrocode}
     \setkeys{#3}{#1}%
%    \end{macrocode}
%Implement any post-key settings. Is the auto-add on?
%\changes{1.37}{2018-11-30}{added check for auto-add}
%    \begin{macrocode}
     \glsxtr@do@autoadd{#3}%
%    \end{macrocode}
% Check post-key hook.
%\changes{1.30}{2018-04-25}{added check for post-key hook}
%    \begin{macrocode}
     \csuse{@glsxtr@#3@postkeys}%
%    \end{macrocode}
%Increment associated counter.
%    \begin{macrocode}
     \glsxtr@inc@wrglossaryctr{#2}%
%    \end{macrocode}
%Check if \gloskey[glslink]{noindex} option has been used.
%    \begin{macrocode}
     \ifKV@glslink@noindex
     \else
       \glswriteentry{#2}%
       {%
%    \end{macrocode}
%Check if \gloskey[glsadd]{thevalue} has been set.
%    \begin{macrocode}
         \ifdefempty{\@glsxtr@thevalue}%
         {%
%    \end{macrocode}
%Key \gloskey[glsadd]{thevalue} hasn't been set, but check if
%\gloskey[glsadd]{theHvalue} has been set. (Not particularly likely,
%but allow for it.)
%    \begin{macrocode}
           \ifx\@glsxtr@org@theHvalue\@glsxtr@theHvalue
           \else
             \let\theHglsentrycounter\@glsxtr@theHvalue
           \fi
%    \end{macrocode}
%Save the entry counter.
%    \begin{macrocode}
           \glsxtr@saveentrycounter
%    \end{macrocode}
%Temporarily redefine \cs{@@do@@wrglossary} for use with
%\cs{glsxtr@@do@wrglossary}.
%    \begin{macrocode}
           \let\@@do@@wrglossary\@glsxtr@dorecord
         }%
         {%
%    \end{macrocode}
%\gloskey[glsadd]{thevalue} has been set, so there's no need to
%defer writing the location value. (If it's dependent on the page
%counter, the \gloskey[glslink]{counter} key should be set instead.)
%    \begin{macrocode}
           \let\theglsentrycounter\@glsxtr@thevalue
           \let\theHglsentrycounter\@glsxtr@theHvalue
           \let\@@do@@wrglossary\@glsxtr@dorecordnodefer
         }%
         \ifx\@glsxtr@record@setting\@glsxtr@record@setting@alsoindex
           \glsxtr@@do@wrglossary{#2}%
         \else
%    \end{macrocode}
%No need to escape special characters.
%    \begin{macrocode}
           \@@do@@wrglossary
         \fi
       }%
     \fi
   \endgroup
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@glslink@prekeys}
%\changes{1.30}{2018-04-25}{new}
%    \begin{macrocode}
\newcommand{\@glsxtr@glslink@prekeys}{\glslinkpresetkeys}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@glslink@postkeys}
%\changes{1.30}{2018-04-25}{new}
%    \begin{macrocode}
\newcommand{\@glsxtr@glslink@postkeys}{\glslinkpostsetkeys}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@glossadd@prekeys}
%\changes{1.30}{2018-04-25}{new}
%    \begin{macrocode}
\newcommand{\@glsxtr@glossadd@prekeys}{\glsaddpresetkeys}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@glossadd@postkeys}
%\changes{1.30}{2018-04-25}{new}
%    \begin{macrocode}
\newcommand{\@glsxtr@glossadd@postkeys}{\glsaddpostsetkeys}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@dorecord}
%\changes{1.08}{2016-12-13}{new}
%\changes{1.15}{2017-05-10}{corrected premature expansion of \cs{@glslocref}}
%If \pkgopt[alsoindex]{record} or \pkgopt[hybrid]{record} is used, then \cs{@glslocref} may
%have been escaped, but this isn't appropriate here.
%\changes{1.19}{2017-09-09}{Use \cs{@glsrecordlocref} instead of \cs{@glslocref}}
%    \begin{macrocode}
\newcommand*\@glsxtr@dorecord{%
 \@@glsxtr@dorecord\@gls@label\glsxtr@record\@glsxtr@do@nameref@record
}
%    \end{macrocode}
%\end{macro}

%\begin{macro}{\@@glsxtr@dorecord}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*\@@glsxtr@dorecord[3]{%
   \global\let\@glsrecordlocref\theglsentrycounter
   \let\@glsxtr@orgprefix\@glo@counterprefix
   \ifx\theglsentrycounter\theHglsentrycounter
     \def\@glo@counterprefix{}%
   \else
%    \end{macrocode}
%\changes{1.39}{2019-03-22}{added protection for fragile commands}
% Protect against non-expandable commands occurring in the location.
%    \begin{macrocode}
     \protected@edef\@glsxtr@theentrycounter{\theglsentrycounter}%
     \protected@edef\@glsxtr@theHentrycounter{\theHglsentrycounter}%
     \@onelevel@sanitize\@glsxtr@theentrycounter
     \@onelevel@sanitize\@glsxtr@theHentrycounter
     \@xp@gls@getcounterprefix
       {\@glsxtr@theentrycounter}{\@glsxtr@theHentrycounter}%
   \fi
%    \end{macrocode}
%\changes{1.30}{2018-04-25}{don't suppress expansion of \cs{@glsrecordlocref}}
%\changes{1.29}{2018-04-09}{don't suppress expansion of
%\cs{@glsrecordlocref} if counter isn't page}
%Don't protect the \cs{@glsrecordlocref} from premature expansion.
%If the counter isn't \ctr{page} then it needs expanding. If the
%location includes \cs{thepage} then \cs{protected@write} will
%automatically deal with it.
%\changes{1.37}{2018-11-30}{added check for record=nameref}
%    \begin{macrocode}
   \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
     #3%
      {#1}{\@glo@counterprefix}{\@gls@counter}{\@glsnumberformat}%
      {\@glsrecordlocref}%
   \else
     \@bibgls@write@aux{}{\string#2%
        {#1}{\@glo@counterprefix}{\@gls@counter}{\@glsnumberformat}%
        {\@glsrecordlocref}}%
   \fi
   \@glsxtr@counterrecordhook
   \let\@glo@counterprefix\@glsxtr@orgprefix
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@dorecordnodefer}
%\changes{1.16}{2017-06-15}{new}
%As above, but don't defer expansion of location. This uses
%\cs{theglsentrycounter} directly for the location
%rather than \cs{@glslocref} since there's no need to guard against
%premature expansion of the page counter.
%\changes{1.19}{2017-09-09}{Use \cs{theglsentrycounter} for the location
%rather than \cs{@glslocref}}
%    \begin{macrocode}
\newcommand*\@glsxtr@dorecordnodefer{%
   \ifx\theglsentrycounter\theHglsentrycounter
     \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
       \@glsxtr@do@nameref@record
          {\@gls@label}{}{\@gls@counter}{\@glsnumberformat}%
          {\theglsentrycounter}%
     \else
       \@bibgls@write@aux{}{\string\glsxtr@record
          {\@gls@label}{}{\@gls@counter}{\@glsnumberformat}%
          {\theglsentrycounter}}%
     \fi
   \else
     \@xp@gls@getcounterprefix{\theglsentrycounter}{\theHglsentrycounter}%
     \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
       \@glsxtr@do@nameref@record
          {\@gls@label}{\@glo@counterprefix}{\@gls@counter}%
          {\@glsnumberformat}{\theglsentrycounter}%
     \else
       \@bibgls@write@aux{}{\string\glsxtr@record
         {\@gls@label}{\@glo@counterprefix}{\@gls@counter}{\@glsnumberformat}%
         {\theglsentrycounter}}%
     \fi
   \fi
   \@glsxtr@counterrecordhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@ifnum@mmode}
%\changes{1.37}{2018-11-30}{new}
%Check if in a numbered maths environment.
%The \sty{amsmath} package is automatically loaded by
%\sty{datatool-base}, which is required by \sty{glossaries}, so \cs{ifst@rred}
%and \cs{if@display} should both be defined.
%    \begin{macrocode}
\newcommand{\@glsxtr@ifnum@mmode}[2]{%
 \ifmmode
   \ifst@rred
    #2%
   \else
%    \end{macrocode}
% Non-\sty{amsmath} environments and regular inline math mode isn't
% flagged as starred by \sty{amsmath}, but we can't use \cs{mathchoice} 
% in this case as it's not the current style that's relevant.
% Instead we can use \sty{amsmath}'s \cs{if@display}. This may not
% work for environments that aren't provided by \sty{amsmath}.
%    \begin{macrocode}
     \if@display #1\else #2\fi
   \fi
 \else
   #2%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@do@nameref@record}
%\changes{1.37}{2018-11-30}{new}
%With \pkgopt[nameref]{record}, the current label information is included 
%in the record, but this may not have been defined, so \cs{csuse} will 
%prevent an undefined control sequence error and just leave the last 
%two arguments blank if there's no information. In the event that a record is in
%\sty{amsmath}'s \env{align} environment \cs{@currentHref} will be out.
%There may be other instances where \cs{@currentHref} is out, so
%this also saves \cs{theHglsentrycounter}, which is
%useful if it can't be obtained by prefixing
%\cs{theglsentrycounter}.
%    \begin{macrocode}
\newcommand*{\@glsxtr@do@nameref@record}[5]{%
  \gls@ifnotmeasuring
  {%
    \@bibgls@write@aux{}{\string\glsxtr@record@nameref
     {#1}{#2}{#3}{#4}{#5}%
     {\csuse{@currentlabelname}}{\csuse{@currentHref}}%
     {\theHglsentrycounter}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@glsxtr@recordcounter}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand*{\@@glsxtr@recordcounter}{%
  \@glsxtr@noop@recordcounter
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@noop@recordcounter}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@noop@recordcounter}[1]{%
  \PackageError{glossaries-extra}{\string\GlsXtrRecordCounter\space
   requires record=only or record=hybrid package option}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@op@recordcounter}
%\changes{1.12}{2017-02-03}{new}
%\changes{1.46}{2021-09-20}{changed \cs{eappto} to \cs{protected@eappto}}
%    \begin{macrocode}
\newcommand*{\@glsxtr@op@recordcounter}[1]{%
  \protected@eappto\@glsxtr@counterrecordhook{\noexpand\@glsxtr@docounterrecord{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@recordsee}
%\changes{1.14}{2017-04-18}{new}
%Deal with \cs{glssee} in record mode. (This doesn't increment the
%associated counter.)
%    \begin{macrocode}
\newcommand*{\@glsxtr@recordsee}[2]{%
 \@@glsxtrwrglossmark
 \def\@gls@xref{#2}%
 \@onelevel@sanitize\@gls@xref
 \@bibgls@write@aux{}{\string\glsxtr@recordsee{#1}{\@gls@xref}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtglossaryunit}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand{\printunsrtglossaryunit}{%
  \print@noop@unsrtglossaryunit
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@setup@record}
%\changes{1.08}{2016-12-13}{new}
%Initialise.
%    \begin{macrocode}
\newcommand*{\glsxtr@setup@record}{\let\@@do@wrglossary\glsxtr@@do@wrglossary}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@indexonly@saveentrycounter}
%\changes{1.08}{2016-12-13}{new}
% Only store the entry counter information if the
%indexing is on.
%    \begin{macrocode}
\newcommand*{\glsxtr@indexonly@saveentrycounter}{%
 \ifKV@glslink@noindex
 \else
   \glsxtr@saveentrycounter
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@addloclistfield}
%\changes{1.08}{2016-12-13}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@addloclistfield}{%
 \key@ifundefined{glossentry}{loclist}%
 {%
   \define@key{glossentry}{loclist}{\def\@glo@loclist{##1}}%
   \appto\@gls@keymap{,{loclist}{loclist}}%
   \appto\@newglossaryentryprehook{\def\@glo@loclist{}}%
   \appto\@newglossaryentryposthook{%
     \gls@assign@field{}{\@glo@label}{loclist}{\@glo@loclist}%
   }%
   \glssetnoexpandfield{loclist}%
 }%
 {}%
%    \end{macrocode}
%\changes{1.11}{2017-01-19}{added location key}
%The loclist field is just a comma-separated list. The location
%field is the formatted list.
%    \begin{macrocode}
 \key@ifundefined{glossentry}{location}%
 {%
   \define@key{glossentry}{location}{\def\@glo@location{##1}}%
   \appto\@gls@keymap{,{location}{location}}%
   \appto\@newglossaryentryprehook{\def\@glo@location{}}%
   \appto\@newglossaryentryposthook{%
     \gls@assign@field{}{\@glo@label}{location}{\@glo@location}%
   }%
   \glssetnoexpandfield{location}%
 }%
 {}%
%    \end{macrocode}
%\changes{1.11}{2017-01-19}{added group key}
%Add a key to store the group heading.
%    \begin{macrocode}
 \key@ifundefined{glossentry}{group}%
 {%
   \define@key{glossentry}{group}{\def\@glo@group{##1}}%
   \appto\@gls@keymap{,{group}{group}}%
   \appto\@newglossaryentryprehook{\def\@glo@group{}}%
   \appto\@newglossaryentryposthook{%
     \gls@assign@field{}{\@glo@label}{group}{\@glo@group}%
   }%
   \glssetnoexpandfield{group}%
 }%
 {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@record@setting}
%\changes{1.19}{2017-09-09}{new}
%Keep track of the \pkgopt{record} package option.
%    \begin{macrocode}
\newcommand*{\@glsxtr@record@setting}{off}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@record@setting@alsoindex}
%\changes{1.19}{2017-09-09}{new}
%As from v1.46, the \pkgopt[alsoindex]{record} is renamed to
%\pkgopt[hybrid]{record} with \pkgopt[alsoindex]{record} as a
%deprecated synonym to avoid confusion. The internal commands 
%that include \texttt{alsoindex} in the name will remain unchanged
%to avoid breaking things, but this command will need to be
%redefined by \pkgopt[hybrid]{record}.
%    \begin{macrocode}
\newcommand*{\@glsxtr@record@setting@alsoindex}{alsoindex}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@record@setting@only}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@record@setting@only}{only}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@record@setting@nameref}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@record@setting@nameref}{nameref}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@if@record@only}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@if@record@only}[2]{%
 \ifx\@glsxtr@record@setting\@glsxtr@record@setting@only
  #1%
 \else
  \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
    #1%
  \else
    #2%
  \fi
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@record@setting@off}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@record@setting@off}{off}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@warn@hybrid@noprintgloss}
%\changes{1.46}{2021-09-20}{new}
%Used by hybrid method if \cs{printglossary} isn't used.
%    \begin{macrocode}
\newcommand\@glsxtr@warn@hybrid@noprintgloss{%
  \ifdefstring{\@glo@types}{,}%
  {%
    \GlossariesExtraWarningNoLine{No glossaries have been defined}%
  }%
  {%
    \GlossariesExtraWarningNoLine{No \string\printglossary\space 
      or \string\printglossaries\space
      found. ^^JYou have requested the hybrid setting 
      record=\@glsxtr@record@setting\space which requires a
      combination of bib2gls (to fetch entries) and makeindex/xindy
      (to sort and collate the entries). If you only want to use
      bib2gls then change the option to record=only or record=nameref}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%
%\begin{macro}{\@glsxtr@record@only@setup}
%\changes{1.37}{2018-11-30}{new}
%Initialisation code for record=only and record=nameref
%    \begin{macrocode}
\newcommand*{\@glsxtr@record@only@setup}{%
 \def\glsxtr@setup@record{%
   \@glsxtr@autoseeindexfalse
   \let\@do@seeglossary\@glsxtr@recordsee
   \let\@glsxtr@record\@@glsxtr@record
   \let\@@do@wrglossary\@glsxtr@do@record@wrglossary
   \let\@gls@saveentrycounter\relax
   \let\glsxtrundefaction\@glsxtr@warn@undefaction
   \let\glsxtr@warnonexistsordo\@glsxtr@warn@onexistsordo
   \glsxtr@addloclistfield
   \renewcommand*{\@glsxtr@autoindexcrossrefs}{}%
   \let\@@glsxtr@recordcounter\@glsxtr@op@recordcounter
   \def\printunsrtglossaryunit{\print@op@unsrtglossaryunit}%
%    \end{macrocode}
%Switch off the index suppression for aliased entries.
%(bib2gls will deal with them.)
%    \begin{macrocode}
   \def\glsxtrsetaliasnoindex{}%
%    \end{macrocode}
% \cs{@gls@setupsort@none} was only introduced to
% \sty{glossaries} v4.30, so it may not be available. If it's
% defined, use it to remove the unnecessary overhead of escaping and
% sanitizing the sort value.
%\changes{1.16}{2017-06-15}{added check for \cs{@gls@setupsort@none}}
%    \begin{macrocode}
   \ifdef\@gls@setupsort@none{\@gls@setupsort@none}{}%
%    \end{macrocode}
% Warn about using \cs{printglossary}:
%    \begin{macrocode}
   \def\glsxtrNoGlossaryWarning{\@glsxtr@record@noglossarywarning}%
%    \end{macrocode}
%Load \sty{glossaries-extra-bib2gls}:
%    \begin{macrocode}
   \RequirePackage{glossaries-extra-bib2gls}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{record}
%Now define the \pkgopt{record} package option.
%\changes{1.08}{2016-12-13}{added \pkgopt{record} package option}
%\changes{1.46}{2021-09-20}{added hybrid}
% As from v1.46, \pkgopt[alsoindex]{record} is a deprecated synonym of
% \pkgopt[hybrid]{record} to avoid confusion.
%    \begin{macrocode}
\define@choicekey{glossaries-extra.sty}{record}
 [\@glsxtr@record@setting\glsxtr@record@nr]%
 {off,only,alsoindex,nameref,hybrid}%
 [only]%
 {%
   \ifcase\glsxtr@record@nr\relax
%    \end{macrocode}
%Don't record.
%    \begin{macrocode}
     \def\glsxtr@setup@record{%
       \renewcommand*{\@do@seeglossary}{\@glsxtr@doseeglossary}%
       \renewcommand*{\@glsxtr@record}[3]{}%
       \let\@@do@wrglossary\glsxtr@@do@wrglossary
       \let\@gls@saveentrycounter\glsxtr@indexonly@saveentrycounter
       \let\glsxtrundefaction\@glsxtr@err@undefaction
       \let\glsxtr@warnonexistsordo\@gobble
       \let\@@glsxtr@recordcounter\@glsxtr@noop@recordcounter
       \def\printunsrtglossaryunit{\print@noop@unsrtglossaryunit}%
       \undef\glsxtrsetaliasnoindex
     }%
   \or
%    \end{macrocode}
%Only record (don't index).
%    \begin{macrocode}
     \@glsxtr@record@only@setup
   \or
%    \end{macrocode}
%Record and index. This option doesn't load
%\sty{glossaries-extra-bib2gls} as the sorting is performed by
%\app{xindy} or \app{makeindex}. Index in this sense refers to the
%indexing mechanism used with indexing applications such as
%makeindex and xindy, but this could be confused with recording
%locations so \qt{alsoindex} is now deprecated in favour of
%\qt{hybrid}, which is more obvious.
%    \begin{macrocode}
     \def\glsxtr@setup@record{%
       \renewcommand*{\@glsxtr@record@setting@alsoindex}{alsoindex}%
       \renewcommand*{\@do@seeglossary}{\@glsxtr@dosee@alsoindex@glossary}%
       \let\@glsxtr@record\@@glsxtr@record
       \let\@@do@wrglossary\glsxtr@do@alsoindex@wrglossary
       \let\@gls@saveentrycounter\glsxtr@indexonly@saveentrycounter
       \let\glsxtrundefaction\@glsxtr@warn@undefaction
       \let\glsxtr@warnonexistsordo\@glsxtr@warn@onexistsordo
       \glsxtr@addloclistfield
       \let\@@glsxtr@recordcounter\@glsxtr@op@recordcounter
       \def\printunsrtglossaryunit{\print@op@unsrtglossaryunit}%
       \undef\glsxtrsetaliasnoindex
     }%
   \or
%    \end{macrocode}
%Only record (don't index) but also include nameref information.
%    \begin{macrocode}
     \@glsxtr@record@only@setup
     \ifundef\hyperlink
     {\GlossariesExtraWarning{You have requested record=nameref but
      the document doesn't support hyperlinks}}%
     {}%
   \or
%    \end{macrocode}
% Hybrid record (use bib2gls to fetch definitions) and index (use
% makeindex/xindy to sort and collate).
%    \begin{macrocode}
     \def\glsxtr@setup@record{%
       \renewcommand*{\@glsxtr@record@setting@alsoindex}{hybrid}%
       \renewcommand*{\@do@seeglossary}{\@glsxtr@dosee@alsoindex@glossary}%
       \let\@glsxtr@record\@@glsxtr@record
       \let\@@do@wrglossary\glsxtr@do@alsoindex@wrglossary
       \let\@gls@saveentrycounter\glsxtr@indexonly@saveentrycounter
       \let\glsxtrundefaction\@glsxtr@warn@undefaction
       \let\glsxtr@warnonexistsordo\@glsxtr@warn@onexistsordo
       \glsxtr@addloclistfield
       \let\@@glsxtr@recordcounter\@glsxtr@op@recordcounter
       \def\printunsrtglossaryunit{\print@op@unsrtglossaryunit}%
       \undef\glsxtrsetaliasnoindex
     }%
   \fi
 }
%    \end{macrocode}
%\end{option}
%
%
%\begin{option}{bibglsaux}
%\changes{1.49}{2022-10-14}{new}
%Provide an option to put the records in a different aux file that
%will only be read by bib2gls and not by \LaTeX. A large number of
%records in the aux file can slow down the document build as \LaTeX\
%has to parse it all. This will require an extra write register, so
%may not be so desirable for documents with small glossaries but a
%large number of temporary files.
%    \begin{macrocode}
\define@key{glossaries-extra.sty}{bibglsaux}{%
  \glsxtrsetbibglsaux{#1}%
}
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\glsxtrsetbibglsaux}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glsxtrsetbibglsaux}[1]{%
 \renewcommand{\@glsxtr@setup@bibglsaux}{\@@glsxtr@setup@bibglsaux{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@setup@bibglsaux}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\@glsxtr@setup@bibglsaux}{%
 \renewcommand{\glsxtrsetbibglsaux}[1]{%
   \@@glsxtr@setup@bibglsaux{##1}%
 }%
}
\AtBeginDocument{\@glsxtr@setup@bibglsaux}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@glsxtr@setup@bibglsaux}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\@@glsxtr@setup@bibglsaux}[1]{%
  \ifstrempty{#1}%
  {\renewcommand{\@bibgls@write@aux}{\protected@write\@auxout}}%
  {\@set@bibgls@write@aux{#1.aux}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@bibgls@write@aux}
%\changes{1.49}{2022-10-14}{new}
%Just used for writing records.
%    \begin{macrocode}
\newcommand{\@bibgls@write@aux}{\protected@write\@auxout}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@set@bibgls@write@aux}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\@set@bibgls@write@aux}[1]{%
  \protected@write\@auxout{}%
   {\string\providecommand{\string\@bibgls@input}[1]{}}%
  \protected@write\@auxout{}{\string\@bibgls@input{#1}}%
  \global\newwrite\@bibgls@auxout
  \openout\@bibgls@auxout=#1
  \AtEndDocument{\closeout\@bibgls@auxout}%
  \gdef\@bibgls@write@aux{\protected@write\@bibgls@auxout}%
  \gdef\@set@bibgls@write@aux##1{\GlossariesExtraWarning{repeated
    invocation of bibglsaux option ignored}}%
}
%    \end{macrocode}
%\end{macro}
%
%\changes{1.06}{2016-06-18}{docdef option changed to choice}
%Version 1.06 changes the \pkgopt{docdef} option to a choice rather
%than boolean setting. The available values are: false, true or
%restricted. The restricted option permits document definitions as
%long as they occur before the first glossary is displayed.
%
%\begin{macro}{\@glsxtr@docdefval}
%\changes{1.06}{2016-06-18}{new}
%The \pkgopt{docdef} value is stored as an integer: 0 (false), 1
%(true) and 2 (restricted).
%\changes{1.28}{2018-03-06}{changed from count register to macro}
%    \begin{macrocode}
\newcommand*{\@glsxtr@docdefval}{0}
%    \end{macrocode}
%\end{macro}
%
%Need to provide conditional commands that are backward compatible:
%\begin{macro}{\if@glsxtrdocdef}
%    \begin{macrocode}
\newcommand*{\if@glsxtrdocdef}{\ifnum\@glsxtr@docdefval>0 }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtrdocdeftrue}
%    \begin{macrocode}
\newcommand*{\@glsxtrdocdeftrue}{\def\@glsxtr@docdefval{1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtrdocdeffalse}
%    \begin{macrocode}
\newcommand*{\@glsxtrdocdeffalse}{\def\@glsxtr@docdefval{0}}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{docdef}
% By default don't allow entries to be defined in the document to
% encourage the user to define them in the preamble, but if the user
% is really determined to define them in the document allow them to
% request this.
%\changes{1.34}{2018-07-29}{added package option docdef=atom}
%    \begin{macrocode}
\define@choicekey{glossaries-extra.sty}{docdef}
 [\@glsxtr@docdefsetting\@glsxtr@docdefval]%
 {false,true,restricted,atom}[true]%
{%
  \ifnum\@glsxtr@docdefval>1\relax
    \renewcommand*{\@glsdoifexistsorwarn}{\glsdoifexists}%
  \else
    \renewcommand*{\@glsdoifexistsorwarn}{\glsdoifexistsorwarn}%
  \fi
}
%    \end{macrocode}
%\end{option}
%\begin{macro}{\if@glsxtrdocdefrestricted}
%\changes{1.06}{2016-06-18}{new}
%\changes{1.34}{2018-07-29}{changed to allow for atom as well}
%    \begin{macrocode}
\newcommand*{\if@glsxtrdocdefrestricted}{\ifnum\@glsxtr@docdefval>1 }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsdoifexistsorwarn}
%\changes{1.06}{2016-06-18}{new}
%Need an error to notify user if an undefined entry is being referenced in the
%glossary for the \pkgopt[restricted]{docdef} option. This is used
%by \cs{glossentryname} (but not by \cs{glossentrydesc} etc as one error
%per entry is sufficient).
%    \begin{macrocode}
\newcommand*{\@glsdoifexistsorwarn}{\glsdoifexistsorwarn}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{indexcrossrefs}
% Automatically index cross references at the end of the document
%    \begin{macrocode}
\define@boolkey{glossaries-extra.sty}[@glsxtr]{indexcrossrefs}[true]{%
 \if@glsxtrindexcrossrefs
 \else
  \renewcommand*{\@glsxtr@autoindexcrossrefs}{}%
 \fi
}
%    \end{macrocode}
%\end{option}
% Switch off since this can increase the build time.
%    \begin{macrocode}
\@glsxtrindexcrossrefsfalse
%    \end{macrocode}
% But allow \gloskey{see} and \gloskey{seealso} keys to switch it on automatically.
%\begin{macro}{\@glsxtr@autoindexcrossrefs}
%\changes{1.0}{2016-01-24}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@autoindexcrossrefs}{\@glsxtrindexcrossrefstrue}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{autoseeindex}
%Provide a boolean option to allow the user to prevent the
%automatic indexing of the cross-referencing keys \gloskey{see},
%\gloskey{seealso} and \gloskey{alias}.
%\changes{1.16}{2017-06-15}{new}
%    \begin{macrocode}
\define@boolkey{glossaries-extra.sty}[@glsxtr@]{autoseeindex}[true]{%
}
\@glsxtr@autoseeindextrue
%    \end{macrocode}
%\end{option}
%
%\begin{option}{equations}
%Provide a boolean option to automatically switch to the
%\ctr{equation} counter when in a numbered maths environment.
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\define@boolkey{glossaries-extra.sty}[@glsxtr@]{equations}[true]{%
}
\@glsxtr@equationsfalse
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\glsxtr@float}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\let\glsxtr@float\@float
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@dblfloat}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\let\glsxtr@dblfloat\@dblfloat
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{floats}
%Provide a boolean option to automatically switch to the
%the corresponding counter when in a float.
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\define@boolkey{glossaries-extra.sty}[@glsxtr@]{floats}[true]{%
  \if@glsxtr@floats
   \renewcommand*{\@float}[1]{\renewcommand{\glscounter}{##1}\glsxtr@float{##1}}%
   \renewcommand*{\@dblfloat}[1]{\renewcommand{\glscounter}{##1}\glsxtr@dblfloat{##1}}%
  \else
   \let\@float\glsxtr@float
   \let\@dblfloat\glsxtr@dblfloat
  \fi
}
\@glsxtr@floatsfalse
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\GlossariesExtraInfo}
%\changes{1.51}{2023-04-24}{new}
%Allow users to suppress information messages.
%    \begin{macrocode}
\newcommand*{\GlossariesExtraInfo}[1]{\PackageInfo{glossaries-extra}{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlossariesExtraWarning}
%Allow users to suppress warnings.
%    \begin{macrocode}
\newcommand*{\GlossariesExtraWarning}[1]{\PackageWarning{glossaries-extra}{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlossariesExtraWarningNoLine}
%Allow users to suppress warnings.
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newcommand*{\GlossariesExtraWarningNoLine}[1]{%
 \PackageWarningNoLine{glossaries-extra}{#1}}
%    \end{macrocode}
%\end{macro}
%
%    \begin{macrocode}
\@glsxtr@declareoption{nowarn}{%
  \let\GlossariesExtraWarning\@gobble
  \let\GlossariesExtraWarningNoLine\@gobble
  \glsxtr@dooption{nowarn}%
}
%    \end{macrocode}
%
%\begin{macro}{\@glsxtr@defpostpunc}
%Redefines \cs{glspostdescription}. The \pkgopt{postdot} and
%\pkgopt{nopostdot} options will have to redefine this.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@defpostpunc}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{postdot}
%Shortcut for \pkgopt[false]{nopostdot}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\@glsxtr@declareoption{postdot}{%
  \glsxtr@dooption{nopostdot=false}%
  \renewcommand*{\@glsxtr@defpostpunc}{%
    \renewcommand*{\glspostdescription}{%
      \ifglsnopostdot\else.\spacefactor\sfcode`\. \fi}%
  }%
}
%    \end{macrocode}
%\end{option}

%\begin{option}{nopostdot}
%Needs to redefine \cs{@glsxtr@defpostpunc}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\define@choicekey{glossaries-extra.sty}{nopostdot}{true,false}[true]{%
  \glsxtr@dooption{nopostdot=#1}%
  \renewcommand*{\@glsxtr@defpostpunc}{%
    \renewcommand*{\glspostdescription}{%
      \ifglsnopostdot\else.\spacefactor\sfcode`\. \fi}%
  }%
}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{postpunc}
%Set the post-description punctuation. This also sets
%the \cs{ifglsnopostdot} conditional, which now indicates if
%the post-description punctuation has been suppressed.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\define@key{glossaries-extra.sty}{postpunc}{%
  \glsxtr@dooption{nopostdot=false}%
  \ifstrequal{#1}{dot}%
  {%
    \renewcommand*{\@glsxtr@defpostpunc}{%
      \renewcommand*{\glspostdescription}{.\spacefactor\sfcode`\. }%
    }%
  }%
  {%
    \ifstrequal{#1}{comma}%
    {%
      \renewcommand*{\@glsxtr@defpostpunc}{%
        \renewcommand*{\glspostdescription}{,}%
      }%
    }%
    {%
      \ifstrequal{#1}{none}%
      {%
        \glsxtr@dooption{nopostdot=true}%
        \renewcommand*{\@glsxtr@defpostpunc}{%
          \renewcommand*{\glspostdescription}{}%
        }%
      }%
      {%
        \renewcommand*{\@glsxtr@defpostpunc}{%
          \renewcommand*{\glspostdescription}{#1}%
        }%
      }%
    }%
  }%
}
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\glsxtrabbrvtype}
% Glossary type for abbreviations.
%    \begin{macrocode}
\newcommand*{\glsxtrabbrvtype}{\glsdefaulttype}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@abbreviationsdef}
% Set by \pkgopt{abbreviations} option.
%    \begin{macrocode}
\newcommand*{\@glsxtr@abbreviationsdef}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\abbreviationsname}
%v1.50 unconditionally provide this command, so it can be redefined
%by a language module.
%    \begin{macrocode}
\@ifpackageloaded{babel}%
{\providecommand{\abbreviationsname}{\acronymname}}%
{\providecommand{\abbreviationsname}{Abbreviations}}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@doabbreviationsdef}
%\changes{0.5.3}{2015-12-09}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@doabbreviationsdef}{%
  \newglossary[glg-abr]{abbreviations}{gls-abr}{glo-abr}{\abbreviationsname}%
  \renewcommand*{\glsxtrabbrvtype}{abbreviations}%
  \newcommand*{\printabbreviations}[1][]{%
    \printglossary[type=\glsxtrabbrvtype,##1]%
  }%
  \disable@keys{glossaries-extra.sty}{abbreviations}%
%    \end{macrocode}
% If the \pkgopt{acronym} option hasn't been used, change
% \cs{acronymtype} to \cs{glsxtrabbrvtype}.
%\changes{0.4}{2015-12-03}{added redefinition of \cs{acronymtype}}
%    \begin{macrocode}
  \ifglsacronym
  \else
    \renewcommand*{\acronymtype}{\glsxtrabbrvtype}%
  \fi
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{abbreviations}
% If \pkgopt{abbreviations}, create a new glossary type for abbreviations.
%    \begin{macrocode}
\@glsxtr@declareoption{abbreviations}{%
  \let\@glsxtr@abbreviationsdef\@glsxtr@doabbreviationsdef
}
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\shortcut@gls}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\shortcut@gls}{\cgls}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\shortcut@glspl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\shortcut@glspl}{\cglspl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\shortcut@Gls}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\shortcut@Gls}{\cGls}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\shortcut@Glspl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\shortcut@Glspl}{\cGlspl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\shortcut@GLS}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\shortcut@GLS}{\cGLS}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\shortcut@GLSpl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\shortcut@GLSpl}{\cGLSpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrDefineAbbreviationShortcuts}
% Enable shortcut commands for the abbreviations. Unlike the analogous
% command provided by \sty{glossaries}, this uses \cs{newcommand}
% instead of \cs{let} as a safety feature (except for \cs{newabbr}
% which is also provided with \cs{GlsXtrDefineAcShortcuts}).
%    \begin{macrocode}
\newcommand*{\GlsXtrDefineAbbreviationShortcuts}{%
  \newcommand*{\ab}{\shortcut@gls}%
  \newcommand*{\abp}{\shortcut@glspl}%
  \newcommand*{\as}{\glsxtrshort}%
  \newcommand*{\asp}{\glsxtrshortpl}%
  \newcommand*{\al}{\glsxtrlong}%
  \newcommand*{\alp}{\glsxtrlongpl}%
  \newcommand*{\af}{\glsxtrfull}%
  \newcommand*{\afp}{\glsxtrfullpl}%
  \newcommand*{\Ab}{\shortcut@Gls}%
  \newcommand*{\Abp}{\shortcut@Glspl}%
  \newcommand*{\As}{\Glsxtrshort}%
  \newcommand*{\Asp}{\Glsxtrshortpl}%
  \newcommand*{\Al}{\Glsxtrlong}%
  \newcommand*{\Alp}{\Glsxtrlongpl}%
  \newcommand*{\Af}{\Glsxtrfull}%
  \newcommand*{\Afp}{\Glsxtrfullpl}%
  \newcommand*{\AB}{\shortcut@GLS}%
  \newcommand*{\ABP}{\shortcut@GLSpl}%
  \newcommand*{\AS}{\GLSxtrshort}%
  \newcommand*{\ASP}{\GLSxtrshortpl}%
  \newcommand*{\AL}{\GLSxtrlong}%
  \newcommand*{\ALP}{\GLSxtrlongpl}%
  \newcommand*{\AF}{\GLSxtrfull}%
  \newcommand*{\AFP}{\GLSxtrfullpl}%
  \glsmfuaddmap{\ab}{\Ab}%
  \glsmfublocker{\AB}%
  \glsmfuaddmap{\abp}{\Abp}%
  \glsmfublocker{\ABP}%
  \glsmfuaddmap{\as}{\As}%
  \glsmfublocker{\AS}%
  \glsmfuaddmap{\asp}{\Asp}%
  \glsmfublocker{\ASP}%
  \glsmfuaddmap{\al}{\Al}%
  \glsmfublocker{\AL}%
  \glsmfuaddmap{\alp}{\Alp}%
  \glsmfublocker{\ALP}%
  \glsmfuaddmap{\af}{\Af}%
  \glsmfublocker{\AF}%
  \glsmfuaddmap{\afp}{\Afp}%
  \glsmfublocker{\AFP}%
%    \end{macrocode}
%\changes{1.23}{2017-11-12}{changed \cs{newabbr} definition to use \cs{providecommand}}
%    \begin{macrocode}
  \providecommand*{\newabbr}{\newabbreviation}%
%    \end{macrocode}
% Disable this command after it's been used.
%    \begin{macrocode}
  \let\GlsXtrDefineAbbreviationShortcuts\relax
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrDefineAcShortcuts}
% Enable shortcut commands for the abbreviations, but uses the
% analogous commands provided by \sty{glossaries}.
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrDefineAcShortcuts}{%
  \newcommand*{\ac}{\shortcut@gls}%
  \newcommand*{\acp}{\shortcut@glspl}%
  \newcommand*{\acs}{\glsxtrshort}%
  \newcommand*{\acsp}{\glsxtrshortpl}%
  \newcommand*{\acl}{\glsxtrlong}%
  \newcommand*{\aclp}{\glsxtrlongpl}%
  \newcommand*{\acf}{\glsxtrfull}%
  \newcommand*{\acfp}{\glsxtrfullpl}%
  \newcommand*{\Ac}{\shortcut@Gls}%
  \newcommand*{\Acp}{\shortcut@Glspl}%
  \newcommand*{\Acs}{\Glsxtrshort}%
  \newcommand*{\Acsp}{\Glsxtrshortpl}%
  \newcommand*{\Acl}{\Glsxtrlong}%
  \newcommand*{\Aclp}{\Glsxtrlongpl}%
  \newcommand*{\Acf}{\Glsxtrfull}%
  \newcommand*{\Acfp}{\Glsxtrfullpl}%
  \newcommand*{\AC}{\shortcut@GLS}%
  \newcommand*{\ACP}{\shortcut@GLSpl}%
  \newcommand*{\ACS}{\GLSxtrshort}%
  \newcommand*{\ACSP}{\GLSxtrshortpl}%
  \newcommand*{\ACL}{\GLSxtrlong}%
  \newcommand*{\ACLP}{\GLSxtrlongpl}%
  \newcommand*{\ACF}{\GLSxtrfull}%
  \newcommand*{\ACFP}{\GLSxtrfullpl}%
  \glsmfuaddmap{\ac}{\Ac}%
  \glsmfublocker{\AC}%
  \glsmfuaddmap{\acp}{\Acp}%
  \glsmfublocker{\ACP}%
  \glsmfuaddmap{\acs}{\Acs}%
  \glsmfublocker{\ACS}%
  \glsmfuaddmap{\acsp}{\Acsp}%
  \glsmfublocker{\ACSP}%
  \glsmfuaddmap{\acl}{\Acl}%
  \glsmfublocker{\ACL}%
  \glsmfuaddmap{\aclp}{\Aclp}%
  \glsmfublocker{\ACLP}%
  \glsmfuaddmap{\acf}{\Acf}%
  \glsmfublocker{\ACF}%
  \glsmfuaddmap{\acfp}{\Acfp}%
  \glsmfublocker{\ACFP}%
%    \end{macrocode}
%\changes{1.23}{2017-11-12}{changed \cs{newabbr} definition to use \cs{providecommand}}
%    \begin{macrocode}
  \providecommand*{\newabbr}{\newabbreviation}%
%    \end{macrocode}
% Disable this command after it's been used.
%    \begin{macrocode}
  \let\GlsXtrDefineAcShortcuts\relax
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrDefineOtherShortcuts}
% Similarly provide shortcut versions for the commands provided by
% the \pkgopt{symbols} and \pkgopt{numbers} options.
%    \begin{macrocode}
\newcommand*{\GlsXtrDefineOtherShortcuts}{%
  \newcommand*{\newentry}{\newglossaryentry}%
  \ifdef\printsymbols
  {%
    \newcommand*{\newsym}{\glsxtrnewsymbol}%
  }{}%
  \ifdef\printnumbers
  {%
    \newcommand*{\newnum}{\glsxtrnewnumber}%
  }{}%
  \let\GlsXtrDefineOtherShortcuts\relax
}
%    \end{macrocode}
%\end{macro}
%
% Always use the long forms, not the shortcuts, where portability is
% an issue. (For example, when defining entries in a file that may
% be input by multiple documents.)
%
%\begin{macro}{\@glsxtr@setupshortcuts}
% Command used to set the shortcuts option.
%    \begin{macrocode}
\newcommand*{\@glsxtr@setupshortcuts}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@shortcutsval}
% Store the value of the shortcuts option. (Needed by bib2gls.)
%\changes{1.11}{2017-01-19}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@shortcutsval}{\ifglsacrshortcuts acro\else none\fi}%
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{shortcuts}
%Provide \pkgopt{shortcuts} option. Unlike the \sty{glossaries}
%version, this is a choice rather than a boolean key but it also provides
%\pkgopt[true]{shortcuts} and \pkgopt[false]{shortcuts}, which are
%equivalent to \pkgopt[all]{shortcuts} and
%\pkgopt[none]{shortcuts}. Multiple use of this option in the
%\emph{same} option list will override each other.
%New to v1.17: \pkgopt[ac]{shortcuts} which implements
%\cs{GlsXtrDefineAcShortcuts} (not included in
%\pkgopt[all]{shortcuts} as it conflicts with other shortcuts).
%    \begin{macrocode}
\define@choicekey{glossaries-extra.sty}{shortcuts}%
 [\@glsxtr@shortcutsval\@glsxtr@shortcutsnr]%
 {acronyms,acro,abbreviations,abbr,other,all,true,ac,acother,abother,none,false}[true]{%
   \ifcase\@glsxtr@shortcutsnr\relax % acronyms
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \glsacrshortcutstrue
       \DefineAcronymSynonyms
     }%
   \or % acro
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \glsacrshortcutstrue
       \DefineAcronymSynonyms
     }%
   \or % abbreviations
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \GlsXtrDefineAbbreviationShortcuts
     }%
   \or % abbr
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \GlsXtrDefineAbbreviationShortcuts
     }%
   \or % other
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \GlsXtrDefineOtherShortcuts
     }%
   \or % all
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \glsacrshortcutstrue
%    \end{macrocode}
%\changes{1.21}{2017-11-03}{changed true setting to use shortcuts=ac
%instead of shortcuts=acronym}
%    \begin{macrocode}
       \GlsXtrDefineAcShortcuts
       \GlsXtrDefineAbbreviationShortcuts
       \GlsXtrDefineOtherShortcuts
     }%
   \or % true
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \glsacrshortcutstrue
%    \end{macrocode}
%\changes{1.21}{2017-11-03}{changed true setting to use shortcuts=ac
%instead of shortcuts=acronym}
%    \begin{macrocode}
       \GlsXtrDefineAcShortcuts
       \GlsXtrDefineAbbreviationShortcuts
       \GlsXtrDefineOtherShortcuts
     }%
%    \end{macrocode}
%\changes{1.21}{2017-11-03}{corrected shortcuts=ac}
%    \begin{macrocode}
   \or % ac
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \glsacrshortcutstrue
       \GlsXtrDefineAcShortcuts
     }%
   \or % acother
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added shortcuts=acother}
%    \begin{macrocode}
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \glsacrshortcutstrue
       \GlsXtrDefineAcShortcuts
       \GlsXtrDefineOtherShortcuts
     }%
   \or % abother
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added shortcuts=abother}
%    \begin{macrocode}
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \glsacrshortcutstrue
       \GlsXtrDefineAbbreviationShortcuts
       \GlsXtrDefineOtherShortcuts
     }%
%    \end{macrocode}
%Leave none and false as last option.
%    \begin{macrocode}
   \else % none, false
     \renewcommand*{\@glsxtr@setupshortcuts}{}%
   \fi
 }
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\@glsxtr@doaccsupp}
%\changes{0.5.1}{2015-12-07}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@doaccsupp}{}
%    \end{macrocode}
%\end{macro}
%
%\sty{glossaries-accsupp} can't be loaded after
%\sty{glossaries-extra}. \sty{glossaries-accsupp} v4.29+ checks
%\cs{@glsxtr@doaccsupp} to determine if it's been loaded too late.
%
%\begin{option}{accsupp}
% If \pkgopt{accsupp}, load \sty{glossaries-accsupp} package.
%    \begin{macrocode}
\@glsxtr@declareoption{accsupp}{%
 \renewcommand*{\@glsxtr@doaccsupp}{\RequirePackage{glossaries-accsupp}}}
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\@glsxtr@doloadprefix}
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@doloadprefix}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{prefix}
%\changes{1.42}{2020-02-03}{new}
% If \pkgopt{prefix}, load \sty{glossaries-prefix} package.
%    \begin{macrocode}
\@glsxtr@declareoption{prefix}{%
 \renewcommand*{\@glsxtr@doloadprefix}{\RequirePackage{glossaries-prefix}}}
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\glsxtrNoGlossaryWarning}
%\changes{0.3}{2015-12-02}{new}
%\changes{1.34}{2018-07-29}{added package warning}
% Warning text displayed in document if the external glossary file
% given by the argument is missing.
%    \begin{macrocode}
\newcommand{\glsxtrNoGlossaryWarning}[1]{%
  \GlossariesExtraWarning{Glossary `#1' is missing}%
  \@glsxtr@defaultnoglossarywarning{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{nomissingglstext}
% If true, suppress the text and warning produced if the external glossary file
% is missing.
%    \begin{macrocode}
\define@choicekey{glossaries-extra.sty}{nomissingglstext}
 [\@glsxtr@nomissingglstextval\@glsxtr@nomissingglstextnr]%
 {true,false}[true]{%
   \ifcase\@glsxtr@nomissingglstextnr\relax % true
     \renewcommand{\glsxtrNoGlossaryWarning}[1]{\null}%
   \else % false
     \renewcommand{\glsxtrNoGlossaryWarning}[1]{%
       \@glsxtr@defaultnoglossarywarning{#1}%
     }%
   \fi
 }
%    \end{macrocode}
%\end{option}
%
% Provide option to load \sty{glossaries-extra-stylemods}
% (Deferred to the end.)
%\begin{macro}{\@glsxtr@redefstyles}
%    \begin{macrocode}
\newcommand*{\@glsxtr@redefstyles}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{stylemods}
%\changes{1.02}{2016-04-25}{new}
%\changes{1.18}{2017-08-10}{changed default value to \qt{default}}
%    \begin{macrocode}
\define@key{glossaries-extra.sty}{stylemods}[default]{%
  \ifstrequal{#1}{default}%
  {%
    \renewcommand*{\@glsxtr@redefstyles}{%
      \RequirePackage{glossaries-extra-stylemods}}%
  }%
  {%
    \ifstrequal{#1}{all}%
    {%
      \renewcommand*{\@glsxtr@redefstyles}{%
        \PassOptionsToPackage{all}{glossaries-extra-stylemods}%
        \RequirePackage{glossaries-extra-stylemods}%
      }%
    }%
    {%
      \renewcommand*{\@glsxtr@redefstyles}{}%
      \@for\@glsxtr@tmp:=#1\do{%
        \IfFileExists{glossary-\@glsxtr@tmp.sty}%
        {%
          \eappto\@glsxtr@redefstyles{%
            \noexpand\RequirePackage{glossary-\@glsxtr@tmp}}%
        }%
        {%
           \PackageError{glossaries-extra}%
             {Glossaries style package `glossary-\@glsxtr@tmp.sty' 
              doesn't exist (did you mean to use the `style' key?)}%
             {The list of values (#1) in the `stylemods' key should
              match the glossary-xxx.sty files provided with
              glossaries.sty}%
        }%
      }%
      \appto\@glsxtr@redefstyles{\RequirePackage{glossaries-extra-stylemods}}%
   }
  }%
}
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\@glsxtr@do@style}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@do@style}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{style}
%\changes{1.04}{2016-05-02}{new}
% Since the \pkgopt{stylemods} option can automatically load extra
% style packages, deal with the \pkgopt{style} option after those
% packages have been loaded.
%    \begin{macrocode}
\define@key{glossaries-extra.sty}{style}{%
%    \end{macrocode}
%Defer actual style change:
%    \begin{macrocode}
 \renewcommand*{\@glsxtr@do@style}{%
%    \end{macrocode}
% Set this as the default style:
%    \begin{macrocode}
   \setkeys{glossaries.sty}{style={#1}}%
%    \end{macrocode}
% Set this style:
%    \begin{macrocode}
   \setglossarystyle{#1}%
 }%
}
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\glsxtr@inc@wrglossaryctr}
%\changes{1.29}{2018-04-09}{new}
%Increments the associated counter if enabled. Does nothing by
%default. The optional argument is the entry label in case it's
%required, but the \ctr{wrglossary} counter is globally used by all
%entries.
%    \begin{macrocode}
\newcommand*{\glsxtr@inc@wrglossaryctr}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrInternalLocationHyperlink}
%\changes{1.29}{2018-04-09}{new}
%\begin{definition}
%\cs{GlsXtrInternalLocationHyperlink}\marg{counter}\marg{prefix}\marg{location}
%\end{definition}
%The first two arguments are always control sequences.
%    \begin{macrocode}
\newcommand*{\GlsXtrInternalLocationHyperlink}[3]{%
  \glsxtrhyperlink{#1#2#3}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@wrglossary@locationhyperlink}
%\changes{1.29}{2018-04-09}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@wrglossary@locationhyperlink}[3]{%
  \pageref{wrglossary.#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{indexcounter}
%\changes{1.29}{2018-04-09}{new}
%Define the \ctr{wrglossary} counter that's incremented every time
%an entry is indexed, except for cross-references. This is designed
%for use with \app{bib2gls} v1.4+. It can work with the other indexing
%methods but it will interfere with the number list collation.
%This option automatically implements \pkgopt[wrglossary]{counter}.
%
%Since \sty{glossaries} automatically loads \sty{amsmath}, there
%may be a problem if the indexing occurs in the \env{equation}
%environment, because only one \cs{label} is allowed in each
%instance of that environment. It's best to change the counter when
%in maths mode.
%    \begin{macrocode}
\@glsxtr@declareoption{indexcounter}{%
  \glsxtr@dooption{counter=wrglossary}%
  \ifundef\c@wrglossary
  {%
    \newcounter{wrglossary}%
    \renewcommand{\thewrglossary}{\arabic{wrglossary}}%
  }%
  {}%
  \renewcommand*{\glsxtr@inc@wrglossaryctr}[1]{%
%    \end{macrocode}
%Only increment if the current counter is \ctr{wrglossary}.
%\changes{1.30}{2018-04-25}{added check for \ctr{wrglossary} counter}
%    \begin{macrocode}
    \ifdefstring\@gls@counter{wrglossary}%
    {%
      \refstepcounter{wrglossary}%
      \label{wrglossary.\thewrglossary}%
      \@@glsxtrwrglosscountermark{\thewrglossary}%
    }%
    {}%
  }%
  \renewcommand*{\GlsXtrInternalLocationHyperlink}[3]{%
    \ifdefstring\glsentrycounter{wrglossary}%
    {%
      \@glsxtr@wrglossary@locationhyperlink{##1}{##2}{##3}%
    }%
    {\glsxtrhyperlink{##1##2##3}{##3}}%
  }%
}
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\@glsxtrwrglossmark}
%\changes{1.21}{2017-11-03}{new}
%Marks the place where indexing occurs.
%Does nothing by default.
%    \begin{macrocode}
\newcommand*{\@glsxtrwrglossmark}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@glsxtrwrglossmark}
%\changes{1.21}{2017-11-03}{new}
%Since \cs{glsadd} can be used in the preamble, this action needs to
%be disabled until the start of the document.
%    \begin{macrocode}
\newcommand*{\@@glsxtrwrglossmark}{}
\AtBeginDocument{\renewcommand*{\@@glsxtrwrglossmark}{\@glsxtrwrglossmark}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrwrglossmark}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrwrglossmark}{\ensuremath{\cdot}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrwrglosscountermark}
%\changes{1.49}{2022-10-14}{new}
%Marks the place where wrglossary counter is incremented.
%Does nothing by default.
%    \begin{macrocode}
\newcommand*{\@glsxtrwrglosscountermark}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@glsxtrwrglosscountermark}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@@glsxtrwrglosscountermark}[1]{}
\AtBeginDocument{\renewcommand*{\@@glsxtrwrglosscountermark}{\@glsxtrwrglosscountermark}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrwrglosscountermark}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrwrglosscountermark}[1]{\glsshowtargetfonttext{[#1]}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@doshowtarget}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand\@glsxtr@doshowtarget[2]{#2}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrundefdebug}
%\changes{1.49}{2022-10-14}{new}
%Don't do anything until after the document environment has begun.
%    \begin{macrocode}
\newcommand*{\glsxtrundefdebug}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrundefdebug}
%\changes{1.49}{2022-10-14}{new}
%Use the same font as the targets.
%    \begin{macrocode}
\newcommand*{\@glsxtrundefdebug}[1]{%
 \if@gls@debug \glsshowtargetfonttext{[#1]}\fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{debug}
%\changes{1.21}{2017-11-03}{new}
% Provide extra debug options.
%\changes{1.42}{2020-02-03}{add support for debug=showaccsupp}
%    \begin{macrocode}
\define@choicekey{glossaries-extra.sty}{debug}
 [\@glsxtr@debugval\@glsxtr@debugnr]%
 {true,false,showtargets,showwrgloss,all,showaccsupp}[true]{%
   \ifcase\@glsxtr@debugnr\relax % true
    \glsxtr@dooption{debug=true}%
    \renewcommand*{\@glsxtrwrglossmark}{}%
    \renewcommand*{\@glsxtrwrglosscountermark}[1]{}%
   \or % false
    \glsxtr@dooption{debug=false}%
    \renewcommand*{\@glsxtrwrglossmark}{}%
    \renewcommand*{\@glsxtrwrglosscountermark}[1]{}%
    \let\@glsxtr@doshowtarget\@secondoftwo
   \or % showtargets
    \glsxtr@dooption{debug=showtargets}%
    \def\@glsxtr@doshowtarget{\@glsxtrshowtargetleft}%
   \or % showwrgloss
    \glsxtr@dooption{debug=true}%
    \renewcommand*{\@glsxtrwrglossmark}{\glsxtrwrglossmark}%
    \renewcommand*{\@glsxtrwrglosscountermark}{\glsxtrwrglosscountermark}%
   \or % all
    \glsxtr@dooption{debug=true,debug=showaccsupp}%
    % debug=showwrgloss:
    \renewcommand*{\@glsxtrwrglossmark}{\glsxtrwrglossmark}%
    \renewcommand*{\@glsxtrwrglosscountermark}{\glsxtrwrglosscountermark}%
    % debug=showtargets:
    \def\@glsxtr@doshowtarget{\@glsxtrshowtargetleft}%
   \or % showaccsupp
    \glsxtr@dooption{debug=showaccsupp}%
   \fi
 }
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\glsxtrshowtargetouter}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrshowtargetouter}{\glsshowtargetouter}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrshowtargetinner}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrshowtargetinner}[1]{\glsshowtargetinner{#1}}
%    \end{macrocode}
%\end{macro}
%
%Debugging show targets.
%\begin{macro}{\@glsxtrshowtargetleft}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand{\@glsxtrshowtargetleft}[2]{\@glsshowtarget{#1}#2\@glsxtrshowtargetmark}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrshowtargetright}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand{\@glsxtrshowtargetright}[2]{\@glsxtrshowtargetmark#2\@glsshowtarget{#1}}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrshowtargetmark}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand{\@glsxtrshowtargetmark}{}%
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{showtargets}
%\changes{1.48}{2021-11-22}{new}
%Implements \pkgopt[showtargets]{debug} and provides extra
%adjustments.
%    \begin{macrocode}
\define@choicekey{glossaries-extra.sty}{showtargets}
 [\@glsxtr@showtargetsval\@glsxtr@showtargetsnr]%
 {left,right,innerleft,innerright,annoteleft,annoteright}%
 {%
   \glsxtr@dooption{debug=showtargets}%
   \ifcase\@glsxtr@showtargetsnr\relax
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetleft}%
     \def\glsxtrshowtargetouter{\glsshowtargetouter}%
     \def\glsxtrshowtargetinner{\glsshowtargetinner}%
     \let\@glsxtrshowtargetmark\empty
   \or
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetright}%
     \def\glsxtrshowtargetouter{\glsshowtargetouter}%
     \def\glsxtrshowtargetinner{\glsshowtargetinner}%
     \let\@glsxtrshowtargetmark\empty
   \or
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetleft}%
     \def\glsxtrshowtargetouter{\glsxtrshowtargetinner}%
     \def\glsxtrshowtargetinner{\glsshowtargetinnersymleft}%
     \let\@glsxtrshowtargetmark\empty
   \or
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetright}%
     \def\glsxtrshowtargetouter{\glsxtrshowtargetinner}%
     \def\glsxtrshowtargetinner{\glsshowtargetinnersymright}%
     \let\@glsxtrshowtargetmark\empty
   \or
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetleft}%
     \def\glsxtrshowtargetouter{\glsxtrshowtargetinner}%
     \def\glsxtrshowtargetinner{\glsshowtargetinnersymleft}%
     \def\@glsxtrshowtargetmark{\@glsshowtargetmarkfmt\glsxtrshowtargetsymbolright}%
   \or
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetright}%
     \def\glsxtrshowtargetouter{\glsxtrshowtargetinner}%
     \def\glsxtrshowtargetinner{\glsshowtargetinnersymright}%
     \def\@glsxtrshowtargetmark{\@glsshowtargetmarkfmt\glsxtrshowtargetsymbolleft}%
   \fi
 }
%    \end{macrocode}
%\end{option}
%
% Pass all other options to \sty{glossaries}.
%\begin{macro}{\glsxtr@processunknownoptions}
%\changes{1.49}{2022-10-14}{new}
% Need to compensate for the problem identified in
%\url{https://www.dickimaw-books.com/bugtracker.php?key=171}
%    \begin{macrocode}
\newcommand*{\glsxtr@processunknownoptions}{}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
\@ifpackageloaded{glossaries}
{%
  \DeclareOptionX*{%
   \edef\glsxtr@processunknownoptions{%
    \noexpand\setupglossaries{\expandonce\CurrentOption}}}
}
{%
  \DeclareOptionX*{%
   \expandafter\glsxtr@dooption\expandafter{\CurrentOption}}
}
%    \end{macrocode}
% Process options.
%    \begin{macrocode}
\ProcessOptionsX
%    \end{macrocode}
% Load \sty{glossaries} if not already loaded.
%    \begin{macrocode}
\RequirePackage{glossaries}
\glsxtr@processunknownoptions
%    \end{macrocode}
% Load the \sty{glossaries-accsupp} package if required.
%    \begin{macrocode}
\@glsxtr@doaccsupp
%    \end{macrocode}
% Load the \sty{glossaries-prefix} package if required.
%    \begin{macrocode}
\@glsxtr@doloadprefix
%    \end{macrocode}
% Redefine \cs{glspostdescription} if required.
%    \begin{macrocode}
\@glsxtr@defpostpunc
%    \end{macrocode}
%
%\begin{macro}{\glsindexsetting}
%\changes{1.49}{2022-10-14}{new}
%This command was new to \sty{glossaries} v4.50 so may not be
%defined. Note that \pkgopt[only]{record} and
%\pkgopt[nameref]{record} implement \pkgopt[none]{sort}, which will
%change the default definition of \cs{glsindexingsetting}.
%    \begin{macrocode}
\let\@glsxtr@org@indexingsetting\glsindexingsetting
\providecommand{\glsindexingsetting}{\ifglsxindy xindy\else makeindex\fi}
\ifx\@glsxtr@org@indexingsetting\glsindexingsetting
  \renewcommand{\glsindexingsetting}{%
   \@glsxtr@if@record@only{bib2gls}{\ifglsxindy xindy\else makeindex\fi}%
  }
\else
 \@glsxtr@if@record@only{\renewcommand{\glsindexingsetting}{bib2gls}}{}%
\fi
%    \end{macrocode}
%\end{macro}
%
%
%The following commands are new to \sty{glossaries} v4.50, so
%provide them if an older version is present.
%\begin{macro}{\glssentencecase}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\providecommand{\glssentencecase}[1]{\makefirstuc{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslowercase}
%\changes{1.49}{2022-10-14}{new}
%This uses \cs{MakeTextLowercase} because if \cs{glslowercase} isn't
%defined then \sty{textcase} has been loaded and we might have an
%older kernel.
%    \begin{macrocode}
\providecommand{\glslowercase}[1]{\MakeTextLowercase{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsuppercase}
%\changes{1.49}{2022-10-14}{new}
%Not using \cs{unexpanded} because ditto the above.
%    \begin{macrocode}
\providecommand{\glsuppercase}[1]{\mfirstucMakeUppercase{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glspdfsentencecase}
%\changes{1.54}{2024-01-03}{new}
%For use in PDF strings. Ensure argument fully expanded first.
%This command is provided rather than defined to allow for the possibility
%that it may be added to \sty{glossaries} at a later date.
%    \begin{macrocode}
\ExplSyntaxOn
\providecommand{\glspdfsentencecase}[1]{ \exp_args:Ne \MFUsentencecase { #1 } }
\ExplSyntaxOff
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@Glsentryfield}
%\changes{1.49}{2022-10-14}{new}
%\changes{1.54}{2024-01-03}{switched to \cs{glspdfsentencecase}}
%This command was new to \sty{glossaries} v4.50 so won't be defined for older versions.
%    \begin{macrocode}
\def\@Glsentryfield#1#2{%
  \glstexorpdfstring{\@Gls@entry@field{#1}{#2}}%
  {\glspdfsentencecase{\@gls@entry@field{#1}{#2}}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstexorpdfstring}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\ifdef\glstexorpdfstring
{}
{
  \ifdef\texorpdfstring
  {\newcommand{\glstexorpdfstring}{\texorpdfstring}}
  {\newcommand{\glstexorpdfstring}[2]{#1}}
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@org@MakeUppercase}
%Save the original definition of \cs{MakeUppercase} in case it needs
%to be restored.
%    \begin{macrocode}
\let\@glsxtr@org@MakeUppercase\MakeUppercase
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsmeasurewidth}
%\changes{1.50}{2022-11-08}{new}
%\cs{glsmeasurewidth} was only introduced to \sty{glossaries} v4.51
%so may not be available. This provides a definition that simply
%uses \cs{settowidth}.
%    \begin{macrocode}
\providecommand{\glsmeasurewidth}[2]{%
  \settowidth{#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%If \sty{mfirstuc} v2.08+ is installed, provide interface commands.
%The simplest method is to test the existence of
%\cs{MFUsentencecase}, which is provided by \sty{mfirstuc} v2.08+
%but also by \sty{glossaries} v4.50+. So it may be defined because
%\sty{glossaries} v4.50+ is installed, in which case \cs{glsmfuexcl}
%etc are also defined, but it may be defined because \sty{mfirstuc}
%v2.08+ is installed but an older version of \sty{glossaries} may be
%present, in which case \cs{glsmfuexcl} etc won't be defined.
%    \begin{macrocode}
\ExplSyntaxOn
\ifdef\MFUsentencecase
{%
%    \end{macrocode}
% Automatically identify exclusions, blockers  and mappings.
%\begin{macro}{\glsmfuexcl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \providecommand{\glsmfuexcl}[1]{\MFUexcl{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsmfublocker}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \providecommand{\glsmfublocker}[1]{\MFUblocker{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsmfuaddmap}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \providecommand{\glsmfuaddmap}[2]{\MFUaddmap{#1}{#2}}
%    \end{macrocode}
%\end{macro}
%Don't alter \cs{MakeUppercase}
%\begin{macro}{\@glsxtr@saveMakeUppercase}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand{\@glsxtr@saveMakeUppercase}{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtr@restoreMakeUppercase}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand{\@glsxtr@restoreMakeUppercase}{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtr@assignMakeUppercase}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand{\@glsxtr@assignMakeUppercase}{}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
}
{
%    \end{macrocode}
%Provide \cs{MFUsentencecase} for use where expandable contexts are
%required.
%\begin{macro}{\MFUsentencecase}
%    \begin{macrocode}
  \providecommand{\MFUsentencecase}[1]{\text_titlecase_first:n{#1}}
%    \end{macrocode}
%\end{macro}
%Provide support for exclusions with \cs{MFUsentencecase}.
%\begin{macro}{\glsmfuexcl}
%    \begin{macrocode}
  \providecommand{\glsmfuexcl}[1]{
    \tl_if_in:NnF \l_text_case_exclude_arg_tl {#1}
     {
       \tl_put_right:Nn \l_text_case_exclude_arg_tl {#1}
     }
  }
%    \end{macrocode}
%\end{macro}
%Just treat blockers and mappings as exclusions.
%\begin{macro}{\glsmfublocker}
%    \begin{macrocode}
  \providecommand{\glsmfublocker}[1]{\glsmfuexcl{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsmfuaddmap}
%    \begin{macrocode}
  \providecommand{\glsmfuaddmap}[2]{\glsmfuexcl{#1}\glsmfublocker{#2}}
%    \end{macrocode}
%\end{macro}
%With old versions of \sty{mfirstuc}, save and restore
%\cs{MakeUppercase} in the heading hooks.
%    \begin{macrocode}
  \newcommand{\@glsxtr@saveMakeUppercase}{%
    \let\@glsxtr@org@MakeUppercase\MakeUppercase
  }
  \newcommand{\@glsxtr@restoreMakeUppercase}{%
    \let\MakeUppercase\@glsxtr@org@MakeUppercase
  }
  \newcommand{\@glsxtr@assignMakeUppercase}{%
    \let\MakeUppercase\MakeTextUppercase
  }
}
%    \end{macrocode}
%Finished \LaTeX3 code.
%    \begin{macrocode}
\ExplSyntaxOff
%    \end{macrocode}
%
%\begin{macro}{\glsdoshowtarget}
%\changes{1.48}{2021-11-22}{new}
%Added to \sty{glossaries} v4.50 so many not be defined.
%Need to redefine it so use \cs{def}.
%    \begin{macrocode}
\def\glsdoshowtarget{\@glsxtr@doshowtarget}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrshowtargetsymbolright}
%\changes{1.48}{2021-11-22}{new}
%\changes{1.49}{2022-10-14}{added check for math mode}
%    \begin{macrocode}
\newcommand{\glsxtrshowtargetsymbolright}{%
 \ifmmode \mbox{\tiny$\triangleleft$}\else {\tiny$\triangleleft$}\fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrshowtargetsymbolleft}
%\changes{1.48}{2021-11-22}{new}
%\changes{1.49}{2022-10-14}{added check for math mode}
%    \begin{macrocode}
\newcommand{\glsxtrshowtargetsymbolleft}{%
 \ifmmode \mbox{\tiny$\triangleright$}\else {\tiny$\triangleright$}\fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsshowtargetinner}
%\changes{1.48}{2021-11-22}{new}
%\changes{1.49}{2022-10-14}{added check for math mode}
%Only added to \sty{glossaries} in v4.50 so may not be defined.
%    \begin{macrocode}
\providecommand*{\glsshowtargetinner}[1]{\glsshowtargetfonttext{[#1]}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsshowtargetfont}
%\changes{1.48}{2021-11-22}{new}
%Only added to \sty{glossaries} in v4.45 so may not be defined.
%    \begin{macrocode}
\providecommand*{\glsshowtargetfont}{\ttfamily\footnotesize}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsshowtargetfonttext}
%\changes{1.49}{2022-10-14}{new}
%Text-block command that checks for math-mode.
%Only added to \sty{glossaries} in v4.50 so may not be defined.
%    \begin{macrocode}
\providecommand*{\glsshowtargetfonttext}[1]{%
 \ifmmode \nfss@text{\glsshowtargetfont #1}\else {\glsshowtargetfont #1}\fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsshowtargetinnersymleft}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsshowtargetinnersymleft}[1]{%
 \glsshowtargetinner{#1}\allowbreak\glsxtrshowtargetsymbolleft}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsshowtargetinnersymright}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsshowtargetinnersymright}[1]{%
 \glsxtrshowtargetsymbolright\allowbreak\glsshowtargetinner{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsshowtargetouter}
%\changes{1.48}{2021-11-22}{new}
%Only added to \sty{glossaries} in v4.45 so may not be defined.
%    \begin{macrocode}
\providecommand*{\glsshowtargetouter}[1]{%
 \glsshowtargetsymbol\marginpar{\glsshowtargetsymbol\glsshowtargetfont #1}}
%    \end{macrocode}
%\end{macro}
%
%
%\begin{macro}{\@glsshowtarget}
%\changes{1.48}{2021-11-22}{new}
%Only added to \sty{glossaries} in v4.32 so may not be defined.
%    \begin{macrocode}
\providecommand*{\@glsshowtarget}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsshowtarget}
%This command was introduced to \sty{glossaries} v4.32 so it may not
%be defined. Therefore it's defined here using \cs{def}.
%\cs{glsshowtargetouter} was introduced in \sty{glossaries} v4.45,
%so that also may not be defined.
%\changes{1.21}{2017-11-03}{new}
%\changes{1.42}{2020-02-03}{added check for \cs{glsshowtargetouter}}
%\changes{1.48}{2021-11-22}{removed check for \cs{glsshowtargetouter}}
%    \begin{macrocode}
\def\glsshowtarget#1{%
 \glsxtrtitleorpdforheading
 {%
   \ifmmode
     \nfss@text{\glsxtrshowtargetinner{#1}}%
   \else
     \ifinner
       \glsxtrshowtargetinner{#1}%
     \else
       \glsxtrshowtargetouter{#1}%
     \fi
   \fi
 }%
 {[#1]}%
 {{\protect\glsshowtargetinner{#1}}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsshowtargetmarkfmt}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@glsshowtargetmarkfmt}[1]{%
 \glsxtrtitleorpdforheading
 {%
   \ifmmode \nfss@text{#1}\else #1\fi
 }%
 {}%
 {\ifmmode \nfss@text{#1}\else #1\fi}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@org@doseeglossary}
%Save original definition of \cs{@do@seeglossary}
%    \begin{macrocode}
\let\@glsxtr@org@doseeglossary\@do@seeglossary
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@doseeglossary}
%\changes{1.21}{2017-11-03}{new}
%This doesn't increment the associated counter.
%    \begin{macrocode}
\newcommand*{\@glsxtr@doseeglossary}[2]{%
  \glsdoifexists{#1}%
  {%
    \@@glsxtrwrglossmark
    \@glsxtr@org@doseeglossary{#1}{#2}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@dosee@alsoindex@glossary}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@dosee@alsoindex@glossary}[2]{%
  \@glsxtr@recordsee{#1}{#2}%
  \@glsxtr@doseeglossary{#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@org@gloautosee}
%\changes{1.14}{2017-04-18}{new}
%Save and restore original definition of \cs{@glo@autosee}.
%(That command may not be defined as it was only introduced
%to \sty{glossaries} v4.30, in which case the synonym
%won't be defined either.)
%    \begin{macrocode}
\let\@glsxtr@org@gloautosee\@glo@autosee
%    \end{macrocode}
%\end{macro}
%Check if user tried \pkgopt[false]{autoseeindex} when it can't be
%supported.
%    \begin{macrocode}
\if@glsxtr@autoseeindex
\else
  \ifdef\@glsxtr@org@gloautosee
  {}%
  {\PackageError{glossaries-extra}{`autoseeindex=false' package
   option requires at least v4.30 of glossaries.sty}%
   {You need to update the glossaries.sty package}%
  }
\fi
%    \end{macrocode}
%
%\begin{macro}{\@glo@autosee}
%\changes{1.16}{2017-06-15}{added redefinition}
%If \cs{@glo@autosee} has been defined (\sty{glossaries} v4.30
%onwards), redefine it to test the \pkgopt{autoseeindex} option.
%    \begin{macrocode}
\ifdef\@glo@autosee
{%
  \renewcommand*{\@glo@autosee}{%
    \if@glsxtr@autoseeindex\@glsxtr@org@gloautosee\fi}%
}%
{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\gls@checkseeallowed}
%\changes{1.16}{2017-06-15}{added redefinition}
%Don't prohibit the use of the \gloskey{see} key before the indexing
%files have been opened if the automatic see indexing has been
%disabled, since it's no longer an issue.
%    \begin{macrocode}
\renewcommand*{\gls@checkseeallowed}{%
 \if@glsxtr@autoseeindex\@gls@see@noindex\fi
}
%    \end{macrocode}
%\end{macro}
%
%
% Define abbreviations glossaries if required.
%    \begin{macrocode}
\@glsxtr@abbreviationsdef
\let\@glsxtr@abbreviationsdef\relax
%    \end{macrocode}
% Setup shortcuts if required.
%    \begin{macrocode}
\@glsxtr@setupshortcuts
%    \end{macrocode}
%Redefine \cs{@glsxtr@redef@forglsentries} if required.
%    \begin{macrocode}
\@glsxtr@redef@forglsentries
%    \end{macrocode}
%
%\begin{macro}{\glossariesextrasetup}
%Allow user to set options after the package has been loaded.
% First modify \cs{glsxtr@dooption} so that it now uses
% \cs{setupglossaries}:
%    \begin{macrocode}
\renewcommand{\glsxtr@dooption}[1]{\setupglossaries{#1}}%
%    \end{macrocode}
% Disable options that can only be used when the package is loaded:
%    \begin{macrocode}
\disable@keys{glossaries-extra.sty}{accsupp}
%    \end{macrocode}
% Now define the user command:
%    \begin{macrocode}
\newcommand*{\glossariesextrasetup}[1]{%
  \let\glsxtr@setup@record\relax
  \let\@glsxtr@setupshortcuts\relax
  \let\@glsxtr@redef@forglsentries\relax
  \let\@glsxtr@doloadprefix\relax
  \setkeys{glossaries-extra.sty}{#1}%
  \@glsxtr@abbreviationsdef
  \let\@glsxtr@abbreviationsdef\relax
  \@glsxtr@setupshortcuts
  \glsxtr@setup@record
  \@glsxtr@redef@forglsentries
  \@glsxtr@doloadprefix
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@org@@do@wrglossary}
%\changes{1.21}{2017-11-03}{new}
%Save original definition of \cs{@@do@wrglossary}.
%    \begin{macrocode}
\let\glsxtr@org@@do@wrglossary\@@do@wrglossary
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@@do@wrglossary}
%\changes{1.08}{2016-12-13}{new}
%The new version adds code that can show a marker for debugging and
%increments the associated counter if enabled.
%    \begin{macrocode}
\newcommand*{\glsxtr@@do@wrglossary}[1]{%
 \@@glsxtrwrglossmark
 \glsxtr@inc@wrglossaryctr{#1}%
 \glsxtr@org@@do@wrglossary{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@saveentrycounter}
%\changes{1.08}{2016-12-13}{new}
%Save original definition of \cs{@gls@saveentrycounter}.
%    \begin{macrocode}
\let\glsxtr@saveentrycounter\@gls@saveentrycounter
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@saveentrycounter}
%\changes{1.08}{2016-12-13}{new}
%Change \cs{@gls@saveentrycounter} so that it only stores the entry
%counter information if the indexing is on.
%    \begin{macrocode}
\let\@gls@saveentrycounter\glsxtr@indexonly@saveentrycounter
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@xp@gls@getcounterprefix}
%This command is provided by \sty{glossaries} v4.50 so may not be
%defined. Provide a similar command in case the new version hasn't
%been installed.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\providecommand*\@xp@gls@getcounterprefix[2]{%
 \bgroup
   \glswrglossdisableanchorcmds
   \protected@edef\@do@gls@getcounterprefix{%
     \noexpand\egroup
     \noexpand\@gls@getcounterprefix{#1}{#2}%
 }%
 \@do@gls@getcounterprefix
} 
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glswrglossdisableanchorcmds}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\providecommand{\glswrglossdisableanchorcmds}{\let\glstexorpdfstring\@secondoftwo}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@getcounterprefix}
%\changes{1.37}{2018-11-30}{new}
%This command is provided by the base \sty{glossaries} package, but
%is redefined here.
%The standard indexing methods don't directly store the hypertarget
%but instead need to split it into the counter, prefix and location
%parts, which can be reconstituted in the location list.
%Unfortunately, not all targets are in this form, so the links fail.
%With \pkgopt[nameref]{record}, the complete target name can be
%saved, so this modification adjusts the warning.
%
%The expansion should now be performed in
%\cs{@xp@gls@getcounterprefix}. Any commands that were using
%\cs{@gls@getcounterprefix} directly need to be use
%\cs{@xp@gls@getcounterprefix} instead.
%    \begin{macrocode}
\renewcommand*\@gls@getcounterprefix[2]{%
  \def\@gls@thisloc{#1}\def\@gls@thisHloc{#2}%
  \ifx\@gls@thisloc\@gls@thisHloc
    \def\@glo@counterprefix{}%
  \else
    \def\@gls@get@counterprefix##1.#1##2\end@getprefix{%
      \def\@glo@tmp{##2}%
      \ifx\@glo@tmp\@empty
        \def\@glo@counterprefix{}%
      \else
        \def\@glo@counterprefix{##1}%
      \fi
    }%
    \@gls@get@counterprefix#2.#1\end@getprefix
%    \end{macrocode}
% Warn if no prefix can be formed, unless \pkgopt[nameref]{record}.
%    \begin{macrocode}
    \ifx\@glo@counterprefix\@empty
      \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
      \else
        \GlossariesExtraWarning{Hyper target `#2' can't be formed by
         prefixing^^Jlocation `#1'. You need to modify the
         definition of \string\theH\@gls@counter^^Jotherwise you
         will get the warning: "`name{\@gls@counter.#1}' has been^^J
         referenced but does not exist"%
         \ifx\@glsxtr@record@setting\@glsxtr@record@setting@only
         . You may want to consider using record=nameref instead%
         \fi}%
      \fi
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%Provide script dialect hook (does nothing unless
%redefined by \sty{glossaries-extra-bib2gls}).
%\begin{macro}{\@glsxtrdialecthook}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtrdialecthook}{}
%    \end{macrocode}
%\end{macro}
%
%Set up record option if required.
%    \begin{macrocode}
\glsxtr@setup@record
%    \end{macrocode}
%
% Disable preamble-only options and switch on the undefined tag at
% the start of the document.
%\changes{1.06}{2016-06-18}{disabled docdef key at the start of the
%document}
%    \begin{macrocode}
\AtBeginDocument{%
  \disable@keys{glossaries-extra.sty}{abbreviations,docdef,record}%
  \def\glsxtrundefdebug{\@glsxtrundefdebug}%
  \def\@glsxtrundeftag{\glsxtrundeftag}%
}
%    \end{macrocode}
%
%\subsection{Extra Utilities}
%
%\begin{macro}{\GlsXtrIfUnusedOrUndefined}
%\changes{1.34}{2018-07-29}{new}
%\begin{definition}
%\cs{GlsXtrIfUnusedOrUndefined}\marg{label}\marg{true}\marg{false}
%\end{definition}
% Does \meta{true} if the entry given by \meta{label} is either
% undefined or hasn't been used (or has had the first use flag reset).
%    \begin{macrocode}
\newcommand*{\GlsXtrIfUnusedOrUndefined}[3]{%
  \ifglsentryexists{#1}%
  {\ifbool{glo@\glsdetoklabel{#1}@flag}{#3}{#2}}%
  {#2}%
}
%    \end{macrocode}
%\end{macro}
%
%Starred form of \cs{ifglossaryexists} was only introduced to
%\sty{glossaries} v4.46 so provide it if it hasn't been defined.
%    \begin{macrocode}
\ifdef\s@ifglossaryexists
{}
{
%    \end{macrocode}
%\begin{macro}{\ifglossaryexists}
%\changes{1.44}{2020-03-23}{added check for starred form}
%    \begin{macrocode}
  \renewcommand{\ifglossaryexists}{%
    \@ifstar\s@ifglossaryexists\@ifglossaryexists
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@ifglossaryexists}
%    \begin{macrocode}
  \newcommand{\@ifglossaryexists}[3]{%
    \ifcsundef{@glotype@#1@out}{#3}{#2}%
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\s@ifglossaryexists}
%    \begin{macrocode}
  \newcommand{\s@ifglossaryexists}[3]{%
    \ifcsundef{glolist@#1}{#3}{#2}%
  }
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
}
%    \end{macrocode}
%
%\begin{macro}{\glsxtrifemptyglossary}
%\begin{definition}
%\cs{glsxtrifemptyglossary}\marg{type}\marg{true}\marg{false}
%\end{definition}
% Provide command to determine if any entries have been added to the
% glossary (where the glossary label is provided in the first
% argument). The entries are stored in the comma-separated list
% \cs{glolist@\meta{type}}. If this hasn't been defined, the glossary
% doesn't exist. If it has been defined and is simply a comma, the
% glossary exists and is empty. (It's initialised to a comma.)
%\changes{0.4}{2015-12-03}{new}
%    \begin{macrocode}
\newcommand{\glsxtrifemptyglossary}[3]{%
  \ifcsdef{glolist@#1}%
  {%
    \ifcsstring{glolist@#1}{,}{#2}{#3}%
  }%
  {%
    \glsxtrundefaction{Glossary type `#1' doesn't exist}{}%
    #2%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrIfInGlossary}
%\begin{definition}
%\cs{GlsXtrIfInGlossary}\marg{label}\marg{type}\marg{true}\marg{false}
%\end{definition}
%\changes{1.49}{?}{new}
%Test if the given entry is in the given glossary list. This may not
%correspond to the \gloskey{type} key as the entry may have been
%copied to the list. Does \meta{false} and issues warning if the glossary doesn't
%exist.
%    \begin{macrocode}
\ExplSyntaxOn
\clist_new:N \__glossariesxtr_glolist_clist
\newcommand*{\GlsXtrIfInGlossary}[4]{%
 \tl_if_exist:cTF { glolist@#2 }
  {
    \exp_args:NNv \clist_set:Nn
      \__glossariesxtr_glolist_clist { glolist@#2 }
    \clist_if_in:NnTF
      \__glossariesxtr_glolist_clist { #1 }
       { #3 } { #4 }
  }
  {
   \glsxtrundefaction{Glossary ~ type ~ `#1' ~ doesn't ~ exist}{}
   #4
  }
}
\ExplSyntaxOff
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifkeydefined}
%\changes{1.12}{2017-02-03}{new}
%Tests if the key given in the first argument has been defined.
%    \begin{macrocode}
\newcommand*{\glsxtrifkeydefined}[3]{%
  \key@ifundefined{glossentry}{#1}{#3}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrprovidestoragekey}
%\changes{1.12}{2017-02-03}{new}
%Like \cs{glsaddstoragekey} but does nothing if the key has already
%been defined.
%    \begin{macrocode}
\newcommand*{\glsxtrprovidestoragekey}{%
  \@ifstar\@sglsxtr@provide@storagekey\@glsxtr@provide@storagekey
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@provide@storagekey}
%\changes{1.12}{2017-02-03}{new}
%Unstarred version.
%    \begin{macrocode}
\newcommand*{\@glsxtr@provide@storagekey}[3]{%
  \key@ifundefined{glossentry}{#1}%
  {%
    \define@key{glossentry}{#1}{\csdef{@glo@#1}{##1}}%
    \appto\@gls@keymap{,{#1}{#1}}%
    \appto\@newglossaryentryprehook{\csdef{@glo@#1}{#2}}%
    \appto\@newglossaryentryposthook{%
      \letcs{\@glo@tmp}{@glo@#1}%
      \gls@assign@field{#2}{\@glo@label}{#1}{\@glo@tmp}%
    }%
%    \end{macrocode}
%Allow the user to omit the user level command if they only
%intended fetching the value with \cs{glsxtrusefield}
%    \begin{macrocode}
    \ifblank{#3}
    {}%
    {%
       \newcommand*{#3}[1]{\@gls@entry@field{##1}{#1}}%
    }%
  }%
  {%
%    \end{macrocode}
%Provide the no-link command if not already defined.
%    \begin{macrocode}
    \ifblank{#3}
    {}%
    {%
      \providecommand*{#3}[1]{\@gls@entry@field{##1}{#1}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@glsxtr@provide@storagekey}
%\changes{1.12}{2017-02-03}{new}
%Starred version.
%    \begin{macrocode}
\newcommand*{\s@glsxtr@provide@storagekey}[1]{%
  \key@ifundefined{glossentry}{#1}%
  {%
    \expandafter\newcommand\expandafter*\expandafter
     {\csname gls@assign@#1@field\endcsname}[2]{%
       \@@gls@expand@field{##1}{#1}{##2}%
     }%
  }%
  {}%
  \@glsxtr@provide@addstoragekey{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%The name of a text-block control sequence can be stored in a
%field (given by \cs{GlsXtrFmtField}). This command can then be used
%with \cs{glsxtrfmt}\oarg{options}\marg{label}\marg{text} which
%effectively does
%\cs{glslink}\oarg{options}\marg{label}\{\meta{cs}\marg{text}\}
%If the field hasn't been set for that entry just \meta{text} is
%done.
%
%\begin{macro}{\GlsXtrFmtField}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand{\GlsXtrFmtField}{useri}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrFmtDefaultOptions}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand{\GlsXtrFmtDefaultOptions}{noindex}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfmt}
%\changes{1.12}{2017-02-03}{new}
%\begin{definition}
%\cs{glsxtrfmt}\oarg{options}\marg{entry-label}\marg{text}\oarg{insert}
%\end{definition}
%The post-link hook isn't done. This now has a starred form
%that checks for a final optional argument.
%    \begin{macrocode}
\newrobustcmd*{\glsxtrfmt}{\@ifstar\s@glsxtrfmt\@glsxtrfmt}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtrfmt}
%\changes{1.23}{2017-11-12}{new}
%Unstarred form.
%    \begin{macrocode}
\newcommand*{\@glsxtrfmt}[3][]{\@@glsxtrfmt{#1}{#2}{#3}{}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\s@glsxtrfmt}
%\changes{1.23}{2017-11-12}{new}
%Starred form.
%    \begin{macrocode}
\newcommand*{\s@glsxtrfmt}[3][]{%
 \new@ifnextchar[{\s@@glsxtrfmt{#1}{#2}{#3}}%
  {\@@glsxtrfmt{#1}{#2}{#3}{}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\s@@glsxtrfmt}
%\changes{1.23}{2017-11-12}{new}
%Pick up final optional argument.
%    \begin{macrocode}
\def\s@@glsxtrfmt#1#2#3[#4]{\@@glsxtrfmt{#1}{#2}{#3}{#4}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@@glsxtrfmt}
%\changes{1.23}{2017-11-12}{new}
%Actual inner working.
%    \begin{macrocode}
\newcommand*{\@@glsxtrfmt}[4]{%
%    \end{macrocode}
%Since there's no post-link hook to worry about, grouping can be
%added to provide some protection against nesting (but in general
%nested link text should be avoided).
%\changes{1.23}{2017-11-12}{added grouping}
%    \begin{macrocode}
 \begingroup
   \def\glslabel{#2}%
   \glsdoifexistsordo{#2}%
   {%
     \ifglshasfield{\GlsXtrFmtField}{#2}%
     {%
       \let\do@gls@link@checkfirsthyper\relax
       \expandafter\@gls@link\expandafter[\GlsXtrFmtDefaultOptions,#1]{#2}%
         {\glsxtrfmtdisplay{\glscurrentfieldvalue}{#3}{#4}}%
     }%
     {\glsxtrfmtdisplay{@firstofone}{#3}{#4}}%
   }%
   {%
%    \end{macrocode}
%Has the default \verb|noindex| been counteracted? If so, this
%needs \cs{glsadd} in case \app{bib2gls} needs to pick up the record.
%\changes{1.23}{2017-11-12}{added check for indexing}
%    \begin{macrocode}
     \begingroup
       \@gls@setdefault@glslink@opts
       \setkeys{glslink}{\GlsXtrFmtDefaultOptions,#1}%
       \ifKV@glslink@noindex\else\glsadd{#2}\fi
     \endgroup
     \glsxtrfmtdisplay{@firstofone}{#3}{#4}%
   }%
 \endgroup
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrfmt}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{Glsxtrfmt}\oarg{options}\marg{entry-label}\marg{text}\oarg{insert}
%\end{definition}
%As \cs{glsxtrfmt} but applies a sentence-case change to
%\meta{text}. This is provided to allow a mapping with
%\sty{mfirstuc} v2.08+ in the event that an automated case-change is
%required.
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrfmt}{\@ifstar\s@Glsxtrfmt\@Glsxtrfmt}
\glsmfuaddmap{\glsxtrfmt}{\Glsxtrfmt}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@Glsxtrfmt}
%\changes{1.49}{2022-10-14}{new}
%Unstarred form.
%    \begin{macrocode}
\newcommand*{\@Glsxtrfmt}[3][]{\@@glsxtrfmt{#1}{#2}{\glssentencecase{#3}}{}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\s@Glsxtrfmt}
%\changes{1.49}{2022-10-14}{new}
%Starred form.
%    \begin{macrocode}
\newcommand*{\s@Glsxtrfmt}[3][]{%
 \new@ifnextchar[{\s@@glsxtrfmt{#1}{#2}{\glssentencecase{#3}}}%
  {\@@glsxtrfmt{#1}{#2}{\glssentencecase{#3}}{}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrfmtdisplay}
%\changes{1.23}{2017-11-12}{new}
%The command used internally by \cs{glsxtrfmt} to do the actual
%formatting. The first argument is the control sequence name,
%the second is the control sequence's argument, the third
%is the inserted material (if starred form used).
%    \begin{macrocode}
\newcommand{\glsxtrfmtdisplay}[3]{\csuse{#1}{#2}#3}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrentryfmt}
%\changes{1.12}{2017-02-03}{new}
%No link or indexing.
%    \begin{macrocode}
\newcommand*{\glsxtrentryfmt}[2]{%
  \glstexorpdfstring{\@glsxtrentryfmt{#1}{#2}}{\glsxtrpdfentryfmt{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpdfentryfmt}
%\changes{1.42}{2020-02-03}{new}
%Used for the PDF bookmarks.
%    \begin{macrocode}
\newcommand*{\glsxtrpdfentryfmt}[2]{#2}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrentryfmt}
%\changes{1.12}{2017-02-03}{new}
%\changes{1.23}{2017-11-12}{fixed missing label argument}
%    \begin{macrocode}
\newrobustcmd*{\@glsxtrentryfmt}[2]{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{added \cs{glslabel} and scope}
%Locally define \cs{glslabel} in case the helper command needs to access the
%label.
%\changes{1.43}{2020-02-28}{changed \cs{def} to \cs{edef} to avoid
%infinite recursion}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
 {%
   \protected@edef\glslabel{#1}%
   \glsdoifexistsordo{#1}%
   {%
     \ifglshasfield{\GlsXtrFmtField}{#1}%
     {%
       \csuse{\glscurrentfieldvalue}{#2}%
     }%
     {#2}%
   }%
   {#2}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrentryfmt}
%\changes{1.49}{2022-10-14}{new}
%Sentence-case version.
%    \begin{macrocode}
\newcommand*{\Glsxtrentryfmt}[2]{%
  \glstexorpdfstring
    {\@glsxtrentryfmt{#1}{\glssentencecase{#2}}}%
    {\Glsxtrpdfentryfmt{#1}{#2}}%
}
\glsmfuaddmap{\glsxtrentryfmt}{\Glsxtrentryfmt}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrpdfentryfmt}
%\changes{1.49}{2022-10-14}{new}
%Used for the PDF bookmarks.
%    \begin{macrocode}
\newcommand*{\Glsxtrpdfentryfmt}[2]{\MFUsentencecase{#2}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfieldlistadd}
%\changes{1.12}{2017-02-03}{new}
%If a field stores an etoolbox internal list (e.g.
%\gloskey{loclist}) then this macro provides a convenient
%way of adding to the list via etoolbox's \cs{listcsadd}.
%The first argument is the entry's label, the second is the field
%label and the third is the element to add to the list.
%    \begin{macrocode}
\newcommand*{\glsxtrfieldlistadd}[3]{%
  \listcsadd{glo@\glsdetoklabel{#1}@#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfieldlistgadd}
%\changes{1.12}{2017-02-03}{new}
%Similarly but uses \cs{listcsgadd}.
%    \begin{macrocode}
\newcommand*{\glsxtrfieldlistgadd}[3]{%
  \listcsgadd{glo@\glsdetoklabel{#1}@#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfieldlisteadd}
%\changes{1.12}{2017-02-03}{new}
%Similarly but uses \cs{listcseadd}.
%    \begin{macrocode}
\newcommand*{\glsxtrfieldlisteadd}[3]{%
  \listcseadd{glo@\glsdetoklabel{#1}@#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfieldlistxadd}
%Similarly but uses \cs{listcsxadd}.
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrfieldlistxadd}[3]{%
  \listcsxadd{glo@\glsdetoklabel{#1}@#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%Now provide commands to iterate over these lists.
%\begin{macro}{\glsxtrfielddolistloop}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrfielddolistloop}[2]{%
  \dolistcsloop{glo@\glsdetoklabel{#1}@#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfieldforlistloop}
%\changes{1.12}{2017-02-03}{new}
%\changes{1.29}{2018-04-09}{corrected argument order in \cs{forlistcsloop}}
%    \begin{macrocode}
\newcommand*{\glsxtrfieldforlistloop}[3]{%
  \forlistcsloop{#3}{glo@\glsdetoklabel{#1}@#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfieldformatlist}
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrfieldformatlist}[2]{%
 \begingroup
  \def\@dtl@formatlist@itemsep{}%
  \def\@dtl@formatlist@lastitem{}%
  \def\@dtl@formatlist@prelastitem{}%
  \def\@dtl@formatlist@prelastitemsep{}%
  \forlistcsloop{\@dtl@formatlist@handler}{glo@\glsdetoklabel{#1}@#2}%
  \@dtl@formatlist@prelastitem\@dtl@formatlist@lastitem
 \endgroup
}
%    \end{macrocode}
%\end{macro}
%
%List element tests:
%\begin{macro}{\glsxtrfieldifinlist}
%\changes{1.12}{2017-02-03}{new}
%First argument label, second argument field, third argument item,
%fourth true part and fifth false part.
%    \begin{macrocode}
\newcommand*{\glsxtrfieldifinlist}[5]{%
  \ifinlistcs{#3}{glo@\glsdetoklabel{#1}@#2}{#4}{#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfieldxifinlist}
%\changes{1.12}{2017-02-03}{new}
%Expands item.
%    \begin{macrocode}
\newcommand*{\glsxtrfieldxifinlist}[5]{%
  \xifinlistcs{#3}{glo@\glsdetoklabel{#1}@#2}{#4}{#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrforcsvfield}
%\changes{1.24}{2017-11-14}{new}
%\begin{definition}
%\cs{glsxtrforcsvfield}\marg{label}\marg{field}\marg{cs handler}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\glsxtrforcsvfield}{%
  \@ifstar\s@glsxtrforcsvfield\@glsxtrforcsvfield
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrforcsvfield}
%\changes{1.47}{2021-11-04}{new}
%Unstarred version.
%    \begin{macrocode}
\newcommand*{\@glsxtrforcsvfield}[3]{%
 \@glsxtrifhasfield{#2}{#1}%
 {%
   \let\glsxtrendfor\@endfortrue
   \@for\@glsxtr@label:=\glscurrentfieldvalue\do
   {\expandafter#3\expandafter{\@glsxtr@label}}}%
 {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@glsxtrforcsvfield}
%\changes{1.47}{2021-11-04}{new}
%Starred version.
%    \begin{macrocode}
\newcommand*{\s@glsxtrforcsvfield}[3]{%
 \s@glsxtrifhasfield{#2}{#1}%
 {%
   \let\glsxtrendfor\@endfortrue
   \@for\@glsxtr@label:=\glscurrentfieldvalue\do
   {\expandafter#3\expandafter{\@glsxtr@label}}}%
 {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfieldformatcsvlist}
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrfieldformatcsvlist}[2]{%
 \@glsxtrifhasfield{#2}{#1}%
 {\@dtlformatlist\glscurrentfieldvalue}%
 {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrIfFieldValueInCsvList}
%\changes{1.42}{2020-02-03}{new}
%\begin{definition}
%\cs{GlsXtrIfFieldValueInCsvList}\marg{label}\marg{field}\marg{list}\marg{true}\marg{false}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\GlsXtrIfFieldValueInCsvList}{%
  \@ifstar\s@GlsXtrIfFieldValueInCsvList\@GlsXtrIfFieldValueInCsvList
}
%    \end{macrocode}
%\end{macro}
%
%Note \cs{DTLifinlist} performs one level on the list but not the
%element.
%\begin{macro}{\@GlsXtrIfFieldValueInCsvList}
%\changes{1.42}{2020-02-03}{new}
%Unstarred version.
%    \begin{macrocode}
\newcommand*{\@GlsXtrIfFieldValueInCsvList}[5]{%
 \@glsxtrifhasfield{#2}{#1}%
 {%
   \expandafter\DTLifinlist\expandafter{\glscurrentfieldvalue}%
   {#3}{#4}{#5}%
 }%
 {#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@GlsXtrIfFieldValueInCsvList}
%\changes{1.42}{2020-02-03}{new}
%Starred version.
%    \begin{macrocode}
\newcommand*{\s@GlsXtrIfFieldValueInCsvList}[5]{%
 \s@glsxtrifhasfield{#2}{#1}%
 {%
   \expandafter\DTLifinlist\expandafter{\glscurrentfieldvalue}%
   {#3}{#4}{#5}%
 }%
 {#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrIfValueInFieldCsvList}
%\changes{1.47}{2021-11-04}{new}
%\begin{definition}
%\cs{GlsXtrIfValueInFieldCsvList}\marg{label}\marg{field}\marg{value}\marg{true}\marg{false}
%\end{definition}
%Essentially the reverse. Tests if the given value is in the given
%field which should contain a comma-separated list.
%    \begin{macrocode}
\newcommand*{\GlsXtrIfValueInFieldCsvList}{%
  \@ifstar\s@GlsXtrIfValueInFieldCsvList\@GlsXtrIfValueInFieldCsvList
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GlsXtrIfValueInFieldCsvList}
%\changes{1.47}{}{new}
%Unstarred version.
%    \begin{macrocode}
\newcommand*{\@GlsXtrIfValueInFieldCsvList}[5]{%
 \@glsxtrifhasfield{#2}{#1}%
 {%
   \DTLifinlist{#3}{\glscurrentfieldvalue}{#4}{#5}%
 }%
 {#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@GlsXtrIfValueInFieldCsvList}
%\changes{1.47}{}{new}
%Unstarred version.
%    \begin{macrocode}
\newcommand*{\s@GlsXtrIfValueInFieldCsvList}[5]{%
 \s@glsxtrifhasfield{#2}{#1}%
 {%
   \DTLifinlist{#3}{\glscurrentfieldvalue}{#4}{#5}%
 }%
 {#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\xGlsXtrIfValueInFieldCsvList}
%\changes{1.47}{2021-11-04}{new}
%\begin{definition}
%\cs{xGlsXtrIfValueInFieldCsvList}\marg{label}\marg{field}\marg{value}\marg{true}\marg{false}
%\end{definition}
%As above but fully expand \meta{value}.
%    \begin{macrocode}
\newcommand*{\xGlsXtrIfValueInFieldCsvList}{%
  \@ifstar\s@xGlsXtrIfValueInFieldCsvList\@xGlsXtrIfValueInFieldCsvList
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@xGlsXtrIfValueInFieldCsvList}
%\changes{1.47}{}{new}
%Unstarred version.
%    \begin{macrocode}
\newcommand*{\@xGlsXtrIfValueInFieldCsvList}[5]{%
 \@glsxtrifhasfield{#2}{#1}%
 {%
   \protected@edef\@gls@tmp{#3}%
   \expandafter\DTLifinlist\expandafter{\@gls@tmp}{\glscurrentfieldvalue}{#4}{#5}%
 }%
 {#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@xGlsXtrIfValueInFieldCsvList}
%\changes{1.47}{}{new}
%Unstarred version.
%    \begin{macrocode}
\newcommand*{\s@xGlsXtrIfValueInFieldCsvList}[5]{%
 \s@glsxtrifhasfield{#2}{#1}%
 {%
   \protected@edef\@gls@tmp{#3}%
   \expandafter\DTLifinlist\expandafter{\@gls@tmp}{\glscurrentfieldvalue}{#4}{#5}%
 }%
 {#5}%
}
%    \end{macrocode}
%\end{macro}
%
%
%\begin{macro}{\glsxtrifhasfield}
%\begin{definition}
%\cs{glsxtrifhasfield}\marg{field}\marg{label}\marg{true}\marg{false}
%\end{definition}
%\changes{1.19}{2017-09-09}{new}
%A simpler alternative to \cs{ifglshasfield} that doesn't complain
%if the entry or the field doesn't exist. (No mapping is used.)
%Grouping is added to the unstarred version allow for nested use.
%    \begin{macrocode}
\newrobustcmd{\glsxtrifhasfield}{%
  \@ifstar{\s@glsxtrifhasfield}{\@glsxtrifhasfield}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrifhasfield}
%\changes{1.19}{2017-09-09}{new}
%Unstarred version adds grouping.
%    \begin{macrocode}
\newcommand{\@glsxtrifhasfield}[4]{%
  {\s@glsxtrifhasfield{#1}{#2}{#3}{#4}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@glsxtrifhasfield}
%\changes{1.19}{2017-09-09}{new}
%\changes{1.21}{2017-11-03}{switched from \cs{ifdef} to \cs{ifundef}}
% Starred version omits grouping.
%    \begin{macrocode}
\newcommand{\s@glsxtrifhasfield}[4]{%
  \letcs{\glscurrentfieldvalue}{glo@\glsdetoklabel{#2}@#1}%
  \ifundef\glscurrentfieldvalue
  {#4}%
  {%
   \ifdefempty\glscurrentfieldvalue{#4}{#3}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrIfFieldNonZero}
%\changes{1.31}{2018-05-09}{new}
%Designed for numeric fields.
%\changes{1.39}{2019-03-22}{added starred version}
%    \begin{macrocode}
\newcommand{\GlsXtrIfFieldNonZero}{%
  \@ifstar\s@GlsXtrIfFieldNonZero\@GlsXtrIfFieldNonZero
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GlsXtrIfFieldNonZero}
%\changes{1.39}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand{\@GlsXtrIfFieldNonZero}[4]{%
  \@GlsXtrIfFieldCmpNum{#1}{#2}{=}{0}{#4}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@GlsXtrIfFieldNonZero}
%\changes{1.47}{2021-11-04}{new}
%    \begin{macrocode}
\newcommand{\s@GlsXtrIfFieldNonZero}[4]{%
  \s@GlsXtrIfFieldCmpNum{#1}{#2}{=}{0}{#4}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrIfFieldEqNum}
%\changes{1.31}{2018-05-09}{new}
%\begin{definition}
%\cs{GlsXtrIfFieldEqNum}\marg{field}\marg{label}\marg{value}\marg{true}\marg{false}
%\end{definition}
%Designed for numeric fields.
%\changes{1.39}{2019-03-22}{added starred version}
%    \begin{macrocode}
\newcommand{\GlsXtrIfFieldEqNum}{%
  \@ifstar\s@GlsXtrIfFieldEqNum\@GlsXtrIfFieldEqNum
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GlsXtrIfFieldEqNum}
%\changes{1.39}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand{\@GlsXtrIfFieldEqNum}[5]{%
  \@GlsXtrIfFieldCmpNum{#1}{#2}{=}{#3}{#4}{#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@GlsXtrIfFieldEqNum}
%\changes{1.39}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand{\s@GlsXtrIfFieldEqNum}[5]{%
  \s@GlsXtrIfFieldCmpNum{#1}{#2}{=}{#3}{#4}{#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrIfFieldCmpNum}
%\changes{1.31}{2018-05-09}{new}
%\begin{definition}
%\cs{GlsXtrIfFieldCmpNum}\marg{field}\marg{label}\marg{comparison}\marg{value}\marg{true}\marg{false}
%\end{definition}
%Designed for numeric fields.
%\changes{1.39}{2019-03-22}{added starred version}
%    \begin{macrocode}
\newcommand{\GlsXtrIfFieldCmpNum}{%
  \@ifstar\s@GlsXtrIfFieldCmpNum\@GlsXtrIfFieldCmpNum
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GlsXtrIfFieldCmpNum}
%\changes{1.39}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand{\@GlsXtrIfFieldCmpNum}[6]{%
  {%
    \letcs{\glscurrentfieldvalue}{glo@\glsdetoklabel{#2}@#1}%
    \ifundef\glscurrentfieldvalue
    {\def\glscurrentfieldvalue{0}}%
    {%
     \ifdefempty\glscurrentfieldvalue
     {\def\glscurrentfieldvalue{0}}%
     {}%
    }%
    \ifnum\glscurrentfieldvalue#3#4\relax #5\else #6\fi
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@GlsXtrIfFieldCmpNum}
%\changes{1.39}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand{\s@GlsXtrIfFieldCmpNum}[6]{%
  \letcs{\glscurrentfieldvalue}{glo@\glsdetoklabel{#2}@#1}%
  \ifundef\glscurrentfieldvalue
  {\def\glscurrentfieldvalue{0}}%
  {%
   \ifdefempty\glscurrentfieldvalue
   {\def\glscurrentfieldvalue{0}}%
   {}%
  }%
  \ifnum\glscurrentfieldvalue#3#4\relax #5\else #6\fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrIfFieldUndef}
%\changes{1.23}{2017-11-12}{new}
%\begin{definition}
%\cs{GlsXtrIfFieldUndef}\marg{field}\marg{label}\marg{true}\marg{false}
%\end{definition}
%Just uses \cs{ifcsundef}.
%    \begin{macrocode}
\newcommand{\GlsXtrIfFieldUndef}[2]{%
 \ifcsundef{glo@\glsdetoklabel{#2}@#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrusefield}
%\changes{1.12}{2017-02-03}{new}
%Provide a user-level alternative to \cs{@gls@entry@field}.
%The first argument is the entry label. The second argument is the
%field label.
%    \begin{macrocode}
\newcommand*{\glsxtrusefield}[2]{%
  \@gls@entry@field{#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrusefield}
%\changes{1.12}{2017-02-03}{new}
%\changes{1.37}{2018-11-30}{fixed internal command and added check for
%\cs{texorpdfstring}}
%\changes{1.49}{2022-10-14}{now using \cs{@Glsentryfield}}
%Provide a user-level alternative to \cs{@Gls@entry@field}.
%Now uses \cs{MFUsentencecase} in PDF bookmarks.
%    \begin{macrocode}
\newcommand*{\Glsxtrusefield}[2]{%
  \@Glsentryfield{#1}{#2}%
}
\glsmfuaddmap{\glsxtrusefield}{\Glsxtrusefield}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrusefield}
%\changes{1.37}{2018-11-30}{new}
%\changes{1.49}{2022-10-14}{added uppercase PDF bookmark alternative}
%As above but convert to all caps.
%Note that with \sty{mfirstuc} v2.08+, \cs{mfirstucMakeUppercase}
%is expandable, so therefore \cs{glsuppercase} should also be
%expandable.
%    \begin{macrocode}
\newcommand*{\GLSxtrusefield}[2]{%
  \glsuppercase{\csuse{glo@\glsdetoklabel{#1}@#2}}%
}
\glsmfublocker{\GLSxtrusefield}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrentryparentname}
%\changes{1.39}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrentryparentname}[1]{%
  \ifcsdef{glo@\glsdetoklabel{#1}@parent}%
  {\csuse{glo@\csuse{glo@\glsdetoklabel{#1}@parent}@name}}%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrdeffield}
%\changes{1.12}{2017-02-03}{new}
%Just use \cs{csdef} to provide a field value for the given entry.
%    \begin{macrocode}
\newcommand*{\glsxtrdeffield}[2]{\csdef{glo@\glsdetoklabel{#1}@#2}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtredeffield}
%\changes{1.12}{2017-02-03}{new}
%Just use \cs{csedef} to provide a field value for the given entry.
%\changes{1.28}{2018-03-06}{changed \cs{csedef} to
%\cs{protected@csedef}}
%    \begin{macrocode}
\newcommand*{\glsxtredeffield}[2]{\protected@csedef{glo@\glsdetoklabel{#1}@#2}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrapptocsvfield}
%\changes{1.47}{2021-11-04}{new}
% Similar to the above but will append value with a leading comma if
% the field is already defined. This is used by \app{bib2gls}.
% There's no check if the entry has been defined. (Because of the
% way that bib2gls's save-from-alias etc options are
% implemented, the entry may not have yet been written to the glstex
% file when this command is used.)
%    \begin{macrocode}
\newcommand*{\glsxtrapptocsvfield}[3]{%
 \ifcsdef{glo@\glsdetoklabel{#1}@#2}%
 {\csappto{glo@\glsdetoklabel{#1}@#2}{,#3}}%
 {\csdef{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsetfieldifexists}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrsetfieldifexists}[3]{\glsdoifexists{#1}{#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrSetField}
%\changes{1.12}{2017-02-03}{new}
%Allow the user to set a field. First argument entry label, second
%argument field label, third argument value.
%    \begin{macrocode}
\newrobustcmd*{\GlsXtrSetField}[3]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\csdef{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrLetField}
%\changes{1.12}{2017-02-03}{new}
%Uses \cs{cslet} instead. Third argument should be a macro.
%\changes{1.49}{2022-10-14}{corrected spelling}
%    \begin{macrocode}
\newrobustcmd*{\GlsXtrLetField}[3]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\cslet{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\csGlsXtrLetField}
%\changes{1.12}{2017-02-03}{new}
%Uses \cs{csletcs} instead. Third argument should be a control
%sequence name.
%    \begin{macrocode}
\newrobustcmd*{\csGlsXtrLetField}[3]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\csletcs{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrLetFieldToField}
%\changes{1.12}{2017-02-03}{new}
%Sets the field for one entry to the field for another entry.
%Third argument should be the other entry
%and the fourth argument that other field label.
%    \begin{macrocode}
\newrobustcmd*{\GlsXtrLetFieldToField}[4]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\csletcs{glo@\glsdetoklabel{#1}@#2}{glo@\glsdetoklabel{#3}@#4}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\gGlsXtrSetField}
%\changes{1.12}{2017-02-03}{new}
%Allow the user to set a field. First argument entry label, second
%argument field label, third argument value.
%    \begin{macrocode}
\newrobustcmd*{\gGlsXtrSetField}[3]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\csgdef{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\xGlsXtrSetField}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\xGlsXtrSetField}[3]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\protected@csxdef{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\eGlsXtrSetField}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\eGlsXtrSetField}[3]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\protected@csedef{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%Version 1.55: Provide \LaTeX3 commands for testing field values. These don't use
%\cs{glsxtrifhasfield}.
%    \begin{macrocode}
\ExplSyntaxOn
%    \end{macrocode}
%Test if field is defined.
% Syntax: \marg{entry-label} \marg{field-label}
%    \begin{macrocode}
\prg_new_conditional:Npnn \glossaries_if_field_exists:nn #1 #2
 { p , T , F , TF }
 {
   \tl_if_exist:cTF { glo@ \glsdetoklabel { #1 } @ #2 }
    { \prg_return_true: }
    { \prg_return_false: }
 }
%    \end{macrocode}
%Test if field is set (defined and not empty and not \cs{relax}).
% Syntax: \marg{entry-label} \marg{field-label}
%    \begin{macrocode}
\prg_new_conditional:Npnn \glossaries_if_field_set:nn #1 #2
 { p , T , F , TF }
 {
   \tl_if_exist:cTF { glo@ \glsdetoklabel { #1 } @ #2 }
    {
      \tl_if_empty:cTF { glo@ \glsdetoklabel { #1 } @ #2 }
       { \prg_return_false: }
       { 
         \tl_if_eq:cNTF
           { glo@ \glsdetoklabel {#1 } @ #2 } \@gls@default@value
          { \prg_return_false: }
          { \prg_return_true: }
       }
    }
    { \prg_return_false: }
 }
%    \end{macrocode}
%Test if field is defined and equal to the given token list variable.
% Syntax: \marg{entry-label} \marg{field-label} \meta{tl-var}
%    \begin{macrocode}
\prg_new_conditional:Npnn \glossaries_if_field_eq:nnN #1 #2 #3
 { p , T , F , TF }
 {
   \tl_if_exist:cTF { glo@ \glsdetoklabel { #1 } @ #2 }
    {
      \tl_if_eq:cNTF { glo@ \glsdetoklabel {#1 } @ #2 } #3
       { \prg_return_true: }
       { \prg_return_false: }
    }
    { \prg_return_false: }
 }
%    \end{macrocode}
%Test if field is defined and equal to the given token list.
% Syntax: \marg{entry-label} \marg{field-label} \marg{tl}
%    \begin{macrocode}
\prg_new_conditional:Npnn \glossaries_if_field_eq:nnn #1 #2 #3
 { T , F , TF }
 {
   \tl_if_exist:cTF { glo@ \glsdetoklabel { #1 } @ #2 }
    {
      \tl_if_eq:cnTF { glo@ \glsdetoklabel { #1 } @ #2 } { #3 }
       { \prg_return_true: }
       { \prg_return_false: }
    }
    { \prg_return_false: }
 }
%    \end{macrocode}
%Test if field is defined and equal to another field (same entry).
% Syntax: \marg{entry-label} \marg{field-label} \marg{field2-label}
%    \begin{macrocode}
\prg_new_conditional:Npnn \glossaries_if_field_eq_field:nnn #1 #2 #3
 { p , T , F , TF }
 {
   \tl_if_exist:cTF { glo@ \glsdetoklabel { #1 } @ #2 }
    {
      \tl_if_eq:ccTF
        { glo@ \glsdetoklabel { #1 } @ #2 } 
        { glo@ \glsdetoklabel { #1 } @ #3 } 
       { \prg_return_true: }
       { \prg_return_false: }
    }
    { \prg_return_false: }
 }
%    \end{macrocode}
%
%Test if field is defined and equal to a field in a different entry.
% Syntax: \marg{entry-label} \marg{field-label} \marg{entry2-label} \marg{field2-label}
%    \begin{macrocode}
\prg_new_conditional:Npnn \glossaries_if_field_eq_field:nnnn #1 #2 #3 #4
 { p , T , F , TF }
 {
   \bool_lazy_and:nnTF
      { \tl_if_exist_p:c { glo@ \glsdetoklabel { #1 } @ #2 } }
      { \tl_if_exist_p:c { glo@ \glsdetoklabel { #3 } @ #4 } }
    {
      \tl_if_eq:ccTF
        { glo@ \glsdetoklabel { #1 } @ #2 } 
        { glo@ \glsdetoklabel { #3 } @ #4 } 
       { \prg_return_true: }
       { \prg_return_false: }
    }
    { \prg_return_false: }
 }
%    \end{macrocode}
%Recover field content. An error will occur if the field or entry doesn't exist.
% Syntax: \marg{entry-label} \marg{field-label}
%    \begin{macrocode}
\cs_new:Nn \glossaries_use_field:nn
 {
   \tl_use:c { glo@ \glsdetoklabel { #1 } @ #2 } 
 }
%    \end{macrocode}
%
%    \begin{macrocode}
\ExplSyntaxOff
%    \end{macrocode}
%
%\begin{macro}{\GlsXtrIfFieldEqStr}
%\changes{1.21}{2017-11-03}{new}
%\changes{1.39}{2019-03-22}{added starred form}
%Starred version uses starred version of \cs{glsxtrifhasfield}
%(that is, no grouping).
%    \begin{macrocode}
\newcommand*{\GlsXtrIfFieldEqStr}{%
  \@ifstar\s@GlsXtrIfFieldEqStr\@GlsXtrIfFieldEqStr
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GlsXtrIfFieldEqStr}
%\changes{1.39}{2019-03-22}{new}
%    \begin{macrocode}
\newrobustcmd*{\@GlsXtrIfFieldEqStr}[5]{%
  \@glsxtrifhasfield{#1}{#2}%
  {%
    \ifdefstring{\glscurrentfieldvalue}{#3}{#4}{#5}%
  }%
  {#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@GlsXtrIfFieldEqStr}
%\changes{1.39}{2019-03-22}{new}
%    \begin{macrocode}
\newrobustcmd*{\s@GlsXtrIfFieldEqStr}[5]{%
  \s@glsxtrifhasfield{#1}{#2}%
  {%
    \ifdefstring{\glscurrentfieldvalue}{#3}{#4}{#5}%
  }%
  {#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrIfFieldEqXpStr}
%\changes{1.31}{2018-05-09}{new}
%Like the above but first expands the string.
%Starred version uses starred version of \cs{glsxtrifhasfield}
%(that is, no grouping).
%\changes{1.39}{2019-03-22}{added starred form}
%    \begin{macrocode}
\newcommand*{\GlsXtrIfFieldEqXpStr}{%
  \@ifstar\s@GlsXtrIfFieldEqXpStr\@GlsXtrIfFieldEqXpStr
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GlsXtrIfFieldEqXpStr}
%\changes{1.39}{2019-03-22}{new}
%    \begin{macrocode}
\newrobustcmd*{\@GlsXtrIfFieldEqXpStr}[5]{%
  \@glsxtrifhasfield{#1}{#2}%
  {%
    \protected@edef\@gls@tmp{#3}%
    \ifdefequal{\glscurrentfieldvalue}{\@gls@tmp}{#4}{#5}%
  }%
  {#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@GlsXtrIfFieldEqXpStr}
%\changes{1.39}{2019-03-22}{new}
%    \begin{macrocode}
\newrobustcmd*{\s@GlsXtrIfFieldEqXpStr}[5]{%
  \s@glsxtrifhasfield{#1}{#2}%
  {%
    \protected@edef\@gls@tmp{#3}%
    \ifdefequal{\glscurrentfieldvalue}{\@gls@tmp}{#4}{#5}%
  }%
  {#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrIfXpFieldEqXpStr}
%\changes{1.31}{2018-05-09}{new}
%Like the above but also expands the field value.
%Starred version uses starred version of \cs{glsxtrifhasfield}
%(that is, no grouping).
%\changes{1.39}{2019-03-22}{added starred form}
%    \begin{macrocode}
\newcommand*{\GlsXtrIfXpFieldEqXpStr}{%
  \@ifstar\s@GlsXtrIfXpFieldEqXpStr\@GlsXtrIfXpFieldEqXpStr
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GlsXtrIfXpFieldEqXpStr}
%\changes{1.39}{2019-03-22}{new}
%    \begin{macrocode}
\newrobustcmd*{\@GlsXtrIfXpFieldEqXpStr}[5]{%
  \@glsxtrifhasfield{#1}{#2}%
  {%
    \protected@edef\@gls@tmp{\glscurrentfieldvalue}%
    \let\glscurrentfieldvalue\@gls@tmp
    \protected@edef\@gls@tmp{#3}%
    \ifdefequal{\glscurrentfieldvalue}{\@gls@tmp}{#4}{#5}%
  }%
  {#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@GlsXtrIfXpFieldEqXpStr}
%\changes{1.39}{2019-03-22}{new}
%    \begin{macrocode}
\newrobustcmd*{\s@GlsXtrIfXpFieldEqXpStr}[5]{%
  \s@glsxtrifhasfield{#1}{#2}%
  {%
    \protected@edef\@gls@tmp{\glscurrentfieldvalue}%
    \let\glscurrentfieldvalue\@gls@tmp
    \protected@edef\@gls@tmp{#3}%
    \ifdefequal{\glscurrentfieldvalue}{\@gls@tmp}{#4}{#5}%
  }%
  {#5}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrForeignText}
%\changes{1.32}{2018-05-24}{new}
%\begin{definition}
%\cs{GlsXtrForeignText}\marg{entry label}\marg{text}
%\end{definition}
%If a field is used to store a language tag (such as \texttt{en-GB}
%or \texttt{de-CH-1996}) then this command uses \sty{tracklang}'s
%interface to encapsulate \meta{text}. The field identifying the
%locale is given by \cs{GlsXtrForeignTextField}.
%    \begin{macrocode}
\ifdef\foreignlanguage
{
  \ifdef\GetTrackedDialectFromLanguageTag
  {
    \newcommand{\GlsXtrForeignText}[2]{%
%    \end{macrocode}
%In case this is used inside the argument of \cs{glsxtrifhasfield},
%save and restore \cs{glscurrentfieldvalue}.
%    \begin{macrocode}
      \let\@glsxtr@org@currentfieldvalue\glscurrentfieldvalue
      \glsxtrifhasfield{\GlsXtrForeignTextField}{#1}%
      {%
        \expandafter\GetTrackedDialectFromLanguageTag\expandafter
          {\glscurrentfieldvalue}{\@glsxtr@dialect}%
        \let\@glsxtr@locale\glscurrentfieldvalue
        \let\glscurrentfieldvalue\@glsxtr@org@currentfieldvalue
        \ifdefempty\@glsxtr@dialect
        {%
%    \end{macrocode}
% An exact match hasn't been found. A partial match can only be
% obtained with at least \sty{tracklang} v1.3.6.
%    \begin{macrocode}
          \ifundef\TrackedDialectClosestSubMatch
          {%
            \GlossariesExtraWarning{Can't obtain dialect label
              (tracklang v1.3.6+ required)}%
          }%
          {\let\@glsxtr@dialect\TrackedDialectClosestSubMatch}%
        }%
        {}%
        \ifdefempty\@glsxtr@dialect
        {%
%    \end{macrocode}
% No tracked dialect found for the root language.
%    \begin{macrocode}
        }%
        {%
%    \end{macrocode}
% Check if there's a caption hook for the given dialect label.
%    \begin{macrocode}
          \ifcsundef{captions\@glsxtr@dialect}{}%
          {%
%    \end{macrocode}
% Dialect label not recognised. Check if there's a known mapping.
%    \begin{macrocode}
            \IfTrackedDialectHasMapping{\@glsxtr@dialect}%
            {%
              \edef\@glsxtr@dialect{%
                \GetTrackedDialectToMapping{\@glsxtr@dialect}}%
%    \end{macrocode}
% Does a caption hook exist for this?
%    \begin{macrocode}
              \ifcsundef{captions\@glsxtr@dialect}{}%
              {%
%    \end{macrocode}
% No mapping. Try root language label instead.
%    \begin{macrocode}
                \ifcsundef{captions\@tracklang@lang}{}%
                {%
                  \let\@glsxtr@dialect\@tracklang@lang
                }%
              }%
            }%
            {%
%    \end{macrocode}
% No mapping. Try root language label instead.
%    \begin{macrocode}
              \ifcsundef{captions\@tracklang@lang}{}%
              {%
                \let\@glsxtr@dialect\@tracklang@lang
              }%
            }%
          }%
        }%
        \ifdefempty\@glsxtr@dialect
        {%
          \GlsXtrUnknownDialectWarning{\@glsxtr@locale}{\@tracklang@lang}%
          #2%
        }%
        {\foreignlanguage{\@glsxtr@dialect}{#2}}%
      }%
      {#2}% key not set
    }
  }
  {
    \newcommand{\GlsXtrForeignText}[2]{%
      \GlossariesExtraWarning{Can't encapsulate foreign text:
        tracklang v1.3.6+ required}%
      #2%
    }
  }
}
{
%    \end{macrocode}
%\cs{foreignlanguage} isn't defined so just do \meta{text}.
%    \begin{macrocode}
  \newcommand{\GlsXtrForeignText}[2]{#2}
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrForeignTextField}
%\changes{1.32}{2018-05-24}{new}
%This is the \gloskey{user2} field by default but may be redefined
%as required.
%    \begin{macrocode}
\newcommand*{\GlsXtrForeignTextField}{userii}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrUnknownDialectWarning}
%\changes{1.32}{2018-05-24}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrUnknownDialectWarning}[2]{%
  \GlossariesExtraWarning{Can't determine valid dialect label
   for locale `#1' (root language: #2)}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpageref}
%\changes{1.11}{2017-01-19}{new}
% Like \cs{glsrefentry} but references the page number instead (if
% entry counting is on). The base \sty{glossaries} package only
% introduced \cs{GlsEntryCounterLabelPrefix} in version 4.38, so it
% may not be defined.
%    \begin{macrocode}
\ifdef\GlsEntryCounterLabelPrefix
{%
  \newcommand*{\glsxtrpageref}[1]{%
    \ifglsentrycounter
      \pageref{\GlsEntryCounterLabelPrefix\glsdetoklabel{#1}}%
    \else
      \ifglssubentrycounter
        \pageref{\GlsEntryCounterLabelPrefix\glsdetoklabel{#1}}%
      \else
        \gls{#1}%
      \fi
    \fi
  }
}%
{%
  \newcommand*{\glsxtrpageref}[1]{%
    \ifglsentrycounter
      \pageref{glsentry-\glsdetoklabel{#1}}%
    \else
      \ifglssubentrycounter
        \pageref{glsentry-\glsdetoklabel{#1}}%
      \else
        \gls{#1}%
      \fi
    \fi
  }
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\apptoglossarypreamble}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand{\apptoglossarypreamble}[2][\glsdefaulttype]{%
  \ifcsdef{glolist@#1}%
  {%
   \ifcsundef{@glossarypreamble@#1}%
   {\csdef{@glossarypreamble@#1}{}}%
   {}%
   \csappto{@glossarypreamble@#1}{#2}%
  }%
  {%
    \GlossariesExtraWarning{Glossary `#1' is not defined}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\pretoglossarypreamble}
%\changes{1.52}{2023-06-28}{new}
%    \begin{macrocode}
\newcommand{\pretoglossarypreamble}[2][\glsdefaulttype]{%
  \ifcsdef{glolist@#1}%
  {%
   \ifcsundef{@glossarypreamble@#1}%
   {\csdef{@glossarypreamble@#1}{}}%
   {}%
   \cspreto{@glossarypreamble@#1}{#2}%
  }%
  {%
    \GlossariesExtraWarning{Glossary `#1' is not defined}%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\preglossarypreamble}
%\changes{1.12}{2017-02-03}{new}
%Typo in command name resulted in \cs{preglossarypreamble} being
%defined when it should have been called \cs{pretoglossarypreamble}.
%Old name retained for backward compatibility.
%    \begin{macrocode}
\newcommand{\preglossarypreamble}{\pretoglossarypreamble}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Modifications to Commands Provided by \sty{glossaries}}
% Some of the commands provided by \sty{glossaries} are modified
% to take into account new options or to change default behaviour.
%
%\begin{macro}{\@p@glossarysection}
%Phantom section only needs to be added for starred section
%commands.
%\changes{1.49}{2022-10-14}{moved \cs{phantomsection}}
%    \begin{macrocode}
\renewcommand*{\@p@glossarysection}[2]{%
  \glsclearpage
  \ifdefempty\@@glossarysecstar
  {%
    \csname\@@glossarysec\endcsname{#2}%
  }%
  {%
    \phantomsection
    \@gls@toc{#1}{\@@glossarysec}%
    \csname\@@glossarysec\endcsname*{#2}%
  }%
  \@@glossaryseclabel
}
%    \end{macrocode}
%\end{macro}
%
% The original \cs{@gls@entry@field} causes a problem for undefined
% entries when used in section headings or captions. Since entries
% must be defined with just the base package this isn't a
% significant issue, but it will cause a problem with \app{bib2gls}
% where no entries are defined on the first \LaTeX\ call, so
% redefine \cs{@gls@entry@field} to use \cs{csuse} instead of
% \cs{csname}.
%\begin{macro}{\@gls@entry@field}
%\changes{1.42}{2020-02-03}{redefined}
%\begin{definition}
%\cs{@gls@entry@field}\marg{label}\marg{field}
%\end{definition}
%This command was introduced to \sty{glossaries} version 4.03 but
%older versions are likely to be incompatible with
%\sty{glossaries-extra}.
%    \begin{macrocode}
\ifdef\@gls@entry@field
{
 \renewcommand*{\@gls@entry@field}[2]{\csuse{glo@\glsdetoklabel{#1}@#2}}
}
{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\ifglsused}
%\begin{definition}
%\cs{ifglsused}\marg{label}\marg{true part}\marg{false part}
%\end{definition}
%\changes{1.33}{2018-07-26}{added redefinition}
%In the event that undefined entries should trigger a warning rather
%than an error, \cs{ifglsused} needs to be modified to check for
%existence. If the boolean variable is undefined, then its state is
%indeterminate and is neither true nor false, so neither \meta{true
%part} nor \meta{false} part will be performed if \meta{label} is
%undefined. See also \cs{GlsXtrIfUnusedOrUndefined}.
%    \begin{macrocode}
\renewcommand*{\ifglsused}[3]{%
  \glsdoifexists{#1}{\ifbool{glo@\glsdetoklabel{#1}@flag}{#2}{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@noexpand@field}
%\changes{1.49}{2022-10-14}{added redefinition}
%Add check for encapinnerfmt, encapnocase and encapnocaseinnerfmt
%    \begin{macrocode}
\renewcommand{\@@gls@noexpand@field}[3]{%
 \glsifcategoryattributehasitem{\@glo@category}{encapnocaseinnerfmt}{#2}%
 {%
   \csxdef{glo@#1@#2}{\noexpand\NoCaseChange{\noexpand\glsxtrgenentrytextfmt
     {\expandonce{#3}}}}%
   \glsexclapplyinnerfmtfield{#1}{#2}%
 }%
 {%
   \glsifcategoryattributehasitem{\@glo@category}{encapnocase}{#2}%
   {%
     \glsifcategoryattributehasitem{\@glo@category}{encapinnerfmt}{#2}%
     {%
       \csxdef{glo@#1@#2}{\noexpand\NoCaseChange{\noexpand\glsxtrgenentrytextfmt
         {\expandonce{#3}}}}%
       \glsexclapplyinnerfmtfield{#1}{#2}%
     }%
     {%
       \csxdef{glo@#1@#2}{\noexpand\NoCaseChange{\expandonce{#3}}}%
     }%
   }%
   {%
     \glsifcategoryattributehasitem{\@glo@category}{encapinnerfmt}{#2}%
     {%
       \csxdef{glo@#1@#2}{\noexpand\glsxtrgenentrytextfmt{\expandonce{#3}}}%
       \glsexclapplyinnerfmtfield{#1}{#2}%
     }%
     {%
       \expandafter\global\expandafter\let\csname glo@#1@#2\endcsname#3%
     }%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@gls@expand@field}
%\changes{1.49}{2022-10-14}{added redefinition}
%Add check for encapinnerfmt, encapnocase and encapnocaseinnerfmt
%    \begin{macrocode}
\renewcommand{\@@gls@expand@field}[3]{%
 \glsifcategoryattributehasitem{\@glo@category}{encapnocaseinnerfmt}{#2}%
 {%
   \protected@csxdef{glo@#1@#2}{\noexpand\NoCaseChange
    {\noexpand\glsxtrgenentrytextfmt{#3}}}%
   \glsexclapplyinnerfmtfield{#1}{#2}%
 }%
 {%
   \glsifcategoryattributehasitem{\@glo@category}{encapnocase}{#2}%
   {%
     \glsifcategoryattributehasitem{\@glo@category}{encapinnerfmt}{#2}%
     {%
       \protected@csxdef{glo@#1@#2}{\noexpand\NoCaseChange
        {\noexpand\glsxtrgenentrytextfmt{#3}}}%
       \glsexclapplyinnerfmtfield{#1}{#2}%
     }%
     {%
       \protected@csxdef{glo@#1@#2}{\noexpand\NoCaseChange{#3}}%
     }%
   }%
   {%
     \glsifcategoryattributehasitem{\@glo@category}{encapinnerfmt}{#2}%
     {%
       \protected@csxdef{glo@#1@#2}{\noexpand\glsxtrgenentrytextfmt{#3}}%
       \glsexclapplyinnerfmtfield{#1}{#2}%
     }%
     {%
       \protected@csxdef{glo@#1@#2}{#3}%
     }%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%Provide a starred version of \cs{longnewglossaryentry} that doesn't
%automatically insert \verb|\leavevmode\unskip\nopostdesc| at the
%end of the description. The unstarred version is modified to use
%\cs{glsxtrpostlongdescription} instead.
%
%\begin{macro}{\longnewglossaryentry}
%\changes{1.12}{2017-02-03}{added starred version}
%    \begin{macrocode}
\renewcommand*{\longnewglossaryentry}{%
 \@ifstar\@glsxtr@s@longnewglossaryentry\@glsxtr@longnewglossaryentry
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@s@longnewglossaryentry}
%\changes{1.12}{2017-02-03}{new}
%Starred version.
%    \begin{macrocode}
\newcommand{\@glsxtr@s@longnewglossaryentry}[3]{%
  \glsdoifnoexists{#1}%
  {%
     \bgroup
       \let\@org@newglossaryentryprehook\@newglossaryentryprehook
       \long\def\@newglossaryentryprehook{%
         \long\def\@glo@desc{#3}%
         \@org@newglossaryentryprehook
       }%
       \renewcommand*{\gls@assign@desc}[1]{%
          \global\cslet{glo@\glsdetoklabel{#1}@desc}{\@glo@desc}%
          \global\cslet{glo@\glsdetoklabel{#1}@descplural}{\@glo@descplural}%
        }
       \gls@defglossaryentry{#1}{#2}%
     \egroup
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@longnewglossaryentry}
%\changes{1.12}{2017-02-03}{new}
%Unstarred version.
%    \begin{macrocode}
\newcommand{\@glsxtr@longnewglossaryentry}[3]{%
  \glsdoifnoexists{#1}%
  {%
     \bgroup
       \let\@org@newglossaryentryprehook\@newglossaryentryprehook
       \long\def\@newglossaryentryprehook{%
         \long\def\@glo@desc{#3\glsxtrpostlongdescription}%
         \@org@newglossaryentryprehook
       }%
       \renewcommand*{\gls@assign@desc}[1]{%
          \global\cslet{glo@\glsdetoklabel{#1}@desc}{\@glo@desc}%
%    \end{macrocode}
%The following is different from the base \sty{glossaries.sty}:
%    \begin{macrocode}
          \global\cslet{glo@\glsdetoklabel{#1}@descplural}{\@glo@descplural}%
        }
       \gls@defglossaryentry{#1}{#2}%
     \egroup
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostlongdescription}
%\changes{1.12}{2017-02-03}{new}
%Hook at the end of the description when using the unstarred
%\cs{longnewglossaryentry}.
%    \begin{macrocode}
\newcommand*{\glsxtrpostlongdescription}{\leavevmode\unskip\nopostdesc}
%    \end{macrocode}
%\end{macro}
%
%Provide a starred version of \cs{newignoredglossary} that doesn't
%add the glossary to the nohyperlist list.
%
%\begin{macro}{\newignoredglossary}
%\changes{1.11}{2017-01-19}{added starred version}
%Redefine to check for star.
%    \begin{macrocode}
\renewcommand{\newignoredglossary}{%
 \@ifstar\glsxtr@s@newignoredglossary\glsxtr@org@newignoredglossary
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@org@newignoredglossary}
%The original definition is patched to check for existence.
%\changes{1.11}{2017-01-19}{new}
%\changes{1.12}{2017-02-03}{Added check for existence}
%    \begin{macrocode}
\newcommand*{\glsxtr@org@newignoredglossary}[1]{%
  \ifcsdef{glolist@#1}
  {%
    \glsxtrundefaction{Glossary type `#1' already exists}{}%
  }%
  {%
    \ifdefempty\@ignored@glossaries
    {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
      \protected@edef\@ignored@glossaries{#1}%
    }%
    {%
      \protected@eappto\@ignored@glossaries{,#1}%
    }%
    \csgdef{glolist@#1}{,}%
    \ifcsundef{gls@#1@entryfmt}%
    {%
      \defglsentryfmt[#1]{\glsentryfmt}%
    }%
    {}%
    \ifdefempty\@gls@nohyperlist
    {%
       \renewcommand*{\@gls@nohyperlist}{#1}%
    }%
    {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{eappto} to \cs{protected@eappto}}
%    \begin{macrocode}
       \protected@eappto\@gls@nohyperlist{,#1}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@s@newignoredglossary}
%Starred form.
%\changes{1.11}{2017-01-19}{new}
%\changes{1.12}{2017-02-03}{Added check for existence}
%    \begin{macrocode}
\newcommand*{\glsxtr@s@newignoredglossary}[1]{%
  \ifcsdef{glolist@#1}
  {%
    \glsxtrundefaction{Glossary type `#1' already exists}{}%
  }%
  {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
    \ifdefempty\@ignored@glossaries
    {%
      \protected@edef\@ignored@glossaries{#1}%
    }%
    {%
      \protected@eappto\@ignored@glossaries{,#1}%
    }%
    \csgdef{glolist@#1}{,}%
    \ifcsundef{gls@#1@entryfmt}%
    {%
      \defglsentryfmt[#1]{\glsentryfmt}%
    }%
    {}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glssettoctitle}
%\changes{1.12}{2017-02-03}{added patch}
%Ignored glossaries don't have an associated title, so modify
%\cs{glssettoctitle} to check for it to prevent an undefined 
%command written to the toc file.
%    \begin{macrocode}
\glsifusetranslator
{%
  \renewcommand*{\glssettoctitle}[1]{%
    \ifcsdef{gls@tr@set@#1@toctitle}%
    {%
      \csuse{gls@tr@set@#1@toctitle}%
    }%
    {%
      \ifcsdef{@glotype@#1@title}%
      {\def\glossarytoctitle{\csname @glotype@#1@title\endcsname}}%
      {\def\glossarytoctitle{\glossarytitle}}%
    }%
  }%
}
{
  \renewcommand*{\glssettoctitle}[1]{%
    \ifcsdef{@glotype@#1@title}%
    {\def\glossarytoctitle{\csname @glotype@#1@title\endcsname}}%
    {\def\glossarytoctitle{\glossarytitle}}%
  }
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\provideignoredglossary}
%\changes{1.12}{2017-02-03}{new}
%As above but won't do anything if the glossary already exists.
%    \begin{macrocode}
\newcommand{\provideignoredglossary}{%
 \@ifstar\glsxtr@s@provideignoredglossary\glsxtr@provideignoredglossary
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@provideignoredglossary}
%\changes{1.12}{2017-02-03}{new}
%Unstarred version.
%    \begin{macrocode}
\newcommand*{\glsxtr@provideignoredglossary}[1]{%
  \ifcsdef{glolist@#1}
  {}%
  {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
    \ifdefempty\@ignored@glossaries
    {%
      \protected@edef\@ignored@glossaries{#1}%
    }%
    {%
      \protected@eappto\@ignored@glossaries{,#1}%
    }%
    \csgdef{glolist@#1}{,}%
    \ifcsundef{gls@#1@entryfmt}%
    {%
      \defglsentryfmt[#1]{\glsentryfmt}%
    }%
    {}%
    \ifdefempty\@gls@nohyperlist
    {%
       \renewcommand*{\@gls@nohyperlist}{#1}%
    }%
    {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{eappto} to \cs{protected@eappto}}
%    \begin{macrocode}
       \protected@eappto\@gls@nohyperlist{,#1}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@s@provideignoredglossary}
%Starred form.
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@s@provideignoredglossary}[1]{%
  \ifcsdef{glolist@#1}
  {}%
  {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
    \ifdefempty\@ignored@glossaries
    {%
      \protected@edef\@ignored@glossaries{#1}%
    }%
    {%
      \protected@eappto\@ignored@glossaries{,#1}%
    }%
    \csgdef{glolist@#1}{,}%
    \ifcsundef{gls@#1@entryfmt}%
    {%
      \defglsentryfmt[#1]{\glsentryfmt}%
    }%
    {}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrcopytoglossary}
%Adds an entry label to another glossary list. First argument is
%entry label. Second argument is glossary label. The starred version
%globally adds the entry label.
%\changes{1.12}{2017-02-03}{new}
%\changes{1.49}{2022-10-14}{added starred form}
%    \begin{macrocode}
\newcommand*{\glsxtrcopytoglossary}{%
  \@ifstar\s@glsxtrcopytoglossary\@glsxtrcopytoglossary
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrcopytoglossary}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtrcopytoglossary}[2]{%
  \glsdoifexists{#1}%
  {%
    \ifcsdef{glolist@#2}
    {%
%    \end{macrocode}
%\changes{1.47}{2021-11-04}{replaced \cs{cseappto} with \cs{protected@cseappto}}
%    \begin{macrocode}
      \protected@cseappto{glolist@#2}{#1,}%
    }%
    {%
      \glsxtrundefaction{Glossary type `#2' doesn't exist}{}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@glsxtrcopytoglossary}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\s@glsxtrcopytoglossary}[2]{%
  \glsdoifexists{#1}%
  {%
    \ifcsdef{glolist@#2}
    {%
      \protected@csxappto{glolist@#2}{#1,}%
    }%
    {%
      \glsxtrundefaction{Glossary type `#2' doesn't exist}{}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Existence Checks}
%\begin{macro}{\glsdoifexists}
% Modify \cs{glsdoifexists} to take account of the
% \pkgopt{undefaction} setting.
%\changes{1.08}{2016-12-13}{now defines \cs{glslabel}}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%\changes{1.49}{2022-10-14}{added \cs{glsxtrundefdebug}}
%    \begin{macrocode}
\renewcommand{\glsdoifexists}[2]{%
  \ifglsentryexists{#1}{#2}{\glsxtr@doifexists{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@doifexists}
%Provide a robust command for the error/warning in case
%\cs{glsdoifexists} is expanded.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd{\glsxtr@doifexists}[1]{%
%    \end{macrocode}
% Define \cs{glslabel} in case it's needed after this command (for
% example in the post-link hook).
%    \begin{macrocode}
  \protected@edef\glslabel{\glsdetoklabel{#1}}%
  \expandafter\glsxtrundefdebug\expandafter
    {\expandafter\detokenize\expandafter{\glslabel}}%
  \glsxtrundefaction{Glossary entry `\glslabel'
  has not been defined}{You need to define a glossary entry before
  you can reference it.}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsdoifnoexists}
% Modify \cs{glsdoifnoexists} to take account of the
% \pkgopt{undefaction} setting.
%    \begin{macrocode}
\renewcommand{\glsdoifnoexists}[2]{%
  \ifglsentryexists{#1}{\glsxtr@doifnoexists{#1}}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@doifnoexists}
%Provide a robust command for the error/warning in case
%\cs{glsdoifnoexists} is expanded.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd{\glsxtr@doifnoexists}[1]{%
  \glsxtrundefaction{Glossary entry `\glsdetoklabel{#1}'
    has already been defined}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsdoifexistsordo}
% Modify \cs{glsdoifexistsordo} to take account of the
% \pkgopt{undefaction} setting. This command was introduced in 
% \sty{glossaries} version 4.19, so check if it has been defined first.
%    \begin{macrocode}
\ifdef\glsdoifexistsordo
{%
  \renewcommand{\glsdoifexistsordo}[3]{%
    \ifglsentryexists{#1}{#2}%
    {%
      \glsxtrundefaction{Glossary entry `\glsdetoklabel{#1}'
      has not been defined}{You need to define a glossary entry 
      before you can use it.}%
      #3%
    }%
  }%
}
{%
  \glsxtr@warnonexistsordo\glsdoifexistsordo
  \newcommand{\glsdoifexistsordo}[3]{%
    \ifglsentryexists{#1}{#2}%
    {%
      \glsxtrundefaction{Glossary entry `\glsdetoklabel{#1}'
      has not been defined}{You need to define a glossary entry 
      before you can use it.}%
      #3%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\doifglossarynoexistsordo}
% Similarly for \cs{doifglossarynoexistsordo}.
%\changes{1.44}{2020-03-23}{switched to starred form of \cs{ifglossaryexists}}
%    \begin{macrocode}
\ifdef\doifglossarynoexistsordo
{%
  \renewcommand{\doifglossarynoexistsordo}[3]{%
    \ifglossaryexists*{#1}%
    {%
      \glsxtrundefaction{Glossary type `#1' already exists}{}%
      #3%
    }%
    {#2}%
  }%
}
{%
  \glsxtr@warnonexistsordo\doifglossarynoexistsordo
  \newcommand{\doifglossarynoexistsordo}[3]{%
    \ifglossaryexists*{#1}%
    {%
      \glsxtrundefaction{Glossary type `#1' already exists}{}%
      #3%
    }%
    {#2}%
  }%
}

%    \end{macrocode}
%\end{macro}
%
%There are now three types of cross-references: the \gloskey{see} key (as
%original), the \gloskey{alias} key (from \sty{glossaries-extra} v1.12)
% and the \gloskey{seealso} key (from \sty{glossaries-extra} v1.16).
% The original \gloskey{see} key needs to have a corresponding field
% (which it doesn't with the base \sty{glossaries} package).
%
%\begin{macro}{\@newglossaryentryposthook}
% Hook into end of \cs{newglossaryentry} to add \qt{see} value as a
% field.
%\changes{0.5.4}{2015-12-15}{added empty see value if not set and added
% `see' to field key map}
%    \begin{macrocode}
\appto\@newglossaryentryposthook{%
  \ifdefvoid\@glo@see
   {\csxdef{glo@\@glo@label @see}{}}%
   {%
     \csxdef{glo@\@glo@label @see}{\@glo@see}%
     \if@glsxtr@autoseeindex
       \@glsxtr@autoindexcrossrefs
     \fi
   }%
}
\appto\@gls@keymap{,{see}{see}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrseelistsencap}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsxtrseelistsencap}\marg{content}
%\end{definition}
%Encapsulates cross-reference list.
%    \begin{macrocode}
\newcommand*{\glsxtrseelistsencap}[1]{\space #1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrseelistsdelim}
%\changes{1.49}{2022-10-14}{new}
%Delimiter in cross-reference list.
%    \begin{macrocode}
\newcommand*{\glsxtrseelistsdelim}{, }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrseelists}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsxtrseelists}\marg{label}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\glsxtrseelists}[1]{%
  \glsdoifexists{#1}%
  {%
    \def\@glsxtr@seelists{}%
    \letcs{\@glo@see}{glo@\glsdetoklabel{#1}@see}%
    \ifdefempty\@glo@see
    {}%
    {%
      \protected@edef\@glsxtr@seelists{%
        \noexpand\glsxtr@usesee\@glo@see\noexpand\@end@glsxtr@usesee
      }%
    }%
    \letcs{\@glo@see}{glo@\glsdetoklabel{#1}@seealso}%
    \ifdefempty\@glo@see
    {}%
    {%
      \ifdefempty\@glsxtr@seelists{}%
      {\appto\@glsxtr@seelists{\glsxtrseelistsdelim}}%
      \protected@edef\@glsxtr@seelists{%
        \noexpand\glsxtruseseealsoformat{\@glo@see}%
      }%
    }%
    \letcs{\@glo@see}{glo@\glsdetoklabel{#1}@alias}%
    \ifdefempty\@glo@see
    {}%
    {%
      \ifdefempty\@glsxtr@seelists{}%
      {\appto\@glsxtr@seelists{\glsxtrseelistsdelim}}%
      \protected@edef\@glsxtr@seelists{%
        \noexpand\glsxtruseseeformat{\noexpand\seename}{\@glo@see}%
      }%
    }%
    \ifdefempty\@glsxtr@seelists{}%
    {\glsxtrseelistsencap\@glsxtr@seelists}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrusesee}
%\changes{1.06}{2016-06-18}{new}
%Apply \cs{glsseeformat} to the \gloskey{see} key if not empty.
%    \begin{macrocode}
\newcommand*{\glsxtrusesee}[1]{%
  \glsdoifexists{#1}%
  {%
    \letcs{\@glo@see}{glo@\glsdetoklabel{#1}@see}%
    \ifdefempty\@glo@see
    {}%
    {%
      \expandafter\glsxtr@usesee\@glo@see\@end@glsxtr@usesee
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@usesee}
%\changes{1.06}{2016-06-18}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@usesee}[1][\seename]{%
  \@glsxtr@usesee[#1]%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@usesee}
%\changes{1.06}{2016-06-18}{new}
%    \begin{macrocode}
\def\@glsxtr@usesee[#1]#2\@end@glsxtr@usesee{%
  \glsxtruseseeformat{#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtruseseeformat}
%\changes{1.06}{2016-06-18}{new}
%The format used by \cs{glsxtrusesee}. The first argument is the tag
%(such as \cs{seename}). The second argument is the comma-separated
%list of cross-referenced labels.
%    \begin{macrocode}
\newcommand*{\glsxtruseseeformat}[2]{%
  \glsseeformat[#1]{#2}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsseeitemformat}
%\changes{1.21}{2017-11-03}{new}
%\changes{1.22}{2017-11-08}{switched check from regular to short}
%\changes{1.37}{2018-11-30}{removed reference to \cs{glslabel}}
%\changes{1.42}{2020-02-03}{switched to using \cs{glsfmttext} and
%\cs{glsfmtname}}
%\sty{glossaries} originally defined \cs{glsseeitemformat}
%to use \cs{glsentryname} but in v3.0 this was switched to
%use \cs{glsentrytext} due to problems occurring with the
%\gloskey{name} field being sanitized. Since this is no longer a
%problem, \sty{glossaries-extra} restored the original
%definition as it makes more sense to use the \gloskey{name}
%in the cross-reference list. Unfortunately this doesn't take style
%changes into account, so as from v1.42, this now uses
%\cs{glsfmttext} and \cs{glsfmtname} instead. (The \gloskey{text}
%field is chosen rather than the \gloskey{short} field to allow for
%the \qt{noshort} styles.)
%    \begin{macrocode}
\renewcommand*{\glsseeitemformat}[1]{%
 \ifglshasshort{#1}{\glsfmttext{#1}}{\glsfmtname{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrseeitemformat}
%\changes{1.9}{2025-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrseeitemformat}[1]{%
 \ifglshasparent{#1}%
 {\glsxtrhiername{#1}}%
 {\ifglshasshort{#1}{\glsfmttext{#1}}{\glsfmtname{#1}}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrhiername}
%\changes{1.37}{2018-11-30}{new}
%\changes{1.42}{2020-02-03}{switched to using \cs{glsfmttext} and
%\cs{glsfmtname}}
%\begin{definition}
%\cs{glsxtrhiername}\marg{label}
%\end{definition}
%Displays the hierarchical name for the given entry. The
%cross-reference format \cs{glsseeitemformat} may be redefined to
%use this command to show the hierarchy, if required. This now uses
%\cs{glsfmttext} and \cs{glsfmtname} instead of \cs{glsaccessshort}
%and \cs{glsaccessname} to allow for style formatting.
%\changes{1.49}{2022-10-14}{added \cs{expandafter}s}
%\changes{1.49}{2022-10-14}{added \cs{glstexorpdfstring}}
%    \begin{macrocode}
\newcommand*{\glsxtrhiername}[1]{%
  \glstexorpdfstring
  {\@glsxtrhiername{#1}}%
  {\glsentryname{#1}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtrhiername}
%Provide robust inner command.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\@glsxtrhiername}[1]{%
  \glsdoifexists{#1}%
  {%
    \glsxtrifhasfield{parent}{#1}%
    {\expandafter\glsxtrhiername\expandafter
      {\glscurrentfieldvalue}\glsxtrhiernamesep}%
    {}%
    \ifglshasshort{#1}{\glsfmttext{#1}}{\glsfmtname{#1}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrhiername}
%\changes{1.37}{2018-11-30}{new}
%\changes{1.42}{2020-02-03}{switched to using \cs{glsfmttext} and
%\cs{glsfmtname}}
%\begin{definition}
%\cs{Glsxtrhiername}\marg{label}
%\end{definition}
%As above but displays the top-level name with an initial capital.
%\changes{1.49}{2022-10-14}{added \cs{expandafter}s}
%\changes{1.49}{2022-10-14}{added \cs{glstexorpdfstring}}
%    \begin{macrocode}
\newcommand*{\Glsxtrhiername}[1]{%
  \glstexorpdfstring
  {\@Glsxtrhiername{#1}}%
  {\MFUsentencecase{\glsentryname{#1}}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@Glsxtrhiername}
%\changes{1.49}{2022-10-14}{new}
%Provide robust inner command.
%    \begin{macrocode}
\newrobustcmd*{\@Glsxtrhiername}[1]{%
  \glsdoifexists{#1}%
  {%
    \glsxtrifhasfield{parent}{#1}%
    {%
      \expandafter\Glsxtrhiername\expandafter
        {\glscurrentfieldvalue}\glsxtrhiernamesep
      \ifglshasshort{#1}{\glsfmttext{#1}}{\glsfmtname{#1}}%
    }%
    {\ifglshasshort{#1}{\Glsfmttext{#1}}{\Glsfmtname{#1}}}%
  }%
}
\glsmfuaddmap{\glsxtrhiername}{\Glsxtrhiername}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrhiername}
%\changes{1.37}{2018-11-30}{new}
%\changes{1.42}{2020-02-03}{switched to using \cs{Glsfmttext} and
%\cs{Glsfmtname}}
%\begin{definition}
%\cs{GlsXtrhiername}\marg{label}
%\end{definition}
%As above but converts the first letter of each name to a capital.
%(Note that this isn't applying title case, just capitalising the
%start of each hierarchical element.)
%\changes{1.49}{2022-10-14}{added \cs{expandafter}s}
%\changes{1.49}{2022-10-14}{added \cs{glstexorpdfstring}}
%    \begin{macrocode}
\newcommand*{\GlsXtrhiername}[1]{%
  \glstexorpdfstring
  {\@GlsXtrhiername{#1}}%
  {\glsentryname{#1}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@GlsXtrhiername}
%\changes{1.49}{2022-10-14}{new}
%Provide robust inner command.
%    \begin{macrocode}
\newrobustcmd*{\@GlsXtrhiername}[1]{%
  \glsdoifexists{#1}%
  {%
    \glsxtrifhasfield{parent}{#1}%
    {\expandafter\GlsXtrhiername\expandafter
      {\glscurrentfieldvalue}\glsxtrhiernamesep}%
    {}%
    \ifglshasshort{#1}{\Glsfmttext{#1}}{\Glsfmtname{#1}}%
  }%
}
\glsmfublocker{\GlsXtrhiername}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrhiername}
%\changes{1.37}{2018-11-30}{new}
%\changes{1.42}{2020-02-03}{switched to using \cs{glsfmttext},
%\cs{glsfmtname}, \cs{GLSfmttext} and \cs{GLSfmtname}}
%\begin{definition}
%\cs{GLSxtrhiername}\marg{label}
%\end{definition}
%As above but displays the top-level name in all-caps.
%\changes{1.49}{2022-10-14}{added \cs{expandafter}s}
%\changes{1.49}{2022-10-14}{added \cs{glstexorpdfstring}}
%    \begin{macrocode}
\newcommand*{\GLSxtrhiername}[1]{%
  \glstexorpdfstring
  {\@GLSxtrhiername{#1}}%
  {\GLSxtrusefield{#1}{name}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@GLSxtrhiername}
%\changes{1.49}{2022-10-14}{new}
%Provide robust inner command.
%    \begin{macrocode}
\newrobustcmd*{\@GLSxtrhiername}[1]{%
  \glsdoifexists{#1}%
  {%
    \glsxtrifhasfield{parent}{#1}%
    {%
      \expandafter\GLSxtrhiername\expandafter
       {\glscurrentfieldvalue}\glsxtrhiernamesep
      \ifglshasshort{#1}{\glsfmttext{#1}}{\glsfmtname{#1}}%
    }%
    {\ifglshasshort{#1}{\GLSfmttext{#1}}{\GLSfmtname{#1}}}%
  }%
}
\glsmfublocker{\GLSxtrhiername}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSXTRhiername}
%\changes{1.37}{2018-11-30}{new}
%\changes{1.42}{2020-02-03}{switched to using \cs{GLSfmttext} and
%\cs{GLSfmtname}}
%\begin{definition}
%\cs{GLSXTRhiername}\marg{label}
%\end{definition}
%As above but displays all names in all-caps.
%\changes{1.49}{2022-10-14}{added \cs{expandafter}s}
%\changes{1.49}{2022-10-14}{added \cs{glstexorpdfstring}}
%    \begin{macrocode}
\newcommand*{\GLSXTRhiername}[1]{%
  \glstexorpdfstring
  {\@GLSXTRhiername{#1}}%
  {\GLSxtrusefield{#1}{name}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@GLSXTRhiername}
%\changes{1.49}{2022-10-14}{new}
%Provide robust inner command.
%    \begin{macrocode}
\newrobustcmd*{\@GLSXTRhiername}[1]{%
 \glsdoifexists{#1}%
 {%
   \glsxtrifhasfield{parent}{#1}%
   {\expandafter\GLSXTRhiername\expandafter
      {\glscurrentfieldvalue}\glsxtrhiernamesep}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{removed unwanted eol}
%    \begin{macrocode}
   {}%
   \ifglshasshort{#1}{\GLSfmttext{#1}}{\GLSfmtname{#1}}%
 }%
}
\glsmfublocker{\GLSXTRhiername}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrhiernamesep}
%\changes{1.37}{2018-11-30}{new}
%Separator used in \cs{glsxtrhiername} and variants.
%    \begin{macrocode}
\newcommand*{\glsxtrhiernamesep}{\,{\small$\triangleright$}\,}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtruseseealso}
%\changes{1.16}{2017-06-15}{new}
%Apply \cs{glsseeformat} to the \gloskey{seealso} key if not empty.
%There's no optional tag to worry about here.
%    \begin{macrocode}
\newcommand*{\glsxtruseseealso}[1]{%
  \glsdoifexists{#1}%
  {%
    \letcs{\@glo@see}{glo@\glsdetoklabel{#1}@seealso}%
    \ifdefempty\@glo@see
    {}%
    {%
      \expandafter\glsxtruseseealsoformat\expandafter{\@glo@see}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrusealias}
%\changes{1.42}{2020-02-03}{new}
%Apply \cs{glsseeformat} to the \gloskey{alias} key if not empty.
%There's no optional tag to worry about here. The value also isn't a
%comma-separated list, but use the same interface.
%    \begin{macrocode}
\newcommand*{\glsxtrusealias}[1]{%
  \glsdoifexists{#1}%
  {%
    \letcs{\@glo@see}{glo@\glsdetoklabel{#1}@alias}%
    \ifdefempty\@glo@see
    {}%
    {%
%    \end{macrocode}
%Expansion isn't necessary because the value is a single label not a
%list.
%    \begin{macrocode}
      \glsxtruseseeformat{\seename}{\@glo@see}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtruseseealsoformat}
%\changes{1.16}{2017-06-15}{new}
%The format used by \cs{glsxtruseseealso}. The argument is the comma-separated
%list of cross-referenced labels.
%    \begin{macrocode}
\newcommand*{\glsxtruseseealsoformat}[1]{%
  \glsseeformat[\seealsoname]{#1}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrseelist}
%\changes{1.16}{2017-06-15}{new}
%Fully expands argument before passing to \cs{glsseelist}.
%(The argument to \cs{glsseelist} must be a comma-separated list of
%entry labels.)
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
\newrobustcmd{\glsxtrseelist}[1]{%
  \protected@edef\@glo@tmp{\noexpand\glsseelist{#1}}\@glo@tmp
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsseelist}
%\changes{1.47}{2021-11-04}{redefined}
%Redefine to make \cs{glsseelist} more flexible.
%    \begin{macrocode}
\renewrobustcmd*{\glsseelist}[1]{%
  \let\@gls@dolast\relax
  \let\@gls@donext\relax
  \let\@glsseeitem\@glsxtr@seefirstitem
  \let\@glsseelastsep\glsseelastsep
  \@for\@gls@thislabel:=#1\do{%
    \ifx\@xfor@nextelement\@nnil
      \@gls@dolast
    \else
      \@gls@donext
    \fi
    \expandafter\@glsseeitem\expandafter{\@gls@thislabel}%
    \let\@gls@dolast\@glsseelastsep
    \let\@gls@donext\glsseesep
    \let\@glsseeitem\@glsxtr@seeitem
    \let\@glsseelastsep\glsseelastoxfordsep
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtaggedlistsep}
%\changes{1.49}{2022-10-14}{new}
%Separator between the tag and the list in \cs{glsxtrtaggedlist}
%    \begin{macrocode}
\newcommand{\glsxtrtaggedlistsep}{\space}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrtaggedlist}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsxtrtaggedlist}\marg{singular tag}\marg{plural
%tag}\marg{label prefix}\marg{label list}
%\end{definition}
%Similar to the above but the tag is selected depending on how many
%items there are in the list.
%    \begin{macrocode}
\newrobustcmd*{\glsxtrtaggedlist}[4]{%
 \begingroup
  \protected@edef\@gls@taggedlist@labels{#4}%
  \let\@gls@dolast\relax
  \let\@gls@donext\relax
  \let\@glsseeitem\@glsxtr@seefirstitem
  \let\@glsseelastsep\glsseelastsep
  \def\@gls@taggedlist@content{}%
  \let\@gls@taggedlist@tag\relax
  \@for\@gls@thislabel:=\@gls@taggedlist@labels\do{%
    \ifx\@xfor@nextelement\@nnil
      \ifx\@gls@dolast\relax
      \else
        \eappto\@gls@taggedlist@content{\expandonce\@gls@dolast}%
      \fi
    \else
      \ifx\@gls@dolast\relax
      \else
        \eappto\@gls@taggedlist@content{\expandonce\@gls@donext}%
      \fi
    \fi
    \protected@eappto\@gls@taggedlist@content{\noexpand\@glsseeitem
      {#3\@gls@thislabel}}%
    \let\@gls@dolast\@glsseelastsep
    \let\@gls@donext\glsseesep
    \let\@glsseeitem\@glsxtr@seeitem
    \let\@glsseelastsep\glsseelastoxfordsep
    \ifx\@gls@taggedlist@tag\relax
     \def\@gls@taggedlist@tag{#1\glsxtrtaggedlistsep}%
    \else
     \def\@gls@taggedlist@tag{#2\glsxtrtaggedlistsep}%
    \fi
  }%
  \@gls@taggedlist@tag\@gls@taggedlist@content
 \endgroup
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@seeitem}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@seeitem}[1]{%
 \glsxtrifmulti{#1}{\mglsseeitem{#1}}{\glsseeitem{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@seefirstitem}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@seefirstitem}[1]{%
 \glsxtrifmulti{#1}{\mglsseefirstitem{#1}}{\glsseefirstitem{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsseeitem}
%\changes{1.48}{2021-11-22}{new}
%Multi-entry cross-reference
%    \begin{macrocode}
\newcommand*{\mglsseeitem}[1]{%
 \mglsname[all={noindex},setup={hyper=allmain}]{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsseefirstitem}
%\changes{1.48}{2021-11-22}{new}
%Multi-entry cross-reference
%    \begin{macrocode}
\newcommand*{\mglsseefirstitem}{\mglsseeitem}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsseefirstitem}
%\changes{1.47}{2021-11-04}{new}
%    \begin{macrocode}
\newcommand*{\glsseefirstitem}{\glsseeitem}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsseelastoxfordsep}
%\changes{1.47}{2021-11-04}{new}
%    \begin{macrocode}
\newcommand*{\glsseelastoxfordsep}{\glsseelastsep}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\seealsoname}
%\changes{1.16}{2017-06-15}{new}
%\changes{1.42}{2020-02-03}{add check for \cs{alsoname}}
%In case this command hasn't been defined. Languages packages
%actually provide \cs{alsoname} so use that if it's defined.
%    \begin{macrocode}
\ifdef\alsoname
{\providecommand{\seealsoname}{\alsoname}}
{\providecommand{\seealsoname}{see also}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrindexseealso}
%\changes{1.16}{2017-06-15}{new}
%If \cs{@xdycrossrefhook} is defined, provide a
%\texttt{seealso} crossref class. Otherwise this just does
%\cs{glssee} with \cs{seealsoname} as the tag. The hook is only
%defined if both \pkgopt{xindy} and \sty{glossaries} v4.30+ are
%being used.
%    \begin{macrocode}
\ifdef\@xdycrossrefhook
{
%    \end{macrocode}
%Add the cross-reference class definition to the hook.
%    \begin{macrocode}
  \appto\@xdycrossrefhook{%
    \write\glswrite{(define-crossref-class \string"seealso\string"
      :unverified )}%
    \write\glswrite{(markup-crossref-list
       :class \string"seealso\string"^^J\space\space\space
       :open \string"\string\glsxtruseseealsoformat\glsopenbrace\string"
       :close \string"\glsclosebrace\string")}%
  }
%    \end{macrocode}
%Append to class list.
%    \begin{macrocode}
  \appto\@xdylocationclassorder{\space\string"seealso\string"}
%    \end{macrocode}
%This essentially works like \cs{@do@seeglossary} but uses the
%\texttt{seealso} class.
%\changes{1.21}{2017-11-03}{added check that the entry exists}
%This doesn't increment the associated counter.
%    \begin{macrocode}
  \newrobustcmd*{\glsxtrindexseealso}[2]{%
    \glsxtr@wrglossary@encap{#1}
    {%
      \ifx\@glsxtr@record@setting\@glsxtr@record@setting@alsoindex
        \@glsxtr@recordsee{#1}{#2}%
      \fi
      \glsdoifexists{#1}%
      {%
        \@@glsxtrwrglossmark
        \def\@gls@xref{#2}%
        \@onelevel@sanitize\@gls@xref
        \@gls@checkmkidxchars\@gls@xref
        \gls@glossary{\csname glo@#1@type\endcsname}{%
          (indexentry
            :tkey (\csname glo@#1@index\endcsname)
            :xref (\string"\@gls@xref\string")
            :attr \string"seealso\string"
          )
        }%
      }%
    }%
  }
}
{
%    \end{macrocode}
% \pkgopt{xindy} not in use or \sty{glossaries} version too old to support this.
%    \begin{macrocode}
  \newrobustcmd*{\glsxtrindexseealso}{\glssee[\seealsoname]}
}
%    \end{macrocode}
%\end{macro}
%
%The \gloskey{alias} key should be set to the label of the synonymous entry.
%The \gloskey{seealso} key essentially behaves like
%\texttt{see=[\cs{seealsoname}]\marg{xr-list}}. Neither of these new keys 
%has the optional tag part allowed with \gloskey{see}.
%
% If \cs{gls@set@xr@key} has been defined (\sty{glossaries} v4.30), 
% use that, otherwise just use \cs{glsaddstoragekey}.
%
%    \begin{macrocode}
\ifdef\gls@set@xr@key
{
%    \end{macrocode}
% We have at least \sty{glossaries} v4.30. This means the new keys 
% can be governed by the same settings as the see key.
%    \begin{macrocode}
  \define@key{glossentry}{alias}{%
    \gls@set@xr@key{alias}{\@glo@alias}{#1}%
  }
  \define@key{glossentry}{seealso}{%
    \gls@set@xr@key{seealso}{\@glo@seealso}{#1}%
  }
%    \end{macrocode}
% Add to the key mappings.
%    \begin{macrocode}
  \appto\@gls@keymap{,{alias}{alias},{seealso}{seealso}}
%    \end{macrocode}
% Set the default value.
%    \begin{macrocode}
  \appto\@newglossaryentryprehook{\def\@glo@alias{}\def\@glo@seealso{}}%
%    \end{macrocode}
% Assign the field values.
%    \begin{macrocode}
  \appto\@newglossaryentryposthook{%
    \ifdefvoid\@glo@seealso
     {\csxdef{glo@\@glo@label @seealso}{}}%
     {%
       \csxdef{glo@\@glo@label @seealso}{\@glo@seealso}%
       \if@glsxtr@autoseeindex
         \@glsxtr@autoindexcrossrefs
       \fi
     }%
%    \end{macrocode}
% The \gloskey{alias} field doesn't trigger the automatic
% cross-reference indexing performed at the end of the document.
%    \begin{macrocode}
    \ifdefvoid\@glo@alias
     {\csxdef{glo@\@glo@label @alias}{}}%
     {%
       \csxdef{glo@\@glo@label @alias}{\@glo@alias}%
       \glsxtraliashook{\@glo@label}%
     }%
  }
%    \end{macrocode}
% Provide user-level commands to access the values.
%\begin{macro}{\glsxtralias}
%    \begin{macrocode}
  \newcommand*{\glsxtralias}[1]{\@gls@entry@field{#1}{alias}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrseealsolabels}
%    \begin{macrocode}
  \newcommand*{\glsxtrseealsolabels}[1]{\@gls@entry@field{#1}{seealso}}
%    \end{macrocode}
%\end{macro}
%Add to the \cs{@glo@autosee} hook.
%    \begin{macrocode}
  \appto\@glo@autoseehook{%
    \ifdefvoid\@glo@alias
    {%
      \ifdefvoid\@glo@seealso
      {}%
      {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
        \protected@edef\@do@glssee{\noexpand\glsxtrindexseealso
          {\@glo@label}{\@glo@seealso}}%
        \@do@glssee
      }%
    }%
    {%
%    \end{macrocode}
%Add cross-reference if see key hasn't been used.
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
      \ifdefvoid\@glo@see
      {%
        \protected@edef\@do@glssee{\noexpand\glssee{\@glo@label}{\@glo@alias}}%
        \@do@glssee
        \glsxtraliashook{\@glo@label}%
      }%
      {}%
    }%
  }%
}
{
%    \end{macrocode}
% We have an older version of \sty{glossaries}, so just use
% \cs{glsaddstoragekey}.
%\begin{macro}{\glsxtralias}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
  \glsaddstoragekey*{alias}{}{\glsxtralias}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrseealsolabels}
%\changes{1.16}{2017-06-15}{new}
%    \begin{macrocode}
  \glsaddstoragekey*{seealso}{}{\glsxtrseealsolabels}
%    \end{macrocode}
%\end{macro}
%
%If \cs{gls@set@xr@key} isn't defined, then \cs{@glo@autosee} won't
%be either, so use the post entry definition hook.
%
%\begin{macro}{\@newglossaryentryposthook}
%\changes{1.12}{2017-02-03}{added check for alias key}
%Append to the hook to check for the \gloskey{alias} and
%\gloskey{seealso} keys.
%    \begin{macrocode}
  \appto\@newglossaryentryposthook{%
    \ifcsvoid{glo@\@glo@label @alias}%
    {%
      \ifcsvoid{glo@\@glo@label @seealso}%
      {}%
      {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
        \protected@edef\@do@glssee{\noexpand\glsxtrindexseealso
          {\@glo@label}{\csuse{glo@\@glo@label @seealso}}}%
        \@do@glssee
      }%
    }%
    {%
%    \end{macrocode}
%Add cross-reference if see key hasn't been used.
%    \begin{macrocode}
      \ifdefvoid\@glo@see
      {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
        \protected@edef\@do@glssee{\noexpand\glssee
          {\@glo@label}{\csuse{glo@\@glo@label @alias}}}%
        \@do@glssee
      }%
      {}%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%    \begin{macrocode}
}
%    \end{macrocode}
%
%\begin{macro}{\glsxtraliashook}
%\changes{1.49}{2022-10-14}{new}
%Provide a hook that's used when the alias field is provided.
%    \begin{macrocode}
\newcommand*{\glsxtraliashook}[1]{}
%    \end{macrocode}
%\end{macro}
%
% Add all unused cross-references at the end of the document.
%    \begin{macrocode}
\AtEndDocument{\if@glsxtrindexcrossrefs\glsxtraddallcrossrefs\fi}
%    \end{macrocode}
%
%\begin{macro}{\glsxtraddallcrossrefs}
% Iterate through all used entries and if they have a
% cross-reference, make sure the cross-reference has been added.
%    \begin{macrocode}
\newcommand*{\glsxtraddallcrossrefs}{%
  \forallglossaries{\@glo@type}%
  {%
     \forglsentries[\@glo@type]{\@glo@label}%
     {%
       \ifglsused{\@glo@label}{\glsxtraddunusedxrefs{\@glo@label}}{}%
     }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtraddunusedxrefs}
%\changes{1.49}{2022-10-14}{new}
%Added user-level command in case user wants to redefine
%\cs{glsxtraddallcrossrefs}
%    \begin{macrocode}
\newcommand*{\glsxtraddunusedxrefs}[1]{\expandafter\@glsxtr@addunusedxrefs\expandafter{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@addunusedxrefs}
% If the given entry has a \gloskey{see} or \gloskey{seealso} field add all unused
% cross-references. (The \gloskey{alias} field isn't checked.)
%\changes{1.16}{2017-06-15}{added check for \gloskey{seealso} field}
%    \begin{macrocode}
\newcommand*{\@glsxtr@addunusedxrefs}[1]{%
  \letcs{\@glo@see}{glo@\glsdetoklabel{#1}@see}%
  \ifdefvoid\@glo@see
  {}%
  {%
    \expandafter\glsxtr@addunused\@glo@see\@end@glsxtr@addunused
  }%
  \letcs{\@glo@see}{glo@\glsdetoklabel{#1}@seealso}%
  \ifdefvoid\@glo@see
  {}%
  {%
    \expandafter\glsxtr@addunused\@glo@see\@end@glsxtr@addunused
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@addunused}
% Adds all the entries if they haven't been used.
%    \begin{macrocode}
\newcommand*{\glsxtr@addunused}[1][]{%
  \@glsxtr@addunused
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@addunused}
% Adds all the entries if they haven't been used.
%\changes{1.48}{2021-11-22}{added check for multientry labels}
%    \begin{macrocode}
\def\@glsxtr@addunused#1\@end@glsxtr@addunused{%
 \@for\@glsxtr@label:=#1\do
 {%
   \glsxtrifmulti\@glsxtr@label
   {%
     \letcs\@glsxtr@labellist{@gls@combined@\@glsxtr@label @list}%
     \@for\@glsxtr@multilabel:=\@glsxtr@labellist\do
     {\@glsxtr@addunused\@glsxtr@multilabel\@end@glsxtr@addunused}%
   }%
   {%
     \ifglsused{\@glsxtr@label}{}%
     {%
       \glsadd[format=glsxtrunusedformat]{\@glsxtr@label}%
       \glsunset{\@glsxtr@label}%
       \expandafter\@glsxtr@addunusedxrefs\expandafter{\@glsxtr@label}%
     }%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrunusedformat}
%    \begin{macrocode}
\newcommand*{\glsxtrunusedformat}[1]{\unskip}
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Document Definitions}
%
%\begin{macro}{\gls@begindocdefs}
%This command was only introduced to \sty{glossaries} v4.37, so
%it may not be defined. If it has been defined, redefine it to check
%\cs{@glsxtr@docdefval} so that it only inputs the \texttt{.glsdefs}
%file if \pkgopt[true]{docdef}.
%    \begin{macrocode}
\ifdef\gls@begindocdefs
{%
  \renewcommand*{\gls@begindocdefs}{%
    \ifnum\@glsxtr@docdefval=1\relax
      \@gls@enablesavenonumberlist
      \edef\@gls@restoreat{%
        \noexpand\catcode`\noexpand\@=\number\catcode`\@\relax}%
      \makeatletter
      \InputIfFileExists{\jobname.glsdefs}{}{}%
      \@gls@restoreat
      \undef\@gls@restoreat
      \gls@defdocnewglossaryentry
    \else
      \ifnum\@glsxtr@docdefval=3\relax
%    \end{macrocode}
%\changes{1.34}{2018-07-29}{added support for docdef=atom}
%The \pkgopt[atom]{docdef} package option has been set. Create the
%.glsdefs file for the autocomplete support but don't read it.
%    \begin{macrocode}
        \@gls@enablesavenonumberlist
        \let\gls@checkseeallowed\relax
        \let\newglossaryentry\new@atom@glossaryentry
        \global\newwrite\@gls@deffile
        \immediate\openout\@gls@deffile=\jobname.glsdefs
%    \end{macrocode}
%Write all currently defined entries.
%    \begin{macrocode}
        \forallglsentries{\@glsentry}{\@gls@writedef{\@glsentry}}%
      \fi
    \fi
  }
}
{%
  \ifnum\@glsxtr@docdefval=3\relax
    \PackageError{glossaries-extra}{Package option
    `docdef=\@glsxtr@docdefsetting' requires at least version 4.37
    of the base glossaries.sty package}{}
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\new@atom@glossaryentry}
%    \begin{macrocode}
\newrobustcmd{\new@atom@glossaryentry}[2]{%
  \gls@defglossaryentry{#1}{#2}%
  \@gls@writedef{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\makenoidxglossaries}
%Modify \cs{makenoidxglossaries} so that it automatically 
%sets \pkgopt[false]{docdef} (unless the restricted setting is on)
%and disables the \pkgopt{docdef} key.
%This command isn't allowed with the \pkgopt{record} option.
%\changes{1.42}{2020-02-03}{added \cs{@domakeglossaries}}
%    \begin{macrocode}
\let\glsxtr@orgmakenoidxglossaries\makenoidxglossaries
\renewcommand{\makenoidxglossaries}{%
 \def\glsindexingsetting{noidx}%
 \@domakeglossaries
 {%
  \ifdefequal\@glsxtr@record@setting\@glsxtr@record@setting@off
  {%
    \glsxtr@orgmakenoidxglossaries
%    \end{macrocode}
%Add marker to \cs{@do@seeglossary} but don't increment associated
%counter.
%    \begin{macrocode}
    \renewcommand{\@do@seeglossary}[2]{%
      \@@glsxtrwrglossmark
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
      \protected@edef\@gls@label{\glsdetoklabel{##1}}%
      \protected@write\@auxout{}{%
        \string\@gls@reference
          {\csname glo@\@gls@label @type\endcsname}%
          {\@gls@label}%
          {%
            \string\glsseeformat##2{}%
          }%
      }%
      \@gls@noidx@addtorefs{\@gls@label}%
    }%
%    \end{macrocode}
%Check for \pkgopt[restricted]{docdefs}:
%    \begin{macrocode}
    \if@glsxtrdocdefrestricted
%    \end{macrocode}
%If restricted document definitions allowed, adjust
%\cs{@gls@reference} so that it doesn't test for existence.
%    \begin{macrocode}
      \renewcommand*{\@gls@reference}{%
        \@glsxtr@reference
      }%
%    \end{macrocode}
%Adjust hook to ensure unindexed parents are added to the referenced
%list, otherwise a rerun warning will keep occurring.
%    \begin{macrocode}
      \appto\@newglossaryentryposthook{%
        \@glsxtr@restricted@newentryhook
      }%
    \else
%    \end{macrocode}
%Disable document definitions.
%    \begin{macrocode}
      \@glsxtrdocdeffalse
    \fi
    \disable@keys{glossaries-extra.sty}{docdef}%
  }%
  {%
    \PackageError{glossaries-extra}{\string\makenoidxglossaries\space
     not permitted\MessageBreak 
     with record=\@glsxtr@record@setting\space package option}%
    {You may only use \string\makenoidxglossaries\ space with the
     record=off option}%
  }%
  \let\gls@warn@noidx@incompatible\@gls@warn@noidx@incompatible
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@reference}
%\changes{1.58}{2025-03-12}{new}
%Check for new command.
%    \begin{macrocode}
\ExplSyntaxOn
\cs_if_exist:NTF \__glossaries_add_glsref:nnn
 {
   \newcommand*\@glsxtr@reference[3]{
     \__glossaries_add_glsref:nnn { #1 } { #2 } { #3 }
   }
 }
 {
   \newcommand*\@glsxtr@reference[3]{
     \ifcsundef{@glsref@#1}{\csgdef{@glsref@#1}{}}{}%
     \ifinlistcs{#2}{@glsref@#1}%
     {}%
     {\listcsgadd{@glsref@#1}{#2}}%
     \ifcsundef{glo@\glsdetoklabel{#2}@loclist}%
     {\csgdef{glo@\glsdetoklabel{#2}@loclist}{}}%
     {}%
     \listcsgadd{glo@\glsdetoklabel{#2}@loclist}{#3}%
   }
 }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@restricted@newentryhook}
%\changes{1.6}{2025-04-12}{new}
%    \begin{macrocode}
\cs_if_exist:NTF \__glossaries_noidx_add_parent_of_glsrefd:n
 {
   \newcommand \@glsxtr@restricted@newentryhook
    {
      \bool_lazy_and:nnT
        { \tl_if_exist_p:c { glo@ \glslabel @parent } }
        { \bool_not_p:n { \tl_if_empty_p:c { glo@ \glslabel @parent } } }
       { 
         \exp_args:Nv \__glossaries_noidx_add_parent_of_glsrefd:n
          { glo@ \glslabel @ parent }
       }
    }
 }
 {
   \newcommand \@glsxtr@restricted@newentryhook { }
 }
\ExplSyntaxOff
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@noidx@addtorefs}
%\changes{1.6}{2025-04-12}{provided}
%This was only added to \sty{glossaries} v4.59, so provide it in
%case an older version is installed.
%    \begin{macrocode}
\providecommand\@gls@noidx@addtorefs[1]{}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\gls@warn@noidx@incompatible}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\gls@warn@noidx@incompatible}[2]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@warn@noidx@incompatible}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@gls@warn@noidx@incompatible}[2]{%
  #2\GlossariesExtraWarning{#1\space is incompatible with \string\makenoidxglossaries}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\gls@warn@noidxmakegloss@incompatible}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\gls@warn@noidxmakegloss@incompatible}[2]{%
  \gls@warn@noidx@incompatible{#1}{#2}%
  \gls@warn@makegloss@incompatible{#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\gls@defdocnewglossaryentry}
% Modify \cs{gls@defdocnewglossaryentry} so that it checks
% the \pkgopt{docdef} value.
%    \begin{macrocode}
\renewcommand*{\gls@defdocnewglossaryentry}{%
  \ifcase\@glsxtr@docdefval
%    \end{macrocode}
% \pkgopt[false]{docdef}:
%    \begin{macrocode}
    \renewcommand*{\newglossaryentry}[2]{%
      \PackageError{glossaries-extra}{Glossary entries must
       be \MessageBreak defined in the preamble with \MessageBreak
       package option `docdef=false'\MessageBreak(consider using
       `docdef=restricted')}{Move your glossary definitions to
       the preamble. You can also put them in a \MessageBreak separate file
       and load them with \string\loadglsentries.}%
    }%
  \or
%    \end{macrocode}
% (\pkgopt[true]{docdef} case.)
% Since the \gloskey{see} value is now saved in a field, it
% can be used by entries that have been defined in the document.
%    \begin{macrocode}
    \let\gls@checkseeallowed\relax
    \let\newglossaryentry\new@glossaryentry
  \else
%    \end{macrocode}
%Restricted mode just needs to allow the \gloskey{see} value.
%    \begin{macrocode}
    \let\gls@checkseeallowed\relax
  \fi
}%
%    \end{macrocode}
%\end{macro}
%
% Permit a special form of document definition, but only allow
% it if the glossaries come at the end of the document. These
% commands behave a little like a combination of \cs{newterm}
% and \cs{gls}. This must be explicitly enabled with
% the following.
%
%\begin{macro}{\GlsXtrEnableOnTheFly}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrEnableOnTheFly}{%
  \@ifstar\@sGlsXtrEnableOnTheFly\@GlsXtrEnableOnTheFly
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@sGlsXtrEnableOnTheFly}
%\changes{0.5.4}{2015-12-15}{new}
% The starred version attempts to allow UTF8 characters in the
% label, but this may break! (Formatting commands mustn't be used in the 
% label, but the label may be a command whose replacement text is the
% actual label. This doesn't take into account a command that's
% defined in terms of another command that may eventually expand to
% the label text.)
%    \begin{macrocode}
\newcommand*{\@sGlsXtrEnableOnTheFly}{%
  \renewcommand*{\glsdetoklabel}[1]{%
    \expandafter\@glsxtr@ifcsstart\string##1 \@glsxtr@end@
    {%
      \expandafter\detokenize\expandafter{##1}%
    }%
    {\detokenize{##1}}%
  }%
  \@GlsXtrEnableOnTheFly
}
\def\@glsxtr@ifcsstart#1#2\@glsxtr@end@#3#4{%
  \expandafter\if\glsbackslash#1%
    #3%
  \else
    #4%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrstarflywarn}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrstarflywarn}{%
  \GlossariesExtraWarning{Experimental starred version of
  \string\GlsXtrEnableOnTheFly\space in use (please ensure you have
  read the warnings in the glossaries-extra user manual)}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GlsXtrEnableOnTheFly}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\@GlsXtrEnableOnTheFly}{%
%    \end{macrocode}
%\end{macro}
% Don't redefine \cs{glsdetoklabel} if LuaTeX or XeTeX is being
% used, since it's mainly to allow accented characters in the
% label.
%
% These definitions are all assigned the category given by:
%\begin{macro}{\glsxtrcat}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
  \newcommand*{\glsxtrcat}{general}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
  \newcommand*{\glsxtr}[1][]{%
   \def\glsxtr@keylist{##1}%
   \@glsxtr
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
  \newcommand*{\@glsxtr}[2][]{%
   \ifglsentryexists{##2}%
   {%
     \ifblank{##1}{}{\GlsXtrWarning{##1}{##2}}%
   }%
   {%
     \gls@defglossaryentry{##2}{name={##2},category=\glsxtrcat,
       description={\nopostdesc},##1}%
   }%
   \expandafter\gls\expandafter[\glsxtr@keylist]{##2}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtr}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
  \newcommand*{\Glsxtr}[1][]{%
   \def\glsxtr@keylist{##1}%
   \@Glsxtr
  }
  \glsmfuaddmap{\glsxtr}{\Glsxtr}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtr}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
  \newcommand*{\@Glsxtr}[2][]{%
   \ifglsentryexists{##2}%
   {%
     \ifblank{##1}{}{\GlsXtrWarning{##1}{##2}}%
   }%
   {%
     \gls@defglossaryentry{##2}{name={##2},category=\glsxtrcat,
       description={\nopostdesc},##1}%
   }%
   \expandafter\Gls\expandafter[\glsxtr@keylist]{##2}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpl}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
  \newcommand*{\glsxtrpl}[1][]{%
   \def\glsxtr@keylist{##1}%
   \@glsxtrpl
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrpl}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
  \newcommand*{\@glsxtrpl}[2][]{%
   \ifglsentryexists{##2}%
   {%
     \ifblank{##1}{}{\GlsXtrWarning{##1}{##2}}%
   }%
   {%
     \gls@defglossaryentry{##2}{name={##2},category=\glsxtrcat,
       description={\nopostdesc},##1}%
   }%
   \expandafter\glspl\expandafter[\glsxtr@keylist]{##2}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrpl}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
  \newcommand*{\Glsxtrpl}[1][]{%
   \def\glsxtr@keylist{##1}%
   \@Glsxtrpl
  }
  \glsmfuaddmap{\glsxtrpl}{\Glsxtrpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtrpl}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
  \newcommand*{\@Glsxtrpl}[2][]{%
   \ifglsentryexists{##2}
   {%
     \ifblank{##1}{}{\GlsXtrWarning{##1}{##2}}%
   }%
   {%
     \gls@defglossaryentry{##2}{name={##2},category=\glsxtrcat,
       description={\nopostdesc},##1}%
   }%
   \expandafter\Glspl\expandafter[\glsxtr@keylist]{##2}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrWarning}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
  \newcommand*{\GlsXtrWarning}[2]{%
    \def\@glsxtr@optlist{##1}%
    \@onelevel@sanitize\@glsxtr@optlist
    \GlossariesExtraWarning{The options `\@glsxtr@optlist' have 
    been ignored for entry `##2' as it has already been defined}%
  }
%    \end{macrocode}
%\end{macro}
% Disable commands after the glossary:
%    \begin{macrocode}
  \renewcommand\@printglossary[2]{%
    \def\@glsxtr@printglossopts{##1}%
    \@glsxtr@orgprintglossary{##1}{##2}%
    \def\@glsxtr{\@glsxtr@disabledflycommand\glsxtr}%
    \def\@glsxtrpl{\@glsxtr@disabledflycommand\glsxtrpl}%
    \def\@Glsxtr{\@glsxtr@disabledflycommand\Glsxtr}%
    \def\@Glsxtrpl{\@glsxtr@disabledflycommand\Glsxtrpl}%
  }
%    \end{macrocode}
%
%\begin{macro}{\@glsxtr@disabledflycommand}
%    \begin{macrocode}
  \newcommand*{\@glsxtr@disabledflycommand}[1]{%
    \PackageError{glossaries-extra}%
    {\string##1\space can't be used after any of the \MessageBreak
     glossaries have been displayed}%
    {The on-the-fly commands enabled by 
     \string\GlsXtrEnableOnTheFly\space may only be used \MessageBreak
     before the glossaries. If you want to use any entries \MessageBreak
     after any of the glossaries, you must use the standard \MessageBreak
     method of first defining the entry and then using the \MessageBreak
     entry with commands like \string\gls}%
     \@@glsxtr@disabledflycommand
  }%
  \newcommand*{\@@glsxtr@disabledflycommand}[2][]{##2}
%    \end{macrocode}
%\end{macro}
%
% End of \cs{GlsXtrEnableOnTheFly}. Disable since it can only
% be used once.
%    \begin{macrocode}
  \let\GlsXtrEnableOnTheFly\relax
}
\@onlypreamble\GlsXtrEnableOnTheFly
%    \end{macrocode}
%
%\subsubsection{Existing Glossary Style Modifications}
%
% Modify \cs{setglossarystyle} to keep track of the current style.
% This allows the \cs{glossaries-extra-stylemods} package to reset the
% current style after the required modifications have been made.
%\begin{macro}{\@glsxtr@current@style}
%\changes{1.02}{2016-04-25}{new}
% Initialise the current style to the default style.
%    \begin{macrocode}
\newcommand*{\@glsxtr@current@style}{\@glossary@default@style}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpreglossarystyle}
%\changes{1.49}{2022-10-14}{new}
%A hook to initialise default definitions for style commands.
%    \begin{macrocode}
\newcommand{\glsxtrpreglossarystyle}{%
  \renewcommand*{\glssubgroupheading}[4]{\glsgroupheading{##4}}%
}
%    \end{macrocode}
%\end{macro}
% Modify \cs{setglossarystyle} to set \cs{@glsxtr@current@style}
% and reset \cs{glssubgroupheading} in case the style doesn't
% support it.
%\begin{macro}{\setglossarystyle}
%    \begin{macrocode}
\renewcommand*{\setglossarystyle}[1]{%
  \ifcsundef{@glsstyle@#1}%
  {%
    \PackageError{glossaries-extra}{Glossary style `#1' undefined}{}%
  }%
  {%
    \glsxtrpreglossarystyle
    \csname @glsstyle@#1\endcsname
%    \end{macrocode}
% Only set the current style if it exists.
%    \begin{macrocode}
    \protected@edef\@glsxtr@current@style{#1}%
  }%
%    \end{macrocode}
% Set this as the default, if a default hasn't been set.
%    \begin{macrocode}
  \ifx\@glossary@default@style\relax
    \protected@edef\@glossary@default@style{#1}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
% In case we have an old version of \sty{glossaries}:
%    \begin{macrocode}
\ifdef\@glossary@default@style
{}
{%
  \let\@glossary@default@style\relax
}
%    \end{macrocode}
%
%\begin{macro}{\glslistdottedwidth}
%If \cs{glslistdottedwidth} has been defined and is currently equal
%to \verb|.5\hsize| then make the modification suggested in 
%\href{http://www.dickimaw-books.com/cgi-bin/bugtracker.cgi?action=view&key=92}{bug report \#92}
%    \begin{macrocode}
\ifdef\glslistdottedwidth
{%
  \ifdim\glslistdottedwidth=.5\hsize
    \setlength{\glslistdottedwidth}{-\dimexpr\maxdimen-1sp\relax}
    \AtBeginDocument{%
      \ifdim\glslistdottedwidth=-\dimexpr\maxdimen-1sp\relax
       \setlength{\glslistdottedwidth}{.5\columnwidth}%
      \fi
    }%
  \fi
}
{}%
%    \end{macrocode}
%\end{macro}
%
%Similarly for \cs{glsdescwidth}:
%\begin{macro}{\glsdescwidth}
%\changes{0.5.3}{2015-12-09}{added}
%    \begin{macrocode}
\ifdef\glsdescwidth
{%
  \ifdim\glsdescwidth=.6\hsize
    \setlength{\glsdescwidth}{-\dimexpr\maxdimen-1sp\relax}
    \AtBeginDocument{%
      \ifdim\glsdescwidth=-\dimexpr\maxdimen-1sp\relax
       \setlength{\glsdescwidth}{.6\columnwidth}%
      \fi
    }%
  \fi
}
{}%
%    \end{macrocode}
%\end{macro}
%and for \cs{glspagelistwidth}:
%\begin{macro}{\glspagelistwidth}
%\changes{0.5.3}{2015-12-09}{added}
%    \begin{macrocode}
\ifdef\glspagelistwidth
{%
  \ifdim\glspagelistwidth=.1\hsize
    \setlength{\glspagelistwidth}{-\dimexpr\maxdimen-1sp\relax}
    \AtBeginDocument{%
      \ifdim\glspagelistwidth=-\dimexpr\maxdimen-1sp\relax
       \setlength{\glspagelistwidth}{.1\columnwidth}%
      \fi
    }%
  \fi
}
{}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glossaryentrynumbers}
% Has the \pkgopt{nonumberlist} option been used?
%\changes{0.5.2}{2015-12-08}{added}
%    \begin{macrocode}
\def\org@glossaryentrynumbers#1{#1\gls@save@numberlist{#1}}%
\ifx\org@glossaryentrynumbers\glossaryentrynumbers
  \glsnonumberlistfalse
  \renewcommand*{\glossaryentrynumbers}[1]{%
    \ifglsentryexists{\glscurrententrylabel}%
    {%
      \@glsxtrpreloctag
      \GlsXtrFormatLocationList{#1}%
      \@glsxtrpostloctag
      \gls@save@numberlist{#1}%
    }{}%
  }%
\else
  \glsnonumberlisttrue
  \renewcommand*{\glossaryentrynumbers}[1]{%
    \ifglsentryexists{\glscurrententrylabel}%
    {%
      \gls@save@numberlist{#1}%
    }{}%
  }%
\fi
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrFormatLocationList}
%\changes{0.5.2}{2015-12-08}{new}
% Provide an easy interface to change the format of the location
% list without removing the save number list stuff.
%    \begin{macrocode}
\newcommand*{\GlsXtrFormatLocationList}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
% Sometimes users want to prefix the location list with
% \qt{page}\slash\qt{pages}. The simplest way to determine if the
% location list consists of a single location is to check for
% instances of \cs{delimN} or \cs{delimR}, but this isn't so easy to
% do as they might be embedded inside the argument of formatting
% commands. With a bit of trickery we can find out by adjusting
% \cs{delimN} and \cs{delimR} to set a flag and then save
% information to the auxiliary file for the next run.
%\begin{macro}{\GlsXtrEnablePreLocationTag}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrEnablePreLocationTag}[2]{%
  \let\@glsxtrpreloctag\@@glsxtrpreloctag
  \let\@glsxtrpostloctag\@@glsxtrpostloctag
  \renewcommand*{\@glsxtr@pagetag}{#1}%
  \renewcommand*{\@glsxtr@pagestag}{#2}%
  \renewcommand*{\@glsxtr@savepreloctag}[2]{%
    \csgdef{@glsxtr@preloctag@##1}{##2}%
  }%
  \renewcommand*{\@glsxtr@doloctag}{%
    \ifcsundef{@glsxtr@preloctag@\glscurrententrylabel}%
    {%
      \GlossariesWarning{Missing pre-location tag for `\glscurrententrylabel'.
        Rerun required}%
    }%
    {%
      \csuse{@glsxtr@preloctag@\glscurrententrylabel}%
    }%
  }%
}
\@onlypreamble\GlsXtrEnablePreLocationTag
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtrpreloctag}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\@@glsxtrpreloctag}{%
   \let\@glsxtr@org@delimN\delimN
   \let\@glsxtr@org@delimR\delimR
   \let\@glsxtr@org@glsignore\glsignore
%    \end{macrocode}
% \cs{gdef} is required as the delimiters may occur inside a scope.
%    \begin{macrocode}
   \gdef\@glsxtr@thisloctag{\@glsxtr@pagetag}%
   \renewcommand*{\delimN}{%
     \gdef\@glsxtr@thisloctag{\@glsxtr@pagestag}%
     \@glsxtr@org@delimN}%
   \renewcommand*{\delimR}{%
     \gdef\@glsxtr@thisloctag{\@glsxtr@pagestag}%
     \@glsxtr@org@delimR}%
   \renewcommand*{\glsignore}[1]{%
     \gdef\@glsxtr@thisloctag{\relax}%
     \@glsxtr@org@glsignore{##1}}%
   \@glsxtr@doloctag
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtrpreloctag}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtrpreloctag}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@pagetag}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@pagetag}{}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtr@pagestag}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@pagestag}{}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@@glsxtrpostloctag}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\@@glsxtrpostloctag}{%
   \let\delimN\@glsxtr@org@delimN
   \let\delimR\@glsxtr@org@delimR
   \let\glsignore\@glsxtr@org@glsignore
   \protected@write\@auxout{}%
    {\string\@glsxtr@savepreloctag{\glscurrententrylabel}{\@glsxtr@thisloctag}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtrpostloctag}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtrpostloctag}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@preloctag}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@savepreloctag}[2]{}
\protected@write\@auxout{}{%
  \string\providecommand\string\@glsxtr@savepreloctag[2]{}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@doloctag}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@doloctag}{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\KV@printgloss@nonumberlist}
% Modify the \gloskey[printglossary]{nonumberlist} key to
% use \cs{GlsXtrFormatLocationList} (and also save the number list):
%\changes{0.5.2}{2015-12-08}{added}
%    \begin{macrocode}
\renewcommand*{\KV@printgloss@nonumberlist}[1]{%
 \XKV@plfalse
 \XKV@sttrue
 \XKV@checkchoice[\XKV@resa]{#1}{true,false}%
 {%
   \csname glsnonumberlist\XKV@resa\endcsname
   \ifglsnonumberlist
     \def\glossaryentrynumbers##1{\gls@save@numberlist{##1}}%
   \else
     \def\glossaryentrynumbers##1{%
       \@glsxtrpreloctag
       \GlsXtrFormatLocationList{##1}%
       \@glsxtrpostloctag
       \gls@save@numberlist{##1}}%
   \fi
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Entry Formatting, Hyperlinks and Indexing}
%
%\begin{macro}{\glsentryfmt}
% Change default entry format. Use the generic format for regular
% terms (that is, entries that have a category with the \catattr{regular}
% attribute set) or non-regular terms without a short value and use the abbreviation format for non-regular
% terms that have a short value. If further attributes need to be checked, then
% \cs{glsentryfmt} will need redefining as appropriate (or use
% \cs{defglsentryfmt}).
%\changes{0.3}{2015-12-02}{added check for short}
% The abbreviation format is set here for entries that have a short
% form, even if they are regular entries to ensure the abbreviation
% fonts are correct.
%\changes{0.5.2}{2015-12-08}{moved \cs{glssetabbrvfmt} from
%\cs{glsxtrabbrvfmt} to here}
%    \begin{macrocode}
\renewcommand*{\glsentryfmt}{%
  \ifglshasshort{\glslabel}{\glssetabbrvfmt{\glscategory{\glslabel}}}{}%
  \glsifregular{\glslabel}%
  {\glsxtrregularfont{\glsgenentryfmt}}%
  {%
    \ifglshasshort{\glslabel}%
    {\glsxtrabbreviationfont{\glsxtrgenabbrvfmt}}%
    {\glsxtrregularfont{\glsgenentryfmt}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrregularfont}
%\changes{1.04}{2016-05-02}{new}
% Font used for regular entries.
%    \begin{macrocode}
\newcommand*{\glsxtrregularfont}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrabbreviationfont}
%\changes{1.30}{2018-04-25}{new}
% Font used for abbreviation entries.
%    \begin{macrocode}
\newcommand*{\glsxtrabbreviationfont}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%Some formatting commands (such as highlighting or letter spacing) may
%require expandable content in the argument, so also provide a formatting
%command for use within \cs{glsgenentryfmt} for those instances.
%
%\begin{macro}{\glsxtrdefaultentrytextfmt}
%\changes{1.49}{2022-10-14}{new}
%This is the default command that \cs{glsxtrgenentrytextfmt} is initialised to
%within \cs{@gls@link}.
%    \begin{macrocode}
\newcommand{\glsxtrdefaultentrytextfmt}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrattrentrytextfmt}
%\changes{1.49}{2022-10-14}{new}
%Provide a convenient command that applies the formatting according to 
%the category attribute. This isn't used by default as this inner formatting
%should rarely be needed and increases complexity.
%    \begin{macrocode}
\newcommand{\glsxtrattrentrytextfmt}[1]{%
  \glshasattribute{\glslabel}{innertextformat}%
  {%
    \csuse{\glsgetattribute{\glslabel}{innertextformat}}{#1}%
  }%
  {#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgenentrytextfmt}
%\changes{1.49}{2022-10-14}{new}
%This command is a user-level command to allow it to be included in custom
%formats or styles but it should not be redefined at the user level
%as it's redefined within \cs{@gls@link} (similar to other style commands, such
%as \cs{glscapscase}. Redefine \cs{glsxtrdefaultentrytextfmt} to change 
%the default definition for this command.
%    \begin{macrocode}
\newcommand*{\glsxtrgenentrytextfmt}{\glsxtrdefaultentrytextfmt}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfmtfield}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsfmtfield}\marg{insert}\marg{cs}\marg{label}\marg{field}
%\end{definition}
%Provide a convenient way of applying a formatting command to the actual
%field contents. No check for existence.
%
%Note this command intentionally isn't robust, as it's possible that
%a user may want to redefine an abbreviation command to use
%\cs{MakeLowercase}, for example, to use smallcaps when
%abbreviations have been defined with the short version in capitals.
%Using \cs{newrobustcmd} will break that case.
%    \begin{macrocode}
\newcommand*{\glsfmtfield}[4]{%
  \expandafter\expandafter\expandafter
  #2\expandafter\expandafter\expandafter
   {\csname glo@\glsdetoklabel{#3}@#4\endcsname #1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsfmtfield}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{Glsfmtfield}\marg{insert}\marg{cs}\marg{label}\marg{field}
%\end{definition}
%As above but convert first letter to uppercase.
%Note that if the formatting command can go outside of \cs{makefirstuc}
%then it can simply be applied around the appropriate command that expands
%to the field value. For example,
%\begin{verbatim}
%\emph{\Glsentrytext{label}}
%\end{verbatim}
%instead of
%\begin{verbatim}
%\Glsfmtfield{}{\emph}{sample}{text}
%\end{verbatim}
%
%Note this command intentionally isn't robust for the same reason as
%above. The expansion allows \cs{makefirstuc} to pick up any
%mappings or blockers before the content is passed to
%\cs{MFUsentencecase}.
%    \begin{macrocode}
\newcommand*{\Glsfmtfield}[4]{%
  \ifx#2\@firstofone
   \expandafter\expandafter\expandafter
   \glssentencecase\expandafter\expandafter\expandafter
    {%
      \csname glo@\glsdetoklabel{#3}@#4\endcsname #1%
    }%
  \else
   \expandafter\expandafter\expandafter
   \glssentencecase\expandafter\expandafter\expandafter
    {%
      \expandafter\expandafter\expandafter
       #2\expandafter\expandafter\expandafter
        {\csname glo@\glsdetoklabel{#3}@#4\endcsname #1}%
    }%
  \fi
}
\glsmfuaddmap{\glsfmtfield}{\Glsfmtfield}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSfmtfield}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{GLSfmtfield}\marg{insert}\marg{cs}\marg{label}\marg{field}
%\end{definition}
%As above but convert all to uppercase.
%The expansion is in case we have an older kernel.
%    \begin{macrocode}
\newcommand*{\GLSfmtfield}[4]{%
  \ifx#2\@firstofone
   \expandafter\expandafter\expandafter
   \glsuppercase\expandafter\expandafter\expandafter
    {%
      \csname glo@\glsdetoklabel{#3}@#4\endcsname #1%
    }%
  \else
   \expandafter\expandafter\expandafter
   \glsuppercase\expandafter\expandafter\expandafter
    {%
      \expandafter\expandafter\expandafter
       #2\expandafter\expandafter\expandafter
        {\csname glo@\glsdetoklabel{#3}@#4\endcsname #1}%
    }%
  \fi
}
\glsmfublocker{\GLSfmtfield}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfmtinsert}
%\changes{1.49}{2022-10-14}{new}
%Formats \cs{glsinsert}.
%    \begin{macrocode}
\newcommand*{\glsfmtinsert}{%
  \ifdefempty\glsinsert{}%
  {\expandafter\glsxtrgenentrytextfmt\expandafter{\glsinsert}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSfmtinsert}
%\changes{1.49}{2022-10-14}{new}
%As above but all caps.
%    \begin{macrocode}
\newcommand*{\GLSfmtinsert}{%
  \ifdefempty\glsinsert{}%
  {%
    \expandafter\glsuppercase\expandafter
      {\expandafter\glsxtrgenentrytextfmt\expandafter{\glsinsert}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsifapplyinnerfmtfield}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsifapplyinnerfmtfield}\marg{label}\marg{field}\marg{true}\marg{false}
%\end{definition}
%Does \meta{true} if \cs{glsgenentryfmt} should encapsulate the
%given field with the inner format otherwise does \meta{false}.
%    \begin{macrocode}
\newcommand*{\glsifapplyinnerfmtfield}[4]{%
 \ifcsundef{@glo@\glsdetoklabel{#1}@innerfmt@fields}%
 {#3}%
 {\xifinlistcs{#2}{@glo@\glsdetoklabel{#1}@innerfmt@fields}{#4}{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsexclapplyinnerfmtfield}
%\changes{1.49}{2022-10-14}{new}
%Adds the field to the exclusion list. This typically means that the
%field value already contains the inner formatting.
%    \begin{macrocode}
\newcommand*{\glsexclapplyinnerfmtfield}[2]{%
 \listcseadd{@glo@\glsdetoklabel{#1}@innerfmt@fields}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsgenentryfmt}
%\changes{1.49}{2022-10-14}{added redefinition}
% Redefine to use \cs{glsxtrgenentrytextfmt}
%    \begin{macrocode}
\renewcommand*{\glsgenentryfmt}{%
  \ifdefempty\glscustomtext
  {%
    \glsifplural
    {%
%    \end{macrocode}
% Plural form
%    \begin{macrocode}
      \glscapscase
      {%
%    \end{macrocode}
% Don't adjust case
%    \begin{macrocode}
        \ifglsused\glslabel
        {%
%    \end{macrocode}
% Subsequent use
%    \begin{macrocode}
          \glsifapplyinnerfmtfield{\glslabel}{plural}%
          {%
            \expandafter\glsaccessfmtplural\expandafter{\glsinsert}%
              {\glsxtrgenentrytextfmt}{\glslabel}%
          }%
          {\glsaccessplural{\glslabel}\glsfmtinsert}%
        }%
        {%
%    \end{macrocode}
% First use
%    \begin{macrocode}
          \glsifapplyinnerfmtfield{\glslabel}{firstpl}%
          {%
            \expandafter\glsaccessfmtfirstplural\expandafter{\glsinsert}%
              {\glsxtrgenentrytextfmt}{\glslabel}%
          }%
          {\glsaccessfirstplural{\glslabel}\glsfmtinsert}%
        }%
      }%
      {%
%    \end{macrocode}
% Make first letter upper case
%    \begin{macrocode}
        \ifglsused\glslabel
        {%
%    \end{macrocode}
% Subsequent use.
%    \begin{macrocode}
          \glsifapplyinnerfmtfield{\glslabel}{plural}%
          {%
            \expandafter\Glsaccessfmtplural\expandafter
             {\glsinsert}{\glsxtrgenentrytextfmt}{\glslabel}%
          }%
          {\Glsaccessplural{\glslabel}\glsfmtinsert}%
        }%
        {%
%    \end{macrocode}
% First use
%    \begin{macrocode}
          \glsifapplyinnerfmtfield{\glslabel}{firstpl}%
          {%
            \expandafter\Glsaccessfmtfirstplural\expandafter
             {\glsinsert}{\glsxtrgenentrytextfmt}{\glslabel}%
          }%
          {\Glsaccessfirstplural{\glslabel}\glsfmtinsert}%
        }%
      }%
      {%
%    \end{macrocode}
% Make all upper case
%    \begin{macrocode}
        \ifglsused\glslabel
        {%
%    \end{macrocode}
% Subsequent use
%    \begin{macrocode}
          \glsifapplyinnerfmtfield{\glslabel}{plural}%
          {%
            \expandafter\GLSaccessfmtplural\expandafter
              {\glsinsert}{\glsxtrgenentrytextfmt}{\glslabel}%
          }%
          {\GLSaccessplural{\glslabel}\GLSfmtinsert}%
        }%
        {%
%    \end{macrocode}
% First use
%    \begin{macrocode}
          \glsifapplyinnerfmtfield{\glslabel}{firstpl}%
          {%
            \expandafter\GLSaccessfmtfirstplural\expandafter
              {\glsinsert}{\glsxtrgenentrytextfmt}{\glslabel}%
          }%
          {\GLSaccessfirstplural{\glslabel}\GLSfmtinsert}%
        }%
      }%
    }%
    {%
%    \end{macrocode}
% Singular form
%    \begin{macrocode}
      \glscapscase
      {%
%    \end{macrocode}
% Don't adjust case
%    \begin{macrocode}
        \ifglsused\glslabel
        {%
%    \end{macrocode}
% Subsequent use
%    \begin{macrocode}
          \glsifapplyinnerfmtfield{\glslabel}{text}%
          {%
            \expandafter\glsaccessfmttext\expandafter
              {\glsinsert}{\glsxtrgenentrytextfmt}{\glslabel}%
          }%
          {\glsaccesstext{\glslabel}\glsfmtinsert}%
        }%
        {%
%    \end{macrocode}
% First use
%    \begin{macrocode}
          \glsifapplyinnerfmtfield{\glslabel}{first}%
          {%
            \expandafter\glsaccessfmtfirst\expandafter
             {\glsinsert}{\glsxtrgenentrytextfmt}{\glslabel}%
          }%
          {\glsaccessfirst{\glslabel}\glsfmtinsert}%
        }%
      }%
      {%
%    \end{macrocode}
% Make first letter upper case
%    \begin{macrocode}
        \ifglsused\glslabel
        {%
%    \end{macrocode}
% Subsequent use
%    \begin{macrocode}
          \glsifapplyinnerfmtfield{\glslabel}{text}%
          {%
            \expandafter\Glsaccessfmttext\expandafter
              {\glsinsert}{\glsxtrgenentrytextfmt}{\glslabel}%
          }%
          {\Glsaccesstext{\glslabel}\glsfmtinsert}%
        }%
        {%
%    \end{macrocode}
% First use
%    \begin{macrocode}
          \glsifapplyinnerfmtfield{\glslabel}{first}%
          {%
            \expandafter\Glsaccessfmtfirst\expandafter
              {\glsinsert}{\glsxtrgenentrytextfmt}{\glslabel}%
          }%
          {\Glsaccessfirst{\glslabel}\glsfmtinsert}%
        }%
      }%
      {%
%    \end{macrocode}
% Make all upper case
%    \begin{macrocode}
        \ifglsused\glslabel
        {%
%    \end{macrocode}
% Subsequent use
%    \begin{macrocode}
          \glsifapplyinnerfmtfield{\glslabel}{text}%
          {%
            \expandafter\GLSaccessfmttext\expandafter
              {\glsinsert}{\glsxtrgenentrytextfmt}{\glslabel}%
          }%
          {\GLSaccesstext{\glslabel}\GLSfmtinsert}%
        }%
        {%
%    \end{macrocode}
% First use
%    \begin{macrocode}
          \glsifapplyinnerfmtfield{\glslabel}{first}%
          {%
            \expandafter\GLSaccessfmtfirst\expandafter
              {\glsinsert}{\glsxtrgenentrytextfmt}{\glslabel}%
          }%
          {\GLSaccessfirst{\glslabel}\GLSfmtinsert}%
        }%
      }%
    }%
  }%
  {%
%    \end{macrocode}
% Custom text provided in \cs{glsdisp}, in which case the formatting 
% should already be applied.
%    \begin{macrocode}
    \glscustomtext
  }%
}
%    \end{macrocode}
%\end{macro}
%
% Commands like \cs{glsifplural} are only used by the \cs{gls}-like
% commands in the \sty{glossaries} package, but it might be useful
% for the post-link hook to know if the user has used, say,
% \cs{glsfirst} or \cs{glsplural}. This can provide better
% consistency with the formatting of the \cs{gls}-like commands,
% even though they don't use \cs{glsentryfmt}.
%
%\begin{macro}{\glsxtrifwasglslike}
%\changes{1.49}{2022-10-14}{new}
%For use in the post-link hook, this indicates whether or not
%the hook follows a \cs{gls}-like command.
%    \begin{macrocode}
\newcommand*{\glsxtrifwasglslike}[2]{#2}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifwasglslikeandfirstuse}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrifwasglslikeandfirstuse}[2]{%
  \glsxtrifwasglslike
  {%
    \glsxtrifwasfirstuse{#1}{#2}%
  }{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifwassubsequentuse}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrifwassubsequentuse}[2]{%
  \glsxtrifwasglslike
  {%
    \glsxtrifwasfirstuse{#2}{#1}%
  }{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifallcaps}
%\changes{1.49}{2022-10-14}{new}
%Shortcut.
%    \begin{macrocode}
\newcommand*{\glsxtrifallcaps}[2]{\glscapscase{#2}{#1}{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrcurrentfield}
%\changes{1.49}{2022-10-14}{new}
%Another placeholder to find out information about the calling
%command. This will be empty for the \cs{gls} and
%\cs{glsxtrfull} set of commands and will be the singular field otherwise.
%    \begin{macrocode}
\newcommand*{\glsxtrcurrentfield}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@shortfieldname}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@shortfieldname}{short}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifwassubsequentorshort}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrifwassubsequentorshort}[2]{%
  \glsxtrifwasglslike
  {%
    \glsxtrifwasfirstuse{#2}{#1}%
  }%
  {\ifdefequal\glsxtrcurrentfield\glsxtr@shortfieldname{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@field@link}
% Redefine \cs{@gls@field@link} so that commands like \cs{glsfirst}
% can setup \cs{glsxtrifwasfirstuse} etc to allow the postlink hook
% to work better. This now has an optional argument that sets up the
% defaults.
%\changes{0.3}{2015-12-02}{added optional argument}
%    \begin{macrocode}
\renewcommand{\@gls@field@link}[4][]{%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.08}{2016-12-13}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#2}{#3}{glslink}%
  \glsdoifexists{#3}%
  {%
%    \end{macrocode}
%Save and restore the hyper setting (\cs{@gls@link} also does this,
%but that's too late if the optional argument of \cs{@gls@field@link}
%modifies it).
%    \begin{macrocode}
    \let\glsxtrorg@ifKV@glslink@hyper\ifKV@glslink@hyper
%    \end{macrocode}
%Save local setting.
%    \begin{macrocode}
    \@gls@save@glslocal
%    \end{macrocode}
%Initialise preunset, prereset and postunset
%    \begin{macrocode}
    \glsinitreunsets
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \def\glscustomtext{#4}%
    \@glsxtr@field@linkdefs
    #1%
    \@gls@link[#2]{#3}{#4}%
    \let\ifKV@glslink@hyper\glsxtrorg@ifKV@glslink@hyper
    \@gls@restore@glslocal
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%The commands \cs{gls}, \cs{Gls} etc don't use \cs{@gls@field@link},
%so they need modifying as well to use \cs{@glsxtr@record}.
%
%\begin{macro}{\@gls@}
%\changes{1.08}{2016-12-13}{added \cs{@glsxtr@record}}
%Save the original definition and redefine.
%    \begin{macrocode}
\let\@glsxtr@org@gls@\@gls@
\def\@gls@#1#2{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@record{#1}{#2}{glslink}%
  \@glsxtr@org@gls@{#1}{#2}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glspl@}
%\changes{1.08}{2016-12-13}{added \cs{@glsxtr@record}}
%Save the original definition and redefine.
%    \begin{macrocode}
\let\@glsxtr@org@glspl@\@glspl@
\def\@glspl@#1#2{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@record{#1}{#2}{glslink}%
  \@glsxtr@org@glspl@{#1}{#2}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Gls@}
%\changes{1.08}{2016-12-13}{added \cs{@glsxtr@record}}
%Save the original definition and redefine.
%    \begin{macrocode}
\let\@glsxtr@org@Gls@\@Gls@
\def\@Gls@#1#2{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@record{#1}{#2}{glslink}%
  \@glsxtr@org@Gls@{#1}{#2}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glspl@}
%\changes{1.08}{2016-12-13}{added \cs{@glsxtr@record}}
%Save the original definition and redefine.
%    \begin{macrocode}
\let\@glsxtr@org@Glspl@\@Glspl@
\def\@Glspl@#1#2{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@record{#1}{#2}{glslink}%
  \@glsxtr@org@Glspl@{#1}{#2}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLS@}
%\changes{1.08}{2016-12-13}{added \cs{@glsxtr@record}}
%Save the original definition and redefine.
%    \begin{macrocode}
\let\@glsxtr@org@GLS@\@GLS@
\def\@GLS@#1#2{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@record{#1}{#2}{glslink}%
  \@glsxtr@org@GLS@{#1}{#2}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSpl@}
%\changes{1.08}{2016-12-13}{added \cs{@glsxtr@record}}
%\changes{1.10}{2016-12-17}{fixed bug caused by typo in command name}
%Save the original definition and redefine.
%    \begin{macrocode}
\let\@glsxtr@org@GLSpl@\@GLSpl@
\def\@GLSpl@#1#2{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@record{#1}{#2}{glslink}%
  \@glsxtr@org@GLSpl@{#1}{#2}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsdisp}
%\changes{1.08}{2016-12-13}{added \cs{@glsxtr@record}}
%\changes{1.13}{2017-02-07}{removed \cs{@glsxtr@org@glsdisp}}
%This is redefined to allow the recording on the first run.
%Can't save and restore \cs{@glsdisp} since it has an optional
%argument.
%    \begin{macrocode}
\renewcommand*{\@glsdisp}[3][]{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}{%
    \let\do@gls@link@checkfirsthyper\@gls@link@checkfirsthyper
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@firstofthree
    \def\glscustomtext{\glsxtrgenentrytextfmt{#3}}%
    \def\glsinsert{}%
    \def\@glo@text{\csname gls@\glstype @entryfmt\endcsname}%
    \@gls@link[#1]{#2}{\@glo@text}%
    \@gls@do@glsunset{#2}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@@link}
%\changes{1.08}{2016-12-13}{added \cs{@glsxtr@record}}
%Redefine to include \cs{@glsxtr@record}
%    \begin{macrocode}
\renewcommand*{\@gls@@link}[3][]{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexistsordo{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\relax
%    \end{macrocode}
%\changes{1.35}{2018-08-13}{initialise post-link hook commands}
% Post-link hook commands need initialising.
%    \begin{macrocode}
    \def\glscustomtext{#3}%
    \def\glsinsert{}%
    \@glsxtr@field@linkdefs
    \@gls@link[#1]{#2}{\glsxtrgenentrytextfmt{#3}}%
  }%
  {%
    \glstextformat{#3}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrinitwrgloss}
%\changes{1.14}{2017-04-18}{new}
%Set the default if the \gloskey[glslink]{wrgloss} is omitted.
%    \begin{macrocode}
\newcommand*{\glsxtrinitwrgloss}{%
 \glsifattribute{\glslabel}{wrgloss}{after}%
 {%
   \glsxtrinitwrglossbeforefalse
 }%
 {%
   \glsxtrinitwrglossbeforetrue
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\ifglsxtrwrglossbefore}
%\changes{1.14}{2017-04-18}{new}
%Conditional to determine if the indexing should be done before the
%link text.
%    \begin{macrocode}
\newif\ifglsxtrinitwrglossbefore
\glsxtrinitwrglossbeforetrue
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\setupglslink}
%\changes{1.49}{2022-10-14}{new}
%Shortcut command to set glslink options.
%    \begin{macrocode}
\newcommand*{\setupglslink}[1]{\setkeys{glslink}{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\setupglsadd}
%\changes{1.49}{2022-10-14}{new}
%Shortcut command to set glsadd options.
%    \begin{macrocode}
\newcommand*{\setupglsadd}[1]{\setkeys{glsadd}{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@do@glsprereset}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@gls@do@glsprereset}[1]{} 
%    \end{macrocode}
%\end{macro}
%
%    \begin{macrocode}
\define@choicekey{glslink}{prereset}%
[\@glsxtr@preresetval\@glsxtr@preresetnr]%
{none,local,global}[local]%
{%
  \ifcase\@glsxtr@preresetnr
   \let\@gls@do@glsprereset\@gobble
  \or
   \def\@gls@do@glsprereset{%
     \let\@gls@link@postkeys@checkfirsthyper\do@gls@link@checkfirsthyper
     \let\glsxtrifwasfirstuse\@firstoftwo\glslocalreset}%
  \or
   \def\@gls@do@glsprereset{%
     \let\@gls@link@postkeys@checkfirsthyper\do@gls@link@checkfirsthyper
     \let\glsxtrifwasfirstuse\@firstoftwo\glsreset}%
  \fi
}
%    \end{macrocode}
%
%\begin{macro}{\@gls@do@glspreunset}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@gls@do@glspreunset}[1]{} 
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@glslink@hyper@update@hook}
%\changes{1.49}{2022-10-14}{new}
%This hook was only introduced to \sty{glossaries} v4.50, so if
%isn't defined, need to patch the hyper key.
%    \begin{macrocode}
\ifdef\@gls@glslink@hyper@update@hook
{%
  \renewcommand*{\@gls@glslink@hyper@update@hook}{%
    \let\@gls@if@glslink@hyper@updated\@firstoftwo
  }
}
{
  \newcommand*{\@gls@glslink@hyper@update@hook}{%
    \let\@gls@if@glslink@hyper@updated\@firstoftwo
  }
  \renewcommand*{\KV@glslink@hyper}[1]{%
    \XKV@plfalse\XKV@sttrue
    \XKV@checkchoice[\XKV@resa ]{#1}{true,false}%
     {\csname KV@glslink@hyper\XKV@resa\endcsname\@gls@glslink@hyper@update@hook}%
  }
}
%    \end{macrocode}
%\end{macro}
%
%    \begin{macrocode}
\define@choicekey{glslink}{preunset}%
[\@glsxtr@preunsetval\@glsxtr@preunsetnr]%
{none,local,global}[local]%
{%
  \ifcase\@glsxtr@preunsetnr
   \let\@gls@do@glspreunset\@gobble
  \or
   \def\@gls@do@glspreunset{%
     \let\@gls@link@postkeys@checkfirsthyper\do@gls@link@checkfirsthyper
     \let\glsxtrifwasfirstuse\@secondoftwo\glslocalunset}%
  \or
   \def\@gls@do@glspreunset{%
     \let\@gls@link@postkeys@checkfirsthyper\do@gls@link@checkfirsthyper
     \let\glsxtrifwasfirstuse\@secondoftwo\glsunset}%
  \fi
}
%    \end{macrocode}
%
%    \begin{macrocode}
\define@choicekey{glslink}{postunset}%
[\@glsxtr@postunsetval\@glsxtr@postunsetnr]%
{none,local,global}[global]%
{%
  \ifcase\@glsxtr@postunsetnr
    \let\@gls@restore@glslocal\@gls@ignore@restore@glslocal
  \or
    \let\@gls@restore@glslocal\@gls@default@restore@glslocal
    \KV@glslink@localtrue
  \or
    \let\@gls@restore@glslocal\@gls@default@restore@glslocal
    \KV@glslink@localfalse
  \fi
}
%    \end{macrocode}
%
%\begin{macro}{\glsinitreunsets}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsinitreunsets}{%
  \let\@gls@do@glspreunset\@gobble
  \let\@gls@do@glsprereset\@gobble
  \let\@gls@restore@glslocal\@gls@default@restore@glslocal
  \@glsxtrbuffer@check@repeats
}
%    \end{macrocode}
%\end{macro}
%
% Define \gloskey[glslink]{wrgloss} key to determine whether to
% write the glossary information before or after the link text.
%    \begin{macrocode}
\define@choicekey{glslink}{wrgloss}%
[\@glsxtr@wrglossval\@glsxtr@wrglossnr]%
{before,after}%
{%
  \ifcase\@glsxtr@wrglossnr\relax
    \glsxtrinitwrglossbeforetrue
  \or
    \glsxtrinitwrglossbeforefalse
  \fi
}
%    \end{macrocode}
%\changes{1.19}{2017-09-09}{added \cs{glslink} option \texttt{thevalue}}
%    \begin{macrocode}
\define@key{glslink}{thevalue}{\def\@glsxtr@thevalue{#1}}
%    \end{macrocode}
%
%\changes{1.19}{2017-09-09}{added \cs{glslink} option \texttt{theHvalue}}
%    \begin{macrocode}
\define@key{glslink}{theHvalue}{\def\@glsxtr@theHvalue{#1}}
%    \end{macrocode}
%
%\begin{macro}{\ifglsxtr@hyperoutside}
%\changes{1.21}{2017-11-03}{new}
% Define a \gloskey[glslink]{hyperoutside} key to determine whether 
% \cs{hyperlink} should be outside \cs{glstextformat}.
%    \begin{macrocode}
\define@boolkey{glslink}[glsxtr@]{hyperoutside}[true]{}
\glsxtr@hyperoutsidetrue
%    \end{macrocode}
%
%\end{macro}
%
%\begin{macro}{\@glsxtr@current@textformat@csname}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@current@textformat@csname}{glstextformat}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@current@innertextformat@csname}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@current@innertextformat@csname}{glsxtrdefaultentrytextfmt}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrassignlinktextfmt}
%\changes{1.49}{2022-10-14}{new}
%Used to assign \cs{glstextformat} and \cs{glsxtrgenentrytextfmt}
%in the post-link hook for \qt{postfootnote} abbreviation styles.
%    \begin{macrocode}
\newcommand*{\glsxtrassignlinktextfmt}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@local@textformat}
%\changes{1.30}{2018-04-25}{new}
%Provide a key to locally change the text format.
%    \begin{macrocode}
\define@key{glslink}{textformat}{%
  \ifcsdef{#1}
  {%
    \letcs{\@glsxtr@local@textformat}{#1}%
    \def\@glsxtr@current@textformat@csname{#1}%
  }%
  {%
    \PackageError{glossaries-extra}{Unknown control sequence name `#1'}{}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@local@innertextformat}
%\changes{1.49}{2022-10-14}{new}
%Provide a key to locally change the inner text format.
%    \begin{macrocode}
\define@key{glslink}{innertextformat}{%
  \ifcsdef{#1}
  {%
    \letcs{\@glsxtr@local@innertextformat}{#1}%
    \def\@glsxtr@current@innertextformat@csname{#1}%
  }%
  {%
    \PackageError{glossaries-extra}{Unknown control sequence name `#1'}{}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\changes{1.31}{2018-05-09}{added \texttt{prefix} key for \texttt{glslink}}
%    \begin{macrocode}
\define@key{glslink}{prefix}{\def\glolinkprefix{#1}}
%    \end{macrocode}
%
%\begin{macro}{\glsxtrinithyperoutside}
%\changes{1.21}{2017-11-03}{new}
%Set the default if the \gloskey[glslink]{hyperoutside} is omitted.
%    \begin{macrocode}
\newcommand*{\glsxtrinithyperoutside}{%
 \glsifattribute{\glslabel}{hyperoutside}{false}%
 {%
   \glsxtr@hyperoutsidefalse
 }%
 {%
   \glsxtr@hyperoutsidetrue
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@inc@linkcount}
%\changes{1.26}{2018-01-05}{new}
%Does nothing by default.
%    \begin{macrocode}
\newcommand*{\glsxtr@inc@linkcount}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslinkpresetkeys}
%\changes{1.26}{2018-01-05}{new}
%User hook performed immediately before options are set. 
%Does nothing by default.
%    \begin{macrocode}
\newcommand*{\glslinkpresetkeys}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrExpandedFmt}
%\changes{1.30}{2018-04-25}{new}
%Helper command that (protected) fully expands second argument and
%then applies it to the first, which must be a command that takes a
%single argument.
%    \begin{macrocode}
\newrobustcmd*{\GlsXtrExpandedFmt}[2]{%
  \protected@edef\@glsxtr@tmp{#2}%
  \expandafter#1\expandafter{\@glsxtr@tmp}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@use@equation@counter@or}
%\changes{1.37}{2018-11-30}{new}
%If in a numbered equation, change the counter to \ctr{equation}.
%This can be overridden by explicitly setting the counter in the
%optional argument of commands like \cs{gls} and \cs{glslink}.
%    \begin{macrocode}
\newcommand*{\@glsxtr@use@equation@counter}{%
  \@glsxtr@ifnum@mmode{\def\@gls@counter{equation}}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@do@autoadd}
%\changes{1.37}{2018-11-30}{new}
%If \cs{GlsXtrAutoAddOnFormat} is used, this will automatically use
%\cs{glsadd}. It's therefore only used with \cs{@gls@link} not with
%\cs{glsadd} otherwise it could trigger an infinite loop. The
%argument indicates the key family (glslink or glossadd).
%    \begin{macrocode}
\newcommand*{\glsxtr@do@autoadd}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrAutoAddOnFormat}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{GlsXtrAutoAddOnFormat}\oarg{label}\marg{format list}\marg{glsadd options}
%\end{definition}
%If an entry is indexed with the format set to one identified in the
%comma-separated list, then automatically index it using \cs{glsadd}
%with the given options, which may override the current options.
%Scoping is needed to prevent leakage.
%    \begin{macrocode}
\newcommand*{\GlsXtrAutoAddOnFormat}[3][\glslabel]{%
  \renewcommand*{\glsxtr@do@autoadd}[1]{%
    \begingroup
      \protected@edef\@glsxtr@do@autoadd{%
         \noexpand\ifstrequal{##1}{glslink}%
         {%
           \noexpand\DTLifinlist
            {\@glsnumberformat}{#2}%
            {\noexpand\glsadd[format={\@glsnumberformat},#3]{#1}}{}%
         }%
         {}%
      }%
      \@glsxtr@do@autoadd
    \endgroup
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrClearAutoAddOnFormat}
%\changes{1.59}{2025-03-18}{new}
%Reset.
%    \begin{macrocode}
\newcommand\GlsXtrClearAutoAddOnFormat{%
 \renewcommand*{\glsxtr@do@autoadd}[1]{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslinkwrcontent}
%\changes{1.48}{2021-11-22}{new}
%\changes{1.49}{2022-10-14}{removed grouping}
%This was defined to add grouping to resolve \href{https://www.dickimaw-books.com/bugtracker.php?key=189}{issue \#189}
%but had unexpected consequences
%(\href{https://www.dickimaw-books.com/bugtracker.php?key=194}{issue
%\#194}) so the grouping has been removed and transferred to
%\cs{glsencapwrcontent}.
%    \begin{macrocode}
\providecommand*{\glslinkwrcontent}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glslink@prefix@label}
%\changes{1.49}{2022-10-14}{new}
% Hyperlink using current prefix and label.
%    \begin{macrocode}
\newcommand*{\@glslink@prefix@label}[1]{%
 \@glslink{\glolinkprefix\glslabel}{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@noglslink@prefix@label}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@noglslink@prefix@label}[1]{%
  \glsdonohyperlink{\glolinkprefix\glslabel}{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@link}
%\changes{1.14}{2017-04-18}{added redefinition}
%Redefine to allow the indexing to be placed after the link text. By
%default this is done before the link text to prevent problems that
%can occur from the whatsit, but there may be times when the user
%would like the indexing done afterwards even though it causes a
%whatsit.
%    \begin{macrocode}
\def\@gls@link[#1]#2#3{%
  \leavevmode
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
  \protected@edef\glslabel{\glsdetoklabel{#2}}%
  \def\@gls@link@opts{#1}%
  \let\@gls@link@label\glslabel
  \let\@glsnumberformat\@glsxtr@defaultnumberformat
  \protected@edef\@gls@counter{\csname glo@\glslabel @counter\endcsname}%
  \protected@edef\glstype{\csname glo@\glslabel @type\endcsname}%
  \let\org@ifKV@glslink@hyper\ifKV@glslink@hyper
%    \end{macrocode}
%Save local setting.
%    \begin{macrocode}
  \@gls@save@glslocal
%    \end{macrocode}
%Initialise preunset, prereset and postunset
%    \begin{macrocode}
  \glsinitreunsets
%    \end{macrocode}
%Save current value of \cs{glolinkprefix}:
%    \begin{macrocode}
  \let\@glsxtr@org@glolinkprefix\glolinkprefix
%    \end{macrocode}
%Initialise \cs{@glsxtr@local@textformat}
%    \begin{macrocode}
  \let\@glsxtr@local@textformat\relax
  \def\@glsxtr@current@textformat@csname{glstextformat}%
%    \end{macrocode}
%Initialise inner text format (1.49):
%    \begin{macrocode}
  \let\@glsxtr@local@innertextformat\glsxtrdefaultentrytextfmt
  \def\@glsxtr@current@innertextformat@csname{glsxtrdefaultentrytextfmt}%
%    \end{macrocode}
% Initialise thevalue and theHvalue (v1.19).
%    \begin{macrocode}
  \def\@glsxtr@thevalue{}%
  \def\@glsxtr@theHvalue{\@glsxtr@thevalue}%
%    \end{macrocode}
% Initialise when indexing should occur (new to v1.14).
%    \begin{macrocode}
  \glsxtrinitwrgloss
%    \end{macrocode}
% Initialise whether \cs{hyperlink} should be outside \cs{glstextformat}
% (new to v1.21).
%    \begin{macrocode}
  \glsxtrinithyperoutside
%    \end{macrocode}
% Note that the default link options may
% override \cs{glsxtrinitwrgloss}.
%    \begin{macrocode}
  \@gls@setdefault@glslink@opts
%    \end{macrocode}
%Increment link counter if enabled (new to v1.26).
%    \begin{macrocode}
   \glsxtr@inc@linkcount
%    \end{macrocode}
% Check if the \pkgopt{equations} option has been set (new to v1.37).
%    \begin{macrocode}
   \if@glsxtr@equations
     \@glsxtr@use@equation@counter
   \fi
%    \end{macrocode}
% As the original definition.
%    \begin{macrocode}
  \do@glsdisablehyperinlist
  \do@gls@link@checkfirsthyper
%    \end{macrocode}
% Provide way of finding if hyper key has been explicitly set.
%    \begin{macrocode}
  \let\@gls@if@glslink@hyper@updated\@secondoftwo
  \let\@gls@link@postkeys@checkfirsthyper\relax
%    \end{macrocode}
%User hook before options are set (new to v1.26):
%    \begin{macrocode}
  \glslinkpresetkeys
%    \end{macrocode}
%Set options.
%    \begin{macrocode}
  \setkeys{glslink}{#1}%
%    \end{macrocode}
%Perform auto add if set (new to v1.37)
%    \begin{macrocode}
  \glsxtr@do@autoadd{glslink}%
%    \end{macrocode}
%User hook after options are set:
%    \begin{macrocode}
  \glslinkpostsetkeys
%    \end{macrocode}
%Reset/unset if required:
%    \begin{macrocode}
  \@gls@do@glsprereset{#2}%
  \@gls@do@glspreunset{#2}%
%    \end{macrocode}
% If the hyper setting hasn't changed, and reset/unset option has
% been used, need to perform another check.
%    \begin{macrocode}
  \@gls@if@glslink@hyper@updated{}{\@gls@link@postkeys@checkfirsthyper}%
%    \end{macrocode}
%Set inner text format (1.49):
%    \begin{macrocode}
  \let\glsxtrgenentrytextfmt\@glsxtr@local@innertextformat
%    \end{macrocode}
% Check \gloskey[glslink]{thevalue} and \gloskey[glslink]{theHvalue}
% before saving (v1.19).
%    \begin{macrocode}
  \ifdefempty{\@glsxtr@thevalue}%
  {%
    \@gls@saveentrycounter
  }%
  {%
    \let\theglsentrycounter\@glsxtr@thevalue
    \def\theHglsentrycounter{\@glsxtr@theHvalue}%
  }%
  \@gls@setsort{\glslabel}%
%    \end{macrocode}
%Check if the \gloskey[glslink]{textformat} key has been used.
%    \begin{macrocode}
  \ifx\@glsxtr@local@textformat\relax
%    \end{macrocode}
% Check \catattr{textformat} attribute (new to v1.21).
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
     \glshasattribute{\glslabel}{textformat}%
     {%
       \protected@edef\@glsxtr@attrval{\glsgetattribute{\glslabel}{textformat}}%
       \ifcsdef{\@glsxtr@attrval}%
       {%
         \letcs{\@glsxtr@textformat}{\@glsxtr@attrval}%
         \let\@glsxtr@current@textformat@csname\@glsxtr@attrval
       }%
       {%
         \GlossariesExtraWarning{Unknown control sequence name 
         `\@glsxtr@attrval' supplied in textformat attribute
         for entry `\glslabel'. Reverting to default \string\glstextformat}%
         \let\@glsxtr@textformat\glstextformat
       }%
     }%
     {%
       \let\@glsxtr@textformat\glstextformat
     }%
  \else
     \let\@glsxtr@textformat\@glsxtr@local@textformat
  \fi
%    \end{macrocode}
%Setup formatting assignments for use in post-link hook.
%    \begin{macrocode}
  \edef\glsxtrassignlinktextfmt{%
    \noexpand\def\noexpand\glslabel{\expandonce\glslabel}%
    \noexpand\letcs\noexpand\glstextformat{\@glsxtr@current@textformat@csname}%
    \noexpand\letcs\noexpand\glsxtrgenentrytextfmt
      {\@glsxtr@current@innertextformat@csname}%
  }%
%    \end{macrocode}
% Encapsulate link text and indexing.
%    \begin{macrocode}
  \glslinkwrcontent
  {%
%    \end{macrocode}
% Do write if it should occur before the link text:
%    \begin{macrocode}
    \ifglsxtrinitwrglossbefore
      \glsxtr@wrglossary@encap{#2}{\@do@wrglossary{#2}}%
    \fi
%    \end{macrocode}
% Do the link text:
%    \begin{macrocode}
    \ifKV@glslink@hyper
      \ifglsxtr@hyperoutside
       \@glslink@prefix@label{\@glsxtr@textformat{#3}}%
      \else
       \@glsxtr@textformat{\@glslink@prefix@label{#3}}%
      \fi
    \else
      \ifglsxtr@hyperoutside
       \@noglslink@prefix@label{\@glsxtr@textformat{#3}}%
      \else
       \@glsxtr@textformat{\@noglslink@prefix@label{#3}}%
      \fi
    \fi
%    \end{macrocode}
% Do write if it should occur after the link text:
%    \begin{macrocode}
    \ifglsxtrinitwrglossbefore
    \else
      \glsxtr@wrglossary@encap{#2}{\@do@wrglossary{#2}}%
    \fi
  }%
%    \end{macrocode}
%Restore original value of \cs{glolinkprefix}:
%    \begin{macrocode}
  \let\glolinkprefix\@glsxtr@org@glolinkprefix
%    \end{macrocode}
% As the original definition:
%    \begin{macrocode}
  \let\ifKV@glslink@hyper\org@ifKV@glslink@hyper
  \@gls@restore@glslocal
}
%    \end{macrocode}
%\end{macro}
%
%\changes{1.14}{2017-04-18}{added \cs{glsadd} option \texttt{thevalue}}
%    \begin{macrocode}
\define@key{glossadd}{thevalue}{\def\@glsxtr@thevalue{#1}}
%    \end{macrocode}
%
%\changes{1.14}{2017-04-18}{added \cs{glsadd} option \texttt{theHvalue}}
%    \begin{macrocode}
\define@key{glossadd}{theHvalue}{\def\@glsxtr@theHvalue{#1}}
%    \end{macrocode}
%
%\begin{macro}{\glsaddpresetkeys}
%\changes{1.30}{2018-04-25}{new}
%    \begin{macrocode}
\newcommand*{\glsaddpresetkeys}{}
%    \end{macrocode}
%\end{macro}

%\begin{macro}{\glsaddpostsetkeys}
%\changes{1.30}{2018-04-25}{new}
%    \begin{macrocode}
\newcommand*{\glsaddpostsetkeys}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsadd}
%\changes{1.08}{2016-12-13}{added \cs{@glsxtr@record}}
%\changes{1.37}{2018-11-30}{added grouping}
%Redefine to include \cs{@glsxtr@record} and suppress in headings
%    \begin{macrocode}
\renewrobustcmd*{\glsadd}[2][]{%
  \glsxtrifinmark
  {}%
  {%
    \@gls@adjustmode
    \begingroup
    \@glsadd{#1}{#2}%
    \endgroup
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsadd}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\@glsadd}[2]{%
  \@glsxtr@record{#1}{#2}{glossadd}%
  \glsdoifexists{#2}%
  {%
    \let\@glsnumberformat\@glsxtr@defaultnumberformat
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
    \protected@edef\@gls@counter{\csname glo@\glsdetoklabel{#2}@counter\endcsname}%
    \def\@glsxtr@thevalue{}%
    \def\@glsxtr@theHvalue{\@glsxtr@thevalue}%
%    \end{macrocode}
%Implement any default settings (before options are set)
%\changes{1.30}{2018-04-25}{added \cs{glsaddpresetkeys}}
%    \begin{macrocode}
    \glsaddpresetkeys
    \setkeys{glossadd}{#1}%
%    \end{macrocode}
%Implement any default settings (after options are set)
%\changes{1.30}{2018-04-25}{added \cs{glsaddpostsetkeys}}
%    \begin{macrocode}
    \glsaddpostsetkeys
    \ifdefempty{\@glsxtr@thevalue}%
    {%
      \@gls@saveentrycounter
    }%
    {%
      \let\theglsentrycounter\@glsxtr@thevalue
      \def\theHglsentrycounter{\@glsxtr@theHvalue}%
    }%
%    \end{macrocode}
% Define sort key if necessary (in case of \pkgopt[use]{sort}):
%\changes{1.24}{2017-11-14}{added \cs{@gls@setsort}}
%    \begin{macrocode}
    \@gls@setsort{#2}%
%    \end{macrocode}
%Ensure that indexing occurs (since that's the point of
%\cs{glsadd}). If indexing has been switched off by default, don't
%want the setting to affect \cs{glsadd}. The ignored format
%\cs{glsignore} can be used for selection without location, but the
%indexing still needs to be performed.
%\changes{1.37}{2018-11-30}{ensure that \cs{glsadd} performs indexing}
%    \begin{macrocode}
    \KV@glslink@noindexfalse
    \glsxtr@wrglossary@encap{#2}{\@@do@wrglossary{#2}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaddeach}
%\changes{1.31}{2018-05-09}{new}
%Performs \cs{glsadd} for each entry listed in the mandatory
%argument.
%    \begin{macrocode}
\newrobustcmd{\glsaddeach}[2][]{%
  \glsxtrifinmark
  {}%
  {%
    \@gls@adjustmode
    \@for\@gls@thislabel:=#2\do{{\@glsadd{#1}{\@gls@thislabel}}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@rangeformat}
%\changes{1.50}{2018-05-09}{new}
%    \begin{macrocode}
\newcommand{\glsxtr@rangeformat}{\@glsxtr@defaultnumberformat}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrSetDefaultRangeFormat}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrSetDefaultRangeFormat}[1]{%
  \renewcommand*{\glsxtr@rangeformat}{#1}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsstartrange}
%\changes{1.50}{2018-05-09}{new}
%Essentially does \cs{glsadd}[format=(]\marg{label}
%    \begin{macrocode}
\newrobustcmd{\glsstartrange}[2][]{%
  \glsxtrifinmark
  {}%
  {%
    \@gls@adjustmode
    \begingroup
    \appto\glsaddpresetkeys{\protected@edef\@glsnumberformat{\glsxtr@rangeformat}}%
    \appto\glsaddpostsetkeys{\protected@edef\@glsnumberformat{(\@glsnumberformat}}%
    \@for\@gls@thislabel:=#2\do{\@glsadd{#1}{\@gls@thislabel}}%
    \endgroup
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsendrange}
%\changes{1.50}{2018-05-09}{new}
%Essentially does \cs{glsadd}[format=)]\marg{label}
%    \begin{macrocode}
\newrobustcmd{\glsendrange}[2][]{%
  \glsxtrifinmark
  {}%
  {%
    \@gls@adjustmode
    \begingroup
    \appto\glsaddpresetkeys{\protected@edef\@glsnumberformat{\glsxtr@rangeformat}}%
    \appto\glsaddpostsetkeys{\protected@edef\@glsnumberformat{)\@glsnumberformat}}%
    \@for\@gls@thislabel:=#2\do{\@glsadd{#1}{\@gls@thislabel}}%
    \endgroup
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@field@linkdefs}
% Default settings for \cs{@gls@field@link}.
%\changes{0.3}{2015-12-02}{new}
%\changes{1.49}{2022-10-14}{removed \cs{glsinsert}}
%Note that from v1.49, \cs{glsinsert} is set with
%\cs{glsxtrsaveinsert}.
%    \begin{macrocode}
\newcommand*{\@glsxtr@field@linkdefs}{%
  \let\glsxtrifwasglslike\@secondoftwo
  \let\glsxtrifwasfirstuse\@secondoftwo
  \let\glsifplural\@secondoftwo
  \let\glscapscase\@firstofthree
}
%    \end{macrocode}
%\end{macro}
%
%Redefine the field link commands that need to modify the above.
%Also add accessibility support and set the abbreviation styles if
%required.
%\begin{macro}{\glsxtrassignfieldfont}
%\changes{1.04}{2016-05-02}{new}
%\changes{1.08}{2016-12-13}{added check for existence}
%    \begin{macrocode}
\newcommand*{\glsxtrassignfieldfont}[1]{%
  \ifglsentryexists{#1}%
  {%
    \ifglshasshort{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
      \glsifregular{#1}%
      {\let\@gls@field@font\glsxtrregularfont}%
      {\let\@gls@field@font\@firstofone}%
    }%
    {%
      \glsifnotregular{#1}%
      {\let\@gls@field@font\@firstofone}%
      {\let\@gls@field@font\glsxtrregularfont}%
    }%
  }%
  {%
    \let\@gls@field@font\@gobble
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsaveinsert}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsxtrsaveinsert}\marg{entry-label}\marg{insert}
%\end{definition}
%The insert argument isn't saved in \cs{glsinsert} for the
%\cs{glslike} commands, but provide a way to save it if it is
%required for the post-link hook. The default is to set
%\cs{glsinsert} to empty. This means that the insert won't appear in
%the post-link hook with commands like \cs{glsxtrfull} for the
%hyphen abbreviation styles. The entry label is provided in case the
%insert should only be saved for certain entries, such as those with
%a particular category.
%    \begin{macrocode}
\newcommand*{\glsxtrsaveinsert}[2]{\def\glsinsert{}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfullsaveinsert}
%\changes{1.49}{2022-10-14}{new}
%As above but specifically for commands like \cs{glsxtrfull}
%    \begin{macrocode}
\newcommand*{\glsxtrfullsaveinsert}{\glsxtrsaveinsert}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glstext@}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@glstext@#1#2[#3]{%
  \def\glsxtrcurrentfield{text}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{text}%
    {%
      \@gls@field@font{\glsaccessfmttext{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccesstext{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLStext@}
% All uppercase version of \cs{glstext}.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@GLStext@#1#2[#3]{%
  \def\glsxtrcurrentfield{text}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link[\let\glscapscase\@thirdofthree]{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{text}%
    {%
      \@gls@field@font{\GLSaccessfmttext{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \ifx\glscapscase\@thirdofthree
        \@gls@field@font{\GLSaccesstext{#2}%
          \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
      \else
        \@gls@field@font{\glsaccesstext{#2}\glsxtrgenentrytextfmt{#3}}%
      \fi
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glstext@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@Glstext@#1#2[#3]{%
  \def\glsxtrcurrentfield{text}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link[\let\glscapscase\@secondofthree]{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{text}%
    {%
      \@gls@field@font{\Glsaccessfmttext{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccesstext{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%Version 1.07 ensures that \cs{glsfirst} etc honours the
%\catattr{nohyperfirst} attribute. Allow a convenient way for the
%user to revert to ignoring this attribute for these commands.
%\begin{macro}{\glsxtrchecknohyperfirst}
%\changes{1.07}{2016-08-15}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrchecknohyperfirst}[1]{%
  \glsifattribute{#1}{nohyperfirst}{true}{\KV@glslink@hyperfalse}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsfirst@}
% No case changing version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@glsfirst@#1#2[#3]{%
  \def\glsxtrcurrentfield{first}%
  \glsxtrassignfieldfont{#2}%
%    \end{macrocode}
% Ensure that \cs{glsfirst} honours the \catattr{nohyperfirst} attribute.
%\changes{1.07}{2016-08-15}{added check for nohyperfirst attribute}
%    \begin{macrocode}
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glsxtrifwasfirstuse\@firstoftwo
   \glsxtrchecknohyperfirst{#2}%
   \glsxtr@check@complexstyle{#2}{#3}%
  ]{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{first}%
    {%
      \@gls@field@font{\glsaccessfmtfirst{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessfirst{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsfirst@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@Glsfirst@#1#2[#3]{%
  \def\glsxtrcurrentfield{first}%
  \glsxtrassignfieldfont{#2}%
%    \end{macrocode}
% Ensure that \cs{Glsfirst} honours the \catattr{nohyperfirst} attribute.
%\changes{1.07}{2016-08-15}{added check for nohyperfirst attribute}
%    \begin{macrocode}
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glsxtrifwasfirstuse\@firstoftwo
   \let\glscapscase\@secondofthree
   \glsxtrchecknohyperfirst{#2}%
   \glsxtr@check@complexstyle{#2}{#3}%
  ]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{first}%
    {%
      \@gls@field@font{\Glsaccessfmtfirst{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccessfirst{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSfirst@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set abbreviation format}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@GLSfirst@#1#2[#3]{%
  \def\glsxtrcurrentfield{first}%
  \glsxtrassignfieldfont{#2}%
%    \end{macrocode}
% Ensure that \cs{GLSfirst} honours the \catattr{nohyperfirst} attribute.
%\changes{1.07}{2016-08-15}{added check for nohyperfirst attribute}
%    \begin{macrocode}
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glsxtrifwasfirstuse\@firstoftwo
   \let\glscapscase\@thirdofthree
   \glsxtrchecknohyperfirst{#2}%
   \glsxtr@check@complexstyle{#2}{#3}%
  ]%
  {#1}{#2}%
  {%
   \ifx\glscapscase\@thirdofthree
    \glsifapplyinnerfmtfield{#2}{first}%
    {%
      \@gls@field@font{\GLSaccessfmtfirst{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\GLSaccessfirst{#2}%
        \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
    }%
   \else
    \glsifapplyinnerfmtfield{#2}{first}%
    {%
      \@gls@field@font{\glsaccessfmtfirst{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessfirst{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
   \fi
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsplural@}
% No case changing version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.03}{2016-04-27}{fixed bug \cs{@glsplural@} should be redefined
%not \cs{@glsplural}}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@glsplural@#1#2[#3]{%
  \def\glsxtrcurrentfield{text}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
   [\let\glsifplural\@firstoftwo
    \glsxtr@check@complexstyle{#2}{#3}%
   ]{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{plural}%
    {%
      \@gls@field@font{\glsaccessfmtplural{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessplural{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsplural@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.03}{2016-04-27}{fixed bug \cs{@Glsplural@} should be redefined
%not \cs{@Glsplural}}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@Glsplural@#1#2[#3]{%
  \def\glsxtrcurrentfield{text}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glsifplural\@firstoftwo
   \let\glscapscase\@secondofthree
    \glsxtr@check@complexstyle{#2}{#3}%
  ]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{plural}%
    {%
      \@gls@field@font{\Glsaccessfmtplural{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccessplural{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSplural@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.03}{2016-04-27}{fixed bug \cs{@GLSplural@} should be redefined
%not \cs{@GLSplural}}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@GLSplural@#1#2[#3]{%
  \def\glsxtrcurrentfield{text}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glsifplural\@firstoftwo
   \let\glscapscase\@thirdofthree
   \glsxtr@check@complexstyle{#2}{#3}%
  ]%
  {#1}{#2}%
  {%
   \ifx\glscapscase\@thirdofthree
    \glsifapplyinnerfmtfield{#2}{plural}%
    {%
      \@gls@field@font{\GLSaccessfmtplural{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\GLSaccessplural{#2}%
         \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
    }%
   \else
    \glsifapplyinnerfmtfield{#2}{plural}%
    {%
      \@gls@field@font{\glsaccessfmtplural{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessplural{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
   \fi
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsfirstplural@}
% No case changing version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@glsfirstplural@#1#2[#3]{%
  \def\glsxtrcurrentfield{first}%
  \glsxtrassignfieldfont{#2}%
%    \end{macrocode}
% Ensure that \cs{glsfirstplural} honours the \catattr{nohyperfirst} attribute.
%\changes{1.07}{2016-08-15}{added check for nohyperfirst attribute}
%    \begin{macrocode}
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glsxtrifwasfirstuse\@firstoftwo
   \let\glsifplural\@firstoftwo
   \glsxtrchecknohyperfirst{#2}%
   \glsxtr@check@complexstyle{#2}{#3}%
  ]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{firstpl}%
    {%
      \@gls@field@font{\glsaccessfmtfirstplural{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessfirstplural{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsfirstplural@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.03}{2016-04-27}{bug fix: misspelt cs name}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@Glsfirstplural@#1#2[#3]{%
  \def\glsxtrcurrentfield{first}%
  \glsxtrassignfieldfont{#2}%
%    \end{macrocode}
% Ensure that \cs{glsfirstplural} honours the \catattr{nohyperfirst} attribute.
%\changes{1.07}{2016-08-15}{added check for nohyperfirst attribute}
%    \begin{macrocode}
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glsxtrifwasfirstuse\@firstoftwo
   \let\glsifplural\@firstoftwo
   \let\glscapscase\@secondofthree
   \glsxtrchecknohyperfirst{#2}%
   \glsxtr@check@complexstyle{#2}{#3}%
  ]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{firstpl}%
    {%
      \@gls@field@font{\Glsaccessfmtfirstplural{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccessfirstplural{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSfirstplural@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.03}{2016-04-27}{bug fix: misspelt cs name}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@GLSfirstplural@#1#2[#3]{%
  \def\glsxtrcurrentfield{first}%
  \glsxtrassignfieldfont{#2}%
%    \end{macrocode}
% Ensure that \cs{glsfirstplural} honours the \catattr{nohyperfirst} attribute.
%\changes{1.07}{2016-08-15}{added check for nohyperfirst attribute}
%    \begin{macrocode}
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glsxtrifwasfirstuse\@firstoftwo
   \let\glsifplural\@firstoftwo
   \let\glscapscase\@thirdofthree
   \glsxtrchecknohyperfirst{#2}%
   \glsxtr@check@complexstyle{#2}{#3}%
  ]%
  {#1}{#2}%
  {%
   \ifx\glscapscase\@thirdofthree
    \glsifapplyinnerfmtfield{#2}{firstpl}%
    {%
      \@gls@field@font{\GLSaccessfmtfirstplural{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\GLSaccessfirstplural{#2}%
       \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
    }%
   \else
    \glsifapplyinnerfmtfield{#2}{firstpl}%
    {%
      \@gls@field@font{\glsaccessfmtfirstplural{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessfirstplural{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
   \fi
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsname@}
% Redefine to use accessibility support.
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@glsname@#1#2[#3]{%
  \def\glsxtrcurrentfield{name}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{name}%
    {%
      \@gls@field@font{\glsaccessfmtname{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessname{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsname@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%\changes{0.5.2}{2015-12-08}{add accessibility support}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@Glsname@#1#2[#3]{%
  \def\glsxtrcurrentfield{name}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@secondofthree]{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{name}%
    {%
      \@gls@field@font{\Glsaccessfmtname{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccessname{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSname@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
% The abbreviation format may also need setting.
%    \begin{macrocode}
\def\@GLSname@#1#2[#3]{%
  \def\glsxtrcurrentfield{name}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link[\let\glscapscase\@thirdofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{name}%
    {%
      \@gls@field@font{\GLSaccessfmtname{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\GLSaccessname{#2}%
       \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsdesc@}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%    \begin{macrocode}
\def\@glsdesc@#1#2[#3]{%
  \def\glsxtrcurrentfield{description}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{desc}%
    {%
      \@gls@field@font{\glsaccessfmtdesc{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessdesc{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsdesc@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%    \begin{macrocode}
\def\@Glsdesc@#1#2[#3]{%
  \def\glsxtrcurrentfield{description}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@secondofthree]{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{desc}%
    {%
      \@gls@field@font{\Glsaccessfmtdesc{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccessdesc{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSdesc@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%    \begin{macrocode}
\def\@GLSdesc@#1#2[#3]{%
  \def\glsxtrcurrentfield{description}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link[\let\glscapscase\@thirdofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{desc}%
    {%
      \@gls@field@font{\GLSaccessfmtdesc{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\GLSaccessdesc{#2}%
       \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsdescplural@}
% No case-changing version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%    \begin{macrocode}
\def\@glsdescplural@#1#2[#3]{%
  \def\glsxtrcurrentfield{description}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@secondofthree
   \let\glsifplural\@firstoftwo
  ]{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{descplural}%
    {%
      \@gls@field@font{\glsaccessfmtdescpl{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessdescplural{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsdescplural@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%    \begin{macrocode}
\def\@Glsdescplural@#1#2[#3]{%
  \def\glsxtrcurrentfield{description}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@secondofthree
   \let\glsifplural\@firstoftwo
  ]{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{descplural}%
    {%
      \@gls@field@font{\Glsaccessfmtdescpl{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccessdescplural{#2}#3}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSdescplural@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set abbreviation and regular format}
%    \begin{macrocode}
\def\@GLSdescplural@#1#2[#3]{%
  \def\glsxtrcurrentfield{description}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@thirdofthree
   \let\glsifplural\@firstoftwo
  ]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{descplural}%
    {%
      \@gls@field@font{\GLSaccessfmtdescplural{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\GLSaccessdescplural{#2}%
        \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glssymbol@}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@glssymbol@#1#2[#3]{%
  \def\glsxtrcurrentfield{symbol}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{symbol}%
    {%
      \@gls@field@font{\glsaccessfmtsymbol{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccesssymbol{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glssymbol@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@Glssymbol@#1#2[#3]{%
  \def\glsxtrcurrentfield{symbol}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@secondofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{symbol}%
    {%
      \@gls@field@font{\Glsaccessfmtsymbol{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccesssymbol{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSsymbol@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@GLSsymbol@#1#2[#3]{%
  \def\glsxtrcurrentfield{symbol}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link[\let\glscapscase\@thirdofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{symbol}%
    {%
      \@gls@field@font{\GLSaccessfmtsymbol{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\GLSaccesssymbol{#2}%
       \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glssymbolplural@}
% No case-changing version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@glssymbolplural@#1#2[#3]{%
  \def\glsxtrcurrentfield{symbol}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@secondofthree
   \let\glsifplural\@firstoftwo
  ]{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{symbolplural}%
    {%
      \@gls@field@font{\glsaccessfmtsymbolplural{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccesssymbolplural{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glssymbolplural@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@Glssymbolplural@#1#2[#3]{%
  \def\glsxtrcurrentfield{symbol}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@secondofthree
   \let\glsifplural\@firstoftwo
  ]{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{symbolplural}%
    {%
      \@gls@field@font{\Glsaccessfmtsymbolplural{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccesssymbolplural{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSsymbolplural@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{0.5.2}{2015-12-08}{added accessibility support}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@GLSsymbolplural@#1#2[#3]{%
  \def\glsxtrcurrentfield{symbol}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@thirdofthree
   \let\glsifplural\@firstoftwo
  ]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{symbolplural}%
    {%
      \@gls@field@font{\GLSaccessfmtsymbolplural{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\GLSaccesssymbolplural{#2}%
        \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsuseri@}
% User 1 field.
%\changes{1.49}{2022-10-14}{added redefinition}
%    \begin{macrocode}
\def\@glsuseri@#1#2[#3]{%
  \def\glsxtrcurrentfield{user1}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{useri}%
    {%
      \@gls@field@font{\glsaccessfmtuseri{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessuseri{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsuseri@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@Glsuseri@#1#2[#3]{%
  \def\glsxtrcurrentfield{user1}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@secondofthree]{#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{useri}%
    {%
      \@gls@field@font{\Glsaccessfmtuseri{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccessuseri{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSuseri@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@GLSuseri@#1#2[#3]{%
  \def\glsxtrcurrentfield{user1}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link[\let\glscapscase\@thirdofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{useri}%
    {%
      \@gls@field@font{\GLSaccessfmtuseri{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \ifx\glscapscase\@thirdofthree
        \@gls@field@font{\GLSaccessuseri{#2}%
          \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
      \else
        \@gls@field@font{\glsaccessuseri{#2}\glsxtrgenentrytextfmt{#3}}%
      \fi
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsuserii@}
% User 2 field.
%\changes{1.49}{2022-10-14}{added redefinition}
%    \begin{macrocode}
\def\@glsuserii@#1#2[#3]{%
  \def\glsxtrcurrentfield{user2}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{userii}%
    {%
      \@gls@field@font{\glsaccessfmtuserii{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessuserii{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsuserii@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@Glsuserii@#1#2[#3]{%
  \def\glsxtrcurrentfield{user2}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@secondofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{userii}%
    {%
      \@gls@field@font{\Glsaccessfmtuserii{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccessuserii{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSuserii@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@GLSuserii@#1#2[#3]{%
  \def\glsxtrcurrentfield{user2}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link[\let\glscapscase\@thirdofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{userii}%
    {%
      \@gls@field@font{\GLSaccessfmtuserii{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \ifx\glscapscase\@thirdofthree
        \@gls@field@font{\GLSaccessuserii{#2}%
          \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
      \else
        \@gls@field@font{\glsaccessuserii{#2}\glsxtrgenentrytextfmt{#3}}%
      \fi
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsuseriii@}
% User 3 field.
%\changes{1.49}{2022-10-14}{added redefinition}
%    \begin{macrocode}
\def\@glsuseriii@#1#2[#3]{%
  \def\glsxtrcurrentfield{user3}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{useriii}%
    {%
      \@gls@field@font{\glsaccessfmtuseriii{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessuseriii{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsuseriii@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@Glsuseriii@#1#2[#3]{%
  \def\glsxtrcurrentfield{user3}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@secondofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{useriii}%
    {%
      \@gls@field@font{\Glsaccessfmtuseriii{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccessuseriii{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSuseriii@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@GLSuseriii@#1#2[#3]{%
  \def\glsxtrcurrentfield{user3}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link[\let\glscapscase\@thirdofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{useriii}%
    {%
      \@gls@field@font{\GLSaccessfmtuseriii{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \ifx\glscapscase\@thirdofthree
        \@gls@field@font{\GLSaccessuseriii{#2}%
          \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
      \else
        \@gls@field@font{\glsaccessuseriii{#2}\glsxtrgenentrytextfmt{#3}}%
      \fi
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsuseriv@}
% User 4 field.
%\changes{1.49}{2022-10-14}{added redefinition}
%    \begin{macrocode}
\def\@glsuseriv@#1#2[#3]{%
  \def\glsxtrcurrentfield{user4}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{useriv}%
    {%
      \@gls@field@font{\glsaccessfmtuseriv{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessuseriv{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsuseriv@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@Glsuseriv@#1#2[#3]{%
  \def\glsxtrcurrentfield{user4}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@secondofthree]%
   {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{useriv}%
    {%
      \@gls@field@font{\Glsaccessfmtuseriv{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccessuseriv{#2}#3}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSuseriv@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@GLSuseriv@#1#2[#3]{%
  \def\glsxtrcurrentfield{user4}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link[\let\glscapscase\@thirdofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{useriv}%
    {%
      \@gls@field@font{\GLSaccessfmtuseriv{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \ifx\glscapscase\@thirdofthree
        \@gls@field@font{\GLSaccessuseriv{#2}%
          \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
      \else
        \@gls@field@font{\glsaccessuseriv{#2}\glsxtrgenentrytextfmt{#3}}%
      \fi
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsuserv@}
% User 5 field.
%\changes{1.49}{2022-10-14}{added redefinition}
%    \begin{macrocode}
\def\@glsuserv@#1#2[#3]{%
  \def\glsxtrcurrentfield{user5}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{userv}%
    {%
      \@gls@field@font{\glsaccessfmtuserv{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessuserv{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsuserv@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@Glsuserv@#1#2[#3]{%
  \def\glsxtrcurrentfield{user5}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@secondofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{userv}%
    {%
      \@gls@field@font{\Glsfmtfield{#3}{\glsxtrgenentrytextfmt}{#2}{userv}}%
    }%
    {%
      \@gls@field@font{\Glsentryuserv{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSuserv@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@GLSuserv@#1#2[#3]{%
  \def\glsxtrcurrentfield{user5}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link[\let\glscapscase\@thirdofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{userv}%
    {%
      \@gls@field@font{\GLSaccessfmtuserv{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \ifx\glscapscase\@thirdofthree
        \@gls@field@font{\GLSaccessuserv{#2}%
          \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
      \else
        \@gls@field@font{\glsaccessuserv{#2}\glsxtrgenentrytextfmt{#3}}%
      \fi
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsuservi@}
% User 6 field.
%\changes{1.49}{2022-10-14}{added redefinition}
%    \begin{macrocode}
\def\@glsuservi@#1#2[#3]{%
  \def\glsxtrcurrentfield{user6}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{uservi}%
    {%
      \@gls@field@font{\glsaccessfmtuservi{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\glsaccessuservi{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsuservi@}
% First letter uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@Glsuservi@#1#2[#3]{%
  \def\glsxtrcurrentfield{user6}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link
  [\let\glscapscase\@secondofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{uservi}%
    {%
      \@gls@field@font{\Glsaccessfmtuservi{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \@gls@field@font{\Glsaccessuservi{#2}\glsxtrgenentrytextfmt{#3}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSuservi@}
% All uppercase version.
%\changes{0.3}{2015-12-02}{added redefinition}
%\changes{1.04}{2016-05-02}{set regular format}
%    \begin{macrocode}
\def\@GLSuservi@#1#2[#3]{%
  \def\glsxtrcurrentfield{user6}%
  \glsxtrassignfieldfont{#2}%
  \glsxtrsaveinsert{#2}{#3}%
  \@gls@field@link[\let\glscapscase\@thirdofthree]%
  {#1}{#2}%
  {%
    \glsifapplyinnerfmtfield{#2}{uservi}%
    {%
      \@gls@field@font{\GLSaccessfmtuservi{#3}{\glsxtrgenentrytextfmt}{#2}}%
    }%
    {%
      \ifx\glscapscase\@thirdofthree
        \@gls@field@font{\GLSaccessuservi{#2}%
          \glsuppercase{\glsxtrgenentrytextfmt{#3}}}%
      \else
        \@gls@field@font{\glsaccessuservi{#2}\glsxtrgenentrytextfmt{#3}}%
      \fi
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%Commands like \cs{acrshort} already set \cs{glsifplural}, but they
%don't set \cs{glsxtrifwasfirstuse} so they need adjusting. These
%commands shouldn't be used with \cs{newabbreviation}, but the
%redefinitions below allow for users reverting \cs{newacronym} back 
%to its base definition.
%
%\begin{macro}{\@@glsxtr@base@acrcmd@warn}
% Warn user that they need to use to new abbreviation commands.
%    \begin{macrocode}
\newcommand*{\@@glsxtr@base@acrcmd@warn}[2]{%
  \GlossariesExtraWarning{Base acronym command \string#1\space
   should not be used with new abbreviation definitions. Use
   \string#2\space instead}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@base@acrcmd}
%\changes{1.42}{2020-02-03}{new}
% Warn user that they need to use to new abbreviation commands.
%    \begin{macrocode}
\let\@glsxtr@base@acrcmd\@@glsxtr@base@acrcmd@warn
%    \end{macrocode}
%\end{macro}
%
%The following acr commands don't support innertextformat.
%
%\begin{macro}{\@acrshort}
%\changes{0.3}{2015-12-02}{added redefinition}
% No case change.
%    \begin{macrocode}
\def\@acrshort#1#2[#3]{%
  \def\glsxtrcurrentfield{short}%
  \@glsxtr@base@acrcmd\acrshort\glsxtrshort
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\glsaccessshort{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Acrshort}
%\changes{0.3}{2015-12-02}{added redefinition}
% First letter uppercase.
%    \begin{macrocode}
\def\@Acrshort#1#2[#3]{%
  \def\glsxtrcurrentfield{short}%
  \@glsxtr@base@acrcmd\Acrshort\Glsxtrshort
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\Glsaccessshort{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@ACRshort}
%\changes{0.3}{2015-12-02}{added redefinition}
% All uppercase.
%    \begin{macrocode}
\def\@ACRshort#1#2[#3]{%
  \def\glsxtrcurrentfield{short}%
  \@glsxtr@base@acrcmd\ACRshort\GLSxtrshort
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \glsuppercase{\acronymfont{\glsaccessshort{#2}}#3}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@acrshortpl}
%\changes{0.3}{2015-12-02}{added redefinition}
% No case change.
%    \begin{macrocode}
\def\@acrshortpl#1#2[#3]{%
  \def\glsxtrcurrentfield{short}%
  \@glsxtr@base@acrcmd\acrshortpl\glsxtrshortpl
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\glsaccessshortpl{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Acrshortpl}
%\changes{0.3}{2015-12-02}{added redefinition}
% First letter uppercase.
%    \begin{macrocode}
\def\@Acrshortpl#1#2[#3]{%
  \def\glsxtrcurrentfield{short}%
  \@glsxtr@base@acrcmd\Acrshortpl\Glsxtrshortpl
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\Glsaccessshortpl{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@ACRshortpl}
%\changes{0.3}{2015-12-02}{added redefinition}
% All uppercase.
%    \begin{macrocode}
\def\@ACRshortpl#1#2[#3]{%
  \def\glsxtrcurrentfield{short}%
  \@glsxtr@base@acrcmd\ACRshortpl\GLSxtrshortpl
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \glsuppercase{\acronymfont{\glsaccessshortpl{#2}}#3}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@acrlong}
%\changes{0.3}{2015-12-02}{added redefinition}
% No case change.
%    \begin{macrocode}
\def\@acrlong#1#2[#3]{%
  \def\glsxtrcurrentfield{long}%
  \@glsxtr@base@acrcmd\acrlong\glsxtrlong
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\glsaccesslong{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Acrlong}
%\changes{0.3}{2015-12-02}{added redefinition}
% First letter uppercase.
%    \begin{macrocode}
\def\@Acrlong#1#2[#3]{%
  \def\glsxtrcurrentfield{long}%
  \@glsxtr@base@acrcmd\Acrlong\Glsxtrlong
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\Glsaccesslong{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@ACRlong}
%\changes{0.3}{2015-12-02}{added redefinition}
% All uppercase.
%    \begin{macrocode}
\def\@ACRlong#1#2[#3]{%
  \def\glsxtrcurrentfield{long}%
  \@glsxtr@base@acrcmd\ACRlong\GLSxtrlong
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \glsuppercase{\acronymfont{\glsaccesslong{#2}}#3}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@acrlongpl}
%\changes{0.3}{2015-12-02}{added redefinition}
% No case change.
%    \begin{macrocode}
\def\@acrlongpl#1#2[#3]{%
  \def\glsxtrcurrentfield{long}%
  \@glsxtr@base@acrcmd\acrlongpl\glsxtrlongpl
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\glsaccesslongpl{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Acrlongpl}
%\changes{0.3}{2015-12-02}{added redefinition}
% First letter uppercase.
%    \begin{macrocode}
\def\@Acrlongpl#1#2[#3]{%
  \def\glsxtrcurrentfield{long}%
  \@glsxtr@base@acrcmd\Acrlongpl\Glsxtrlongpl
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\Glsaccesslongpl{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@ACRlongpl}
%\changes{0.3}{2015-12-02}{added redefinition}
% All uppercase.
%    \begin{macrocode}
\def\@ACRlongpl#1#2[#3]{%
  \def\glsxtrcurrentfield{long}%
  \@glsxtr@base@acrcmd\ACRlongpl\GLSxtrlongpl
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \glsuppercase{\acronymfont{\glsaccesslongpl{#2}}#3}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%The full formats use the internal long and short commands (such as
%\cs{@acrshort} and \cs{@acrlong}). Therefore they don't need
%adjustments, but they do need clearer warnings. This means three
%warnings per use (once for the full command and once each for the
%short and long commands), but at least this way the most important
%warning (replace \cs{acrfull} with \cs{glsxtrfull} etc) is present.
%
%\begin{macro}{\@acrfull}
%\changes{1.42}{2020-02-03}{added redefinition}
%    \begin{macrocode}
\def\@acrfull#1#2[#3]{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@base@acrcmd\acrfull\glsxtrfull
  \acrfullfmt{#1}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Acrfull}
%\changes{1.42}{2020-02-03}{added redefinition}
%    \begin{macrocode}
\def\@Acrfull#1#2[#3]{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@base@acrcmd\Acrfull\Glsxtrfull
  \Acrfullfmt{#1}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@ACRfull}
%\changes{1.42}{2020-02-03}{added redefinition}
%    \begin{macrocode}
\def\@ACRfull#1#2[#3]{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@base@acrcmd\ACRfull\GLSxtrfull
  \ACRfullfmt{#1}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@acrfullpl}
%\changes{1.42}{2020-02-03}{added redefinition}
%    \begin{macrocode}
\def\@acrfullpl#1#2[#3]{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@base@acrcmd\acrfullpl\glsxtrfullpl
  \acrfullplfmt{#1}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Acrfullpl}
%\changes{1.42}{2020-02-03}{added redefinition}
%    \begin{macrocode}
\def\@Acrfullpl#1#2[#3]{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@base@acrcmd\Acrfullpl\Glsxtrfullpl
  \Acrfullplfmt{#1}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@ACRfullpl}
%\changes{1.42}{2020-02-03}{added redefinition}
%    \begin{macrocode}
\def\@ACRfullpl#1#2[#3]{%
  \def\glsxtrcurrentfield{}%
  \@glsxtr@base@acrcmd\ACRfullpl\GLSxtrfullpl
  \ACRfullplfmt{#1}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%Modify \cs{@glsaddkey} so additional keys provided by the user can
%be treated in a similar way.
%\begin{macro}{\@glsaddkey}
%    \begin{macrocode}
\renewcommand*{\@glsaddkey}[7]{%
  \key@ifundefined{glossentry}{#1}%
  {%
    \define@key{glossentry}{#1}{\csdef{@glo@#1}{##1}}%
    \appto\@gls@keymap{,{#1}{#1}}%
    \appto\@newglossaryentryprehook{\csdef{@glo@#1}{#2}}%
    \appto\@newglossaryentryposthook{%
      \letcs{\@glo@tmp}{@glo@#1}%
      \gls@assign@field{#2}{\@glo@label}{#1}{\@glo@tmp}%
    }%
    \newcommand*{#3}[1]{\@gls@entry@field{##1}{#1}}%
    \newcommand*{#4}[1]{\@Glsentryfield{##1}{#1}}%
%    \end{macrocode}
% Now for the commands with links. These currently don't support the
% inner text format.
% First the version with no case change:
%    \begin{macrocode}
    \ifcsdef{@gls@user@#1@}%
    {%
       \PackageError{glossaries}%
       {Can't define `\string#5' as helper command
        `\expandafter\string\csname @gls@user@#1@\endcsname' already
        exists}%
       {}%
    }%
    {%
      \expandafter\newcommand\expandafter*\expandafter
        {\csname @gls@user@#1\endcsname}[2][]{%
          \new@ifnextchar[%
            {\csuse{@gls@user@#1@}{##1}{##2}}%
            {\csuse{@gls@user@#1@}{##1}{##2}[]}}%
      \csdef{@gls@user@#1@}##1##2[##3]{%
        \def\glsxtrcurrentfield{#1}%
        \glsxtrassignfieldfont{##2}%
        \glsxtrsaveinsert{##2}{##3}%
        \@gls@field@link{##1}{##2}{\@gls@field@font{#3{##2}##3}}%
      }%
      \newrobustcmd*{#5}{%
        \expandafter\@gls@hyp@opt\csname @gls@user@#1\endcsname}%
    }%
%    \end{macrocode}
% Next the version with the first letter converted to upper case
% (modified):
%    \begin{macrocode}
    \ifcsdef{@Gls@user@#1@}%
    {%
       \PackageError{glossaries}%
       {Can't define `\string#6' as helper command
        `\expandafter\string\csname @Gls@user@#1@\endcsname' already
         exists}%
       {}%
    }%
    {%
      \expandafter\newcommand\expandafter*\expandafter
        {\csname @Gls@user@#1\endcsname}[2][]{%
          \new@ifnextchar[%
            {\csuse{@Gls@user@#1@}{##1}{##2}}%
            {\csuse{@Gls@user@#1@}{##1}{##2}[]}}%
      \csdef{@Gls@user@#1@}##1##2[##3]{%
        \def\glsxtrcurrentfield{#1}%
        \glsxtrassignfieldfont{##2}%
        \glsxtrsaveinsert{##2}{##3}%
        \@gls@field@link[\let\glscapscase\@secondofthree]%
          {##1}{##2}{\@gls@field@font{#4{##2}##3}}%
      }%
      \newrobustcmd*{#6}{%
        \expandafter\@gls@hyp@opt\csname @Gls@user@#1\endcsname}%
    }%
%    \end{macrocode}
% Finally the all caps version (modified):
%    \begin{macrocode}
    \ifcsdef{@GLS@user@#1@}%
    {%
       \PackageError{glossaries}%
       {Can't define `\string#7' as helper command
        `\expandafter\string\csname @GLS@user@#1@\endcsname' already
         exists}%
       {}%
    }%
    {%
      \expandafter\newcommand\expandafter*\expandafter
        {\csname @GLS@user@#1\endcsname}[2][]{%
          \new@ifnextchar[%
            {\csuse{@GLS@user@#1@}{##1}{##2}}%
            {\csuse{@GLS@user@#1@}{##1}{##2}[]}}%
      \csdef{@GLS@user@#1@}##1##2[##3]{%
        \def\glsxtrcurrentfield{#1}%
        \glsxtrassignfieldfont{##2}%
        \glsxtrsaveinsert{##2}{##3}%
        \@gls@field@link[\let\glscapscase\@thirdofthree]%
           {##1}{##2}{\@gls@field@font{\glsuppercase{#3{##2}##3}}}%
      }%
      \newrobustcmd*{#7}{%
        \expandafter\@gls@hyp@opt\csname @GLS@user@#1\endcsname}%
    }%
%    \end{macrocode}
%Add mappings.
%    \begin{macrocode}
    \glsmfuaddmap{#3}{#4}%
    \glsmfuaddmap{#5}{#6}%
    \glsmfublocker{#7}%
  }%
  {%
    \PackageError{glossaries-extra}{Key `#1' already exists}{}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@link@nocheckfirsthyper}
% Old versions of \sty{glossaries} don't define
% this, so provide it just in case it hasn't been defined.
%    \begin{macrocode}
\providecommand*{\@gls@link@nocheckfirsthyper}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@link@postkeys@checkfirsthyper}
%\changes{1.49}{2022-10-14}{new}
%Need another check after preunset and postunset options have been
%applied.
%    \begin{macrocode}
\newcommand*{\@gls@link@postkeys@checkfirsthyper}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@link@checkfirsthyper}
% Modify check to determine if the hyperlink should be automatically 
% suppressed, but save the original in case the acronyms are restored.
%    \begin{macrocode}
\let\@glsxtr@org@checkfirsthyper\@gls@link@checkfirsthyper
\renewcommand*{\@gls@link@checkfirsthyper}{%
%    \end{macrocode}
% \cs{ifglsused} isn't useful in the post link hook as it's already
% been unset by then, so define a command that can be used in the
% post link hook. Since \cs{@gls@link@checkfirsthyper} is only used
% by commands like \cs{gls} but not by other commands, this seems
% the best place to put it to automatically set the value for the
% commands that change the first use flag. The other commands should
% set \cs{glsxtrifwasfirstuse} to \cs{@secondoftwo} (which is done
% in \cs{@glsxtr@field@linkdefs}). Note that if the entry is
% undefined (as with \app{bib2gls} on the first \LaTeX\ run),
% \cs{ifglsused} does neither true nor false parts. However, in that
% case, this macro won't be called anyway (since it's used in the
% argument of \cs{glsdoifexistsordo}).
%    \begin{macrocode}
  \ifglsused{\glslabel}%
   {\let\glsxtrifwasfirstuse\@secondoftwo}
   {\let\glsxtrifwasfirstuse\@firstoftwo}%
%    \end{macrocode}
%Similarly for \cs{glsxtrifwasglslike}
%    \begin{macrocode}
  \let\glsxtrifwasglslike\@firstoftwo
%    \end{macrocode}
% Store the category label for convenience.
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
  \protected@edef\glscategorylabel{\glscategory{\glslabel}}%
  \glsxtrifwasfirstuse
  {%
    \glsifcategoryattribute{\glscategorylabel}{nohyperfirst}{true}%
      {\KV@glslink@hyperfalse}{}%
  }%
  {%
    \glsifcategoryattribute{\glscategorylabel}{nohypernext}{true}%
      {\KV@glslink@hyperfalse}{}%
  }%
  \glslinkcheckfirsthyperhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\do@glsdisablehyperinlist}
% This command was introduced in \sty{glossaries} v4.19. If it
% hasn't been defined, we're using an earlier version, in which case
% the \catattr{nohyper} attribute can't be implemented.
%    \begin{macrocode}
\ifdef\do@glsdisablehyperinlist
{%
  \let\@glsxtr@do@glsdisablehyperinlist\do@glsdisablehyperinlist
  \renewcommand*{\do@glsdisablehyperinlist}{%
    \@glsxtr@do@glsdisablehyperinlist
    \glsifattribute{\glslabel}{nohyper}{true}{\KV@glslink@hyperfalse}{}%
  }
}
{}
%    \end{macrocode}
%\end{macro}
%
% Define a \gloskey[glslink]{noindex} key to prevent writing information to the
% external file.
%    \begin{macrocode}
\define@boolkey{glslink}{noindex}[true]{}
\KV@glslink@noindexfalse
%    \end{macrocode}
%
%\begin{macro}{\@gls@save@glslocal}
%\changes{1.48}{2021-11-22}{new}
%Defined in \sty{glossaries} v4.50 so may not be defined.
%    \begin{macrocode}
\providecommand*{\@gls@save@glslocal}{%
  \let\if@org@KV@glslink@local\ifKV@glslink@local
} 
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@restore@glslocal}
%\changes{1.48}{2021-11-22}{new}
%Defined in \sty{glossaries} v4.50 so may not be defined.
%    \begin{macrocode}
\providecommand*{\@gls@restore@glslocal}{%
  \ifKV@glslink@local
    \let\@gls@do@glsunset\glslocalunset
  \else
    \let\@gls@do@glsunset\glsunset
  \fi
  \let\ifKV@glslink@local\if@org@KV@glslink@local
} 
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@default@restore@glslocal}
%\changes{1.49}{2022-10-14}{new}
%Save default definition of \cs{@gls@restore@glslocal}
%    \begin{macrocode}
\let\@gls@default@restore@glslocal\@gls@restore@glslocal
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@ignore@restore@glslocal}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@gls@ignore@restore@glslocal}{%
  \let\@gls@do@glsunset\@gobble
  \let\ifKV@glslink@local\if@org@KV@glslink@local
} 
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@do@glsunset}
%\changes{1.48}{2021-11-22}{new}
%Defined in \sty{glossaries} v4.50 so may not be defined.
%    \begin{macrocode}
\providecommand*{\@gls@do@glsunset}[1]{\glsunset{#1}} 
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@default@glslink@opts}
%\changes{1.49}{2022-10-14}{new}
%The noindex setting needs to be initialised, so it's now always set
%to false first before applying the default options. Otherwise, if
%noindex is explicitly set in a command like \cs{gls} then it won't
%get reset if the default option list doesn't set it.
%    \begin{macrocode}
\newcommand*{\@gls@default@glslink@opts}{}
%    \end{macrocode}
%\end{macro}
%
%If \cs{@gls@setdefault@glslink@opts} has been defined
%(\sty{glossaries} v4.20) use it to set the default keys in
%\cs{@glslink}.
%\begin{macro}{\@gls@setdefault@glslink@opts}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\ifdef\@gls@setdefault@glslink@opts
{
  \renewcommand*{\@gls@setdefault@glslink@opts}{%
    \KV@glslink@noindexfalse
    \expandafter\setupglslink\expandafter{\@gls@default@glslink@opts}%
    \@glsxtrsetaliasnoindex
  }
}
{
%    \end{macrocode}
% Not defined so prepend it to \cs{do@glsdisablehyperinlist} to
% achieve the same effect.
%    \begin{macrocode}
  \newcommand*{\@gls@setdefault@glslink@opts}{%
    \KV@glslink@noindexfalse
    \expandafter\setupglslink\expandafter{\@gls@default@glslink@opts}%
    \@glsxtrsetaliasnoindex
  }
  \preto\do@glsdisablehyperinlist{\@gls@setdefault@glslink@opts}
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsetaliasnoindex}
%\changes{1.12}{2017-02-03}{new}
%\changes{1.13}{2017-02-07}{switched to \cs{providecommand}}
%Allow user to hook into the alias noindex setting.
%Default behaviour switches off indexing for aliases.
%If the record option is on, this will have been defined to do
%nothing. (bib2gls will deal with records for aliased entries.)
%    \begin{macrocode}
\providecommand*{\glsxtrsetaliasnoindex}{%
 \KV@glslink@noindextrue
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrsetaliasnoindex}
%\changes{1.12}{2017-02-03}{new}
%\changes{1.21}{2017-11-03}{changed to use \cs{glsxtrifhasfield} instead of
%\cs{ifglshasfield}}
%\changes{1.46}{2021-09-18}{changed to use starred version of
%\cs{glsxtrifhasfield}}
%\changes{1.47}{2021-11-04}{changed to use \cs{ifcsvoid}}
%The change made in v1.46 to remove the grouping has had the
%knock-on effect of redefining \cs{glscurrentfieldvalue}, which may
%be a problem, so v1.47 has changed this to use \cs{ifcsvoid}.
%    \begin{macrocode}
\newcommand*{\@glsxtrsetaliasnoindex}{%
 \ifcsvoid{glo@\glsdetoklabel{\glslabel}@alias}%
 {}%
 {%
   \let\glsxtrindexaliased\@glsxtrindexaliased
   \glsxtrsetaliasnoindex
   \let\glsxtrindexaliased\@no@glsxtrindexaliased
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrindexaliased}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand{\@glsxtrindexaliased}{%
 \ifKV@glslink@noindex 
 \else
   \begingroup
   \let\@glsnumberformat\@glsxtr@defaultnumberformat
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
   \protected@edef\@gls@counter{\csname glo@\glsdetoklabel{\glslabel}@counter\endcsname}%
   \glsxtr@saveentrycounter
   \glsxtr@wrglossary@encap{\glsxtralias{\glslabel}}{\@@do@wrglossary{\glsxtralias{\glslabel}}}%
   \endgroup
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@no@glsxtrindexaliased}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand{\@no@glsxtrindexaliased}{%
  \PackageError{glossaries-extra}{\string\glsxtrindexaliased\space
  not permitted outside definition of \string\glsxtrsetaliasnoindex}%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrindexaliased}
%\changes{1.12}{2017-02-03}{new}
%Provide a command to redirect alias indexing, but only allow it to
%be used within \cs{glsxtrsetaliasnoindex}.
%    \begin{macrocode}
\let\glsxtrindexaliased\@no@glsxtrindexaliased
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrSetDefaultGlsOpts}
%\changes{0.5.4}{2015-12-15}{new}
% Set the default options for \cs{glslink} etc.
%    \begin{macrocode}
\newcommand*{\GlsXtrSetDefaultGlsOpts}[1]{%
  \renewcommand*{\@gls@default@glslink@opts}{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrAppToDefaultGlsOpts}
%    \begin{macrocode}
\newcommand*{\GlsXtrAppToDefaultGlsOpts}[1]{%
  \appto\@gls@default@glslink@opts{,#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrPreToDefaultGlsOpts}
%    \begin{macrocode}
\newcommand*{\GlsXtrPreToDefaultGlsOpts}[1]{%
  \preto\@gls@default@glslink@opts{#1,}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifindexing}
% Provide user level command to access it in \cs{glswriteentry}.
%    \begin{macrocode}
\newcommand*{\glsxtrifindexing}[2]{%
  \ifKV@glslink@noindex #2\else #1\fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@wrglossary@encap}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsxtr@@wrglossary@encap}\marg{label}\marg{whatsit}
%\end{definition}
%Encapsulate indexing whatsit and increment indexed count.
%See also \cs{glsxtrdowrglossaryhook}
%    \begin{macrocode}
\newcommand*{\glsxtr@wrglossary@encap}[2]{\glsencapwrcontent{#2\@glsxtr@inc@indexcount{#1}}}
%    \end{macrocode}
%\end{macro}
%
% Keep track of how many times an entry has been indexed. This doesn't test if
% the entry has been defined to allow for the first \LaTeX\ run before calling
% \app{bib2gls}.
%\begin{macro}{\@glsxtr@inc@indexcount}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@inc@indexcount}[1]{%
  \ifcsdef{glo@\glsdetoklabel{#1}@indexed}
  {%
    \csxdef{glo@\glsdetoklabel{#1}@indexed}{%
     \expandafter\number\expandafter\numexpr\csname glo@\glsdetoklabel{#1}@indexed\endcsname+1}%
  }%
  {%
    \csgdef{glo@\glsdetoklabel{#1}@indexed}{1}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsentryindexcount}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsentryindexcount}[1]{%
  \ifcsdef{glo@\glsdetoklabel{#1}@indexed}
  {\csuse{glo@\glsdetoklabel{#1}@indexed}}%
  {0}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsifindexed}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsifindexed}[3]{%
  \ifcsdef{glo@\glsdetoklabel{#1}@indexed}%
  {\expandafter\ifnum\csname glo@\glsdetoklabel{#1}@indexed\endcsname>0 #2\else#3\fi}%
  {#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaddallunindexed}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsaddallunindexed}[1][\@glo@types]{%
 \forallglsentries[#1]{\@glo@entry}%
 {%
    \glsifindexed{\@glo@entry}{}{\glsadd[format=glsignore]{\@glo@entry}}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsencapwrcontent}
%\changes{1.49}{2022-10-14}{new}
%This command was added to \sty{glossaries} v4.50 so may not be
%defined.
%    \begin{macrocode}
\providecommand*{\glsencapwrcontent}[1]{{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glswriteentry}
% Redefine to test for \catattr{indexonlyfirst} category attribute.
%\changes{1.44}{2020-03-23}{replaced \cs{ifglsused} with \cs{GlsXtrIfUnusedOrUndefined}}
%This needs to use \cs{GlsXtrIfUnusedOrUndefined} instead of
%\cs{ifglsused} to allow it to work with \app{bib2gls}.
%    \begin{macrocode}
\renewcommand*{\glswriteentry}[2]{%
  \glsxtrifindexing
  {%
   \ifglsindexonlyfirst
     \GlsXtrIfUnusedOrUndefined{#1}
     {#2}%
     {\glsxtrdoautoindexname{#1}{dualindex}}%
   \else
     \glsifattribute{#1}{indexonlyfirst}{true}%
     {%
       \GlsXtrIfUnusedOrUndefined{#1}%
       {#2}%
       {\glsxtrdoautoindexname{#1}{dualindex}}%
     }%
     {#2}%
   \fi
  }%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@do@@wrglossary}
% Hook into glossary indexing command so that it can also use
% \cs{index} at the same time if required and add user hook.
%    \begin{macrocode}
\appto\@@do@@wrglossary{\@glsxtr@do@@wrindex
  \glsxtrdowrglossaryhook{\@gls@label}%
}
%    \end{macrocode}
% (The label can be obtained from \cs{@gls@label} at this point.)
%\end{macro}
% Similarly for the \qt{noidx} version:
%\begin{macro}{\gls@noidxglossary}
%    \begin{macrocode}
\appto\gls@noidxglossary{\@glsxtr@do@@wrindex
  \glsxtrdowrglossaryhook{\@gls@label}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@do@@wrindex}
%    \begin{macrocode}
\newcommand*{\@glsxtr@do@@wrindex}{%
  \glsxtrdoautoindexname{\@gls@label}{dualindex}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrdowrglossaryhook}
% Allow user to hook into indexing code. (Always used by
% \cs{glsadd}. Used by \cs{gls} when indexing, which may or may not occur
% depending on the indexing settings.)
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrdowrglossaryhook}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@alt@hyp@opt}
%\changes{0.5.4}{2015-12-15}{new}
% Commands like \cs{gls} have a star or plus version. Provide a
% third symbol that the user can adapt for convenience.
%    \begin{macrocode}
\newcommand*{\@gls@alt@hyp@opt}[1]{%
 \let\glslinkvar\@firstofthree
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{changed \cs{let} to \cs{def} for \cs{@gls@hyp@opt@cs}}
%    \begin{macrocode}
 \def\@gls@hyp@opt@cs{#1}%
 \@ifstar{\s@gls@hyp@opt}%
 {\@ifnextchar+%
   {\@firstoftwo{\p@gls@hyp@opt}}%
   {%
     \expandafter\@ifnextchar\@gls@alt@hyp@opt@char
     {\@firstoftwo{\@alt@gls@hyp@opt}}%
     {#1}%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@alt@gls@hyp@opt}
% User version
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\@alt@gls@hyp@opt}[1][]{%
 \let\glslinkvar\@firstofthree
 \expandafter\@gls@hyp@opt@cs\expandafter[\@gls@alt@hyp@opt@keys,#1]}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@alt@hyp@opt@char}
%\changes{0.5.4}{2015-12-15}{new}
%Contains the character used as the command modifier.
%    \begin{macrocode}
\newcommand*{\@gls@alt@hyp@opt@char}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@alt@hyp@opt@keys}
%\changes{0.5.4}{2015-12-15}{new}
%Contains the option list used as the command modifier.
%    \begin{macrocode}
\newcommand*{\@gls@alt@hyp@opt@keys}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrSetAltModifier}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrSetAltModifier}[2]{%
  \let\@gls@hyp@opt\@gls@alt@hyp@opt
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{added check}
%Check that the supplied character isn't "+" or "*"
%    \begin{macrocode}
  \ifstrequal{#1}{+}%
  {\PackageError{glossaries-extra}%
   {Can't use '#1' as modifier (it's already in use)}{}}%
  {%
    \ifstrequal{#1}{*}%
    {\PackageError{glossaries-extra}%
     {Can't use '#1' as modifier (it's already in use)}{}}%
    {}%
  }%
  \def\@gls@alt@hyp@opt@char{#1}%
  \def\@gls@alt@hyp@opt@keys{#2}%
  \ifdefequal\@glsxtr@record@setting\@glsxtr@record@setting@off
  {}%
  {%
%    \end{macrocode}
%Let \app{bib2gls} know the modifier.
%\changes{1.37}{2018-11-30}{write modifier to aux}
%    \begin{macrocode}
    \protected@write\@auxout{}{\string\providecommand{\string\@glsxtr@altmodifier}[1]{}}%
    \protected@write\@auxout{}{\string\@glsxtr@altmodifier{#1}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrSetPlusModifier}
% Allow user to override the plus modifier.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrSetPlusModifier}[1]{%
 \renewcommand*{\p@gls@hyp@opt}[1][]{%
   \let\glslinkvar\@thirdofthree
   \@gls@hyp@opt@cs[#1,##1]%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrSetStarModifier}
% Allow user to override the star modifier.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrSetStarModifier}[1]{%
 \renewcommand*{\s@gls@hyp@opt}[1][]{%
   \let\glslinkvar\@secondofthree
   \@gls@hyp@opt@cs[#1,##1]%
 }
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@org@dohyperlink}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\let\glsxtr@org@dohyperlink\glsdohyperlink
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsnavhyperlink}
%\changes{1.21}{2017-11-03}{patched}
%Since \cs{glsnavhyperlink} uses \cs{@glslink}, it's necessary to
%patch it uses \cs{glsdohyperlink} instead of \cs{glsxtrdohyperlink}.
%The simplest way to achieve this is to locally let
%\cs{glsxtrdohyperlink} to \cs{glsdohyperlink}.
%
%This command is provided by \sty{glossary-hypernav} so it may not
%exist.
%    \begin{macrocode}
\ifdef\glsnavhyperlink
{
  \renewcommand*{\glsnavhyperlink}[3][\@glo@type]{%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
    \protected@edef\gls@grplabel{#2}\protected@edef\@gls@grptitle{#3}%
%    \end{macrocode}
%Scope:
%    \begin{macrocode}
    {%
      \let\glsxtrdohyperlink\glsxtr@org@dohyperlink
      \@glslink{\glsnavhyperlinkname{#1}{#2}}{#3}%
    }%
  }%
}
{}
%    \end{macrocode}
%\end{macro}
%
%Patch if \sty{glossaries} pre 4.50.
%    \begin{macrocode}
\ifdef\@@gls@navhypertarget
{}
{%
%    \end{macrocode}
%\begin{macro}{\glsnavhypertarget}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
 \renewcommand*{\glsnavhypertarget}{\protect\@@gls@navhypertarget}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@gls@navhypertarget}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
 \newcommand*{\@@gls@navhypertarget}[3][\@glo@type]{%
   \@glsnavhypertarget{#1}{#2}{#3}%
 }
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
}%
%    \end{macrocode}
%NB \sty{glossary-hypernav} v4.53 switched to \LaTeX3 sequences, so
%check for the existence of \cs{glsnavhypergroupdotarget}:
%    \begin{macrocode}
\ifdef\glsnavhypergroupdotarget
{
%    \end{macrocode}
%\begin{macro}{\glsnavhypergroupdotarget}
%\changes{1.53}{2023-09-29}{added}
%    \begin{macrocode}
  \renewcommand\glsnavhypergroupdotarget[3]{%
    \@glsxtr@do@org@target{\glsnavhyperlinkname{#1}{#2}}{#3}%
  }
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
}
{
%    \end{macrocode}
%
%\begin{macro}{\@glsnavhypertarget}
%Similarly for \cs{@glsnavhypertarget}. (NB this patch should not be
%used with \sty{glossaries} v4.53+)
%\changes{1.48}{2021-11-22}{added patch}
%    \begin{macrocode}
  \ifdef\@glsnavhypertarget
  {%
    \renewcommand*{\@glsnavhypertarget}[3]{%
      \protected@write\@auxout{}{\string\@gls@hypergroup{#1}{#2}}%
      \@glsxtr@do@org@target{\glsnavhyperlinkname{#1}{#2}}{#3}%
      \ifcsdef{@gls@hypergrouplist@#1}%
      {%
        \letcs\@gls@list{@gls@hypergrouplist@#1}%
        \protected@edef\@gls@thishypernavlabel{#2}%
        \expandafter\DTLifinlist\expandafter{\@gls@thishypernavlabel}\@gls@list{}%
        {%
          \GlossariesWarningNoLine{Navigation panel
             for glossary type `#1'^^Jmissing group `#2'}%
          \gdef\gls@hypergrouprerun{%
            \GlossariesWarningNoLine{Navigation panel
            has changed. Rerun LaTeX}}%
        }%
      }%
      {%
        \GlossariesWarningNoLine{Navigation panel
           for glossary type `#1'^^Jmissing group `#2'}%
        \gdef\gls@hypergrouprerun{%
          \GlossariesWarningNoLine{Navigation panel
          has changed. Rerun LaTeX}}%
      }%
    }%
  }
  {}
}
%    \end{macrocode}
%\end{macro}
%
%The redefinition of \cs{glsdohyperlink} has been causing problems
%so introduce a new command instead.
%
%\begin{macro}{\glsxtrdohyperlink}
% Unpleasant complications can occur if the \gloskey{text} or
% \gloskey{first} key etc contains \cs{gls}, particularly if there
% are hyperlinks. To get around this problem, patch
% \cs{glsdohyperlink} so that it temporarily makes \cs{gls} behave
% like \cs{glstext}\oarg{hyper=false,noindex}. (This will be
% overridden if the user explicitly cancels either of those options
% in the optional argument of \cs{gls} or using the plus version.)
% This also patches the short form commands like \cs{acrshort}
% and \cs{glsxtrshort} to use \cs{glsentryshort} and, similarly, the
% long form commands like \cs{acrlong} and \cs{glsxtrlong} to use
% \cs{glsentrylong}. Added attribute check.
%\changes{0.5.4}{2015-12-15}{added}
%\changes{1.42}{2020-02-03}{new (was former redefinition of
%\cs{glsdohyperlink})}
%    \begin{macrocode}
\newcommand*{\glsxtrdohyperlink}[2]{%
 \glshasattribute{\glslabel}{targeturl}%
 {%
   \glshasattribute{\glslabel}{targetname}%
   {%
     \glshasattribute{\glslabel}{targetcategory}%
     {%
       \hyperref{\glsgetattribute{\glslabel}{targeturl}}%
         {\glsgetattribute{\glslabel}{targetcategory}}%
         {\glsgetattribute{\glslabel}{targetname}}%
         {{\glsxtrprotectlinks#2}}%
     }%
     {%
       \hyperref{\glsgetattribute{\glslabel}{targeturl}}%
         {}%
         {\glsgetattribute{\glslabel}{targetname}}%
         {{\glsxtrprotectlinks#2}}%
     }%
   }%
   {%
     \href{\glsgetattribute{\glslabel}{targeturl}}%
       {{\glsxtrprotectlinks#2}}%
   }%
 }%
 {%
%    \end{macrocode}
%Check for alias.
%\changes{1.12}{2017-02-03}{added check for alias field}
%    \begin{macrocode}
   \glsfieldfetch{\glslabel}{alias}{\gloaliaslabel}%
   \ifdefvoid\gloaliaslabel
   {%
     \glsxtrhyperlink{#1}{{\glsxtrprotectlinks#2}}%
   }%
   {%
%    \end{macrocode}
%Is the alias a multi-entry?
%\changes{1.48}{2021-11-22}{added check for multi-entry}
%    \begin{macrocode}
     \glsxtrifmulti\gloaliaslabel
     {%
%    \end{macrocode}
%Get the main target.
%    \begin{macrocode}
       \letcs\gloaliaslabel{@gls@combined@\gloaliaslabel @main}%
     }%
     {}%
%    \end{macrocode}
%Redirect link to the alias target.
%    \begin{macrocode}
     \glsxtrhyperlink
     {\glolinkprefix\glsdetoklabel{\gloaliaslabel}}%
     {{\glsxtrprotectlinks#2}}%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}

%\begin{macro}{\glsxtrhyperlink}
%\changes{1.19}{2017-09-09}{new}
%\changes{1.54}{2025-01-03}{added check for \cs{glsdohyperlinkhook}}
%Allows integration with the base \sty{glossaries} package's
%\pkgopt[showtargets]{debug} option.
%    \begin{macrocode}
\ifdef\glsdohyperlinkhook
{
  \newcommand{\glsxtrhyperlink}[2]{%
    \glsdoshowtarget{#1}{\glsdohyperlinkhook{#1}{#2}\hyperlink{#1}{#2}}%
  }%
}
{
  \newcommand{\glsxtrhyperlink}[2]{%
    \glsdoshowtarget{#1}{\hyperlink{#1}{#2}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsdisablehyper}
%\changes{1.14}{2017-04-18}{added redefinition}
% Redefine to set \cs{glslabel} (to allow it to be picked up by
% \cs{glsdohyperlink}). Also made it robust and added grouping to localise the
% definition of \cs{glslabel}. The original internal command
% {@glo@label} could probably be simply replaced with \cs{glslabel},
% but it's retained in case its removal causes unexpected problems.
%\changes{1.21}{2017-11-03}{added check for existence}
%    \begin{macrocode}
\renewrobustcmd*{\glshyperlink}[2][\glsentrytext{\@glo@label}]{%
 \glsdoifexists{#2}%
 {%
   \def\@glo@label{#2}%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
   {\protected@edef\glslabel{#2}%
   \@glslink{\glolinkprefix\glslabel}{#1}}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsdisablehyper}
%\changes{0.5.4}{2015-12-15}{added}
%\changes{1.21}{2017-11-03}{changed to use \cs{def} rather than \cs{let}}
% Redefine in case we have an old version of \sty{glossaries}.
%This now uses \cs{def} rather than \cs{let} to allow for
%redefinitions of \cs{glsdonohyperlink}.
%    \begin{macrocode}
\renewcommand{\glsdisablehyper}{%
  \KV@glslink@hyperfalse
  \def\@glslink{\glsdonohyperlink}%
  \let\@glstarget\@secondoftwo
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsenablehyper}
%\changes{1.21}{2017-11-03}{changed to use \cs{def} rather than \cs{let}}
%This now uses \cs{def} rather than \cs{let} to allow for
%redefinitions of \cs{glsdohypertarget} and \cs{glsdohyperlink}.
%\changes{1.42}{2020-02-03}{switched from \cs{glsdohyperlink} to
%\cs{glsxtrdohyperlink}}
%    \begin{macrocode}
\renewcommand{\glsenablehyper}{%
 \KV@glslink@hypertrue
 \def\@glslink{\glsxtrdohyperlink}%
 \def\@glstarget{\glsdohypertarget}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsdonohyperlink}
% This command was only introduced in \sty{glossaries} v4.20, so it may
% not be defined (therefore use \cs{def}). For older \sty{glossaries} versions, this won't be
% used if \sty{hyperref} hasn't been loaded, which means the
% indexing will still take place. The generated text is scoped
% (the link text in \cs{hyperlink} is also scoped, so it's
% consistent).
%\changes{0.5.4}{2015-12-15}{added}
%    \begin{macrocode}
\def\glsdonohyperlink#1#2{{\glsxtrprotectlinks #2}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glslink}
% Reset \cs{@glslink} with patched versions:
%\changes{1.21}{2017-11-03}{changed \cs{let} to \cs{def}}
%\changes{1.42}{2020-02-03}{switched from \cs{glsdohyperlink} to
%\cs{glsxtrdohyperlink}}
%    \begin{macrocode}
\ifcsundef{hyperlink}%
{%
  \def\@glslink{\glsdonohyperlink}
}%
{%
  \def\@glslink{\glsxtrdohyperlink}
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrprotectlinks}
%\changes{0.5.4}{2015-12-15}{new}
% Make \cs{gls} (and variants) behave like the corresponding
% \cs{glstext} (and variants) with hyperlinking and indexing off.
%    \begin{macrocode}
\newcommand*{\glsxtrprotectlinks}{%
  \KV@glslink@hyperfalse
  \KV@glslink@noindextrue
  \let\@gls@\@glsxtr@p@text@
  \let\@Gls@\@Glsxtr@p@text@
  \let\@GLS@\@GLSxtr@p@text@
  \let\@glspl@\@glsxtr@p@plural@
  \let\@Glspl@\@Glsxtr@p@plural@
  \let\@GLSpl@\@GLSxtr@p@plural@
  \let\@glsxtrshort\@glsxtr@p@short@
  \let\@Glsxtrshort\@Glsxtr@p@short@
  \let\@GLSxtrshort\@GLSxtr@p@short@
  \let\@glsxtrlong\@glsxtr@p@long@
  \let\@Glsxtrlong\@Glsxtr@p@long@
  \let\@GLSxtrlong\@GLSxtr@p@long@
  \let\@glsxtrshortpl\@glsxtr@p@shortpl@
  \let\@Glsxtrshortpl\@Glsxtr@p@shortpl@
  \let\@GLSxtrshortpl\@GLSxtr@p@shortpl@
  \let\@glsxtrlongpl\@glsxtr@p@longpl@
  \let\@Glsxtrlongpl\@Glsxtr@p@longpl@
  \let\@GLSxtrlongpl\@GLSxtr@p@longpl@
  \let\@acrshort\@glsxtr@p@acrshort@
  \let\@Acrshort\@Glsxtr@p@acrshort@
  \let\@ACRshort\@GLSxtr@p@acrshort@
  \let\@acrshortpl\@glsxtr@p@acrshortpl@
  \let\@Acrshortpl\@Glsxtr@p@acrshortpl@
  \let\@ACRshortpl\@GLSxtr@p@acrshortpl@
  \let\@acrlong\@glsxtr@p@acrlong@
  \let\@Acrlong\@Glsxtr@p@acrlong@
  \let\@ACRlong\@GLSxtr@p@acrlong@
  \let\@acrlongpl\@glsxtr@p@acrlongpl@
  \let\@Acrlongpl\@Glsxtr@p@acrlongpl@
  \let\@ACRlongpl\@GLSxtr@p@acrlongpl@
}
%    \end{macrocode}
%\end{macro}
%
% These protected versions need grouping to prevent the label from 
% getting confused.
%\begin{macro}{\@glsxtr@p@text@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@glsxtr@p@text@#1#2[#3]{{\@glstext@{#1}{#2}[#3]}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtr@p@text@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@Glsxtr@p@text@#1#2[#3]{{\@Glstext@{#1}{#2}[#3]}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSxtr@p@text@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@GLSxtr@p@text@#1#2[#3]{{\@GLStext@{#1}{#2}[#3]}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@p@plural@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@glsxtr@p@plural@#1#2[#3]{{\@glsplural@{#1}{#2}[#3]}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtr@p@plural@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@Glsxtr@p@plural@#1#2[#3]{{\@Glsplural@{#1}{#2}[#3]}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSxtr@p@plural@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@GLSxtr@p@plural@#1#2[#3]{{\@GLSplural@{#1}{#2}[#3]}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@p@short@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@glsxtr@p@short@#1#2[#3]{%
 {%
  \glssetabbrvfmt{\glscategory{#2}}%
  \glsabbrvfont{\glsentryshort{#2}}#3%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtr@p@short@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@Glsxtr@p@short@#1#2[#3]{%
 {%
   \glssetabbrvfmt{\glscategory{#2}}%
   \glsabbrvfont{\Glsentryshort{#2}}#3%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSxtr@p@short@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@GLSxtr@p@short@#1#2[#3]{%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \glsuppercase{\glsabbrvfont{\glsentryshort{#2}}#3}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@p@shortpl@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@glsxtr@p@shortpl@#1#2[#3]{%
 {%
   \glssetabbrvfmt{\glscategory{#2}}%
   \glsabbrvfont{\glsentryshortpl{#2}}#3%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtr@p@shortpl@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@Glsxtr@p@shortpl@#1#2[#3]{%
 {%
   \glssetabbrvfmt{\glscategory{#2}}%
   \glsabbrvfont{\Glsentryshortpl{#2}}#3%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSxtr@p@shortpl@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@GLSxtr@p@shortpl@#1#2[#3]{%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \glsuppercase{\glsabbrvfont{\glsentryshortpl{#2}}#3}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@p@long@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@glsxtr@p@long@#1#2[#3]{{\glsentrylong{#2}#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtr@p@long@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@Glsxtr@p@long@#1#2[#3]{{\Glsentrylong{#2}#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSxtr@p@long@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@GLSxtr@p@long@#1#2[#3]{%
  {\glsuppercase{\glslongfont{\glsentrylong{#2}}#3}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@p@longpl@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@glsxtr@p@longpl@#1#2[#3]{{\glsentrylongpl{#2}#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtr@p@longpl@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@Glsxtr@p@longpl@#1#2[#3]{{\glslongfont{\Glsentrylongpl{#2}}#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSxtr@p@longpl@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@GLSxtr@p@longpl@#1#2[#3]{%
  {\glsuppercase{\glslongfont{\glsentrylongpl{#2}}#3}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@p@acrshort@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@glsxtr@p@acrshort@#1#2[#3]{{\acronymfont{\glsentryshort{#2}}#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtr@p@acrshort@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@Glsxtr@p@acrshort@#1#2[#3]{{\acronymfont{\Glsentryshort{#2}}#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSxtr@p@acrshort@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@GLSxtr@p@acrshort@#1#2[#3]{%
  {\glsuppercase{\acronymfont{\glsentryshort{#2}}#3}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@p@acrshortpl@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@glsxtr@p@acrshortpl@#1#2[#3]{{\acronymfont{\glsentryshortpl{#2}}#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtr@p@acrshortpl@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@Glsxtr@p@acrshortpl@#1#2[#3]{{\acronymfont{\Glsentryshortpl{#2}}#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSxtr@p@acrshortpl@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@GLSxtr@p@acrshortpl@#1#2[#3]{%
  {\glsuppercase{\acronymfont{\glsentryshortpl{#2}}#3}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@p@acrlong@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@glsxtr@p@acrlong@#1#2[#3]{{\glsentrylong{#2}#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtr@p@acrlong@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@Glsxtr@p@acrlong@#1#2[#3]{{\Glsentrylong{#2}#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSxtr@p@acrlong@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@GLSxtr@p@acrlong@#1#2[#3]{%
 {\glsuppercase{\glsentrylong{#2}#3}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@p@acrlongpl@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@glsxtr@p@acrlongpl@#1#2[#3]{{\glsentrylongpl{#2}#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtr@p@acrlongpl@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@Glsxtr@p@acrlongpl@#1#2[#3]{{\Glsentrylongpl{#2}#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSxtr@p@acrlongpl@}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\def\@GLSxtr@p@acrlongpl@#1#2[#3]{%
 {\glsuppercase{\glsentrylongpl{#2}#3}}}
%    \end{macrocode}
%\end{macro}
%
%Commands to minimise conflict.
%\begin{macro}{\@glsxtrp@opt}
%\changes{1.07}{2016-08-15}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtrp@opt}{hyper=false,noindex}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsetpopts}
%\changes{1.07}{2016-08-15}{new}
%Used in glossary to switch hyperlinks on for the \cs{glsxtrp} type
%of commands.
%    \begin{macrocode}
\newcommand*{\glsxtrsetpopts}[1]{%
  \renewcommand*{\@glsxtrp@opt}{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glossxtrsetpopts}
%\changes{1.07}{2016-08-15}{new}
%Used in glossary to switch hyperlinks on for the \cs{glsxtrp} type
%of commands.
%    \begin{macrocode}
\newcommand*{\glossxtrsetpopts}{%
  \glsxtrsetpopts{noindex}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpInit}
%Initialisation code at the start of the group inserted by
%\cs{@@glsxtrp}.
%\changes{1.51}{2023-04-24}{new}
%    \begin{macrocode}
\newcommand{\glsxtrpInit}[2]{\let\glspostlinkhook\relax}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@glsxtrp}
%\changes{1.07}{2016-08-15}{new}
%    \begin{macrocode}
\newrobustcmd*{\@@glsxtrp}[2]{%
%    \end{macrocode}
%Add scope.
%    \begin{macrocode}
  {%
    \glsxtrpInit{#1}{#2}%
    \csname#1\expandafter\endcsname\expandafter[\@glsxtrp@opt]{#2}[]%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrp}
%\changes{1.07}{2016-08-15}{new}
%    \begin{macrocode}
\newrobustcmd*{\@glsxtrp}[2]{%
  \ifcsdef{gls#1}%
  {%
    \@@glsxtrp{gls#1}{#2}%
  }%
  {%
    \ifcsdef{glsxtr#1}%
    {%
      \@@glsxtrp{glsxtr#1}{#2}%
    }%
    {%
      \PackageError{glossaries-extra}{`#1' not recognised by
        \string\glsxtrp}{}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtrp}
%\changes{1.07}{2016-08-15}{new}
%    \begin{macrocode}
\newrobustcmd*{\@Glsxtrp}[2]{%
  \ifcsdef{Gls#1}%
  {%
    \@@glsxtrp{Gls#1}{#2}%
  }%
  {%
    \ifcsdef{Glsxtr#1}%
    {%
      \@@glsxtrp{Glsxtr#1}{#2}%
    }%
    {%
      \PackageError{glossaries-extra}{`#1' not recognised by
        \string\Glsxtrp}{}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GLSxtrp}
%\changes{1.07}{2016-08-15}{new}
%    \begin{macrocode}
\newrobustcmd*{\@GLSxtrp}[2]{%
  \ifcsdef{GLS#1}%
  {%
    \@@glsxtrp{GLS#1}{#2}%
  }%
  {%
    \ifcsdef{GLSxtr#1}%
    {%
      \@@glsxtrp{GLSxtr#1}{#2}%
    }%
    {%
      \PackageError{glossaries-extra}{`#1' not recognised by
        \string\GLSxtrp}{}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifintoc}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glsxtrifintoc}[2]{#2}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifheaduc}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrifheaduc}[3]{%
 \glsxtrifintoc{#3}{\glsifattribute{#1}{headuc}{true}{#2}{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@entry@p}
%\changes{1.07}{2016-08-15}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtr@headentry@p}[2]{%
 \glsxtrifheaduc{#1}%
 {%
   \glsuppercase{\@gls@entry@field{#1}{#2}}%
 }%
 {%
   \@gls@entry@field{#1}{#2}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrp}
%\changes{1.07}{2016-08-15}{new}
%Not robust as it needs to expand somewhat.
%    \begin{macrocode}
\newcommand{\glsxtrp}[2]{%
  \protect\NoCaseChange
  {%
    \protect\glstexorpdfstring
    {%
      \protect\glsxtrifinmark
      {%
        \ifcsdef{glsxtrhead#1}%
        {%
          {\protect\csuse{glsxtrhead#1}{#2}}%
        }%
        {%
          \glsxtr@headentry@p{#2}{#1}%
        }%
      }%
      {%
        \@glsxtrp{#1}{#2}%
      }%
    }%
    {%
      \protect\@gls@entry@field{#2}{#1}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%Provide short synonyms for the most common option.
%\begin{macro}{\glsps}
%\changes{1.07}{2016-08-15}{new}
%    \begin{macrocode}
\newcommand*{\glsps}{\glsxtrp{short}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glspt}
%\changes{1.07}{2016-08-15}{new}
%    \begin{macrocode}
\newcommand*{\glspt}{\glsxtrp{text}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrp}
%\changes{1.07}{2016-08-15}{new}
%As above but use first letter upper case.
%    \begin{macrocode}
\newcommand{\Glsxtrp}[2]{%
  \protect\NoCaseChange
  {%
    \protect\glstexorpdfstring
    {%
      \protect\glsxtrifinmark
      {%
        \ifcsdef{Glsxtrhead#1}%
        {%
          {\protect\csuse{Glsxtrhead#1}{#2}}%
        }%
        {%
%    \end{macrocode}
% \cs{@Gls@entry@field} is robust as from \sty{glossaries} v4.50,
% but continue to use \cs{protect} in case an older version is installed.
%    \begin{macrocode}
          \protect\@Gls@entry@field{#2}{#1}%
        }%
      }%
      {%
        \@Glsxtrp{#1}{#2}%
      }%
    }%
    {%
      \MFUsentencecase{\@gls@entry@field{#2}{#1}}%
    }%
  }%
}
\glsmfuaddmap{\glsxtrp}{\Glsxtrp}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrp}
%\changes{1.07}{2016-08-15}{new}
%As above but all upper case. The bookmarks use
%\cs{glsuppercase}, which is expandable as from
%\sty{mfirstuc} v2.08+.
%    \begin{macrocode}
\newcommand{\GLSxtrp}[2]{%
  \protect\NoCaseChange
  {%
    \protect\glstexorpdfstring
    {%
      \protect\glsxtrifinmark
      {%
        \ifcsdef{GLSxtr#1}%
        {%
          {\protect\GLSxtrshort[noindex,hyper=false]{#1}[]}%
        }%
        {%
          \protect\glsuppercase
          {%
            \protect\@gls@entry@field{#2}{#1}%
          }%
        }%
      }%
      {%
        \@GLSxtrp{#1}{#2}%
      }%
    }%
    {%
      \protect\GLSxtrusefield{#2}{#1}%
    }%
  }%
}
\glsmfublocker{\GLSxtrp}
%    \end{macrocode}
%\end{macro}
%
%Provide case-changing versions of synonyms.
%\begin{macro}{\Glsps}
%\changes{1.51}{2023-04-24}{new}
%    \begin{macrocode}
\newcommand*{\Glsps}{\Glsxtrp{short}}
\glsmfuaddmap{\glsps}{\Glsps}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\GLSps}
%\changes{1.51}{2023-04-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSps}{\GLSxtrp{short}}
\glsmfublocker{\GLSps}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\Glspt}
%\changes{1.51}{2023-04-24}{new}
%    \begin{macrocode}
\newcommand*{\Glspt}{\Glsxtrp{text}}
\glsmfuaddmap{\glspt}{\Glspt}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\GLSpt}
%\changes{1.51}{2023-04-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSpt}{\GLSxtrp{text}}
\glsmfublocker{\GLSpt}
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Entry Counting}
%
% The (use) entry counting mechanism from \sty{glossaries} is adjusted
% here to work with category attributes. Provide a convenient
% command to enable entry counting, set the \catattr{entrycount}
% attribute for given categories and redefine \cs{gls} etc to 
% use \cs{cgls} instead. This form of entry counting is provided to
% adjust the formatting if the number of times an entry has been
% used (through commands that unset the first use flag) doesn't
% exceeding the specified threshold. For link counting, see
%\sectionref{sec:linkcount}.
%
% First adjust definitions of the unset and reset commands to
% provide a hook, but changing the flag can cause problems in 
% certain situations, so to allow the normal unsetting to be 
% temporarily disabled, \cs{@glsunset} is let to
% \cs{@glsxtr@unset}, which performs the actual unsetting through
% \cs{@@glsunset} and then does the hook. This means that the
% unsetting (and the hook) can switched off by redefining \cs{@glsunset}
% and then switched back on again by changing the definition back to
% \cs{@glsxtr@unset}.
%
%\begin{macro}{\@glsxtr@unset}
%\changes{1.30}{2018-04-25}{new}
% Global unset.
%    \begin{macrocode}
\newcommand*{\@glsxtr@unset}[1]{%
  \@@glsunset{#1}%
  \glsxtrpostunset{#1}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsunset}
% Global unset.
%    \begin{macrocode}
\let\@glsunset\@glsxtr@unset
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrpostunset}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrpostunset}[1]{}
%    \end{macrocode}
%\end{macro}
%
%Provide a command to store a list of labels that will need
%unsetting.
%\begin{macro}{\GlsXtrStartUnsetBuffering}
%\changes{1.30}{2018-04-25}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrStartUnsetBuffering}{%
  \@ifstar\s@GlsXtrStartUnsetBuffering\@GlsXtrStartUnsetBuffering
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GlsXtrStartUnsetBuffering}
%\changes{1.31}{2018-05-09}{new}
%Unstarred version doesn't check for duplicates.
%    \begin{macrocode}
\newcommand*{\@GlsXtrStartUnsetBuffering}{%
  \let\@glsxtr@org@unset@buffer\@glsxtr@unset@buffer
  \GlsXtrClearUnsetBuffer
  \let\@glsunset\@glsxtrbuffer@unset
  \let\org@glsxtrbuffer@check@repeats\@glsxtrbuffer@check@repeats
  \renewcommand*{\@glsxtrbuffer@check@repeats}{%
   \@@glsxtrbuffer@check@repeats
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@GlsXtrStartUnsetBuffering}
%\changes{1.31}{2018-05-09}{new}
%Starred version checks for duplicates.
%    \begin{macrocode}
\newcommand*{\s@GlsXtrStartUnsetBuffering}{%
  \let\@glsxtr@org@unset@buffer\@glsxtr@unset@buffer
  \GlsXtrClearUnsetBuffer
  \let\@glsunset\@glsxtrbuffer@nodup@unset
  \let\org@glsxtrbuffer@check@repeats\@glsxtrbuffer@check@repeats
  \renewcommand*{\@glsxtrbuffer@check@repeats}{%
   \@@glsxtrbuffer@check@repeats
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrbuffer@unset}
%\changes{1.30}{2018-04-25}{new}
%This must use a global change since \cs{gls} may have to be placed
%inside \cs{mbox} (for example, with \sty{soul} commands).
%    \begin{macrocode}
\newcommand*{\@glsxtrbuffer@unset}[1]{%
  \listxadd\@glsxtr@unset@buffer{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrbuffer@nodup@unset}
%\changes{1.31}{2018-05-09}{new}
%Alternative version that avoids duplicates.
%One level of expansion is performed on the argument in case it's a
%control sequence containing the label. (Not using \cs{xifinlist} as
%the added complexity might cause problems that the buffering is
%trying to overcome.)
%    \begin{macrocode}
\newcommand*{\@glsxtrbuffer@nodup@unset}[1]{%
  \expandafter\ifinlist\expandafter{#1}{\@glsxtr@unset@buffer}{}%
  {\listxadd\@glsxtr@unset@buffer{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrbuffer@check@repeats}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtrbuffer@check@repeats}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@glsxtrbuffer@check@repeats}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@@glsxtrbuffer@check@repeats}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@glsxtrbuffer@check@repeats@notused}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@@glsxtrbuffer@check@repeats@notused}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@glsxtrbuffer@do@check@repeat}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\@@glsxtrbuffer@do@check@repeat}{%
  \expandafter\ifinlist\expandafter{\glslabel}{\@glsxtr@unset@buffer}%
  {\@glslocalunset{\glslabel}}%
  {\GlsXtrIfUnusedOrUndefined\glslabel
    {\listxadd\@@glsxtrbuffer@check@repeats@notused{\glslabel}}{}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrUnsetBufferEnableRepeatLocal}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrUnsetBufferEnableRepeatLocal}{%
  \def\@@glsxtrbuffer@check@repeats{\@@glsxtrbuffer@do@check@repeat}%
  \def\@@glsxtrbuffer@check@repeats@notused{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrUnsetBufferDisableRepeatLocal}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrUnsetBufferDisableRepeatLocal}{%
  \def\@@glsxtrbuffer@check@repeats{}%
  \def\@@glsxtrbuffer@check@repeats@notused{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrResetLocalBuffer}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrResetLocalBuffer}{%
 \forlistloop\@glslocalreset\@@glsxtrbuffer@check@repeats@notused
 \GlsXtrClearUnsetBuffer
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrClearUnsetBuffer}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrClearUnsetBuffer}{%
  \def\@@glsxtrbuffer@check@repeats@notused{}%
  \def\@glsxtr@unset@buffer{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStopUnsetBuffering}
%\changes{1.30}{2018-04-25}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrStopUnsetBuffering}{%
  \@ifstar\s@GlsXtrStopUnsetBuffering\@GlsXtrStopUnsetBuffering
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GlsXtrStopUnsetBuffering}
%\changes{1.30}{2018-04-25}{new}
%Unstarred form (global unset).
%    \begin{macrocode}
\newcommand*{\@GlsXtrStopUnsetBuffering}{%
  \let\@glsunset\@glsxtr@unset
  \forlistloop\@glsunset\@glsxtr@unset@buffer
  \let\@glsxtr@unset@buffer\@glsxtr@org@unset@buffer
  \let\@glsxtrbuffer@check@repeats\org@glsxtrbuffer@check@repeats
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@GlsXtrStopUnsetBuffering}
%\changes{1.30}{2018-04-25}{new}
%Starred form (local unset).
%    \begin{macrocode}
\newcommand*{\s@GlsXtrStopUnsetBuffering}{%
  \forlistloop\@glslocalunset\@glsxtr@unset@buffer
  \let\@glsunset\@glsxtr@unset
  \let\@glsxtrbuffer@check@repeats\org@glsxtrbuffer@check@repeats
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrDiscardUnsetBuffering}
%\changes{1.42}{2020-02-03}{new}
%Discards pending buffer and restores \cs{glsunset}.
%    \begin{macrocode}
\newcommand*{\GlsXtrDiscardUnsetBuffering}{%
  \let\@glsunset\@glsxtr@unset
  \let\@glsxtr@unset@buffer\@glsxtr@org@unset@buffer
  \let\@glsxtrbuffer@check@repeats\org@glsxtrbuffer@check@repeats
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrForUnsetBufferedList}
%\changes{1.31}{2018-05-09}{new}
%Iterate over labels stored in the current buffer.
%The argument is the handler macro.
%    \begin{macrocode}
\newcommand*{\GlsXtrForUnsetBufferedList}[1]{%
  \forlistloop#1\@glsxtr@unset@buffer
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glslocalunset}
% Local unset.
%    \begin{macrocode}
\renewcommand*{\@glslocalunset}[1]{%
  \@@glslocalunset{#1}%
  \glsxtrpostlocalunset{#1}%
}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrpostlocalunset}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrpostlocalunset}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsreset}
% Global reset.
%    \begin{macrocode}
\renewcommand*{\@glsreset}[1]{%
  \@@glsreset{#1}%
  \glsxtrpostreset{#1}%
}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrpostreset}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrpostreset}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glslocalreset}
% Local reset.
%    \begin{macrocode}
\renewcommand*{\@glslocalreset}[1]{%
  \@@glslocalreset{#1}%
  \glsxtrpostlocalreset{#1}%
}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrpostlocalreset}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrpostlocalreset}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslocalreseteach}
%\changes{1.31}{2018-05-09}{new}
%Locally reset a list of entries.
%    \begin{macrocode}
\newcommand*{\glslocalreseteach}[1]{%
  \gls@ifnotmeasuring
  {%
    \@for\@gls@thislabel:=#1\do{%
      \glsdoifexists{\@gls@thislabel}%
      {%
        \@glslocalreset{\@gls@thislabel}%
      }%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslocalunseteach}
%Locally unset a list of entries.
%\changes{1.31}{2018-05-09}{new}
%    \begin{macrocode}
\newcommand*{\glslocalunseteach}[1]{%
  \gls@ifnotmeasuring
  {%
    \@for\@gls@thislabel:=#1\do{%
      \glsdoifexists{\@gls@thislabel}%
      {%
        \@glslocalunset{\@gls@thislabel}%
      }%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrEnableEntryCounting}
% The first argument is the list of categories and the second
% argument is the value of the \catattr{entrycount} attribute.
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrEnableEntryCounting}[2]{%
%    \end{macrocode}
% Enable entry counting:
%    \begin{macrocode}
  \glsenableentrycount
%    \end{macrocode}
% Redefine \cs{gls} etc:
%    \begin{macrocode}
  \renewcommand*{\gls}{\cgls}%
  \renewcommand*{\Gls}{\cGls}%
  \renewcommand*{\glspl}{\cglspl}%
  \renewcommand*{\Glspl}{\cGlspl}%
  \renewcommand*{\GLS}{\cGLS}%
  \renewcommand*{\GLSpl}{\cGLSpl}%
%    \end{macrocode}
% Set the \catattr{entrycount} attribute:
%    \begin{macrocode}
  \@glsxtr@setentrycountunsetattr{#1}{#2}%
%    \end{macrocode}
% In case this command is used again:
%    \begin{macrocode}
  \let\GlsXtrEnableEntryCounting\@glsxtr@setentrycountunsetattr
  \renewcommand*{\GlsXtrEnableEntryUnitCounting}[3]{%
   \PackageError{glossaries-extra}{\string\GlsXtrEnableEntryUnitCounting\space
    can't be used with \string\GlsXtrEnableEntryCounting}%
   {Use one or other but not both commands}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@setentrycountunsetattr}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@setentrycountunsetattr}[2]{%
 \@for\@glsxtr@cat:=#1\do
 {%
   \ifdefempty{\@glsxtr@cat}{}%
   {%
     \glssetcategoryattribute{\@glsxtr@cat}{entrycount}{#2}%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\ifglsresetcurrcount}
%\changes{1.49}{2022-10-14}{new}
%Determine whether or not to reset the entry counter when the first
%use flag is reset. This conditional will already be defined with
%\sty{glossaries} v4.50+.
%    \begin{macrocode}
\ifdef\glsresetcurrcountfalse{}{\newif\ifglsresetcurrcount}
\glsresetcurrcountfalse
%    \end{macrocode}
%\end{macro}
%
% Redefine the entry counting commands to take into account the
%\catattr{entrycount} attribute.
%\begin{macro}{\glsenableentrycount}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\renewcommand*{\glsenableentrycount}{%
%    \end{macrocode}
% Enable new fields:
%    \begin{macrocode}
  \appto\@newglossaryentry@defcounters{\@@newglossaryentry@defcounters}%
%    \end{macrocode}
% Just in case the user has switched on the \pkgopt{docdef} option.
%    \begin{macrocode}
  \renewcommand*{\gls@defdocnewglossaryentry}{%
    \renewcommand*\newglossaryentry[2]{%
      \PackageError{glossaries}{\string\newglossaryentry\space
      may only be used in the preamble when entry counting has
      been activated}{If you use \string\glsenableentrycount\space
      you must place all entry definitions in the preamble not in
      the document environment}%
    }%
  }%
%    \end{macrocode}
% New commands to access new fields:
%    \begin{macrocode}
  \newcommand*{\glsentrycurrcount}[1]{%
   \ifcsundef{glo@\glsdetoklabel{##1}@currcount}%
   {0}{\@gls@entry@field{##1}{currcount}}%
  }%
  \newcommand*{\glsentryprevcount}[1]{%
   \ifcsundef{glo@\glsdetoklabel{##1}@prevcount}%
   {0}{\@gls@entry@field{##1}{prevcount}}%
  }%
%    \end{macrocode}
% Adjust post unset and reset:
%    \begin{macrocode}
  \let\@glsxtr@entrycount@org@unset\glsxtrpostunset
  \renewcommand*{\glsxtrpostunset}[1]{%
    \@glsxtr@entrycount@org@unset{##1}%
    \@gls@increment@currcount{##1}%
  }%
  \let\@glsxtr@entrycount@org@localunset\glsxtrpostlocalunset
  \renewcommand*{\glsxtrpostlocalunset}[1]{%
    \@glsxtr@entrycount@org@localunset{##1}%
    \@gls@local@increment@currcount{##1}%
  }%
  \let\@glsxtr@entrycount@org@reset\glsxtrpostreset
  \renewcommand*{\glsxtrpostreset}[1]{%
    \@glsxtr@entrycount@org@reset{##1}%
    \ifglsresetcurrcount
       \csgdef{glo@\glsdetoklabel{##1}@currcount}{0}%
    \fi
  }%
  \let\@glsxtr@entrycount@org@localreset\glsxtrpostlocalreset
  \renewcommand*{\glsxtrpostlocalreset}[1]{%
    \@glsxtr@entrycount@org@localreset{##1}%
    \ifglsresetcurrcount
      \csdef{glo@\glsdetoklabel{##1}@currcount}{0}%
    \fi
  }%
%    \end{macrocode}
% Modifications to take into account the attributes that govern
% whether the entry should be unset.
%    \begin{macrocode}
  \let\@cgls@\@@cgls@
  \let\@cglspl@\@@cglspl@
%    \end{macrocode}
%\changes{1.14}{2017-04-18}{fixed assignment of \cs{@cGls@}}
%    \begin{macrocode}
  \let\@cGls@\@@cGls@
  \let\@cGlspl@\@@cGlspl@
  \let\@cGLS@\@@cGLS@
  \let\@cGLSpl@\@@cGLSpl@
%    \end{macrocode}
% The rest is as the original definition.
%    \begin{macrocode}
  \AtEndDocument{\@gls@write@entrycounts}%
  \renewcommand*{\@gls@entry@count}[2]{%
    \csgdef{glo@\glsdetoklabel{##1}@prevcount}{##2}%
  }%
  \let\glsenableentrycount\relax
  \renewcommand*{\glsenableentryunitcount}{%
    \PackageError{glossaries-extra}{\string\glsenableentryunitcount\space
     can't be used with \string\glsenableentrycount}%
    {Use one or other but not both commands}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@newglossaryentry@defcounters}
%\changes{1.49}{2022-10-14}{new}
%Allow for docdef=restricted.
%    \begin{macrocode}
\renewcommand*{\@@newglossaryentry@defcounters}{%
 \csdef{glo@\@glo@label @currcount}{0}%
 \ifnum\@glsxtr@docdefval=2\relax
  \ifcsdef{glo@\@glo@label @prevcount}{}{\csdef{glo@\@glo@label @prevcount}{0}}%
 \else
  \csdef{glo@\@glo@label @prevcount}{0}%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@write@entrycounts}
% Modify this command so that it only writes the information for
% entries with the \catattr{entrycount} attribute and issue
% warning if no entries have this attribute set.
%    \begin{macrocode}
\renewcommand*{\@gls@write@entrycounts}{%
  \immediate\write\@auxout
    {\string\providecommand*{\string\@gls@entry@count}[2]{}}%
  \count@=0\relax
  \forallglsentries{\@glsentry}{%
    \glshasattribute{\@glsentry}{entrycount}%
    {%
      \ifglsused{\@glsentry}%
      {%
        \immediate\write\@auxout
         {\string\@gls@entry@count{\@glsentry}{\glsentrycurrcount{\@glsentry}}}%
      }%
      {}%
      \advance\count@ by \@ne
    }%
    {}%
  }%
  \ifnum\count@=0
    \GlossariesExtraWarningNoLine{Entry counting has been enabled 
     \MessageBreak with \string\glsenableentrycount\space but the 
     \MessageBreak attribute `entrycount' hasn't 
     \MessageBreak been assigned to any of the defined
     \MessageBreak entries}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifcounttrigger}
%\begin{definition}
%\cs{glsxtrifcounttrigger}\marg{label}\marg{trigger format}\marg{normal}
%\end{definition}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrifcounttrigger}[3]{%
 \glshasattribute{#1}{entrycount}%
 {%
   \ifnum\glsentryprevcount{#1}>\glsgetattribute{#1}{entrycount}\relax
    #3%
   \else
    #2%
   \fi
 }%
 {#3}% 
}
%    \end{macrocode}
%\end{macro}
%
% Actual internal definitions of \cs{cgls} used when entry counting
% is enabled.
%
%\begin{macro}{\@@cgls@}
%    \begin{macrocode}
\def\@@cgls@#1#2[#3]{%
  \glsxtrifcounttrigger{#2}%
  {%
    \cglsformat{#2}{#3}%
    \glsunset{#2}%
  }% 
  {%
    \@gls@{#1}{#2}[#3]%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@cglspl@}
%    \begin{macrocode}
\def\@@cglspl@#1#2[#3]{%
  \glsxtrifcounttrigger{#2}%
  {%
    \cglsplformat{#2}{#3}%
    \glsunset{#2}%
  }%
  {%
    \@glspl@{#1}{#2}[#3]%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@cGls@}
%    \begin{macrocode}
\def\@@cGls@#1#2[#3]{%
  \glsxtrifcounttrigger{#2}%
  {%
    \cGlsformat{#2}{#3}%
    \glsunset{#2}%
  }%
  {%
    \@Gls@{#1}{#2}[#3]%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@cGlspl@}
%    \begin{macrocode}
\def\@@cGlspl@#1#2[#3]{%
  \glsxtrifcounttrigger{#2}%
  {%
    \cGlsplformat{#2}{#3}%
    \glsunset{#2}%
  }%
  {%
    \@Glspl@{#1}{#2}[#3]%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@cGLS@}
%    \begin{macrocode}
\def\@@cGLS@#1#2[#3]{%
  \glsxtrifcounttrigger{#2}%
  {%
    \cGLSformat{#2}{#3}%
    \glsunset{#2}%
  }% 
  {%
    \@GLS@{#1}{#2}[#3]%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@cGLSpl@}
%    \begin{macrocode}
\def\@@cGLSpl@#1#2[#3]{%
  \glsxtrifcounttrigger{#2}%
  {%
    \cGLSplformat{#2}{#3}%
    \glsunset{#2}%
  }%
  {%
    \@GLSpl@{#1}{#2}[#3]%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
% Remove default warnings from \cs{cgls} etc so that it can be used
% interchangeable with \cs{gls} etc.
%\begin{macro}{\@cgls@}
%    \begin{macrocode}
\def\@cgls@#1#2[#3]{\@gls@{#1}{#2}[#3]}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@cGls@}
%    \begin{macrocode}
\def\@cGls@#1#2[#3]{\@Gls@{#1}{#2}[#3]}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@cglspl@}
%    \begin{macrocode}
\def\@cglspl@#1#2[#3]{\@glspl@{#1}{#2}[#3]}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@cGlspl@}
%    \begin{macrocode}
\def\@cGlspl@#1#2[#3]{\@Glspl@{#1}{#2}[#3]}
%    \end{macrocode}
%\end{macro}
%
% Add all upper case versions not provided by \sty{glossaries}.
%\begin{macro}{\cGLS}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newrobustcmd*{\cGLS}{\@gls@hyp@opt\@cGLS}
\glsmfublocker{\cGLS}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@cGLS}
%\changes{0.5}{2015-12-07}{new}
% Defined the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\@cGLS}[2][]{%
  \new@ifnextchar[{\@cGLS@{#1}{#2}}{\@cGLS@{#1}{#2}[]}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@cGLS@}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\def\@cGLS@#1#2[#3]{\@GLS@{#1}{#2}[#3]}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\cGLSformat}
%\changes{0.5}{2015-12-07}{new}
% Format used by \cs{cGLS} if entry only used once on previous run.
% The first argument is the label, the second argument is the insert
% text.
%    \begin{macrocode}
\newcommand*{\cGLSformat}[2]{%
 \expandafter\glsuppercase\expandafter{\cglsformat{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\cGLSpl}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newrobustcmd*{\cGLSpl}{\@gls@hyp@opt\@cGLSpl}
\glsmfublocker{\cGLSpl}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@cGLSpl}
%\changes{0.5}{2015-12-07}{new}
% Defined the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\@cGLSpl}[2][]{%
  \new@ifnextchar[{\@cGLSpl@{#1}{#2}}{\@cGLSpl@{#1}{#2}[]}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@cGLSpl@}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\def\@cGLSpl@#1#2[#3]{\@GLSpl@{#1}{#2}[#3]}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\cGLSplformat}
%\changes{0.5}{2015-12-07}{new}
% Format used by \cs{cGLSpl} if entry only used once on previous run.
% The first argument is the label, the second argument is the insert
% text.
%    \begin{macrocode}
\newcommand*{\cGLSplformat}[2]{%
 \expandafter\glsuppercase\expandafter{\cglsplformat{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
% Modify the trigger formats to check for the \catattr{regular} attribute.
%\begin{macro}{\cglsformat}
%\changes{0.5.4}{2015-12-15}{added}
%    \begin{macrocode}
\renewcommand*{\cglsformat}[2]{%
  \glsifregular{#1}
  {\glsentryfirst{#1}}%
  {\ifglshaslong{#1}{\glsentrylong{#1}}{\glsentryfirst{#1}}}#2%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\cGlsformat}
%\changes{0.5.4}{2015-12-15}{added}
%    \begin{macrocode}
\renewcommand*{\cGlsformat}[2]{%
  \glsifregular{#1}
  {\Glsentryfirst{#1}}%
  {\ifglshaslong{#1}{\Glsentrylong{#1}}{\Glsentryfirst{#1}}}#2%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\cglsplformat}
%\changes{0.5.4}{2015-12-15}{added}
%    \begin{macrocode}
\renewcommand*{\cglsplformat}[2]{%
  \glsifregular{#1}
  {\glsentryfirstplural{#1}}%
  {\ifglshaslong{#1}{\glsentrylongpl{#1}}{\glsentryfirstplural{#1}}}#2%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\cGlsplformat}
%\changes{0.5.4}{2015-12-15}{added}
%    \begin{macrocode}
\renewcommand*{\cGlsplformat}[2]{%
  \glsifregular{#1}
  {\Glsentryfirstplural{#1}}%
  {\ifglshaslong{#1}{\Glsentrylongpl{#1}}{\Glsentryfirstplural{#1}}}#2%
}
%    \end{macrocode}
%\end{macro}
%
%New code similar to above for unit counting.
%
%\begin{macro}{\@@newglossaryentry@defunitcounters}
%\changes{0.5.4}{2015-12-15}{new}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
\newcommand*{\@@newglossaryentry@defunitcounters}{%
  \protected@edef\@glo@countunit{\csuse{@glsxtr@categoryattr@@\@glo@category @unitcount}}%
  \ifdefvoid\@glo@countunit
  {}%
  {%
    \@glsxtr@ifunitcounter{\@glo@countunit}%
    {}%
    {\expandafter\@glsxtr@addunitcounter\expandafter{\@glo@countunit}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@unitcountlist}
%\changes{0.5.4}{2015-12-15}{new}
% List to keep track of which counters are being used by the entry
% unit count facility.
%    \begin{macrocode}
\newcommand*{\@glsxtr@unitcountlist}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@addunitcounter}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@addunitcounter}[1]{%
 \listadd{\@glsxtr@unitcountlist}{#1}%
 \ifcsundef{glsxtr@theunit@#1}
 {%
   \ifcsdef{theH#1}%
   {\csdef{glsxtr@theunit@#1}{\csuse{theH#1}}}%
   {\csdef{glsxtr@theunit@#1}{\csuse{the#1}}}%
 }%
 {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@ifunitcounter}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@ifunitcounter}[3]{%
  \xifinlist{#1}{\@glsxtr@unitcountlist}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@currentunitcount}
%    \begin{macrocode}
\newcommand*\@glsxtr@currentunitcount[1]{%
 glo@\glsdetoklabel{#1}@currunit@\glsgetattribute{#1}{unitcount}.%
 \csuse{glsxtr@theunit@\glsgetattribute{#1}{unitcount}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@previousunitcount}
%    \begin{macrocode}
\newcommand*\@glsxtr@previousunitcount[1]{%
 glo@\glsdetoklabel{#1}@prevunit@\glsgetattribute{#1}{unitcount}.%
 \csuse{glsxtr@theunit@\glsgetattribute{#1}{unitcount}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@increment@currunitcount}
%\changes{0.5.4}{2015-12-15}{new}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
\newcommand*{\@gls@increment@currunitcount}[1]{%
  \glshasattribute{#1}{unitcount}%
  {%
    \protected@edef\@glsxtr@csname{\@glsxtr@currentunitcount{#1}}%
    \ifcsundef{\@glsxtr@csname}%
    {%
      \csgdef{\@glsxtr@csname}{1}%
      \listcsxadd
       {glo@\glsdetoklabel{#1}@unitlist}%
       {\glsgetattribute{#1}{unitcount}.%
        \csuse{glsxtr@theunit@\glsgetattribute{#1}{unitcount}}%
       }%
    }%
    {%
      \csxdef{\@glsxtr@csname}%
      {\number\numexpr\csname\@glsxtr@csname\endcsname+1}%
    }%
  }%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@local@increment@currunitcount}
%\changes{0.5.4}{2015-12-15}{new}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
\newcommand*{\@gls@local@increment@currunitcount}[1]{%
  \glshasattribute{#1}{unitcount}%
  {%
    \protected@edef\@glsxtr@csname{\@glsxtr@currentunitcount{#1}}%
    \ifcsundef{\@glsxtr@csname}%
    {%
      \csdef{\@glsxtr@csname}{1}%
      \listcseadd
       {glo@\glsdetoklabel{#1}@unitlist}%
       {\glsgetattribute{#1}{unitcount}.%
        \csuse{glsxtr@theunit@\glsgetattribute{#1}{unitcount}}%
       }%
    }%
    {%
      \csedef{\@glsxtr@csname}%
      {\number\numexpr\csname\@glsxtr@csname\endcsname+1}%
    }%
  }%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@currunitcount}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@currunitcount}[2]{%
 \ifcsundef
 {glo@\glsdetoklabel{#1}@currunit@#2}%
 {0}%
 {\csuse{glo@\glsdetoklabel{#1}@currunit@#2}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@prevunitcount}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@prevunitcount}[2]{%
 \ifcsundef
 {glo@\glsdetoklabel{#1}@prevunit@#2}%
 {0}%
 {\csuse{glo@\glsdetoklabel{#1}@prevunit@#2}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsenableentryunitcount}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\glsenableentryunitcount}{%
%    \end{macrocode}
% Enable new fields:
%    \begin{macrocode}
  \appto\@newglossaryentry@defcounters{\@@newglossaryentry@defunitcounters}%
%    \end{macrocode}
% Just in case the user has switched on the \pkgopt{docdef} option.
%    \begin{macrocode}
  \renewcommand*{\gls@defdocnewglossaryentry}{%
    \renewcommand*\newglossaryentry[2]{%
      \PackageError{glossaries}{\string\newglossaryentry\space
      may only be used in the preamble when entry counting has
      been activated}{If you use \string\glsenableentryunitcount\space
      you must place all entry definitions in the preamble not in
      the document environment}%
    }%
  }%
%    \end{macrocode}
% New commands to access new fields:
%    \begin{macrocode}
  \newcommand*{\glsentrycurrcount}[1]{%
    \@glsxtr@currunitcount{##1}{\glsgetattribute{##1}{unitcount}.%
     \csuse{glsxtr@theunit@\glsgetattribute{##1}{unitcount}}}%
  }%
  \newcommand*{\glsentryprevcount}[1]{%
    \@glsxtr@prevunitcount{##1}{\glsgetattribute{##1}{unitcount}.%
     \csuse{glsxtr@theunit@\glsgetattribute{##1}{unitcount}}}%
  }%
%    \end{macrocode}
% Access total count:
%    \begin{macrocode}
  \newcommand*{\glsentryprevtotalcount}[1]{%
    \ifcsundef{glo@\glsdetoklabel{##1}@prevunittotal}%
    {0}%
    {%
      \number\csuse{glo@\glsdetoklabel{##1}@prevunittotal}
    }%
  }%
%    \end{macrocode}
% Access max value:
%    \begin{macrocode}
  \newcommand*{\glsentryprevmaxcount}[1]{%
    \ifcsundef{glo@\glsdetoklabel{##1}@prevunitmax}%
    {0}%
    {%
      \number\csuse{glo@\glsdetoklabel{##1}@prevunitmax}
    }%
  }%
%    \end{macrocode}
% Adjust post unset and reset:
%    \begin{macrocode}
  \let\@glsxtr@entryunitcount@org@unset\glsxtrpostunset
  \renewcommand*{\glsxtrpostunset}[1]{%
    \@glsxtr@entryunitcount@org@unset{##1}%
    \@gls@increment@currunitcount{##1}%
  }%
  \let\@glsxtr@entryunitcount@org@localunset\glsxtrpostlocalunset
  \renewcommand*{\glsxtrpostlocalunset}[1]{%
    \@glsxtr@entryunitcount@org@localunset{##1}%
    \@gls@local@increment@currunitcount{##1}%
  }%
  \let\@glsxtr@entryunitcount@org@reset\glsxtrpostreset
  \renewcommand*{\glsxtrpostreset}[1]{%
    \glshasattribute{##1}{unitcount}%
    {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%\changes{1.49}{2022-10-14}{added \cs{ifglsresetcurrcount}}
%    \begin{macrocode}
      \protected@edef\@glsxtr@csname{\@glsxtr@currentunitcount{##1}}%
      \ifcsundef{\@glsxtr@csname}%
      {}%
      {\ifglsresetcurrcount\csgdef{\@glsxtr@csname}{0}\fi}%
    }%
    {}%
  }%
  \let\@glsxtr@entryunitcount@org@localreset\glsxtrpostlocalreset
  \renewcommand*{\glsxtrpostlocalreset}[1]{%
    \@glsxtr@entryunitcount@org@localreset{##1}%
    \glshasattribute{##1}{unitcount}%
    {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%\changes{1.49}{2022-10-14}{added \cs{ifglsresetcurrcount}}
%    \begin{macrocode}
      \protected@edef\@glsxtr@csname{\@glsxtr@currentunitcount{##1}}%
      \ifcsundef{\@glsxtr@csname}%
      {}%
      {\ifglsresetcurrcount\csdef{\@glsxtr@csname}{0}\fi}%
    }%
    {}%
  }%
%    \end{macrocode}
% Modifications to take into account the attributes that govern
% whether the entry should be unset.
%    \begin{macrocode}
  \let\@cgls@\@@cgls@
  \let\@cglspl@\@@cglspl@
%    \end{macrocode}
%\changes{1.14}{2017-04-18}{fixed assignment of \cs{@cGls@}}
%    \begin{macrocode}
  \let\@cGls@\@@cGls@
  \let\@cGlspl@\@@cGlspl@
  \let\@cGLS@\@@cGLS@
  \let\@cGLSpl@\@@cGLSpl@
%    \end{macrocode}
% Write information to the aux file.
%    \begin{macrocode}
  \AtEndDocument{\@gls@write@entryunitcounts}%
  \renewcommand*{\@gls@entry@unitcount}[3]{%
    \csgdef{glo@\glsdetoklabel{##1}@prevunit@##3}{##2}%
    \ifcsundef{glo@\glsdetoklabel{##1}@prevunittotal}%
    {\csgdef{glo@\glsdetoklabel{##1}@prevunittotal}{##2}}%
    {%
      \csxdef{glo@\glsdetoklabel{##1}@prevunittotal}{
        \number\numexpr\csuse{glo@\glsdetoklabel{##1}@prevunittotal}+##2}%
    }%
    \ifcsundef{glo@\glsdetoklabel{##1}@prevunitmax}%
    {\csgdef{glo@\glsdetoklabel{##1}@prevunitmax}{##2}}%
    {%
      \ifnum\csuse{glo@\glsdetoklabel{##1}@prevunitmax}<##2
       \csgdef{glo@\glsdetoklabel{##1}@prevunitmax}{##2}%
      \fi
    }%
  }%
  \let\glsenableentryunitcount\relax
  \renewcommand*{\glsenableentrycount}{%
    \PackageError{glossaries-extra}{\string\glsenableentrycount\space
     can't be used with \string\glsenableentryunitcount}%
    {Use one or other but not both commands}%
  }%
}
\@onlypreamble\glsenableentryunitcount
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@entry@unitcount}
%    \begin{macrocode}
\newcommand*{\@gls@entry@unitcount}[3]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@write@entryunitcounts@do}
%    \begin{macrocode}
\newcommand*{\@gls@write@entryunitcounts@do}[1]{%
  \immediate\write\@auxout
   {\string\@gls@entry@unitcount
     {\@glsentry}%
     {\@glsxtr@currunitcount{\@glsentry}{#1}%
     }%
     {#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@write@entryunitcounts}
%    \begin{macrocode}
\newcommand*{\@gls@write@entryunitcounts}{%
  \immediate\write\@auxout
    {\string\providecommand*{\string\@gls@entry@unitcount}[3]{}}%
  \count@=0\relax
  \forallglsentries{\@glsentry}{%
    \glshasattribute{\@glsentry}{unitcount}%
    {%
      \ifglsused{\@glsentry}%
      {%
        \forlistcsloop
          {\@gls@write@entryunitcounts@do}%
          {glo@\glsdetoklabel{\@glsentry}@unitlist}%
      }%
      {}%
      \advance\count@ by \@ne
    }%
    {}%
  }%
  \ifnum\count@=0
    \GlossariesExtraWarningNoLine{Entry counting has been enabled 
     \MessageBreak with \string\glsenableentryunitcount\space but the 
     \MessageBreak attribute `unitcount' hasn't 
     \MessageBreak been assigned to any of the defined
     \MessageBreak entries}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrEnableEntryUnitCounting}
% The first argument is the list of categories, the second
% argument is the value of the \catattr{entrycount} attribute
% and the third is the counter name.
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrEnableEntryUnitCounting}[3]{%
%    \end{macrocode}
% Enable entry counting:
%    \begin{macrocode}
  \glsenableentryunitcount
%    \end{macrocode}
% Redefine \cs{gls} etc:
%    \begin{macrocode}
  \renewcommand*{\gls}{\cgls}%
  \renewcommand*{\Gls}{\cGls}%
  \renewcommand*{\glspl}{\cglspl}%
  \renewcommand*{\Glspl}{\cGlspl}%
  \renewcommand*{\GLS}{\cGLS}%
  \renewcommand*{\GLSpl}{\cGLSpl}%
%    \end{macrocode}
% Set the \catattr{entrycount} attribute:
%    \begin{macrocode}
  \@glsxtr@setentryunitcountunsetattr{#1}{#2}{#3}%
%    \end{macrocode}
% In case this command is used again:
%    \begin{macrocode}
  \let\GlsXtrEnableEntryUnitCounting\@glsxtr@setentryunitcountunsetattr
  \renewcommand*{\GlsXtrEnableEntryCounting}[2]{%
   \PackageError{glossaries-extra}{\string\GlsXtrEnableEntryCounting\space
    can't be used with \string\GlsXtrEnableEntryUnitCounting}%
   {Use one or other but not both commands}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@setentryunitcountunsetattr}
%\changes{0.5.4}{2015-12-15}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@setentryunitcountunsetattr}[3]{%
 \@for\@glsxtr@cat:=#1\do
 {%
   \ifdefempty{\@glsxtr@cat}{}%
   {%
     \glssetcategoryattribute{\@glsxtr@cat}{entrycount}{#2}%
     \glssetcategoryattribute{\@glsxtr@cat}{unitcount}{#3}%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%
%\subsubsection{Acronym Modifications}
% It's more consistent to use the abbreviation code for acronyms,
% but make some adjustments to allow for continued use of the
% \sty{glossaries} package's custom acronym format. (For example,
% user may already have defined some acronym styles with
% \cs{newacronymstyle} which they would like to continue to use.)
% The original \sty{glossaries} acronym code can be restored 
% with \cs{RestoreAcronyms}, but adjust \cs{SetGenericNewAcronym} 
% so that \cs{newacronym} adds the category.
%
%\begin{macro}{\SetGenericNewAcronym}
%    \begin{macrocode}
\renewcommand*{\SetGenericNewAcronym}{%
%    \end{macrocode}
% Make sure \cs{RestoreAcronyms} has been used.
%    \begin{macrocode}
  \ifdefequal\@addtoacronymlists\@glsxtr@org@addtoacronynlists
  {}%
  {%
    \GlossariesWarning{\string\SetGenericNewAcronym\space used
    without restoring base acronym functions with
    \string\RestoreAcronyms}%
  }%
  \let\@Gls@entryname\@Gls@acrentryname
%    \end{macrocode}
%Redefine \cs{newacronym}:
%    \begin{macrocode}
  \renewcommand{\newacronym}[4][]{%
    \ifdefempty{\@glsacronymlists}%
    {%
      \def\@glo@type{\acronymtype}%
      \setkeys{glossentry}{##1}%
      \DeclareAcronymList{\@glo@type}%
    }%
    {}%
    \glskeylisttok{##1}%
    \glslabeltok{##2}%
    \glsshorttok{##3}%
    \glslongtok{##4}%
    \newacronymhook
    \protected@edef\@do@newglossaryentry{%
      \noexpand\newglossaryentry{\the\glslabeltok}%
      {%
        type=\acronymtype,%
        name={\expandonce{\acronymentry{##2}}},%
        sort={\acronymsort{\the\glsshorttok}{\the\glslongtok}},%
        text={\the\glsshorttok},%
        short={\the\glsshorttok},%
        shortplural={\the\glsshorttok\noexpand\acrpluralsuffix},%
        long={\the\glslongtok},%
        longplural={\the\glslongtok\noexpand\acrpluralsuffix},%
        category=acronym,
        \GenericAcronymFields,%
        \the\glskeylisttok
      }%
    }%
    \@do@newglossaryentry
  }%
  \renewcommand*{\acrfullfmt}[3]{%
    \glslink[##1]{##2}{\genacrfullformat{##2}{##3}}}%
  \renewcommand*{\Acrfullfmt}[3]{%
    \glslink[##1]{##2}{\Genacrfullformat{##2}{##3}}}%
  \renewcommand*{\ACRfullfmt}[3]{%
    \glslink[##1]{##2}{%
      \glsuppercase{\genacrfullformat{##2}{##3}}}}%
  \renewcommand*{\acrfullplfmt}[3]{%
    \glslink[##1]{##2}{\genplacrfullformat{##2}{##3}}}%
  \renewcommand*{\Acrfullplfmt}[3]{%
    \glslink[##1]{##2}{\Genplacrfullformat{##2}{##3}}}%
  \renewcommand*{\ACRfullplfmt}[3]{%
    \glslink[##1]{##2}{%
      \glsuppercase{\genplacrfullformat{##2}{##3}}}}%
  \renewcommand*{\glsentryfull}[1]{\genacrfullformat{##1}{}}%
  \renewcommand*{\Glsentryfull}[1]{\Genacrfullformat{##1}{}}%
  \renewcommand*{\glsentryfullpl}[1]{\genplacrfullformat{##1}{}}%
  \renewcommand*{\Glsentryfullpl}[1]{\Genplacrfullformat{##1}{}}%
}
%    \end{macrocode}
%\end{macro}
%
% This will cause a problem for glossaries that contain a mixture of
% acronyms and abbreviations, so redefine \cs{newacronym} to use the
% new abbreviation interface.
%
% First save the original definitions:
%    \begin{macrocode}
\let\@glsxtr@org@setacronymstyle\setacronymstyle
\let\@glsxtr@org@newacronymstyle\newacronymstyle
%    \end{macrocode}
%
%Save the list of acronyms in case they are required.
%\begin{macro}{\@glsxtr@acronymlists}
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\let\@glsxtr@acronymlists\@glsacronymlists
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtr@org@addtoacronynlists}
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\let\@glsxtr@org@addtoacronynlists\@addtoacronymlists
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtr@org@setacronymlists}
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\let\@glsxtr@org@setacronymlists\SetAcronymLists
%    \end{macrocode}
%\end{macro}
%
%Need to provide a replacement for \cs{forallacronyms} since
%\cs{@glsacronymlists} isn't available.
%
%\begin{macro}{\@glsxtr@abbrlists}
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newcommand{\@glsxtr@abbrlists}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\forallabbreviationlists}
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newcommand*{\forallabbreviationlists}[2]{%
  \@for#1:=\@glsxtr@abbrlists\do{\ifdefempty{#1}{}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@addabbreviationlist}
%\changes{1.42}{2020-02-03}{new}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
\newcommand*{\@glsxtr@addabbreviationlist}[1]{%
  \protected@edef\@glo@type{#1}%
  \ifdefempty\@glsxtr@abbrlists
  {\let\@glsxtr@abbrlists\@glo@type}%
  {%
    \ifdefequal\@glsxtr@abbrlists\@glo@type
    {}%
    {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{eappto} to \cs{protected@eappto}}
%    \begin{macrocode}
      \expandafter\DTLifinlist\expandafter{\@glo@type}{\@glsxtr@abbrlists}{}%
      {\protected@eappto\@glsxtr@abbrlists{,\@glo@type}}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\forallacronyms}
%\changes{1.42}{2020-02-03}{new}
%Modify to add warning.
%    \begin{macrocode}
\renewcommand*{\forallacronyms}[2]{%
  \@glsxtr@base@acrcmd\forallacronyms\forallabbreviationlists
  \@for#1:=\@glsacronymlists\do{\ifx#1\@empty\else#2\fi}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MakeAcronymsAbbreviations}
% Make acronyms use the same interface as abbreviations.
% Note that \cs{newacronymstyle} has a different implementation to
% \cs{newabbrevationstyle} so disable \cs{newacronymstyle} and
% \cs{setacronymstyle}.
%\changes{0.4}{2015-12-03}{set the default type to \cs{acronymtype}}
%\changes{0.5.4}{2015-12-15}{now disables \cs{setacronymstyle}}
%    \begin{macrocode}
\newcommand*{\MakeAcronymsAbbreviations}{%
%    \end{macrocode}
%Undo acronym display style:
%    \begin{macrocode}
   \@for\@gls@type:=\@glsacronymlists\do{%
     \csgdef{gls@\@gls@type @entryfmt}{\glsentryfmt}%
   }%
%    \end{macrocode}
% Save and clear acronym list.
%    \begin{macrocode}
   \let\@glsxtr@acronymlists\@glsacronymlists
   \let\@glsacronymlists\@empty
   \let\@addtoacronymlists\@gobble
   \let\SetAcronymLists\@gobble
%    \end{macrocode}
% Warn if \cs{acrshort} etc are used.
%    \begin{macrocode}
   \let\@glsxtr@base@acrcmd\@@glsxtr@base@acrcmd@warn
%    \end{macrocode}
% Redefine \cs{newacronym} to use same interface as
% \cs{newabbreviation}.
%    \begin{macrocode}
   \renewcommand*{\newacronym}[4][]{%
     \glsxtr@newabbreviation{type=\acronymtype,category=acronym,##1}{##2}{##3}{##4}%
   }%
   \renewcommand*{\firstacronymfont}[1]{\glsfirstabbrvfont{##1}}%
   \renewcommand*{\acronymfont}[1]{\glsabbrvfont{##1}}%
   \renewcommand*{\setacronymstyle}[1]{%
      \PackageError{glossaries-extra}{\string\setacronymstyle{##1}
      unavailable.
      Use \string\setabbreviationstyle[acronym]\space instead.
      The original acronym interface can be restored with
      \string\RestoreAcronyms}{}%
   }%
   \renewcommand*{\newacronymstyle}[1]{%
      \GlossariesExtraWarning{New acronym style `##1' won't be
      available unless you restore the original acronym interface with
      \string\RestoreAcronyms}%
      \@glsxtr@org@newacronymstyle{##1}%
   }%
}
%    \end{macrocode}
%\end{macro}
%
% Switch acronyms to abbreviations:
%    \begin{macrocode}
\MakeAcronymsAbbreviations
%    \end{macrocode}
%
%\begin{macro}{\RestoreAcronyms}
% Restore acronyms to \sty{glossaries} interface.
%    \begin{macrocode}
\newcommand*{\RestoreAcronyms}{%
%    \end{macrocode}
% Restore acronym list.
%    \begin{macrocode}
  \let\@glsacronymlists\@glsxtr@acronymlists
  \let\@addtoacronymlists\@glsxtr@org@addtoacronynlists
  \let\SetAcronymLists\@glsxtr@org@setacronymlists
%    \end{macrocode}
% Suppress warnings if \cs{acrshort} etc are used.
%    \begin{macrocode}
  \let\@glsxtr@base@acrcmd\@gobbletwo
%    \end{macrocode}
%Restore acronym display style:
%\changes{1.42}{2020-02-03}{added display style}
%    \begin{macrocode}
  \@for\@gls@type:=\@glsacronymlists\do{%
    \SetDefaultAcronymDisplayStyle{\@gls@type}%
  }%
%    \end{macrocode}
%Switch to the generic acronym mechanism.
%    \begin{macrocode}
  \SetGenericNewAcronym
  \renewcommand{\firstacronymfont}[1]{\acronymfont{##1}}%
  \renewcommand{\acronymfont}[1]{##1}%
  \let\setacronymstyle\@glsxtr@org@setacronymstyle
  \let\newacronymstyle\@glsxtr@org@newacronymstyle
%    \end{macrocode}
%\changes{1.07}{2016-08-15}{modified \cs{@gls@link@checkfirsthyper} to set
%\cs{glsxtrifwasfirstuse}}
% Need to restore the original definition of \cs{@gls@link@checkfirsthyper}
% but \cs{glsxtrifwasfirstuse} still needs setting for the benefit
% of the post-link hook.
%    \begin{macrocode}
  \renewcommand*\@gls@link@checkfirsthyper{%
    \ifglsused{\glslabel}%
    {\let\glsxtrifwasfirstuse\@secondoftwo}
    {\let\glsxtrifwasfirstuse\@firstoftwo}%
    \@glsxtr@org@checkfirsthyper
  }
  \glssetcategoryattribute{acronym}{regular}{false}%
  \setacronymstyle{long-short}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsacspace}
% Allow the user to customise the maximum value.
%    \begin{macrocode}
\renewcommand*{\glsacspace}[1]{%
  \glsmeasurewidth{\dimen@}{(\firstacronymfont{\glsentryshort{#1}})}%
  \ifdim\dimen@<\glsacspacemax~\else\space\fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsacspacemax}
% Value used in the above.
%    \begin{macrocode}
\newcommand*{\glsacspacemax}{3em}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsabspace}
%\changes{1.49}{2022-10-14}{new}
% Similar to \cs{glsacspace} but includes inner formatting.
%    \begin{macrocode}
\newrobustcmd*{\glsabspace}[1]{%
  \glsmeasurewidth{\dimen@}{(\glsfirstabbrvfont{\glsentryshort{#1}})}%
  \ifdim\dimen@<\glsacspacemax
    \glsxtrgenentrytextfmt{~}%
  \else
    \glsxtrgenentrytextfmt{ }%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Indexing and Displaying Glossaries}
%From time-to-time users ask if they can have one glossary sorted
%normally and another sorted by definition or usage. With the
% base \sty{glossaries} package this can only be achieved with the
% \qt{noidx} commands (Option~1). This is an attempt to mix and
% match.
%
%First we need a list of the glossaries that require
%\app{makeindex}\slash\app{xindy}.
%\begin{macro}{\@glsxtr@reg@glosslist}
%\changes{1.0}{2016-01-24}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@reg@glosslist}{}
%    \end{macrocode}
%\end{macro}
% Save the original definition of \cs{makeglossaries}:
%    \begin{macrocode}
\let\@glsxtr@org@makeglossaries\makeglossaries
%    \end{macrocode}
%
%\begin{macro}{\@makeglossaries@warn@noprintglossary}
%\changes{1.46}{2021-09-20}{new}
%This command was only introduced to \sty{glossaries} v4.47 so it
%may not be defined.
%    \begin{macrocode}
\providecommand\@makeglossaries@warn@noprintglossary{%
  \ifdefstring{\@glo@types}{,}%
  {%
    \GlossariesWarningNoLine{No glossaries have been defined}%
  }%
  {%
    \GlossariesWarningNoLine{No \string\printglossary\space 
      or \string\printglossaries\space
      found. ^^J(Remove \string\makeglossaries\space if you 
      don't want any glossaries.) ^^JThis document will not 
      have a glossary}%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@domakeglossaries}
%\changes{1.42}{2020-02-03}{provided definition for \cs{@domakeglossaries}}
% \sty{glossaries} v4.45 introduced \cs{@domakeglossaries} to
% provide a way of disabling \cs{makeglossaries}. If it hasn't been
% defined, define here to do its argument:
%    \begin{macrocode}
\providecommand{\@domakeglossaries}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@automake@types}
%\changes{1.49}{2022-10-14}{new}
%Added to \sty{glossaries} v4.50 so may not be defined.
%    \begin{macrocode}
\providecommand{\@gls@automake@types}{\@glo@types}
%    \end{macrocode}
%\end{macro}
%
% Redefine \cs{makeglossaries} to take an optional argument.
% This should be empty for the usual behaviour (all glossaries
% need processing with an indexing application) or a comma-separated
% list of glossary labels indicating those glossaries that should be
% processed with an indexing application. The optional argument
% version shouldn't be used with \pkgopt{record}.
%\begin{macro}{\makeglossaries}
%\changes{1.0}{2016-01-24}{new}
%\changes{1.42}{2020-02-03}{added \cs{@domakeglossaries}}
%    \begin{macrocode}
\renewcommand*{\makeglossaries}[1][]{%
 \ifx\@glsxtr@record@setting\@glsxtr@record@setting@alsoindex
   \edef\glsindexingsetting{bib2gls-\ifglsxindy xindy\else makeindex\fi}%
 \else
   \ifglsxindy
     \def\glsindexingsetting{xindy}%
   \else
     \def\glsindexingsetting{makeindex}%
   \fi
 \fi
 \@domakeglossaries
 {%
   \@glsxtr@if@record@only
   {%
    \PackageError{glossaries-extra}{\string\makeglossaries\space
     not permitted\MessageBreak with record=\@glsxtr@record@setting\space 
     package option}%
    {You may only use \string\makeglossaries\space with
     record=off or record=hybrid options}%
   }%
   {%
     \ifblank{#1}%
     {%
        \@glsxtr@org@makeglossaries
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{adjust warning on missing glossary for \qt{alsoindex}}
%    \begin{macrocode}
        \ifx\@glsxtr@record@setting\@glsxtr@record@setting@alsoindex
          \let\warn@noprintglossary\@glsxtr@warn@hybrid@noprintgloss
        \fi
     }%
     {%
       \ifx\@glsxtr@record@setting\@glsxtr@record@setting@alsoindex
         \PackageError{glossaries-extra}{\string\makeglossaries[#1]\space
         not permitted\MessageBreak with record=\@glsxtr@record@setting\space package option}%
         {You may only use the hybrid \string\makeglossaries[...]\space with
          record=off option}%
       \else
        \appto\glsindexingsetting{-noidx}%
%    \end{macrocode}
%\cs{@gls@@automake@immediate} was introduced to \sty{glossaries}
%v4.42 so it may not be defined.
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
         \protected@edef\@glsxtr@reg@glosslist{#1}%
%    \end{macrocode}
% \cs{@gls@@automake@immediate} uses \cs{@gls@automake@types}
% as from v4.50. Older versions use \cs{@glo@types} which will
% include the noidx glossaries.
%    \begin{macrocode}
         \let\@gls@automake@types\@glsxtr@reg@glosslist
         \ifdef\@gls@@automake@immediate{\@gls@@automake@immediate}{}%
         \ifundef{\glswrite}{\newwrite\glswrite}{}%
         \protected@write\@auxout{}{\string\providecommand
           \string\@glsorder[1]{}}
         \protected@write\@auxout{}{\string\providecommand
           \string\@istfilename[1]{}}
         \protected@write\@auxout{}{\string\@istfilename{\istfilename}}%
         \protected@write\@auxout{}{\string\@glsorder{\glsorder}}
         \protected@write\@auxout{}{\string\glsxtr@makeglossaries{#1}}
         \write\@auxout{\string\providecommand\string\@gls@reference[3]{}}%
%    \end{macrocode}
% Iterate through each supplied glossary type and activate it.
%    \begin{macrocode}
         \@for\@glo@type:=#1\do{%
          \ifdefempty{\@glo@type}{}{\@makeglossary{\@glo@type}}%
         }%
%    \end{macrocode}
% New glossaries must be created before \cs{makeglossaries}:
%    \begin{macrocode}
         \renewcommand*\newglossary[4][]{%
         \PackageError{glossaries}{New glossaries
         must be created before \string\makeglossaries}{You need
         to move \string\makeglossaries\space after all your
         \string\newglossary\space commands}}%
%    \end{macrocode}
% Any subsequence instances of this command should have no effect.
%\changes{1.42}{2020-02-03}{let \cs{@makeglossary} to \cs{@gobble}
%instead of \cs{relax}}
%    \begin{macrocode}
          \let\@makeglossary\@gobble
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed redefinition of \cs{makeglossary}}
%Version 1.42 removed letting \cs{makeglossary} to \cs{relax}
%(no kernel redefs may be in effect).
%    \begin{macrocode}
          \renewcommand\makeglossaries[1][]{}%
%    \end{macrocode}
% Disable all commands that have no effect after \cs{makeglossaries}
%    \begin{macrocode}
          \@disable@onlypremakeg
%    \end{macrocode}
% Allow \gloskey{see} key:
%    \begin{macrocode}
          \let\gls@checkseeallowed\relax
%    \end{macrocode}
%Adjust \cs{@do@seeglossary}. This needs to check for the entry's
%existence but don't increment associated counter.
%    \begin{macrocode}
          \renewcommand*{\@do@seeglossary}[2]{%
            \glsdoifexists{##1}%
            {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
              \protected@edef\@gls@label{\glsdetoklabel{##1}}%
              \protected@edef\@gls@type{\csname glo@\@gls@label @type\endcsname}%
              \expandafter\DTLifinlist\expandafter{\@gls@type}{\@glsxtr@reg@glosslist}%
              {\@glsxtr@org@doseeglossary{##1}{##2}}%
              {%
                \@@glsxtrwrglossmark
                \protected@write\@auxout{}{%
                  \string\@gls@reference
                    {\gls@type}{\@gls@label}{\string\glsseeformat##2{}}%
                }%
                \@gls@noidx@addtorefs{\@gls@label}%
              }%
            }%
          }%
%    \end{macrocode}
% Adjust \cs{@@do@@wrglossary}
%    \begin{macrocode}
          \let\@glsxtr@@do@@wrglossary\@@do@@wrglossary
          \def\@@do@@wrglossary{%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
            \protected@edef\@gls@type{\csname glo@\@gls@label @type\endcsname}%
            \expandafter\DTLifinlist\expandafter{\@gls@type}{\@glsxtr@reg@glosslist}%
            {\@glsxtr@@do@@wrglossary}%
            {\gls@noidxglossary}%
          }%
%    \end{macrocode}
% Suppress warning about no \cs{makeglossaries}
%    \begin{macrocode}
          \let\warn@nomakeglossaries\relax
          \let\warn@noprintglossary\@makeglossaries@warn@noprintglossary
%    \end{macrocode}
% Only warn for glossaries not listed.
%    \begin{macrocode}
          \renewcommand{\@gls@noref@warn}[1]{%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
            \protected@edef\@gls@type{##1}%
            \expandafter\DTLifinlist\expandafter{\@gls@type}{\@glsxtr@reg@glosslist}%
            {%
              \GlossariesExtraWarning{Can't use
                 \string\printnoidxglossary[type={\@gls@type}]
                 when `\@gls@type' is listed in the optional argument of
                 \string\makeglossaries}%
            }%
            {%
              \GlossariesWarning{Empty glossary for
              \string\printnoidxglossary[type={##1}].
              Rerun may be required (or you may have forgotten to use
              commands like \string\gls)}%
            }%
          }%
%    \end{macrocode}
% Adjust display number list to check for type:
%    \begin{macrocode}
          \renewcommand*{\glsdisplaynumberlist}[1]{%
            \expandafter\DTLifinlist\expandafter{##1}{\@glsxtr@reg@glosslist}%
            {\@glsxtr@idx@displaynumberlist{##1}}%
            {\@glsxtr@noidx@displaynumberlist{##1}}%
          }%
%    \end{macrocode}
% Adjust entry list:
%    \begin{macrocode}
          \renewcommand*{\glsentrynumberlist}[1]{%
            \expandafter\DTLifinlist\expandafter{##1}{\@glsxtr@reg@glosslist}%
            {\@glsxtr@idx@entrynumberlist{##1}}%
            {\@glsxtr@noidx@entrynumberlist{##1}}%
          }%
%    \end{macrocode}
% Adjust number list loop
%    \begin{macrocode}
          \renewcommand*{\glsnumberlistloop}[2]{%
            \expandafter\DTLifinlist\expandafter{##1}{\@glsxtr@reg@glosslist}%
            {%
               \PackageError{glossaries-extra}{\string\glsnumberlistloop\space
                not available for glossary `##1'}{}%
            }%
            {\@glsxtr@noidx@numberlistloop{##1}{##2}}%
          }%
%    \end{macrocode}
% Only sanitize sort for normal indexing glossaries.
%    \begin{macrocode}
          \renewcommand*{\glsprestandardsort}[3]{%
            \expandafter\DTLifinlist\expandafter{##2}{\@glsxtr@reg@glosslist}%
            {%
              \glsdosanitizesort
            }%
            {%
              \ifglssanitizesort
               \@gls@noidx@sanitizesort
              \else
%    \end{macrocode}
%\changes{1.59}{2025-03-18}{bug fix: corrected cs name spelling}
%    \begin{macrocode}
               \@@gls@noidx@nosanitizesort
              \fi
            }%
          }%
%    \end{macrocode}
% Unlike \cs{makenoidxglossaries} we can't automatically set
% sanitizesort=false. All entries must be defined in the preamble.
%    \begin{macrocode}
          \renewcommand*\new@glossaryentry[2]{%
            \PackageError{glossaries-extra}{Glossary entries must be defined
             in the preamble\MessageBreak when you use the optional argument
             of \string\makeglossaries}{Either move your definitions to the
             preamble or don't use the optional argument of
             \string\makeglossaries}%
          }%
%    \end{macrocode}
% Only activate sort key for glossaries that aren't listed in
% \verb|#1| (glossary label is stored in \cs{@glo@type} but this
% defaults to \cs{glsdefaulttype} so some expansion is required).
%    \begin{macrocode}
          \let\@glo@assign@sortkey\@glsxtr@mixed@assign@sortkey
          \renewcommand*{\@printgloss@setsort}{%
%    \end{macrocode}
% Need to extract just the \gloskey[printglossary]{type} value.
%    \begin{macrocode}
            \expandafter\@glsxtr@gettype\expandafter,\@glsxtr@printglossopts,%
              type=\glsdefaulttype,\@end@glsxtr@gettype
            \def\@glo@sorttype{\@glo@default@sorttype}%
          }%
%    \end{macrocode}
% Check \pkgopt{automake} setting:
%    \begin{macrocode}
          \ifglsautomake
            \renewcommand*{\@gls@doautomake}{%
              \@for\@gls@type:=\@glsxtr@reg@glosslist\do{%
                \ifdefempty{\@gls@type}{}{\@gls@automake{\@gls@type}}%
              }%
            }%
          \fi
%    \end{macrocode}
% Check the sort setting (\sty{glossaries} v4.30 onwards):
%    \begin{macrocode}
          \ifdef\@glo@check@sortallowed{\@glo@check@sortallowed\makeglossaries}{}%
%    \end{macrocode}
%\changes{1.6}{2025-04-12}{check for \cs{GlsNoIdxDoRerunCheck}}
% Version 1.6: add rerun check if it's defined.
%    \begin{macrocode}
         \ifdef\GlsNoIdxDoRerunCheck
         {\AtEndDocument{\GlsNoIdxDoRerunCheck}}%
         {}%
       \fi
     }%
%    \end{macrocode}
% Prohibit the use of \cs{glsxtrnoidxgroups}.
%    \begin{macrocode}
     \prohibit@glsxtrnoidxgroups
%    \end{macrocode}
% Activate warnings for incompatible options.
%    \begin{macrocode}
     \let\gls@warn@makegloss@incompatible\@gls@warn@makegloss@incompatible
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\gls@warn@makegloss@incompatible}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\gls@warn@makegloss@incompatible}[2]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@warn@makegloss@incompatible}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@gls@warn@makegloss@incompatible}[2]{%
  #2\GlossariesExtraWarning{#1\space is incompatible with \string\makeglossaries}%
}
%    \end{macrocode}
%\end{macro}
%
%The optional argument version of \cs{makeglossaries} needs an
%adjustment to \cs{@printglossary} to allow \cs{@glo@assign@sortkey}
%to pick up the glossary type.
%
%Earlier versions of \sty{glossaries-extra} simply saved the
%original version of \cs{@printglossary} with \cs{let}
%\cs{@glsxtr@orgprintglossary}. This was later changed to actually
%defining \cs{@glsxtr@orgprintglossary} to something similar with
%some alterations to allow for ignored glossaries, which don't have
%an associated title and to by-pass the existence check with
%\cs{ifglossaryexists} which doesn't recognise ignored glossaries.
%(bib2gls writes \cs{provideignoredglossary} to the glstex file for some settings,
%so the glossary might not been defined on the first \LaTeX\ run and
%it needs to be allowed with \cs{printunsrtglossary} on subsequent
%runs.)
%
%Unfortunately, removing the existence check will cause an error
%if \cs{printglossary} is used with an ignored glossary.
%
%As from \sty{glossaries} v4.46, some new commands have been
%included to allow the existence check to be varied depending on
%whether or not ignored glossaries should be allowed, so check for
%them:
%\begin{macro}{\glsxtr@printgloss@checkexists}
%\changes{1.44}{2020-03-23}{new}
%    \begin{macrocode}
\ifdef\@printgloss@checkexists
{\newcommand{\glsxtr@printgloss@checkexists}{\@printgloss@checkexists}}
{\newcommand{\glsxtr@printgloss@checkexists}[2]{#2}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@orgprintglossary}
%(This command is also used for on-the-fly setting.)
%    \begin{macrocode}
\newcommand{\@glsxtr@orgprintglossary}[2]{%
  \def\@glo@type{\glsdefaulttype}%
%    \end{macrocode}
%Add check here.
%    \begin{macrocode}
  \def\glossarytitle{%
     \ifcsdef{@glotype@\@glo@type @title}%
     {\csuse{@glotype@\@glo@type @title}}%
     {\glossaryname}}%
  \def\glossarytoctitle{\glossarytitle}%
  \let\org@glossarytitle\glossarytitle
  \def\@glossarystyle{%
    \ifx\@glossary@default@style\relax
      \GlossariesWarning{No default glossary style provided \MessageBreak
        for the glossary `\@glo@type'. \MessageBreak
        Using fallback. \MessageBreak
        To fix this set the style with \MessageBreak
        \string\setglossarystyle\space or use the \MessageBreak
        style key=value option}%
    \fi
  }%
  \def\gls@dotoctitle{\glssettoctitle{\@glo@type}}%
  \let\@org@glossaryentrynumbers\glossaryentrynumbers
  \bgroup
    \@printgloss@setsort
    \setkeys{printgloss}{#1}%
    \ifx\glossarytitle\org@glossarytitle
    \else
      \cslet{@glotype@\@glo@type @title}{\glossarytitle}%
    \fi
    \let\currentglossary\@glo@type
    \let\org@glossaryentrynumbers\glossaryentrynumbers
    \let\glsnonextpages\@glsnonextpages
    \let\glsnextpages\@glsnextpages
%    \end{macrocode}
%\changes{1.22}{2017-11-08}{changed explicit \cs{let} for \cs{nopostdesc}
%to \cs{glsxtractivatenopost}}
%\changes{1.46}{2021-09-20}{changed \cs{xdef} to \cs{protected@xdef}}
%    \begin{macrocode}
    \glsxtractivatenopost
    \gls@dotoctitle
    \@glossarystyle
    \let\gls@org@glossaryentryfield\glossentry
    \let\gls@org@glossarysubentryfield\subglossentry
    \renewcommand{\glossentry}[1]{%
      \protected@xdef\glscurrententrylabel{\glsdetoklabel{##1}}%
      \gls@org@glossaryentryfield{##1}%
    }%
    \renewcommand{\subglossentry}[2]{%
      \protected@xdef\glscurrententrylabel{\glsdetoklabel{##2}}%
      \gls@org@glossarysubentryfield{##1}{##2}%
    }%
    \@gls@preglossaryhook
    \glsxtr@printgloss@checkexists{\@glo@type}{#2}%
  \egroup
  \global\let\glossaryentrynumbers\@org@glossaryentrynumbers
  \global\let\warn@noprintglossary\relax
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtractivatenopost}
%\changes{1.22}{2017-11-08}{new}
%Change \cs{nopostdesc} and \cs{glsxtrnopostpunc} to behave as they
%do in the glossary.
%    \begin{macrocode}
\newcommand*{\glsxtractivatenopost}{%
  \let\nopostdesc\@nopostdesc
  \let\glsxtrnopostpunc\@glsxtr@nopostpunc
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnopostpunc}
%\changes{1.22}{2017-11-08}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrnopostpunc}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@nopostpunc}
%Provide a command that works like \cs{nopostdesc} but only
%switches off the punctuation without suppressing the post-description
%hook.
%\changes{1.22}{2017-11-08}{new}
%    \begin{macrocode}
\newcommand{\@glsxtr@nopostpunc}{%
 \let\@@glsxtr@org@postdescription\glspostdescription
 \ifglsnopostdot
   \renewcommand{\glspostdescription}{%
     \glsnopostdottrue
     \let\glspostdescription\@@glsxtr@org@postdescription
     \let\glsxtrrestorepostpunc\@glsxtr@restore@postpunc
     \glsxtrpostdescription
     \@glsxtr@nopostpunc@postdesc}%
 \else
   \renewcommand{\glspostdescription}{%
     \let\glspostdescription\@@glsxtr@org@postdescription
     \let\glsxtrrestorepostpunc\@glsxtr@restore@postpunc
     \glsxtrpostdescription
     \@glsxtr@nopostpunc@postdesc}%
 \fi
 \glsnopostdotfalse
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@nopostpunc@postdesc}
%\changes{1.23}{2017-11-12}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@nopostpunc@postdesc}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@restore@postpunc}
%\changes{1.23}{2017-11-12}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@restore@postpunc}{%
 \def\@glsxtr@nopostpunc@postdesc{%
   \@glsxtr@org@postdescription
   \let\@glsxtr@nopostpunc@postdesc\@empty
   \let\glsxtrrestorepostpunc\@empty
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrrestorepostpunc}
%\changes{1.23}{2017-11-12}{new}
%Does nothing outside of glossary.
%    \begin{macrocode}
\newcommand*{\glsxtrrestorepostpunc}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@printglossary}
%Redefine.
%\changes{1.09}{2016-12-16}{redefined to save options}
%    \begin{macrocode}
\renewcommand{\@printglossary}[2]{%
  \def\@glsxtr@printglossopts{#1}%
  \@glsxtr@orgprintglossary{#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%Add a key that switches off the entry targets:
%\changes{1.12}{2017-02-03}{added target key to printgloss family}
%    \begin{macrocode}
\define@choicekey{printgloss}{target}
[\@glsxtr@printglossval\@glsxtr@printglossnr]%
{true,false}[true]%
{%
  \ifcase\@glsxtr@printglossnr
%    \end{macrocode}
%\changes{1.31}{2018-05-09}{changed \cs{let} to \cs{def}}
%    \begin{macrocode}
    \def\@glstarget{\glsdohypertarget}%
  \else
    \let\@glstarget\@secondoftwo
  \fi
}
%    \end{macrocode}
%\begin{macro}{\@glsxtrhypernameprefix}
%\changes{1.20}{2017-09-11}{new}
%    \begin{macrocode}
\newcommand{\@glsxtrhypernameprefix}{}
%    \end{macrocode}
%\end{macro}
%
%New to v1.20:
%    \begin{macrocode}
\define@key{printgloss}{targetnameprefix}{%
  \renewcommand{\@glsxtrhypernameprefix}{#1}%
}
%    \end{macrocode}
%
%\changes{1.31}{2018-05-09}{added \texttt{prefix} key for \texttt{printgloss}}
%    \begin{macrocode}
\define@key{printgloss}{prefix}{%
  \renewcommand{\glolinkprefix}{#1}%
}
%    \end{macrocode}
%
%\changes{1.39}{2019-03-22}{added \texttt{label} key for \texttt{printgloss}}
%    \begin{macrocode}
\define@key{printgloss}{label}{%
  \glsxtrsetglossarylabel{#1}%
}
%    \end{macrocode}
%
%\changes{1.49}{2022-10-14}{added \texttt{preamble} key for \texttt{printgloss}}
%    \begin{macrocode}
\define@key{printgloss}{preamble}{%
  \renewcommand{\glossarypreamble}{#1}%
}
%    \end{macrocode}
%
%\changes{1.49}{2022-10-14}{added \texttt{postamble} key for \texttt{printgloss}}
%    \begin{macrocode}
\define@key{printgloss}{postamble}{%
  \renewcommand{\glossarypostamble}{#1}%
}
%    \end{macrocode}
%
%\begin{macro}{\glsxtrsetglossarylabel}
%\changes{1.39}{2019-03-22}{new}
%Set the label for subsequent glossaries. If the label is
%fixed (that is, doesn't change with each glossary) this will need
%to be scoped or changed again to prevent duplicate labels.
%    \begin{macrocode}
\newcommand{\glsxtrsetglossarylabel}[1]{%
  \ifstrempty{#1}%
  {%
    \renewcommand*{\@@glossaryseclabel}{}%
  }%
  {%
    \renewcommand*{\@@glossaryseclabel}{%
      \protected@edef\@currentlabelname{\glossarytoctitle}%
      \label{#1}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@leveloffset}
%\changes{1.44}{2020-03-23}{new}
%    \begin{macrocode}
\newcount\@glsxtr@leveloffset
%    \end{macrocode}
%\end{macro}
%New to v1.44:
%\changes{1.44}{2020-03-23}{added leveloffset key}
%    \begin{macrocode}
\define@key{printgloss}{leveloffset}{%
  \@glsxtr@assign@leveloffset#1\relax
  \gls@warn@noidxmakegloss@incompatible{option `leveloffset'}
    {\@glsxtr@leveloffset=0\relax}%
}
%    \end{macrocode}
%
%\begin{macro}{\@glsxtr@assign@leveloffset}
%\changes{1.44}{2020-03-23}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@assign@leveloffset}{%
 \@ifnextchar+{\p@glsxtr@assign@leveloffset}{\np@glsxtr@assign@leveloffset}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\p@glsxtr@assign@leveloffset}
%\changes{1.44}{2020-03-23}{new}
% Discard initial "+" character.
%    \begin{macrocode}
\newcommand*{\p@glsxtr@assign@leveloffset}[1]{%
 \@ifnextchar+{\pp@glsxtr@assign@leveloffset}{\np@glsxtr@assign@leveloffset}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\np@glsxtr@assign@leveloffset}
%\changes{1.44}{2020-03-23}{new}
%    \begin{macrocode}
\def\np@glsxtr@assign@leveloffset#1\relax{\@glsxtr@leveloffset=#1\relax}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\pp@glsxtr@assign@leveloffset}
%\changes{1.44}{2020-03-23}{new}
%    \begin{macrocode}
\def\pp@glsxtr@assign@leveloffset#1\relax{\advance\@glsxtr@leveloffset by #1\relax}
%    \end{macrocode}
%\end{macro}
%
%\changes{1.44}{2020-03-23}{added groups key}
%    \begin{macrocode}
\define@boolkey{printgloss}[glsxtr@printgloss@]{groups}[true]{%
 \ifglsxtr@printgloss@groups
 \else
  \gls@warn@noidxmakegloss@incompatible{option `groups'}%
    {\glsxtr@printgloss@groupstrue}%
 \fi
}
\glsxtr@printgloss@groupstrue
%    \end{macrocode}
%
%\changes{1.49}{2022-10-14}{added flatten key}
%    \begin{macrocode}
\define@boolkey{printgloss}[glsxtrprintgloss]{flatten}[true]{%
 \ifglsxtrprintglossflatten
  \gls@warn@noidxmakegloss@incompatible{option `flatten'}%
    {\glsxtrprintglossflattenfalse}%
 \fi
}
\glsxtrprintglossflattenfalse
%    \end{macrocode}
%
%\begin{macro}{\glsdohypertarget}
%\changes{1.20}{2017-09-11}{added redefinition}
%Redefine to insert \cs{@glsxtrhypernameprefix} before the target
%name.
%    \begin{macrocode}
\let\@glsxtr@org@glsdohypertarget\glsdohypertarget
\renewcommand{\glsdohypertarget}[2]{%
  \@glsxtr@org@glsdohypertarget{\@glsxtrhypernameprefix#1}{#2}%
}
%    \end{macrocode}
%\changes{1.31}{2018-05-09}{bug fix: ensure that new version is picked up}
%Update \cs{@glstarget} to use \cs{def} instead being assigned with
%\cs{let} so that it can pick up the new definition and allow any
%further redefinitions:
%    \begin{macrocode}
\ifx\@glstarget\@glsxtr@org@glsdohypertarget
 \def\@glstarget{\glsdohypertarget}%
\fi
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@do@org@target}
%\changes{1.48}{2021-11-22}{new}
% Provide a way to locally do the original.
%    \begin{macrocode}
\newcommand{\@glsxtr@do@org@target}[2]{%
 {%
  \let\glsdohypertarget\@glsxtr@org@glsdohypertarget
  \@glstarget{#1}{#2}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@makeglossaries}
%For the benefit of \app{makeglossaries}
%\changes{1.09}{2016-12-16}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@makeglossaries}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@gettype}
%Get just the type.
%\changes{1.09}{2016-12-16}{new}
%    \begin{macrocode}
\def\@glsxtr@gettype#1,type=#2,#3\@end@glsxtr@gettype{%
  \def\@glo@type{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@mixed@assign@sortkey}
%Assign the sort key.
%\changes{1.09}{2016-12-16}{new}
%    \begin{macrocode}
\newcommand\@glsxtr@mixed@assign@sortkey[1]{%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
  \protected@edef\@glo@type{\@glo@type}%
  \expandafter\DTLifinlist\expandafter{\@glo@type}{\@glsxtr@reg@glosslist}%
  {%
    \@glo@no@assign@sortkey{#1}%
  }%
  {%
    \@@glo@assign@sortkey{#1}%
  }%
}%
%    \end{macrocode}
%\end{macro}
% Display number list for the regular version:
%\begin{macro}{\@glsxtr@idx@displaynumberlist}
%\changes{1.0}{2016-01-24}{new}
%    \begin{macrocode}
\let\@glsxtr@idx@displaynumberlist\glsdisplaynumberlist
%    \end{macrocode}
%\end{macro}
%
% Display number list for the \qt{noidx} version:
%\begin{macro}{\@glsxtr@noidx@displaynumberlist}
%\changes{1.0}{2016-01-24}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@noidx@displaynumberlist}[1]{%
  \letcs{\@gls@loclist}{glo@\glsdetoklabel{#1}@loclist}%
  \ifdef\@gls@loclist
  {%
    \def\@gls@noidxloclist@sep{%
      \def\@gls@noidxloclist@sep{%
        \def\@gls@noidxloclist@sep{%
          \glsnumlistsep
        }%
        \def\@gls@noidxloclist@finalsep{\glsnumlistlastsep}%
      }%
    }%
    \def\@gls@noidxloclist@finalsep{}%
    \def\@gls@noidxloclist@prev{}%
    \forlistloop{\glsnoidxdisplayloclisthandler}{\@gls@loclist}%
    \@gls@noidxloclist@finalsep
    \@gls@noidxloclist@prev
  }%
  {%
%    \end{macrocode}
%\changes{1.17}{2017-08-09}{replace hard-coded ?? with
%\cs{glsxtrundeftag}}
%    \begin{macrocode}
    \glsxtrundeftag
    \glsdoifexists{#1}%
    {%
      \GlossariesWarning{Missing location list for `#1'. Either
        a rerun is required or you haven't referenced the entry.}%
    }%
  }%
}%

%    \end{macrocode}
%\end{macro}
%And for the number list loop:
%\begin{macro}{\@glsxtr@noidx@numberlistloop}
%\changes{1.0}{2016-01-24}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@noidx@numberlistloop}[3]{%
  \letcs{\@gls@loclist}{glo@\glsdetoklabel{#1}@loclist}%
  \let\@gls@org@glsnoidxdisplayloc\glsnoidxdisplayloc
  \let\@gls@org@glsseeformat\glsseeformat
  \let\glsnoidxdisplayloc#2\relax
  \let\glsseeformat#3\relax
  \ifdef\@gls@loclist
  {%
    \forlistloop{\glsnoidxnumberlistloophandler}{\@gls@loclist}%
  }%
  {%
%    \end{macrocode}
%\changes{1.17}{2017-08-09}{replace hard-coded ?? with
%\cs{glsxtrundeftag}}
%    \begin{macrocode}
    \glsxtrundeftag
    \glsdoifexists{#1}%
    {%
      \GlossariesWarning{Missing location list for `##1'. Either
        a rerun is required or you haven't referenced the entry.}%
    }%
  }%
  \let\glsnoidxdisplayloc\@gls@org@glsnoidxdisplayloc
  \let\glsseeformat\@gls@org@glsseeformat
}%
%    \end{macrocode}
%\end{macro}
%
%Same for entry number list.
%\begin{macro}{\@glsxtr@noidx@entrynumberlist}
%\changes{1.0}{2016-01-24}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@noidx@entrynumberlist}[1]{%
  \letcs{\@gls@loclist}{glo@\glsdetoklabel{#1}@loclist}%
  \ifdef\@gls@loclist
  {%
    \glsnoidxloclist{\@gls@loclist}%
  }%
  {%
%    \end{macrocode}
%\changes{1.17}{2017-08-09}{replace hard-coded ?? with
%\cs{glsxtrundeftag}}
%    \begin{macrocode}
    \glsxtrundeftag
    \glsdoifexists{#1}%
    {%
      \GlossariesWarning{Missing location list for `#1'. Either
        a rerun is required or you haven't referenced the entry.}%
    }%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@idx@entrynumberlist}
%\changes{1.0}{2016-01-24}{new}
%\changes{1.04}{2016-05-02}{switched from \cs{let} to \cs{newcommand}}
%    \begin{macrocode}
\newcommand*{\@glsxtr@idx@entrynumberlist}[1]{\glsentrynumberlist{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@noidx@getgrouptitle}
%\changes{1.14}{2017-04-18}{new}
%\changes{1.16}{2017-06-15}{fixed bug}
%\changes{1.57}{??}{check for new datatool integration}
%Patch. Need to take into account new internal token list variable
%used with new \sty{datatool} integration.
%    \begin{macrocode}
\renewcommand*{\@gls@noidx@getgrouptitle}[2]{%
 \protected@edef\@glsxtr@titlelabel{#1}%
 \ifdefvoid\@glsxtr@titlelabel
 {}%
 {%
  \protected@edef\@glsxtr@titlelabel{\csuse{glsxtr@grouptitle@#1}}%
 }%
 \ifdefvoid{\@glsxtr@titlelabel}%
 {%
   \ifcsvoid{l__glossaries_noidx_#1_grouptitle_tl}%
   {%
%    \end{macrocode}
%Use old method.
%    \begin{macrocode}
      \DTLifint{#1}%
      {%
        \ifnum#1<256\relax
          \edef#2{\char#1\relax}%
        \else
          \edef#2{#1}%
        \fi
      }%
      {%
        \ifcsundef{#1groupname}%
        {\def#2{#1}}%
        {\letcs#2{#1groupname}}%
      }%
    }%
    {%
      \letcs#2{l__glossaries_noidx_#1_grouptitle_tl}%
    }%
  }%
  {%
    \let#2\@glsxtr@titlelabel
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@org@getgrouptitle}
%\changes{1.14}{2017-04-18}{new}
%Save original definition of \cs{@gls@getgrouptitle}
%    \begin{macrocode}
\let\glsxtr@org@getgrouptitle\@gls@getgrouptitle
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnoidxgroups}
%\changes{1.49}{2022-10-14}{new}
%Provide the ability to switch from unsrt to noidx code, but only
%for record=off.
%    \begin{macrocode}
\newcommand*{\glsxtrnoidxgroups}{%
  \ifdefequal\@glsxtr@record@setting\@glsxtr@record@setting@off
  {%
   \let\@gls@getgrouptitle\@gls@noidx@getgrouptitle
   \let\glsxtr@org@getgrouptitle\@gls@getgrouptitle
  }%
  {\PackageError{glossaries-extra}{Can't use
   \string\glsxtrunsrtgrouptonoidx\space with record=\@glsxtr@record@setting}
   {\string\glsxtrunsrtgrouptonoidx\space is only available with record=off}}%
   \global\let\prohibit@glsxtrnoidxgroups\@glsxtrnoidxgroups@nomakegloss
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrnoidxgroups@nomakegloss}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\@glsxtrnoidxgroups@nomakegloss}{%
 \PackageError{glossaries-extra}{Can't use
   \string\glsxtrunsrtgrouptonoidx\space with \string\makeglossaries}{}
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\prohibit@glsxtrnoidxgroups}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\prohibit@glsxtrnoidxgroups}{%
  \global\let\glsxtrnoidxgroups\@glsxtrnoidxgroups@nomakegloss
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgetgrouptitle}
%\changes{1.14}{2017-04-18}{new}
%Provide a user-level command to fetch the group title. The first
%argument is the group label. The second argument is a control
%sequence in which to store the title.
%    \begin{macrocode}
\newrobustcmd{\glsxtrgetgrouptitle}[2]{%
  \protected@edef\@glsxtr@titlecsname{glsxtr@grouptitle@#1}%
  \@onelevel@sanitize\@glsxtr@titlecsname
  \ifcsdef{\@glsxtr@titlecsname}
  {\letcs{#2}{\@glsxtr@titlecsname}}%
  {\glsxtr@org@getgrouptitle{#1}{#2}}%
}
\let\@gls@getgrouptitle\glsxtrgetgrouptitle
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsetgrouptitle}
%\changes{1.14}{2017-04-18}{new}
%Sets the title for the given group label.
%\changes{1.28}{2018-03-06}{changed \cs{csxdef} \cs{protected@csxdef}}
%    \begin{macrocode}
\newcommand{\glsxtrsetgrouptitle}[2]{%
  \protected@edef\@glsxtr@titlelabel{glsxtr@grouptitle@#1}%
  \@onelevel@sanitize\@glsxtr@titlelabel
  \protected@csxdef{\@glsxtr@titlelabel}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrlocalsetgrouptitle}
%\changes{1.24}{2017-11-14}{new}
%As above put only locally defines the title.
%\changes{1.28}{2018-03-06}{changed \cs{csedef} \cs{protected@csedef}}
%    \begin{macrocode}
\newcommand{\glsxtrlocalsetgrouptitle}[2]{%
  \protected@edef\@glsxtr@titlelabel{glsxtr@grouptitle@#1}%
  \@onelevel@sanitize\@glsxtr@titlelabel
  \protected@csedef{\@glsxtr@titlelabel}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%    \begin{macrocode}
\ifdef\glsnavigationitem
{
%    \end{macrocode}
%\begin{macro}{\glsnavigationitem}
%\changes{1.52}{2023-09-23}{added}
%    \begin{macrocode}
  \renewcommand\glsnavigationitem[1]{%
    \glsxtrgetgrouptitle{#1}{\@gls@grptitle}%
    \glsnavhyperlink{#1}{\@gls@grptitle}%
  }
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
}
{
%    \end{macrocode}
%\begin{macro}{\glsnavigation}
%\changes{1.14}{2017-04-18}{new}
%Redefine to use new user-level command. This patch should not be
%used with \sty{glossaries} v4.53+.
%    \begin{macrocode}
  \renewcommand*{\glsnavigation}{%
    \def\@gls@between{}%
    \ifcsundef{@gls@hypergrouplist@\@glo@type}%
    {%
      \def\@gls@list{}%
    }%
    {%
      \expandafter\let\expandafter\@gls@list
        \csname @gls@hypergrouplist@\@glo@type\endcsname
    }%
    \@for\@gls@tmp:=\@gls@list\do{%
      \@gls@between
      \glsxtrgetgrouptitle{\@gls@tmp}{\@gls@grptitle}%
      \glsnavhyperlink{\@gls@tmp}{\@gls@grptitle}%
      \let\@gls@between\glshypernavsep
    }%
  }
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@print@noidx@glossary}
%\changes{1.11}{2017-01-19}{added redefinition}
%\changes{1.58}{2025-03-12}{check for glossaries v4.57}
%Only redefine if old version (pre v4.57) of \sty{glossaries}.
%    \begin{macrocode}
\ExplSyntaxOn
\cs_if_exist:NF \__glossaries_print_noidx:
 {
  \renewcommand*{\@print@noidx@glossary}{%
    \ifcsdef{@glsref@\@glo@type}%
    {%
      \ifcsdef{@glo@sortmacro@\@glo@sorttype}%
      {%
        \csuse{@glo@sortmacro@\@glo@sorttype}{\@glo@type}%
      }%
      {%
        \PackageError{glossaries}{Unknown ~ sort ~ handler ~ `\@glo@sorttype'}{}%
      }%
      \glossarysection[\glossarytoctitle]{\glossarytitle}%
      \glossarypreamble
%    \end{macrocode}
%Moved this command definition outside of environment in case of
%scoping issues (e.g. in tabular-like styles).
%    \begin{macrocode}
      \def\@gls@currentlettergroup{}%
      \begin{theglossary}%
      \glossaryheader
      \glsresetentrylist
      \forlistcsloop{\@gls@noidx@do}{@glsref@\@glo@type}%
      \end{theglossary}%
      \glossarypostamble
    }%
    {%
%    \end{macrocode}
%Add section header if there are actually entries defined in this
%glossary as the document is likely pending a re-run.
%    \begin{macrocode}
      \glsxtrifemptyglossary{\@glo@type}%
      {}%
      {\glossarysection[\glossarytoctitle]{\glossarytitle}}%
      \@gls@noref@warn{\@glo@type}%
    }%
  }
 }
\ExplSyntaxOff
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsnoidxdisplayloc}
%\changes{1.12}{2017-02-03}{added redefinition}
%Patch to check for range formations.
%    \begin{macrocode}
\renewcommand*{\glsnoidxdisplayloc}[4]{%
  \setentrycounter[#1]{#2}%
  \@glsxtr@display@loc#3\empty\end@glsxtr@display@loc{#4}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@display@loc}
%\changes{1.12}{2017-02-03}{new}
%Patch to check for range formations.
%    \begin{macrocode}
\def\@glsxtr@display@loc#1#2\end@glsxtr@display@loc#3{%
  \ifx#1(\relax
    \glsxtrdisplaystartloc{#2}{#3}%
  \else
    \ifx#1)\relax
      \glsxtrdisplayendloc{#2}{#3}%
    \else
      \glsxtrdisplaysingleloc{#1#2}{#3}%
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrdisplaysingleloc}
%\changes{1.12}{2017-02-03}{new}
%Single location.
%    \begin{macrocode}
\newcommand*{\glsxtrdisplaysingleloc}[2]{%
  \csuse{#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%By default the range identifiers are simply ignored.
%A custom list loop handler can be defined by the user
%to test for ranges by checking the definition of
%\cs{glsxtrlocrangefmt}.
%
%\begin{macro}{\glsxtrdisplaystartloc}
%\changes{1.12}{2017-02-03}{new}
%Start of a location range.
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
\newcommand*{\glsxtrdisplaystartloc}[2]{%
  \protected@edef\glsxtrlocrangefmt{#1}%
  \ifx\glsxtrlocrangefmt\empty
    \def\glsxtrlocrangefmt{glsnumberformat}%
  \fi
  \expandafter\glsxtrdisplaysingleloc
    \expandafter{\glsxtrlocrangefmt}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrdisplayendloc}
%\changes{1.12}{2017-02-03}{new}
%\changes{1.14}{2017-04-18}{added check for empty format}
%End of a location range.
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
\newcommand*{\glsxtrdisplayendloc}[2]{%
  \protected@edef\@glsxtr@tmp{#1}%
  \ifdefempty{\@glsxtr@tmp}{\def\@glsxtr@tmp{glsnumberformat}}{}%
  \ifx\glsxtrlocrangefmt\@glsxtr@tmp
  \else
    \GlossariesExtraWarning{Mismatched end location range 
      (start=\glsxtrlocrangefmt, end=\@glsxtr@tmp)}%
  \fi
  \expandafter\glsxtrdisplayendlochook\expandafter{\@glsxtr@tmp}{#2}%
  \expandafter\glsxtrdisplaysingleloc
    \expandafter{\glsxtrlocrangefmt}{#2}%
  \def\glsxtrlocrangefmt{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrdisplayendlochook}
%\changes{1.12}{2017-02-03}{new}
%Allow the user to hook into the end of range command.
%    \begin{macrocode}
\newcommand*{\glsxtrdisplayendlochook}[2]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrlocrangefmt}
%\changes{1.12}{2017-02-03}{new}
%Current range format. Empty if not in a range.
%    \begin{macrocode}
\newcommand*{\glsxtrlocrangefmt}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\setentrycounter}
%\changes{1.29}{2018-04-09}{new}
%Adjust \cs{setentrycounter} to save the original prefix.
%    \begin{macrocode}
\renewcommand*{\setentrycounter}[2][]{%
  \def\glsxtrcounterprefix{#1}%
  \ifx\glsxtrcounterprefix\@empty
    \def\@glo@counterprefix{.}%
  \else
    \def\@glo@counterprefix{.#1.}%
  \fi
  \def\glsentrycounter{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@removespaces}
%\changes{1.14}{2017-04-18}{new}
%Redefine to allow adjustments to location hyperlink.
%    \begin{macrocode}
\def\@gls@removespaces#1 #2\@nil{%
 \toks@=\expandafter{\the\toks@#1}%
 \ifx\\#2\\%
%    \end{macrocode}
%\changes{1.39}{2019-03-22}{changed \cs{x} to \cs{@glo@tmp}}
%    \begin{macrocode}
   \edef\@glo@tmp{\the\toks@}%
   \ifx\@glo@tmp\empty
   \else
%    \end{macrocode}
%Expand location (just in case \cs{toks@} is needed for something
%else).
%\changes{1.29}{2018-04-09}{added expansion}
%    \begin{macrocode}
    \expandafter\glsxtrlocationhyperlink\expandafter
     \glsentrycounter\expandafter\@glo@counterprefix\expandafter{\the\toks@}%
   \fi
 \else
   \@gls@ReturnAfterFi{%
     \@gls@removespaces#2\@nil
   }%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrlocationhyperlink}
%\changes{1.14}{2017-04-18}{new}
%\begin{definition}
%\cs{glsxtrlocationhyperlink}\marg{counter}\marg{prefix}\marg{location}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\glsxtrlocationhyperlink}[3]{%
  \ifdefvoid\glsxtrsupplocationurl
  {%
    \GlsXtrInternalLocationHyperlink{#1}{#2}{#3}%
  }%
  {%
    \hyperref{\glsxtrsupplocationurl}{}{#1#2#3}{#3}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsupphypernumber}
%\changes{1.14}{2017-04-18}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrsupphypernumber}[1]{%
 {%
   \glshasattribute{\glscurrententrylabel}{externallocation}%
   {%
     \def\glsxtrsupplocationurl{%
       \glsgetattribute{\glscurrententrylabel}{externallocation}}%
   }%
   {%
     \def\glsxtrsupplocationurl{}%
   }%
   \glshypernumber{#1}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
% Give a bit of assistance to new users who are confused and don't
% know how to read transcript messages.
%\begin{macro}{\@print@glossary}
%\changes{0.3}{2015-12-02}{added redefinition}
%    \begin{macrocode}
\renewcommand{\@print@glossary}{%
  \makeatletter
  \@input@{\jobname.\csname @glotype@\@glo@type @in\endcsname}%
  \IfFileExists{\jobname.\csname @glotype@\@glo@type @in\endcsname}%
  {}%
  {\glsxtrNoGlossaryWarning{\@glo@type}}%
  \ifglsxindy
    \ifcsundef{@xdy@\@glo@type @language}%
    {%
      \edef\@do@auxoutstuff{%
        \noexpand\AtEndDocument{%
          \noexpand\immediate\noexpand\write\@auxout{%
            \string\providecommand\string\@xdylanguage[2]{}}%
          \noexpand\immediate\noexpand\write\@auxout{%
            \string\@xdylanguage{\@glo@type}{\@xdy@main@language}}%
        }%
      }%
    }%
    {%
      \edef\@do@auxoutstuff{%
        \noexpand\AtEndDocument{%
          \noexpand\immediate\noexpand\write\@auxout{%
            \string\providecommand\string\@xdylanguage[2]{}}%
          \noexpand\immediate\noexpand\write\@auxout{%
            \string\@xdylanguage{\@glo@type}{\csname @xdy@\@glo@type
              @language\endcsname}}%
        }%
      }%
    }%
    \@do@auxoutstuff
    \edef\@do@auxoutstuff{%
      \noexpand\AtEndDocument{%
         \noexpand\immediate\noexpand\write\@auxout{%
          \string\providecommand\string\@gls@codepage[2]{}}%
         \noexpand\immediate\noexpand\write\@auxout{%
          \string\@gls@codepage{\@glo@type}{\gls@codepage}}%
      }%
    }%
    \@do@auxoutstuff
  \fi
  \renewcommand*{\@warn@nomakeglossaries}{%
    \GlossariesWarningNoLine{\string\makeglossaries\space
    hasn't been used,^^Jthe glossaries will not be updated}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
% Setup the warning text to display if the external file for the given
% glossary is missing.
%
%\begin{macro}{\GlsXtrNoGlsWarningHead}
% Header message.
%    \begin{macrocode}
\newcommand{\GlsXtrNoGlsWarningHead}[2]{%
 This document is incomplete. The external file associated with
 the glossary `#1' (which should be called \texttt{#2})
 hasn't been created.%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrNoGlsWarningEmptyStart}
% No entries have been added to the glossary.
%    \begin{macrocode}
\newcommand{\GlsXtrNoGlsWarningEmptyStart}{%
  This has probably happened because there are no entries defined 
  in this glossary.%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrNoGlsWarningEmptyMain}
% The default \qt{main} glossary is empty.
%    \begin{macrocode}
\newcommand{\GlsXtrNoGlsWarningEmptyMain}{%
 If you don't want this glossary,
 add \texttt{nomain} to your package option list when you load
 \texttt{glossaries-extra.sty}. For example:%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrNoGlsWarningEmptyNotMain}
% A glossary that isn't the default \qt{main} glossary is empty.
%    \begin{macrocode}
\newcommand{\GlsXtrNoGlsWarningEmptyNotMain}[1]{%
 Did you forget to use \texttt{type=#1} when you defined your
 entries? If you tried to load entries into this glossary with
 \texttt{\string\loadglsentries} did you remember to use
 \texttt{[#1]} as the optional argument? If you did, check that
 the definitions in the file you loaded all had the type set
 to \texttt{\string\glsdefaulttype}.%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrNoGlsWarningCheckFile}
% Advisory message to check the file contents.
%    \begin{macrocode}
\newcommand{\GlsXtrNoGlsWarningCheckFile}[1]{%
  Check the contents of the file \texttt{#1}. If
  it's empty, that means you haven't indexed any of your entries in this
  glossary (using commands like \texttt{\string\gls} or
  \texttt{\string\glsadd}) so this list can't be generated.
  If the file isn't empty, the document build process hasn't been
  completed.%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrNoGlsWarningAutoMake}
% Message when \pkgopt{automake} option has been used.
%    \begin{macrocode}
\newcommand{\GlsXtrNoGlsWarningAutoMake}[1]{%
  You may need to rerun \LaTeX. If you already have, it may be that
  \TeX's shell escape doesn't allow you to run
  \ifglsxindy xindy\else makeindex\fi. Check the
  transcript file \texttt{\jobname.log}. If the shell escape is
  disabled, try one of the following:

  \begin{itemize}
    \item Run the external (Lua) application:

       \texttt{makeglossaries-lite \string"\jobname\string"}

    \item Run the external (Perl) application:

       \texttt{makeglossaries \string"\jobname\string"}
  \end{itemize}
  
  Then rerun \LaTeX\ on this document.
  \GlossariesExtraWarning{Rerun required to build the 
  glossary `#1' or check TeX's shell escape allows
  you to run \ifglsxindy xindy\else makeindex\fi}%
}
%    \end{macrocode}
%\end{macro}
%
%\changes{0.5.3}{2015-12-09}{removed \cs{GlsXtrNoGlsWarningNoAutoMakeMain}}
%
%\begin{macro}{\GlsXtrNoGlsWarningMisMatch}
% Mismatching \cs{makenoidxglossaries}.
%    \begin{macrocode}
\newcommand{\GlsXtrNoGlsWarningMisMatch}{%
  You need to either replace \texttt{\string\makenoidxglossaries}
  with \texttt{\string\makeglossaries} or replace
  \texttt{\string\printglossary} (or \texttt{\string\printglossaries}) with
  \texttt{\string\printnoidxglossary}
  (or \texttt{\string\printnoidxglossaries}) and then rebuild
  this document.%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrNoGlsWarningBuildInfo}
% Build advice.
%    \begin{macrocode}
\newcommand{\GlsXtrNoGlsWarningBuildInfo}{%
  Try one of the following:
  \begin{itemize}
    \item Add \texttt{automake} to your package option list when you load
          \texttt{glossaries-extra.sty}. For example:

          \texttt{\string\usepackage[automake]%
              \glsopenbrace glossaries-extra\glsclosebrace}

    \item Run the external (Lua) application:

          \texttt{makeglossaries-lite.lua \string"\jobname\string"}

    \item Run the external (Perl) application:

          \texttt{makeglossaries \string"\jobname\string"}
  \end{itemize}
  
  Then rerun \LaTeX\ on this document.%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrRecordWarning}
% Paragraph for \pkgopt[only]{record}.
%\changes{1.31}{2018-05-09}{new}
%    \begin{macrocode}
\newcommand{\GlsXtrRecordWarning}[1]{%
 \texttt{\string\printglossary} doesn't work
 with the \texttt{record=\@glsxtr@record@setting} package option 
 use\par\texttt{\string\printunsrtglossary[type=#1]}\par
 instead (or change the package option).%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrNoGlsWarningTail}
% Final paragraph.
%    \begin{macrocode}
\newcommand{\GlsXtrNoGlsWarningTail}{%
 This message will be removed once the problem has been fixed.%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrNoGlsWarningNoOut}
% No out file created.
% Build advice.
%    \begin{macrocode}
\newcommand{\GlsXtrNoGlsWarningNoOut}[1]{%
  The file \texttt{#1} doesn't exist. This most likely means you haven't used
  \texttt{\string\makeglossaries} or you have used
  \texttt{\string\nofiles}. If this is just a draft version of the
  document, you can suppress this message using the 
  \texttt{nomissingglstext} package option.%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@defaultnoglossarywarning}
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@defaultnoglossarywarning}[1]{%
 \glossarysection[\glossarytoctitle]{\glossarytitle}
 \GlsXtrNoGlsWarningHead{#1}{\jobname.\csname @glotype@\@glo@type @in\endcsname}
 \par
 \glsxtrifemptyglossary{#1}%
 {%
    \GlsXtrNoGlsWarningEmptyStart\space
    \ifthenelse{\equal{#1}{main}}{\GlsXtrNoGlsWarningEmptyMain\par
    \medskip
    \noindent\texttt{\string\usepackage[nomain\ifglsacronym ,acronym\fi]%
        \glsopenbrace glossaries-extra\glsclosebrace}
    \medskip
    }%
    {\GlsXtrNoGlsWarningEmptyNotMain{#1}}%
 }%
 {%
   \IfFileExists{\jobname.\csname @glotype@\@glo@type @out\endcsname}
   {%
     \GlsXtrNoGlsWarningCheckFile
       {\jobname.\csname @glotype@\@glo@type @out\endcsname}

     \ifglsautomake
 
      \GlsXtrNoGlsWarningAutoMake{#1}

     \else

        \ifthenelse{\equal{#1}{main}}%
        {%
          \GlsXtrNoGlsWarningEmptyMain\par
          \medskip
          \noindent\texttt{\string\usepackage[nomain]%
            \glsopenbrace glossaries-extra\glsclosebrace}
          \medskip
        }%
        {}%

        \ifdefequal\makeglossaries\@no@makeglossaries
        {%
          \GlsXtrNoGlsWarningMisMatch
        }%
        {%
          \GlsXtrNoGlsWarningBuildInfo
        }%
     \fi
   }%
   {%
     \GlsXtrNoGlsWarningNoOut
       {\jobname.\csname @glotype@\@glo@type @out\endcsname}%
   }%
 }%
 \par
 \GlsXtrNoGlsWarningTail
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@record@noglossarywarning}
%\changes{1.31}{2018-05-09}{new}
%Warn about using \cs{printglossary} with \pkgopt{record}
%    \begin{macrocode}
\newcommand*{\@glsxtr@record@noglossarywarning}[1]{%
  \GlossariesExtraWarning{\string\printglossary\space doesn't work\MessageBreak
  with record=\@glsxtr@record@setting\space package option\MessageBreak(use
  \string\printunsrtglossary[type=#1])\MessageBreak
  instead (or change the package option)}%
 \glossarysection[\glossarytoctitle]{\glossarytitle}
 \GlsXtrRecordWarning{#1}
 \GlsXtrNoGlsWarningTail
}
%    \end{macrocode}
%\end{macro}
%
%Provide some commands to accompany the \pkgopt{record} option
%for use with \href{https://github.com/nlct/bib2gls}{bib2gls}.
%
%\begin{macro}{\GlsXtrDefaultResourceOptions}
%\changes{1.40}{2019-03-31}{new}
%Default resource options.
%    \begin{macrocode}
\newcommand*{\GlsXtrDefaultResourceOptions}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\BibGlsOptions}
%\changes{1.54}{2025-01-03}{new}
%Supply global \app{bib2gls} options. Provided as an alternative to
%using the command line switches, except for those that must be set
%on startup.
%    \begin{macrocode}
\NewDocumentCommand\BibGlsOptions{m}{%
 \protected@write\@auxout{}{\string\bibgls@options{#1}}%
}
\newcommand{\bibgls@options}[1]{}
\@onlypreamble\BibGlsOptions
%    \end{macrocode}
%\end{macro}
%
%Allowing arbitrary basename for the .glstex file can cause conflict if multiple documents
%use the same basename. This is most likely to occur because the user is
%simply using \cs{glsxtrresourcefile} as a convenient shortcut to avoid the more
%lengthy \cs{GlsXtrLoadResources}[src=\meta{bibname}]. 
%NB if multiple documents need to share the same resource set (including locations), then they
%should be using the "master" setting.
%
%Therefore, as from v1.55, \cs{glsxtrresourcefile} is deprecated. A new shortcut command
%is provided as a drop-in replacement and the original \cs{glsxtrresourcefile} is 
%changed to an internal command.
%
%\begin{macro}{\glsxtrresourcefile}
%\changes{1.08}{2016-12-13}{new}
%\changes{1.11}{2017-01-19}{changed extension to .glstex}
%\changes{1.55}{2025-01-29}{deprecated}
%Since it's dangerous for an external application to
%create a file with a .tex extension, as from v1.11 this 
%enforces a .glstex extension to avoid conflict.
%    \begin{macrocode}
\newcommand*{\glsxtrresourcefile}[2][]{%
 \GlossariesExtraWarning{\string\glsxtrresourcefile\space is now deprecated
  use \string\glsbibdata[...]{#2} instead}%
  \@glsxtr@resourcefile{#1}{#2}%
}
\@onlypreamble\glsxtrresourcefile
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsbibdata}
%\changes{1.55}{2025-01-29}{new}
%    \begin{macrocode}
\NewDocumentCommand\glsbibdata{om}{%
 \IfValueTF{#1}%
 {\GlsXtrLoadResources[src={#2},#1]}%
 {\GlsXtrLoadResources[src={#2}]}%
}
\@onlypreamble\glsbibdata
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@resourcefile}
%\changes{1.55}{2025-01-29}{new}
%This was the old \cs{glsxtrresourcefile} command.
%    \begin{macrocode}
\newcommand*{\@glsxtr@resourcefile}[2]{%
 \@glsxtr@if@record@only
 {\renewcommand{\glsindexingsetting}{bib2gls}}%
 {\edef\glsindexingsetting{bib2gls-\ifglsxindy xindy\else makeindex\fi}}%
%    \end{macrocode}
%The \pkgopt{record} option can't be set after this command.
%\changes{1.21}{2017-11-03}{now disables record key}
%    \begin{macrocode}
  \disable@keys{glossaries-extra.sty}{record}%
  \glsxtr@writefields
  \glsxtr@save@mfu
  \ifdefempty\GlsXtrDefaultResourceOptions
  {%
    \protected@write\@auxout{\glsxtrresourceinit}%
    {\string\glsxtr@resource{#1}{#2}}%
  }%
  {%
   \protected@write\@auxout{\glsxtrresourceinit}%
    {\string\glsxtr@resource{\GlsXtrDefaultResourceOptions,#1}{#2}}%
  }%
  \let\@glsxtr@org@see@noindex\@gls@see@noindex
  \let\@gls@see@noindex\relax
  \IfFileExists{#2.glstex}%
  {%
%    \end{macrocode}
%Can't scope \cs{@input} so save and restore the category code of
%\texttt{@} to allow for internal commands in the location list.
%\changes{1.12}{2017-02-03}{added catcode change for @}
%    \begin{macrocode}
    \edef\@bibgls@restoreat{\noexpand\catcode\noexpand`\noexpand\@=\number\catcode`\@}%
    \makeatletter
    \@input{#2.glstex}%
    \@bibgls@restoreat
%    \end{macrocode}
% If the \pkgopt[nameref]{record} option has been set, check if this
% is supported by the installed version of \app{bib2gls}.
%    \begin{macrocode}
    \@glsxtr@check@bibgls@nameref
  }%
  {%
    \GlossariesExtraWarning{No file `#2.glstex'}% 
  }%
  \let\@gls@see@noindex\@glsxtr@org@see@noindex
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@check@bibgls@nameref}
%\changes{1.37}{2018-11-30}{new}
%This will only warn after \app{bib2gls} has created the .glstex
%file, but there's way to check before.
%    \begin{macrocode}
\newcommand{\@glsxtr@check@bibgls@nameref}{%
  \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
    \ifdef\bibglshrefchar
    {}%
    {%
      \GlossariesExtraWarning{record=nameref requires at least
      version 1.8 of bib2gls}%
    }%
  \fi
  \let\@glsxtr@check@bibgls@nameref\relax
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrresourceinit}
%\changes{1.21}{2017-11-03}{new}
%Code used during the protected write operation.
%    \begin{macrocode}
\newcommand*{\glsxtrresourceinit}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrresourcecount}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcount\glsxtrresourcecount
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\GlsXtrLoadResources}
%\changes{1.11}{2017-01-19}{new}
%\changes{1.12}{2017-02-03}{removed restriction on only one per document}
%\changes{1.55}{2025-01-29}{switched to using \cs{@glsxtr@resourcefile}}
%Short cut that uses \cs{@glsxtr@resourcefile} with \cs{jobname} as
%the mandatory argument.
%    \begin{macrocode}
\NewDocumentCommand\GlsXtrLoadResources{O{}}{%
  \ifnum\glsxtrresourcecount=0\relax
    \@glsxtr@resourcefile{#1}{\jobname}%
  \else
    \@glsxtr@resourcefile{#1}{\jobname-\the\glsxtrresourcecount}%
  \fi
  \advance\glsxtrresourcecount by 1\relax
}
\@onlypreamble\GlsXtrLoadResources
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@resource}
%\changes{1.08}{2016-12-13}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@resource}[2]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMFUsave}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMFUsave}{%
  \ifdef\MFUsave
  {%
    \AtBeginDocument{\MFUsave}%
  }%
  {%
    \GlossariesExtraWarning{mfirstuc.sty too old, 
     \string\glsxtrMFUsave\space has no effect. You need to upgrade
     to mfirstuc v2.08}%
  }%
  \let\glsxtrMFUsave\relax
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@save@mfu}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\ifdef\MFUsave
{
  \newcommand*{\glsxtr@save@mfu}{%
    \glsxtrMFUsave
    \let\glsxtr@save@mfu\relax
  }
}
{
  \newcommand*{\glsxtr@save@mfu}{}
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@fields}
%\changes{1.11}{2017-01-19}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@fields}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@texencoding}
%\changes{1.11}{2017-01-19}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@texencoding}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@locale}
%\changes{1.51}{2023-04-24}{new}
%Used to identify all languages tracked in the document.
%    \begin{macrocode}
\newcommand*{\glsxtr@locale}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@langtag}
%\changes{1.12}{2017-02-03}{new}
%Identifies the current language at the time
%\cs{glsxtr@writefields} is used.
%    \begin{macrocode}
\newcommand*{\glsxtr@langtag}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@pluralsuffixes}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@pluralsuffixes}[4]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@shortcutsval}
%\changes{1.11}{2017-01-19}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@shortcutsval}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@linkprefix}
%\changes{1.11}{2017-01-19}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@linkprefix}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\cs{@gls@runshell} and \cs{@gls@run@output@dir} new to
%\sty{glossaries} v4.55 so may not be defined. If they haven't been
%defined, provide definitions which will match old behaviour.
%    \begin{macrocode}
\ifglsautomake
  \providecommand{\@gls@run@unrestricted@shell}[1]{\immediate\write18{#1}}
  \providecommand{\@gls@run@output@dir}[1]{}
\fi
%    \end{macrocode}
%
%\begin{macro}{\glsxtr@writefields}
%\changes{1.11}{2017-01-19}{new}
%This information only needs to be written once, so disable it after
%it's been used.
%    \begin{macrocode}
\newcommand*{\glsxtr@writefields}{%
%    \end{macrocode}
%\changes{1.16}{2017-06-15}{added \cs{providecommand} lines}
%    \begin{macrocode}
  \protected@write\@auxout{}%
   {\string\providecommand*{\string\glsxtr@fields}[1]{}}%
  \protected@write\@auxout{}%
   {\string\providecommand*{\string\glsxtr@resource}[2]{}}%
  \protected@write\@auxout{}%
   {\string\providecommand*{\string\glsxtr@pluralsuffixes}[4]{}}%
  \protected@write\@auxout{}%
   {\string\providecommand*{\string\glsxtr@shortcutsval}[1]{}}%
  \protected@write\@auxout{}%
   {\string\providecommand*{\string\glsxtr@linkprefix}[1]{}}%
  \protected@write\@auxout{}{\string\glsxtr@fields{\@gls@keymap}}%
%    \end{macrocode}
%\changes{1.22}{2017-11-08}{provide \cs{glsxtr@record} in aux file}
%    \begin{macrocode}
  \protected@write\@auxout{}%
   {\string\providecommand*{\string\glsxtr@record}[5]{}}%
%    \end{macrocode}
%\changes{1.37}{2018-11-30}{provide \cs{glsxtr@record@nameref} in aux file}
%    \begin{macrocode}
  \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
    \protected@write\@auxout{}%
     {\string\providecommand*{\string\glsxtr@record@nameref}[8]{}}%
  \fi
%    \end{macrocode}
%If any languages have been loaded, the language tag will be
%available in \cs{CurrentTrackedLanguageTag} (provided by
%\sty{tracklang}). For multilingual
%documents, the required locale will have to be indicated in the
%"sort" key when using \cs{GlsXtrLoadResources}.
%    \begin{macrocode}
  \ifdef\CurrentTrackedLanguageTag
  {%
     \ForEachTrackedDialect{\@glsxtr@currentdialect}{%
       \protected@write\@auxout{}{%
         \string\glsxtr@locale{\GetTrackedLanguageTag\@glsxtr@currentdialect}}%
     }%
     \protected@write\@auxout{}{%
       \string\glsxtr@langtag{\CurrentTrackedLanguageTag}}%
  }%
  {}%
  \protected@write\@auxout{}{\string\glsxtr@pluralsuffixes
    {\glspluralsuffix}{\abbrvpluralsuffix}{\acrpluralsuffix}%
    {\glsxtrabbrvpluralsuffix}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{encoding test replaced \cs{ifdef} with
%\cs{ifdefvoid} and reversed args}
%    \begin{macrocode}
  \ifdefvoid\inputencodingname
  {%
%    \end{macrocode}
%Assume UTF-8.
%\changes{1.49}{2022-10-14}{removed test for \sty{fontspec}}
%    \begin{macrocode}
     \protected@write\@auxout{}{\string\glsxtr@texencoding{utf8}}%
  }%
  {%
     \protected@write\@auxout{}{\string\glsxtr@texencoding{\inputencodingname}}%
  }%
  \protected@write\@auxout{}{\string\glsxtr@shortcutsval{\@glsxtr@shortcutsval}}%
%    \end{macrocode}
%Prefix deferred until the beginning of the document in case it's
%redefined later in the preamble. This is picked up by bib2gls when
%the external option is used.
%    \begin{macrocode}
  \AtBeginDocument
    {\protected@write\@auxout{}{\string\glsxtr@linkprefix{\glolinkprefix}}}%
  \let\glsxtr@writefields\relax
%    \end{macrocode}
%If the \pkgopt{automake} option is on, try running bib2gls if
%the aux file exists. This has to be done before the aux file is
%opened (so package options \pkgopt[immediate]{automake} and
%\pkgopt[true]{automake} are identical if just bib2gls is used).
%\changes{1.14}{2017-04-18}{added check for automake}
%\changes{1.19}{2017-09-09}{removed double-quotes around \cs{jobname}}
%The double-quotes around \cs{jobname} have been removed (v1.19)
%since \cs{jobname} will include double-quotes if the file name has
%spaces.
%    \begin{macrocode}
  \ifglsautomake
    \IfFileExists{\jobname.aux}%
    {%
      \@gls@run@unrestricted@shell{bib2gls \@gls@run@output@dir{--dir} \jobname}%
    }{}%
%    \end{macrocode}
%If \cs{makeglossaries} is also used, allow makeindex/xindy to
%also be run, otherwise disable the error message about requiring
%\cs{makeglossaries} with \pkgopt{automake}.
%    \begin{macrocode}
    \ifx\@gls@doautomake\@gls@doautomake@err
       \let\@gls@doautomake\relax
    \fi
  \fi
%    \end{macrocode}
% Check if \pkgopt[letter]{order} has been used by mistake (but not
% if \pkgopt[alsoindex]{record} has been used).
%\changes{1.42}{2020-02-03}{added check for order\protect\dequals letter}
%    \begin{macrocode}
  \@glsxtr@if@record@only
  {\ifdefstring{\glsorder}{letter}%
   {\GlossariesExtraWarningNoLine{Package option `order=letter' isn't
    supported with `record=\@glsxtr@record@setting'. Use `break-at=none'
    resource option instead}}%
   {}%
  }%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@do@automake@err}
%\changes{1.14}{2017-04-18}{new}
%\sty{glossaries} v4.50+ now provides \cs{@gls@do@automake@err} so
%use that if defined.
%    \begin{macrocode}
\ifdef{\@gls@do@automake@err}
{
  \let\@gls@doautomake@err\@gls@do@automake@err
}
{
  \newcommand*{\@gls@doautomake@err}{%
    \PackageError{glossaries}{You must use
    \string\makeglossaries\space with automake=true}
    {%
       Either remove the automake=true setting or
       add \string\makeglossaries\space to your document preamble.%
    }%
  }
}
%    \end{macrocode}
%\end{macro}
%
%Allow locations specific to a particular counter to be recorded.
%\begin{macro}{\glsxtr@record}
%\changes{1.08}{2016-12-13}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@record}[5]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@record@nameref}
%\changes{1.37}{2018-11-30}{new}
%Used with \pkgopt[nameref]{record} to include current label
%information.
%    \begin{macrocode}
\newcommand*{\glsxtr@record@nameref}[8]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@counterrecord}
%\changes{1.12}{2017-02-03}{new}
%Aux file command.
%    \begin{macrocode}
\newcommand*{\glsxtr@counterrecord}[3]{%
  \glsxtrfieldlistgadd{#1}{record.#2}{#3}%
  \glsxtrAddCounterRecordHook{#1}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrAddCounterRecordHook}
%\changes{1.49}{2022-10-14}{new}
%User hook.
%    \begin{macrocode}
\newcommand{\glsxtrAddCounterRecordHook}[3]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@counterrecordhook}
%\changes{1.12}{2017-02-03}{new}
%Hook used by \cs{@glsxtr@dorecord}.
%    \begin{macrocode}
\newcommand*{\@glsxtr@counterrecordhook}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrRecordCounter}
%\changes{1.12}{2017-02-03}{new}
%Activate recording for a particular counter (identified in the
%argument).
%    \begin{macrocode}
\newcommand*{\GlsXtrRecordCounter}[1]{%
  \@@glsxtr@recordcounter{#1}%
}
\@onlypreamble\GlsXtrRecordCounter
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@docounterrecord}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@docounterrecord}[1]{%
  \@bibgls@write@aux{}{\string\glsxtr@counterrecord
    {\@gls@label}{#1}{\csuse{the#1}}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrglossentry}
%Users may prefer to have entries displayed throughout the document
%rather than gathered together in a list. This command emulates
%the way \cs{glossentry} behaves (without the style formatting
%commands like \cs{item}). This needs to define \cs{currentglossary}
%to the current glossary type (normally set at the start of
%\cs{@printglossary}) and needs to define \cs{glscurrententrylabel}
%to the entry's label (normally set before \cs{glossentry} and
%\cs{subglossentry}). This needs some protection in case it's used
%in a section heading.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrglossentry}[1]{%
  \glsxtrtitleorpdforheading
  {\@glsxtrglossentry{#1}}%
  {\GlsXtrStandaloneEntryPdfName{#1}}%
  {\GlsXtrStandaloneEntryHeadName{#1}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtrglossentry}
%\changes{1.21}{2017-11-03}{new}
%Another test is needed in case \cs{@glsxtrglossentry} has been
%written to the table of contents.
%    \begin{macrocode}
\newrobustcmd*{\@glsxtrglossentry}[1]{%
  \glsxtrtitleorpdforheading
  {%
    \glsdoifexists{#1}%
    {%
      \begingroup
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
        \protected@edef\glscurrententrylabel{\glsdetoklabel{#1}}%
        \protected@edef\currentglossary{\GlsXtrStandaloneGlossaryType}%
        \ifglshasparent{#1}%
        {\GlsXtrStandaloneSubEntryItem{#1}}%
        {\glsentryitem{#1}}%
        \GlsXtrStandaloneEntryName{#1}%
      \endgroup
    }%
  }%
  {\GlsXtrStandaloneEntryPdfName{#1}}%
  {\GlsXtrStandaloneEntryHeadName{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneEntryHeadName}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrStandaloneEntryHeadName}[1]{%
  \glsxtrheadname{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneEntryPdfName}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrStandaloneEntryPdfName}[1]{%
  \glsentryname{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneEntryName}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrStandaloneEntryName}[1]{%
  \glstarget{#1}{\glossentryname{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrglossentry}
%As \cs{glsxtrglossentry} but sentence case.
%\changes{1.54}{2025-01-03}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrglossentry}[1]{%
  \glsxtrtitleorpdforheading
  {\@Glsxtrglossentry{#1}}%
  {\GlsXtrStandaloneEntryPdfNameFirstUc{#1}}%
  {\GlsXtrStandaloneEntryHeadNameFirstUc{#1}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@Glsxtrglossentry}
%\changes{1.54}{2025-01-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\@Glsxtrglossentry}[1]{%
  \glsxtrtitleorpdforheading
  {%
    \glsdoifexists{#1}%
    {%
      \begingroup
        \protected@edef\glscurrententrylabel{\glsdetoklabel{#1}}%
        \protected@edef\currentglossary{\GlsXtrStandaloneGlossaryType}%
        \ifglshasparent{#1}%
        {\GlsXtrStandaloneSubEntryItem{#1}}%
        {\glsentryitem{#1}}%
        \GlsXtrStandaloneEntryNameFirstUc{#1}%
      \endgroup
    }%
  }%
  {\GlsXtrStandaloneEntryPdfNameFirstUc{#1}}%
  {\GlsXtrStandaloneEntryHeadNameFirstUc{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneEntryHeadNameFirstUc}
%\changes{1.54}{2025-01-03}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrStandaloneEntryHeadNameFirstUc}[1]{%
  \Glsxtrheadname{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneEntryPdfNameFirstUc}
%\changes{1.54}{2025-01-03}{new}
%Requires new expandable version of \cs{Glsentryname}.
%    \begin{macrocode}
\newcommand*{\GlsXtrStandaloneEntryPdfNameFirstUc}[1]{%
  \Glsentryname{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneEntryNameFirstUc}
%\changes{1.54}{2025-01-03}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrStandaloneEntryNameFirstUc}[1]{%
  \glstarget{#1}{\Glossentryname{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneGlossaryType}
%\changes{1.31}{2018-05-09}{new}
%To make it easier to adjust the definition of \cs{currentglossary}
%within \cs{glsxtrglossentry}, this expands to the default
%definition. (If redefined, it must fully expand to the appropriate
%label.)
%    \begin{macrocode}
\newcommand{\GlsXtrStandaloneGlossaryType}{\glsentrytype{\glscurrententrylabel}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneSubEntryItem}
%\changes{1.31}{2018-05-09}{new}
%Used for sub-entries in standalone format. The argument is the
%entry's label.
%    \begin{macrocode}
\newcommand*{\GlsXtrStandaloneSubEntryItem}[1]{%
  \GlsXtrIfFieldEqNum{level}{#1}{1}{\glssubentryitem{#1}}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrglossentryother}
%\changes{1.22}{2017-11-08}{new}
%As \cs{glsxtrglossentry} but uses a different field.
%First argument is code to use in the header. The second argument
%is the entry's label. The third argument is the internal field
%label. This needs to be expandable in case it occurs in a
%sectioning command so it can't have an optional argument.
%    \begin{macrocode}
\newcommand*{\glsxtrglossentryother}[3]{%
  \ifstrempty{#1}%
  {%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{use default header if first argument empty}
%    \begin{macrocode}
    \glsxtrtitleorpdforheading
    {\@glsxtrglossentryother{#2}{#3}{\GlsXtrStandaloneEntryHeadOther{#3}{#2}}}%
    {\GlsXtrStandaloneEntryPdfOther{#2}{#3}}%
    {\GlsXtrStandaloneEntryHeadOther{#3}{#2}}%
  }%
  {%
    \glsxtrtitleorpdforheading
    {\@glsxtrglossentryother{#2}{#3}{#1}}%
    {\GlsXtrStandaloneEntryPdfOther{#2}{#3}}%
    {#1}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrglossentryother}
%\changes{1.22}{2017-11-08}{new}
%\begin{definition}
%\cs{\@glsxtrglossentryother}\marg{entry-label}\marg{field}\marg{header}
%\end{definition}
%As \cs{@glsxtrglossentry} but uses a different field.
%    \begin{macrocode}
\newrobustcmd*{\@glsxtrglossentryother}[3]{%
  \glsxtrtitleorpdforheading
  {%
    \glsdoifexists{#1}%
    {%
      \begingroup
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
        \protected@edef\glscurrententrylabel{\glsdetoklabel{#1}}%
        \protected@edef\currentglossary{\GlsXtrStandaloneGlossaryType}%
        \ifglshasparent{#1}%
        {\GlsXtrStandaloneSubEntryItem{#1}}%
        {\glsentryitem{#1}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{bug fix: corrected arguments to \cs{GlsXtrStandaloneEntryOther}}
%    \begin{macrocode}
        \GlsXtrStandaloneEntryOther{#1}{#2}%
      \endgroup
    }%
  }%
  {\GlsXtrStandaloneEntryPdfOther{#1}{#2}}%
  {#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneEntryHeadOther}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrStandaloneEntryHeadOther}[2]{%
 \ifcsdef{glsxtrhead#2}%
 {\csuse{glsxtrhead#2}{#1}}%
 {\@gls@entry@field{\NoCaseChange{#1}}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneEntryPdfOther}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrStandaloneEntryPdfOther}[2]{%
 \@gls@entry@field{#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneEntryOther}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrStandaloneEntryOther}[2]{%
  \glstarget{#1}{\glossentrynameother{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrglossentryother}
%\changes{1.54}{2025-01-03}{new}
%As \cs{glsxtrglossentryother} but sentence-case.
%    \begin{macrocode}
\newcommand*{\Glsxtrglossentryother}[3]{%
  \ifstrempty{#1}%
  {%
    \glsxtrtitleorpdforheading
    {\@Glsxtrglossentryother{#2}{#3}{\GlsXtrStandaloneEntryHeadOtherFirstUc{#3}{#2}}}%
    {\GlsXtrStandaloneEntryPdfOtherFirstUc{#2}{#3}}%
    {\GlsXtrStandaloneEntryHeadOtherFirstUc{#3}{#2}}%
  }%
  {%
    \glsxtrtitleorpdforheading
    {\@Glsxtrglossentryother{#2}{#3}{#1}}%
    {\GlsXtrStandaloneEntryPdfOtherFirstUc{#2}{#3}}%
    {#1}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsxtrglossentryother}
%\changes{1.54}{2025-01-03}{new}
%\begin{definition}
%\cs{\@Glsxtrglossentryother}\marg{entry-label}\marg{field}\marg{header}
%\end{definition}
%As \cs{@glsxtrglossentry} but uses a different field.
%    \begin{macrocode}
\newrobustcmd*{\@Glsxtrglossentryother}[3]{%
  \glsxtrtitleorpdforheading
  {%
    \glsdoifexists{#1}%
    {%
      \begingroup
        \protected@edef\glscurrententrylabel{\glsdetoklabel{#1}}%
        \protected@edef\currentglossary{\GlsXtrStandaloneGlossaryType}%
        \ifglshasparent{#1}%
        {\GlsXtrStandaloneSubEntryItem{#1}}%
        {\glsentryitem{#1}}%
        \GlsXtrStandaloneEntryOtherFirstUc{#1}{#2}%
      \endgroup
    }%
  }%
  {\GlsXtrStandaloneEntryPdfOtherFirstUc{#1}{#2}}%
  {#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneEntryHeadOtherFirstUc}
%\changes{1.54}{2025-01-03}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrStandaloneEntryHeadOtherFirstUc}[2]{%
 \ifcsdef{glsxtrhead#2}%
 {\csuse{glsxtrhead#2}{#1}}%
 {\@Gls@entry@field{\NoCaseChange{#1}}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneEntryPdfOtherFirstUc}
%\changes{1.54}{2025-01-03}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrStandaloneEntryPdfOtherFirstUc}[2]{%
 \MFUsentencecase{\@gls@entry@field{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrStandaloneEntryOtherFirstUc}
%\changes{1.54}{2025-01-03}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrStandaloneEntryOtherFirstUc}[2]{%
  \glstarget{#1}{\Glossentrynameother{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtarget}
%\changes{1.51}{2023-04-24}{new}
%Similar to \cs{glstarget} but will only create the target if the
%field identified by \cs{glsxtrtargetfield} has been defined.
%If the target hasn't been defined, the target is created and the
%target name is saved in the given field.
%If \cs{glstarget} is redefined to use this command then duplicate
%targets can be avoid if the same entry appears in multiple
%glossaries.
%TODO: possibly extend this to allow a comma-separated list of
%targets in the field?
%    \begin{macrocode}
\newcommand{\glsxtrtarget}[2]{%
 \GlsXtrIfFieldUndef{\glsxtrtargetfield}{#1}% 
 {%
   \@glstarget{\glolinkprefix #1}{#2}%
   \xGlsXtrSetField{#1}{\glsxtrtargetfield}{\glolinkprefix #1}%
 }%
 {\glsxtrtargetdup{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrtargetdup}
%\changes{1.54}{2025-01-03}{new}
%    \begin{macrocode}
\newcommand{\glsxtrtargetdup}[2]{#2}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtargetfield}
%\changes{1.51}{2023-04-24}{new}
%The field name used by \cs{glsxtrtarget}.
%    \begin{macrocode}
\newcommand{\glsxtrtargetfield}{target}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtglossary}
%\changes{1.08}{2016-12-13}{new}
%\changes{1.12}{2017-02-03}{added starred form}
%\changes{1.44}{2020-03-23}{added check for \cs{@printgloss@checkexists}}
%Similar to \cs{printnoidxglossary} but it displays all entries
%defined for the given glossary without sorting. Check for \cs{@printgloss@checkexists} which was 
%introduced to \sty{glossaries} v4.46.
%    \begin{macrocode}
\ifdef\@printgloss@checkexists
{
  \newcommand*{\printunsrtglossary}{%
    \let\@printgloss@checkexists\@printgloss@checkexists@allowignored
    \@ifstar\s@printunsrtglossary\@printunsrtglossary
  }
}
{
  \newcommand*{\printunsrtglossary}{%
    \@ifstar\s@printunsrtglossary\@printunsrtglossary
  }
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@printunsrtglossary}
%\changes{1.12}{2017-02-03}{new}
%Unstarred version.
%    \begin{macrocode}
\newcommand*{\@printunsrtglossary}[1][]{%
  \@printglossary{type=\glsdefaulttype,#1}{\@print@unsrt@glossary}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@printunsrtglossary}
%\changes{1.12}{2017-02-03}{new}
%Starred version.
%    \begin{macrocode}
\newcommand*{\s@printunsrtglossary}[2][]{%
  \begingroup
    #2%
    \@printglossary{type=\glsdefaulttype,#1}{\@print@unsrt@glossary}%
  \endgroup
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtglossaries}
%\changes{1.08}{2016-12-13}{new}
%Similar to \cs{printnoidxglossaries} but it displays all entries
%defined for the given glossary without sorting.
%    \begin{macrocode}
\newcommand*{\printunsrtglossaries}{%
  \forallglossaries{\@@glo@type}{\printunsrtglossary[type=\@@glo@type]}%
}
%    \end{macrocode}
%\end{macro}

%\begin{macro}{\@print@unsrt@glossary}
%\changes{1.08}{2016-12-13}{new}
%    \begin{macrocode}
\newcommand*{\@print@unsrt@glossary}{%
  \glossarysection[\glossarytoctitle]{\glossarytitle}%
  \glossarypreamble
%    \end{macrocode}
%check for empty list
%    \begin{macrocode}
  \glsxtrifemptyglossary{\@glo@type}%
  {%
    \GlossariesExtraWarning{No entries defined in glossary `\@glo@type'}% 
  }%
  {%
%    \end{macrocode}
% Setup local commands.
%    \begin{macrocode}
    \@glsxtr@unsrt@gloss@init
%    \end{macrocode}
%A loop within the tabular-like styles can cause problems, so
%move the loop outside. The entire glossary will be saved in
%\cs{@glsxtr@doglossary}, which will be built up in the loop.
%\changes{1.50}{2022-11-08}{removed \cs{glsresetentrylist}}
%Note that v1.50 has removed \cs{glsresetentrylist}.
%    \begin{macrocode}
    \def\@glsxtr@doglossary{%
      \begin{theglossary}%
      \glossaryheader
    }%
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{add post-begin hook}
%Apply the post-begin hook.
%    \begin{macrocode}
    \printunsrtglossarypostbegin{\@glsxtr@doglossary}%
%    \end{macrocode}
% Iterate over all entries in the current glossary and add the relevant commands to
% \cs{@glsxtr@doglossary}.
%    \begin{macrocode}
    \expandafter\@for\expandafter\glscurrententrylabel\expandafter
      :\expandafter=\csname glolist@\@glo@type\endcsname\do{%
      \ifdefempty{\glscurrententrylabel}
      {}%
      {%
%    \end{macrocode}
%Initialise hooks
%    \begin{macrocode}
        \@gls@xtr@initprocess
%    \end{macrocode}
%Process this entry (unless it has been skipped).
%    \begin{macrocode}
        \glsxtr@process
        {%
          \ifglsxtr@printgloss@groups
%    \end{macrocode}
% Check if the group heading should be added and, if so, add it.
% \cs{@glsxtr@groupheading} will be empty if no group heading.
%    \begin{macrocode}
            \glsxtraddgroup\glscurrententrylabel
            {%
               \@glsxtr@checkgroup\glscurrententrylabel
               \expandafter\appto\expandafter\@glsxtr@doglossary\expandafter
                 {\@glsxtr@groupheading}%
            }%
          \fi
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{add pre-entry hook}
%Apply the pre-entry hook.
%    \begin{macrocode}
          \printunsrtglossarypreentryprocesshook{\@glsxtr@doglossary}%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{eappto} to \cs{protected@eappto}}
%    \begin{macrocode}
          \protected@eappto\@glsxtr@doglossary{%
            \noexpand\@printunsrt@glossary@handler{\glscurrententrylabel}}%
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{add post-entry hook}
%Apply the post-entry hook.
%    \begin{macrocode}
          \printunsrtglossarypostentryprocesshook{\@glsxtr@doglossary}%
        }%
      }%
    }%
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{add pre-end hook}
%Apply the pre-end hook.
%    \begin{macrocode}
    \printunsrtglossarypreend{\@glsxtr@doglossary}%
    \appto\@glsxtr@doglossary{\end{theglossary}}%
    \printunsrtglossarypredoglossary
    \@glsxtr@doglossary
  }%
  \glossarypostamble
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@unsrt@gloss@init}
%\changes{1.49}{2022-10-14}{new}
%Initialise hooks needed at the start.
%    \begin{macrocode}
\newcommand*{\@glsxtr@unsrt@gloss@init}{%
%    \end{macrocode}
%Determine how to obtain the group information.
%\changes{1.16}{2017-06-15}{corrected misspelt command}
%    \begin{macrocode}
  \key@ifundefined{glossentry}{group}%
  {\let\@gls@getgrouptitle\@gls@noidx@getgrouptitle}%
  {\let\@gls@getgrouptitle\@glsxtr@unsrt@getgrouptitle}%
%    \end{macrocode}
%Initialise current group information.
%    \begin{macrocode}
  \def\@gls@currentlettergroup{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{save hierarchical level information}
%Need to keep track of the current group hierarchical level
%    \begin{macrocode}
  \def\@gls@currentlettergroup@level{-1}%
%    \end{macrocode}
%and the current entry hierarchical level.
%    \begin{macrocode}
  \def\glscurrententrylevel{-1}%
%    \end{macrocode}
% Initialise the root entry. This will be the most recent entry that
% doesn't have a parent.
%    \begin{macrocode}
  \def\glscurrentrootentry{}%
%    \end{macrocode}
% Initialise the top-level entry. This will be the most recent entry that
% had level=0 (after adjustment).
%    \begin{macrocode}
  \def\glscurrenttoplevelentry{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@xtr@initprocess}
%\changes{1.49}{2022-10-14}{new}
%Initialise hooks needed for each iteration of the process loop.
%    \begin{macrocode}
\newcommand*{\@gls@xtr@initprocess}{%
%    \end{macrocode}
%Save the current hierarchical level (adjusted).
%    \begin{macrocode}
 \ifglsxtrprintglossflatten
  \edef\glscurrententrylevel{\number\@glsxtr@leveloffset}%
 \else
  \edef\glscurrententrylevel{%
    \number\numexpr\csname glo@\glscurrententrylabel @level\endcsname
      + \@glsxtr@leveloffset}%
 \fi
%    \end{macrocode}
%If this level 0, update \cs{glscurrenttoplevelentry}
%    \begin{macrocode}
  \ifnum\glscurrententrylevel=0\relax
    \let\glscurrenttoplevelentry\glscurrententrylabel
  \fi
%    \end{macrocode}
%If this entry doesn't have a parent, update \cs{glscurrentrootentry}
%    \begin{macrocode}
  \ifglsxtrprintglossflatten
    \let\glscurrentrootentry\glscurrententrylabel
  \else
    \ifglshasparent{\glscurrententrylabel}{}%
    {\let\glscurrentrootentry\glscurrententrylabel}%
  \fi
%    \end{macrocode}
%Initialise to do the current entry.
%    \begin{macrocode}
 \let\glsxtr@process\@firstofone
%    \end{macrocode}
%Provide a way to skip the current entry. This will redefine
%\cs{glsxtr@process} to ignore its argument.
%    \begin{macrocode}
 \let\printunsrtglossaryskipentry\@glsxtr@printunsrtglossaryskipentry
 \printunsrtglossaryentryprocesshook{\glscurrententrylabel}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtinnerglossary}
%\changes{1.44}{2020-03-23}{new}
%Similar to \cs{printunsrtglossary} but doesn't add the section
%heading, preamble, postamble or start and end of \env{theglossary}.
%Grouping is automatically applied so it may cause a problem within
%tabular-like environments. The beginning and ending of
%\env{theglossary} should be added around this command (but ensure
%the style has been set first). The simplest way of doing this is to
%place \cs{printunsrtinnerglossary} inside the
%\env{printunsrtglossarywrap} environment.
%    \begin{macrocode}
\newcommand*{\printunsrtinnerglossary}[3][]{%
  \begingroup
   \def\@glsxtr@printglossopts{#1}%
   \def\@glo@type{\glsdefaulttype}%
   \setkeys{printgloss}[title,toctitle,style,numberedsection,sort,label]{#1}%
   \let\currentglossary\@glo@type
   #2%
   \@print@unsrt@innerglossary
   #3%
  \endgroup
}
%    \end{macrocode}
%\end{macro}
%
%\begin{environment}{printunsrtglossarywrap}
%\changes{1.44}{2020-03-23}{new}
%    \begin{macrocode}
\newenvironment{printunsrtglossarywrap}[1][]%
{%
  \def\@glsxtr@printglossopts{#1}%
  \def\@glo@type{\glsdefaulttype}%
  \def\glossarytitle{\csname @glotype@\@glo@type @title\endcsname}%
  \def\glossarytoctitle{\glossarytitle}%
  \let\org@glossarytitle\glossarytitle
  \def\@glossarystyle{%
    \ifx\@glossary@default@style\relax
      \GlossariesWarning{No default glossary style provided \MessageBreak
        for the glossary `\@glo@type'. \MessageBreak
        Using fallback. \MessageBreak
        To fix this set the style with \MessageBreak
        \string\setglossarystyle\space or use the \MessageBreak
        style key=value option}%
    \fi
  }%
  \def\gls@dotoctitle{\glssettoctitle{\@glo@type}}%
  \let\@org@glossaryentrynumbers\glossaryentrynumbers
  \@printgloss@setsort
  \setkeys{printgloss}{#1}%
%    \end{macrocode}
% The type key simply allows the title to be set if the title key
% isn't supplied.
%    \begin{macrocode}
  \ifglossaryexists*{\@glo@type}%
  {%
   \ifx\glossarytitle\org@glossarytitle
   \else
     \expandafter\let\csname @glotype@\@glo@type @title\endcsname
                   \glossarytitle
   \fi
   \let\currentglossary\@glo@type
  }%
  {}%
  \let\org@glossaryentrynumbers\glossaryentrynumbers
  \let\glsnonextpages\@glsnonextpages
  \let\glsnextpages\@glsnextpages
  \let\nopostdesc\@nopostdesc
  \gls@dotoctitle
  \@glossarystyle
  \let\gls@org@glossaryentryfield\glossentry
  \let\gls@org@glossarysubentryfield\subglossentry
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{xdef} to \cs{protected@xdef}}
%    \begin{macrocode}
  \renewcommand{\glossentry}[1]{%
    \protected@xdef\glscurrententrylabel{\glsdetoklabel{##1}}%
    \gls@org@glossaryentryfield{##1}%
  }%
  \renewcommand{\subglossentry}[2]{%
    \protected@xdef\glscurrententrylabel{\glsdetoklabel{##2}}%
    \gls@org@glossarysubentryfield{##1}{##2}%
  }%
  \@gls@preglossaryhook
  \glossarysection[\glossarytoctitle]{\glossarytitle}%
  \glossarypreamble
  \begin{theglossary}%
  \glossaryheader
  \glsresetentrylist
}%
{%
  \end{theglossary}%
  \glossarypostamble
  \global\let\glossaryentrynumbers\@org@glossaryentrynumbers
  \global\let\warn@noprintglossary\relax
}
%    \end{macrocode}
%\end{environment}
%
%\begin{macro}{\@print@unsrt@innerglossary}
%\changes{1.44}{2020-03-23}{new}
%This is much like \cs{@print@unsrt@innerglossary} but only contains
%what would normally be the content of the \env{theglossary}.
%    \begin{macrocode}
\newcommand*{\@print@unsrt@innerglossary}{%
%    \end{macrocode}
% No section header or preamble.
%    \begin{macrocode}
  \glsxtrifemptyglossary{\@glo@type}%
  {%
    \GlossariesExtraWarning{No entries defined in glossary `\@glo@type'}% 
  }%
  {%
%    \end{macrocode}
% Setup local commands.
%    \begin{macrocode}
    \@glsxtr@unsrt@gloss@init
%    \end{macrocode}
%No header or reset.
%    \begin{macrocode}
    \def\@glsxtr@doglossary{}%
%    \end{macrocode}
% Iterate over all entries in the current glossary and add the relevant commands to
% \cs{@glsxtr@doglossary}.
%    \begin{macrocode}
    \expandafter\@for\expandafter\glscurrententrylabel\expandafter
      :\expandafter=\csname glolist@\@glo@type\endcsname\do{%
      \ifdefempty{\glscurrententrylabel}
      {}%
      {%
%    \end{macrocode}
%Initialise hooks
%    \begin{macrocode}
        \@gls@xtr@initprocess
%    \end{macrocode}
%Process this entry (unless it has been skipped).
%    \begin{macrocode}
        \glsxtr@process
        {%
          \ifglsxtr@printgloss@groups
%    \end{macrocode}
% Check if the group heading should be added and, if so, add it.
% \cs{@glsxtr@groupheading} will be empty if no group heading.
%    \begin{macrocode}
            \glsxtraddgroup\glscurrententrylabel
            {%
               \@glsxtr@checkgroup\glscurrententrylabel
               \expandafter\appto\expandafter\@glsxtr@doglossary\expandafter
                 {\@glsxtr@groupheading}%
            }%
          \fi
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{add pre-entry hook}
%Apply the pre-entry hook.
%    \begin{macrocode}
          \printunsrtglossarypreentryprocesshook{\@glsxtr@doglossary}%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{eappto} to \cs{protected@eappto}}
%    \begin{macrocode}
          \protected@eappto\@glsxtr@doglossary{%
            \noexpand\@printunsrt@glossary@handler{\glscurrententrylabel}}%
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{add post-entry hook}
%Apply the post-entry hook.
%    \begin{macrocode}
          \printunsrtglossarypostentryprocesshook{\@glsxtr@doglossary}%
        }%
      }%
    }%
%    \end{macrocode}
%\cs{printunsrtglossarypreend} not used.
%    \begin{macrocode}
    \printunsrtglossarypredoglossary
    \@glsxtr@doglossary
  }%
%    \end{macrocode}
% No postamble.
%    \begin{macrocode}
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtraddgroup}
%\changes{1.49}{2022-10-14}{new}
%Now that \app{bib2gls} v3.0+ has the ability to store group labels
%for sub-levels, provide a way to allow for this. This checks if the entry has 
%a parent, which was used originally, unless the flatten option has been used.
%\app{bib2gls} will redefine this in the .glstex file if the
%group-level setting is used.
%    \begin{macrocode}
\newcommand*{\glsxtraddgroup}[2]{%
  \ifglsxtrprintglossflatten
    #2%
  \else
    \ifglshasparent{#1}{}{#2}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%
%\begin{macro}{\printunsrtglossaryentryprocesshook}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\printunsrtglossaryentryprocesshook}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtglossarypreentryprocesshook}
%\changes{1.50}{2022-11-08}{new}
%This hook is performed before the entry line has been added to
%\cs{@glsxtr@do@glossary}. The argument will be 
%\cs{@glsxtr@do@glossary} so that content can be appended to it.
%The current entry can be referenced with \cs{glscurrententrylabel}.
%The current level can be referenced with \cs{glscurrententrylevel},
%etc.
%    \begin{macrocode}
\newcommand*{\printunsrtglossarypreentryprocesshook}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtglossarypostentryprocesshook}
%\changes{1.50}{2022-11-08}{new}
%This hook is performed after the entry line has been added to
%\cs{@glsxtr@do@glossary}. The argument will be 
%\cs{@glsxtr@do@glossary} so that content can be appended to it.
%The current entry can be referenced with \cs{glscurrententrylabel}.
%The current level can be referenced with \cs{glscurrententrylevel},
%etc.
%    \begin{macrocode}
\newcommand*{\printunsrtglossarypostentryprocesshook}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtglossarygrouphook}
%\changes{1.50}{2022-11-08}{new}
%Similar hook used when the group heading added. In this case the
%argument will be \cs{@glsxtr@groupheading}.
%    \begin{macrocode}
\newcommand*{\printunsrtglossarygrouphook}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtglossaryskipentry}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\printunsrtglossaryskipentry}{%
  \PackageError{glossaries-extra}{\string\printunsrtglossaryskipentry\space
can only be used within \string\printunsrtglossaryentryprocesshook}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@printunsrtglossaryskipentry}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@printunsrtglossaryskipentry}{%
  \let\glsxtr@process\@gobble
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtglossarypredoglossary}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\printunsrtglossarypredoglossary}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtglossarypreend}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand*{\printunsrtglossarypreend}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtglossarypostbegin}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand*{\printunsrtglossarypostbegin}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@printunsrt@glossary@handler}
%\changes{1.16}{2017-06-15}{new}
%\changes{1.46}{2021-09-20}{changed \cs{xdef} to \cs{protected@xdef}}
%    \begin{macrocode}
\newcommand{\@printunsrt@glossary@handler}[1]{%
  \protected@xdef\glscurrententrylabel{#1}%
  \printunsrtglossaryhandler\glscurrententrylabel
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtglossaryhandler}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand{\printunsrtglossaryhandler}[1]{%
  \glsxtrunsrtdo{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtriflabelinlist}
%\begin{definition}
%\cs{glsxtriflabelinlist}\marg{label}\marg{list}\marg{true}\marg{false}
%\end{definition}
%\changes{1.21}{2017-11-03}{new}
%Might be useful for the handler to check if an entry label
%or category label is contained in a list, so provide a user-level
%version of \cs{@gls@ifinlist} which ensures the label and list are
%fully expanded.
%    \begin{macrocode}
\newrobustcmd*{\glsxtriflabelinlist}[4]{%
 \protected@edef\@glsxtr@doiflabelinlist{\noexpand\@gls@ifinlist{#1}{#2}}%
 \@glsxtr@doiflabelinlist{#3}{#4}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\print@op@unsrtglossaryunit}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand{\print@op@unsrtglossaryunit}[2][]{%
  \s@printunsrtglossary[type=\glsdefaulttype,#1]{%
    \printunsrtglossaryunitsetup{#2}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtglossaryunitsetup}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand*{\printunsrtglossaryunitsetup}[1]{%
  \renewcommand{\printunsrtglossaryhandler}[1]{%
    \glsxtrfieldxifinlist{##1}{record.#1}{\csuse{the#1}}
    {\glsxtrunsrtdo{##1}}%
    {}%
  }%
%    \end{macrocode}
%\changes{1.20}{2017-09-11}{switched from redefining \cs{glolinkprefix} to
% \cs{@glsxtrhypernameprefix}}
%Only the target names should have the prefixes adjusted as \cs{gls}
%etc need the original \cs{glolinkprefix}. The \cs{@gobble} part
%discards \cs{glolinkprefix}.
%    \begin{macrocode}
  \ifcsundef{theH#1}%
  {%
    \renewcommand*{\@glsxtrhypernameprefix}{record.#1.\csuse{the#1}.\@gobble}%
  }%
  {%
    \renewcommand*{\@glsxtrhypernameprefix}{record.#1.\csuse{theH#1}.\@gobble}%
  }%
  \@printunsrtglossary@unit@nosec
  \appto\glossarypostamble{\printunsrtglossaryunitpostskip}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@printunsrtglossary@unit@nosec}
%\sty{glossaries} v4.9+ now defines \cs{glossarysection} with
%\cs{NewDocumentCommand} rather than \cs{newcommand} and has
%introduced a new section=none option to suppress the section
%heading. The simplest way to check for this is to test for the new
%command that's now used by \cs{glossarysection}:
%\changes{1.9}{2025-11-03}{new}
%    \begin{macrocode}
\ExplSyntaxOn
\cs_if_exist:NTF \glossaries_section:nn
 {
   \newcommand \@printunsrtglossary@unit@nosec
    {
      \setglossarysection { none }
    }
 }
 {
   \newcommand \@printunsrtglossary@unit@nosec
    {
      \renewcommand*{\glossarysection}[2][]{}
    }
 }
\ExplSyntaxOff
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtglossaryunitpostskip}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\printunsrtglossaryunitpostskip}{\glspar\medskip\glspar}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\print@noop@unsrtglossaryunit}
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand{\print@noop@unsrtglossaryunit}[2][]{%
  \PackageError{glossaries-extra}{\string\printunsrtglossaryunit\space
   requires the record=only or record=alsoindex package option}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@unsrt@getgrouptitle}
%\changes{1.11}{2017-01-19}{new}
%    \begin{macrocode}
\newrobustcmd*{\@glsxtr@unsrt@getgrouptitle}[2]{%
  \protected@edef\@glsxtr@titlelabel{glsxtr@grouptitle@#1}%
  \@onelevel@sanitize\@glsxtr@titlelabel
  \ifcsdef{\@glsxtr@titlelabel}
  {\letcs{#2}{\@glsxtr@titlelabel}}%
  {\def#2{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrunsrtdo}
%\changes{1.12}{2017-02-03}{new}
%Provide a user-level call to \cs{@glsxtr@noidx@do} to make it
%easier to define a new handler.
%    \begin{macrocode}
\newcommand{\glsxtrunsrtdo}{\@glsxtr@noidx@do}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgroupfield}
%\app{bib2gls} provides a supplementary field labelled 
%\texttt{secondarygroup} for secondary glossaries, so 
%provide a way of switching to that field. (The \gloskey{group}
%key still needs checking. There's no associated key with the
%internal field).
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrgroupfield}{group}
%    \end{macrocode}
%\end{macro}
%
%The \env{tabular}-like glossary styles cause quite a problem
%with the iterative approach. In particular for the group skip.
%To compensate for this, the groups are now determined while
%\cs{@glsxtr@doglossary} is being constructed rather than in the
%handler.
%\begin{macro}{\@glsxtr@checkgroup}
%\changes{1.21}{2017-11-03}{new}
%The argument is the entry's label. (This block of code was
%formerly in \cs{@glsxtr@noidx@do}.) Now that this is no longer
%within a tabular environment, the global definitions aren't needed.
%The result is now stored in \cs{@glsxtr@groupheading}, which will
%be empty if no heading is required. The current hierarchical level
%must have first been saved to \cs{glscurrententrylevel}.
%    \begin{macrocode}
\newcommand*{\@glsxtr@checkgroup}[1]{%
  \def\@glsxtr@groupheading{}%
  \key@ifundefined{glossentry}{group}%
  {%
    \letcs{\@gls@sort}{glo@\glsdetoklabel{#1}@sort}%
    \expandafter\glo@grabfirst\@gls@sort{}{}\@nil
  }%
  {%
%    \end{macrocode}
%\changes{1.16}{2017-06-15}{use \cs{csuse} instead of \cs{csname}}
%    \begin{macrocode}
    \protected@edef\@glo@thislettergrp{%
        \csuse{glo@\glsdetoklabel{#1}@\glsxtrgroupfield}}%
  }%
%    \end{macrocode}
%Need to keep track of the current group for the current level.
%    \begin{macrocode}
  \ifcsundef{@gls@currentlettergroup\romannumeral\glscurrententrylevel}%
  {\csdef{@gls@currentlettergroup\romannumeral\glscurrententrylevel}{}}{}%
%    \end{macrocode}
%Has the group label changed for the current level?
%    \begin{macrocode}
  \ifcsequal{@glo@thislettergrp}{@gls@currentlettergroup\romannumeral\glscurrententrylevel}%
  {}%
  {%
    \ifdefempty\@glo@thislettergrp
    {}%
    {%
%    \end{macrocode}
%Check the hierarchical level.
%    \begin{macrocode}
      \ifnum\glscurrententrylevel>0\relax
        \protected@eappto\@glsxtr@groupheading{%
          \noexpand\glssubgroupheading
          {\@gls@currentlettergroup@level}{\glscurrententrylevel}%
          {\csuse{glo@\glsdetoklabel{#1}@parent}}%
          {\expandonce\@glo@thislettergrp}%
        }%
      \else
        \ifdefempty{\@gls@currentlettergroup}{}%
        {%
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{check nogroupskip setting}
%Don't add \cs{glsgroupskip} if nogroupskip setting is on.
%    \begin{macrocode}
          \ifglsnogroupskip
          \else
            \def\@glsxtr@groupheading{\glsgroupskip}%
          \fi
        }%
        \protected@eappto\@glsxtr@groupheading{%
          \noexpand\glsgroupheading{\expandonce\@glo@thislettergrp}%
        }%
      \fi
      \let\@gls@currentlettergroup@level\glscurrententrylevel
      \cslet{@gls@currentlettergroup\romannumeral\glscurrententrylevel}\@glo@thislettergrp
%    \end{macrocode}
%Perform the group hook, which can be used to add content.
%    \begin{macrocode}
      \printunsrtglossarygrouphook{\@glsxtr@groupheading}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glssubgroupheading}
%\begin{definition}
%\cs{glssubgroupheading}\marg{previous level}\marg{level}\marg{parent}\marg{group label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%Default definition uses the same format as the top-level heading.
%Note that this won't include the group skip.
%    \begin{macrocode}
\newcommand*{\glssubgroupheading}[4]{\glsgroupheading{#4}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrLocationField}
%\changes{1.37}{2018-11-30}{new}
%Stores the internal name of the location field.
%    \begin{macrocode}
\newcommand*{\GlsXtrLocationField}{location}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@noidx@do}
%\changes{1.11}{2017-01-19}{new}
%Minor modification of \cs{@gls@noidx@do} to check for location
%field if present, but also need to check for the \gloskey{group}
%field and flatten option.
%    \begin{macrocode}
\newcommand{\@glsxtr@noidx@do}[1]{%
  \ifglsentryexists{#1}%
  {%
    \global\letcs{\@gls@loclist}{glo@\glsdetoklabel{#1}@loclist}%
    \global\letcs{\@gls@location}{glo@\glsdetoklabel{#1}@\GlsXtrLocationField}%
%    \end{macrocode}
% Use level number to determine whether or not this entry has a
% parent.
%    \begin{macrocode}
    \ifglsxtrprintglossflatten
      \gls@level=\@glsxtr@leveloffset\relax
    \else
      \gls@level=\numexpr\csuse{glo@\glsdetoklabel{#1}@level}+\@glsxtr@leveloffset\relax
    \fi
    \ifnum\gls@level>0
      \let\@glsxtr@ifischild\@firstoftwo
    \else
      \let\@glsxtr@ifischild\@secondoftwo
    \fi
%    \end{macrocode}
%\changes{1.44}{2020-03-23}{replaced \cs{ifglshasparent} with \cs{@glsxtr@ifischild}}
%Some glossary styles (such as topicmcols) save the level using
%\cs{def} so make sure \cs{gls@level} is expanded before being
%passed to \cs{subglossentry}.
%    \begin{macrocode}
    \@glsxtr@ifischild
    {%
      \ifdefvoid{\@gls@location}%
      {%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{check if location field has been changed}
%If \cs{GlsXtrLocationField} has been changed then don't fallback on
%\gloskey{loclist}.
%    \begin{macrocode}
        \ifdefstring{\GlsXtrLocationField}{location}%
        {%
          \ifdefvoid{\@gls@loclist}%
          {%
            \expandafter\subglossentry\expandafter{\number\gls@level}{#1}{}%
          }%
          {%
            \expandafter\subglossentry\expandafter{\number\gls@level}{#1}%
            {%
              \glossaryentrynumbers{\glsnoidxloclist{\@gls@loclist}}%
            }%
          }%
        }%
        {%
          \expandafter\subglossentry\expandafter{\number\gls@level}{#1}{}%
        }%
      }%
      {%
        \expandafter\subglossentry\expandafter
          {\number\gls@level}{#1}{\glossaryentrynumbers{\@gls@location}}%
      }%
    }%
    {%
%    \end{macrocode}
%\changes{1.21}{2017-11-03}{removed code dealing with the group}
%    \begin{macrocode}
      \ifdefvoid{\@gls@location}%
      {%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{check if location field has been changed}
%If \cs{GlsXtrLocationField} has been changed then don't fallback on
%\gloskey{loclist}.
%    \begin{macrocode}
        \ifdefstring{\GlsXtrLocationField}{location}%
        {%
          \ifdefvoid{\@gls@loclist}
          {%
            \glossentry{#1}{}%
          }%
          {%
            \glossentry{#1}%
            {%
              \glossaryentrynumbers{\glsnoidxloclist{\@gls@loclist}}%
            }%
          }%
        }%
        {%
          \glossentry{#1}{}%
        }%
      }%
      {%
        \glossentry{#1}%
        {%
          \glossaryentrynumbers{\@gls@location}%
        }%
      }%
    }%
  }%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%Provide a way to conveniently define commands that behaves like
%\cs{gls} with a label prefix.
%
%It's possible that the user might want minor variations
%with the same prefix but different default options, so
%use a counter to provide unique inner commands.
%\begin{macro}{\glsxtrnewgls}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcount\@glsxtrnewgls@inner
%    \end{macrocode}
%\end{macro}
%(The default options supplied in \meta{options} below
%could possibly be used to form the inner control sequence name to
%help make it unique, but it might feasibly contain 
%\gloskey[glslink]{thevalue} where the value might contain commands.)
%
%\begin{macro}{\glsxtrdoidentify}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrdoidentify}[1]{%
 \ifdefequal\@glsxtr@record@setting\@glsxtr@record@setting@off{}{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@providenewgls}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@providenewgls}{%
  \protected@write\@auxout{}{\string\providecommand{\string\@glsxtr@newglslike}[2]{}}%
  \let\@glsxtr@providenewgls\relax
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtridentifyglslike}
%\changes{1.37}{2018-11-30}{new}
%Identify the command given in the second argument for the benefit
%of \app{bib2gls} and also identify command as a blocker for
%\cs{makefirstuc}.
%    \begin{macrocode}
\newcommand{\glsxtridentifyglslike}[2]{%
 \glsmfublocker{#2}%
 \glsxtrdoidentify
 {%
   \@glsxtr@providenewgls
   \protected@write\@auxout{}{\string\@glsxtr@newglslike{#1}{\string#2}}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@providenewglsfamily}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@providenewglsfamily}{%
  \protected@write\@auxout{}{\string\providecommand{\string\@glsxtr@newglslikefamily}[8]{}}%
  \let\@glsxtr@providenewglsfamily\relax
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtridentifyglsfamily}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsxtridentifyglsfamily}\marg{options}\marg{prefix}\marg{gls}\marg{glspl}\marg{Gls}\marg{Glspl}\marg{GLS}\marg{GLSpl}
%\end{definition}
%Identify the family of commands for the benefit
%of \app{bib2gls} and also establishes a sentence-case mapping.
%    \begin{macrocode}
\newcommand{\glsxtridentifyglsfamily}[8]{%
 \glsmfuaddmap{#3}{#5}%
 \glsmfuaddmap{#4}{#6}%
 \glsmfublocker{#7}%
 \glsmfublocker{#8}%
 \glsxtrdoidentify
 {%
   \@glsxtr@providenewglsfamily
   \protected@write\@auxout{}{\string\@glsxtr@newglslikefamily{\detokenize{#1}}{\detokenize{#2}}{\detokenize{#3}}{\detokenize{#4}}{\detokenize{#5}}{\detokenize{#6}}{\detokenize{#7}}{\detokenize{#8}}}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@providenewglslink}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@providenewglslink}{%
  \protected@write\@auxout{}{\string\providecommand{\string\@glsxtr@newglslink}[2]{}}%
  \let\@glsxtr@providenewglslink\relax
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtridentifyglslink}
%\changes{1.49}{2022-10-14}{new}
%Identify the command given in the second argument for the benefit
%of \app{bib2gls} and identify the command as a blocker for
%\cs{makefirstuc}.
%    \begin{macrocode}
\newcommand{\glsxtridentifyglslink}[2]{%
 \glsmfublocker{#2}%
 \glsxtrdoidentify
 {%
   \@glsxtr@providenewglslink
   \protected@write\@auxout{}{\string\@glsxtr@newglslink{#1}{\string#2}}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrnewglslink}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{@glsxtrnewglslink}\oarg{options}\marg{prefix}\marg{cs}\marg{inner cs
%name}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\@glsxtrnewglslink}[4]{%
  \ifdef{#3}%
  {%
    \PackageError{glossaries-extra}{Command \string#3\space already
defined}{}%
  }%
  {%
%    \end{macrocode}
%Write information to the aux file for bib2gls.
%    \begin{macrocode}
     \glsxtridentifyglslink{#2}{#3}%
     \ifcsdef{@#4link@#2}%
     {%
       \advance\@glsxtrnewgls@inner by \@ne
       \def\@glsxtrnewgls@innercsname{@#4link\number\@glsxtrnewgls@inner @#2}%
     }%
     {\def\@glsxtrnewgls@innercsname{@#4link@#2}}%
     \expandafter\newrobustcmd\expandafter*\expandafter
      #3\expandafter{\expandafter\@gls@hyp@opt\csname\@glsxtrnewgls@innercsname\endcsname}%
     \ifstrempty{#1}%
     {%
       \expandafter\newcommand\expandafter*\csname\@glsxtrnewgls@innercsname\endcsname[2][]{%
          \csname #4\endcsname{##1}{#2##2}%
       }%
     }%
     {%
       \expandafter\newcommand\expandafter*\csname\@glsxtrnewgls@innercsname\endcsname[2][]{%
          \csname #4\endcsname{#1,##1}{#2##2}%
       }%
     }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnewglslink}
%\begin{definition}
%\cs{glsxtrnewglslink}\oarg{options}\marg{prefix}\marg{cs}
%\end{definition}
%The first argument prepends to the options and the second argument is the prefix.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrnewglslink}[3][]{%
  \@glsxtrnewglslink{#1}{#2}{#3}{@gls@@link}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnewglsdisp}
%\begin{definition}
%\cs{glsxtrnewglsdisp}\oarg{options}\marg{prefix}\marg{cs}
%\end{definition}
%The first argument prepends to the options and the second argument is the prefix.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrnewglsdisp}[3][]{%
  \@glsxtrnewglslink{#1}{#2}{#3}{@glsdisp}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrnewgls}
%\changes{1.21}{2017-11-03}{new}
%\begin{definition}
%\cs{@glsxtrnewgls}\oarg{options}\marg{prefix}\marg{cs}\marg{inner cs
%name}
%\end{definition}
%
%    \begin{macrocode}
\newcommand*{\@glsxtrnewgls}[4]{%
  \ifdef{#3}%
  {%
    \PackageError{glossaries-extra}{Command \string#3\space already
defined}{}%
  }%
  {%
%    \end{macrocode}
%Write information to the aux file for bib2gls.
%    \begin{macrocode}
     \glsxtridentifyglslike{#2}{#3}%
     \ifcsdef{@#4like@#2}%
     {%
       \advance\@glsxtrnewgls@inner by \@ne
       \def\@glsxtrnewgls@innercsname{@#4like\number\@glsxtrnewgls@inner @#2}%
     }%
     {\def\@glsxtrnewgls@innercsname{@#4like@#2}}%
     \expandafter\newrobustcmd\expandafter*\expandafter
      #3\expandafter{\expandafter\@gls@hyp@opt\csname\@glsxtrnewgls@innercsname\endcsname}%
     \ifstrempty{#1}%
     {%
       \expandafter\newcommand\expandafter*\csname\@glsxtrnewgls@innercsname\endcsname[2][]{%
         \new@ifnextchar[%
          {\csname @#4@\endcsname{##1}{#2##2}}%
          {\csname @#4@\endcsname{##1}{#2##2}[]}%
       }%
     }%
     {%
       \expandafter\newcommand\expandafter*\csname\@glsxtrnewgls@innercsname\endcsname[2][]{%
         \new@ifnextchar[%
          {\csname @#4@\endcsname{#1,##1}{#2##2}}%
          {\csname @#4@\endcsname{#1,##1}{#2##2}[]}%
       }%
     }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnewgls}
%\begin{definition}
%\cs{glsxtrnewgls}\oarg{options}\marg{prefix}\marg{cs}
%\end{definition}
%The first argument prepends to the options and the second argument is the prefix.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrnewgls}[3][]{%
  \@glsxtrnewgls{#1}{#2}{#3}{gls}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnewglslike}
%Provide a way to conveniently define commands that behave like
%\cs{gls}, \cs{glspl}, \cs{Gls} and \cs{Glspl} with a label prefix.
%The first argument prepends to the options and the second argument is the prefix.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrnewglslike}[6][]{%
  \glsxtridentifyglsfamily{#1}{#2}{#3}{#4}{#5}{#6}{}{}%
  \@glsxtrnewgls{#1}{#2}{#3}{gls}%
  \@glsxtrnewgls{#1}{#2}{#4}{glspl}%
  \@glsxtrnewgls{#1}{#2}{#5}{Gls}%
  \@glsxtrnewgls{#1}{#2}{#6}{Glspl}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnewGLSlike}
%Provide a way to conveniently define commands that behave like
%\cs{GLS}, \cs{GLSpl} with a label prefix.
%The first argument prepends to the options and the second argument is the prefix.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrnewGLSlike}[4][]{%
  \glsxtridentifyglsfamily{#1}{#2}{}{}{}{}{#3}{#4}%
  \@glsxtrnewgls{#1}{#2}{#3}{GLS}%
  \@glsxtrnewgls{#1}{#2}{#4}{GLSpl}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnewrgls}
%As \cs{glsxtrnewgls} but for \cs{rgls}.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrnewrgls}[3][]{%
  \@glsxtrnewgls{#1}{#2}{#3}{rgls}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnewrglslike}
%As \cs{glsxtrnewglslike} but for \cs{rgls} etc.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrnewrglslike}[6][]{%
  \glsxtridentifyglsfamily{#1}{#2}{#3}{#4}{#5}{#6}{}{}%
  \@glsxtrnewgls{#1}{#2}{#3}{rgls}%
  \@glsxtrnewgls{#1}{#2}{#4}{rglspl}%
  \@glsxtrnewgls{#1}{#2}{#5}{rGls}%
  \@glsxtrnewgls{#1}{#2}{#6}{rGlspl}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnewrGLSlike}
%\changes{1.21}{2017-11-03}{new}
%As \cs{glsxtrnewGLSlike} but for \cs{rGLS} etc.
%    \begin{macrocode}
\newrobustcmd*{\glsxtrnewrGLSlike}[4][]{%
  \glsxtridentifyglsfamily{#1}{#2}{}{}{}{}{#3}{#4}%
  \@glsxtrnewgls{#1}{#2}{#3}{rGLS}%
  \@glsxtrnewgls{#1}{#2}{#4}{rGLSpl}%
}
%    \end{macrocode}
%\end{macro}
%
%Provide easy access to record count fields.
%\begin{macro}{\GlsXtrTotalRecordCount}
%\changes{1.21}{2017-11-03}{new}
%Access total record count. This is designed to
%be expandable. The argument is the label.
%    \begin{macrocode}
\newcommand*{\GlsXtrTotalRecordCount}[1]{%
 \ifcsdef{glo@\glsdetoklabel{#1}@recordcount}%
 {\csname glo@\glsdetoklabel{#1}@recordcount\endcsname}%
 {0}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\GlsXtrRecordCount}
%\changes{1.21}{2017-11-03}{new}
%Access record count for a particular counter. The first argument is the label.
%The second argument is the counter name.
%    \begin{macrocode}
\newcommand*{\GlsXtrRecordCount}[2]{%
 \ifcsdef{glo@\glsdetoklabel{#1}@recordcount.#2}%
 {\csname glo@\glsdetoklabel{#1}@recordcount.#2\endcsname}%
 {0}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrLocationRecordCount}
%\changes{1.21}{2017-11-03}{new}
%Access record count for a particular counter and location. 
%The first argument is the label.
%The second argument is the counter name.
%The third argument is the location.
%This command shouldn't be used if the location doesn't fully
%expand unless \cs{glsxtrdetoklocation} can be set to something
%sensible.
%    \begin{macrocode}
\newcommand*{\GlsXtrLocationRecordCount}[3]{%
 \ifcsdef{glo@\glsdetoklabel{#1}@recordcount.#2.\glsxtrdetoklocation{#3}}%
 {\csname glo@\glsdetoklabel{#1}@recordcount.#2.\glsxtrdetoklocation{#3}\endcsname}%
 {0}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrdetoklocation}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrdetoklocation}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrenablerecordcount}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrenablerecordcount}{%
  \renewcommand*{\gls}{\rgls}%
  \renewcommand*{\Gls}{\rGls}%
  \renewcommand*{\glspl}{\rglspl}%
  \renewcommand*{\Glspl}{\rGlspl}%
  \renewcommand*{\GLS}{\rGLS}%
  \renewcommand*{\GLSpl}{\rGLSpl}%
  \renewcommand{\shortcut@gls}{\rgls}%
  \renewcommand{\shortcut@glspl}{\rglspl}%
  \renewcommand{\shortcut@Gls}{\rGls}%
  \renewcommand{\shortcut@Glspl}{\rGlspl}%
  \renewcommand{\shortcut@GLS}{\rGLS}%
  \renewcommand{\shortcut@GLSpl}{\rGLSpl}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrrecordtriggervalue}
%\changes{1.21}{2017-11-03}{new}
%The value used by the record trigger test.
%The argument is the entry's label.
%    \begin{macrocode}
\newcommand*{\glsxtrrecordtriggervalue}[1]{%
 \GlsXtrTotalRecordCount{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrSetRecordCountAttribute}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrSetRecordCountAttribute}[2]{%
 \@for\@glsxtr@cat:=#1\do
 {%
   \ifdefempty{\@glsxtr@cat}{}%
   {%
     \glssetcategoryattribute{\@glsxtr@cat}{recordcount}{#2}%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifrecordtrigger}
%\begin{definition}
%\cs{glsxtrifrecordtrigger}\marg{label}\marg{trigger format}\marg{normal}
%\end{definition}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrifrecordtrigger}[3]{%
 \glshasattribute{#1}{recordcount}%
 {%
   \ifnum\glsxtrrecordtriggervalue{#1}>\glsgetattribute{#1}{recordcount}\relax
    #3%
   \else
    #2%
   \fi
 }%
 {#3}% 
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@rglstrigger@record}
%\changes{1.21}{2017-11-03}{new}
%Still need a record to ensure that \app{bib2gls} selects the entry.
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
\newcommand*{\@glsxtr@rglstrigger@record}[3]{%
  \protected@edef\glslabel{\glsdetoklabel{#2}}%
  \let\@gls@link@label\glslabel
  \def\@glsxtr@thevalue{}%
  \def\@glsxtr@theHvalue{\@glsxtr@thevalue}%
  \def\@glsnumberformat{glstriggerrecordformat}%
  \protected@edef\@gls@counter{\csname glo@\glslabel @counter\endcsname}%
  \protected@edef\glstype{\csname glo@\glslabel @type\endcsname}%
  \def\@glsxtr@thevalue{}%
  \def\@glsxtr@theHvalue{\@glsxtr@thevalue}%
%    \end{macrocode}
%Save local setting.
%    \begin{macrocode}
  \@gls@save@glslocal
%    \end{macrocode}
%Initialise preunset, prereset and postunset
%    \begin{macrocode}
  \glsinitreunsets
  \glsxtrinitwrgloss
  \glslinkpresetkeys
  \setkeys{glslink}{#1}%
  \glslinkpostsetkeys
  \ifdefempty{\@glsxtr@thevalue}%
  {%
    \@gls@saveentrycounter
  }%
  {%
    \let\theglsentrycounter\@glsxtr@thevalue
    \def\theHglsentrycounter{\@glsxtr@theHvalue}%
  }%
  \glslinkwrcontent
  {%
    \ifglsxtrinitwrglossbefore
      \glsxtr@wrglossary@encap{#2}{\@do@wrglossary{#2}}%
    \fi
    #3%
    \ifglsxtrinitwrglossbefore
    \else
      \glsxtr@wrglossary@encap{#2}{\@do@wrglossary{#2}}%
    \fi
  }%
  \@gls@restore@glslocal
  \@gls@do@glsunset{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstriggerrecordformat}
%\changes{1.21}{2017-11-03}{new}
%Typically won't be used as it should be recognised as a special
%type of ignored location by \app{bib2gls}. 
%    \begin{macrocode}
\newcommand*{\glstriggerrecordformat}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\rgls}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\rgls}{\@gls@hyp@opt\@rgls}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@rgls}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\@rgls}[2][]{%
  \new@ifnextchar[{\@rgls@{#1}{#2}}{\@rgls@{#1}{#2}[]}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@rgls@}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\def\@rgls@#1#2[#3]{%
  \glsxtrifrecordtrigger{#2}%
  {%
    \@glsxtr@rglstrigger@record{#1}{#2}{\rglsformat{#2}{#3}}%
  }% 
  {%
    \@gls@{#1}{#2}[#3]%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\rglspl}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\rglspl}{\@gls@hyp@opt\@rglspl}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@rglspl}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\@rglspl}[2][]{%
  \new@ifnextchar[{\@rglspl@{#1}{#2}}{\@rglspl@{#1}{#2}[]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@rglspl@}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\def\@rglspl@#1#2[#3]{%
  \glsxtrifrecordtrigger{#2}%
  {%
    \@glsxtr@rglstrigger@record{#1}{#2}{\rglsplformat{#2}{#3}}%
  }%
  {%
    \@glspl@{#1}{#2}[#3]%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\rGls}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\rGls}{\@gls@hyp@opt\@rGls}
\glsmfuaddmap{\rgls}{\rGls}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@rGls}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\@rGls}[2][]{%
  \new@ifnextchar[{\@rGls@{#1}{#2}}{\@rGls@{#1}{#2}[]}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@rGls@}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\def\@rGls@#1#2[#3]{%
  \glsxtrifrecordtrigger{#2}%
  {%
    \@glsxtr@rglstrigger@record{#1}{#2}{\rGlsformat{#2}{#3}}%
  }%
  {%
    \@Gls@{#1}{#2}[#3]%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\rGlspl}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\rGlspl}{\@gls@hyp@opt\@rGlspl}
\glsmfuaddmap{\rglspl}{\rGlspl}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@rGlspl}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\@rGlspl}[2][]{%
  \new@ifnextchar[{\@rGlspl@{#1}{#2}}{\@rGlspl@{#1}{#2}[]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@rGlspl@}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\def\@rGlspl@#1#2[#3]{%
  \glsxtrifrecordtrigger{#2}%
  {%
    \@glsxtr@rglstrigger@record{#1}{#2}{\rGlsplformat{#2}{#3}}%
  }%
  {%
    \@Glspl@{#1}{#2}[#3]%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\rGLS}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\rGLS}{\@gls@hyp@opt\@rGLS}
\glsmfublocker{\rGLS}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@rGLS}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\@rGLS}[2][]{%
  \new@ifnextchar[{\@rGLS@{#1}{#2}}{\@rGLS@{#1}{#2}[]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@rGLS@}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\def\@rGLS@#1#2[#3]{%
  \glsxtrifrecordtrigger{#2}%
  {%
    \@glsxtr@rglstrigger@record{#1}{#2}{\rGLSformat{#2}{#3}}%
  }% 
  {%
    \@GLS@{#1}{#2}[#3]%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\rGLSpl}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\rGLSpl}{\@gls@hyp@opt\@rGLSpl}
\glsmfublocker{\rGLSpl}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@rGLSpl}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\@rGLSpl}[2][]{%
  \new@ifnextchar[{\@rGLSpl@{#1}{#2}}{\@rGLSpl@{#1}{#2}[]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@rGLSpl@}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\def\@rGLSpl@#1#2[#3]{%
  \glsxtrifrecordtrigger{#2}%
  {%
    \@glsxtr@rglstrigger@record{#1}{#2}{\rGLSplformat{#2}{#3}}%
  }%
  {%
    \@GLSpl@{#1}{#2}[#3]%
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\rglsformat}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\rglsformat}[2]{%
  \glsifregular{#1}
  {\glsentryfirst{#1}}%
  {\ifglshaslong{#1}{\glsentrylong{#1}}{\glsentryfirst{#1}}}#2%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\rglsplformat}
%\changes{1.21}{2017-11-03}{new}
%\changes{1.58}{2025-03-12}{corrected command name spelling}
%    \begin{macrocode}
\newcommand*{\rglsplformat}[2]{%
  \glsifregular{#1}
  {\glsentryfirstplural{#1}}%
  {\ifglshaslong{#1}{\glsentrylongpl{#1}}{\glsentryfirstplural{#1}}}#2%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\rGlsformat}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\rGlsformat}[2]{%
  \glsifregular{#1}
  {\Glsentryfirst{#1}}%
  {\ifglshaslong{#1}{\Glsentrylong{#1}}{\Glsentryfirst{#1}}}#2%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\rGlsplformat}
%\changes{1.21}{2017-11-03}{new}
%\changes{1.58}{2025-03-12}{corrected command name spelling}
%    \begin{macrocode}
\newcommand*{\rGlsplformat}[2]{%
  \glsifregular{#1}
  {\Glsentryfirstplural{#1}}%
  {\ifglshaslong{#1}{\Glsentrylongpl{#1}}{\Glsentryfirstplural{#1}}}#2%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\rGLSformat}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\rGLSformat}[2]{%
 \expandafter\glsuppercase\expandafter{\rglsformat{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\rGLSplformat}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\rGLSplformat}[2]{%
 \expandafter\glsuppercase\expandafter{\rglsplformat{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Link Counting}
%\label{sec:linkcount}
%This is different to the entry counting provided by the base
%package (which counts the number of times the first use flag is
%unset). Instead, this method hooks into \cs{@gls@link} (through
%\cs{glsxtr@inc@linkcount}) to increment an associated counter.
%To preserve resources, the counter is only defined if it needs to
%be incremented. This method is independent of the presence of
%hyperlinks. (The \qt{link} part of the name refers to \cs{@gls@link}
%not \cs{hyperlink}.)
%
%\begin{macro}{\@glsxtr@do@inc@linkcount}
%\changes{1.26}{2018-01-05}{new}
%This performs the actual incrementing and counter definition.
%The counter is given by \cs{c@glsxtr@linkcount@\meta{label}} where
%\meta{label} is the entry's label. Since this is performed within
%\cs{@gls@link} the label can be accessed with \cs{glslabel}.
%    \begin{macrocode}
\newcommand{\@glsxtr@do@inc@linkcount}{%
%    \end{macrocode}
%Does this entry have the \catattr{linkcount} attribute set?
%    \begin{macrocode}
 \glsifattribute{\glslabel}{linkcount}{true}%
 {%
%    \end{macrocode}
%Does the counter exist?
%    \begin{macrocode}
   \ifcsdef{c@glsxtr@linkcount@\glslabel}{}%
   {%
%    \end{macrocode}
%Counter doesn't exist, so define it.
%    \begin{macrocode}
     \newcounter{glsxtr@linkcount@\glslabel}%
%    \end{macrocode}
%If \catattr{linkcountmaster} is set, add to counter reset.
%    \begin{macrocode}
     \glshasattribute{\glslabel}{linkcountmaster}%
     {%
%    \end{macrocode}
%Need to ensure values are fully expanded.
%\changes{1.46}{2021-09-20}{changed \cs{x} to \cs{@glo@tmp}}
%    \begin{macrocode}
       \begingroup
        \edef\@glo@tmp{\endgroup\noexpand\@addtoreset{glsxtr@linkcount@\glslabel}%
         {\glsgetattribute{\glslabel}{linkcountmaster}}}%
       \@glo@tmp
     }%
     {}%
   }%
%    \end{macrocode}
% Increment counter:
%    \begin{macrocode}
  \glsxtrinclinkcounter{glsxtr@linkcount@\glslabel}%
 }%
 {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrinclinkcounter}
%\changes{1.26}{2018-01-05}{new}
%May be redefined to use \cs{refstepcounter} if required.
%    \begin{macrocode}
\newcommand*{\glsxtrinclinkcounter}[1]{\stepcounter{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrLinkCounterValue}
%\changes{1.26}{2018-01-05}{new}
%Expands to the associated link counter register or 0 if not
%defined.
%    \begin{macrocode}
\newcommand*{\GlsXtrLinkCounterValue}[1]{%
 \ifcsundef{c@glsxtr@linkcount@#1}{0}{\csname c@glsxtr@linkcount@#1\endcsname}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrTheLinkCounter}
%\changes{1.26}{2018-01-05}{new}
%Expands to the display value of the associated link counter or 0 if not
%defined.
%    \begin{macrocode}
\newcommand*{\GlsXtrTheLinkCounter}[1]{%
 \ifcsundef{theglsxtr@linkcount@#1}{0}%
 {\csname theglsxtr@linkcount@#1\endcsname}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrIfLinkCounterDef}
%\changes{1.26}{2018-01-05}{new}
%Tests if the counter has been defined
%    \begin{macrocode}
\newcommand*{\GlsXtrIfLinkCounterDef}[3]{%
 \ifcsundef{theglsxtr@linkcount@#1}{#3}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrLinkCounterName}
%\changes{1.26}{2018-01-05}{new}
%Expands to the associated link counter name. (No check for
%existence.)
%    \begin{macrocode}
\newcommand*{\GlsXtrLinkCounterName}[1]{glsxtr@linkcount@#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrEnableLinkCounting}
%\changes{1.26}{2018-01-05}{new}
%\begin{definition}
%\cs{GlsXtrEnableLinkCounting}\oarg{master counter}\marg{categories}
%\end{definition}
%Enable link counting for the given categories.
%    \begin{macrocode}
\newcommand*{\GlsXtrEnableLinkCounting}[2][]{%
 \let\glsxtr@inc@linkcount\@glsxtr@do@inc@linkcount
 \@for\@glsxtr@label:=#2\do
 {%
  \glssetcategoryattribute{\@glsxtr@label}{linkcount}{true}%
  \ifstrempty{#1}{}%
  {%
    \ifcsundef{c@#1}%
    {\@nocounterr{#1}}%
    {\glssetcategoryattribute{\@glsxtr@label}{linkcountmaster}{#1}}%
  }%
 }%
}
\@onlypreamble\GlsXtrEnableLinkCounting
%    \end{macrocode}
%\end{macro}
%
%\subsection{Integration with glossaries-accsupp}
% Provide better integration with the \sty{glossaries-accsupp}
% package. (Must be loaded before the main code of
% \sty{glossaries-extra} either explicitly or through the
% \pkgopt{accsupp} package option.)
%
% These commands have their definitions set according to whether
% or not \sty{glossaries-extra} has been loaded.
%\changes{0.5.2}{2015-12-08}{fixed typo in glossaries-accsupp and tidied up code to use
% just one \cs{@ifpackageloaded}}
%
%To allow for formatting commands that need to go inside all other commands
%(such as the commands provided by \sty{soul}), also add version
% of each command that takes a text-block command as an argument.
%    \begin{macrocode}
\@ifpackageloaded{glossaries-accsupp}
{
%    \end{macrocode}
% Define (or redefine) commands to use the accessibility
% information.
%\begin{macro}{\glsaccessname}
% Display the \gloskey{name} value (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessname}[1]{%
    \glsnameaccessdisplay
    {%
      \glsentryname{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtname}
%\begin{definition}
%\cs{glsaccessfmtname}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtname}[3]{%
    \glsnameaccessdisplay
    {%
      \glsfmtfield{#1}{#2}{#3}{name}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessname}
% Display the \gloskey{name} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{0.5.1}{2015-12-07}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessname}[1]{%
    \glsnameaccessdisplay
    {%
      \Glsentryname{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtname}
%\begin{definition}
%\cs{Glsaccessfmtname}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtname}[3]{%
    \glsnameaccessdisplay
    {%
      \Glsfmtfield{#1}{#2}{#3}{name}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessname}
% Display the \gloskey{name} value (no link and no check for existence)
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessname}[1]{%
    \glsnameaccessdisplay
    {%
      \glsuppercase{\glsentryname{#1}}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtname}
%\begin{definition}
%\cs{GLSaccessfmtname}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtname}[3]{%
    \glsnameaccessdisplay
    {%
      \GLSfmtfield{#1}{#2}{#3}{name}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccesstext}
% Display the \gloskey{text} value (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccesstext}[1]{%
    \glstextaccessdisplay
    {%
      \glsentrytext{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmttext}
%\begin{definition}
%\cs{glsaccessfmttext}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmttext}[3]{%
    \glstextaccessdisplay
    {%
      \glsfmtfield{#1}{#2}{#3}{text}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccesstext}
% Display the \gloskey{text} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{0.5.1}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccesstext}[1]{%
    \glstextaccessdisplay
    {%
      \Glsentrytext{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmttext}
%\begin{definition}
%\cs{Glsaccessfmttext}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmttext}[3]{%
    \glstextaccessdisplay
    {%
      \Glsfmtfield{#1}{#2}{#3}{text}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccesstext}
% Display the \gloskey{text} value (no link and no check for existence)
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccesstext}[1]{%
    \glstextaccessdisplay
    {%
      \glsuppercase{\glsentrytext{#1}}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmttext}
%\begin{definition}
%\cs{GLSaccessfmttext}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmttext}[3]{%
    \glstextaccessdisplay
    {%
      \GLSfmtfield{#1}{#2}{#3}{text}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessplural}
% Display the \gloskey{plural} value (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessplural}[1]{%
    \glspluralaccessdisplay
    {%
      \glsentryplural{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtplural}
%\begin{definition}
%\cs{glsaccessfmtplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtplural}[3]{%
    \glspluralaccessdisplay
    {%
      \glsfmtfield{#1}{#2}{#3}{plural}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessplural}
% Display the \gloskey{plural} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{0.5.1}{2015-12-07}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessplural}[1]{%
    \glspluralaccessdisplay
    {%
      \Glsentryplural{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtplural}
%\begin{definition}
%\cs{Glsaccessfmtplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtplural}[3]{%
    \glspluralaccessdisplay
    {%
      \Glsfmtfield{#1}{#2}{#3}{plural}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessplural}
% Display the \gloskey{plural} value (no link and no check for existence)
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessplural}[1]{%
    \glspluralaccessdisplay
    {%
      \glsuppercase{\glsentryplural{#1}}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtplural}
%\begin{definition}
%\cs{GLSaccessfmtplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtplural}[3]{%
    \glspluralaccessdisplay
    {%
      \GLSfmtfield{#1}{#2}{#3}{plural}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfirst}
% Display the \gloskey{first} value (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfirst}[1]{%
    \glsfirstaccessdisplay
    {%
      \glsentryfirst{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtfirst}
%\begin{definition}
%\cs{glsaccessfmtfirst}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtfirst}[3]{%
    \glsfirstaccessdisplay
    {%
      \glsfmtfield{#1}{#2}{#3}{first}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfirst}
% Display the \gloskey{first} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{0.5.1}{2015-12-07}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfirst}[1]{%
    \glsfirstaccessdisplay
    {%
      \Glsentryfirst{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtfirst}
%\begin{definition}
%\cs{Glsaccessfmtfirst}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtfirst}[3]{%
    \glsfirstaccessdisplay
    {%
      \Glsfmtfield{#1}{#2}{#3}{first}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfirst}
% Display the \gloskey{first} value (no link and no check for existence)
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfirst}[1]{%
    \glsfirstaccessdisplay
    {%
      \glsuppercase{\glsentryfirst{#1}}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtfirst}
%\begin{definition}
%\cs{GLSaccessfmtfirst}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtfirst}[3]{%
    \glsfirstaccessdisplay
    {%
      \GLSfmtfield{#1}{#2}{#3}{first}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfirstplural}
% Display the \gloskey{firstplural} value (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfirstplural}[1]{%
    \glsfirstpluralaccessdisplay
    {%
      \glsentryfirstplural{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtfirstplural}
%\begin{definition}
%\cs{glsaccessfmtfirstplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtfirstplural}[3]{%
    \glsfirstpluralaccessdisplay
    {%
      \glsfmtfield{#1}{#2}{#3}{firstpl}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfirstplural}
% Display the \gloskey{firstplural} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{0.5.1}{2015-12-07}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfirstplural}[1]{%
    \glsfirstpluralaccessdisplay
    {%
      \Glsentryfirstplural{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtfirstplural}
%\begin{definition}
%\cs{Glsaccessfmtfirstplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtfirstplural}[3]{%
    \glsfirstpluralaccessdisplay
    {%
      \Glsfmtfield{#1}{#2}{#3}{firstpl}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfirstplural}
% Display the \gloskey{firstplural} value (no link and no check for existence)
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfirstplural}[1]{%
    \glsfirstpluralaccessdisplay
    {%
      \glsuppercase{\glsentryfirstplural{#1}}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtfirstplural}
%\begin{definition}
%\cs{GLSaccessfmtfirstplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtfirstplural}[3]{%
    \glsfirstpluralaccessdisplay
    {%
      \GLSfmtfield{#1}{#2}{#3}{firstpl}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccesssymbol}
% Display the \gloskey{symbol} value (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccesssymbol}[1]{%
    \glssymbolaccessdisplay
    {%
      \glsentrysymbol{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtsymbol}
%\begin{definition}
%\cs{glsaccessfmtsymbol}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtsymbol}[3]{%
    \glssymbolaccessdisplay
    {%
      \glsfmtfield{#1}{#2}{#3}{symbol}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccesssymbol}
% Display the \gloskey{symbol} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{0.5.1}{2015-12-07}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccesssymbol}[1]{%
    \glssymbolaccessdisplay
    {%
      \Glsentrysymbol{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtsymbol}
%\begin{definition}
%\cs{Glsaccessfmtsymbol}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtsymbol}[3]{%
    \glssymbolaccessdisplay
    {%
      \Glsfmtfield{#1}{#2}{#3}{symbol}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccesssymbol}
% Display the \gloskey{symbol} value (no link and no check for existence)
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccesssymbol}[1]{%
    \glssymbolaccessdisplay
    {%
      \glsuppercase{\glsentrysymbol{#1}}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtsymbol}
%\begin{definition}
%\cs{GLSaccessfmtsymbol}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtsymbol}[3]{%
    \glssymbolaccessdisplay
    {%
      \GLSfmtfield{#1}{#2}{#3}{symbol}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccesssymbolplural}
% Display the \gloskey{symbolplural} value (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccesssymbolplural}[1]{%
    \glssymbolpluralaccessdisplay
    {%
      \glsentrysymbolplural{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtsymbolplural}
%\begin{definition}
%\cs{glsaccessfmtsymbolplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtsymbolplural}[3]{%
    \glssymbolpluralaccessdisplay
    {%
      \glsfmtfield{#1}{#2}{#3}{symbolplural}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccesssymbolplural}
% Display the \gloskey{symbolplural} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{0.5.1}{2015-12-07}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccesssymbolplural}[1]{%
    \glssymbolpluralaccessdisplay
    {%
      \Glsentrysymbolplural{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtsymbolplural}
%\begin{definition}
%\cs{Glsaccessfmtsymbolplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtsymbolplural}[3]{%
    \glssymbolpluralaccessdisplay
    {%
      \Glsfmtfield{#1}{#2}{#3}{symbolplural}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccesssymbolplural}
% Display the \gloskey{symbolplural} value (no link and no check for existence)
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccesssymbolplural}[1]{%
    \glssymbolpluralaccessdisplay
    {%
      \glsuppercase{\glsentrysymbolplural{#1}}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtsymbolplural}
%\begin{definition}
%\cs{GLSaccessfmtsymbolplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtsymbolplural}[3]{%
    \glssymbolpluralaccessdisplay
    {%
      \GLSfmtfield{#1}{#2}{#3}{symbolplural}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessdesc}
% Display the \gloskey{desc} value (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessdesc}[1]{%
    \glsdescriptionaccessdisplay
    {%
      \glsentrydesc{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtdesc}
%\begin{definition}
%\cs{glsaccessfmtdesc}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtdesc}[3]{%
    \glsdescaccessdisplay
    {%
      \glsfmtfield{#1}{#2}{#3}{desc}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessdesc}
% Display the \gloskey{desc} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{0.5.1}{2015-12-07}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessdesc}[1]{%
    \glsdescriptionaccessdisplay
    {%
      \Glsentrydesc{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtdesc}
%\begin{definition}
%\cs{Glsaccessfmtdesc}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtdesc}[3]{%
    \glsdescaccessdisplay
    {%
      \Glsfmtfield{#1}{#2}{#3}{desc}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessdesc}
% Display the \gloskey{desc} value (no link and no check for existence)
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessdesc}[1]{%
    \glsdescriptionaccessdisplay
    {%
      \glsuppercase{\glsentrydesc{#1}}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtdesc}
%\begin{definition}
%\cs{GLSaccessfmtdesc}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtdesc}[3]{%
    \glsdescaccessdisplay
    {%
      \GLSfmtfield{#1}{#2}{#3}{desc}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessdescplural}
% Display the \gloskey{descplural} value (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessdescplural}[1]{%
    \glsdescriptionpluralaccessdisplay
    {%
      \glsentrydescplural{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtdescplural}
%\begin{definition}
%\cs{glsaccessfmtdescplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtdescplural}[3]{%
    \glsdescpluralaccessdisplay
    {%
      \glsfmtfield{#1}{#2}{#3}{descplural}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessdescplural}
% Display the \gloskey{descplural} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{0.5.1}{2015-12-07}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessdescplural}[1]{%
    \glsdescriptionpluralaccessdisplay
    {%
      \Glsentrydescplural{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtdescplural}
%\begin{definition}
%\cs{Glsaccessfmtdescplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtdescplural}[3]{%
    \glsdescpluralaccessdisplay
    {%
      \Glsfmtfield{#1}{#2}{#3}{descplural}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessdescplural}
% Display the \gloskey{descplural} value (no link and no check for existence)
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessdescplural}[1]{%
    \glsdescriptionpluralaccessdisplay
    {%
      \glsuppercase{\glsentrydescplural{#1}}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtdescplural}
%\begin{definition}
%\cs{GLSaccessfmtdescplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtdescplural}[3]{%
    \glsdescpluralaccessdisplay
    {%
      \GLSfmtfield{#1}{#2}{#3}{descplural}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessshort}
% Display the short form (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessshort}[1]{%
    \glsshortaccessdisplay
    {%
      \glsentryshort{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtshort}
%\begin{definition}
%\cs{glsaccessfmtshort}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtshort}[3]{%
    \glsshortaccessdisplay
    {%
      \glsfmtfield{#1}{#2}{#3}{short}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessshort}
% Display the short form with first letter converted to uppercase
% (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessshort}[1]{%
    \glsshortaccessdisplay
    {%
      \Glsentryshort{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtshort}
%\begin{definition}
%\cs{Glsaccessfmtshort}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtshort}[3]{%
    \glsshortaccessdisplay
    {%
      \Glsfmtfield{#1}{#2}{#3}{short}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessshort}
% Display the \gloskey{short} value (no link and no check for existence)
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessshort}[1]{%
    \glsshortaccessdisplay
    {%
      \glsuppercase{\glsentryshort{#1}}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtshort}
%\begin{definition}
%\cs{GLSaccessfmtshort}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtshort}[3]{%
    \glsshortaccessdisplay
    {%
      \GLSfmtfield{#1}{#2}{#3}{short}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessshortpl}
% Display the short plural form (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessshortpl}[1]{%
    \glsshortpluralaccessdisplay
    {%
      \glsentryshortpl{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtshortpl}
%\begin{definition}
%\cs{glsaccessfmtshortpl}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtshortpl}[3]{%
    \glsshortpluralaccessdisplay
    {%
      \glsfmtfield{#1}{#2}{#3}{shortpl}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessshortpl}
% Display the short plural form with first letter converted to
% uppercase (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessshortpl}[1]{%
    \glsshortpluralaccessdisplay
    {%
      \Glsentryshortpl{#1}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtshortpl}
%\begin{definition}
%\cs{Glsaccessfmtshortpl}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtshortpl}[3]{%
    \glsshortpluralaccessdisplay
    {%
      \Glsfmtfield{#1}{#2}{#3}{shortpl}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessshortpl}
% Display the \gloskey{shortplural} value (no link and no check for existence)
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessshortpl}[1]{%
    \glsshortpluralaccessdisplay
    {%
      \glsuppercase{\glsentryshortpl{#1}}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtshortpl}
%\begin{definition}
%\cs{GLSaccessfmtshortpl}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtshortpl}[3]{%
    \glsshortpluralaccessdisplay
    {%
      \GLSfmtfield{#1}{#2}{#3}{shortpl}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccesslong}
% Display the long form (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccesslong}[1]{%
    \glslongaccessdisplay{\glsentrylong{#1}}{#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtlong}
%\begin{definition}
%\cs{glsaccessfmtlong}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtlong}[3]{%
    \glslongaccessdisplay
    {%
      \glsfmtfield{#1}{#2}{#3}{long}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccesslong}
% Display the long form (no link and no check for existence).
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccesslong}[1]{%
    \glslongaccessdisplay{\Glsentrylong{#1}}{#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtlong}
%\begin{definition}
%\cs{Glsaccessfmtlong}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtlong}[3]{%
    \glslongaccessdisplay
    {%
      \Glsfmtfield{#1}{#2}{#3}{long}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccesslong}
% Display the \gloskey{long} value (no link and no check for existence)
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccesslong}[1]{%
    \glslongaccessdisplay
    {%
      \glsuppercase{\glsentrylong{#1}}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtlong}
%\begin{definition}
%\cs{GLSaccessfmtlong}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtlong}[3]{%
    \glslongaccessdisplay
    {%
      \GLSfmtfield{#1}{#2}{#3}{long}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccesslongpl}
% Display the long plural form (no link and no check for existence).
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccesslongpl}[1]{%
    \glslongpluralaccessdisplay{\glsentrylongpl{#1}}{#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtlongpl}
%\begin{definition}
%\cs{glsaccessfmtlongpl}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtlongpl}[3]{%
    \glslongpluralaccessdisplay
    {%
      \glsfmtfield{#1}{#2}{#3}{longpl}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccesslongpl}
% Display the long plural form (no link and no check for existence).
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}

  \newcommand*{\Glsaccesslongpl}[1]{%
    \glslongpluralaccessdisplay{\Glsentrylongpl{#1}}{#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtlongpl}
%\begin{definition}
%\cs{Glsaccessfmtlongpl}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtlongpl}[3]{%
    \glslongpluralaccessdisplay
    {%
      \Glsfmtfield{#1}{#2}{#3}{longpl}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccesslongpl}
% Display the \gloskey{longplural} value (no link and no check for existence)
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccesslongpl}[1]{%
    \glslongpluralaccessdisplay
    {%
      \glsuppercase{\glsentrylongpl{#1}}%
    }%
    {#1}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtlongpl}
%\begin{definition}
%\cs{GLSaccessfmtlongpl}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtlongpl}[3]{%
    \glslongpluralaccessdisplay
    {%
      \GLSfmtfield{#1}{#2}{#3}{longpl}%
    }%
    {#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%The user accessibility fields were added to
%\sty{glossaries-accsupp} v4.45 so these may not be defined.
%
%USER1
%\begin{macro}{\glsaccessuseri}
% Display the \gloskey{user1} value (no link and no check for existence).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriaccessdisplay
  {
    \newcommand*{\glsaccessuseri}[1]{%
      \glsuseriaccessdisplay
      {%
        \glsentryuseri{#1}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\glsaccessuseri}[1]{%
      \glsentryuseri{#1}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtuseri}
%\begin{definition}
%\cs{glsaccessfmtuseri}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriaccessdisplay
  {
    \newcommand*{\glsaccessfmtuseri}[3]{%
      \glsuseriaccessdisplay
      {%
        \glsfmtfield{#1}{#2}{#3}{useri}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\glsaccessfmtuseri}[3]{%
      \glsfmtfield{#1}{#2}{#3}{useri}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessuseri}
% Display the \gloskey{user1} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriaccessdisplay
  {
    \newcommand*{\Glsaccessuseri}[1]{%
      \glsuseriaccessdisplay
      {%
        \Glsentryuseri{#1}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\Glsaccessuseri}[1]{%
      \Glsentryuseri{#1}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtuseri}
%\begin{definition}
%\cs{Glsaccessfmtuseri}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriaccessdisplay
  {
    \newcommand*{\Glsaccessfmtuseri}[3]{%
      \glsuseriaccessdisplay
      {%
        \Glsfmtfield{#1}{#2}{#3}{useri}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\Glsaccessfmtuseri}[3]{%
      \Glsfmtfield{#1}{#2}{#3}{useri}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessuseri}
% Display the \gloskey{user1} value (no link and no check for existence)
% converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriaccessdisplay
  {
    \newcommand*{\GLSaccessuseri}[1]{%
      \glsuseriaccessdisplay
      {%
        \glsuppercase{\glsentryuseri{#1}}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\GLSaccessuseri}[1]{%
      \glsuppercase{\glsentryuseri{#1}}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtuseri}
%\begin{definition}
%\cs{GLSaccessfmtuseri}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriaccessdisplay
  {
    \newcommand*{\GLSaccessfmtuseri}[3]{%
      \glsuseriaccessdisplay
      {%
        \GLSfmtfield{#1}{#2}{#3}{useri}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\GLSaccessfmtuseri}[3]{%
      \GLSfmtfield{#1}{#2}{#3}{useri}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%USER2
%\begin{macro}{\glsaccessuserii}
% Display the \gloskey{user2} value (no link and no check for existence).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriiaccessdisplay
  {
    \newcommand*{\glsaccessuserii}[1]{%
      \glsuseriiaccessdisplay
      {%
        \glsentryuserii{#1}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\glsaccessuserii}[1]{%
      \glsentryuserii{#1}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtuserii}
%\begin{definition}
%\cs{glsaccessfmtuserii}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriiaccessdisplay
  {
    \newcommand*{\glsaccessfmtuserii}[3]{%
      \glsuseriiaccessdisplay
      {%
        \glsfmtfield{#1}{#2}{#3}{userii}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\glsaccessfmtuserii}[3]{%
      \glsfmtfield{#1}{#2}{#3}{userii}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessuserii}
% Display the \gloskey{user2} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriiaccessdisplay
  {
    \newcommand*{\Glsaccessuserii}[1]{%
      \glsuseriiaccessdisplay
      {%
        \Glsentryuserii{#1}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\Glsaccessuserii}[1]{%
      \Glsentryuserii{#1}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtuserii}
%\begin{definition}
%\cs{Glsaccessfmtuserii}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriiaccessdisplay
  {
    \newcommand*{\Glsaccessfmtuserii}[3]{%
      \glsuseriiaccessdisplay
      {%
        \Glsfmtfield{#1}{#2}{#3}{userii}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\Glsaccessfmtuserii}[3]{%
      \Glsfmtfield{#1}{#2}{#3}{userii}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessuserii}
% Display the \gloskey{user2} value (no link and no check for existence)
% converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriiaccessdisplay
  {
    \newcommand*{\GLSaccessuserii}[1]{%
      \glsuseriiaccessdisplay
      {%
        \glsuppercase{\glsentryuserii{#1}}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\GLSaccessuserii}[1]{%
      \glsuppercase{\glsentryuserii{#1}}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtuserii}
%\begin{definition}
%\cs{GLSaccessfmtuserii}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriiaccessdisplay
  {
    \newcommand*{\GLSaccessfmtuserii}[3]{%
      \glsuseriiaccessdisplay
      {%
        \GLSfmtfield{#1}{#2}{#3}{userii}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\GLSaccessfmtuserii}[3]{%
      \GLSfmtfield{#1}{#2}{#3}{userii}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%USER3
%\begin{macro}{\glsaccessuseriii}
% Display the \gloskey{user3} value (no link and no check for existence).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriiiaccessdisplay
  {
    \newcommand*{\glsaccessuseriii}[1]{%
      \glsuseriiiaccessdisplay
      {%
        \glsentryuseriii{#1}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\glsaccessuseriii}[1]{%
      \glsentryuseriii{#1}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtuseriii}
%\begin{definition}
%\cs{glsaccessfmtuseriii}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriiiaccessdisplay
  {
    \newcommand*{\glsaccessfmtuseriii}[3]{%
      \glsuseriiiaccessdisplay
      {%
        \glsfmtfield{#1}{#2}{#3}{useriii}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\glsaccessfmtuseriii}[3]{%
      \glsfmtfield{#1}{#2}{#3}{useriii}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessuseriii}
% Display the \gloskey{user3} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriiiaccessdisplay
  {
    \newcommand*{\Glsaccessuseriii}[1]{%
      \glsuseriiiaccessdisplay
      {%
        \Glsentryuseriii{#1}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\Glsaccessuseriii}[1]{%
      \Glsentryuseriii{#1}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtuseriii}
%\begin{definition}
%\cs{Glsaccessfmtuseriii}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriiiaccessdisplay
  {
    \newcommand*{\Glsaccessfmtuseriii}[3]{%
      \glsuseriiiaccessdisplay
      {%
        \Glsfmtfield{#1}{#2}{#3}{useriii}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\Glsaccessfmtuseriii}[3]{%
      \Glsfmtfield{#1}{#2}{#3}{useriii}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessuseriii}
% Display the \gloskey{user3} value (no link and no check for existence)
% converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriiiaccessdisplay
  {
    \newcommand*{\GLSaccessuseriii}[1]{%
      \glsuseriiiaccessdisplay
      {%
        \glsuppercase{\glsentryuseriii{#1}}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\GLSaccessuseriii}[1]{%
      \glsuppercase{\glsentryuseriii{#1}}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtuseriii}
%\begin{definition}
%\cs{GLSaccessfmtuseriii}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuseriiiaccessdisplay
  {
    \newcommand*{\GLSaccessfmtuseriii}[3]{%
      \glsuseriiiaccessdisplay
      {%
        \GLSfmtfield{#1}{#2}{#3}{useriii}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\GLSaccessfmtuseriii}[3]{%
      \GLSfmtfield{#1}{#2}{#3}{useriii}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%USER4
%\begin{macro}{\glsaccessuseriv}
% Display the \gloskey{user4} value (no link and no check for existence).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuserivaccessdisplay
  {
    \newcommand*{\glsaccessuseriv}[1]{%
      \glsuserivaccessdisplay
      {%
        \glsentryuseriv{#1}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\glsaccessuseriv}[1]{%
      \glsentryuseriv{#1}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtuseriv}
%\begin{definition}
%\cs{glsaccessfmtuseriv}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuserivaccessdisplay
  {
    \newcommand*{\glsaccessfmtuseriv}[3]{%
      \glsuserivaccessdisplay
      {%
        \glsfmtfield{#1}{#2}{#3}{useriv}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\glsaccessfmtuseriv}[3]{%
      \glsfmtfield{#1}{#2}{#3}{useriv}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessuseriv}
% Display the \gloskey{user4} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuserivaccessdisplay
  {
    \newcommand*{\Glsaccessuseriv}[1]{%
      \glsuserivaccessdisplay
      {%
        \Glsentryuseriv{#1}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\Glsaccessuseriv}[1]{%
      \Glsentryuseriv{#1}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtuseriv}
%\begin{definition}
%\cs{Glsaccessfmtuseriv}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuserivaccessdisplay
  {
    \newcommand*{\Glsaccessfmtuseriv}[3]{%
      \glsuserivaccessdisplay
      {%
        \Glsfmtfield{#1}{#2}{#3}{useriv}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\Glsaccessfmtuseriv}[3]{%
      \Glsfmtfield{#1}{#2}{#3}{useriv}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessuseriv}
% Display the \gloskey{user4} value (no link and no check for existence)
% converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuserivaccessdisplay
  {
    \newcommand*{\GLSaccessuseriv}[1]{%
      \glsuserivaccessdisplay
      {%
        \glsuppercase{\glsentryuseriv{#1}}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\GLSaccessuseriv}[1]{%
      \glsuppercase{\glsentryuseriv{#1}}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtuseriv}
%\begin{definition}
%\cs{GLSaccessfmtuseriv}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuserivaccessdisplay
  {
    \newcommand*{\GLSaccessfmtuseriv}[3]{%
      \glsuserivaccessdisplay
      {%
        \GLSfmtfield{#1}{#2}{#3}{useriv}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\GLSaccessfmtuseriv}[3]{%
      \GLSfmtfield{#1}{#2}{#3}{useriv}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%USER5
%\begin{macro}{\glsaccessuserv}
% Display the \gloskey{user5} value (no link and no check for existence).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuservaccessdisplay
  {
    \newcommand*{\glsaccessuserv}[1]{%
      \glsuservaccessdisplay
      {%
        \glsentryuserv{#1}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\glsaccessuserv}[1]{%
      \glsentryuserv{#1}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtuserv}
%\begin{definition}
%\cs{glsaccessfmtuserv}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuservaccessdisplay
  {
    \newcommand*{\glsaccessfmtuserv}[3]{%
      \glsuservaccessdisplay
      {%
        \glsfmtfield{#1}{#2}{#3}{userv}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\glsaccessfmtuserv}[3]{%
      \glsfmtfield{#1}{#2}{#3}{userv}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessuserv}
% Display the \gloskey{user5} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuservaccessdisplay
  {
    \newcommand*{\Glsaccessuserv}[1]{%
      \glsuservaccessdisplay
      {%
        \Glsentryuserv{#1}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\Glsaccessuserv}[1]{%
      \Glsentryuserv{#1}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtuserv}
%\begin{definition}
%\cs{Glsaccessfmtuserv}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuservaccessdisplay
  {
    \newcommand*{\Glsaccessfmtuserv}[3]{%
      \glsuservaccessdisplay
      {%
        \Glsfmtfield{#1}{#2}{#3}{userv}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\Glsaccessfmtuserv}[3]{%
      \Glsfmtfield{#1}{#2}{#3}{userv}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessuserv}
% Display the \gloskey{user5} value (no link and no check for existence)
% converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuservaccessdisplay
  {
    \newcommand*{\GLSaccessuserv}[1]{%
      \glsuservaccessdisplay
      {%
        \glsuppercase{\glsentryuserv{#1}}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\GLSaccessuserv}[1]{%
      \glsuppercase{\glsentryuserv{#1}}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtuserv}
%\begin{definition}
%\cs{GLSaccessfmtuserv}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuservaccessdisplay
  {
    \newcommand*{\GLSaccessfmtuserv}[3]{%
      \glsuservaccessdisplay
      {%
        \GLSfmtfield{#1}{#2}{#3}{userv}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\GLSaccessfmtuserv}[3]{%
      \GLSfmtfield{#1}{#2}{#3}{userv}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%USER6
%\begin{macro}{\glsaccessuservi}
% Display the \gloskey{user6} value (no link and no check for existence).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuserviaccessdisplay
  {
    \newcommand*{\glsaccessuservi}[1]{%
      \glsuserviaccessdisplay
      {%
        \glsentryuservi{#1}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\glsaccessuservi}[1]{%
      \glsentryuservi{#1}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtuservi}
%\begin{definition}
%\cs{glsaccessfmtuservi}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuserviaccessdisplay
  {
    \newcommand*{\glsaccessfmtuservi}[3]{%
      \glsuserviaccessdisplay
      {%
        \glsfmtfield{#1}{#2}{#3}{uservi}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\glsaccessfmtuservi}[3]{%
      \glsfmtfield{#1}{#2}{#3}{uservi}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessuservi}
% Display the \gloskey{user6} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuserviaccessdisplay
  {
    \newcommand*{\Glsaccessuservi}[1]{%
      \glsuserviaccessdisplay
      {%
        \Glsentryuservi{#1}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\Glsaccessuservi}[1]{%
      \Glsentryuservi{#1}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtuservi}
%\begin{definition}
%\cs{Glsaccessfmtuservi}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuserviaccessdisplay
  {
    \newcommand*{\Glsaccessfmtuservi}[3]{%
      \glsuserviaccessdisplay
      {%
        \Glsfmtfield{#1}{#2}{#3}{uservi}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\Glsaccessfmtuservi}[3]{%
      \Glsfmtfield{#1}{#2}{#3}{uservi}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessuservi}
% Display the \gloskey{user6} value (no link and no check for existence)
% converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuserviaccessdisplay
  {
    \newcommand*{\GLSaccessuservi}[1]{%
      \glsuserviaccessdisplay
      {%
        \glsuppercase{\glsentryuservi{#1}}%
      }%
      {#1}%
    }
  }
  {
    \newcommand*{\GLSaccessuservi}[1]{%
      \glsuppercase{\glsentryuservi{#1}}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtuservi}
%\begin{definition}
%\cs{GLSaccessfmtuservi}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \ifdef\glsuserviaccessdisplay
  {
    \newcommand*{\GLSaccessfmtuservi}[3]{%
      \glsuserviaccessdisplay
      {%
        \GLSfmtfield{#1}{#2}{#3}{uservi}%
      }%
      {#3}%
    }
  }
  {
    \newcommand*{\GLSaccessfmtuservi}[3]{%
      \GLSfmtfield{#1}{#2}{#3}{uservi}%
    }
  }
%    \end{macrocode}
%\end{macro}
%
% Keys for accessibility support while pre-parsing in
% \cs{newabbreviation}.
%    \begin{macrocode}
  \define@key{glsxtrabbrv}{access}{%
    \def\@gls@nameaccess{#1}%
  }
%    \end{macrocode}
%
%    \begin{macrocode}
  \define@key{glsxtrabbrv}{textaccess}{%
    \def\@gls@textaccess{#1}%
  }
%    \end{macrocode}
%
%    \begin{macrocode}
  \define@key{glsxtrabbrv}{pluralaccess}{%
    \def\@gls@pluralaccess{#1}%
  }
%    \end{macrocode}
%
%    \begin{macrocode}
  \define@key{glsxtrabbrv}{firstaccess}{%
    \def\@gls@firstaccess{#1}%
  }
%    \end{macrocode}
%
%    \begin{macrocode}
  \define@key{glsxtrabbrv}{firstpluralaccess}{%
    \def\@gls@firstpluralaccess{#1}%
  }
%    \end{macrocode}
%
%    \begin{macrocode}
  \define@key{glsxtrabbrv}{shortaccess}{%
    \def\@gls@shortaccess{#1}%
  }
%    \end{macrocode}
%
%    \begin{macrocode}
  \define@key{glsxtrabbrv}{shortpluralaccess}{%
    \def\@gls@shortaccesspl{#1}%
  }
%    \end{macrocode}
%
%    \begin{macrocode}
  \define@key{glsxtrabbrv}{longaccess}{%
    \def\@gls@longaccess{#1}%
  }
%    \end{macrocode}
%
%\changes{1.49}{2022-10-14}{corrected name of longpluralaccess field}
%    \begin{macrocode}
  \define@key{glsxtrabbrv}{longpluralaccess}{%
    \def\@gls@longaccesspl{#1}%
  }
%    \end{macrocode}
%\begin{macro}{\@gls@initaccesskeys}
%\changes{1.31}{2018-05-09}{new}
%    \begin{macrocode}
  \newcommand*{\@gls@initaccesskeys}{%
    \def\@gls@nameaccess{}%
    \def\@gls@textaccess{}%
    \def\@gls@pluralaccess{}%
    \def\@gls@firstaccess{}%
    \def\@gls@firstpluralaccess{}%
    \def\@gls@shortaccess{}%
    \def\@gls@shortaccesspl{}%
    \def\@gls@longaccess{}%
    \def\@gls@longaccesspl{}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@ifaccessattribute@set}
%\begin{definition}
%\cs{\@gls@ifaccessattribute@set}\marg{attribute}\marg{true}\marg{false}
%\end{definition}
%\changes{1.31}{2018-05-09}{new}
%    \begin{macrocode}
  \newcommand*{\@gls@ifaccessattribute@set}[3]{%
    \glsifcategoryattribute{\glscategorylabel}{access#1}{true}%
    {#2}%
    {%
      \glsifcategoryattribute{\glscategorylabel}{access#1}{false}%
      {#3}%
      {%
        \glsifcategoryattribute{\glscategorylabel}{#1}{true}%
        {#2}%
        {#3}%
      }%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%As from \sty{glossaries} v4.45, the replacement text support has
%been corrected so that the accessibility support for abbreviations
%use the \qt{E} (expanded value) element. This should actually
%contain the long form since it's supposed to explain the
%abbreviation. This is a bit redundant on first use for styles like
%\abbrstyle{long-short}.
%
%\begin{macro}{\glsdefaultshortaccess}
%\changes{1.42}{2020-02-03}{new}
%\changes{1.49}{2022-10-14}{reverted to original definition}
%\begin{definition}
%\cs{glsdefaultshortaccess}\marg{long}\marg{short}
%\end{definition}
%This command was only introduced to \sty{glossaries-accsupp} 4.45
%so it may not be defined. This was defined to do \verb|#1 (#2)| but
%the original definition is more appropriate, so has been reverted
%back to the definition provided by \sty{glossaries-accsupp}.
%    \begin{macrocode}
  \providecommand*{\glsdefaultshortaccess}[2]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrassignactualsetup}
%\changes{1.42}{2020-02-03}{new}
%\changes{1.49}{2022-10-14}{added \cs{glstextup}}
%    \begin{macrocode}
  \newcommand{\glsxtrassignactualsetup}{%
   \let\@\empty
   \let\emph\@firstofone
   \let\textbf\@firstofone
   \let\textmd\@firstofone
   \let\textit\@firstofone
   \let\textsl\@firstofone
   \let\textsc\@firstofone
   \let\textrm\@firstofone
   \let\textsf\@firstofone
   \let\texttt\@firstofone
   \let\glstextup\@firstofone
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@assign@actual}
%\changes{1.42}{2020-02-03}{new}
%\changes{1.49}{2022-10-14}{removed use of \cs{pdfstringdef}}
%    \begin{macrocode}
  \newcommand{\@gls@assign@actual}{%
   \begingroup
    \glsxtrassignactualsetup
    \protected@edef\@gls@tmp{\endgroup
      \def\noexpand\@gls@actualshort{\glsxtrorgshort}%
      \def\noexpand\@gls@actuallong{\glsxtrorglong}%
      \def\noexpand\@gls@actualshortpl{\@gls@shortpl}%
      \def\noexpand\@gls@actuallongpl{\@gls@longpl}%
    }%
    \@gls@tmp
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@gls@setup@default@short@access}
%\changes{1.31}{2018-05-09}{new}
%\changes{1.42}{2020-02-03}{renamed to \cs{@gls@setup@default@access}}
%Renamed \cs{@gls@setup@default@access} and removed argument since
%it can be obtained from \cs{glsxtrorgshort}.
%\end{macro}
%\begin{macro}{\@gls@setup@default@access}
%\changes{1.42}{2020-02-03}{added \cs{glsdefaultshortaccess}}
%Assign the default value of the \gloskey{shortaccess} key. The
%argument is the short value passed to \cs{newabbreviation}.
%The \gloskey{shortaccess} value should explain the abbreviation.
%    \begin{macrocode}
  \newcommand{\@gls@setup@default@access}{%
    \@gls@assign@actual
    \ifdefempty\@gls@shortaccess
    {%
%    \end{macrocode}
%Check if the \catattr{accessinsertdots} attribute has been set but
%only if \gloskey{shortaccess} hasn't been set.
%    \begin{macrocode}
      \@gls@ifaccessattribute@set{insertdots}%
      {%
        \expandafter\@glsxtr@insertdots\expandafter\@gls@actualshort\expandafter
         {\@gls@actualshort}%
      }%
      {}%
      \ifdefempty\@gls@longaccess
      {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
        \protected@edef\@gls@shortaccess{\glsdefaultshortaccess
          {\expandonce\@gls@actuallong}{\expandonce\@gls@actualshort}}%
      }%
      {%
        \protected@edef\@gls@shortaccess{\glsdefaultshortaccess
          {\expandonce\@gls@longaccess}{\expandonce\@gls@actualshort}}%
      }%
      \eappto\ExtraCustomAbbreviationFields{shortaccess={\@gls@shortaccess},}%
%    \end{macrocode}
%If \gloskey{shortaccessplural} hasn't been set, assign plural form.
%    \begin{macrocode}
      \ifdefempty\@gls@shortaccesspl
      {%
        \@gls@ifaccessattribute@set{aposplural}%
        {%
          \expandafter\def\expandafter\@gls@shortaccesspl\expandafter{%
            \@gls@actualshort'\glsxtrabbrvpluralsuffix}%
        }%
        {%
          \@gls@ifaccessattribute@set{noshortplural}%
          {%
             \let\@gls@shortaccesspl\@gls@shortaccess
          }%
          {%
            \let\@gls@shortaccesspl\@gls@actualshortpl
          }%
        }%
      \ifdefempty\@gls@longaccesspl
      {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
        \protected@edef\@gls@shortaccesspl{\glsdefaultshortaccess
          {\expandonce\@gls@actuallongpl}{\expandonce\@gls@actualshortpl}}%
      }%
      {%
        \protected@edef\@gls@shortaccesspl{\glsdefaultshortaccess
          {\expandonce\@gls@longaccesspl}{\expandonce\@gls@actualshort}}%
      }%
      \eappto\ExtraCustomAbbreviationFields{shortpluralaccess={\@gls@shortaccesspl},}%
      }%
      {}%
    }%
    {%
      \ifdefempty\@gls@shortaccesspl
      {\let\@gls@shortaccesspl\@gls@shortaccess}%
      {}%
    }%
%    \end{macrocode}
%If \gloskey{access} key hasn't been set, check if the 
%\catattr{nameshortaccess} attribute has been set.
%    \begin{macrocode}
    \ifdefempty\@gls@nameaccess
    {%
      \glsifcategoryattribute{\glscategorylabel}{nameshortaccess}{true}%
      {%
        \eappto\ExtraCustomAbbreviationFields{access={\@gls@shortaccess},}%
      }%
      {}%
    }%
    {}%
%    \end{macrocode}
%If \gloskey{textaccess} key hasn't been set, check if the 
%\catattr{textshortaccess} attribute has been set.
%    \begin{macrocode}
    \ifdefempty\@gls@textaccess
    {%
      \glsifcategoryattribute{\glscategorylabel}{textshortaccess}{true}%
      {%
        \eappto\ExtraCustomAbbreviationFields{textaccess={\@gls@shortaccess},}%
      }%
      {}%
    }%
    {}%
    \ifdefempty\@gls@pluralaccess
    {%
      \glsifcategoryattribute{\glscategorylabel}{textshortaccess}{true}%
      {%
        \eappto\ExtraCustomAbbreviationFields{%
           pluralaccess={\@gls@shortaccesspl},%
        }%
      }%
      {}%
    }%
    {}%
%    \end{macrocode}
%If \gloskey{firstaccess} key hasn't been set, check if the 
%\catattr{firstshortaccess} attribute has been set.
%    \begin{macrocode}
    \ifdefempty\@gls@firstaccess
    {%
      \glsifcategoryattribute{\glscategorylabel}{firstshortaccess}{true}%
      {%
        \eappto\ExtraCustomAbbreviationFields{firstaccess={\@gls@shortaccess},}%
      }%
      {}%
    }%
    {}%
    \ifdefempty\@gls@firstpluralaccess
    {%
      \glsifcategoryattribute{\glscategorylabel}{firstshortaccess}{true}%
      {%
        \eappto\ExtraCustomAbbreviationFields{%
           firstpluralaccess={\@gls@shortaccesspl},%
        }%
      }%
      {}%
    }%
    {}%
  }
%    \end{macrocode}
%\end{macro}
%
% Provide hooks for \cs{setabbreviationstyle} that automatically set
% the attributes appropriate for the style.
% If the name is just the short form and the
% description contains the long form, then it may not be necessary
% to set \catattr{nameshortaccess} but it would depend on the glossary style.
%
% Need to provide \cs{glsxtr\meta{category}\meta{field}accsupp} if
% not already defined.
%\begin{macro}{\glsxtrprovideaccsuppcmd}
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
  \newcommand*{\glsxtrprovideaccsuppcmd}[2]{%
    \ifcsundef{glsxtr#1#2accsupp}%
    {\csdef{glsxtr#1#2accsupp}{\glsshortaccsupp}}%
    {}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrAccSuppAbbrSetNoLongAttrs}
%\changes{1.42}{2020-02-03}{new}
%For styles where the name, first and text are just the
%abbreviation.
%    \begin{macrocode}
  \newcommand*{\glsxtrAccSuppAbbrSetNoLongAttrs}[1]{%
   \glssetcategoryattribute{#1}{nameshortaccess}{true}%
   \glssetcategoryattribute{#1}{firstshortaccess}{true}%
   \glssetcategoryattribute{#1}{textshortaccess}{true}%
   \glsxtrprovideaccsuppcmd{#1}{name}%
   \glsxtrprovideaccsuppcmd{#1}{first}%
   \glsxtrprovideaccsuppcmd{#1}{firstpl}%
   \glsxtrprovideaccsuppcmd{#1}{text}%
   \glsxtrprovideaccsuppcmd{#1}{plural}%
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrAccSuppAbbrSetFirstLongAttrs}
%\changes{1.42}{2020-02-03}{new}
%For styles where the name and text are just the
%abbreviation. The first form may just be long or may be short and
%long.
%    \begin{macrocode}
  \newcommand*{\glsxtrAccSuppAbbrSetFirstLongAttrs}[1]{%
   \glssetcategoryattribute{#1}{nameshortaccess}{true}%
   \glssetcategoryattribute{#1}{textshortaccess}{true}%
   \glsxtrprovideaccsuppcmd{#1}{name}%
   \glsxtrprovideaccsuppcmd{#1}{text}%
   \glsxtrprovideaccsuppcmd{#1}{plural}%
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrAccSuppAbbrSetTextShortAttrs}
%\changes{1.42}{2020-02-03}{new}
%For styles where only the text is just the abbreviation. The name 
%and first form may just be long or may be short and
%long. The name may also be short but followed by the long form in
%the description.
%    \begin{macrocode}
  \newcommand*{\glsxtrAccSuppAbbrSetTextShortAttrs}[1]{%
   \glssetcategoryattribute{#1}{textshortaccess}{true}%
   \glsxtrprovideaccsuppcmd{#1}{text}%
   \glsxtrprovideaccsuppcmd{#1}{plural}%
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrAccSuppAbbrSetNameShortAttrs}
%\changes{1.42}{2020-02-03}{new}
%For styles where only the name is just the abbreviation. The
%first and subsequent form may just be long or may be short and
%long.
%    \begin{macrocode}
  \newcommand*{\glsxtrAccSuppAbbrSetNameShortAttrs}[1]{%
   \glssetcategoryattribute{#1}{nameshortaccess}{true}%
   \glsxtrprovideaccsuppcmd{#1}{name}%
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrAccSuppAbbrSetNameLongAttrs}
%\changes{1.42}{2020-02-03}{new}
%For styles where the first and text are just the
%abbreviation. The name may just be long or may be short and
%long or the name may be short.
%    \begin{macrocode}
  \newcommand*{\glsxtrAccSuppAbbrSetNameLongAttrs}[1]{%
   \glssetcategoryattribute{#1}{firstshortaccess}{true}%
   \glssetcategoryattribute{#1}{textshortaccess}{true}%
   \glsxtrprovideaccsuppcmd{#1}{first}%
   \glsxtrprovideaccsuppcmd{#1}{firstpl}%
   \glsxtrprovideaccsuppcmd{#1}{text}%
   \glsxtrprovideaccsuppcmd{#1}{plural}%
  }
%    \end{macrocode}
%\end{macro}
% End of if accsupp part
%    \begin{macrocode}
}
{
%    \end{macrocode}
% No accessibility support. Just define these commands to do 
% \cs{glsentry}\meta{xxx}
%\begin{macro}{\glsaccessname}
% Display the \gloskey{name} value (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\glsaccessname}[1]{\glsentryname{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtname}
%\begin{definition}
%\cs{glsaccessfmtname}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtname}[3]{%
    \glsfmtfield{#1}{#2}{#3}{name}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessname}
% Display the \gloskey{name} value (no link and no check for existence)
% with the first letter converted to upper case.
%    \begin{macrocode}
  \newcommand*{\Glsaccessname}[1]{\Glsentryname{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtname}
%\begin{definition}
%\cs{Glsaccessfmtname}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtname}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{name}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessname}
% Display the \gloskey{name} value (no link and no check for existence).
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessname}[1]{%
   \protect\glsuppercase{\glsentryname{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtname}
%\begin{definition}
%\cs{GLSaccessfmtname}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtname}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{name}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccesstext}
% Display the \gloskey{text} value (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\glsaccesstext}[1]{\glsentrytext{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmttext}
%\begin{definition}
%\cs{glsaccessfmttext}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmttext}[3]{%
    \glsfmtfield{#1}{#2}{#3}{text}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccesstext}
% Display the \gloskey{text} value (no link and no check for existence)
% with the first letter converted to upper case.
%    \begin{macrocode}
  \newcommand*{\Glsaccesstext}[1]{\Glsentrytext{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmttext}
%\begin{definition}
%\cs{Glsaccessfmttext}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmttext}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{text}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccesstext}
% Display the \gloskey{text} value (no link and no check for existence).
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccesstext}[1]{%
   \protect\glsuppercase{\glsentrytext{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmttext}
%\begin{definition}
%\cs{GLSaccessfmttext}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmttext}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{text}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessplural}
% Display the \gloskey{plural} value (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\glsaccessplural}[1]{\glsentryplural{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtplural}
%\begin{definition}
%\cs{glsaccessfmtplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtplural}[3]{%
    \glsfmtfield{#1}{#2}{#3}{plural}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessplural}
% Display the \gloskey{plural} value (no link and no check for existence)
% with the first letter converted to upper case.
%    \begin{macrocode}
  \newcommand*{\Glsaccessplural}[1]{\Glsentryplural{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtplural}
%\begin{definition}
%\cs{Glsaccessfmtplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtplural}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{plural}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessplural}
% Display the \gloskey{plural} value (no link and no check for existence).
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessplural}[1]{%
   \protect\glsuppercase{\glsentryplural{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtplural}
%\begin{definition}
%\cs{GLSaccessfmtplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtplural}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{plural}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfirst}
% Display the \gloskey{first} value (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\glsaccessfirst}[1]{\glsentryfirst{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtfirst}
%\begin{definition}
%\cs{glsaccessfmtfirst}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtfirst}[3]{%
    \glsfmtfield{#1}{#2}{#3}{first}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfirst}
% Display the \gloskey{first} value (no link and no check for existence)
% with the first letter converted to upper case.
%    \begin{macrocode}
  \newcommand*{\Glsaccessfirst}[1]{\Glsentryfirst{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtfirst}
%\begin{definition}
%\cs{Glsaccessfmtfirst}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtfirst}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{first}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfirst}
% Display the \gloskey{first} value (no link and no check for existence).
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfirst}[1]{%
   \protect\glsuppercase{\glsentryfirst{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtfirst}
%\begin{definition}
%\cs{GLSaccessfmtfirst}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtfirst}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{first}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfirstplural}
% Display the \gloskey{firstplural} value (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\glsaccessfirstplural}[1]{\glsentryfirstplural{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtfirstplural}
%\begin{definition}
%\cs{glsaccessfmtfirstplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtfirstplural}[3]{%
    \glsfmtfield{#1}{#2}{#3}{firstpl}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfirstplural}
% Display the \gloskey{firstplural} value (no link and no check for existence)
% with the first letter converted to upper case.
%    \begin{macrocode}
  \newcommand*{\Glsaccessfirstplural}[1]{\Glsentryfirstplural{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtfirstplural}
%\begin{definition}
%\cs{Glsaccessfmtfirstplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtfirstplural}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{firstpl}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfirstplural}
% Display the \gloskey{firstplural} value (no link and no check for existence).
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfirstplural}[1]{%
   \protect\glsuppercase{\glsentryfirstplural{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtfirstplural}
%\begin{definition}
%\cs{GLSaccessfmtfirstplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtfirstplural}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{firstpl}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccesssymbol}
% Display the \gloskey{symbol} value (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\glsaccesssymbol}[1]{\glsentrysymbol{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtsymbol}
%\begin{definition}
%\cs{glsaccessfmtsymbol}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtsymbol}[3]{%
    \glsfmtfield{#1}{#2}{#3}{symbol}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccesssymbol}
% Display the \gloskey{symbol} value (no link and no check for existence)
% with the first letter converted to upper case.
%    \begin{macrocode}
  \newcommand*{\Glsaccesssymbol}[1]{\Glsentrysymbol{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtsymbol}
%\begin{definition}
%\cs{Glsaccessfmtsymbol}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtsymbol}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{symbol}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccesssymbol}
% Display the \gloskey{symbol} value (no link and no check for existence).
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccesssymbol}[1]{%
   \protect\glsuppercase{\glsentrysymbol{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtsymbol}
%\begin{definition}
%\cs{GLSaccessfmtsymbol}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtsymbol}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{symbol}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccesssymbolplural}
% Display the \gloskey{symbolplural} value (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\glsaccesssymbolplural}[1]{\glsentrysymbolplural{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtsymbolplural}
%\begin{definition}
%\cs{glsaccessfmtsymbolplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtsymbolplural}[3]{%
    \glsfmtfield{#1}{#2}{#3}{symbolplural}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccesssymbolplural}
% Display the \gloskey{symbolplural} value (no link and no check for existence)
% with the first letter converted to upper case.
%    \begin{macrocode}
  \newcommand*{\Glsaccesssymbolplural}[1]{\Glsentrysymbolplural{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtsymbolplural}
%\begin{definition}
%\cs{Glsaccessfmtsymbolplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtsymbolplural}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{symbolplural}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccesssymbolplural}
% Display the \gloskey{symbolplural} value (no link and no check for existence).
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccesssymbolplural}[1]{%
   \protect\glsuppercase{\glsentrysymbolplural{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtsymbolplural}
%\begin{definition}
%\cs{GLSaccessfmtsymbolplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtsymbolplural}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{symbolplural}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessdesc}
% Display the \gloskey{desc} value (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\glsaccessdesc}[1]{\glsentrydesc{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtdesc}
%\begin{definition}
%\cs{glsaccessfmtdesc}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtdesc}[3]{%
    \glsfmtfield{#1}{#2}{#3}{desc}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessdesc}
% Display the \gloskey{desc} value (no link and no check for existence)
% with the first letter converted to upper case.
%    \begin{macrocode}
  \newcommand*{\Glsaccessdesc}[1]{\Glsentrydesc{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtdesc}
%\begin{definition}
%\cs{Glsaccessfmtdesc}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtdesc}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{desc}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessdesc}
% Display the \gloskey{desc} value (no link and no check for existence).
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessdesc}[1]{%
   \protect\glsuppercase{\glsentrydesc{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtdesc}
%\begin{definition}
%\cs{GLSaccessfmtdesc}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtdesc}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{desc}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessdescplural}
% Display the \gloskey{descplural} value (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\glsaccessdescplural}[1]{\glsentrydescplural{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtdescplural}
%\begin{definition}
%\cs{glsaccessfmtdescplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtdescplural}[3]{%
    \glsfmtfield{#1}{#2}{#3}{descplural}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessdescplural}
% Display the \gloskey{descplural} value (no link and no check for existence)
% with the first letter converted to upper case.
%    \begin{macrocode}
  \newcommand*{\Glsaccessdescplural}[1]{\Glsentrydescplural{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtdescplural}
%\begin{definition}
%\cs{Glsaccessfmtdescplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtdescplural}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{descplural}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessdescplural}
% Display the \gloskey{descplural} value (no link and no check for existence).
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessdescplural}[1]{%
   \protect\glsuppercase{\glsentrydescplural{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtdescplural}
%\begin{definition}
%\cs{GLSaccessfmtdescplural}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtdescplural}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{descplural}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessshort}
% Display the short form (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\glsaccessshort}[1]{\glsentryshort{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtshort}
%\begin{definition}
%\cs{glsaccessfmtshort}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtshort}[3]{%
    \glsfmtfield{#1}{#2}{#3}{short}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessshort}
% Display the short form with first letter converted to uppercase
% (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\Glsaccessshort}[1]{\Glsentryshort{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtshort}
%\begin{definition}
%\cs{Glsaccessfmtshort}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtshort}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{short}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessshort}
% Display the \gloskey{short} value (no link and no check for existence).
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessshort}[1]{%
   \protect\glsuppercase{\glsentryshort{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtshort}
%\begin{definition}
%\cs{GLSaccessfmtshort}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtshort}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{short}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessshortpl}
% Display the short plural form (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\glsaccessshortpl}[1]{\glsentryshortpl{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtshortpl}
%\begin{definition}
%\cs{glsaccessfmtshortpl}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtshortpl}[3]{%
    \glsfmtfield{#1}{#2}{#3}{shortpl}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessshortpl}
% Display the short plural form with first letter converted to
% uppercase (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\Glsaccessshortpl}[1]{\Glsentryshortpl{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtshortpl}
%\begin{definition}
%\cs{Glsaccessfmtshortpl}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtshortpl}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{shortpl}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessshortpl}
% Display the \gloskey{shortplural} value (no link and no check for existence).
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessshortpl}[1]{%
   \protect\glsuppercase{\glsentryshortpl{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtshortpl}
%\begin{definition}
%\cs{GLSaccessfmtshortpl}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtshortpl}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{shortpl}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccesslong}
% Display the long form (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\glsaccesslong}[1]{\glsentrylong{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtlong}
%\begin{definition}
%\cs{glsaccessfmtlong}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtlong}[3]{%
    \glsfmtfield{#1}{#2}{#3}{long}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccesslong}
% Display the long form (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\Glsaccesslong}[1]{\Glsentrylong{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtlong}
%\begin{definition}
%\cs{Glsaccessfmtlong}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtlong}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{long}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccesslong}
% Display the \gloskey{long} value (no link and no check for existence).
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccesslong}[1]{%
   \protect\glsuppercase{\glsentrylong{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtlong}
%\begin{definition}
%\cs{GLSaccessfmtlong}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtlong}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{long}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccesslongpl}
% Display the long plural form (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\glsaccesslongpl}[1]{\glsentrylongpl{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtlongpl}
%\begin{definition}
%\cs{glsaccessfmtlongpl}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtlongpl}[3]{%
    \glsfmtfield{#1}{#2}{#3}{longpl}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccesslongpl}
% Display the long plural form (no link and no check for existence).
%    \begin{macrocode}
  \newcommand*{\Glsaccesslongpl}[1]{\Glsentrylongpl{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtlongpl}
%\begin{definition}
%\cs{Glsaccessfmtlongpl}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtlongpl}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{longpl}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccesslongpl}
% Display the \gloskey{longplural} value (no link and no check for existence).
% converted to upper case.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccesslongpl}[1]{%
   \protect\glsuppercase{\glsentrylongpl{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtlongpl}
%\begin{definition}
%\cs{GLSaccessfmtlongpl}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtlongpl}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{longpl}%
  }
%    \end{macrocode}
%\end{macro}
%
%USER1
%\begin{macro}{\glsaccessuseri}
% Display the \gloskey{user1} value (no link and no check for existence).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessuseri}[1]{\glsentryuseri{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtuseri}
%\begin{definition}
%\cs{glsaccessfmtuseri}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtuseri}[3]{%
    \glsfmtfield{#1}{#2}{#3}{useri}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessuseri}
% Display the \gloskey{user1} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessuseri}[1]{\Glsentryuseri{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtuseri}
%\begin{definition}
%\cs{Glsaccessfmtuseri}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtuseri}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{useri}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessuseri}
% Display the \gloskey{user1} value (no link and no check for existence).
% converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessuseri}[1]{%
   \protect\glsuppercase{\glsentryuseri{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtuseri}
%\begin{definition}
%\cs{GLSaccessfmtuseri}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtuseri}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{useri}%
  }
%    \end{macrocode}
%\end{macro}
%
%USER2
%\begin{macro}{\glsaccessuserii}
% Display the \gloskey{user2} value (no link and no check for existence).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessuserii}[1]{\glsentryuserii{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtuserii}
%\begin{definition}
%\cs{glsaccessfmtuserii}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtuserii}[3]{%
    \glsfmtfield{#1}{#2}{#3}{userii}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessuserii}
% Display the \gloskey{user2} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessuserii}[1]{\Glsentryuserii{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtuserii}
%\begin{definition}
%\cs{Glsaccessfmtuserii}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtuserii}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{userii}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessuserii}
% Display the \gloskey{user2} value (no link and no check for existence).
% converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessuserii}[1]{%
   \protect\glsuppercase{\glsentryuserii{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtuserii}
%\begin{definition}
%\cs{GLSaccessfmtuserii}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtuserii}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{userii}%
  }
%    \end{macrocode}
%\end{macro}
%
%USER3
%\begin{macro}{\glsaccessuseriii}
% Display the \gloskey{user3} value (no link and no check for existence).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessuseriii}[1]{\glsentryuseriii{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtuseriii}
%\begin{definition}
%\cs{glsaccessfmtuseriii}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtuseriii}[3]{%
    \glsfmtfield{#1}{#2}{#3}{useriii}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessuseriii}
% Display the \gloskey{user3} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessuseriii}[1]{\Glsentryuseriii{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtuseriii}
%\begin{definition}
%\cs{Glsaccessfmtuseriii}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtuseriii}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{useriii}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessuseriii}
% Display the \gloskey{user3} value (no link and no check for existence).
% converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessuseriii}[1]{%
   \protect\glsuppercase{\glsentryuseriii{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtuseriii}
%\begin{definition}
%\cs{GLSaccessfmtuseriii}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtuseriii}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{useriii}%
  }
%    \end{macrocode}
%\end{macro}
%
%USER4
%\begin{macro}{\glsaccessuseriv}
% Display the \gloskey{user4} value (no link and no check for existence).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessuseriv}[1]{\glsentryuseriv{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtuseriv}
%\begin{definition}
%\cs{glsaccessfmtuseriv}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtuseriv}[3]{%
    \glsfmtfield{#1}{#2}{#3}{useriv}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessuseriv}
% Display the \gloskey{user4} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessuseriv}[1]{\Glsentryuseriv{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtuseriv}
%\begin{definition}
%\cs{Glsaccessfmtuseriv}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtuseriv}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{useriv}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessuseriv}
% Display the \gloskey{user4} value (no link and no check for existence).
% converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessuseriv}[1]{%
   \protect\glsuppercase{\glsentryuseriv{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtuseriv}
%\begin{definition}
%\cs{GLSaccessfmtuseriv}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtuseriv}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{useriv}%
  }
%    \end{macrocode}
%\end{macro}
%
%USER5
%\begin{macro}{\glsaccessuserv}
% Display the \gloskey{user5} value (no link and no check for existence).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessuserv}[1]{\glsentryuserv{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtuserv}
%\begin{definition}
%\cs{glsaccessfmtuserv}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtuserv}[3]{%
    \glsfmtfield{#1}{#2}{#3}{userv}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessuserv}
% Display the \gloskey{user5} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessuserv}[1]{\Glsentryuserv{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtuserv}
%\begin{definition}
%\cs{Glsaccessfmtuserv}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtuserv}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{userv}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessuserv}
% Display the \gloskey{user5} value (no link and no check for existence).
% converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessuserv}[1]{%
   \protect\glsuppercase{\glsentryuserv{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtuserv}
%\begin{definition}
%\cs{GLSaccessfmtuserv}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtuserv}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{userv}%
  }
%    \end{macrocode}
%\end{macro}
%
%USER6
%\begin{macro}{\glsaccessuservi}
% Display the \gloskey{user6} value (no link and no check for existence).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessuservi}[1]{\glsentryuservi{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsaccessfmtuservi}
%\begin{definition}
%\cs{glsaccessfmtuservi}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsaccessfmtuservi}[3]{%
    \glsfmtfield{#1}{#2}{#3}{uservi}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessuservi}
% Display the \gloskey{user6} value (no link and no check for existence)
% with the first letter converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessuservi}[1]{\Glsentryuservi{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsaccessfmtuservi}
%\begin{definition}
%\cs{Glsaccessfmtuservi}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\Glsaccessfmtuservi}[3]{%
    \Glsfmtfield{#1}{#2}{#3}{uservi}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessuservi}
% Display the \gloskey{user6} value (no link and no check for existence).
% converted to upper case.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessuservi}[1]{%
   \protect\glsuppercase{\glsentryuservi{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSaccessfmtuservi}
%\begin{definition}
%\cs{GLSaccessfmtuservi}\marg{insert}\marg{cs}\marg{label}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\GLSaccessfmtuservi}[3]{%
    \GLSfmtfield{#1}{#2}{#3}{uservi}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@initaccesskeys}
%\changes{1.31}{2018-05-09}{new}
%This does nothing if there's no accessibility support.
%    \begin{macrocode}
  \newcommand*{\@gls@initaccesskeys}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@setup@default@access}
%This does nothing if there's no accessibility support.
%    \begin{macrocode}
  \newcommand{\@gls@setup@default@access}{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrAccSuppAbbrSetNoLongAttrs}
%\changes{1.42}{2020-02-03}{new}
%This does nothing if there's no accessibility support.
%    \begin{macrocode}
  \newcommand*{\glsxtrAccSuppAbbrSetNoLongAttrs}[1]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrAccSuppAbbrSetFirstLongAttrs}
%\changes{1.42}{2020-02-03}{new}
%This does nothing if there's no accessibility support.
%    \begin{macrocode}
  \newcommand*{\glsxtrAccSuppAbbrSetFirstLongAttrs}[1]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrAccSuppAbbrSetTextShortAttrs}
%\changes{1.42}{2020-02-03}{new}
%This does nothing if there's no accessibility support.
%    \begin{macrocode}
  \newcommand*{\glsxtrAccSuppAbbrSetTextShortAttrs}[1]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrAccSuppAbbrSetNameShortAttrs}
%\changes{1.42}{2020-02-03}{new}
%This does nothing if there's no accessibility support.
%    \begin{macrocode}
  \newcommand*{\glsxtrAccSuppAbbrSetNameShortAttrs}[1]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrAccSuppAbbrSetNameLongAttrs}
%\changes{1.42}{2020-02-03}{new}
%This does nothing if there's no accessibility support.
%    \begin{macrocode}
  \newcommand*{\glsxtrAccSuppAbbrSetNameLongAttrs}[1]{}
%    \end{macrocode}
% End of else part
%    \begin{macrocode}
}
%    \end{macrocode}
%\end{macro}
%Identify sentence-case mappings:
%    \begin{macrocode}
\glsmfuaddmap{\glsaccessname}{\Glsaccessname}
\glsmfuaddmap{\glsaccessfmtname}{\Glsaccessfmtname}
\glsmfublocker{\GLSaccessname}
\glsmfublocker{\GLSaccessfmtname}
\glsmfuaddmap{\glsaccesstext}{\Glsaccesstext}
\glsmfuaddmap{\glsaccessfmttext}{\Glsaccessfmttext}
\glsmfublocker{\GLSaccesstext}
\glsmfublocker{\GLSaccessfmttext}
\glsmfuaddmap{\glsaccessplural}{\Glsaccessplural}
\glsmfuaddmap{\glsaccessfmtplural}{\Glsaccessfmtplural}
\glsmfublocker{\GLSaccessplural}
\glsmfublocker{\GLSaccessfmtplural}
\glsmfuaddmap{\glsaccessfirst}{\Glsaccessfirst}
\glsmfuaddmap{\glsaccessfmtfirst}{\Glsaccessfmtfirst}
\glsmfublocker{\GLSaccessfirst}
\glsmfublocker{\GLSaccessfmtfirst}
\glsmfuaddmap{\glsaccessfirstplural}{\Glsaccessfirstplural}
\glsmfuaddmap{\glsaccessfmtfirstplural}{\Glsaccessfmtfirstplural}
\glsmfublocker{\GLSaccessfirstplural}
\glsmfublocker{\GLSaccessfmtfirstplural}
\glsmfuaddmap{\glsaccesssymbol}{\Glsaccesssymbol}
\glsmfuaddmap{\glsaccessfmtsymbol}{\Glsaccessfmtsymbol}
\glsmfublocker{\GLSaccesssymbol}
\glsmfublocker{\GLSaccessfmtsymbol}
\glsmfuaddmap{\glsaccesssymbolplural}{\Glsaccesssymbolplural}
\glsmfuaddmap{\glsaccessfmtsymbolplural}{\Glsaccessfmtsymbolplural}
\glsmfublocker{\GLSaccesssymbolplural}
\glsmfublocker{\GLSaccessfmtsymbolplural}
\glsmfuaddmap{\glsaccessdesc}{\Glsaccessdesc}
\glsmfuaddmap{\glsaccessfmtdesc}{\Glsaccessfmtdesc}
\glsmfublocker{\GLSaccessdesc}
\glsmfublocker{\GLSaccessfmtdesc}
\glsmfuaddmap{\glsaccessdescplural}{\Glsaccessdescplural}
\glsmfuaddmap{\glsaccessfmtdescplural}{\Glsaccessfmtdescplural}
\glsmfublocker{\GLSaccessdescplural}
\glsmfublocker{\GLSaccessfmtdescplural}
\glsmfuaddmap{\glsaccessshort}{\Glsaccessshort}
\glsmfuaddmap{\glsaccessfmtshort}{\Glsaccessfmtshort}
\glsmfublocker{\GLSaccessshort}
\glsmfublocker{\GLSaccessfmtshort}
\glsmfuaddmap{\glsaccessshortpl}{\Glsaccessshortpl}
\glsmfuaddmap{\glsaccessfmtshortpl}{\Glsaccessfmtshortpl}
\glsmfublocker{\GLSaccessshortpl}
\glsmfublocker{\GLSaccessfmtshortpl}
\glsmfuaddmap{\glsaccesslong}{\Glsaccesslong}
\glsmfuaddmap{\glsaccessfmtlong}{\Glsaccessfmtlong}
\glsmfublocker{\GLSaccesslong}
\glsmfublocker{\GLSaccessfmtlong}
\glsmfuaddmap{\glsaccesslongpl}{\Glsaccesslongpl}
\glsmfuaddmap{\glsaccessfmtlongpl}{\Glsaccessfmtlongpl}
\glsmfublocker{\GLSaccesslongpl}
\glsmfublocker{\GLSaccessfmtlongpl}
\glsmfuaddmap{\glsaccessuseri}{\Glsaccessuseri}
\glsmfuaddmap{\glsaccessfmtuseri}{\Glsaccessfmtuseri}
\glsmfublocker{\GLSaccessuseri}
\glsmfublocker{\GLSaccessfmtuseri}
\glsmfuaddmap{\glsaccessuserii}{\Glsaccessuserii}
\glsmfuaddmap{\glsaccessfmtuserii}{\Glsaccessfmtuserii}
\glsmfublocker{\GLSaccessuserii}
\glsmfublocker{\GLSaccessfmtuserii}
\glsmfuaddmap{\glsaccessuseriii}{\Glsaccessuseriii}
\glsmfuaddmap{\glsaccessfmtuseriii}{\Glsaccessfmtuseriii}
\glsmfublocker{\GLSaccessuseriii}
\glsmfublocker{\GLSaccessfmtuseriii}
\glsmfuaddmap{\glsaccessuseriv}{\Glsaccessuseriv}
\glsmfuaddmap{\glsaccessfmtuseriv}{\Glsaccessfmtuseriv}
\glsmfublocker{\GLSaccessuseriv}
\glsmfublocker{\GLSaccessfmtuseriv}
\glsmfuaddmap{\glsaccessuserv}{\Glsaccessuserv}
\glsmfuaddmap{\glsaccessfmtuserv}{\Glsaccessfmtuserv}
\glsmfublocker{\GLSaccessuserv}
\glsmfublocker{\GLSaccessfmtuserv}
\glsmfuaddmap{\glsaccessuservi}{\Glsaccessuservi}
\glsmfuaddmap{\glsaccessfmtuservi}{\Glsaccessfmtuservi}
\glsmfublocker{\GLSaccessuservi}
\glsmfublocker{\GLSaccessfmtuservi}
%    \end{macrocode}
%
%\subsection{Categories}
%\begin{macro}{\glscategory}
% Add a new storage key that can be used to indicate a category. The
% default category is \category{general}.
%    \begin{macrocode}
\glsaddstoragekey{category}{general}{\glscategory}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsifcategory}
% Convenient shortcut to determine if an entry has the given
% category.
%    \begin{macrocode}
\newcommand{\glsifcategory}[4]{%
 \ifglsfieldeq{#1}{category}{#2}{#3}{#4}%
}
%    \end{macrocode}
%\end{macro}
%
% Categories can have attributes.
%\begin{macro}{\glssetcategoryattribute}
%\begin{definition}
%\cs{glssetcategoryattribute}\marg{category}\marg{attribute-label}\marg{value}
%\end{definition}
% Set (or override if already set) an attribute for the given
% category.
%    \begin{macrocode}
\newcommand*{\glssetcategoryattribute}[3]{%
  \csdef{@glsxtr@categoryattr@@#1@#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glssetcategoriesattribute}
%\begin{definition}
%\cs{glssetcategoriesattribute}\marg{category list}\marg{attribute-label}\marg{value}
%\end{definition}
%\changes{1.48}{2021-11-22}{new}
% Similar to above, but globally apply to each category in the list.
%    \begin{macrocode}
\newcommand*{\glssetcategoriesattribute}[3]{%
  \@for\@gls@thiscatlabel:=#1\do{%
    \csgdef{@glsxtr@categoryattr@@\@gls@thiscatlabel @#2}{#3}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glssetcategoriesattributes}
%\begin{definition}
%\cs{glssetcategoriesattributes}\marg{category list}\marg{attribute-label list}\marg{value}
%\end{definition}
%\changes{1.48}{2021-11-22}{new}
% Similar to above, but apply to each category and attribute in the list.
%    \begin{macrocode}
\newcommand*{\glssetcategoriesattributes}[3]{%
%    \end{macrocode}
% Group to avoid problems with nested \cs{@for}.
%    \begin{macrocode}
 {%
   \@for\@gls@thisattrlabel:=#2\do{%
     \glssetcategoriesattribute{#1}{\@gls@thisattrlabel}{#3}%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glssetcategoryattributes}
%\begin{definition}
%\cs{glssetcategoryattributes}\marg{category}\marg{attribute list}\marg{value}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
% Similar to above, but globally apply to each attribute in the list
% to the given category.
%    \begin{macrocode}
\newcommand*{\glssetcategoryattributes}[3]{%
  \@for\@gls@thisattrlabel:=#2\do{%
    \csgdef{@glsxtr@categoryattr@@#1@\@gls@thisattrlabel}{#3}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsgetcategoryattribute}
%\begin{definition}
%\cs{glsgetcategoryattribute}\marg{category}\marg{attribute-label}
%\end{definition}
% Get the value of the given attribute for the given
% category. Does nothing if the attribute isn't defined.
%    \begin{macrocode}
\newcommand*{\glsgetcategoryattribute}[2]{%
  \csuse{@glsxtr@categoryattr@@#1@#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsunsetcategoryattribute}
%\begin{definition}
%\cs{glsunsetcategoryattribute}\marg{category}\marg{attribute-label}
%\end{definition}
%Unsets the given attribute for the given category.
%\changes{1.47}{2021-11-04}{new}
%    \begin{macrocode}
\newcommand*{\glsunsetcategoryattribute}[2]{%
  \csundef{@glsxtr@categoryattr@@#1@#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glshascategoryattribute}
%\begin{definition}
%\cs{glshascategoryattribute}\marg{category}\marg{attribute-label}\marg{true}\marg{false}
%\end{definition}
%\changes{0.5}{2015-12-07}{new}
% Tests if the category has the given attribute set.
%    \begin{macrocode}
\newcommand*{\glshascategoryattribute}[4]{%
  \ifcsvoid{@glsxtr@categoryattr@@#1@#2}{#4}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glssetattribute}
%\begin{definition}
%\cs{glssetattribute}\marg{entry label}\marg{attribute-label}\marg{value}
%\end{definition}
% Short cut where the category label is obtained from the entry
% information.
%    \begin{macrocode}
\newcommand*{\glssetattribute}[3]{%
  \glssetcategoryattribute{\glscategory{#1}}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsgetattribute}
%\begin{definition}
%\cs{glsgetattribute}\marg{entry label}\marg{attribute-label}
%\end{definition}
% Short cut where the category label is obtained from the entry
% information.
%    \begin{macrocode}
\newcommand*{\glsgetattribute}[2]{%
  \glsgetcategoryattribute{\glscategory{#1}}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glshasattribute}
%\begin{definition}
%\cs{glshasattribute}\marg{entry
%label}\marg{attribute-label}\marg{true}\marg{false}
%\end{definition}
%\changes{0.5}{2015-12-07}{new}
%\changes{0.5.4}{2015-12-15}{added check for entry's existence}
% Short cut to test if the given attribute has been set where the
% category label is obtained from the entry information.
%    \begin{macrocode}
\newcommand*{\glshasattribute}[4]{%
  \ifglsentryexists{#1}%
  {\glshascategoryattribute{\glscategory{#1}}{#2}{#3}{#4}}%
  {#4}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsifcategoryattribute}
%\begin{definition}
%\cs{glsifcategoryattribute}\marg{category}\marg{attribute-label}\marg{value}\marg{true
%part}\marg{false part}
%\end{definition}
% True if category has the attribute with the given value.
%    \begin{macrocode}
\newcommand{\glsifcategoryattribute}[5]{%
 \ifcsundef{@glsxtr@categoryattr@@#1@#2}%
 {#5}%
 {\ifcsstring{@glsxtr@categoryattr@@#1@#2}{#3}{#4}{#5}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsifattribute}
%\begin{definition}
%\cs{glsifattribute}\marg{entry label}\marg{attribute-label}\marg{value}\marg{true
%part}\marg{false part}
%\end{definition}
%Short cut to determine if the given entry has a category with the
%given attribute set.
%\changes{0.5.4}{2015-12-15}{added check for entry's existence}
%    \begin{macrocode}
\newcommand{\glsifattribute}[5]{%
  \ifglsentryexists{#1}%
  {\glsifcategoryattribute{\glscategory{#1}}{#2}{#3}{#4}{#5}}%
  {#5}%
}
%    \end{macrocode}
%\end{macro}
%
%Provide expandable test to determine if attribute is set to true.
%\begin{macro}{\@glsxtr@truevalue}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@truevalue}{true}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsifcategoryattributetrue}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsifcategoryattributetrue}\marg{category-label}\marg{attribute}\marg{true}\marg{false}
%\end{definition}
%Does \meta{false} if the entry hasn't been defined.
%    \begin{macrocode}
\newcommand*{\glsifcategoryattributetrue}[4]{%
 \ifcsequal{@glsxtr@categoryattr@@#1@#2}%
 {@glsxtr@truevalue}%
 {#3}{#4}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsifattributetrue}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsifattributetrue}\marg{label}\marg{attribute}\marg{true}\marg{false}
%\end{definition}
%Does \meta{false} if the entry hasn't been defined.
%    \begin{macrocode}
\newcommand*{\glsifattributetrue}[4]{%
 \ifcsundef{glo@\glsdetoklabel{#1}@category}%
 {#4}
 {\ifcsequal
  {@glsxtr@categoryattr@@\csname glo@\glsdetoklabel{#1}@category\endcsname @#2}%
  {@glsxtr@truevalue}%
  {#3}{#4}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsifcategoryattributehasitem}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsifcategoryattributehasitem}\marg{category}\marg{attribute-label}\marg{item}\marg{true
%part}\marg{false part}
%\end{definition}
% True if category has the attribute (whose value is a 
% comma-separated list) contains the given item. The \meta{item} is expanded.
%    \begin{macrocode}
\newrobustcmd{\glsifcategoryattributehasitem}[5]{%
 \ifcsundef{@glsxtr@categoryattr@@#1@#2}%
 {#5}%
 {%
  \protected@edef\gls@tmp{%
    \noexpand\DTLifinlist{#3}{\csuse{@glsxtr@categoryattr@@#1@#2}}}%
  \gls@tmp{#4}{#5}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
% Set attributes for the default \category{general} category:
%    \begin{macrocode}
\glssetcategoryattribute{general}{regular}{true}
%    \end{macrocode}
% Acronyms are regular by default, since they're typically just
% treated like normal words.
%    \begin{macrocode}
\glssetcategoryattribute{acronym}{regular}{true}
%    \end{macrocode}
%
%\begin{macro}{\glssetregularcategory}
%Convenient shortcut to add the regular attribute.
%    \begin{macrocode}
\newcommand*{\glssetregularcategory}[1]{%
 \glssetcategoryattribute{#1}{regular}{true}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsifregularcategory}
%\begin{definition}
%\cs{glsifregularcategory}\marg{category}\marg{true part}\marg{false part}
%\end{definition}
% Short cut to determine if a category has the regular attribute
% explicitly set to true.
%    \begin{macrocode}
\newcommand{\glsifregularcategory}[3]{%
  \glsifcategoryattribute{#1}{regular}{true}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsifnotregularcategory}
%\begin{definition}
%\cs{glsifnotregularcategory}\marg{category}\marg{true part}\marg{false part}
%\end{definition}
% Short cut to determine if a category has the regular attribute
% explicitly set to false.
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand{\glsifnotregularcategory}[3]{%
  \glsifcategoryattribute{#1}{regular}{false}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsifregular}
%\begin{definition}
%\cs{glsifregular}\marg{entry label}\marg{true part}\marg{false part}
%\end{definition}
% Short cut to determine if an entry has a regular attribute set to
% true.
%    \begin{macrocode}
\newcommand{\glsifregular}[3]{%
  \glsifregularcategory{\glscategory{#1}}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsifnotregular}
%\begin{definition}
%\cs{glsifnotregular}\marg{entry label}\marg{true part}\marg{false part}
%\end{definition}
% Short cut to determine if an entry has a regular attribute set to
% false.
%    \begin{macrocode}
\newcommand{\glsifnotregular}[3]{%
  \glsifnotregularcategory{\glscategory{#1}}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsforeachincategory}
%\begin{definition}
%\cs{glsforeachincategory}\oarg{glossary
%labels}\marg{category-label}\marg{glossary-cs}\marg{label-cs}\marg{body}
%\end{definition}
% Iterates through all entries in all the glossaries (or just those
% listed in \meta{glossary labels}) and does \meta{body} if the
% category matches \meta{category-label}. The control sequences
% \meta{glossary-cs} and \meta{label-cs} may be used in \meta{body}
% to access the glossary label and entry label for the current
% iteration.
%    \begin{macrocode}
\newcommand{\glsforeachincategory}[5][\@glo@types]{%
  \forallglossaries[#1]{#3}%
  {%
%    \end{macrocode}
%\changes{1.58}{2025-03-12}{check for empty glossary}
%    \begin{macrocode}
    \glsxtrifemptyglossary{#3}{}%
    {%
      \forglsentries[#3]{#4}%
      {%
        \glsifcategory{#4}{#2}{#5}{}%
      }%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsforeachwithattribute}
%\begin{definition}
%\cs{glsforeachwithattribute}\oarg{glossary
%labels}\marg{attribute-label}\marg{attribute-value}\marg{glossary-cs}\marg{label-cs}\marg{body}
%\end{definition}
% Iterates through all entries in all the glossaries (or just those
% listed in \meta{glossary labels}) and does \meta{body} if the
% category attribute \meta{attribute-label} matches
% \meta{attribute-value}. The control sequences
% \meta{glossary-cs} and \meta{label-cs} may be used in \meta{body}
% to access the glossary label and entry label for the current
% iteration.
%    \begin{macrocode}
\newcommand{\glsforeachwithattribute}[6][\@glo@types]{%
  \forallglossaries[#1]{#4}%
  {%
     \forglsentries[#4]{#5}%
     {%
       \glsifattribute{#5}{#2}{#3}{#6}{}%
     }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
% If \cs{newterm} has been defined, redefine it so that it
% automatically sets the category label to \category{index} and add
% \cs{glsxtrpostdescription}.
%    \begin{macrocode}
\ifdef\newterm
{%
%    \end{macrocode}
%\begin{macro}{\newterm}
%\changes{0.4}{2015-12-03}{fixed name argument}
%    \begin{macrocode}
  \renewcommand*{\newterm}[2][]{%
    \newglossaryentry{#2}%
    {type={index},category=index,name={#2},%
     description={\glsxtrpostdescription\nopostdesc},#1}%
  }
%    \end{macrocode}
%\end{macro}
% Indexed terms are regular by default.
%    \begin{macrocode}
  \glssetcategoryattribute{index}{regular}{true}
%    \end{macrocode}
%\begin{macro}{\glsxtrpostdescindex}
%    \begin{macrocode}
  \newcommand*{\glsxtrpostdescindex}{}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
}
{}
%    \end{macrocode}
%
%If the \pkgopt{symbols} package option was used, define a similar
%command for symbols, but set the default sort to the label rather
%than the name as the symbols will typically contain commands that
%will confuse makeindex and xindy.
%    \begin{macrocode}
\ifdef\printsymbols
{%
%    \end{macrocode}
%\begin{macro}{\glsxtrnewsymbol}
%\changes{0.4}{2015-12-03}{added extra argument}
% Unlike \cs{newterm}, this has a separate argument for the label
% (since the symbol will likely contain commands).
%    \begin{macrocode}
  \newcommand*{\glsxtrnewsymbol}[3][]{%
    \newglossaryentry{#2}{name={#3},sort={#2},type=symbols,category=symbol,#1}%
  }
%    \end{macrocode}
%\end{macro}
% Symbols are regular by default.
%    \begin{macrocode}
  \glssetcategoryattribute{symbol}{regular}{true}
%    \end{macrocode}
%\begin{macro}{\glsxtrpostdescsymbol}
%    \begin{macrocode}
  \newcommand*{\glsxtrpostdescsymbol}{}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
}
{}
%    \end{macrocode}
%
% Similar for the numbers option.
%    \begin{macrocode}
\ifdef\printnumbers
{%
%    \end{macrocode}
%\begin{macro}{\glsxtrnewnumber}
%\changes{0.4}{2015-12-03}{added extra argument}
%    \begin{macrocode}
\ifdef\printnumbers
  \newcommand*{\glsxtrnewnumber}[3][]{%
    \newglossaryentry{#2}{name={#3},sort={#2},type=numbers,category=number,#1}%
  }
%    \end{macrocode}
%\end{macro}
% Numbers are regular by default.
%    \begin{macrocode}
  \glssetcategoryattribute{number}{regular}{true}
%    \end{macrocode}
%\begin{macro}{\glsxtrpostdescnumber}
%    \begin{macrocode}
  \newcommand*{\glsxtrpostdescnumber}{}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
}
{}
%    \end{macrocode}
%
%\begin{macro}{\glsxtrsetcategory}
% Set the category for all listed labels. The first argument is the
% list of entry labels and the second argument is the category label.
%    \begin{macrocode}
\newcommand*{\glsxtrsetcategory}[2]{%
  \@for\@glsxtr@label:=#1\do
  {%
    \glsfieldxdef{\@glsxtr@label}{category}{#2}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsetcategoryforall}
% Set the category for all entries in the listed glossaries. The first argument 
% is the list of glossary labels and the second argument is the category label.
%    \begin{macrocode}
\newcommand*{\glsxtrsetcategoryforall}[2]{%
  \forallglossaries[#1]{\@glsxtr@type}{%
    \forglsentries[\@glsxtr@type]{\@glsxtr@label}%
    {%
      \glsfieldxdef{\@glsxtr@label}{category}{#2}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfieldtitlecase}
%\begin{definition}
%\cs{glsxtrfieldtitlecase}\marg{label}\marg{field}
%\end{definition}
% Apply title casing to the contents of the given field.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrfieldtitlecase}[2]{%
  \expandafter\glsxtrfieldtitlecasecs\expandafter
    {\csname glo@\glsdetoklabel{#1}@#2\endcsname}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfieldtitlecasecs}
%The command used by \cs{glsxtrfieldtitlecase}. May be
%redefined to use a different command, for example,
%\cs{xcapitalisefmtwords}. Check for \cs{glscapitalisewords}, which
%was added to \sty{glossaries} v4.48.
%\changes{1.07}{2016-08-15}{new}
%\changes{1.47}{2021-11-04}{added check for \cs{glscapitalisewords}}
%    \begin{macrocode}
\ifdef\glscapitalisewords
{
 \newcommand*{\glsxtrfieldtitlecasecs}[1]{%
  \expandafter\glscapitalisewords\expandafter{#1}}
}
{
 \newcommand*{\glsxtrfieldtitlecasecs}[1]{\xcapitalisewords{#1}}
}
%    \end{macrocode}
%\end{macro}
%
% Provide a convenient way to modify glossary styles without having
% to define a new style just to convert the first letter of fields
% to upper case.
%\begin{macro}{\glossentrydesc}
% If the \catattr{glossdesc} attribute is \qt{firstuc} convert first
% letter to upper case. If the attribute is \qt{title} use title
% case.
%    \begin{macrocode}
\@ifpackageloaded{glossaries-accsupp}
{
  \renewcommand*{\glossentrydesc}[1]{%
    \glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
%    \end{macrocode}
% As from version 1.04, allow the \catattr{glossdescfont} attribute
% to determine the font applied.
%\changes{1.04}{2016-05-02}{added glossdescfont attribute check}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
      \glshasattribute{#1}{glossdescfont}%
      {%
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossdescfont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossdescfont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name 
          `\@glsxtr@attrval' supplied in glossdescfont attribute
          for entry `#1'. Ignoring}%
          \let\@glsxtr@glossdescfont\@firstofone
        }%
      }%
      {\let\@glsxtr@glossdescfont\@firstofone}%
      \glsifattribute{#1}{glossdesc}{firstuc}%
      {%
        \@glsxtr@glossdescfont{\Glsaccessdesc{#1}}%
      }%
      {%
        \glsifattribute{#1}{glossdesc}{title}%
        {%
          \@glsxtr@do@titlecaps@warn
          \glsdescriptionaccessdisplay
          {%
            \@glsxtr@glossdescfont{\glsxtrfieldtitlecase{#1}{desc}}%
          }%
          {#1}%
        }%
        {%
          \@glsxtr@glossdescfont{\glsaccessdesc{#1}}%
        }%
      }%
    }%
  }
}
{
  \renewcommand*{\glossentrydesc}[1]{%
    \glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
      \glshasattribute{#1}{glossdescfont}%
      {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossdescfont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossdescfont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name 
          `\@glsxtr@attrval' supplied in glossdescfont attribute
          for entry `#1'. Ignoring}%
          \let\@glsxtr@glossdescfont\@firstofone
        }%
      }%
      {\let\@glsxtr@glossdescfont\@firstofone}%
      \glsifattribute{#1}{glossdesc}{firstuc}%
      {%
        \@glsxtr@glossdescfont{\Glsentrydesc{#1}}%
      }%
      {%
        \glsifattribute{#1}{glossdesc}{title}%
        {%
          \@glsxtr@do@titlecaps@warn
          \@glsxtr@glossdescfont{\glsxtrfieldtitlecase{#1}{desc}}%
        }%
        {%
          \@glsxtr@glossdescfont{\glsentrydesc{#1}}%
        }%
      }%
    }%
  }
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glossentryname}
% If the \catattr{glossname} attribute is \qt{firstuc} convert first
% letter to upper case. If the attribute is \qt{title} use title
% case.
%    \begin{macrocode}
\@ifpackageloaded{glossaries-accsupp}
{
  \renewcommand*{\glossentryname}[1]{%
    \@glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
%    \end{macrocode}
% As from v1.54, do pre-name hook:
%    \begin{macrocode}
      \glsxtrprenamehook{#1}%
%    \end{macrocode}
% As from version 1.04, allow the \catattr{glossnamefont} attribute
% to determine the font applied.
%\changes{1.04}{2016-05-02}{added glossnamefont attribute check}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
      \glshasattribute{#1}{glossnamefont}%
      {%
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name 
          `\@glsxtr@attrval' supplied in glossnamefont attribute
          for entry `#1'. Reverting to default \string\glsnamefont}%
          \let\@glsxtr@glossnamefont\glsnamefont
        }%
      }%
      {\let\@glsxtr@glossnamefont\glsnamefont}%
      \glsifattribute{#1}{glossname}{firstuc}%
      {%
        \glsnameaccessdisplay
        {%
          \@glsxtr@glossnamefont{\Glsentryname{#1}}%
        }%
        {#1}%
      }%
      {%
        \glsifattribute{#1}{glossname}{title}%
        {%
          \@glsxtr@do@titlecaps@warn
          \glsnameaccessdisplay
          {%
            \@glsxtr@glossnamefont{\glsxtrfieldtitlecase{#1}{name}}%
          }%
          {#1}%
        }%
        {%
          \glsifattribute{#1}{glossname}{uc}%
          {%
            \glsnameaccessdisplay
            {%
%    \end{macrocode}
% Hide the label from the upper-casing command.
%    \begin{macrocode}
               \letcs{\glo@name}{glo@\glsdetoklabel{#1}@name}%
               \@glsxtr@glossnamefont{\glsuppercase{\glo@name}}%
            }%
            {#1}%
          }%
          {%
            \letcs{\glo@name}{glo@\glsdetoklabel{#1}@name}%
            \glsnameaccessdisplay
            {%
              \expandafter\@glsxtr@glossnamefont\expandafter{\glo@name}%
            }%
            {#1}%
          }%
        }%
      }%
%    \end{macrocode}
% Do post-name hook:
%    \begin{macrocode}
      \glsxtrpostnamehook{#1}%
    }%
  }
}
{
  \renewcommand*{\glossentryname}[1]{%
    \@glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
%    \end{macrocode}
% As from v1.54, do pre-name hook:
%    \begin{macrocode}
      \glsxtrprenamehook{#1}%
      \glshasattribute{#1}{glossnamefont}%
      {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name 
          `\@glsxtr@attrval' supplied in glossnamefont attribute
          for entry `#1'. Reverting to default \string\glsnamefont}%
          \let\@glsxtr@glossnamefont\glsnamefont
        }%
      }%
      {\let\@glsxtr@glossnamefont\glsnamefont}%
      \glsifattribute{#1}{glossname}{firstuc}%
      {%
        \@glsxtr@glossnamefont{\Glsentryname{#1}}%
      }%
      {%
        \glsifattribute{#1}{glossname}{title}%
        {%
          \@glsxtr@do@titlecaps@warn
          \@glsxtr@glossnamefont{\glsxtrfieldtitlecase{#1}{name}}%
        }%
        {%
          \glsifattribute{#1}{glossname}{uc}%
          {%
%    \end{macrocode}
% Hide the label from the upper-casing command.
%    \begin{macrocode}
            \letcs{\glo@name}{glo@\glsdetoklabel{#1}@name}%
            \@glsxtr@glossnamefont{\glsuppercase{\glo@name}}%
          }%
          {%
%    \end{macrocode}
% This little trick is used by \sty{glossaries} to allow the user to
% redefine \cs{glsnamefont} to use \cs{makefirstuc}. Support it
% even though they can now use the \catattr{firstuc} attribute.
%    \begin{macrocode}
            \letcs{\glo@name}{glo@\glsdetoklabel{#1}@name}%
            \expandafter\@glsxtr@glossnamefont\expandafter{\glo@name}%
          }%
        }%
      }%
%    \end{macrocode}
% Do post-name hook.
%\changes{1.04}{2016-05-02}{moved post name hook inside condition}
%    \begin{macrocode}
      \glsxtrpostnamehook{#1}%
    }%
  }
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glossentryname}
% Redefine to set the abbreviation format and accessibility support.
%\changes{0.5.2}{2015-12-08}{added}
%    \begin{macrocode}
\@ifpackageloaded{glossaries-accsupp}
{
  \renewcommand*{\Glossentryname}[1]{%
    \@glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
%    \end{macrocode}
% As from v1.54, do pre-name hook:
%    \begin{macrocode}
      \glsxtrprenamehook{#1}%
%    \end{macrocode}
% As from version 1.04, allow the \catattr{glossnamefont} attribute
% to determine the font applied.
%\changes{1.04}{2016-05-02}{added glossnamefont attribute check}
%    \begin{macrocode}
      \glshasattribute{#1}{glossnamefont}%
      {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name 
          `\@glsxtr@attrval' supplied in glossnamefont attribute
          for entry `#1'. Reverting to default \string\glsnamefont}%
          \let\@glsxtr@glossnamefont\glsnamefont
        }%
      }%
      {\let\@glsxtr@glossnamefont\glsnamefont}%
      \glsnameaccessdisplay
      {%
        \@glsxtr@glossnamefont{\Glsentryname{#1}}%
      }%
      {#1}%
%    \end{macrocode}
% Do post-name hook:
%    \begin{macrocode}
      \glsxtrpostnamehook{#1}%
    }%
  }
}
{
  \renewcommand*{\Glossentryname}[1]{%
    \@glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
%    \end{macrocode}
% As from v1.54, do pre-name hook:
%    \begin{macrocode}
      \glsxtrprenamehook{#1}%
      \glshasattribute{#1}{glossnamefont}%
      {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name 
          `\@glsxtr@attrval' supplied in glossnamefont attribute
          for entry `#1'. Reverting to default \string\glsnamefont}%
          \let\@glsxtr@glossnamefont\glsnamefont
        }%
      }%
      {\let\@glsxtr@glossnamefont\glsnamefont}%
      \@glsxtr@glossnamefont{\Glsentryname{#1}}%
%    \end{macrocode}
% Do post-name hook:
%    \begin{macrocode}
      \glsxtrpostnamehook{#1}%
    }%
  }
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlossEntryName}
% This command was only added to \sty{glossaries} v4.59 so provide a
% definition in case an older version is installed.
%    \begin{macrocode}
\providecommand*{\GlossEntryName}[1]{%
 \glsnamefont{\glsentrytitlecase{#1}{name}}%
}
%    \end{macrocode}
% Redefine to set the abbreviation format and accessibility support.
%\changes{1.6}{2025-04-12}{new}
%    \begin{macrocode}
\@ifpackageloaded{glossaries-accsupp}
{
  \renewcommand*{\GlossEntryName}[1]{%
    \@glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
%    \end{macrocode}
% Do pre-name hook:
%    \begin{macrocode}
      \glsxtrprenamehook{#1}%
%    \end{macrocode}
% Allow the \catattr{glossnamefont} attribute
% to determine the font applied.
%    \begin{macrocode}
      \glshasattribute{#1}{glossnamefont}%
      {%
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name 
          `\@glsxtr@attrval' supplied in glossnamefont attribute
          for entry `#1'. Reverting to default \string\glsnamefont}%
          \let\@glsxtr@glossnamefont\glsnamefont
        }%
      }%
      {\let\@glsxtr@glossnamefont\glsnamefont}%
      \glsnameaccessdisplay
      {%
        \@glsxtr@glossnamefont{\glsentrytitlecase{#1}{name}}%
      }%
      {#1}%
%    \end{macrocode}
% Do post-name hook:
%    \begin{macrocode}
      \glsxtrpostnamehook{#1}%
    }%
  }
}
{
  \renewcommand*{\GlossEntryName}[1]{%
    \@glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
%    \end{macrocode}
% Do pre-name hook:
%    \begin{macrocode}
      \glsxtrprenamehook{#1}%
      \glshasattribute{#1}{glossnamefont}%
      {%
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name 
          `\@glsxtr@attrval' supplied in glossnamefont attribute
          for entry `#1'. Reverting to default \string\glsnamefont}%
          \let\@glsxtr@glossnamefont\glsnamefont
        }%
      }%
      {\let\@glsxtr@glossnamefont\glsnamefont}%
      \@glsxtr@glossnamefont{\glsentrytitlecase{#1}{name}}%
%    \end{macrocode}
% Do post-name hook:
%    \begin{macrocode}
      \glsxtrpostnamehook{#1}%
    }%
  }
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrprenamehook}
%\changes{1.54}{2025-01-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrprenamehook}[1]{}
%    \end{macrocode}
%\end{macro}
%
% Provide a convenient way to also index the entries using the
% standard \cs{index} mechanism. This may use different actual,
% encap and escape characters to those used for the glossaries.
%
%\begin{macro}{\glsxtrpostnamehook}
%\changes{0.5.3}{2015-12-09}{new}
% Hook to append stuff after the name is displayed in the glossary. 
% The argument is the entry's label.
%    \begin{macrocode}
\newcommand*{\glsxtrpostnamehook}[1]{%
  \let\@glsnumberformat\@glsxtr@defaultnumberformat
  \glsxtrdoautoindexname{#1}{indexname}%
%    \end{macrocode}
%Allow additional code regardless of category:
%    \begin{macrocode}
  \glsextrapostnamehook{#1}%
%    \end{macrocode}
% Allow categories to hook in here.
%\changes{1.04}{2016-05-02}{added category check}
%    \begin{macrocode}
  \csuse{glsxtrpostname\glscategory{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsextrapostnamehook}
%\changes{1.25}{2017-11-24}{new}
%    \begin{macrocode}
\newcommand*{\glsextrapostnamehook}[1]{}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsdefpostname}
%\changes{1.31}{2018-05-09}{new}
%Provide a convenient command for defining the post-name hook
%for the given category.
%    \begin{macrocode}
\newcommand*{\glsdefpostname}[2]{%
  \csdef{glsxtrpostname#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@setaccessdisplay}
%\changes{1.22}{2017-11-08}{new}
%    \begin{macrocode}
\@ifpackageloaded{glossaries-accsupp}
{
  \newcommand*{\glsxtr@setaccessdisplay}[1]{%
     \ifcsdef{gls#1accessdisplay}%
     {\letcs\@glsxtr@accessdisplay{gls#1accessdisplay}}%
     {%
%    \end{macrocode}
%This is essentially the reverse of \cs{@gls@fetchfield}, since the
%field supplied to \cs{glossentryname} has to be the internal label,
%but the \cs{gls\meta{field}accessdisplay} commands use the key name.
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
       \protected@edef\@gls@thisval{#1}%
       \@for\@gls@map:=\@gls@keymap\do{%
        \protected@edef\@this@key{\expandafter\@secondoftwo\@gls@map}%
        \ifdefequal{\@this@key}{\@gls@thisval}%
        {%
          \protected@edef\@gls@thisval{\expandafter\@firstoftwo\@gls@map}%
          \@endfortrue
        }%
        {}%
       }%
       \ifcsdef{gls\@gls@thisval accessdisplay}%
       {\letcs\@glsxtr@accessdisplay{gls\@gls@thisval accessdisplay}}%
       {\let\@glsxtr@accessdisplay\@firstoftwo}%
     }%
  }
}
{%
  \newcommand*{\glsxtr@setaccessdisplay}[1]{%
   \let\@glsxtr@accessdisplay\@firstoftwo}
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glossentrynameother}
% Provide a command that works like \cs{glossentryname}
% but accesses a different field (which must be supplied using its
% internal field label).
%\changes{1.22}{2017-11-08}{new}
%    \begin{macrocode}
\newrobustcmd*{\glossentrynameother}[2]{%
  \@glsdoifexistsorwarn{#1}%
  {%
%    \end{macrocode}
%Accessibility support:
%    \begin{macrocode}
    \glsxtr@setaccessdisplay{#2}%
%    \end{macrocode}
%Set the abbreviation format:
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
    \glssetabbrvfmt{\glscategory{#1}}%
%    \end{macrocode}
% As from v1.54, do pre-name hook:
%    \begin{macrocode}
    \glsxtrprenamehook{#1}%
    \glshasattribute{#1}{glossnamefont}%
    {%
      \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
      \ifcsdef{\@glsxtr@attrval}%
      {%
        \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
      }%
      {%
        \GlossariesExtraWarning{Unknown control sequence name 
        `\@glsxtr@attrval' supplied in glossnamefont attribute
        for entry `#1'. Reverting to default \string\glsnamefont}%
        \let\@glsxtr@glossnamefont\glsnamefont
      }%
    }%
    {\let\@glsxtr@glossnamefont\glsnamefont}%
    \glsifattribute{#1}{glossname}{firstuc}%
    {%
      \@glsxtr@accessdisplay
      {\@glsxtr@glossnamefont{\@Gls@entry@field{#1}{#2}}}%
      {#1}%
    }%
    {%
      \glsifattribute{#1}{glossname}{title}%
      {%
        \@glsxtr@do@titlecaps@warn
        \@glsxtr@accessdisplay
        {\@glsxtr@glossnamefont{\glsxtrfieldtitlecase{#1}{#2}}}%
        {#1}%
      }%
      {%
        \glsifattribute{#1}{glossname}{uc}%
        {%
          \letcs{\glo@name}{glo@\glsdetoklabel{#1}@#2}%
          \@glsxtr@accessdisplay
          {\@glsxtr@glossnamefont{\glsuppercase{\glo@name}}}%
          {#1}%
        }%
        {%
          \letcs{\glo@name}{glo@\glsdetoklabel{#1}@#2}%
          \@glsxtr@accessdisplay
          {\expandafter\@glsxtr@glossnamefont\expandafter{\glo@name}}%
          {#1}%
        }%
      }%
    }%
%    \end{macrocode}
% Do post-name hook.
%    \begin{macrocode}
    \glsxtrpostnamehook{#1}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glossentrynameother}
% Provide a command that works like \cs{Glossentryname}
% but accesses a different field (which must be supplied using its
% internal field label).
%\changes{1.54}{2025-01-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\Glossentrynameother}[2]{%
  \@glsdoifexistsorwarn{#1}%
  {%
%    \end{macrocode}
%Accessibility support:
%    \begin{macrocode}
    \glsxtr@setaccessdisplay{#2}%
%    \end{macrocode}
%Set the abbreviation format:
%    \begin{macrocode}
    \glssetabbrvfmt{\glscategory{#1}}%
%    \end{macrocode}
% Do pre-name hook:
%    \begin{macrocode}
    \glsxtrprenamehook{#1}%
    \glshasattribute{#1}{glossnamefont}%
    {%
      \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
      \ifcsdef{\@glsxtr@attrval}%
      {%
        \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
      }%
      {%
        \GlossariesExtraWarning{Unknown control sequence name 
        `\@glsxtr@attrval' supplied in glossnamefont attribute
        for entry `#1'. Reverting to default \string\glsnamefont}%
        \let\@glsxtr@glossnamefont\glsnamefont
      }%
    }%
    {\let\@glsxtr@glossnamefont\glsnamefont}%
    \@glsxtr@accessdisplay
    {\@glsxtr@glossnamefont{\@Gls@entry@field{#1}{#2}}}%
    {#1}%
%    \end{macrocode}
% Do post-name hook.
%    \begin{macrocode}
    \glsxtrpostnamehook{#1}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLOSSentrynameother}
% Provide a command that works like \cs{GLOSSentryname}
% but accesses a different field (which must be supplied using its
% internal field label).
%\changes{1.6}{2025-04-12}{new}
%    \begin{macrocode}
\newrobustcmd*{\GLOSSentrynameother}[2]{%
  \@glsdoifexistsorwarn{#1}%
  {%
%    \end{macrocode}
%Accessibility support:
%    \begin{macrocode}
    \glsxtr@setaccessdisplay{#2}%
%    \end{macrocode}
%Set the abbreviation format:
%    \begin{macrocode}
    \glssetabbrvfmt{\glscategory{#1}}%
%    \end{macrocode}
% Do pre-name hook:
%    \begin{macrocode}
    \glsxtrprenamehook{#1}%
    \glshasattribute{#1}{glossnamefont}%
    {%
      \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
      \ifcsdef{\@glsxtr@attrval}%
      {%
        \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
      }%
      {%
        \GlossariesExtraWarning{Unknown control sequence name 
        `\@glsxtr@attrval' supplied in glossnamefont attribute
        for entry `#1'. Reverting to default \string\glsnamefont}%
        \let\@glsxtr@glossnamefont\glsnamefont
      }%
    }%
    {\let\@glsxtr@glossnamefont\glsnamefont}%
    \@glsxtr@accessdisplay
    {\@glsxtr@glossnamefont{\glsuppercase{\@gls@entry@field{#1}{#2}}}}%
    {#1}%
%    \end{macrocode}
% Do post-name hook.
%    \begin{macrocode}
    \glsxtrpostnamehook{#1}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlossEntryNameOther}
% Provide a command that works like \cs{GlossEntryName}
% but accesses a different field (which must be supplied using its
% internal field label).
%\changes{1.6}{2025-04-12}{new}
%    \begin{macrocode}
\newrobustcmd*{\GlossEntryNameOther}[2]{%
  \@glsdoifexistsorwarn{#1}%
  {%
%    \end{macrocode}
%Accessibility support:
%    \begin{macrocode}
    \glsxtr@setaccessdisplay{#2}%
%    \end{macrocode}
%Set the abbreviation format:
%    \begin{macrocode}
    \glssetabbrvfmt{\glscategory{#1}}%
%    \end{macrocode}
% Do pre-name hook:
%    \begin{macrocode}
    \glsxtrprenamehook{#1}%
    \glshasattribute{#1}{glossnamefont}%
    {%
      \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
      \ifcsdef{\@glsxtr@attrval}%
      {%
        \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
      }%
      {%
        \GlossariesExtraWarning{Unknown control sequence name 
        `\@glsxtr@attrval' supplied in glossnamefont attribute
        for entry `#1'. Reverting to default \string\glsnamefont}%
        \let\@glsxtr@glossnamefont\glsnamefont
      }%
    }%
    {\let\@glsxtr@glossnamefont\glsnamefont}%
    \@glsxtr@accessdisplay
    {\@glsxtr@glossnamefont{\glsentrytitlecase{#1}{#2}}}%
    {#1}%
%    \end{macrocode}
% Do post-name hook.
%    \begin{macrocode}
    \glsxtrpostnamehook{#1}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\if@glsxtr@format@override}
%\changes{0.5.3}{2015-12-09}{new}
% Determines if the \gloskey[glslink]{format} key should override
% the indexing attribute value.
%    \begin{macrocode}
\newif\if@glsxtr@format@override
\@glsxtr@format@overridefalse
%    \end{macrocode}
%\end{macro}
%
%If overriding is enabled, the \cs{glshypernumber} command will have to 
%be redefined in the index to use \cs{hyperpage} instead.
%\begin{macro}{\GlsXtrEnableIndexFormatOverride}
%    \begin{macrocode}
\@ifpackageloaded{hyperref}
{
%    \end{macrocode}
% If \sty{hyperref}'s \pkgoptfmt{hyperindex} option is on, then
% \sty{hyperref} will automatically add \cs{hyperpage}, so don't
% add it.
%    \begin{macrocode}
  \ifHy@hyperindex
    \newcommand*{\GlsXtrEnableIndexFormatOverride}{%
      \@glsxtr@format@overridetrue
      \appto\theindex{\let\glshypernumber\@firstofone}%
    }
  \else
    \newcommand*{\GlsXtrEnableIndexFormatOverride}{%
      \@glsxtr@format@overridetrue
      \appto\theindex{\let\glshypernumber\hyperpage}%
    }
  \fi
}
{
  \newcommand*{\GlsXtrEnableIndexFormatOverride}{%
    \@glsxtr@format@overridetrue
  }
}
\@onlypreamble\GlsXtrEnableIndexFormatOverride
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrdoautoindexname}
%\changes{0.5.3}{2015-12-09}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrdoautoindexname}[2]{%
  \glshasattribute{#1}{#2}%
  {%
%    \end{macrocode}
% Escape any makeindex/xindy characters in the value of the \gloskey{name}
% field. Take care with \sty{babel} as this won't work if the
% category code has changed for those characters.
%    \begin{macrocode}
    \@glsxtr@autoindex@setname{#1}%
%    \end{macrocode}
% If the attribute value is simply \qt{true} don't add an encap,
% otherwise use the value as the encap.
%    \begin{macrocode}
    \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{#2}}%
    \if@glsxtr@format@override
%    \end{macrocode}
%\changes{1.19}{2017-09-09}{changed format test}
%    \begin{macrocode}
      \ifx\@glsnumberformat\@glsxtr@defaultnumberformat
      \else
        \let\@glsxtr@attrval\@glsnumberformat
      \fi
    \fi
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{eappto} to \cs{protected@eappto}}
%    \begin{macrocode}
    \ifdefstring{\@glsxtr@attrval}{true}%
    {}%
    {\protected@eappto\@glo@name{\@glsxtr@autoindex@encap\@glsxtr@attrval}}%
    \expandafter\glsxtrautoindex\expandafter{\@glo@name}%
  }%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrautoindex}
%\changes{1.16}{2017-06-15}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrautoindex}{\index}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrautoindexesc}
%\changes{1.36}{2018-08-18}{new}
%    \begin{macrocode}
\newcommand{\glsxtrautoindexesc}{%
  \@gls@checkmkidxchars\@glo@sort
  \@glsxtr@autoindex@doextra@esc\@glo@sort
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@autoindex@setname}
%\changes{0.5.3}{2015-12-09}{new}
% Assign \cs{@glo@name} for use with \catattr{indexname} attribute.
%    \begin{macrocode}
\newcommand*{\@glsxtr@autoindex@setname}[1]{%
  \protected@edef\@glo@name{\glsxtrautoindexentry{#1}}%
  \glsxtrautoindexassignsort{\@glo@sort}{#1}%
  \glsxtrautoindexesc
  \epreto\@glo@name{\@glo@sort\@glsxtr@autoindex@at}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrautoindexentry}
%\changes{1.16}{2017-06-15}{new}
%Command used for the actual part when auto-indexing.
%    \begin{macrocode}
\newcommand*{\glsxtrautoindexentry}[1]{\string\glsentryname{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrautoindexassignsort}
%\changes{1.16}{2017-06-15}{new}
%Used to assign the sort value when auto-indexing.
%    \begin{macrocode}
\newcommand*{\glsxtrautoindexassignsort}[2]{%
  \glsletentryfield{#1}{#2}{sort}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@autoindex@doextra@esc}
%    \begin{macrocode}
\newcommand*{\@glsxtr@autoindex@doextra@esc}[1]{%
%    \end{macrocode}
% Escape the escape character unless it has already been escaped.
%    \begin{macrocode}
  \ifx\@glsxtr@autoindex@esc\@gls@quotechar
  \else
    \def\@gls@checkedmkidx{}%
    \edef\@@glsxtr@checkspch{%
      \noexpand\@glsxtr@autoindex@escquote\expandonce{#1}%
        \noexpand\@empty\@glsxtr@autoindex@esc\noexpand\@nnil
        \@glsxtr@autoindex@esc\noexpand\@empty\noexpand\@glsxtr@endescspch}%
    \@@glsxtr@checkspch
    \let#1\@gls@checkedmkidx\relax
  \fi
%    \end{macrocode}
% Escape actual character unless it has already been escaped.
%    \begin{macrocode}
  \ifx\@glsxtr@autoindex@at\@gls@actualchar
  \else
    \def\@gls@checkedmkidx{}%
    \edef\@@glsxtr@checkspch{%
      \noexpand\@glsxtr@autoindex@escat\expandonce{#1}%
        \noexpand\@empty\@glsxtr@autoindex@at\noexpand\@nnil
        \@glsxtr@autoindex@at\noexpand\@empty\noexpand\@glsxtr@endescspch}%
    \@@glsxtr@checkspch
    \let#1\@gls@checkedmkidx\relax
  \fi
%    \end{macrocode}
% Escape level character unless it has already been escaped.
%    \begin{macrocode}
  \ifx\@glsxtr@autoindex@level\@gls@levelchar
  \else
    \def\@gls@checkedmkidx{}%
    \edef\@@glsxtr@checkspch{%
      \noexpand\@glsxtr@autoindex@esclevel\expandonce{#1}%
        \noexpand\@empty\@glsxtr@autoindex@level\noexpand\@nnil
        \@glsxtr@autoindex@level\noexpand\@empty\noexpand\@glsxtr@endescspch}%
    \@@glsxtr@checkspch
    \let#1\@gls@checkedmkidx\relax
  \fi
%    \end{macrocode}
% Escape encap character unless it has already been escaped.
%    \begin{macrocode}
  \ifx\@glsxtr@autoindex@encap\@gls@encapchar
  \else
    \def\@gls@checkedmkidx{}%
    \edef\@@glsxtr@checkspch{%
      \noexpand\@glsxtr@autoindex@escencap\expandonce{#1}%
        \noexpand\@empty\@glsxtr@autoindex@encap\noexpand\@nnil
        \@glsxtr@autoindex@encap\noexpand\@empty\noexpand\@glsxtr@endescspch}%
    \@@glsxtr@checkspch
    \let#1\@gls@checkedmkidx\relax
  \fi
}
%    \end{macrocode}
%\end{macro}
%
% The user commands here have a preamble-only restriction to ensure
% they are set before required and also to reduce the chances of
% complications caused by \sty{babel}'s shorthands.
%
%\begin{macro}{\@glsxtr@autoindex@at}
%\changes{0.5.3}{2015-12-09}{new}
% Actual character for use with \cs{index}.
%    \begin{macrocode}
\newcommand*{\@glsxtr@autoindex@at}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrSetActualChar}
% Set the actual character.
%    \begin{macrocode}
\newcommand*{\GlsXtrSetActualChar}[1]{%
  \gdef\@glsxtr@autoindex@at{#1}%
  \def\@glsxtr@autoindex@escat##1#1##2#1##3\@glsxtr@endescspch{%
    \@@glsxtr@autoindex@escspch{#1}{\@glsxtr@autoindex@escat}{##1}{##2}{##3}%
  }%
}
\@onlypreamble\GlsXtrSetActualChar
\makeatother
\GlsXtrSetActualChar{@}
\makeatletter
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@autoindex@encap}
%\changes{0.5.3}{2015-12-09}{new}
% Encap character for use with \cs{index}.
%    \begin{macrocode}
\newcommand*{\@glsxtr@autoindex@encap}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrSetEncapChar}
% Set the encap character.
%    \begin{macrocode}
\newcommand*{\GlsXtrSetEncapChar}[1]{%
  \gdef\@glsxtr@autoindex@encap{#1}%
  \def\@glsxtr@autoindex@escencap##1#1##2#1##3\@glsxtr@endescspch{%
    \@@glsxtr@autoindex@escspch{#1}{\@glsxtr@autoindex@escencap}{##1}{##2}{##3}%
  }%
}
\GlsXtrSetEncapChar{|}
\@onlypreamble\GlsXtrSetEncapChar
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@autoindex@level}
%\changes{0.5.3}{2015-12-09}{new}
% Level character for use with \cs{index}.
%    \begin{macrocode}
\newcommand*{\@glsxtr@autoindex@level}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrSetLevelChar}
% Set the encap character.
%    \begin{macrocode}
\newcommand*{\GlsXtrSetLevelChar}[1]{%
  \gdef\@glsxtr@autoindex@level{#1}%
  \def\@glsxtr@autoindex@esclevel##1#1##2#1##3\@glsxtr@endescspch{%
    \@@glsxtr@autoindex@escspch{#1}{\@glsxtr@autoindex@esclevel}{##1}{##2}{##3}%
  }%
}
\GlsXtrSetLevelChar{!}
\@onlypreamble\GlsXtrSetLevelChar
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@autoindex@esc}
%\changes{0.5.3}{2015-12-09}{new}
% Escape character for use with \cs{index}.
%    \begin{macrocode}
\newcommand*{\@glsxtr@autoindex@esc}{"}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrSetEscChar}
% Set the escape character.
%    \begin{macrocode}
\newcommand*{\GlsXtrSetEscChar}[1]{%
  \gdef\@glsxtr@autoindex@esc{#1}%
  \def\@glsxtr@autoindex@escquote##1#1##2#1##3\@glsxtr@endescspch{%
    \@@glsxtr@autoindex@escspch{#1}{\@glsxtr@autoindex@escquote}{##1}{##2}{##3}%
  }%
}
\GlsXtrSetEscChar{"}
\@onlypreamble\GlsXtrSetEscChar
%    \end{macrocode}
%\end{macro}
%
% Set if defined. (For example, if \sty{doc} package has been
% loaded.) Actual character \cs{actualchar}:
%    \begin{macrocode}
\ifdef\actualchar
 {\expandafter\GlsXtrSetActualChar\expandafter{\actualchar}}
 {}
%    \end{macrocode}
% Quote character \cs{quotechar}:
%    \begin{macrocode}
\ifdef\quotechar
 {\expandafter\GlsXtrSetEscChar\expandafter{\quotechar}}
 {}
%    \end{macrocode}
% Level character \cs{levelchar}:
%    \begin{macrocode}
\ifdef\levelchar
 {\expandafter\GlsXtrSetLevelChar\expandafter{\levelchar}}
 {}
%    \end{macrocode}
% Encap character \cs{encapchar}:
%    \begin{macrocode}
\ifdef\encapchar
 {\expandafter\GlsXtrSetEncapChar\expandafter{\encapchar}}
 {}
%    \end{macrocode}
%
%\begin{macro}{\@glsxtr@gobbleto@endescspch}
%    \begin{macrocode}
\def\@glsxtr@gobbleto@endescspch#1\@glsxtr@endescspch{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@glsxtr@autoindex@esc@spch}
%\begin{definition}
%\cs{@@glsxtr@autoindex@escspch}\marg{char}\marg{cs}\marg{pre}\marg{mid}\marg{post}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\@@glsxtr@autoindex@escspch}[5]{%
  \@gls@tmpb=\expandafter{\@gls@checkedmkidx}%
  \toks@={#3}%
  \ifx\@nnil#3\relax
    \def\@@glsxtr@checkspch{\@glsxtr@gobbleto@endescspch#5\@glsxtr@endescspch}%
  \else
    \ifx\@nnil#4\relax
      \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@}%
     \def\@@glsxtr@checkspch{\@glsxtr@gobbleto@endescspch
        #4#5\@glsxtr@endescspch}%
    \else
      \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
       \@glsxtr@autoindex@esc#1}%
      \def\@@glsxtr@checkspch{#2#5#1\@nnil#1\@glsxtr@endescspch}%
    \fi
  \fi
  \@@glsxtr@checkspch
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glossentrydesc}
% Redefine to set the abbreviation format and accessibility support.
%\changes{0.5.2}{2015-12-08}{added}
%    \begin{macrocode}
\renewcommand*{\Glossentrydesc}[1]{%
  \glsdoifexistsorwarn{#1}%
  {%
    \glssetabbrvfmt{\glscategory{#1}}%
    \Glsaccessdesc{#1}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glossentrysymbol}
% Redefine to set the format and accessibility support. Allow for
% the possibility of being used in a section heading for standalone
% entry definitions.
%\changes{0.5.2}{2015-12-08}{added}
%    \begin{macrocode}
\renewcommand*{\glossentrysymbol}[1]{%
  \glstexorpdfstring{\@glossentrysymbol{#1}}{\glsentrypdfsymbol{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsentrypdfsymbol}
%\changes{1.42}{2020-02-13}{new}
%May be redefined to a field that expands to a value that's more
%suitable for PDF bookmarks.
%    \begin{macrocode}
\newcommand{\glsentrypdfsymbol}[1]{\glsentrysymbol{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glossentrysymbol}
%\changes{1.42}{2020-02-13}{new}
%There are no case-changing attributes as it's less usual for
%symbols.
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
\newrobustcmd*{\@glossentrysymbol}[1]{%
  \glsdoifexistsorwarn{#1}%
  {%
    \begingroup
      \glssetabbrvfmt{\glscategory{#1}}%
      \glshasattribute{#1}{glosssymbolfont}%
      {%
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glosssymbolfont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glosssymbolfont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name 
          `\@glsxtr@attrval' supplied in glosssymbolfont attribute
          for entry `#1'. Ignoring}%
          \let\@glsxtr@glosssymbolfont\@firstofone
        }%
      }%
      {\let\@glsxtr@glosssymbolfont\@firstofone}%
      \@glsxtr@glosssymbolfont{\glsaccesssymbol{#1}}%
    \endgroup
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glossentrysymbol}
% Redefine to set the abbreviation format and accessibility support.
%\changes{0.5.2}{2015-12-08}{added}
%    \begin{macrocode}
\renewcommand*{\Glossentrysymbol}[1]{%
  \glsdoifexistsorwarn{#1}%
  {%
    \glssetabbrvfmt{\glscategory{#1}}%
    \Glsaccesssymbol{#1}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%Allow initials to be marked but only use the formatting for the
%tag in the glossary.
%\begin{macro}{\GlsXtrEnableInitialTagging}
% Allow initial tagging. The first argument is a list of categories
% to apply this to. The second argument is the name of the command to
% use to tag the initials. This can't already be defined for safety
% unless the starred version is used.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrEnableInitialTagging}{%
  \@ifstar\s@glsxtr@enabletagging\@glsxtr@enabletagging
}
\@onlypreamble\GlsXtrEnableInitialTagging
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@enabletagging}
% Starred version undefines command.
%    \begin{macrocode}
\newcommand*{\s@glsxtr@enabletagging}[2]{%
  \undef#2%
  \@glsxtr@enabletagging{#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtr@enabletagging}
% Internal command.
%    \begin{macrocode}
\newcommand*{\@glsxtr@enabletagging}[2]{%
%    \end{macrocode}
% Set attributes for categories given in the first argument.
%    \begin{macrocode}
  \@for\@glsxtr@cat:=#1\do
  {%
    \ifdefempty\@glsxtr@cat
    {}%
    {\glssetcategoryattribute{\@glsxtr@cat}{tagging}{true}}%
  }%
  \newrobustcmd*#2[1]{##1}%
  \def\@glsxtr@taggingcs{#2}%
  \renewcommand*\@glsxtr@activate@initialtagging{%
    \let#2\@glsxtr@tag
  }%
  \ifundef\@gls@preglossaryhook
  {\GlossariesExtraWarning{Initial tagging requires at least 
    glossaries.sty v4.19 to work correctly}}%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%Are we using an old version of \sty{mfirstuc} that has a bug in 
%\cs{capitalisewords}? If so, patch it so we don't have a problem
% with a combination of tagging and title case.
%\begin{macro}{\mfu@checkword@do}
%If this command hasn't been defined, then we have pre v2.02 of
%\sty{mfirstuc}
%\changes{0.5.2}{2015-12-08}{added}
%    \begin{macrocode}
\ifundef\mfu@checkword@do
{
  \newcommand*{\mfu@checkword@do}[1]{%
   \ifdefstring{\mfu@checkword@arg}{#1}%
   {%
     \let\@mfu@domakefirstuc\@firstofone
     \listbreak
   }%
   {}%
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\mfu@checkword}
% \cs{capitalisewords} was introduced in \sty{mfirstuc} v1.06.
% If \cs{mfu@checkword} hasn't been defined \sty{mfirstuc} is too
% old to support the title case attribute.
%    \begin{macrocode}
  \ifundef\mfu@checkword
  {
    \newcommand{\@glsxtr@do@titlecaps@warn}{%
     \GlossariesExtraWarning{mfirstuc.sty too old. Title Caps
      support not available}%
%    \end{macrocode}
% One warning should suffice.
%    \begin{macrocode}
      \let\@glsxtr@do@titlecaps@warn\relax
    }
  }
  {
    \renewcommand*{\mfu@checkword}[1]{%
      \def\mfu@checkword@arg{#1}%
      \let\@mfu@domakefirstuc\makefirstuc
      \forlistloop\mfu@checkword@do\@mfu@nocaplist
    }
  }
}
{}% no patch required
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@do@titlecaps@warn}
% Do warning if title case not supported.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@do@titlecaps@warn}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@activate@initialtagging}
% Used in \cs{printglossary} but at least v4.19 of \sty{glossaries}
% required.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
\newcommand*\@glsxtr@activate@initialtagging{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@tag}
%\changes{0.5.2}{2015-12-08}{new}
% Definition of tagging command when used in glossary.
%    \begin{macrocode}
\newrobustcmd*{\@glsxtr@tag}[1]{%
  \glsifattribute{\glscurrententrylabel}{tagging}{true}%
  {\glsxtrtagfont{#1}}{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtagfont}
% Used in the glossary.
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrtagfont}[1]{\underline{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@preglossaryhook}
% This macro was introduced in \sty{glossaries} version 4.19, so it
% may not be defined. If it hasn't been defined this feature is
% unavailable. A check is added for the entry's existence to prevent
% errors from occurring if the user removes an entry or changes the
% label, which can interrupt the build process.
%\changes{1.04}{2016-05-02}{added check for entry's existence}
%    \begin{macrocode}
\ifdef\@gls@preglossaryhook
{
  \renewcommand*{\@gls@preglossaryhook}{%
    \@glsxtr@activate@initialtagging
%    \end{macrocode}
%\changes{1.12}{2017-02-03}{check for definition}
%Since the glossaries are automatically scoped,
%\cs{@glsxtr@org@postdescription} shouldn't already be defined, but
%check anyway just as a precautionary measure.
%    \begin{macrocode}
    \ifundef\@glsxtr@org@postdescription
    {%
      \let\@glsxtr@org@postdescription\glspostdescription
      \renewcommand*{\glspostdescription}{%
        \ifglsentryexists{\glscurrententrylabel}%
        {%
          \glsxtrpostdescription
          \@glsxtr@org@postdescription
        }%
        {}%
      }%
    }%
    {}%
%    \end{macrocode}
%\changes{1.07}{2016-08-15}{added \cs{glossxtrsetpopts}}
%Enable the options used by \cs{@@glsxtrp}:
%    \begin{macrocode}
    \glossxtrsetpopts
  }%
}
{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostdescription}
%This command will only be used if \cs{@gls@preglossaryhook} is
%available \emph{and} the glossary style uses
%\cs{glspostdescription} without modifying it. (\cs{nopostdesc}
%will suppress this.) The \sty{glossaries-extra-stylemods} package will
%add the post description hook to all the predefined styles that
%don't include it.
%    \begin{macrocode}
\newcommand*{\glsxtrpostdescription}{%
  \csuse{glsxtrpostdesc\glscategory{\glscurrententrylabel}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostdescgeneral}
%    \begin{macrocode}
\newcommand*{\glsxtrpostdescgeneral}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostdescterm}
%This is redundant as it doesn't match any common categories.
%\cs{newterm} sets the category to index.
%    \begin{macrocode}
\newcommand*{\glsxtrpostdescterm}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostdescacronym}
%    \begin{macrocode}
\newcommand*{\glsxtrpostdescacronym}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostdescabbreviation}
%    \begin{macrocode}
\newcommand*{\glsxtrpostdescabbreviation}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsdefpostdesc}
%\changes{1.31}{2018-05-09}{new}
%Provide a convenient command for defining the post-description hook
%for the given category.
%    \begin{macrocode}
\newcommand*{\glsdefpostdesc}[2]{%
  \csdef{glsxtrpostdesc#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glspostlinkhook}
% Redefine the post link hook used by commands like \cs{gls} to
% make it easier for categories or attributes to modify this action.
% Since this hook occurs outside the existence check of commands like
% \cs{gls}, this needs to be checked again here. Do nothing if the
% entry hasn't been defined.
%\changes{0.5.4}{2015-12-15}{added existence check}
%    \begin{macrocode}
\renewcommand*{\glspostlinkhook}{%
 \ifglsentryexists{\glslabel}{\glsxtrpostlinkhook}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostlinkhook}
% The entry label should already be stored in \cs{glslabel} by
% \cs{@gls@link}.
%    \begin{macrocode}
\newcommand*{\glsxtrpostlinkhook}{%
 \glsxtrdiscardperiod{\glslabel}%
 {\glsxtrpostlinkendsentence}%
 {\glsxtrifcustomdiscardperiod
  {\glsxtrifperiod{\glsxtrpostlinkendsentence}{\glsxtrpostlink}}%
  {\glsxtrpostlink}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifcustomdiscardperiod}
%\changes{1.23}{2017-11-12}{new}
%Allow user to provide a custom check. Should expand to \verb|#2| if
%no check is required otherwise expand to \verb|#1|.
%    \begin{macrocode}
\newcommand*{\glsxtrifcustomdiscardperiod}[2]{#2}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostlink}
%    \begin{macrocode}
\newcommand*{\glsxtrpostlink}{%
 \csuse{glsxtrpostlink\glscategory{\glslabel}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsdefpostlink}
%\changes{1.31}{2018-05-09}{new}
%Provide a convenient command for defining the post-link hook
%for the given category. Doesn't allow an empty argument (which)
%would overwrite \cs{glsxtrpostlink}.
%    \begin{macrocode}
\newcommand*{\glsdefpostlink}[2]{%
%    \end{macrocode}
% \cs{ifthenelse} is used to ensure that the expanded value is 
% tested. (The category label must be fully expandable.) 
%    \begin{macrocode}
  \ifthenelse{\equal{#1}{}}%
  {\PackageError{glossaries-extra}
    {Invalid empty category label in \string\glsdefpostlink}{}}%
  {\csdef{glsxtrpostlink#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glspretopostlink}
%\changes{1.49}{2022-10-14}{new}
%Similar to the above but prepend.
%    \begin{macrocode}
\newcommand*{\glspretopostlink}[2]{%
%    \end{macrocode}
% \cs{ifthenelse} is used to ensure that the expanded value is 
% tested. (The category label must be fully expandable.) 
%    \begin{macrocode}
  \ifthenelse{\equal{#1}{}}%
  {\PackageError{glossaries-extra}
    {Invalid empty category label in \string\glspretopostlink}{}}%
  {%
    \ifcsundef{glsxtrpostlink#1}
    {\csdef{glsxtrpostlink#1}{#2}}%
    {\cspreto{glsxtrpostlink#1}{#2}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsapptopostlink}
%\changes{1.49}{2022-10-14}{new}
%Similar to the above but append.
%    \begin{macrocode}
\newcommand*{\glsapptopostlink}[2]{%
%    \end{macrocode}
% \cs{ifthenelse} is used to ensure that the expanded value is 
% tested. (The category label must be fully expandable.) 
%    \begin{macrocode}
  \ifthenelse{\equal{#1}{}}%
  {\PackageError{glossaries-extra}
    {Invalid empty category label in \string\glspretopostlink}{}}%
  {%
    \ifcsundef{glsxtrpostlink#1}
    {\csdef{glsxtrpostlink#1}{#2}}%
    {\csappto{glsxtrpostlink#1}{#2}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostlinkendsentence}
%\changes{0.3}{2015-12-02}{new}
% Done by \cs{glsxtrpostlinkhook} if a full stop is discarded.
%    \begin{macrocode}
\newcommand*{\glsxtrpostlinkendsentence}{%
 \ifcsdef{glsxtrpostlink\glscategory{\glslabel}}
 {%
   \csuse{glsxtrpostlink\glscategory{\glslabel}}%
%    \end{macrocode}
% Put the full stop back.
%    \begin{macrocode}
   .\spacefactor\sfcode`\. \relax
 }%
 {%
%    \end{macrocode}
% Assume the full stop was discarded because the entry ends with a
% period, so adjust the spacefactor.
%    \begin{macrocode}
   \spacefactor\sfcode`\. \relax
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostlinkAddDescOnFirstUse}
%\changes{0.3}{2015-12-02}{new}
% Provide a command for appending the description in parentheses on
% first use, for the convenience of users wanting to add this to the
% post link hook.
%\changes{1.25}{2017-11-24}{changed to use \cs{glsxtrparen}}
%\changes{1.49}{2022-10-14}{added inner formatting}
%    \begin{macrocode}
\newcommand*{\glsxtrpostlinkAddDescOnFirstUse}{%
  \glsxtrifwasfirstuse{\glsxtrgenentrytextfmt{ }%
   \glsxtrparen{\glsaccessfmtdesc{}{\glsxtrgenentrytextfmt}{\glslabel}}}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostlinkAddSymbolOnFirstUse}
%\changes{0.3}{2015-12-02}{new}
% Provide a command for appending the symbol (if defined) in parentheses on
% first use, for the convenience of users wanting to add this to the
% post link hook.
%\changes{1.25}{2017-11-24}{changed to use \cs{glsxtrparen}}
%\changes{1.49}{2022-10-14}{added inner formatting}
%    \begin{macrocode}
\newcommand*{\glsxtrpostlinkAddSymbolOnFirstUse}{%
  \glsxtrifwasfirstuse
  {%
    \ifglshassymbol{\glslabel}%
    {\glsxtrgenentrytextfmt{ }%
     \glsxtrparen{\glsaccessfmtsymbol{}{\glsxtrgenentrytextfmt}{\glslabel}}}%
    {}%
  }%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostlinkAddSymbolDescOnFirstUse}
%\changes{1.31}{2018-05-09}{new}
% Provide a command for appending the symbol (if defined) and
% description in parentheses on
% first use, for the convenience of users wanting to add this to the
% post link hook.
%    \begin{macrocode}
\newcommand*{\glsxtrpostlinkAddSymbolDescOnFirstUse}{%
  \glsxtrifwasfirstuse
  {%
    \glsxtrgenentrytextfmt{ }\glsxtrparen
    {%
      \ifglshassymbol{\glslabel}%
      {\glsaccessfmtsymbol{}{\glsxtrgenentrytextfmt}{\glslabel}%
       \expandafter\glsxtrgenentrytextfmt\expandafter{\glsxtrpostlinkSymbolDescSep}}%
      {}%
      \glsaccessfmtdesc{}{\glsxtrgenentrytextfmt}{\glslabel}%
    }%
  }%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostlinkSymbolDescSep}
%\changes{1.49}{2022-10-14}{new}
% Separator used in the above
%    \begin{macrocode}
\newcommand*{\glsxtrpostlinkSymbolDescSep}{, }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrdiscardperiodretainfirstuse}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrdiscardperiodretainfirstuse}[3]{%
 \glsxtrifwassubsequentorshort{\glsxtrifperiod{#2}{#3}}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrdiscardperiod}
% Discard following period (if present) if the
% \catattr{discardperiod} attribute is true. If a period is
% discarded, do the second argument otherwise do the third
% argument. The entry label is in the first argument.
% Since this is designed for abbreviations that end with a period,
% check if the plural form was used (which typically won't end with
% a period).
%\changes{0.3}{2015-12-02}{added check for plural}
%\changes{1.01}{2016-02-02}{added check for first use}
%    \begin{macrocode}
\newcommand*{\glsxtrdiscardperiod}[3]{%
 \glsifattribute{#1}{retainfirstuseperiod}{true}%
 {\glsxtrdiscardperiodretainfirstuse{#1}{#2}{#3}}%
 {%
   \glsifattribute{#1}{discardperiod}{true}%
   {%
     \glsifplural
     {%
       \glsifattribute{#1}{pluraldiscardperiod}{true}%
       {\glsxtrifperiod{#2}{#3}}%
       {#3}%
     }%
     {%
       \glsxtrifperiod{#2}{#3}%
     }%
   }%
   {#3}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifperiod}
% Make a convenient user command to check if the next character is a
% full stop (period). Works like \cs{@ifstar} but uses
% \cs{new@ifnextchar} rather than \cs{@ifnextchar}
%    \begin{macrocode}
\newcommand*{\glsxtrifperiod}[1]{\new@ifnextchar.{\@firstoftwo{#1}}}
%    \end{macrocode}
%\end{macro}
%
% Sometimes it's useful to test if there's a punctuation character
% following the glossary entry.
%\begin{macro}{\glsxtr@punclist}
% List of characters identified as punctuation marks. (Be careful of
% \sty{babel} shorthands!) This doesn't allow for punctuation marks
% made up from multiple characters (such as \verb|''|).
%    \begin{macrocode}
\newcommand*{\glsxtr@punclist}{.,:;?!}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtraddpunctuationmark}
% Add character to punctuation list.
%    \begin{macrocode}
\newcommand*{\glsxtraddpunctuationmark}[1]{\appto\glsxtr@punclist{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsetpunctuationmarks}
% Reset the punctuation list.
%    \begin{macrocode}
\newcommand*{\glsxtrsetpunctuationmarks}[1]{\def\glsxtr@punclist{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifnextpunc}
%\begin{definition}
%\cs{glsxtrifnextpunc}\marg{true part}\marg{false part}
%\end{definition}
%Test if this is followed by a punctuation mark. (Adapted from
%\cs{new@ifnextchar}.)
%    \begin{macrocode}
\newcommand*{\glsxtrifnextpunc}[2]{%
  \def\reserved@a{#1}% 
  \def\reserved@b{#2}%
  \futurelet\@glspunc@token\glsxtr@ifnextpunc
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@ifnextpunc}
%    \begin{macrocode}
\newcommand*{\glsxtr@ifnextpunc}{%
 \glsxtr@ifpunctoken{\@glspunc@token}{\let\reserved@b\reserved@a}{}%
 \reserved@b
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@ifpunctoken}
% Test if the token given in the first argument is in the
% punctuation list.
%    \begin{macrocode}
\newcommand*{\glsxtr@ifpunctoken}[1]{%
  \expandafter\@glsxtr@ifpunctoken\expandafter#1\glsxtr@punclist\@nnil
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@ifpunctoken}
%    \begin{macrocode}
\def\@glsxtr@ifpunctoken#1#2{%
  \let\reserved@d=#2%
  \ifx\reserved@d\@nnil
    \let\glsxtr@next\@glsxtr@notfoundinlist
  \else
    \ifx#1\reserved@d
     \let\glsxtr@next\@glsxtr@foundinlist
    \else
     \let\glsxtr@next\@glsxtr@ifpunctoken
    \fi
  \fi
  \glsxtr@next#1%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@foundinlist}
%    \begin{macrocode}
\def\@glsxtr@foundinlist#1\@nnil{\@firstoftwo}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@notfoundinlist}
%    \begin{macrocode}
\def\@glsxtr@notfoundinlist#1{\@secondoftwo}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrdopostpunc}
%\changes{1.49}{2022-10-14}{made robust}
%\begin{definition}
%\cs{glsxtrdopostpunc}\marg{code}
%\end{definition}
% If this is followed by a punctuation character, do \meta{code}
% after the character otherwise do \meta{code} before whatever comes
% next.
%    \begin{macrocode}
\newrobustcmd{\glsxtrdopostpunc}[1]{%
  \glsxtrifnextpunc{\@glsxtr@swaptwo{#1}}{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@swaptwo}
%    \begin{macrocode}
\newcommand{\@glsxtr@swaptwo}[2]{#2#1}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Abbreviations}
%
%The \qt{acronym} code from \sty{glossaries} is misnamed as it's more
%often used for other forms of abbreviations. This code corrects
%this inconsistency, but rather than just having synonyms, provide 
% commands for abbreviations that have a similar, but not identical,
% underlying mechanism to acronyms.
%
% If there's a style for the given category, it needs to be applied
% by \cs{newabbreviation}.
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
\define@key{glsxtrabbrv}{category}{%
 \protected@edef\glscategorylabel{#1}%
}
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{split shortplural and longplural into separate
%family}
% The shortplural and longplural are parsed separately, so are now
% in another key family.
% Save the short plural form. This may be needed before the entry is
% defined.
%    \begin{macrocode}
\define@key{glsxtrabbrvpl}{shortplural}{%
  \def\@gls@shortpl{#1}%
}
%    \end{macrocode}
% Similarly for the long plural form.
%    \begin{macrocode}
\define@key{glsxtrabbrvpl}{longplural}{%
  \def\@gls@longpl{#1}%
}
%    \end{macrocode}
%
% Token registers for the short plural and long plural, provided for
% use in the abbreviation style definitions.
%\begin{macro}{\glsshortpltok}
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
\newtoks\glsshortpltok
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslongpltok}
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
\newtoks\glslongpltok
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@insertdots}
%\changes{0.3}{2015-12-02}{new}
% Provided in case user wants to automatically insert dots between
% each letter of the abbreviation. This should be applied before
% defining the abbreviation to optimise the document build.
% (Otherwise, it would have to be done each time the short form is
% required, which is an unnecessary waste of time.) For this to work
% the short form must be expanded when passed to
% \cs{newabbreviation}. Note that explicitly using the
% \gloskey{short} or \gloskey{shortplural} keys will override this.
%    \begin{macrocode}
\newcommand*{\@glsxtr@insertdots}[2]{%
  \def#1{}%
  \@glsxtr@insert@dots#1#2\@nnil
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@insert@dots}
%    \begin{macrocode}
\newcommand*{\@glsxtr@insert@dots}[2]{%
  \ifx\@nnil#2\relax
   \let\@glsxtr@insert@dots@next\@gobble
  \else
   \ifx\relax#2\relax
   \else
     \appto#1{#2.}%
   \fi
   \let\@glsxtr@insert@dots@next\@glsxtr@insert@dots
  \fi
  \@glsxtr@insert@dots@next#1%
}
%    \end{macrocode}
%\end{macro}
%
%Similarly provide a way of replacing spaces with
%\cs{glsxtrwordsep}, which first needs to be defined:
%\begin{macro}{\glsxtrwordsep}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrwordsep}{\glsxtrgenentrytextfmt{ }}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrwordsephyphen}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrwordsephyphen}{\glsxtrgenentrytextfmt{-}}
%    \end{macrocode}
%\end{macro}
%Each word is marked with 
%\begin{macro}{\glsxtrword}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrword}[1]{\glsxtrgenentrytextfmt{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtr@markwordseps}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@markwordseps}[2]{%
  \def#1{}%
  \@glsxtr@mark@wordseps#1#2 \@nnil
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtr@mark@wordseps}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\def\@glsxtr@mark@wordseps#1#2 #3{%
  \ifdefempty{#1}%
  {\def#1{\protect\glsxtrword{#2}}}%
  {\appto#1{\protect\glsxtrwordsep\protect\glsxtrword{#2}}}%
  \ifx\@nnil#3\relax
   \let\@glsxtr@mark@wordseps@next\relax
  \else
   \def\@glsxtr@mark@wordseps@next{%
     \@glsxtr@mark@wordseps#1#3}%
  \fi
  \@glsxtr@mark@wordseps@next
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\newabbreviation}
% Define a new generic abbreviation.
%    \begin{macrocode}
\newcommand*{\newabbreviation}[4][]{%
  \glsxtr@newabbreviation{#1}{#2}{#3}{#4}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@newabbreviation}
% Internal macro. (bib2gls has an option that needs to
% temporarily redefine \cs{newabbreviation}. This is just makes
% it easier to save and restore the original definition.)
%\changes{1.12}{2017-02-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@newabbreviation}[4]{%
  \glskeylisttok{#1}%
  \glslabeltok{#2}%
  \glsshorttok{#3}%
  \glslongtok{#4}%
%    \end{macrocode}
%Save the original short and long values (before attribute settings
%modify them).
%\changes{1.17}{2017-08-09}{added \cs{glsxtrorgshort} and \cs{glsxtrorglong}}
%    \begin{macrocode}
  \def\glsxtrorgshort{#3}%
  \def\glsxtrorglong{#4}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glsxtrorgkeylist}}
%    \begin{macrocode}
  \def\glsxtrorgkeylist{#1}%
%    \end{macrocode}
%\changes{1.31}{2018-05-09}{added \cs{ExtraCustomAbbreviationFields}}
%Provide extra settings for hooks. Make sure to append a comma if
%this hook is changed.
%    \begin{macrocode}
  \def\ExtraCustomAbbreviationFields{}%
%    \end{macrocode}
%Initialise accessibility settings if required.
%    \begin{macrocode}
  \@gls@initaccesskeys
%    \end{macrocode}
% Get the category.
%\changes{0.3}{2015-12-02}{fixed family name in \cs{setkeys}}
%\changes{1.42}{2020-02-03}{moved apply abbreviation style to after category
%key has been obtained}
%    \begin{macrocode}
  \def\glscategorylabel{abbreviation}%
%    \end{macrocode}
% Ignore the shortplural and longplural keys.
%    \begin{macrocode}
  \setkeys*{glsxtrabbrv}{#1}%
%    \end{macrocode}
% Save remaining keys, just in case any hook also uses \cs{setkeys}
%    \begin{macrocode}
  \let\@glsxtrabbrv@rmkeys\XKV@rm
%    \end{macrocode}
% Set the abbreviation style.
%    \begin{macrocode}
  \ifcsdef{@glsabbrv@current@\glscategorylabel}%
  {%
%    \end{macrocode}
% Warning should already have been issued.
%    \begin{macrocode}
    \let\@glsxtr@orgwarndep\GlsXtrWarnDeprecatedAbbrStyle
    \let\GlsXtrWarnDeprecatedAbbrStyle\@gobbletwo
    \glsxtr@applyabbrvstyle{\csname @glsabbrv@current@\glscategorylabel\endcsname}%
    \let\GlsXtrWarnDeprecatedAbbrStyle\@glsxtr@orgwarndep
  }%
  {%
%    \end{macrocode}
%If no style has been associated with this category, fallback on the style
%for the \category{abbreviation} category.
%    \begin{macrocode}
    \glsxtr@applyabbrvstyle{\@glsabbrv@current@abbreviation}%
  }%
%    \end{macrocode}
% Set the default long plural
%\changes{1.49}{2022-10-14}{bug fix: markwords doesn't include plural suffix}
%    \begin{macrocode}
  \def\@gls@longpl{#4\glspluralsuffix}%
%    \end{macrocode}
% Has the \catattr{markwords} attribute been set?
%    \begin{macrocode}
  \glsifcategoryattribute{\glscategorylabel}{markwords}{true}%
  {%
    \@glsxtr@markwordseps\@gls@long{#4}%
%    \end{macrocode}
% Update \cs{glslongtok}.
%    \begin{macrocode}
    \expandafter\glslongtok\expandafter{\@gls@long}%
%    \end{macrocode}
% Mark this entry as having a description with formatting.
%    \begin{macrocode}
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
  }%
  {}%
%    \end{macrocode}
% Has the \catattr{markshortwords} attribute been set? (Not
% compatible with \catattr{insertdots}.)
%    \begin{macrocode}
  \let\@glsxtr@if@markshortwords\@secondoftwo
  \glsifcategoryattribute{\glscategorylabel}{markshortwords}{true}%
  {%
%    \end{macrocode}
% Don't mark words until the default plural has been obtained.
%    \begin{macrocode}
    \let\@glsxtr@if@markshortwords\@firstoftwo
    \def\@gls@short{#3}%
  }%
  {%
%    \end{macrocode}
% Has the \catattr{insertdots} attribute been set?
%    \begin{macrocode}
    \glsifcategoryattribute{\glscategorylabel}{insertdots}{true}%
    {%
      \@glsxtr@insertdots\@gls@short{#3}%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{relax} and updated \cs{@gls@short}
%instead of \cs{glsshorttok}}
%\changes{1.42}{2020-02-03}{replaced explicit \cs{spacefactor} with \cs{@}}
%    \begin{macrocode}
      \appto\@gls@short{\@}%
    }%
    {\def\@gls@short{#3}}%
  }%
%    \end{macrocode}
% Has the \catattr{aposplural} attribute been set? (Not compatible
% with \catattr{noshortplural}.)
%    \begin{macrocode}
  \glsifcategoryattribute{\glscategorylabel}{aposplural}{true}%
  {%
    \expandafter\def\expandafter\@gls@shortpl\expandafter{\@gls@short
      '\abbrvpluralsuffix}%
  }%
  {%
%    \end{macrocode}
% Has the \catattr{noshortplural} attribute been set?
%    \begin{macrocode}
    \glsifcategoryattribute{\glscategorylabel}{noshortplural}{true}%
    {%
      \let\@gls@shortpl\@gls@short
    }%
    {%
      \expandafter\def\expandafter\@gls@shortpl\expandafter{\@gls@short
        \abbrvpluralsuffix}%
    }%
  }%
  \@glsxtr@if@markshortwords
  {%
    \expandafter\@glsxtr@markwordseps\expandafter\@gls@short
     \expandafter{\@gls@short}%
  }%
  {}%
%    \end{macrocode}
% Update \cs{glsshorttok}:
%    \begin{macrocode}
  \expandafter\glsshorttok\expandafter{\@gls@short}%
%    \end{macrocode}
% Hook for further customisation if required:
%    \begin{macrocode}
  \glsxtrnewabbrevpresetkeyhook{#1}{#2}{#3}%
%    \end{macrocode}
% Get the short and long plurals provided by user in optional
% argument to override defaults, if necessary.
% Save the default short plural.
%    \begin{macrocode}
  \let\@gls@default@shortpl\@gls@shortpl
  \let\XKV@rm\@glsxtrabbrv@rmkeys
  \setrmkeys*{glsxtrabbrvpl}%
%    \end{macrocode}
% Update \cs{glskeylisttok} so that it only has the remaining keys.
%    \begin{macrocode}
  \expandafter\glskeylisttok\expandafter{\XKV@rm}%
%    \end{macrocode}
% Save in case required.
%    \begin{macrocode}
  \let\@gls@org@longpl\@gls@longpl
  \let\@gls@org@shortpl\@gls@shortpl
%    \end{macrocode}
% Has the \catattr{markwords} attribute been set?
%    \begin{macrocode}
  \glsifcategoryattribute{\glscategorylabel}{markwords}{true}%
  {%
    \expandafter\@glsxtr@markwordseps\expandafter\@gls@longpl\expandafter
     {\@gls@longpl}%
  }%
  {}%
%    \end{macrocode}
% Has the \catattr{markshortwords} attribute been set?
%    \begin{macrocode}
  \@glsxtr@if@markshortwords
  {%
    \expandafter\@glsxtr@markwordseps\expandafter\@gls@shortpl
     \expandafter{\@gls@shortpl}%
  }%
  {%
%    \end{macrocode}
% Has the \catattr{insertdots} attribute been set?
%    \begin{macrocode}
    \ifx\@gls@default@shortpl\@gls@shortpl
    \else
      \glsifcategoryattribute{\glscategorylabel}{insertdots}{true}%
      {%
        \expandafter\@glsxtr@insertdots\expandafter\@gls@shortpl
          \expandafter{\@gls@shortpl}%
        \appto\@gls@shortpl{\@}%
      }%
      {}%
    \fi
  }%
%    \end{macrocode}
% Set the plural token registers so the values can be accessed by
% the abbreviation styles.
%    \begin{macrocode}
  \expandafter\glsshortpltok\expandafter{\@gls@shortpl}%
  \expandafter\glslongpltok\expandafter{\@gls@longpl}%
%    \end{macrocode}
% Hook for accessibility support (does nothing if
% \sty{glossaries-accsupp} hasn't been loaded).
%    \begin{macrocode}
  \@gls@setup@default@access
%    \end{macrocode}
% Do any extra setup provided by hook:
%    \begin{macrocode}
  \newabbreviationhook
%    \end{macrocode}
% Define this entry:
%    \begin{macrocode}
  \protected@edef\@do@newglossaryentry{%
    \noexpand\newglossaryentry{\the\glslabeltok}%
    {%
      type={\glsxtrabbrvtype},%
      category={\glscategorylabel},%
      short={\the\glsshorttok},%
      shortplural={\the\glsshortpltok},%
      long={\the\glslongtok},%
      longplural={\the\glslongpltok},%
      name={\the\glsshorttok},%
      \CustomAbbreviationFields,%
%    \end{macrocode}
% Hook may override abbreviation style default settings.
%    \begin{macrocode}
      \ExtraCustomAbbreviationFields
%    \end{macrocode}
% Any explicit fields set in the optional argument override all
% other settings, except for the ones that have already been
% processed.
%    \begin{macrocode}
      \the\glskeylisttok
    }%
  }%
  \@do@newglossaryentry
%    \end{macrocode}
% Obtain the type and add it to the list of abbreviations.
%    \begin{macrocode}
  \@glsxtr@addabbreviationlist{\glsentrytype{\the\glslabeltok}}%
%    \end{macrocode}
% Exclude name, first, firstpl, text and plural fields from inner
% fmt as they include formatting commands. The description may also
% need adding, depending on the style.
%    \begin{macrocode}
  \glsexclapplyinnerfmtfield{\the\glslabeltok}{first}%
  \glsexclapplyinnerfmtfield{\the\glslabeltok}{firstpl}%
  \glsexclapplyinnerfmtfield{\the\glslabeltok}{text}%
  \glsexclapplyinnerfmtfield{\the\glslabeltok}{plural}%
  \glsexclapplyinnerfmtfield{\the\glslabeltok}{name}%
  \GlsXtrPostNewAbbreviation
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnewabbrevpresetkeyhook}
% Hook for extra stuff in \cs{newabbreviation}
%\changes{0.5.2}{2015-12-08}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrnewabbrevpresetkeyhook}[3]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrPostNewAbbreviation}
% Hook used by abbreviation styles.
%    \begin{macrocode}
\newcommand*{\GlsXtrPostNewAbbreviation}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\newabbreviationhook}
% Hook for use with \cs{newabbreviation}.
%    \begin{macrocode}
\newcommand*{\newabbreviationhook}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\CustomAbbreviationFields}
%    \begin{macrocode}
\newcommand*{\CustomAbbreviationFields}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrparen}
%\changes{1.17}{2017-08-09}{new}
%For the parenthetical styles. 
%    \begin{macrocode}
\newcommand*{\glsxtrparen}[1]{%
 \glsxtrgenentrytextfmt{(}#1\glsxtrgenentrytextfmt{)}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfullformat}
% Full format without case change.
%\changes{1.49}{2022-10-14}{added check for insert inside and inner fmt}
%    \begin{macrocode}
\newcommand*{\glsxtrfullformat}[2]{%
  \ifglsxtrinsertinside
   \glsfirstlongfont{\glsaccessfmtlong{#2}{\glsxtrgenentrytextfmt}{#1}}%
  \else
   \glsfirstlongfont{\glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{#1}}%
   \glsxtrgenentrytextfmt{#2}%
  \fi
  \glsxtrfullsep{#1}%
  \glsxtrparen{\protect\glsfirstabbrvfont
    {\glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{#1}}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrfullformat}
% Full format with case change.
%\changes{1.49}{2022-10-14}{added check for insert inside and inner fmt}
%    \begin{macrocode}
\newcommand*{\Glsxtrfullformat}[2]{%
  \ifglsxtrinsertinside
   \glsfirstlongfont{\Glsaccessfmtlong{#2}{\glsxtrgenentrytextfmt}{#1}}%
  \else
   \glsfirstlongfont{\Glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{#1}}%
   \glsxtrgenentrytextfmt{#2}%
  \fi
  \glsxtrfullsep{#1}%
  \glsxtrparen{\protect\glsfirstabbrvfont
    {\glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{#1}}}%
}
\glsmfuaddmap{\glsxtrfullformat}{\Glsxtrfullformat}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrfullformat}
% Full format with all caps.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrfullformat}[2]{%
  \ifglsxtrinsertinside
   \glsfirstlongfont{\GLSaccessfmtlong{#2}{\glsxtrgenentrytextfmt}{#1}}%
  \else
   \glsfirstlongfont{\GLSaccessfmtlong{}{\glsxtrgenentrytextfmt}{#1}}%
   \glsuppercase{\glsxtrgenentrytextfmt{#2}}%
  \fi
  \glsxtrfullsep{#1}%
  \glsxtrparen{\protect\glsfirstabbrvfont
    {\GLSaccessfmtshort{}{\glsxtrgenentrytextfmt}{#1}}}%
}
\glsmfublocker{\GLSxtrfullformat}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfullplformat}
% Plural full format without case change.
%\changes{1.49}{2022-10-14}{added check for insert inside and inner fmt}
%    \begin{macrocode}
\newcommand*{\glsxtrfullplformat}[2]{%
  \ifglsxtrinsertinside
   \glsfirstlongfont{\glsaccessfmtlongpl{#2}{\glsxtrgenentrytextfmt}{#1}}%
  \else
   \glsfirstlongfont{\glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{#1}}%
   \glsxtrgenentrytextfmt{#2}%
  \fi
  \glsxtrfullsep{#1}%
  \glsxtrparen{\protect\glsfirstabbrvfont
    {\glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{#1}}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrfullplformat}
% Plural full format with case change.
%\changes{1.49}{2022-10-14}{added check for insert inside and inner fmt}
%    \begin{macrocode}
\newcommand*{\Glsxtrfullplformat}[2]{%
  \ifglsxtrinsertinside
   \glsfirstlongfont{\Glsaccessfmtlongpl{#2}{\glsxtrgenentrytextfmt}{#1}}%
  \else
   \glsfirstlongfont{\Glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{#1}}%
   \glsxtrgenentrytextfmt{#2}%
  \fi
  \glsxtrfullsep{#1}%
  \glsxtrparen{\protect\glsfirstabbrvfont
    {\glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{#1}}}%
}
\glsmfuaddmap{\glsxtrfullplformat}{\Glsxtrfullplformat}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrfullplformat}
% Full format with all caps.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrfullplformat}[2]{%
  \ifglsxtrinsertinside
   \glsfirstlongfont{\GLSaccessfmtlongpl{#2}{\glsxtrgenentrytextfmt}{#1}}%
  \else
   \glsfirstlongfont{\GLSaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{#1}}%
   \glsuppercase{\glsxtrgenentrytextfmt{#2}}%
  \fi
  \glsxtrfullsep{#1}%
  \glsxtrparen{\protect\glsfirstabbrvfont
    {\GLSaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{#1}}}%
}
\glsmfublocker{\GLSxtrfullplformat}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtr@fullformat@fallback}
% Fallback for custom styles that don't implement all caps version.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtr@fullformat@fallback}[2]{%
  \glsuppercase{\glsxtrfullformat{##1}{##2}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtr@fullplformat@fallback}
% Fallback for custom styles that don't implement all caps version.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtr@fullplformat@fallback}[2]{%
  \glsuppercase{\glsxtrfullplformat{##1}{##2}}%
}%
%    \end{macrocode}
%\end{macro}
%
%
%\begin{macro}{\glsxtrfullsep}
% Separator used by full format is a space by default. The argument
% is the entry's label.
%\changes{1.49}{2022-10-14}{added inner fmt}
%    \begin{macrocode}
\newcommand*{\glsxtrfullsep}[1]{\glsxtrgenentrytextfmt{ }}
%    \end{macrocode}
%\end{macro}
%
% In-line formats in case first use isn't compatible with
% \cs{glsentryfull} (for example, first use suppresses the long form
% or uses a footnote).
%\begin{macro}{\glsxtrinlinefullformat}
% Full format without case change.
%    \begin{macrocode}
\newcommand*{\glsxtrinlinefullformat}{\glsxtrfullformat}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrinlinefullformat}
% Full format with case change.
%    \begin{macrocode}
\newcommand*{\Glsxtrinlinefullformat}{\Glsxtrfullformat}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrinlinefullformat}
% Full format with all caps.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrinlinefullformat}{\GLSxtrfullformat}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfullplformat}
% Plural full format without case change.
%    \begin{macrocode}
\newcommand*{\glsxtrinlinefullplformat}{\glsxtrfullplformat}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrinlinefullplformat}
% Plural full format with case change.
%    \begin{macrocode}
\newcommand*{\Glsxtrinlinefullplformat}{\Glsxtrfullplformat}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrinlinefullplformat}
% Full format with all caps.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrinlinefullplformat}{\GLSxtrfullplformat}
%    \end{macrocode}
%\end{macro}
%
% Redefine \cs{glsentryfull} etc to use the inline format.
% Since these commands are supposed to be expandable, they can only
% use the currently applied style. If there are mixed styles, you'll
% need to use the \cs{glsxtrfull} set of commands instead.
% If expandable sentence case is required, use \cs{MFUsentencecase}
% on the non-case-change version.
%\begin{macro}{\glsentryfull}
%    \begin{macrocode}
\renewcommand*{\glsentryfull}[1]{\glsxtrinlinefullformat{#1}{}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsentryfull}
%    \begin{macrocode}
\renewcommand*{\Glsentryfull}[1]{\Glsxtrinlinefullformat{#1}{}}
\glsmfuaddmap{\glsentryfull}{\Glsentryfull}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsentryfullpl}
%    \begin{macrocode}
\renewcommand*{\glsentryfullpl}[1]{\glsxtrinlinefullplformat{#1}{}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsentryfullpl}
%    \begin{macrocode}
\renewcommand*{\Glsentryfullpl}[1]{\Glsxtrinlinefullplformat{#1}{}}
\glsmfuaddmap{\glsentryfullpl}{\Glsentryfullpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfirstabbrvfont}
% Font changing command used for the abbreviation on first use or in
% the full format.
%    \begin{macrocode}
\newcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfirstinnerfmtabbrvfont}
%\changes{1.49}{2022-10-14}{new}
%Include inner formatting command.
%    \begin{macrocode}
\newrobustcmd*{\glsfirstinnerfmtabbrvfont}[1]{%
 \glsfirstabbrvfont{\glsxtrgenentrytextfmt{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfirstxpabbrvfont}
%\changes{1.49}{2022-10-14}{new}
%Expand to appropriate formatting command.
%    \begin{macrocode}
\newcommand*{\glsfirstxpabbrvfont}[2]{%
 \glsifcategoryattributetrue{#2}{markshortwords}%
 {\protect\glsfirstabbrvfont{#1}}%
 {\glsfirstinnerfmtabbrvfont{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfirstabbrvdefaultfont}
% Font changing command used for the abbreviation on first use or in
% the full format.
%\changes{0.5}{2015-12-07}{new}
%\changes{1.40}{2019-03-31}{changed definition from \cs{glsabbrvfont} to
%\cs{glsabbrvdefaultfont} for consistency}
%    \begin{macrocode}
\newcommand*{\glsfirstabbrvdefaultfont}[1]{\glsabbrvdefaultfont{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsabbrvfont}
% Font changing command used for the abbreviation on subsequent use.
% This is redefined by the abbreviation styles, as appropriate.
%    \begin{macrocode}
\newcommand*{\glsabbrvfont}[1]{\glsabbrvdefaultfont{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsinnerfmtabbrvfont}
%\changes{1.49}{2022-10-14}{new}
%Include inner formatting command.
%    \begin{macrocode}
\newrobustcmd*{\glsinnerfmtabbrvfont}[1]{%
 \glsabbrvfont{\glsxtrgenentrytextfmt{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxpabbrvfont}
%\changes{1.49}{2022-10-14}{new}
%Expand to appropriate formatting command.
%    \begin{macrocode}
\newcommand*{\glsxpabbrvfont}[2]{%
 \glsifcategoryattributetrue{#2}{markshortwords}%
 {\protect\glsabbrvfont{#1}}%
 {\glsinnerfmtabbrvfont{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsabbrvdefaultfont}
%\changes{0.3}{2015-12-02}{renamed from \cs{abbrvdefaultfont}}
%    \begin{macrocode}
\newcommand*{\glsabbrvdefaultfont}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongfont}
%\changes{1.04}{2016-05-02}{new}
% Font changing command used for the long form in commands like
% \cs{glsxtrlong}.
%    \begin{macrocode}
\newcommand*{\glslongfont}[1]{\glslongdefaultfont{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsinnerfmtlongfont}
%\changes{1.49}{2022-10-14}{new}
%Include inner formatting command.
%    \begin{macrocode}
\newrobustcmd*{\glsinnerfmtlongfont}[1]{%
 \glslongfont{\glsxtrgenentrytextfmt{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxplongfont}
%\changes{1.49}{2022-10-14}{new}
%Expand to appropriate formatting command.
%    \begin{macrocode}
\newcommand*{\glsxplongfont}[2]{%
 \glsifcategoryattributetrue{#2}{markwords}%
 {\protect\glslongfont{#1}}%
 {\glsinnerfmtlongfont{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongdefaultfont}
% Default font changing command used for the long form in commands like
%\changes{1.04}{2016-05-02}{new}
% \cs{glsxtrlong}.
%    \begin{macrocode}
\newcommand*{\glslongdefaultfont}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfirstlongfont}
% Font changing command used for the long form on first use or in
% the full format.
%    \begin{macrocode}
\newcommand*{\glsfirstlongfont}[1]{\glslongfont{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfirstinnerfmtlongfont}
%\changes{1.49}{2022-10-14}{new}
%Include inner formatting command.
%    \begin{macrocode}
\newrobustcmd*{\glsfirstinnerfmtlongfont}[1]{%
 \glsfirstlongfont{\glsxtrgenentrytextfmt{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfirstxplongfont}
%\changes{1.49}{2022-10-14}{new}
%Expand to appropriate formatting command.
%    \begin{macrocode}
\newcommand*{\glsfirstxplongfont}[2]{%
 \glsifcategoryattributetrue{#2}{markwords}%
 {\protect\glsfirstlongfont{#1}}%
 {\glsfirstinnerfmtlongfont{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfirstlongdefaultfont}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newcommand*{\glsfirstlongdefaultfont}[1]{\glslongdefaultfont{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrabbrvpluralsuffix}
% Default plural suffix.
%\changes{1.12}{2017-02-03}{new}
%Allow an alternative default suffix for abbreviations.
%\changes{2.0}{2026-03-26}{use \cs{glsacrpluralsuffix} instead of
%\cs{glspluralsuffix}}
%    \begin{macrocode}
\newcommand*{\glsxtrabbrvpluralsuffix}{\glsacrpluralsuffix}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\abbrvpluralsuffix}
% Default plural suffix.
%    \begin{macrocode}
\newcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrrevert}
%\changes{1.49}{2022-10-14}{new}
% Provide a way to counteract the abbreviation font.
%    \begin{macrocode}
\newcommand*{\glsxtrrevert}[1]{\glsxtrdefaultrevert{#1}}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrdefaultrevert}
%\changes{1.49}{2022-10-14}{new}
%The default simply does its argument.
%    \begin{macrocode}
\newcommand*{\glsxtrdefaultrevert}[1]{#1}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrfull}
% Full form (no case-change).
%    \begin{macrocode}
\newrobustcmd*{\glsxtrfull}{\@gls@hyp@opt\ns@glsxtrfull}
\newcommand*\ns@glsxtrfull[2][]{%
  \new@ifnextchar[{\@glsxtr@full{#1}{#2}}%
                  {\@glsxtr@full{#1}{#2}[]}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtr@full}
% Low-level macro:
%    \begin{macrocode}
\def\@glsxtr@full#1#2[#3]{%
  \def\glsxtrcurrentfield{}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@firstofthree
    \glsxtrfullsaveinsert{#2}{#3}%
%    \end{macrocode}
% The innertextformat support should be provided within the inline command.
%    \begin{macrocode}
    \def\glscustomtext{\glsxtrinlinefullformat{#2}{#3}}%
%    \end{macrocode}
% What should \cs{glsxtrifwasfirstuse} be set to here? Where the inline
% and display full forms are the same, this is essentially emulating
% first use, to it make sense for the postlink hook to pretend it 
% was a first use instance. It makes less sense if the inline and
% display forms are different. Provide a hook to make it easier to
% reconfigure.
%    \begin{macrocode}
    \glsxtrsetupfulldefs
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsetupfulldefs}
%    \begin{macrocode}
\newcommand*{\glsxtrsetupfulldefs}{%
  \let\glsxtrifwasfirstuse\@firstoftwo
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrfull}
% Full form (first letter uppercase).
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrfull}{\@gls@hyp@opt\ns@Glsxtrfull}
\newcommand*\ns@Glsxtrfull[2][]{%
  \new@ifnextchar[{\@Glsxtr@full{#1}{#2}}%
                  {\@Glsxtr@full{#1}{#2}[]}%
}
\glsmfuaddmap{\glsxtrfull}{\Glsxtrfull}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@Glsxtr@full}
% Low-level macro:
%    \begin{macrocode}
\def\@Glsxtr@full#1#2[#3]{%
  \def\glsxtrcurrentfield{}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@secondofthree
    \glsxtrfullsaveinsert{#2}{#3}%
%    \end{macrocode}
% The innertextformat support should be provided within the inline command.
%    \begin{macrocode}
    \def\glscustomtext{\Glsxtrinlinefullformat{#2}{#3}}%
    \glsxtrsetupfulldefs
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrfull}
% Full form (all uppercase).
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrfull}{\@gls@hyp@opt\ns@GLSxtrfull}
\newcommand*\ns@GLSxtrfull[2][]{%
  \new@ifnextchar[{\@GLSxtr@full{#1}{#2}}%
                  {\@GLSxtr@full{#1}{#2}[]}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@GLSxtr@full}
% Low-level macro:
%    \begin{macrocode}
\def\@GLSxtr@full#1#2[#3]{%
  \def\glsxtrcurrentfield{}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@thirdofthree
    \glsxtrfullsaveinsert{#2}{#3}%
%    \end{macrocode}
% The innertextformat support should be provided within the inline command.
%    \begin{macrocode}
    \def\glscustomtext{\GLSxtrinlinefullformat{#2}{#3}}%
    \glsxtrsetupfulldefs
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\glsmfublocker{\GLSxtrfull}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfullpl}
% Plural full form (no case-change).
%    \begin{macrocode}
\newrobustcmd*{\glsxtrfullpl}{\@gls@hyp@opt\ns@glsxtrfullpl}
\newcommand*\ns@glsxtrfullpl[2][]{%
  \new@ifnextchar[{\@glsxtr@fullpl{#1}{#2}}%
                  {\@glsxtr@fullpl{#1}{#2}[]}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtr@fullpl}
% Low-level macro:
%    \begin{macrocode}
\def\@glsxtr@fullpl#1#2[#3]{%
  \def\glsxtrcurrentfield{}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@firstofthree
    \glsxtrfullsaveinsert{#2}{#3}%
%    \end{macrocode}
% The innertextformat support should be provided within the inline command.
%    \begin{macrocode}
    \def\glscustomtext{\glsxtrinlinefullplformat{#2}{#3}}%
    \glsxtrsetupfulldefs
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrfullpl}
% Plural full form (first letter uppercase).
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrfullpl}{\@gls@hyp@opt\ns@Glsxtrfullpl}
\newcommand*\ns@Glsxtrfullpl[2][]{%
  \new@ifnextchar[{\@Glsxtr@fullpl{#1}{#2}}%
                  {\@Glsxtr@fullpl{#1}{#2}[]}%
}
\glsmfuaddmap{\glsxtrfullpl}{\Glsxtrfullpl}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@Glsxtr@fullpl}
% Low-level macro:
%    \begin{macrocode}
\def\@Glsxtr@fullpl#1#2[#3]{%
  \def\glsxtrcurrentfield{}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@secondofthree
    \glsxtrfullsaveinsert{#2}{#3}%
%    \end{macrocode}
% The innertextformat support should be provided within the inline command.
%    \begin{macrocode}
    \def\glscustomtext{\Glsxtrinlinefullplformat{#2}{#3}}%
    \glsxtrsetupfulldefs
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrfullpl}
% Plural full form (all upper case).
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrfullpl}{\@gls@hyp@opt\ns@GLSxtrfullpl}
\newcommand*\ns@GLSxtrfullpl[2][]{%
  \new@ifnextchar[{\@GLSxtr@fullpl{#1}{#2}}%
                  {\@GLSxtr@fullpl{#1}{#2}[]}%
}
\glsmfublocker{\GLSxtrfullpl}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@GLSxtr@fullpl}
% Low-level macro:
%    \begin{macrocode}
\def\@GLSxtr@fullpl#1#2[#3]{%
  \def\glsxtrcurrentfield{}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@thirdofthree
    \glsxtrfullsaveinsert{#2}{#3}%
%    \end{macrocode}
% The innertextformat support should be provided within the inline command.
%    \begin{macrocode}
    \def\glscustomtext{%
      \GLSxtrinlinefullplformat{#2}{#3}}%
    \glsxtrsetupfulldefs
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
% The short and long forms work in a similar way to acronyms.
%\begin{macro}{\glsxtrshort}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrshort}{\@gls@hyp@opt\ns@glsxtrshort}
%    \end{macrocode}
% Define the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\ns@glsxtrshort}[2][]{%
  \new@ifnextchar[{\@glsxtrshort{#1}{#2}}{\@glsxtrshort{#1}{#2}[]}%
}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@glsxtrshort#1#2[#3]{%
  \def\glsxtrcurrentfield{short}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
%    \end{macrocode}
% Need to make sure \cs{glsabbrvfont} is set correctly.
%    \begin{macrocode}
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@firstofthree
    \glsxtrsaveinsert{#2}{#3}%
    \def\glscustomtext{%
      \glsxtrshortformat{#2}{#3}{\glsabbrvfont}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrshort}
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrshort}{\@gls@hyp@opt\ns@Glsxtrshort}
\glsmfuaddmap{\glsxtrshort}{\Glsxtrshort}
%    \end{macrocode}
% Define the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\ns@Glsxtrshort}[2][]{%
  \new@ifnextchar[{\@Glsxtrshort{#1}{#2}}{\@Glsxtrshort{#1}{#2}[]}%
}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@Glsxtrshort#1#2[#3]{%
  \def\glsxtrcurrentfield{short}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@secondofthree
    \glsxtrsaveinsert{#2}{#3}%
    \def\glscustomtext{%
      \Glsxtrshortformat{#2}{#3}{\glsabbrvfont}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrshort}
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrshort}{\@gls@hyp@opt\ns@GLSxtrshort}
\glsmfublocker{\GLSxtrshort}
%    \end{macrocode}
% Define the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\ns@GLSxtrshort}[2][]{%
  \new@ifnextchar[{\@GLSxtrshort{#1}{#2}}{\@GLSxtrshort{#1}{#2}[]}%
}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@GLSxtrshort#1#2[#3]{%
  \def\glsxtrcurrentfield{short}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@thirdofthree
    \glsxtrsaveinsert{#2}{#3}%
    \def\glscustomtext{\GLSxtrshortformat{#2}{#3}{\glsabbrvfont}}%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsetlongfirstuse}
% Assigns \cs{glsxtrifwasfirstuse} for the long commands.
%The argument is the entry label. This now makes commands such as
%\cs{glsxtrlong} simulate first use.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glsxtrsetlongfirstuse}[1]{%
  \let\glsxtrifwasfirstuse\@firstoftwo
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrlong}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrlong}{\@gls@hyp@opt\ns@glsxtrlong}
%    \end{macrocode}
% Define the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\ns@glsxtrlong}[2][]{%
  \new@ifnextchar[{\@glsxtrlong{#1}{#2}}{\@glsxtrlong{#1}{#2}[]}%
}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@glsxtrlong#1#2[#3]{%
  \def\glsxtrcurrentfield{long}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@firstofthree
    \glsxtrsetlongfirstuse{#2}%
    \glsxtrsaveinsert{#2}{#3}%
    \def\glscustomtext{%
      \glsxtrlongformat{#2}{#3}{\glslongfont}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrlong}
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrlong}{\@gls@hyp@opt\ns@Glsxtrlong}
\glsmfuaddmap{\glsxtrlong}{\Glsxtrlong}
%    \end{macrocode}
% Define the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\ns@Glsxtrlong}[2][]{%
  \new@ifnextchar[{\@Glsxtrlong{#1}{#2}}{\@Glsxtrlong{#1}{#2}[]}%
}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@Glsxtrlong#1#2[#3]{%
  \def\glsxtrcurrentfield{long}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%\changes{1.49}{2022-10-14}{now simulates first use}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@secondofthree
    \glsxtrsetlongfirstuse{#2}%
    \glsxtrsaveinsert{#2}{#3}%
    \def\glscustomtext{%
      \Glsxtrlongformat{#2}{#3}{\glslongfont}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrlong}
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrlong}{\@gls@hyp@opt\ns@GLSxtrlong}
\glsmfublocker{\GLSxtrlong}
%    \end{macrocode}
% Define the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\ns@GLSxtrlong}[2][]{%
  \new@ifnextchar[{\@GLSxtrlong{#1}{#2}}{\@GLSxtrlong{#1}{#2}[]}%
}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@GLSxtrlong#1#2[#3]{%
  \def\glsxtrcurrentfield{long}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@thirdofthree
    \glsxtrsetlongfirstuse{#2}%
    \glsxtrsaveinsert{#2}{#3}%
    \def\glscustomtext{%
     \GLSxtrlongformat{#2}{#3}{\glslongfont}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
% Plural short forms:
%\begin{macro}{\glsxtrshortpl}
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrshortpl}{\@gls@hyp@opt\ns@glsxtrshortpl}
%    \end{macrocode}
% Define the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\ns@glsxtrshortpl}[2][]{%
  \new@ifnextchar[{\@glsxtrshortpl{#1}{#2}}{\@glsxtrshortpl{#1}{#2}[]}%
}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@glsxtrshortpl#1#2[#3]{%
  \def\glsxtrcurrentfield{short}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@firstofthree
    \glsxtrsaveinsert{#2}{#3}%
    \def\glscustomtext{%
      \glsxtrshortplformat{#2}{#3}{\glsabbrvfont}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrshortpl}
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrshortpl}{\@gls@hyp@opt\ns@Glsxtrshortpl}
\glsmfuaddmap{\glsxtrshortpl}{\Glsxtrshortpl}
%    \end{macrocode}
% Define the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\ns@Glsxtrshortpl}[2][]{%
  \new@ifnextchar[{\@Glsxtrshortpl{#1}{#2}}{\@Glsxtrshortpl{#1}{#2}[]}%
}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@Glsxtrshortpl#1#2[#3]{%
  \def\glsxtrcurrentfield{short}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@secondofthree
    \glsxtrsaveinsert{#2}{#3}%
    \def\glscustomtext{%
      \Glsxtrshortplformat{#2}{#3}{\glsabbrvfont}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrshortpl}
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrshortpl}{\@gls@hyp@opt\ns@GLSxtrshortpl}
\glsmfublocker{\GLSxtrshortpl}
%    \end{macrocode}
% Define the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\ns@GLSxtrshortpl}[2][]{%
  \new@ifnextchar[{\@GLSxtrshortpl{#1}{#2}}{\@GLSxtrshortpl{#1}{#2}[]}%
}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@GLSxtrshortpl#1#2[#3]{%
  \def\glsxtrcurrentfield{short}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@thirdofthree
    \glsxtrsaveinsert{#2}{#3}%
    \def\glscustomtext{%
        \GLSxtrshortplformat{#2}{#3}{\glsabbrvfont}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
% Plural long forms:
%\begin{macro}{\glsxtrlongpl}
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrlongpl}{\@gls@hyp@opt\ns@glsxtrlongpl}
%    \end{macrocode}
% Define the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\ns@glsxtrlongpl}[2][]{%
  \new@ifnextchar[{\@glsxtrlongpl{#1}{#2}}{\@glsxtrlongpl{#1}{#2}[]}%
}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@glsxtrlongpl#1#2[#3]{%
  \def\glsxtrcurrentfield{long}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@firstofthree
    \glsxtrsetlongfirstuse{#2}%
    \glsxtrsaveinsert{#2}{#3}%
    \def\glscustomtext{%
      \glsxtrlongplformat{#2}{#3}{\glslongfont}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrlongpl}
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrlongpl}{\@gls@hyp@opt\ns@Glsxtrlongpl}
\glsmfuaddmap{\glsxtrlongpl}{\Glsxtrlongpl}
%    \end{macrocode}
% Define the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\ns@Glsxtrlongpl}[2][]{%
  \new@ifnextchar[{\@Glsxtrlongpl{#1}{#2}}{\@Glsxtrlongpl{#1}{#2}[]}%
}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@Glsxtrlongpl#1#2[#3]{%
  \def\glsxtrcurrentfield{long}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@secondofthree
    \glsxtrsetlongfirstuse{#2}%
    \glsxtrsaveinsert{#2}{#3}%
    \def\glscustomtext{%
      \Glsxtrlongplformat{#2}{#3}{\glslongfont}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrlongpl}
%\changes{0.3}{2015-12-02}{new}
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrlongpl}{\@gls@hyp@opt\ns@GLSxtrlongpl}
\glsmfublocker{\GLSxtrlongpl}
%    \end{macrocode}
% Define the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\ns@GLSxtrlongpl}[2][]{%
  \new@ifnextchar[{\@GLSxtrlongpl{#1}{#2}}{\@GLSxtrlongpl{#1}{#2}[]}%
}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@GLSxtrlongpl#1#2[#3]{%
  \def\glsxtrcurrentfield{long}%
%    \end{macrocode}
%If the \pkgopt{record} option has been used, the information needs
%to be written to the aux file regardless of whether the entry
%exists (unless indexing has been switched off).
%\changes{1.30}{2018-04-25}{added \cs{@glsxtr@record}}
%    \begin{macrocode}
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasglslike\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@thirdofthree
    \glsxtrsetlongfirstuse{#2}%
    \glsxtrsaveinsert{#2}{#3}%
    \def\glscustomtext{%
        \GLSxtrlongplformat{#2}{#3}{\glslongfont}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glssetabbrvfmt}
% Set the current format for the given category (or the
% \category{abbreviation} category if unset).
%    \begin{macrocode}
\newcommand*{\glssetabbrvfmt}[1]{%
  \ifcsdef{@glsabbrv@current@#1}%
  {\glsxtr@applyabbrvfmt{\csname @glsabbrv@current@#1\endcsname}}%
  {\glsxtr@applyabbrvfmt{\@glsabbrv@current@abbreviation}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsuseabbrvfont}
% Provide a way to use the abbreviation font for a given category
% for arbitrary text.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsuseabbrvfont}[2]{{\glssetabbrvfmt{#2}\glsabbrvfont{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsuselongfont}
% Provide a way to use the long font for a given category
% for arbitrary text.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsuselongfont}[2]{{\glssetabbrvfmt{#2}\glslongfont{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\changes{0.5.2}{2015-12-08}{removed \cs{glsxtrabbrvfmt}}
%\begin{macro}{\glsxtrgenabbrvfmt}
% Similar to \cs{glsgenacfmt}, but for abbreviations.
%\changes{1.17}{2017-08-09}{added check for \cs{ifglsxtrinsertinside}}
% The expansion is to ensure that \cs{glsinsert} is expanded before being 
% passed to \cs{glsfmtfield} etc in the event that an inner command
% is being used (which typically signifies a complex formatting command
% such as those provided by \sty{soul}).
%    \begin{macrocode}
\newcommand*{\glsxtrgenabbrvfmt}{%
  \ifdefempty\glscustomtext
  {%
    \ifglsused\glslabel
    {%
%    \end{macrocode}
% Subsequent use:
%    \begin{macrocode}
      \glsifplural
      {%
%    \end{macrocode}
% Subsequent plural form:
%    \begin{macrocode}
        \glscapscase
        {%
%    \end{macrocode}
% Subsequent plural form, don't adjust case:
%    \begin{macrocode}
          \expandafter\glsxtrsubsequentplfmt\expandafter\glslabel
            \expandafter{\glsinsert}%
        }%
        {%
%    \end{macrocode}
% Subsequent plural form, make first letter upper case:
%    \begin{macrocode}
          \expandafter\Glsxtrsubsequentplfmt\expandafter\glslabel
            \expandafter{\glsinsert}%
        }%
        {%
%    \end{macrocode}
% Subsequent plural form, all caps:
%    \begin{macrocode}
          \expandafter\GLSxtrsubsequentplfmt\expandafter\glslabel
            \expandafter{\glsinsert}%
        }%
      }%
      {%
%    \end{macrocode}
% Subsequent singular form
%    \begin{macrocode}
        \glscapscase
        {%
%    \end{macrocode}
% Subsequent singular form, don't adjust case:
%    \begin{macrocode}
          \expandafter\glsxtrsubsequentfmt\expandafter\glslabel
            \expandafter{\glsinsert}%
        }%
        {%
%    \end{macrocode}
% Subsequent singular form, make first letter upper case:
%    \begin{macrocode}
          \expandafter\Glsxtrsubsequentfmt\expandafter
            \glslabel\expandafter{\glsinsert}%
        }%
        {%
%    \end{macrocode}
% Subsequent singular form, all caps:
%    \begin{macrocode}
          \expandafter\GLSxtrsubsequentfmt\expandafter
            \glslabel\expandafter{\glsinsert}%
        }%
      }%
    }%
    {%
%    \end{macrocode}
% First use:
%    \begin{macrocode}
      \glsifplural
      {%
%    \end{macrocode}
% First use plural form:
%    \begin{macrocode}
        \glscapscase
        {%
%    \end{macrocode}
% First use plural form, don't adjust case:
%    \begin{macrocode}
          \expandafter\glsxtrfullplformat\expandafter\glslabel
            \expandafter{\glsinsert}%
        }%
        {%
%    \end{macrocode}
% First use plural form, make first letter upper case:
%    \begin{macrocode}
          \expandafter\Glsxtrfullplformat\expandafter\glslabel
            \expandafter{\glsinsert}%
        }%
        {%
%    \end{macrocode}
% First use plural form, all caps:
%    \begin{macrocode}
          \expandafter\GLSxtrfullplformat\expandafter\glslabel
            \expandafter{\glsinsert}%
        }%
      }%
      {%
%    \end{macrocode}
% First use singular form
%    \begin{macrocode}
        \glscapscase
        {%
%    \end{macrocode}
% First use singular form, don't adjust case:
%    \begin{macrocode}
          \expandafter\glsxtrfullformat\expandafter\glslabel
            \expandafter{\glsinsert}%
        }%
        {%
%    \end{macrocode}
% First use singular form, make first letter upper case:
%    \begin{macrocode}
          \expandafter\Glsxtrfullformat\expandafter\glslabel
           \expandafter{\glsinsert}%
        }%
        {%
%    \end{macrocode}
% First use singular form, all caps:
%    \begin{macrocode}
          \expandafter\GLSxtrfullformat\expandafter\glslabel
           \expandafter{\glsinsert}%
        }%
      }%
    }%
  }%
  {%
%    \end{macrocode}
% Custom text provided in \cs{glsdisp}. (The insert is most likely
% to be empty at this point.) Any inner formatting can be supplied with the custom
% text.
%    \begin{macrocode}
    \glscustomtext
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsubsequentfmt}
% Subsequent use format (singular no case change).
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrsubsequentfmt}[2]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      \glsabbrvfont{\glsaccessshort{#1}\glsxtrgenentrytextfmt{#2}}%
    \else
      \glsabbrvfont{\glsaccessshort{#1}}\glsxtrgenentrytextfmt{#2}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
     \glsabbrvfont{\glsaccessfmtshort{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
     \glsabbrvfont{\glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{#1}}%
     \glsxtrgenentrytextfmt{#2}%
    \fi
  }%
}
\let\glsxtrdefaultsubsequentfmt\glsxtrsubsequentfmt
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsubsequentplfmt}
% Subsequent use format (plural no case change).
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrsubsequentplfmt}[2]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      \glsabbrvfont{\glsaccessshortpl{#1}\glsxtrgenentrytextfmt{#2}}%
    \else
      \glsabbrvfont{\glsaccessshortpl{#1}}\glsxtrgenentrytextfmt{#2}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
     \glsabbrvfont{\glsaccessfmtshortpl{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
     \glsabbrvfont{\glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{#1}}%
     \glsxtrgenentrytextfmt{#2}%
    \fi
  }%
}
\let\glsxtrdefaultsubsequentplfmt\glsxtrsubsequentplfmt
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrsubsequentfmt}
% Subsequent use format (singular, first letter uppercase).
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrsubsequentfmt}[2]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      \glsabbrvfont{\Glsaccessshort{#1}\glsxtrgenentrytextfmt{#2}}%
    \else
      \glsabbrvfont{\Glsaccessshort{#1}}\glsxtrgenentrytextfmt{#2}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
     \glsabbrvfont{\Glsaccessfmtshort{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
     \glsabbrvfont{\Glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{#1}}%
     \glsxtrgenentrytextfmt{#2}%
    \fi
  }%
}
\let\Glsxtrdefaultsubsequentfmt\Glsxtrsubsequentfmt
\glsmfuaddmap{\glsxtrsubsequentfmt}{\Glsxtrsubsequentfmt}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrsubsequentplfmt}
% Subsequent use format (plural, first letter uppercase).
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrsubsequentplfmt}[2]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      \glsabbrvfont{\Glsaccessshortpl{#1}\glsxtrgenentrytextfmt{#2}}%
    \else
      \glsabbrvfont{\Glsaccessshortpl{#1}}\glsxtrgenentrytextfmt{#2}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
     \glsabbrvfont{\Glsaccessfmtshortpl{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
     \glsabbrvfont{\Glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{#1}}%
     \glsxtrgenentrytextfmt{#2}%
    \fi
  }%
}
\let\Glsxtrdefaultsubsequentplfmt\Glsxtrsubsequentplfmt
\glsmfuaddmap{\glsxtrsubsequentplfmt}{\Glsxtrsubsequentplfmt}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrsubsequentfmt}
% Subsequent use format (singular, all caps).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrsubsequentfmt}[2]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      \glsabbrvfont{\GLSaccessshort{#1}%
        \glsuppercase{\glsxtrgenentrytextfmt{#2}}}%
    \else
      \glsabbrvfont{\GLSaccessshort{#1}}%
        \glsuppercase{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
     \glsabbrvfont{\GLSaccessfmtshort{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
     \glsabbrvfont{\GLSaccessfmtshort{}{\glsxtrgenentrytextfmt}{#1}}%
     \glsuppercase{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}
\glsmfublocker{\GLSxtrsubsequentfmt}
\let\GLSxtrdefaultsubsequentfmt\GLSxtrsubsequentfmt
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrsubsequentplfmt}
% Subsequent use format (plural, all caps).
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrsubsequentplfmt}[2]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      \glsabbrvfont{\GLSaccessshortpl{#1}%
       \glsuppercase{\glsxtrgenentrytextfmt{#2}}}%
    \else
      \glsabbrvfont{\GLSaccessshortpl{#1}}%
       \glsuppercase{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
     \glsabbrvfont{\GLSaccessfmtshortpl{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
     \glsabbrvfont{\GLSaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{#1}}%
     \glsuppercase{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}
\glsmfublocker{\GLSxtrsubsequentplfmt}
\let\GLSxtrdefaultsubsequentplfmt\GLSxtrsubsequentplfmt
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Abbreviation Styles Setup}
%
%\begin{macro}{\setabbreviationstyle}
%    \begin{macrocode}
\newcommand*{\setabbreviationstyle}[2][abbreviation]{%
  \ifcsundef{@glsabbrv@dispstyle@setup@#2}
  {%
    \PackageError{glossaries-extra}{Undefined abbreviation style `#2'}{}%
  }%
  {%
%    \end{macrocode}
% Have abbreviations already been defined for this category?
%\changes{0.5.2}{2015-12-08}{added check for post-definition style switch}
%    \begin{macrocode}
     \ifcsstring{@glsabbrv@current@#1}{#2}%
     {%
%    \end{macrocode}
% Style already set.
%    \begin{macrocode}
     }%
     {%
       \def\@glsxtr@dostylewarn{}%
       \glsforeachincategory{#1}{\@gls@type}{\@gls@label}%
       {%
         \def\@glsxtr@dostylewarn{\GlossariesWarning{Abbreviation
           style has been switched \MessageBreak
           for category `#1', \MessageBreak
           but there have already been entries \MessageBreak
           defined for this category. Unwanted \MessageBreak
           side-effects may result}}%
         \@endfortrue
       }%
       \@glsxtr@dostylewarn
%    \end{macrocode}
% Set up the style for the given category.
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
       \csdef{@glsabbrv@current@#1}{#2}%
       \protected@edef\glscategorylabel{#1}%
       \glsxtr@applyabbrvstyle{#2}%
     }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@applyabbrvstyle}
% Apply the abbreviation style without existence check.
%    \begin{macrocode}
\newcommand*{\glsxtr@applyabbrvstyle}[1]{%
  \csuse{@glsabbrv@dispstyle@setup@#1}%
  \csuse{@glsabbrv@dispstyle@fmts@#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@applyabbrvfmt}
% Only apply the style formats.
%    \begin{macrocode}
\newcommand*{\glsxtr@applyabbrvfmt}[1]{%
  \csuse{@glsabbrv@dispstyle@fmts@#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsetcomplexstyle}
%\changes{1.49}{2022-10-14}{new}
%Identify an entry as having a complex abbreviation style that
%doesn't work with \cs{GLSfirst} etc. The argument is the entry
%label. The second argument should be numeric: 1 (all caps doesn't
%work), 2 (all caps and insert don't work), 3 (insert doesn't work).
%    \begin{macrocode}
\newcommand*{\glsxtrsetcomplexstyle}[2]{%
  \csdef{@glsxtr@has@complexstyle@#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@do@ifcomplexstyle@allcaps}
%\changes{1.49}{2022-10-14}{new}
%Do second argument if entry identified by first argument has a
%problem with all caps. Does nothing otherwise.
%    \begin{macrocode}
\newcommand*{\glsxtr@do@ifcomplexstyle@allcaps}[2]{%
  \ifcsdef{@glsxtr@has@complexstyle@#1}%
  {%
    \ifnum\csuse{@glsxtr@has@complexstyle@#1}<1 
    \else
     \ifnum\csuse{@glsxtr@has@complexstyle@#1}<3 
       #2%
     \fi
    \fi
  }%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@do@ifcomplexstyle@insert}
%\changes{1.49}{2022-10-14}{new}
%Do second argument if entry identified by first argument has a
%problem with the insert argument. Does nothing otherwise.
%    \begin{macrocode}
\newcommand*{\glsxtr@do@ifcomplexstyle@insert}[2]{%
  \ifcsdef{@glsxtr@has@complexstyle@#1}%
  {%
    \ifnum\csuse{@glsxtr@has@complexstyle@#1}<2 
    \else
      #2%
    \fi
  }%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlossariesAbbrStyleTooComplexWarning}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GlossariesAbbrStyleTooComplexWarning}[2]{%
  \GlossariesExtraWarning{Abbreviation style used by `#1' too complex #2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@check@complexstyle}
%\changes{1.49}{2022-10-14}{new}
%The first argument is the label the second is the insert.
%    \begin{macrocode}
\newcommand*{\glsxtr@check@complexstyle}[2]{%
  \ifx\glscapscase\@thirdofthree
  \glsxtr@do@ifcomplexstyle@allcaps{#1}%
  {%
    \glsxtrifwasfirstuse
    {%
      \glsifplural
      {%
        \GlossariesAbbrStyleTooComplexWarning{#1}{for \string\GLSfirstplural.
          Use \string\GLSpl{#1} or \string\GLSxtrfullpl{#1} instead.
          Switching off all-caps%
        }%
      }%
      {%
        \GlossariesAbbrStyleTooComplexWarning{#1}{for \string\GLSfirst.
          Use \string\GLS{#1} or \string\GLSxtrfull{#1} instead.
          Switching off all-caps%
        }%
      }%
    }%
    {%
      \glsifplural
      {%
         \GlossariesAbbrStyleTooComplexWarning{#1}{for \string\GLSplural.
           Use \string\GLSpl{#1} or \string\GLSxtrshortpl{#1} instead.
           Switching off all-caps%
         }%
      }%
      {%
         \GlossariesAbbrStyleTooComplexWarning{#1}{for \string\GLStext.
           Use \string\GLS{#1} or \string\GLSxtrshort{#1} instead.
           Switching off all-caps%
         }%
      }%
    }%
    \let\glscapscase\@firstofthree
  }%
  \fi
  \ifstrempty{#2}{}%
  {%
    \glsxtr@do@ifcomplexstyle@insert{#1}%
    {%
      \GlossariesAbbrStyleTooComplexWarning{#1}%
      {to support insert argument with commands like \string\glsfirst\space or
       \string\glstext. Unexpected results may occur. Use commands
       like \string\gls\space or \string\glsxtrshort\space instead}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\newabbreviationstyle}
% This is different from \cs{newacronymstyle}. The first argument is
% the label, the second argument sets the information required when
% defining the new abbreviation and the third argument sets the
% commands used to display the full format.
%\changes{1.04}{2016-05-02}{bug fix: corrected test for existence}
%    \begin{macrocode}
\newcommand*{\newabbreviationstyle}[3]{%
  \ifcsdef{@glsabbrv@dispstyle@setup@#1}
  {%
    \PackageError{glossaries-extra}{Abbreviation style `#1' already
     defined}{}%
  }%
  {%
    \csdef{@glsabbrv@dispstyle@setup@#1}{%
%    \end{macrocode}
% Initialise hook to do nothing. The style may change this.
%    \begin{macrocode}
     \renewcommand*{\GlsXtrPostNewAbbreviation}{}%
     #2}%
    \csdef{@glsabbrv@dispstyle@fmts@#1}{%
%    \end{macrocode}
% Assume in-line form is the same as first use. The style may change
% this.
%    \begin{macrocode}
    \renewcommand*{\glsxtrinlinefullformat}{\glsxtrfullformat}%
    \renewcommand*{\Glsxtrinlinefullformat}{\Glsxtrfullformat}%
    \renewcommand*{\GLSxtrinlinefullformat}{\GLSxtrfullformat}%
    \renewcommand*{\glsxtrinlinefullplformat}{\glsxtrfullplformat}%
    \renewcommand*{\Glsxtrinlinefullplformat}{\Glsxtrfullplformat}%
    \renewcommand*{\GLSxtrinlinefullplformat}{\GLSxtrfullplformat}%
%    \end{macrocode}
%In the event that some custom styles predate the introduction of
%the all caps versions, provide default definitions:
%    \begin{macrocode}
    \renewcommand*{\GLSxtrfullformat}{\GLSxtr@fullformat@fallback}%
    \renewcommand*{\GLSxtrfullplformat}{\GLSxtr@fullplformat@fallback}%
%    \end{macrocode}
% Reset \cs{glsxtrsubsequentfmt} etc in case a style changes this.
%    \begin{macrocode}
    \let\glsxtrsubsequentfmt\glsxtrdefaultsubsequentfmt
    \let\glsxtrsubsequentplfmt\glsxtrdefaultsubsequentplfmt
    \let\Glsxtrsubsequentfmt\Glsxtrdefaultsubsequentfmt
    \let\Glsxtrsubsequentplfmt\Glsxtrdefaultsubsequentplfmt
    \let\GLSxtrsubsequentfmt\GLSxtrdefaultsubsequentfmt
    \let\GLSxtrsubsequentplfmt\GLSxtrdefaultsubsequentplfmt
    #3}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\renewabbreviationstyle}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\renewabbreviationstyle}[3]{%
  \ifcsundef{@glsabbrv@dispstyle@setup@#1}
  {%
    \PackageError{glossaries-extra}{Abbreviation style `#1' not defined}{}%
  }%
  {%
    \csdef{@glsabbrv@dispstyle@setup@#1}{%
%    \end{macrocode}
% Initialise hook to do nothing. The style may change this.
%    \begin{macrocode}
     \renewcommand*{\GlsXtrPostNewAbbreviation}{}%
     #2}%
    \csdef{@glsabbrv@dispstyle@fmts@#1}{%
%    \end{macrocode}
% Assume in-line form is the same as first use. The style may change
% this.
%    \begin{macrocode}
    \renewcommand*{\glsxtrinlinefullformat}{\glsxtrfullformat}%
    \renewcommand*{\Glsxtrinlinefullformat}{\Glsxtrfullformat}%
    \renewcommand*{\GLSxtrinlinefullformat}{\GLSxtrfullformat}%
    \renewcommand*{\glsxtrinlinefullplformat}{\glsxtrfullplformat}%
    \renewcommand*{\Glsxtrinlinefullplformat}{\Glsxtrfullplformat}%
    \renewcommand*{\GLSxtrinlinefullplformat}{\GLSxtrfullplformat}%
%    \end{macrocode}
%In the event that some custom styles predate the introduction of
%the all caps versions, provide default definitions:
%    \begin{macrocode}
    \renewcommand*{\GLSxtrfullformat}{\GLSxtr@fullformat@fallback}%
    \renewcommand*{\GLSxtrfullplformat}{\GLSxtr@fullplformat@fallback}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{reset subsequent fmts}
% Reset \cs{glsxtrsubsequentfmt} etc in case a style changes this.
%    \begin{macrocode}
    \let\glsxtrsubsequentfmt\glsxtrdefaultsubsequentfmt
    \let\glsxtrsubsequentplfmt\glsxtrdefaultsubsequentplfmt
    \let\Glsxtrsubsequentfmt\Glsxtrdefaultsubsequentfmt
    \let\Glsxtrsubsequentplfmt\Glsxtrdefaultsubsequentplfmt
    \let\GLSxtrsubsequentfmt\GLSxtrdefaultsubsequentfmt
    \let\GLSxtrsubsequentplfmt\GLSxtrdefaultsubsequentplfmt
    #3}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\letabbreviationstyle}
%\changes{1.04}{2016-05-02}{new}
% Define a synonym for an abbreviation style. The first argument is
% the new name. The second argument is the original style's name.
%    \begin{macrocode}
\newcommand*{\letabbreviationstyle}[2]{%
  \csletcs{@glsabbrv@dispstyle@setup@#1}{@glsabbrv@dispstyle@setup@#2}%
  \csletcs{@glsabbrv@dispstyle@fmts@#1}{@glsabbrv@dispstyle@fmts@#2}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsxtr@deprecated@abbrstyle}
%\changes{1.04}{2016-05-02}{new}
%\begin{definition}
%\cs{@glsxtr@deprecated@abbrstyle}\marg{old-name}\marg{new-name}
%\end{definition}
% Define a synonym for a deprecated abbreviation style.
%    \begin{macrocode}
\newcommand*{\@glsxtr@deprecated@abbrstyle}[2]{%
  \csdef{@glsabbrv@dispstyle@setup@#1}{%
    \GlsXtrWarnDeprecatedAbbrStyle{#1}{#2}%
    \csuse{@glsabbrv@dispstyle@setup@#2}%
  }%
  \csletcs{@glsabbrv@dispstyle@fmts@#1}{@glsabbrv@dispstyle@fmts@#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrWarnDeprecatedAbbrStyle}
%Generate warning for deprecated style use.
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrWarnDeprecatedAbbrStyle}[2]{%
  \GlossariesExtraWarning{Deprecated abbreviation style name `#1',
  use `#2' instead}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrUseAbbrStyleSetup}
%    \begin{macrocode}
\newcommand*{\GlsXtrUseAbbrStyleSetup}[1]{%
  \ifcsundef{@glsabbrv@dispstyle@setup@#1}%
  {%
     \PackageError{glossaries-extra}%
     {Unknown abbreviation style definitions `#1'}{}%
  }%
  {%
     \csname @glsabbrv@dispstyle@setup@#1\endcsname
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrUseAbbrStyleFmts}
%    \begin{macrocode}
\newcommand*{\GlsXtrUseAbbrStyleFmts}[1]{%
  \ifcsundef{@glsabbrv@dispstyle@fmts@#1}%
  {%
     \PackageError{glossaries-extra}%
     {Unknown abbreviation style formats `#1'}{}%
  }%
  {%
     \csname @glsabbrv@dispstyle@fmts@#1\endcsname
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Predefined Styles}
% Define some common styles. These will set the \gloskey{first},
% \gloskey{firstplural}, \gloskey{text} and \gloskey{plural}
% keys, even if the \catattr{regular} attribute isn't set to
% \qt{true}. If this attribute is set, commands like \cs{gls} will
% use them as per a regular entry, otherwise those keys will be
% ignored unless explicitly invoked by the user with commands like
% \cs{glsfirst}. In order for the sentence case versions to
% work correctly, \cs{glsxtrfullformat} needs to be expanded when
% those keys are set. The final optional argument of \cs{glsfirst}
% will behave differently to the final optional argument of \cs{gls}
% with some styles.
%
%v1.49 has introduced innertextformat for formatting commands that
%need access to the actual text (which is normally too deeply
%embedded). The styles have been modified to allow for this. The all
%caps versions also now need to be implemented within the styles as
%again the text is now to deeply embedded for the case change to
%otherwise work.
%
%\begin{macro}{\ifglsxtrinsertinside}
%\changes{1.02}{2016-04-25}{new}
% Switch to determine if the insert text should be inside or outside
% the font changing command. The default is outside.
%    \begin{macrocode}
\newif\ifglsxtrinsertinside
\glsxtrinsertinsidefalse
%    \end{macrocode}
%\end{macro}
%The abbreviation styles are now defined in the file
%\texttt{glossaries-extra-abbrstyles.def}, which needs to be input
%here:
%    \begin{macrocode}
\input{glossaries-extra-abbrstyles.def}
%    \end{macrocode}
%
%\subsection{Using Entries in Headings}
%
% There are four main problems with using entries in sectioning
% commands: they can mess with the first use flag if they end up in
% the table of contents, they can add unwanted numbers to the
% entry's location list, the label is corrupted if used inside
% \cs{MakeUppercase} (which is used by the default headings style)
% and they need to be expandable for PDF bookmarks. The
% \sty{glossaries} package therefore recommends the use of the
% expandable commands, such as \cs{glsentryshort}, instead but this
% doesn't reflect the formatting since it doesn't include
% \cs{glsabbrvfont}. The commands below are an attempt to get around
% these problems.
%
% The PDF bookmark issue can easily be fixed with \sty{hyperref}'s
% \cs{texorpdfstring} which can simply use the expandable command
% in the PDF string case. The \TeX\ string case can now use
% \cs{glsxtrshort} with the \gloskey[glslink]{noindex} key set, which
% prevents the unwanted additions to the location list, and the
% \gloskey[glslink]{hyper} key set to false, which prevents the problem of
% nested links. This just leaves one thing left that needs to be
% dealt with, and that's what to do if the heading style 
% uses \cs{MakeUppercase}.
%
% Note that \sty{glossaries} automatically loads \sty{textcase}
% unless \sty{mfirstuc} 2.08+ is detected, so
% the label can be protected from case change with \sty{textcase}'s
% \cs{NoCaseChange}. This means that we don't have a problem
% provided the page style uses \cs{MakeTextUppercase}, but the
% default heading page style uses \cs{MakeUppercase}. (With newer
% versions of \sty{mfirstuc}, exclusions are used to protect labels).
%
% To get around this, save the original definition of \cs{markboth}
% and \cs{markright} and adjust it so that \cs{MakeUppercase} is
% temporarily redefined to \cs{MakeTextUppercase}. Some packages or
% classes redefine these commands, so we can't just assume they
% still have the original kernel definition. This only needs to be
% done with old versions of \sty{mfirstuc}.
%
%\begin{macro}{\markright}
% Save original definition:
%    \begin{macrocode}
\let\@glsxtr@org@markright\markright
%    \end{macrocode}
% Redefine (grouping not added in case it interferes with the
% original code):
%    \begin{macrocode}
\renewcommand*{\markright}[1]{%
 \glsxtrmarkhook
 \@glsxtr@org@markright{\@glsxtrinmark#1\@glsxtrnotinmark}%
 \glsxtrrestoremarkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\markboth}
% Save original definition:
%    \begin{macrocode}
\let\@glsxtr@org@markboth\markboth
%    \end{macrocode}
% Redefine (grouping not added in case it interferes with the
% original code):
%    \begin{macrocode}
\renewcommand*{\markboth}[2]{%
 \glsxtrmarkhook
 \@glsxtr@org@markboth
   {\@glsxtrinmark#1\@glsxtrnotinmark}%
   {\@glsxtrinmark#2\@glsxtrnotinmark}%
 \glsxtrrestoremarkhook
}
%    \end{macrocode}
%\end{macro}
%
%Also do this for \cs{@starttoc}
%\begin{macro}{\@starttoc}
% Save original definition:
%    \begin{macrocode}
\let\@glsxtr@org@@starttoc\@starttoc
%    \end{macrocode}
% Redefine:
%    \begin{macrocode}
\renewcommand*{\@starttoc}[1]{%
 \let\glsxtrifintoc\@firstoftwo
 \glsxtrmarkhook
 \@glsxtrinmark
 \@glsxtr@org@@starttoc{#1}%
 \@glsxtrnotinmark
 \glsxtrrestoremarkhook
 \let\glsxtrifintoc\@secondoftwo
}
%    \end{macrocode}
%\end{macro}
%
% If this causes a problem provide a simple way of switching back to
% the original definitions:
%\begin{macro}{\glsxtrRevertMarks}
%    \begin{macrocode}
\newcommand*{\glsxtrRevertMarks}{%
  \let\markright\@glsxtr@org@markright
  \let\markboth\@glsxtr@org@markboth
  \let\@starttoc\@glsxtr@org@@starttoc
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrRevertTocMarks}
%\changes{1.31}{2018-05-09}{new}
%Just restores \cs{@starttoc}.
%    \begin{macrocode}
\newcommand*{\glsxtrRevertTocMarks}{%
  \let\@starttoc\@glsxtr@org@@starttoc
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifinmark}
%\changes{1.07}{2016-08-15}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrifinmark}[2]{#2}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrinmark}
%\changes{1.07}{2016-08-15}{new}
%    \begin{macrocode}
\newrobustcmd*{\@glsxtrinmark}{%
  \let\glsxtrifinmark\@firstoftwo
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrnotinmark}
%\changes{1.07}{2016-08-15}{new}
%    \begin{macrocode}
\newrobustcmd*{\@glsxtrnotinmark}{%
  \let\glsxtrifinmark\@secondoftwo
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtitleorpdforheading}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrtitleorpdforheading}[3]{%
 \glsxtrifinmark{#3}{\glstexorpdfstring{#1}{#2}}}
%    \end{macrocode}
%\end{macro}
%
%\changes{1.49}{2022-10-14}{add gettitlestring patch for \cs{glsxtrtitleorpdforheading}}
%This will require \verb|\GetTitleStringSetup{expand}| to work.
%    \begin{macrocode}
\ifdef\GetTitleStringDisableCommands
{\GetTitleStringDisableCommands{\let\glsxtrtitleorpdforheading\@thirdofthree
   \let\glsxtrifinmark\@firstoftwo}}
{}
%    \end{macrocode}
%
%\begin{macro}{\glsxtrmarkhook}
% Hook used in new definition of \cs{markboth} and \cs{markright}
% to make some changes to apply to the marks:
%    \begin{macrocode}
\newcommand*{\glsxtrmarkhook}{%
%    \end{macrocode}
% Save current definitions:
%    \begin{macrocode}
  \@glsxtr@saveMakeUppercase
  \let\@glsxtr@org@glsxtrtitleorpdforheading\glsxtrtitleorpdforheading
  \let\@glsxtr@org@glsxtrtitleshort\glsxtrtitleshort
  \let\@glsxtr@org@glsxtrtitleshortpl\glsxtrtitleshortpl
  \let\@glsxtr@org@Glsxtrtitleshort\Glsxtrtitleshort
  \let\@glsxtr@org@Glsxtrtitleshortpl\Glsxtrtitleshortpl
  \let\@glsxtr@org@GLSxtrtitleshort\GLSxtrtitleshort
  \let\@glsxtr@org@GLSxtrtitleshortpl\GLSxtrtitleshortpl
  \let\@glsxtr@org@glsxtrtitlename\glsxtrtitlename
  \let\@glsxtr@org@Glsxtrtitlename\Glsxtrtitlename
%    \end{macrocode}
%\changes{1.51}{2023-04-24}{save missing \cs{GLSxtrtitlename}}
%    \begin{macrocode}
  \let\@glsxtr@org@GLSxtrtitlename\GLSxtrtitlename
  \let\@glsxtr@org@glsxtrtitletext\glsxtrtitletext
  \let\@glsxtr@org@Glsxtrtitletext\Glsxtrtitletext
  \let\@glsxtr@org@GLSxtrtitletext\GLSxtrtitletext
  \let\@glsxtr@org@glsxtrtitleplural\glsxtrtitleplural
  \let\@glsxtr@org@Glsxtrtitleplural\Glsxtrtitleplural
  \let\@glsxtr@org@GLSxtrtitleplural\GLSxtrtitleplural
  \let\@glsxtr@org@glsxtrtitlefirst\glsxtrtitlefirst
  \let\@glsxtr@org@Glsxtrtitlefirst\Glsxtrtitlefirst
%    \end{macrocode}
%\changes{1.51}{2023-04-24}{save missing \cs{GLSxtrtitlefirst}}
%    \begin{macrocode}
  \let\@glsxtr@org@GLSxtrtitlefirst\GLSxtrtitlefirst
  \let\@glsxtr@org@glsxtrtitlefirstplural\glsxtrtitlefirstplural
  \let\@glsxtr@org@Glsxtrtitlefirstplural\Glsxtrtitlefirstplural
  \let\@glsxtr@org@GLSxtrtitlefirstplural\GLSxtrtitlefirstplural
  \let\@glsxtr@org@glsxtrtitlelong\glsxtrtitlelong
  \let\@glsxtr@org@glsxtrtitlelongpl\glsxtrtitlelongpl
  \let\@glsxtr@org@Glsxtrtitlelong\Glsxtrtitlelong
  \let\@glsxtr@org@Glsxtrtitlelongpl\Glsxtrtitlelongpl
  \let\@glsxtr@org@glsxtrtitlefull\glsxtrtitlefull
  \let\@glsxtr@org@glsxtrtitlefullpl\glsxtrtitlefullpl
  \let\@glsxtr@org@Glsxtrtitlefull\Glsxtrtitlefull
  \let\@glsxtr@org@Glsxtrtitlefullpl\Glsxtrtitlefullpl
  \let\@glsxtr@org@GLSxtrtitlefull\GLSxtrtitlefull
  \let\@glsxtr@org@GLSxtrtitlefullpl\GLSxtrtitlefullpl
%    \end{macrocode}
% New definitions
%    \begin{macrocode}
  \let\glsxtrifinmark\@firstoftwo
  \@glsxtr@assignMakeUppercase
  \let\glsxtrtitleorpdforheading\@thirdofthree
  \let\glsxtrtitleshort\glsxtrheadshort
  \let\glsxtrtitleshortpl\glsxtrheadshortpl
  \let\Glsxtrtitleshort\Glsxtrheadshort
  \let\Glsxtrtitleshortpl\Glsxtrheadshortpl
  \let\GLSxtrtitleshort\GLSxtrheadshort
  \let\GLSxtrtitleshortpl\GLSxtrheadshortpl
  \let\glsxtrtitlename\glsxtrheadname
  \let\Glsxtrtitlename\Glsxtrheadname
  \let\GLSxtrtitlename\GLSxtrheadname
  \let\glsxtrtitletext\glsxtrheadtext
  \let\Glsxtrtitletext\Glsxtrheadtext
  \let\GLSxtrtitletext\GLSxtrheadtext
  \let\glsxtrtitleplural\glsxtrheadplural
  \let\Glsxtrtitleplural\Glsxtrheadplural
  \let\GLSxtrtitleplural\GLSxtrheadplural
  \let\glsxtrtitlefirst\glsxtrheadfirst
  \let\Glsxtrtitlefirst\Glsxtrheadfirst
  \let\GLSxtrtitlefirst\GLSxtrheadfirst
  \let\glsxtrtitlefirstplural\glsxtrheadfirstplural
  \let\Glsxtrtitlefirstplural\Glsxtrheadfirstplural
  \let\GLSxtrtitlefirstplural\GLSxtrheadfirstplural
  \let\glsxtrtitlelong\glsxtrheadlong
  \let\glsxtrtitlelongpl\glsxtrheadlongpl
  \let\Glsxtrtitlelong\Glsxtrheadlong
  \let\Glsxtrtitlelongpl\Glsxtrheadlongpl
  \let\glsxtrtitlefull\glsxtrheadfull
  \let\glsxtrtitlefullpl\glsxtrheadfullpl
  \let\Glsxtrtitlefull\Glsxtrheadfull
  \let\Glsxtrtitlefullpl\Glsxtrheadfullpl
  \let\GLSxtrtitlefull\GLSxtrheadfull
  \let\GLSxtrtitlefullpl\GLSxtrheadfullpl
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrrestoremarkhook}
% Hook used in new definition of \cs{markboth} and \cs{markright}
% to restore the modified definitions. (This is in case the original
% \cs{markboth} and \cs{markright} shouldn't be grouped for some
% reason. There already is some grouping within those original
% definitions, but some of the code lies outside that grouping, and
% possibly there's a reason for it.)
%    \begin{macrocode}
\newcommand*{\glsxtrrestoremarkhook}{%
  \let\glsxtrifinmark\@secondoftwo
  \@glsxtr@restoreMakeUppercase
  \let\glsxtrtitleorpdforheading\@glsxtr@org@glsxtrtitleorpdforheading
  \let\glsxtrtitleshort\@glsxtr@org@glsxtrtitleshort
  \let\glsxtrtitleshortpl\@glsxtr@org@glsxtrtitleshortpl
  \let\Glsxtrtitleshort\@glsxtr@org@Glsxtrtitleshort
  \let\Glsxtrtitleshortpl\@glsxtr@org@Glsxtrtitleshortpl
  \let\GLSxtrtitleshort\@glsxtr@org@GLSxtrtitleshort
  \let\GLSxtrtitleshortpl\@glsxtr@org@GLSxtrtitleshortpl
  \let\glsxtrtitlename\@glsxtr@org@glsxtrtitlename
  \let\Glsxtrtitlename\@glsxtr@org@Glsxtrtitlename
  \let\GLSxtrtitlename\@glsxtr@org@GLSxtrtitlename
  \let\glsxtrtitletext\@glsxtr@org@glsxtrtitletext
  \let\Glsxtrtitletext\@glsxtr@org@Glsxtrtitletext
  \let\GLSxtrtitletext\@glsxtr@org@GLSxtrtitletext
  \let\glsxtrtitleplural\@glsxtr@org@glsxtrtitleplural
  \let\Glsxtrtitleplural\@glsxtr@org@Glsxtrtitleplural
  \let\GLSxtrtitleplural\@glsxtr@org@GLSxtrtitleplural
  \let\glsxtrtitlefirst\@glsxtr@org@glsxtrtitlefirst
  \let\Glsxtrtitlefirst\@glsxtr@org@Glsxtrtitlefirst
  \let\GLSxtrtitlefirst\@glsxtr@org@GLSxtrtitlefirst
  \let\glsxtrtitlefirstplural\@glsxtr@org@glsxtrtitlefirstplural
  \let\Glsxtrtitlefirstplural\@glsxtr@org@Glsxtrtitlefirstplural
  \let\GLSxtrtitlefirstplural\@glsxtr@org@GLSxtrtitlefirstplural
  \let\glsxtrtitlelong\@glsxtr@org@glsxtrtitlelong
  \let\glsxtrtitlelongpl\@glsxtr@org@glsxtrtitlelongpl
  \let\Glsxtrtitlelong\@glsxtr@org@Glsxtrtitlelong
  \let\Glsxtrtitlelongpl\@glsxtr@org@Glsxtrtitlelongpl
  \let\glsxtrtitlefull\@glsxtr@org@glsxtrtitlefull
  \let\glsxtrtitlefullpl\@glsxtr@org@glsxtrtitlefullpl
  \let\Glsxtrtitlefull\@glsxtr@org@Glsxtrtitlefull
  \let\Glsxtrtitlefullpl\@glsxtr@org@Glsxtrtitlefullpl
  \let\GLSxtrtitlefull\@glsxtr@org@GLSxtrtitlefull
  \let\GLSxtrtitlefullpl\@glsxtr@org@GLSxtrtitlefullpl
}
%    \end{macrocode}
%\end{macro}
%
%\changes{0.5.1}{2015-12-07}{removed \cs{ifglsxtruseuchead}}
% Instead of using one document-wide conditional, use
% \catattr{headuc} attribute to determine whether or not to use the
% all upper case form.
%
%\begin{macro}{\glsxtrtitleopts}
%\changes{1.49}{2022-10-14}{new}
%Make it possible to change the default options within the title
%(but not the page header or table of contents).
%    \begin{macrocode}
\newcommand*{\glsxtrtitleopts}{noindex,hyper=false}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@title@field}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsxtr@title@field}\marg{cs}\marg{label}
%\end{definition}
%Used by all the \cs{glsxtrtitle\meta{field}} commands for
%consistency.
%    \begin{macrocode}
\newcommand*{\glsxtr@title@field}[2]{%
  \expandafter#1\expandafter[\glsxtrtitleopts]{#2}[]%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrheadshort}
% Command used to display short form in the page header.
%\changes{0.5.1}{2015-12-07}{now uses headuc attribute}
%    \begin{macrocode}
\newcommand*{\glsxtrheadshort}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSxtrshort[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsxtrshort[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtitleshort}
% Command to display short form of abbreviation in section title.
%    \begin{macrocode}
\newrobustcmd*{\glsxtrtitleshort}[1]{%
  \glsxtr@title@field\glsxtrshort{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrheadshortpl}
% Command used to display plural short form in the page header.
% If you want the text converted to upper case, this needs to be
% redefined to use \cs{GLSxtrshortpl} instead. If you are using a
% smallcaps style, the default fonts don't provide italic smallcaps.
%\changes{0.5.1}{2015-12-07}{now uses headuc attribute}
%    \begin{macrocode}
\newcommand*{\glsxtrheadshortpl}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
      \GLSxtrshortpl[noindex,hyper=false]{#1}[]%
   }%
   {%
      \glsxtrshortpl[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtitleshortpl}
% Command to display plural short form of abbreviation in section title.
%\changes{1.03}{2016-04-27}{bug fix: changed \cs{glsxtrshort} to
%\cs{glsxtrshortpl}}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrtitleshortpl}[1]{%
  \glsxtr@title@field\glsxtrshortpl{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrheadshort}
% Command used to display short form in the page header with the
% first letter converted to upper case.
%\changes{0.5.1}{2015-12-07}{now uses headuc attribute}
%    \begin{macrocode}
\newcommand*{\Glsxtrheadshort}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSxtrshort[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsxtrshort[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrtitleshort}
% Command to display short form of abbreviation in section title
% with the first letter converted to upper case.
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrtitleshort}[1]{%
  \glsxtr@title@field\Glsxtrshort{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrheadshort}
%\changes{1.49}{2022-10-14}{new}
%There's no need to check for the headuc attribute.
%    \begin{macrocode}
\newcommand*{\GLSxtrheadshort}[1]{%
 \protect\NoCaseChange
 {%
   \GLSxtrshort[noindex,hyper=false]{#1}[]%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrtitleshort}
%\changes{1.42}{2020-02-03}{new}
% Command to display short form of abbreviation in section title 
% in all upper case.
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrtitleshort}[1]{%
  \glsxtr@title@field\GLSxtrshort{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrheadshortpl}
%\changes{1.49}{2022-10-14}{new}
%There's no need to check for the headuc attribute.
%    \begin{macrocode}
\newcommand*{\GLSxtrheadshortpl}[1]{%
 \protect\NoCaseChange
 {%
   \GLSxtrshortpl[noindex,hyper=false]{#1}[]%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrheadshortpl}
% Command used to display plural short form in the page header with the
% first letter converted to upper case.
%\changes{0.5.1}{2015-12-07}{now uses headuc attribute}
%    \begin{macrocode}
\newcommand*{\Glsxtrheadshortpl}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSxtrshortpl[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsxtrshortpl[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrtitleshortpl}
% Command to display plural short form of abbreviation in section title 
% with the first letter converted to upper case.
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrtitleshortpl}[1]{%
  \glsxtr@title@field\Glsxtrshortpl{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrtitleshortpl}
%\changes{1.42}{2020-02-03}{new}
% Command to display plural short form of abbreviation in section title 
% in all upper case.
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrtitleshortpl}[1]{%
  \glsxtr@title@field\GLSxtrshortpl{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrheadname}
% As above but for the \gloskey{name} value.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrheadname}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSname[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsname[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtitlename}
% Command to display \gloskey{name} value in section title.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrtitlename}[1]{%
  \glsxtr@title@field\glsname{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrheadname}
% First letter converted to upper case
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrheadname}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSname[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsname[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrtitlename}
% Command to display \gloskey{name} value in section title 
% with the first letter changed to upper case.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrtitlename}[1]{%
  \glsxtr@title@field\Glsname{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrheadname}
%\changes{1.49}{2022-10-14}{new}
%There's no need to check for the headuc attribute.
%    \begin{macrocode}
\newcommand*{\GLSxtrheadname}[1]{%
 \protect\NoCaseChange
 {%
   \GLSname[noindex,hyper=false]{#1}[]%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrtitlename}
% Command to display \gloskey{name} value in section title 
% in all upper case.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrtitlename}[1]{%
  \glsxtr@title@field\GLSname{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrheadtext}
% As above but for the \gloskey{text} value.
%\changes{0.5.1}{2015-12-07}{now uses headuc attribute}
%    \begin{macrocode}
\newcommand*{\glsxtrheadtext}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLStext[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glstext[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtitletext}
% Command to display \gloskey{text} value in section title.
%    \begin{macrocode}
\newrobustcmd*{\glsxtrtitletext}[1]{%
  \glsxtr@title@field\glstext{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%
%\begin{macro}{\Glsxtrheadtext}
% First letter converted to upper case
%\changes{0.5.1}{2015-12-07}{now uses headuc attribute}
%    \begin{macrocode}
\newcommand*{\Glsxtrheadtext}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLStext[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glstext[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrtitletext}
% Command to display \gloskey{text} value in section title 
% with the first letter changed to upper case.
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrtitletext}[1]{%
  \glsxtr@title@field\Glstext{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrheadtext}
%\changes{1.49}{2022-10-14}{new}
%There's no need to check for the headuc attribute.
%    \begin{macrocode}
\newcommand*{\GLSxtrheadtext}[1]{%
 \protect\NoCaseChange
 {%
   \GLStext[noindex,hyper=false]{#1}[]%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrtitletext}
% Command to display \gloskey{text} value in section title 
% in all upper case.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrtitletext}[1]{%
  \glsxtr@title@field\GLStext{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrheadplural}
% As above but for the \gloskey{plural} value.
%\changes{0.5.1}{2015-12-07}{now uses headuc attribute}
%    \begin{macrocode}
\newcommand*{\glsxtrheadplural}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSplural[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsplural[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtitleplural}
% Command to display \gloskey{plural} value in section title.
%    \begin{macrocode}
\newrobustcmd*{\glsxtrtitleplural}[1]{%
  \glsxtr@title@field\glsplural{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrheadplural}
% Convert first letter to upper case.
%\changes{0.5.1}{2015-12-07}{now uses headuc attribute}
%    \begin{macrocode}
\newcommand*{\Glsxtrheadplural}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSplural[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsplural[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrtitleplural}
% Command to display \gloskey{plural} value in section title
% with the first letter changed to upper case.
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrtitleplural}[1]{%
  \glsxtr@title@field\Glsplural{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrheadplural}
%\changes{1.49}{2022-10-14}{new}
%There's no need to check for the headuc attribute.
%    \begin{macrocode}
\newcommand*{\GLSxtrheadplural}[1]{%
 \protect\NoCaseChange
 {%
   \GLSplural[noindex,hyper=false]{#1}[]%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrtitleplural}
%\changes{1.42}{2020-02-03}{new}
% Command to display \gloskey{plural} value in section title 
% in all upper case.
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrtitleplural}[1]{%
  \glsxtr@title@field\GLSplural{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrheadfirst}
% As above but for the \gloskey{first} value.
%\changes{0.5.1}{2015-12-07}{now uses headuc attribute}
%    \begin{macrocode}
\newcommand*{\glsxtrheadfirst}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSfirst[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsfirst[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtitlefirst}
% Command to display \gloskey{first} value in section title.
%    \begin{macrocode}
\newrobustcmd*{\glsxtrtitlefirst}[1]{%
  \glsxtr@title@field\glsfirst{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrheadfirst}
% First letter converted to upper case
%\changes{0.5.1}{2015-12-07}{now uses headuc attribute}
%    \begin{macrocode}
\newcommand*{\Glsxtrheadfirst}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSfirst[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsfirst[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrtitlefirst}
% Command to display \gloskey{first} value in section title 
% with the first letter changed to upper case.
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrtitlefirst}[1]{%
  \glsxtr@title@field\Glsfirst{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrheadfirst}
%\changes{1.49}{2022-10-14}{new}
%There's no need to check for the headuc attribute.
%    \begin{macrocode}
\newcommand*{\GLSxtrheadfirst}[1]{%
 \protect\NoCaseChange
 {%
   \GLSfirst[noindex,hyper=false]{#1}[]%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrtitlefirst}
%\changes{1.42}{2020-02-03}{new}
% Command to display \gloskey{first} value in section title 
% in all upper case.
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrtitlefirst}[1]{%
  \glsxtr@title@field\GLSfirst{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrheadfirstplural}
% As above but for the \gloskey{firstplural} value.
%\changes{0.5.1}{2015-12-07}{now uses headuc attribute}
%    \begin{macrocode}
\newcommand*{\glsxtrheadfirstplural}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSfirstplural[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsfirstplural[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtitlefirstplural}
% Command to display \gloskey{firstplural} value in section title.
%    \begin{macrocode}
\newrobustcmd*{\glsxtrtitlefirstplural}[1]{%
  \glsxtr@title@field\glsfirstplural{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrheadfirstplural}
% First letter converted to upper case
%\changes{0.5.1}{2015-12-07}{now uses headuc attribute}
%    \begin{macrocode}
\newcommand*{\Glsxtrheadfirstplural}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSfirstplural[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsfirstplural[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrtitlefirstplural}
% Command to display \gloskey{first} value in section title 
% with the first letter changed to upper case.
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrtitlefirstplural}[1]{%
  \glsxtr@title@field\Glsfirstplural{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrheadfirstplural}
%\changes{1.49}{2022-10-14}{new}
%There's no need to check for the headuc attribute.
%    \begin{macrocode}
\newcommand*{\GLSxtrheadfirstplural}[1]{%
 \protect\NoCaseChange
 {%
   \GLSfirstplural[noindex,hyper=false]{#1}[]%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrtitlefirstplural}
%\changes{1.42}{2020-02-03}{new}
% Command to display \gloskey{first} value in section title 
% in all upper case.
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrtitlefirstplural}[1]{%
  \glsxtr@title@field\GLSfirstplural{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrheadlong}
% Command used to display long form in the page header.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrheadlong}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSxtrlong[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsxtrlong[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtitlelong}
% Command to display long form of abbreviation in section title.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrtitlelong}[1]{%
  \glsxtr@title@field\glsxtrlong{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrheadlongpl}
% Command used to display plural long form in the page header.
% If you want the text converted to upper case, this needs to be
% redefined to use \cs{GLSxtrlongpl} instead. If you are using a
% smallcaps style, the default fonts don't provide italic smallcaps.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrheadlongpl}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
      \GLSxtrlongpl[noindex,hyper=false]{#1}[]%
   }%
   {%
      \glsxtrlongpl[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtitlelongpl}
% Command to display plural long form of abbreviation in section title.
%\changes{1.02}{2016-04-25}{new}
%\changes{1.03}{2016-04-27}{bug fix: changed \cs{glsxtrlong} to
%\cs{glsxtrlongpl}}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrtitlelongpl}[1]{%
  \glsxtr@title@field\glsxtrlongpl{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrheadlong}
% Command used to display long form in the page header with the
% first letter converted to upper case.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrheadlong}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSxtrlong[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsxtrlong[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrtitlelong}
% Command to display long form of abbreviation in section title 
% with the first letter converted to upper case.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrtitlelong}[1]{%
  \glsxtr@title@field\Glsxtrlong{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrtitlelong}
% Command to display long form of abbreviation in section title 
% in all upper case.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrtitlelong}[1]{%
  \glsxtr@title@field\GLSxtrlong{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrheadlong}
%\changes{1.49}{2022-10-14}{new}
%There's no need to check for the headuc attribute.
%    \begin{macrocode}
\newcommand*{\GLSxtrheadlong}[1]{%
 \protect\NoCaseChange
 {%
   \GLSxtrlong[noindex,hyper=false]{#1}[]%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrheadlongpl}
% Command used to display plural long form in the page header with the
% first letter converted to upper case.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrheadlongpl}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSxtrlongpl[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsxtrlongpl[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrtitlelongpl}
% Command to display plural long form of abbreviation in section title 
% with the first letter converted to upper case.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrtitlelongpl}[1]{%
  \glsxtr@title@field\Glsxtrlongpl{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrtitlelongpl}
% Command to display plural long form of abbreviation in section title 
% in all upper case.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrtitlelongpl}[1]{%
  \glsxtr@title@field\GLSxtrlongpl{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrheadlongpl}
%\changes{1.49}{2022-10-14}{new}
%There's no need to check for the headuc attribute.
%    \begin{macrocode}
\newcommand*{\GLSxtrheadlongpl}[1]{%
 \protect\NoCaseChange
 {%
   \GLSxtrlongpl[noindex,hyper=false]{#1}[]%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrheadfull}
% Command used to display full form in the page header.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrheadfull}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSxtrfull[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsxtrfull[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtitlefull}
% Command to display full form of abbreviation in section title.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrtitlefull}[1]{%
  \glsxtr@title@field\glsxtrfull{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrheadfullpl}
% Command used to display plural full form in the page header.
% If you want the text converted to upper case, this needs to be
% redefined to use \cs{GLSxtrfullpl} instead. If you are using a
% smallcaps style, the default fonts don't provide italic smallcaps.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrheadfullpl}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
      \GLSxtrfullpl[noindex,hyper=false]{#1}[]%
   }%
   {%
      \glsxtrfullpl[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtitlefullpl}
% Command to display plural full form of abbreviation in section title.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrtitlefullpl}[1]{%
  \glsxtr@title@field\glsxtrfullpl{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrheadfull}
% Command used to display full form in the page header with the
% first letter converted to upper case.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrheadfull}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSxtrfull[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsxtrfull[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrtitlefull}
% Command to display full form of abbreviation in section title 
% with the first letter converted to upper case.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrtitlefull}[1]{%
  \glsxtr@title@field\Glsxtrfull{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrheadfull}
%\changes{1.49}{2022-10-14}{new}
%There's no need to check for the headuc attribute.
%    \begin{macrocode}
\newcommand*{\GLSxtrheadfull}[1]{%
 \protect\NoCaseChange
 {%
   \GLSxtrfull[noindex,hyper=false]{#1}[]%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrtitlefull}
% Command to display full form of abbreviation in section title 
% in all upper case.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrtitlefull}[1]{%
  \glsxtr@title@field\GLSxtrfull{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrheadfullpl}
% Command used to display plural full form in the page header with the
% first letter converted to upper case.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrheadfullpl}[1]{%
 \protect\NoCaseChange
 {%
   \glsxtrifheaduc{#1}%
   {%
     \GLSxtrfullpl[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsxtrfullpl[noindex,hyper=false]{#1}[]%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrtitlefullpl}
% Command to display plural full form of abbreviation in section title 
% with the first letter converted to upper case.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrtitlefullpl}[1]{%
  \glsxtr@title@field\Glsxtrfullpl{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrheadfullpl}
%\changes{1.49}{2022-10-14}{new}
%There's no need to check for the headuc attribute.
%    \begin{macrocode}
\newcommand*{\GLSxtrheadfullpl}[1]{%
 \protect\NoCaseChange
 {%
   \GLSxtrfullpl[noindex,hyper=false]{#1}[]%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrtitlefullpl}
% Command to display plural full form of abbreviation in section title 
% in all upper case.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrtitlefullpl}[1]{%
  \glsxtr@title@field\GLSxtrfullpl{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfmtshort}
% Provide a way of using the formatted short form in section
% headings. If \sty{hyperref} has been loaded, use
% \cs{texorpdfstring} for convenience in PDF bookmarks.
%\changes{0.2}{2015-11-30}{new}
%\changes{0.4}{2015-12-03}{changed to use \cs{glsxtrshort}}
%\changes{0.5}{2015-12-07}{changed to use \cs{glsxtrtitleshort}}
%\changes{0.5}{2015-12-07}{renamed from \cs{glsentryfmtshort}}
%    \begin{macrocode}
\newcommand*{\glsfmtshort}[1]{%
  \glstexorpdfstring
    {\glsxtrtitleshort{#1}}%
    {\glsentryshort{#1}}%
}
%    \end{macrocode}
%\end{macro}
%Similarly for the plural version.
%\begin{macro}{\glsfmtshortpl}
%\changes{0.2}{2015-11-30}{new}
%\changes{0.4}{2015-12-03}{changed to use \cs{glsxtrshortpl}}
%\changes{0.5}{2015-12-07}{changed to use \cs{glsxtrtitleshortpl}}
%\changes{0.5}{2015-12-07}{renamed from \cs{glsentryfmtshortpl}}
%    \begin{macrocode}
\newcommand*{\glsfmtshortpl}[1]{%
  \glstexorpdfstring
    {\glsxtrtitleshortpl{#1}}%
    {\glsentryshortpl{#1}}%
}
%    \end{macrocode}
%\end{macro}
% Use the expandable \cs{MFUsentencecase} in the PDF bookmark.
%\begin{macro}{\Glsfmtshort}
% Singular form (first letter uppercase).
%\changes{0.2}{2015-11-30}{new}
%\changes{0.4}{2015-12-03}{changed to use \cs{Glsxtrshort}}
%\changes{0.5}{2015-12-07}{changed to use \cs{Glsxtrtitleshort}}
%\changes{0.5}{2015-12-07}{renamed from \cs{Glsentryfmtshort}}
%\changes{1.49}{2022-10-14}{added \cs{MFUsentencecase}}
%    \begin{macrocode}
\newcommand*{\Glsfmtshort}[1]{%
  \glstexorpdfstring
    {\Glsxtrtitleshort{#1}}%
    {\MFUsentencecase{\glsentryshort{#1}}}%
}
\glsmfuaddmap{\glsfmtshort}{\Glsfmtshort}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\Glsfmtshortpl}
%Plural form (first letter uppercase).
%\changes{0.2}{2015-11-30}{new}
%\changes{0.4}{2015-12-03}{changed to use \cs{glsxtrshortpl}}
%\changes{0.5}{2015-12-07}{changed to use \cs{Glsxtrtitleshortpl}}
%\changes{0.5}{2015-12-07}{renamed from \cs{Glsentryfmtshortpl}}
%\changes{1.49}{2022-10-14}{added \cs{MFUsentencecase}}
%    \begin{macrocode}
\newcommand*{\Glsfmtshortpl}[1]{%
  \glstexorpdfstring
  {\Glsxtrtitleshortpl{#1}}%
  {\MFUsentencecase{\glsentryshortpl{#1}}}%
}
\glsmfuaddmap{\glsfmtshortpl}{\Glsfmtshortpl}
%    \end{macrocode}
%\end{macro}
%
% Similarly for all-caps.
%\begin{macro}{\GLSfmtshort}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GLSfmtshort}[1]{%
  \glstexorpdfstring
    {\GLSxtrtitleshort{#1}}%
    {\GLSxtrusefield{#1}{short}}%
}
\glsmfublocker{\GLSfmtshort}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSfmtshortpl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\GLSfmtshortpl}[1]{%
  \glstexorpdfstring
    {\GLSxtrtitleshortpl{#1}}%
    {\GLSxtrusefield{#1}{shortpl}}%
}
\glsmfublocker{\GLSfmtshortpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfmtname}
%As above but for the \gloskey{name} value.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsfmtname}[1]{%
  \glstexorpdfstring
  {\glsxtrtitlename{#1}}%
  {\glsentryname{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsfmtname}
%First letter converted to upper case.
%\changes{1.21}{2017-11-03}{new}
%\changes{1.49}{2022-10-14}{added \cs{MFUsentencecase}}
%    \begin{macrocode}
\newcommand*{\Glsfmtname}[1]{%
  \glstexorpdfstring
  {\Glsxtrtitlename{#1}}%
  {\MFUsentencecase{\glsentryname{#1}}}%
}
\glsmfuaddmap{\glsfmtname}{\Glsfmtname}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSfmtname}
%All upper case.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newcommand*{\GLSfmtname}[1]{%
  \glstexorpdfstring
  {\GLSxtrtitlename{#1}}%
  {\GLSxtrusefield{#1}{name}}%
}
\glsmfublocker{\GLSfmtname}
%    \end{macrocode}
%\end{macro}
%
%
%\begin{macro}{\glsfmttext}
%As above but for the \gloskey{text} value.
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newcommand*{\glsfmttext}[1]{%
  \glstexorpdfstring
  {\glsxtrtitletext{#1}}%
  {\glsentrytext{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsfmttext}
%First letter converted to upper case.
%\changes{0.5}{2015-12-07}{new}
%\changes{1.49}{2022-10-14}{added \cs{MFUsentencecase}}
%    \begin{macrocode}
\newcommand*{\Glsfmttext}[1]{%
  \glstexorpdfstring
  {\Glsxtrtitletext{#1}}%
  {\MFUsentencecase{\glsentrytext{#1}}}%
}
\glsmfuaddmap{\glsfmttext}{\Glsfmttext}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSfmttext}
%All upper case.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newcommand*{\GLSfmttext}[1]{%
  \glstexorpdfstring
  {\GLSxtrtitletext{#1}}%
  {\GLSxtrusefield{#1}{text}}%
}
\glsmfublocker{\GLSfmttext}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfmtplural}
%As above but for the \gloskey{plural} value.
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newcommand*{\glsfmtplural}[1]{%
  \glstexorpdfstring
  {\glsxtrtitleplural{#1}}%
  {\glsentryplural{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsfmtplural}
%First letter converted to upper case.
%\changes{0.5}{2015-12-07}{new}
%\changes{1.49}{2022-10-14}{added \cs{MFUsentencecase}}
%    \begin{macrocode}
\newcommand*{\Glsfmtplural}[1]{%
  \glstexorpdfstring
  {\Glsxtrtitleplural{#1}}%
  {\MFUsentencecase{\glsentryplural{#1}}}%
}
\glsmfuaddmap{\glsfmtplural}{\Glsfmtplural}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSfmtplural}
%All upper case.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newcommand*{\GLSfmtplural}[1]{%
  \glstexorpdfstring
  {\GLSxtrtitleplural{#1}}%
  {\GLSxtrusefield{#1}{plural}}%
}
\glsmfublocker{\GLSfmtplural}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfmtfirst}
%As above but for the \gloskey{first} value.
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newcommand*{\glsfmtfirst}[1]{%
  \glstexorpdfstring
  {\glsxtrtitlefirst{#1}}%
  {\glsentryfirst{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsfmtfirst}
%First letter converted to upper case.
%\changes{0.5}{2015-12-07}{new}
%\changes{1.49}{2022-10-14}{added \cs{MFUsentencecase}}
%    \begin{macrocode}
\newcommand*{\Glsfmtfirst}[1]{%
  \glstexorpdfstring
  {\Glsxtrtitlefirst{#1}}%
  {\MFUsentencecase{\glsentryfirst{#1}}}%
}
\glsmfuaddmap{\glsfmtfirst}{\Glsfmtfirst}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSfmtfirst}
%All upper case.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newcommand*{\GLSfmtfirst}[1]{%
  \glstexorpdfstring
  {\GLSxtrtitlefirst{#1}}%
  {\GLSxtrusefield{#1}{first}}%
}
\glsmfublocker{\GLSfmtfirst}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfmtfirstpl}
%As above but for the \gloskey{firstplural} value.
%\changes{0.5}{2015-12-07}{new}
%\changes{1.57}{2025-03-04}{corrected case for PDF bookmark}
%    \begin{macrocode}
\newcommand*{\glsfmtfirstpl}[1]{%
  \glstexorpdfstring
  {\glsxtrtitlefirstplural{#1}}%
  {\glsxtrusefield{#1}{firstpl}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsfmtfirstpl}
%First letter converted to upper case.
%\changes{0.5}{2015-12-07}{new}
%\changes{1.49}{2022-10-14}{added \cs{MFUsentencecase}}
%    \begin{macrocode}
\newcommand*{\Glsfmtfirstpl}[1]{%
  \glstexorpdfstring
  {\Glsxtrtitlefirstplural{#1}}%
  {\MFUsentencecase{\glsentryfirstplural{#1}}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSfmtfirstpl}
%All upper case.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newcommand*{\GLSfmtfirstpl}[1]{%
  \glstexorpdfstring
  {\GLSxtrtitlefirstplural{#1}}%
  {\GLSxtrusefield{#1}{firstpl}}%
}
\glsmfublocker{\GLSfmtfirstpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfmtlong}
%As above but for the \gloskey{long} value.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newcommand*{\glsfmtlong}[1]{%
  \glstexorpdfstring
  {\glsxtrtitlelong{#1}}%
  {\glsentrylong{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsfmtlong}
%First letter converted to upper case.
%\changes{1.02}{2016-04-25}{new}
%\changes{1.49}{2022-10-14}{added \cs{MFUsentencecase}}
%\changes{1.54}{2024-01-03}{switched to \cs{glspdfsentencecase}}
%    \begin{macrocode}
\newcommand*{\Glsfmtlong}[1]{%
  \glstexorpdfstring
  {\Glsxtrtitlelong{#1}}%
  {\glspdfsentencecase{\glsentrylong{#1}}}%
}
\glsmfuaddmap{\glsfmtlong}{\Glsfmtlong}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSfmtlong}
%All upper case.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newcommand*{\GLSfmtlong}[1]{%
  \glstexorpdfstring
  {\GLSxtrtitlelong{#1}}%
  {\GLSxtrusefield{#1}{long}}%
}
\glsmfublocker{\GLSfmtlong}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfmtlongpl}
%As above but for the \gloskey{longplural} value.
%\changes{1.02}{2016-04-25}{new}
%    \begin{macrocode}
\newcommand*{\glsfmtlongpl}[1]{%
  \glstexorpdfstring
  {\glsxtrtitlelongpl{#1}}%
  {\glsentrylongpl{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsfmtlongpl}
%First letter converted to upper case.
%\changes{1.02}{2016-04-25}{new}
%\changes{1.49}{2022-10-14}{added \cs{MFUsentencecase}}
%\changes{1.54}{2024-01-03}{switched to \cs{glspdfsentencecase}}
%    \begin{macrocode}
\newcommand*{\Glsfmtlongpl}[1]{%
  \glstexorpdfstring
  {\Glsxtrtitlelongpl{#1}}%
  {\glspdfsentencecase{\glsentrylongpl{#1}}}%
}
\glsmfuaddmap{\glsfmtlongpl}{\Glsfmtlongpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSfmtlongpl}
%All upper case.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newcommand*{\GLSfmtlongpl}[1]{%
  \glstexorpdfstring
  {\GLSxtrtitlelongpl{#1}}%
  {\GLSxtrusefield{#1}{longpl}}%
}
\glsmfublocker{\GLSfmtlongpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glspdffmtfull}
%\changes{1.42}{2020-02-03}{new}
%Can't use \cs{glsxtrinlinefullformat} in PDF bookmarks as it's not
%fully expandable. This command is for the PDF part of
%\cs{texorpdfstring} for the full form.
%    \begin{macrocode}
\newcommand*{\glspdffmtfull}[1]{\glsentrylong{#1} (\glsentryshort{#1})}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glspdffmtfullpl}
%\changes{1.42}{2020-02-03}{new}
%Likewise for plural.
%    \begin{macrocode}
\newcommand*{\glspdffmtfullpl}[1]{\glsentrylongpl{#1} (\glsentryshortpl{#1})}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsfmtfull}
%In-line full format.
%\changes{1.02}{2016-04-25}{new}
%\changes{1.42}{2020-02-03}{switched pdf case to use \cs{glspdffmtfull}}
%    \begin{macrocode}
\newcommand*{\glsfmtfull}[1]{%
  \glstexorpdfstring
  {\glsxtrtitlefull{#1}}%
  {\glspdffmtfull{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsfmtfull}
%First letter converted to upper case.
%\changes{1.02}{2016-04-25}{new}
%\changes{1.42}{2020-02-03}{switched pdf case to use \cs{glspdffmtfull}}
%\changes{1.49}{2022-10-14}{added \cs{MFUsentencecase}}
%\changes{1.54}{2024-01-03}{switched to \cs{glspdfsentencecase}}
%    \begin{macrocode}
\newcommand*{\Glsfmtfull}[1]{%
  \glstexorpdfstring
  {\Glsxtrtitlefull{#1}}%
  {\glspdfsentencecase{\glspdffmtfull{#1}{}}}%
}
\glsmfuaddmap{\glsfmtfull}{\Glsfmtfull}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSfmtfull}
%All upper case. This explicitly uses \cs{text\_uppercase:n} in case
%an old version of \sty{glossaries} or \sty{mfirstuc} is present.
%\changes{1.42}{2020-02-03}{new}
%\changes{1.49}{2022-10-14}{add upper case bookmark}
%    \begin{macrocode}
\ExplSyntaxOn
\newcommand*{\GLSfmtfull}[1]{%
  \glstexorpdfstring
  {\GLSxtrtitlefull{#1}}%
  {\text_uppercase:n{\glspdffmtfull{#1}}}%
}
\ExplSyntaxOff
\glsmfublocker{\GLSfmtfull}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsfmtfullpl}
%In-line full plural format.
%\changes{1.02}{2016-04-25}{new}
%\changes{1.42}{2020-02-03}{switched pdf case to use \cs{glspdffmtfullpl}}
%    \begin{macrocode}
\newcommand*{\glsfmtfullpl}[1]{%
  \glstexorpdfstring
  {\glsxtrtitlefullpl{#1}}%
  {\glspdffmtfullpl{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsfmtfullpl}
%First letter converted to upper case.
%\changes{1.02}{2016-04-25}{new}
%\changes{1.42}{2020-02-03}{switched pdf case to use \cs{glspdffmtfullpl}}
%\changes{1.49}{2022-10-14}{added \cs{MFUsentencecase}}
%\changes{1.54}{2024-01-03}{switched to \cs{glspdfsentencecase}}
%    \begin{macrocode}
\newcommand*{\Glsfmtfullpl}[1]{%
  \glstexorpdfstring
  {\Glsxtrtitlefullpl{#1}}%
  {\glspdfsentencecase{\glspdffmtfullpl{#1}{}}}%
}
\glsmfuaddmap{\glsfmtfullpl}{\Glsfmtfullpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSfmtfullpl}
%All upper case. This explicitly uses \cs{text\_uppercase:n} in case
%an old version of \sty{glossaries} or \sty{mfirstuc} is present.
%\changes{1.42}{2020-02-03}{new}
%\changes{1.49}{2022-10-14}{add upper case bookmark}
%    \begin{macrocode}
\ExplSyntaxOn
\newcommand*{\GLSfmtfullpl}[1]{%
  \glstexorpdfstring
  {\GLSxtrtitlefullpl{#1}}%
  {\text_uppercase:n{\glspdffmtfullpl{#1}{}}}%
}
\ExplSyntaxOff
\glsmfublocker{\GLSfmtfullpl}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Prefixes}
%Provide support for \sty{glossaries-prefix}. 
%
%\begin{macro}{\pglsprefix}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{pglsprefix}\marg{entry-label}\marg{prefix-field}
%\end{definition}
%A shortcut way of inserting the prefix and separator if they are
%required. If this needs to be redefined, use \cs{ifglsfieldvoid}
%for an expandable test.
%    \begin{macrocode}
\newcommand{\pglsprefix}[2]{%
  \ifcsempty{glo@\glsdetoklabel{#1}@#2}{}%
  {\csuse{glo@\glsdetoklabel{#1}@#2}\glsprefixsep}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Pglsprefix}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{Pglsprefix}\marg{entry-label}\marg{prefix-field}
%\end{definition}
%Similar to \cs{pglsprefix} but sentence case. The conditional is
%omitted as it will have to already be checked.
%    \begin{macrocode}
\newcommand{\Pglsprefix}[2]{%
  \Glsxtrusefield{#1}{#2}\glsprefixsep
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\PGLSprefix}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{PGLSprefix}\marg{entry-label}\marg{prefix-field}
%\end{definition}
%As \cs{pglsprefix} but all caps.
%    \begin{macrocode}
\newcommand{\PGLSprefix}[2]{%
  \ifcsempty{glo@\glsdetoklabel{#1}@#2}{}%
  {\glsuppercase{\csuse{glo@\glsdetoklabel{#1}@#2}\glsprefixsep}}%
}
%    \end{macrocode}
%\end{macro}
%
%Abbreviations. Short form uses prefix and prefixplural fields.
%\begin{macro}{\pglsxtrshort}
%\changes{1.49}{2022-10-14}{new}
%No case-change.
%    \begin{macrocode}
\newrobustcmd*{\pglsxtrshort}{\@gls@hyp@opt\ns@pglsxtrshort}
\newcommand*{\ns@pglsxtrshort}[2][]{%
  \new@ifnextchar[{\@pglsxtrshort{#1}{#2}}{\@pglsxtrshort{#1}{#2}[]}%
}
\def\@pglsxtrshort#1#2[#3]{%
  \pglsprefix{#2}{prefix}%
  \@glsxtrshort{#1}{#2}[#3]%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Pglsxtrshort}
%\changes{1.49}{2022-10-14}{new}
%Sentence case.
%    \begin{macrocode}
\newrobustcmd*{\Pglsxtrshort}{\@gls@hyp@opt\ns@Pglsxtrshort}
\newcommand*{\ns@Pglsxtrshort}[2][]{%
  \new@ifnextchar[{\@Pglsxtrshort{#1}{#2}}{\@Pglsxtrshort{#1}{#2}[]}%
}
\def\@Pglsxtrshort#1#2[#3]{%
  \ifglshasprefix{#2}%
  {%
    \Pglsprefix{#2}{prefix}%
    \@glsxtrshort{#1}{#2}[#3]%
  }%
  {\@Glsxtrshort{#1}{#2}[#3]}%
}
\glsmfuaddmap{\pglsxtrshort}{\Pglsxtrshort}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\PGLSxtrshort}
%\changes{1.49}{2022-10-14}{new}
%All-caps is also fairly simple.
%    \begin{macrocode}
\newrobustcmd*{\PGLSxtrshort}{\@gls@hyp@opt\ns@PGLSxtrshort}
\newcommand*{\ns@PGLSxtrshort}[2][]{%
  \new@ifnextchar[{\@PGLSxtrshort{#1}{#2}}{\@PGLSxtrshort{#1}{#2}[]}%
}
\def\@PGLSxtrshort#1#2[#3]{%
  \PGLSprefix{#2}{prefix}%
  \@GLSxtrshort{#1}{#2}[#3]%
}
\glsmfublocker{\PGLSxtrshort}
%    \end{macrocode}
%\end{macro}
%
%Short plural.
%\begin{macro}{\pglsxtrshortpl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\pglsxtrshortpl}{\@gls@hyp@opt\ns@pglsxtrshortpl}
\newcommand*{\ns@pglsxtrshortpl}[2][]{%
  \new@ifnextchar[{\@pglsxtrshortpl{#1}{#2}}{\@pglsxtrshortpl{#1}{#2}[]}%
}
\def\@pglsxtrshortpl#1#2[#3]{%
  \pglsprefix{#2}{prefixplural}%
  \@glsxtrshortpl{#1}{#2}[#3]%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Pglsxtrshortpl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\Pglsxtrshortpl}{\@gls@hyp@opt\ns@Pglsxtrshortpl}
\newcommand*{\ns@Pglsxtrshortpl}[2][]{%
  \new@ifnextchar[{\@Pglsxtrshortpl{#1}{#2}}{\@Pglsxtrshortpl{#1}{#2}[]}%
}
\def\@Pglsxtrshortpl#1#2[#3]{%
  \ifglshasprefixplural{#2}%
  {%
    \Pglsprefix{#2}{prefixplural}%
    \@glsxtrshortpl{#1}{#2}[#3]%
  }%
  {\@Glsxtrshortpl{#1}{#2}[#3]}%
}
\glsmfuaddmap{\pglsxtrshortpl}{\Pglsxtrshortpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\PGLSxtrshortpl}
%\changes{1.49}{2022-10-14}{new}
%All-caps is also fairly simple.
%    \begin{macrocode}
\newrobustcmd*{\PGLSxtrshortpl}{\@gls@hyp@opt\ns@PGLSxtrshortpl}
\newcommand*{\ns@PGLSxtrshortpl}[2][]{%
  \new@ifnextchar[{\@PGLSxtrshortpl{#1}{#2}}{\@PGLSxtrshortpl{#1}{#2}[]}%
}
\def\@PGLSxtrshortpl#1#2[#3]{%
  \PGLSprefix{#2}{prefixplural}%
  \@GLSxtrshortpl{#1}{#2}[#3]%
}
\glsmfublocker{\PGLSxtrshortpl}
%    \end{macrocode}
%\end{macro}
%
%Long form uses prefixfirst and prefixfirstplural fields.
%\begin{macro}{\pglsxtrlong}
%\changes{1.49}{2022-10-14}{new}
%No case-change.
%    \begin{macrocode}
\newrobustcmd*{\pglsxtrlong}{\@gls@hyp@opt\ns@pglsxtrlong}
\newcommand*{\ns@pglsxtrlong}[2][]{%
  \new@ifnextchar[{\@pglsxtrlong{#1}{#2}}{\@pglsxtrlong{#1}{#2}[]}%
}
\def\@pglsxtrlong#1#2[#3]{%
  \pglsprefix{#2}{prefixfirst}%
  \@glsxtrlong{#1}{#2}[#3]%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Pglsxtrlong}
%\changes{1.49}{2022-10-14}{new}
%Sentence case.
%    \begin{macrocode}
\newrobustcmd*{\Pglsxtrlong}{\@gls@hyp@opt\ns@Pglsxtrlong}
\newcommand*{\ns@Pglsxtrlong}[2][]{%
  \new@ifnextchar[{\@Pglsxtrlong{#1}{#2}}{\@Pglsxtrlong{#1}{#2}[]}%
}
\def\@Pglsxtrlong#1#2[#3]{%
  \ifglshasprefixfirst{#2}%
  {%
    \Pglsprefix{#2}{prefixfirst}%
    \@glsxtrlong{#1}{#2}[#3]%
  }%
  {\@Glsxtrlong{#1}{#2}[#3]}%
}
\glsmfuaddmap{\pglsxtrlong}{\Pglsxtrlong}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\PGLSxtrlong}
%\changes{1.49}{2022-10-14}{new}
%All-caps is also fairly simple.
%    \begin{macrocode}
\newrobustcmd*{\PGLSxtrlong}{\@gls@hyp@opt\ns@PGLSxtrlong}
\newcommand*{\ns@PGLSxtrlong}[2][]{%
  \new@ifnextchar[{\@PGLSxtrlong{#1}{#2}}{\@PGLSxtrlong{#1}{#2}[]}%
}
\def\@PGLSxtrlong#1#2[#3]{%
  \PGLSprefix{#2}{prefixfirst}%
  \@GLSxtrlong{#1}{#2}[#3]%
}
\glsmfublocker{\PGLSxtrlong}
%    \end{macrocode}
%\end{macro}
%
%Long plural.
%\begin{macro}{\pglsxtrlongpl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\pglsxtrlongpl}{\@gls@hyp@opt\ns@pglsxtrlongpl}
\newcommand*{\ns@pglsxtrlongpl}[2][]{%
  \new@ifnextchar[{\@pglsxtrlongpl{#1}{#2}}{\@pglsxtrlongpl{#1}{#2}[]}%
}
\def\@pglsxtrlongpl#1#2[#3]{%
  \pglsprefix{#2}{prefixfirstplural}%
  \@glsxtrlongpl{#1}{#2}[#3]%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Pglsxtrlongpl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\Pglsxtrlongpl}{\@gls@hyp@opt\ns@Pglsxtrlongpl}
\newcommand*{\ns@Pglsxtrlongpl}[2][]{%
  \new@ifnextchar[{\@Pglsxtrlongpl{#1}{#2}}{\@Pglsxtrlongpl{#1}{#2}[]}%
}
\def\@Pglsxtrlongpl#1#2[#3]{%
  \ifglshasprefixfirstplural{#2}%
  {%
    \Pglsprefix{#2}{prefixfirstplural}%
    \@glsxtrlongpl{#1}{#2}[#3]%
  }%
  {\@Glsxtrlongpl{#1}{#2}[#3]}%
}
\glsmfuaddmap{\pglsxtrlongpl}{\Pglsxtrlongpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\PGLSxtrlongpl}
%\changes{1.49}{2022-10-14}{new}
%All-caps is also fairly simple.
%    \begin{macrocode}
\newrobustcmd*{\PGLSxtrlongpl}{\@gls@hyp@opt\ns@PGLSxtrlongpl}
\newcommand*{\ns@PGLSxtrlongpl}[2][]{%
  \new@ifnextchar[{\@PGLSxtrlongpl{#1}{#2}}{\@PGLSxtrlongpl{#1}{#2}[]}%
}
\def\@PGLSxtrlongpl#1#2[#3]{%
  \PGLSprefix{#2}{prefixfirstplural}%
  \@GLSxtrlongpl{#1}{#2}[#3]%
}
\glsmfublocker{\PGLSxtrlongpl}
%    \end{macrocode}
%\end{macro}
%
%Title commands (analogous to \cs{glsfmtshort} etc).
%\begin{macro}{\pglsfmtshort}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\pglsfmtshort}[1]{%
  \pglsprefix{#1}{prefix}%
  \glsfmtshort{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Pglsfmtshort}
%\changes{1.49}{2022-10-14}{new}
%\changes{1.54}{2024-01-03}{switched to \cs{glspdfsentencecase}}
%    \begin{macrocode}
\newcommand*{\Pglsfmtshort}[1]{%
 \glstexorpdfstring
  {\Pglsxtrtitleshort{#1}}%
  {\glspdfsentencecase{%
    \pglsprefix{#1}{prefix}%
    \glsentryshort{#1}}%
  }%
}
\glsmfuaddmap{\pglsfmtshort}{\Pglsfmtshort}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Pglsxtrtitleshort}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\Pglsxtrtitleshort}[1]{%
  \glsxtr@title@field\Pglsxtrshort{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\PGLSfmtshort}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\PGLSfmtshort}[1]{%
  \PGLSprefix{#1}{prefix}%
  \GLSfmtshort{#1}%
}
\glsmfublocker{\PGLSfmtshort}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\pglsfmtshortpl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\pglsfmtshortpl}[1]{%
  \pglsprefix{#1}{prefixplural}%
  \glsfmtshortpl{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Pglsfmtshortpl}
%\changes{1.49}{2022-10-14}{new}
%\changes{1.54}{2024-01-03}{switched to \cs{glspdfsentencecase}}
%    \begin{macrocode}
\newcommand*{\Pglsfmtshortpl}[1]{%
 \glstexorpdfstring
  {\Pglsxtrtitleshortpl{#1}}%
  {\glspdfsentencecase
    {%
      \pglsprefix{#1}{prefixplural}%
      \glsentryshortpl{#1}%
    }%
  }%
}
\glsmfuaddmap{\pglsfmtshortpl}{\Pglsfmtshortpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Pglsxtrtitleshortpl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\Pglsxtrtitleshortpl}[1]{%
  \glsxtr@title@field\Pglsxtrshortpl{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\PGLSfmtshortpl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\PGLSfmtshortpl}[1]{%
  \PGLSprefix{#1}{prefixplural}%
  \GLSfmtshortpl{#1}%
}
\glsmfublocker{\PGLSfmtshortpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\pglsfmtlong}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\pglsfmtlong}[1]{%
  \pglsprefix{#1}{prefixfirst}%
  \glsfmtlong{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Pglsfmtlong}
%\changes{1.49}{2022-10-14}{new}
%\changes{1.54}{2024-01-03}{switched to \cs{glspdfsentencecase}}
%    \begin{macrocode}
\newcommand*{\Pglsfmtlong}[1]{%
 \glstexorpdfstring
  {\Pglsxtrtitlelong{#1}}%
  {\glspdfsentencecase{%
    \pglsprefix{#1}{prefixfirst}%
    \glsentrylong{#1}}%
  }%
}
\glsmfuaddmap{\pglsfmtlong}{\Pglsfmtlong}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Pglsxtrtitlelong}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\Pglsxtrtitlelong}[1]{%
  \glsxtr@title@field\Pglsxtrlong{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\PGLSfmtlong}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\PGLSfmtlong}[1]{%
  \PGLSprefix{#1}{prefixfirst}%
  \GLSfmtlong{#1}%
}
\glsmfublocker{\PGLSfmtlong}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\pglsfmtlongpl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\pglsfmtlongpl}[1]{%
  \pglsprefix{#1}{prefixfirstplural}%
  \glsfmtlongpl{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Pglsfmtlongpl}
%\changes{1.49}{2022-10-14}{new}
%\changes{1.54}{2024-01-03}{switched to \cs{glspdfsentencecase}}
%    \begin{macrocode}
\newcommand*{\Pglsfmtlongpl}[1]{%
 \glstexorpdfstring
  {\Pglsxtrtitlelongpl{#1}}%
  {\glspdfsentencecase
    {%
      \pglsprefix{#1}{prefixfirstplural}%
      \glsentrylongpl{#1}%
    }%
  }%
}
\glsmfuaddmap{\pglsfmtlongpl}{\Pglsfmtlongpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Pglsxtrtitlelongpl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\Pglsxtrtitlelongpl}[1]{%
  \glsxtr@title@field\Pglsxtrlongpl{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\PGLSfmtlongpl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\PGLSfmtlongpl}[1]{%
  \PGLSprefix{#1}{prefixfirstplural}%
  \GLSfmtlongpl{#1}%
}
\glsmfublocker{\PGLSfmtlongpl}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Multi (Combined/Compound) Entries}
%(I'd rather call these combined or compound entries but \cs{cgls} is
%already taken.)
%
%New to version 1.48, the commands here provide a way of referencing
%multiple entries as a single unit. For example, biological
%organisms are often referred to by their genus and species, such as
%\emph{Clostridium botulinum} and \emph{Clostridium perfringens}
%(where the genus is Clostridium). The genus is often abbreviated
%after first use, regardless of which species in the genus is being
%referenced. For example, \qt{\emph{Clostridium botulinum} and 
%\emph{C. perfringens}}. This can't be supported by any abbreviation
%styles unless the genus and species names are defined separately.
%For example:
%\begin{verbatim}
%\setabbreviationstyle{long-only-short-only}
%\newabbreviation{clostridium}{C.}{Clostridium}
%\newglossaryentry{botulinum}{name={botulinum},description={}}
%\newglossaryentry{perfringens}{name={perfringens},description={}}
%\end{verbatim}
%This means that the entries then need to be referenced using a
%rather cumbersome method:
%\begin{verbatim}
%\gls{clostridium} \gls{botulinum} and \gls{clostridum}
%\gls{perfringens}
%\end{verbatim}
%This section provides a command that will provide a way of defining
%a label that represents a combination of entries (which must all be
%first defined). For example:
%\begin{verbatim}
%\multiglossaryentry{cbot}{clostridium,botulinum}
%\end{verbatim}
%This label can then be referenced using \cs{mgls}, which internally
%uses \cs{gls} for each component. The last component in the list is
%considered the \qt{main} component (not to be confused with the
%main glossary). If this isn't the case, the label of the main
%component should be added in the optional argument before the label
%list. Note that the multi-label (\texttt{cbot} in this case) can't be
%referenced using commands like \cs{gls}.
%
%First define the general set of options that should be applied to
%all multi-entries. These can be set with:
%\begin{macro}{\multiglossaryentrysetup}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\multiglossaryentrysetup}[1]{\setkeys{glsxtrcombined}{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@gls@combined@indexmain}
%\changes{1.48}{2021-11-22}{new}
%Numeric value: 0=false (don't index main component), 1=true (always
%index main component), 2=first (only index main component on first
%use). Default: 1 (true);
%    \begin{macrocode}
\newcommand*{\@gls@combined@indexmain}{1}
\define@choicekey{glsxtrcombined}{indexmain}%
 [\@gls@combined@indexmain@val\@gls@combined@indexmain]
 {false,true,first}[true]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@gls@combined@indexothers}
%\changes{1.48}{2021-11-22}{new}
%Numeric value: 0=false (don't index other components), 1=true (always
%index other components), 2=first (only index other components on first
%use). Default: 2 (first);
%    \begin{macrocode}
\newcommand*{\@gls@combined@indexothers}{2}
\define@choicekey{glsxtrcombined}{indexothers}%
 [\@gls@combined@indexothers@val\@gls@combined@indexothers]
 {false,true,first}[true]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@gls@combined@hyper}
%\changes{1.48}{2021-11-22}{new}
%Numeric value: 0=none (\cs{mgls} doesn't create a hyperlink),
% 1=allmain (all content hyperlinks to the main component),
% 2=mainonly (only the main component has a hyperlink),
% 3=individual (each component has a hyperlink to their own target).
% Default: 3.
%    \begin{macrocode}
\newcommand*{\@gls@combined@hyper}{3}
\define@choicekey{glsxtrcombined}{hyper}%
 [\@gls@combined@hyper@val\@gls@combined@hyper]
 {none,allmain,mainonly,individual,otheronly,notmainfirst,nototherfirst,notfirst}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@encapmain}
%\changes{1.48}{2021-11-22}{new}
%Location encap value for main component (corresponding to format key in \cs{gls}).
%    \begin{macrocode}
\newcommand*{\@gls@combined@encapmain}{glsnumberformat}
\define@key{glsxtrcombined}{encapmain}{%
 \renewcommand*{\@gls@combined@encapmain}{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@encapothers}
%\changes{1.48}{2021-11-22}{new}
%Location encap value for other components (corresponding to format key in \cs{gls}).
%    \begin{macrocode}
\newcommand*{\@gls@combined@encapothers}{glsnumberformat}
\define@key{glsxtrcombined}{encapothers}{%
 \renewcommand*{\@gls@combined@encapothers}{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@textformat}
%\changes{1.48}{2021-11-22}{new}
%Encapsulate entire content with the command identified by the given
%control sequence name.
%    \begin{macrocode}
\newcommand*{\@gls@combined@textformat}{@firstofone}
\define@key{glsxtrcombined}{textformat}{%
 \renewcommand*{\@gls@combined@textformat}{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@category}
%\changes{1.48}{2021-11-22}{new}
%Assign a category to the combined set.
%    \begin{macrocode}
\newcommand*{\@gls@combined@category}{}
\define@key{glsxtrcombined}{category}{%
 \renewcommand*{\@gls@combined@category}{#1}%
}
%    \end{macrocode}
%Pre-options family:
%    \begin{macrocode}
\define@key{glsxtrcombinedpreopts}{category}{%
 \renewcommand*{\@gls@combined@category}{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@mglsopts}
%\changes{1.48}{2021-11-22}{new}
%Default options to pass to \cs{mgls}.
%    \begin{macrocode}
\newcommand*{\@gls@combined@mglsopts}{}
\define@key{glsxtrcombined}{mglsopts}{%
 \renewcommand*{\@gls@combined@mglsopts}{#1}%
}
\define@key{glsxtrcombinedpreopts}{mglsopts}{%
 \@gls@combined@mglsopts@do
 {%
   \renewcommand*{\@gls@combined@mglsopts}{#1}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@mglsopts@do}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@gls@combined@mglsopts@do}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mgls@disable@mglsopts}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mgls@disable@mglsopts}{%
 \let\@gls@combined@mglsopts@do\@gls@combined@mglsopts@do@not
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mgls@enable@mglsopts}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mgls@enable@mglsopts}{%
 \let\@gls@combined@mglsopts@do\@firstofone
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@mglsopts@do}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@gls@combined@mglsopts@do@not}[1]{%
  \PackageError{glossaries-extra}{`mglsopts' key not permitted inside
   `setup' value}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@firstprefix}
%\changes{1.48}{2021-11-22}{new}
%Prefix for multi-entry first use.
%    \begin{macrocode}
\newcommand*{\@gls@combined@firstprefix}{}
\define@key{glsxtrcombined}{firstprefix}{%
 \renewcommand*{\@gls@combined@firstprefix}{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@usedprefix}
%\changes{1.48}{2021-11-22}{new}
%Prefix for multi-entry subsequent first use.
%    \begin{macrocode}
\newcommand*{\@gls@combined@usedprefix}{}
\define@key{glsxtrcombined}{usedprefix}{%
 \renewcommand*{\@gls@combined@usedprefix}{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@firstsuffix}
%\changes{1.48}{2021-11-22}{new}
%Suffix for multi-entry first use.
%    \begin{macrocode}
\newcommand*{\@gls@combined@firstsuffix}{}
\define@key{glsxtrcombined}{firstsuffix}{%
 \renewcommand*{\@gls@combined@firstsuffix}{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@usedsuffix}
%\changes{1.48}{2021-11-22}{new}
%Suffix for multi-entry subsequent first use.
%    \begin{macrocode}
\newcommand*{\@gls@combined@usedsuffix}{}
\define@key{glsxtrcombined}{usedsuffix}{%
 \renewcommand*{\@gls@combined@usedsuffix}{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@firstskipmain}
%\changes{1.48}{2021-11-22}{new}
%Skip the main element on first use (multi-entry first use not
%element first use).
%    \begin{macrocode}
\define@boolkey{glsxtrcombined}{firstskipmain}[true]{}
\KV@glsxtrcombined@firstskipmainfalse
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@firstskipothers}
%\changes{1.48}{2021-11-22}{new}
%Skip the other elements on first use (multi-entry first use not
%element first use).
%    \begin{macrocode}
\define@boolkey{glsxtrcombined}{firstskipothers}[true]{}
\KV@glsxtrcombined@firstskipothersfalse
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@usedskipmain}
%\changes{1.48}{2021-11-22}{new}
%Skip the main element on subsequent use (multi-entry subsequent use not
%element subsequent use).
%    \begin{macrocode}
\define@boolkey{glsxtrcombined}{usedskipmain}[true]{}
\KV@glsxtrcombined@usedskipmainfalse
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@usedskipothers}
%\changes{1.48}{2021-11-22}{new}
%Skip the other elements on subsequent use (multi-entry subsequent use not
%element subsequent use).
%    \begin{macrocode}
\define@boolkey{glsxtrcombined}{usedskipothers}[true]{}
\KV@glsxtrcombined@usedskipothersfalse
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@postlinks}
%\changes{1.48}{2021-11-22}{new}
%Determine whether or not to use the individual element post-link hooks.
%    \begin{macrocode}
\newcommand*{\@gls@combined@postlinks@nr}{0}
\define@choicekey{glsxtrcombined}{postlinks}%
 [\@gls@combined@postlinks@val\@gls@combined@postlinks@nr]
 {none,all,notlast,mainnotlast,mainonly,othernotlast,otheronly}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@mpostlink}
%\changes{1.48}{2021-11-22}{new}
%Determine whether or not to use the multi-entry post-link hook.
%    \begin{macrocode}
\newcommand*{\@gls@combined@mpostlink@nr}{1}
\define@choicekey{glsxtrcombined}{mpostlink}%
 [\@gls@combined@mpostlink@val\@gls@combined@mpostlink@nr]
 {false,true,firstonly,usedonly}[true]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@combined@mpostlinkelement}
%\changes{1.48}{2021-11-22}{new}
%Determine which element to use for the post-link hook.
%    \begin{macrocode}
\newcommand*{\@gls@combined@mpostlinkelement@nr}{0}
\define@choicekey{glsxtrcombined}{mpostlinkelement}%
 [\@gls@combined@mpostlinkelement@val\@gls@combined@mpostlinkelement@nr]
 {last,main,custom}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifmulti}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrifmulti}[3]{\ifcsdef{@gls@combined@#1@main}{#2}{#3}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrmultimain}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrmultimain}[1]{\csuse{@gls@combined@#1@main}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrmultilist}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrmultilist}[1]{\csuse{@gls@combined@#1@list}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrmultitotalelements}
%\changes{1.48}{2021-11-22}{new}
%Total number of elements.
%    \begin{macrocode}
\newcommand*{\glsxtrmultitotalelements}[1]{\csuse{@gls@combined@#1@total}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrmultimainindex}
%\changes{1.48}{2021-11-22}{new}
%Index of main element (starting from 1). If the main element is the
%last element in the list then this should equal the total number of
%elements.
%    \begin{macrocode}
\newcommand*{\glsxtrmultimainindex}[1]{\csuse{@gls@combined@#1@mainindex}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrmultilastotherindex}
%\changes{1.48}{2021-11-22}{new}
%Index of the last non-main element.
%    \begin{macrocode}
\newcommand*{\glsxtrmultilastotherindex}[1]{\csuse{@gls@combined@#1@lastotherindex}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\ifmultiglossaryentryglobal}
%\changes{1.48}{2021-11-22}{new}
%Make definitions global.
%    \begin{macrocode}
\newif\ifmultiglossaryentryglobal
\multiglossaryentryglobalfalse
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglselementindex}
%\changes{1.48}{2021-11-22}{new}
% Count register to keep track of the current element index.
%    \begin{macrocode}
\newcount\mglselementindex
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\multiglossaryentry}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{multiglossaryentry}\oarg{options}\marg{multi-label}\oarg{main label}\marg{label
%list}
%\end{definition}
%Defines the label \meta{multi-label} that can be used in \cs{mgls}.
%    \begin{macrocode}
\newrobustcmd{\multiglossaryentry}[1][]{%
 \def\@gls@combined@current@opts{#1}%
 \ifnum\@glsxtr@docdefval=1\relax
  \let\@multi@glossentry@donext\@defmultiglossaryentry
 \else
  \let\@multi@glossentry@donext\@multiglossaryentry
 \fi
 \@multi@glossentry@donext
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@multiglossaryentry}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@multiglossaryentry}[1]{%
  \def\@gls@combined@current@label{#1}%
  \@multi@glossaryentry
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@multi@glossaryentry}
%\changes{1.48}{2021-11-22}{new}
% Check for existence.
%    \begin{macrocode}
\newcommand*{\@multi@glossaryentry}[2][]{%
  \ifcsdef{@gls@combined@\@gls@combined@current@label @main}%
  {\PackageError{glossaries-extra}%
    {Multi-entry label `\@gls@combined@current@label' already defined}%
    {}%
  }%
  {%
    \@multi@glossary@entry{#1}{#2}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@defmultiglossaryentry}
%\changes{1.48}{2021-11-22}{new}
%Used if document definitions are on.
%    \begin{macrocode}
\newcommand*{\@defmultiglossaryentry}[1]{%
  \def\@gls@combined@current@label{#1}%
  \@def@multi@glossaryentry
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@def@multi@glossaryentry}
%\changes{1.48}{2021-11-22}{new}
%Used if document definitions are on.
%    \begin{macrocode}
\newcommand*{\@def@multi@glossaryentry}[2][]{%
  \let\@def@multi@glossaryentry@do\@multi@glossary@entry
  \ifundef\@glsxtr@docdefs@multilist
  {%
    \gdef\@glsxtr@docdefs@multilist{}%
    \listxadd
     {\@glsxtr@docdefs@multilist}{\expandonce\@gls@combined@current@label}%
  }%
  {%
    \xifinlist{\@gls@combined@current@label}{\@glsxtr@docdefs@multilist}%
    {%
      \PackageError{glossaries-extra}%
      {Multi-entry label `\@gls@combined@current@label' already defined}%
      {}%
      \let\@def@multi@glossaryentry@do\@gobbletwo
    }%
    {%
      \listxadd
       {\@glsxtr@docdefs@multilist}{\expandonce\@gls@combined@current@label}%
    }%
  }%
  \@def@multi@glossaryentry@do{#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@multi@glossary@doifexists}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@multi@glossary@doifexists}{\glsdoifexists}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\providemultiglossaryentry}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{providemultiglossaryentry}\oarg{options}\marg{multi-label}\oarg{main label}\marg{label
%list}
%\end{definition}
%Defines a multi-entry unless it has already been defined.
%    \begin{macrocode}
\newrobustcmd{\providemultiglossaryentry}[2][]{%
 \def\@gls@combined@current@opts{#1}%
 \def\@gls@combined@current@label{#2}%
 \ifcsdef{@gls@combined@\@gls@combined@current@label @main}%
 {\def\@multi@glossentry@donext{\@provide@multi@glossaryentry@noop}}%
 {%
   \ifnum\@glsxtr@docdefval=1\relax
    \def\@multi@glossentry@donext{\@def@multi@glossaryentry}%
   \else
    \def\@multi@glossentry@donext{\@multi@glossaryentry}%
   \fi
 }%
 \@multi@glossentry@donext
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@provide@multi@glossaryentry@noop}
%\changes{1.48}{2021-11-22}{new}
% Do nothing.
%    \begin{macrocode}
\newcommand*{\@provide@multi@glossaryentry@noop}[2][]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@multi@glossaryentry@list}
%\changes{1.48}{2021-11-22}{new}
% List of all defined multi-entry sets.
%    \begin{macrocode}
\newcommand*{\@multi@glossaryentry@list}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@multi@glossary@entry}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@multi@glossary@entry}[2]{%
  \protected@edef\@gls@combined@current@main{#1}%
%    \end{macrocode}
% Fully expand list.
%    \begin{macrocode}
  \protected@edef\@gls@combined@currentlist{#2}%
%    \end{macrocode}
% Count items in list, check they are all defined, and find last item at the same time.
%    \begin{macrocode}
  \mglselementindex=0\relax
  \@for\@gls@tmp:=\@gls@combined@currentlist\do{%
    \advance\mglselementindex by 1\relax
    \@multi@glossary@doifexists{\@gls@tmp}{}%
    \let\@gls@combined@finalitem\@gls@tmp
    \ifdefvoid\@gls@combined@current@main
    {}%
    {%
      \ifx\@gls@combined@current@main\@gls@tmp
        \ifmultiglossaryentryglobal
          \global\cslet{@gls@combined@\@gls@combined@current@label @main}%
                \@gls@combined@current@main
          \csxdef{@gls@combined@\@gls@combined@current@label @mainindex}%
                 {\the\mglselementindex}%
        \else
          \cslet{@gls@combined@\@gls@combined@current@label @main}%
                \@gls@combined@current@main
          \csedef{@gls@combined@\@gls@combined@current@label @mainindex}%
                 {\the\mglselementindex}%
        \fi
      \else
        \ifmultiglossaryentryglobal
          \csxdef{@gls@combined@\@gls@combined@current@label @lastotherindex}%
                 {\the\mglselementindex}%
        \else
          \csedef{@gls@combined@\@gls@combined@current@label @lastotherindex}%
                 {\the\mglselementindex}%
        \fi
      \fi
    }%
  }%
  \ifmultiglossaryentryglobal
    \csxdef{@gls@combined@\@gls@combined@current@label @total}%
           {\the\mglselementindex}%
  \else
    \csedef{@gls@combined@\@gls@combined@current@label @total}%
           {\the\mglselementindex}%
  \fi
  \ifnum\mglselementindex<2\relax
     \PackageError{glossaries-extra}{At least 2 labels required in
       multi-entry element list (\number\mglselementindex\space found)}{}%
  \else
    \ifdefvoid\@gls@combined@current@main
    {}%
    {%
%    \end{macrocode}
% If \cs{@gls@combined@\meta{label}@main} hasn't been set then it
% wasn't included in the list.
%    \begin{macrocode}
      \ifcsundef{@gls@combined@\@gls@combined@current@label @main}%
      {\PackageError{glossaries-extra}%
       {Main element `\@gls@combined@current@main' not found in list}%
       {The final element `\@gls@combined@finalitem' will be used instead}
%    \end{macrocode}
% Set to empty so that the default (final element) is used instead.
%    \begin{macrocode}
       \let\@gls@combined@current@main\@empty
      }%
      {}%
    }%
    \ifdefvoid\@gls@combined@current@main
    {%
%    \end{macrocode}
% Set main to final element.
%    \begin{macrocode}
      \ifmultiglossaryentryglobal
        \global\cslet{@gls@combined@\@gls@combined@current@label @main}%
              \@gls@combined@finalitem
        \global\csletcs{@gls@combined@\@gls@combined@current@label @mainindex}%
          {@gls@combined@\@gls@combined@current@label @total}%
        \csxdef{@gls@combined@\@gls@combined@current@label @lastotherindex}%
               {\the\numexpr\mglselementindex-1 }%
      \else
        \cslet{@gls@combined@\@gls@combined@current@label @main}%
              \@gls@combined@finalitem
        \csletcs{@gls@combined@\@gls@combined@current@label @mainindex}%
          {@gls@combined@\@gls@combined@current@label @total}%
        \csedef{@gls@combined@\@gls@combined@current@label @lastotherindex}%
               {\the\numexpr\mglselementindex-1 }%
      \fi
    }%
    {}%
    \ifmultiglossaryentryglobal
%    \end{macrocode}
% Globally define element list.
%    \begin{macrocode}
      \global\cslet{@gls@combined@\@gls@combined@current@label @list}%
             \@gls@combined@currentlist
%    \end{macrocode}
% Globally define options.
%    \begin{macrocode}
      \protected@csxdef{@gls@combined@\@gls@combined@current@label @options}%
       {\@gls@combined@current@opts}%
%    \end{macrocode}
% Global conditional definition.
%    \begin{macrocode}
      \expandafter\@ifdefinable
       \csname if@gls@combined@\@gls@combined@current@label @flag\endcsname
       {\expandafter\global\expandafter
        \newif\csname if@gls@combined@\@gls@combined@current@label @flag\endcsname}%
      \expandafter\global
       \csname @gls@combined@\@gls@combined@current@label @flagfalse\endcsname
    \else
%    \end{macrocode}
% Locally define element list.
%    \begin{macrocode}
      \cslet{@gls@combined@\@gls@combined@current@label @list}%
             \@gls@combined@currentlist
%    \end{macrocode}
% Locally define options.
%    \begin{macrocode}
      \protected@csedef{@gls@combined@\@gls@combined@current@label @options}%
       {\@gls@combined@current@opts}%
%    \end{macrocode}
% Local conditional definition.
%    \begin{macrocode}
      \newboolean{@gls@combined@\@gls@combined@current@label @flag}%
      \csname @gls@combined@\@gls@combined@current@label @flagfalse\endcsname
    \fi
  \fi
  \writemultiglossentry
   {\@gls@combined@current@opts}{\@gls@combined@current@label}%
   {\csuse{@gls@combined@\@gls@combined@current@label @main}}{#2}%
%    \end{macrocode}
%Append label to list.
%    \begin{macrocode}
  \ifmultiglossaryentryglobal
    \ifdefempty\@multi@glossaryentry@list
    {\let\@multi@glossaryentry@list\@gls@combined@current@label}%
    {%
      \eappto\@multi@glossaryentry@list{,\expandonce\@gls@combined@current@label}%
    }%
  \else
    \ifdefempty\@multi@glossaryentry@list
    {\global\let\@multi@glossaryentry@list\@gls@combined@current@label}%
    {%
      \xappto\@multi@glossaryentry@list{,\expandonce\@gls@combined@current@label}%
    }%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@multientry}
%\begin{definition}
%\cs{@glsxtr@multientry}\marg{options}\marg{multilabel}\marg{main}\marg{list}
%\end{definition}
%Information for aux file. Useful for \app{bib2gls} and also for
%\pkgopt{docdef}.
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@multientry}[4]{%
 \ifnum\@glsxtr@docdefval=1\relax
  \bgroup
    \def\@gls@combined@current@opts{#1}%
    \def\@gls@combined@current@label{#2}%
    \let\@multi@glossary@doifexists\@secondoftwo
    \let\writemultiglossentry\@gobblefour
    \multiglossaryentryglobaltrue
    \@multi@glossary@entry{#3}{#4}%
  \egroup
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\writemultiglossentry}
%\changes{1.48}{2021-11-22}{new}
%This can be redefined to do nothing if the information isn't
%required.
%    \begin{macrocode}
\newcommand*{\writemultiglossentry}[4]{%
  \protected@write\@auxout{}{\string\@glsxtr@multientry{#1}{#2}{#3}{#4}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\ifmglsused}
%\changes{1.48}{2021-11-22}{new}
% Determines whether or not the multi-entry set has been referenced
% by commands like \cs{mgls} or \cs{mglsname}.
%    \begin{macrocode}
\newcommand*{\ifmglsused}[3]{%
 \ifbool{@gls@combined@#1@flag}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsunset}
%\changes{1.48}{2021-11-22}{new}
%Unset the flag.
%    \begin{macrocode}
\newcommand*{\mglsunset}[1]{%
 \gls@ifnotmeasuring
 {%
    \glsxtrifmulti{#1}{\@mglsunset{#1}}%
    {%
      \glsxtrundefaction{Multi entry `#1' hasn't been defined}%
      {You need to define `#1' with \string\multiglossaryentry}%
    }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mglsunset}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mglsunset}[1]{%
 \expandafter\global\csname @gls@combined@#1@flagtrue\endcsname
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsreset}
%\changes{1.48}{2021-11-22}{new}
%Unset the flag.
%    \begin{macrocode}
\newcommand*{\mglsreset}[1]{%
 \gls@ifnotmeasuring
 {%
    \glsxtrifmulti{#1}{\@mglsreset{#1}}%
    {%
      \glsxtrundefaction{Multi entry `#1' hasn't been defined}%
      {You need to define `#1' with \string\multiglossaryentry}%
    }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mglsreset}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mglsreset}[1]{%
 \expandafter\global\csname @gls@combined@#1@flagfalse\endcsname
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglslocalunset}
%\changes{1.48}{2021-11-22}{new}
%Unset the flag.
%    \begin{macrocode}
\newcommand*{\mglslocalunset}[1]{%
 \gls@ifnotmeasuring
 {%
    \glsxtrifmulti{#1}{\@mglslocalunset{#1}}%
    {%
      \glsxtrundefaction{Multi entry `#1' hasn't been defined}%
      {You need to define `#1' with \string\multiglossaryentry}%
    }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mglslocalunset}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mglslocalunset}[1]{%
 \csname @gls@combined@#1@flagtrue\endcsname
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglslocalreset}
%\changes{1.48}{2021-11-22}{new}
%Unset the flag.
%    \begin{macrocode}
\newcommand*{\mglslocalreset}[1]{%
 \gls@ifnotmeasuring
 {%
    \glsxtrifmulti{#1}{\@mglslocalreset{#1}}%
    {%
      \glsxtrundefaction{Multi entry `#1' hasn't been defined}%
      {You need to define `#1' with \string\multiglossaryentry}%
    }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mglslocalreset}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mglslocalreset}[1]{%
 \csname @gls@combined@#1@flagfalse\endcsname
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsunsetall}
%\changes{1.48}{2021-11-22}{new}
%Unset all.
%    \begin{macrocode}
\newcommand*{\mglsunsetall}{%
  \@for\@mgls@thislabel:=\@multi@glossaryentry@list\do{\mglsunset\@mgls@thislabel}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsresetall}
%\changes{1.48}{2021-11-22}{new}
%Reset all.
%    \begin{macrocode}
\newcommand*{\mglsresetall}{%
  \@for\@mgls@thislabel:=\@multi@glossaryentry@list\do{\mglsreset\@mgls@thislabel}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsSetMain}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mglsSetName}\marg{multi-label}\marg{new main}
%\end{definition}
%Allow the main label to be changed (local).
%    \begin{macrocode}
\newrobustcmd{\mglsSetMain}[2]{%
  \ifcsundef{@gls@combined@#1@main}%
  {\PackageError{glossaries-extra}{Multi-entry label `#1' not defined}{}}%
  {%
    \protected@edef\@gls@combined@current@main{#2}%
    \letcs\@gls@combined@currentlist{@gls@combined@#1@list}%
%    \end{macrocode}
% Check that the given label is in the list of elements and update
% main and last other element index.
%    \begin{macrocode}
    \mglselementindex=0\relax
    \count@=0\relax
    \@for\@gls@tmp:=\@gls@combined@currentlist\do{%
      \advance\mglselementindex by 1\relax
      \ifx\@gls@combined@current@main\@gls@tmp
        \count@=\mglselementindex\relax
        \let\@gls@combined@finalitem\@gls@tmp
        \ifmultiglossaryentryglobal
          \global\cslet{@gls@combined@#1@main}\@gls@combined@current@main
          \csxdef{@gls@combined@#1@mainindex}{\the\mglselementindex}%
        \else
          \cslet{@gls@combined@#1@main}\@gls@combined@current@main
          \csedef{@gls@combined@#1@mainindex}{\the\mglselementindex}%
        \fi
      \else
        \ifmultiglossaryentryglobal
          \csxdef{@gls@combined@#1@lastotherindex}{\the\mglselementindex}%
        \else
          \csedef{@gls@combined@#1@lastotherindex}{\the\mglselementindex}%
        \fi
      \fi
    }%
    \ifnum\count@=0\relax
      \PackageError{glossaries-extra}{Label `#2' is not in `#1' set
       (\@gls@combined@currentlist)}{}%
%    \end{macrocode}
% Default to final item.
%    \begin{macrocode}
      \ifmultiglossaryentryglobal
        \global\cslet{@gls@combined@#1@main}\@gls@combined@finalitem
        \csxdef{@gls@combined@#1@mainindex}{\the\mglselementindex}%
        \csxdef{@gls@combined@#1@lastotherindex}{%
          \number\numexpr\mglselementindex-1 }%
      \else
        \cslet{@gls@combined@#1@main}\@gls@combined@finalitem
        \csedef{@gls@combined@#1@mainindex}{\the\mglselementindex}%
        \csedef{@gls@combined@#1@lastotherindex}{%
          \number\numexpr\mglselementindex-1 }%
      \fi
    \fi
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsSetOptions}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mglsSetOptions}\marg{multi-label}\marg{new options}
%\end{definition}
%Allow the options to be changed (local). No expansion is applied.
%    \begin{macrocode}
\newrobustcmd{\mglsSetOptions}[2]{%
  \ifcsundef{@gls@combined@#1@main}%
  {\PackageError{glossaries-extra}{Multi-entry label `#1' not defined}{}}%
  {%
    \csdef{@gls@combined@#1@options}{#2}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsAddOptions}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mglsAddOptions}\marg{multi-label}\marg{extra options}
%\end{definition}
%Allow the options to be changed (local). No expansion is applied.
%    \begin{macrocode}
\newrobustcmd{\mglsAddOptions}[2]{%
  \ifcsundef{@gls@combined@#1@main}%
  {\PackageError{glossaries-extra}{Multi-entry label `#1' not defined}{}}%
  {%
    \ifcsempty{@gls@combined@#1@options}%
    {\csdef{@gls@combined@#1@options}{#2}}%
    {\csappto{@gls@combined@#1@options}{,#2}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%Options for \cs{mgls}:
%\begin{macro}{\@mgls@all}
%\changes{1.48}{2021-11-22}{new}
%Options to apply to all elements.
%    \begin{macrocode}
\newcommand*{\@mgls@all}{}
\define@key{mgls}{all}{\renewcommand*{\@mgls@all}{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@main}
%\changes{1.48}{2021-11-22}{new}
%Options to apply to the main element only.
%    \begin{macrocode}
\newcommand*{\@mgls@main}{}
\define@key{mgls}{main}{\renewcommand*{\@mgls@main}{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@others}
%\changes{1.48}{2021-11-22}{new}
%Options to apply to the other (no main) elements.
%    \begin{macrocode}
\newcommand*{\@mgls@others}{}
\define@key{mgls}{others}{\renewcommand*{\@mgls@others}{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@setup}
%\changes{1.48}{2021-11-22}{new}
%Options to apply to \cs{multiglossaryentrysetup}.
%    \begin{macrocode}
\newcommand*{\@mgls@setup}{}
\define@key{mgls}{setup}{%
 \@mgls@setup@do{\renewcommand*{\@mgls@setup}{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@setup@do}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mgls@setup@do}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@setup@do@not}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mgls@setup@do@not}[1]{%
  \PackageError{glossaries-extra}{`setup' key not permitted inside
   `mglsopts' value}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mgls@disable@setup}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mgls@disable@setup}{%
  \let\@mgls@setup@do\@mgls@setup@do@not
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mgls@enable@setup}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mgls@enable@setup}{%
  \let\@mgls@setup@do\@firstofone
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@unsetaction}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand\@mgls@unsetaction{0}
\define@choicekey{mgls}{multiunset}[\@mgls@unsetaction@val\@mgls@unsetaction]%
 {global,local,none}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\ifKV@mgls@presetlocal}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\define@boolkey{mgls}{presetlocal}[true]{}
\KV@mgls@presetlocalfalse
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@hyper}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mgls@hyper}{}
\define@choicekey{mgls}{hyper}[\@mgls@hyper@val\@mgls@hyper@nr]{true,false}[true]%
{%
  \renewcommand*{\@mgls@hyper}{hyper=#1}%
  \ifnum\@mgls@hyper@nr=1\relax
   \let\@mgls@hyperlink\@secondoftwo
  \else
   \let\@mgls@hyperlink\@@mgls@hyperlink
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@mgls@hyperlink}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@@mgls@hyperlink}[2]{%
  \ifx\@glslink\glsdonohyperlink
   #2%
  \else
   \glsxtr@org@dohyperlink{\glolinkprefix#1}{#2}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@hyperlink}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\let\@mgls@hyperlink\@@mgls@hyperlink
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsforelements}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mglsforelements}\marg{multi-label}\marg{cs}\marg{body}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\mglsforelements}[3]{%
  \expandafter\@for\expandafter#2\expandafter:\expandafter
    =\csname @gls@combined@#1@list\endcsname\do{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsforotherelements}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mglsforotherelements}\marg{multi-label}\marg{cs}\marg{body}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\mglsforotherelements}[3]{%
  \expandafter\@for\expandafter#2\expandafter:\expandafter
    =\csname @gls@combined@#1@list\endcsname\do
  {\expandafter\ifdefequal\csname @gls@combined@#1@main\endcsname{#2}{}{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsunsetothers}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglsunsetothers}[1]{%
  \mglsforotherelements{#1}{\@gls@tmp}{\glsunset{\@gls@tmp}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglslocalunsetothers}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglslocalunsetothers}[1]{%
  \mglsforotherelements{#1}{\@gls@tmp}{\glslocalunset{\@gls@tmp}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglselementreset}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglselementreset}[1]{%
 \ifKV@mgls@presetlocal
  \glslocalreset{#1}%
 \else
  \glsreset{#1}%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglselementunset}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglselementunset}[1]{%
 \ifKV@mgls@presetlocal
  \glslocalunset{#1}%
 \else
  \glsunset{#1}%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@resetall}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mgls@resetall}{}
\define@choicekey{mgls}{resetall}%
[\@mgls@resetall@val\@mgls@resetall@nr]{false,true}[true]%
{%
 \ifcase\@mgls@resetall@nr\relax
   \renewcommand*{\@mgls@resetall}{}%
 \or
   \renewcommand*{\@mgls@resetall}{%
     \@for\@gls@resetlabel:=\mglscurrentlist\do{\mglselementreset\@gls@resetlabel}}%
   \renewcommand*{\@mgls@unsetall}{}%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@resetmain}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mgls@resetmain}{}
\define@choicekey{mgls}{resetmain}
[\@mgls@resetmain@val\@mgls@resetmain@nr]{false,true}[true]%
{%
 \ifcase\@mgls@resetmain@nr\relax
   \renewcommand*{\@mgls@resetmain}{}%
 \or
   \renewcommand*{\@mgls@resetmain}{\mglselementreset\mglscurrentmainlabel}%
   \renewcommand*{\@mgls@unsetmain}{}%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@resetothers}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mgls@resetothers}{}
\define@choicekey{mgls}{resetothers}
[\@mgls@resetothers@val\@mgls@resetothers@nr]{false,true}[true]%
{%
 \ifcase\@mgls@resetothers@nr\relax
   \renewcommand*{\@mgls@resetothers}{}%
 \or
   \renewcommand*{\@mgls@resetothers}{%
     \@for\@gls@resetlabel:=\mglscurrentlist\do{%
       \ifx\@gls@resetlabel\mglscurrentmainlabel
       \else
         \mglselementreset\@gls@resetlabel
       \fi
     }%
   }%
   \renewcommand*{\@mgls@unsetothers}{}%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@unsetall}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mgls@unsetall}{}
\define@choicekey{mgls}{unsetall}%
[\@mgls@unsetall@val\@mgls@unsetall@nr]{false,true}[true]%
{%
 \ifcase\@mgls@unsetall@nr\relax
   \renewcommand*{\@mgls@unsetall}{}%
 \or
   \renewcommand*{\@mgls@unsetall}{%
     \@for\@gls@unsetlabel:=\mglscurrentlist\do{\mglselementunset\@gls@unsetlabel}}%
   \renewcommand*{\@mgls@resetall}{}%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@unsetmain}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mgls@unsetmain}{}
\define@choicekey{mgls}{unsetmain}
[\@mgls@unsetmain@val\@mgls@unsetmain@nr]{false,true}[true]%
{%
 \ifcase\@mgls@unsetmain@nr\relax
   \renewcommand*{\@mgls@unsetmain}{}%
 \or
   \renewcommand*{\@mgls@unsetmain}{\mglselementunset\mglscurrentmainlabel}%
   \renewcommand*{\@mgls@resetmain}{}%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@unsetothers}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mgls@unsetothers}{}
\define@choicekey{mgls}{unsetothers}
[\@mgls@unsetothers@val\@mgls@unsetothers@nr]{false,true}[true]%
{%
 \ifcase\@mgls@unsetothers@nr\relax
   \renewcommand*{\@mgls@unsetothers}{}%
 \or
   \renewcommand*{\@mgls@unsetothers}{%
     \@for\@gls@unsetlabel:=\mglscurrentlist\do{%
       \ifx\@gls@unsetlabel\mglscurrentmainlabel
       \else
         \mglselementunset\@gls@unsetlabel
       \fi
     }%
   }%
   \renewcommand*{\@mgls@resetothers}{}%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@setup@docurrent}
%\changes{1.48}{2021-11-22}{new}
%Set up the commands to determine whether or not to do the current
%element.
%    \begin{macrocode}
\newcommand{\glsxtr@setup@docurrent}{%
%    \end{macrocode}
% \cs{mglscurrentlabel} expands to the label of the current element.
% Should this element be skipped?
%    \begin{macrocode}
 \ifx\mglscurrentlabel\mglscurrentmainlabel
%    \end{macrocode}
% Main element. Should it be skipped?
%    \begin{macrocode}
   \mglsisfirstuse
   {%
     \ifKV@glsxtrcombined@firstskipmain
       \let\@mgls@do@current@element\@gobble
     \else
       \let\@mgls@do@current@element\@firstofone
     \fi
   }%
   {%
     \ifKV@glsxtrcombined@usedskipmain
       \let\@mgls@do@current@element\@gobble
     \else
       \let\@mgls@do@current@element\@firstofone
     \fi
   }%
 \else
%    \end{macrocode}
% Other element. Should it be skipped?
%    \begin{macrocode}
   \mglsisfirstuse
   {%
     \ifKV@glsxtrcombined@firstskipothers
       \let\@mgls@do@current@element\@gobble
     \else
       \let\@mgls@do@current@element\@firstofone
     \fi
   }%
   {%
     \ifKV@glsxtrcombined@usedskipothers
       \let\@mgls@do@current@element\@gobble
     \else
       \let\@mgls@do@current@element\@firstofone
     \fi
   }%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@mgls@checklastelement}
%\changes{1.48}{2021-11-22}{new}
% If the last element is skipped, \cs{mglsiflast} needs
% adjusting.
% The first argument should be either "first" or "used".
% The second argument is the multi-element label.
%    \begin{macrocode}
\newcommand*{\glsxtr@mgls@checklastelement}[2]{%
  \ifbool{KV@glsxtrcombined@#1skipmain}%
  {%
    \ifbool{KV@glsxtrcombined@#1skipothers}%
    {%
%    \end{macrocode}
% This condition has already been checked for.
%    \begin{macrocode}
    }%
    {%
%    \end{macrocode}
% Main skipped. The last item will be the last other element.
%    \begin{macrocode}
      \ifnum\mglselementindex=\glsxtrmultilastotherindex{#2}\relax
        \let\mglsiflast\@firstoftwo
      \else
        \let\mglsiflast\@secondoftwo
      \fi
    }%
  }%
  {%
%    \end{macrocode}
% Main not skipped.
%    \begin{macrocode}
     \ifbool{KV@glsxtrcombined@#1skipothers}%
     {%
%    \end{macrocode}
% Others skipped. The main element is the only item.
%    \begin{macrocode}
       \ifnum\mglselementindex=\glsxtrmultimainindex{#2}\relax
         \let\mglsiflast\@firstoftwo
       \else
         \let\mglsiflast\@secondoftwo
       \fi
     }%
     {%
%    \end{macrocode}
% None skipped. This isn't the last element.
%    \begin{macrocode}
       \let\mglsiflast\@secondoftwo
     }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrmglsWarnAllSkipped}
%\changes{1.48}{2021-11-22}{new}
%Warning if all elements are skipped. The first argument is the
%warning message, the second argument is the inserted content (final
%optional argument), the third command is the encapsulation command 
%(which may be a hyperlink).
%    \begin{macrocode}
\newcommand{\glsxtrmglsWarnAllSkipped}[3]{%
  \GlossariesExtraWarning{#1}%
  #3{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@mgls@applyopts}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@mgls@applyopts}[1]{%
  \edef\@mgls@dooptions{\noexpand\setkeys*{mgls}{\expandonce#1}}%
  \@mgls@dooptions
%    \end{macrocode}
% Append any unknown options to all.
%    \begin{macrocode}
  \ifdefvoid\XKV@rm{}{\eappto\@mgls@all{,\expandonce\XKV@rm}}%
%    \end{macrocode}
% If setup key has been used, check for pre-option keys:
%    \begin{macrocode}
  \ifdefvoid\@mgls@setup
  {}%
  {%
    \edef\@mgls@dooptions{%
       \noexpand\setkeys*{glsxtrcombinedpreopts}{\expandonce\@mgls@setup}}%
    \mgls@disable@mglsopts
    \@mgls@dooptions
    \mgls@enable@mglsopts
%    \end{macrocode}
% Save remaining setup options.
%    \begin{macrocode}
    \ifx\@mgls@setupoptions\@empty
      \let\@mgls@setupoptions\XKV@rm
    \else
      \eappto\@mgls@setupoptions{,\expandonce\XKV@rm}%
    \fi
  }%
%    \end{macrocode}
% Apply gls unset/reset options.
%    \begin{macrocode}
  \@mgls@resetall
  \@mgls@unsetall
  \@mgls@resetmain
  \@mgls@unsetmain
  \@mgls@resetothers
  \@mgls@unsetothers
%    \end{macrocode}
% Disable.
%    \begin{macrocode}
  \let\@mgls@resetall\@empty
  \let\@mgls@resetmain\@empty
  \let\@mgls@resetothers\@empty
  \let\@mgls@unsetall\@empty
  \let\@mgls@unsetmain\@empty
  \let\@mgls@unsetothers\@empty
%    \end{macrocode}
% First use flags.
%    \begin{macrocode}
  \ifmglsused\mglscurrentmultilabel
  {\let\mglsisfirstuse\@secondoftwo}%
  {\let\mglsisfirstuse\@firstoftwo}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@firstofthree}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\providecommand{\@firstofthree}[3]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@secondofthree}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\providecommand{\@secondofthree}[3]{#2}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@thirdofthree}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\providecommand{\@thirdofthree}[3]{#3}
%    \end{macrocode}
%\end{macro}
%
%The main internal command for referencing multi-entries:
%\begin{macro}{\glsxtr@mgls@inner}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{glsxtr@mgls@inner}\marg{options}\marg{label}\marg{insert}\marg{first
%cs}\marg{not first cs}\marg{main first cs}\marg{main other cs}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\glsxtr@mgls@inner}[7]{%
 \let\mglslastmainlabel\@empty
 \let\mglsiflastmainwasfirstuse\@firstoftwo
 \let\mglsiflastmainwasplural\@secondoftwo
 \let\mglsiflastmaincapscase\@firstofthree
 \let\mglsiflastmainskipped\@firstoftwo
 \bgroup
 \ifcsundef{@gls@combined@#2@main}%
 {%
   \glsxtrundefaction{Multi entry `#2' hasn't been defined}%
   {You need to define `#2' with \string\multiglossaryentry}%
   \gdef\@mgls@post@hookdefs{%
     \protected@edef\mglslastmultilabel{#2}%
     \let\mglswasfirstuse\@firstoftwo
     \let\mglslastcategory\@empty
     \let\mglsiflastelementskipped\@firstoftwo
     \let\mglsiflastelementwasfirstuse\@firstoftwo
     \let\mglsiflastelementwasplural\@secondoftwo
     \let\mglsiflastelementcapscase\@firstofthree
     \let\mglslastelementlabel\@empty
     \let\mgls@do@postlinkhook\relax
   }%
 }%
 {%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{initialise hooks}
% Initialise hooks in case component entries haven't been defined
% (which may happen with \app{bib2gls}).
%    \begin{macrocode}
   \let\glsxtrifwasfirstuse\@firstoftwo
   \let\glsifplural\@secondoftwo
   \let\glscapscase\@firstofthree
%    \end{macrocode}
% Save information for hooks.
%    \begin{macrocode}
   \protected@edef\mglscurrentmultilabel{#2}%
   \letcs\mglscurrentmainlabel{@gls@combined@#2@main}%
   \letcs\mglscurrentlist{@gls@combined@#2@list}%
   \letcs\mglscurrentoptions{@gls@combined@#2@options}%
%    \end{macrocode}
% Initialise (may be changed if \texttt{multiunset} is present):
%    \begin{macrocode}
   \ifmglsused\mglscurrentmultilabel
   {\let\mglsisfirstuse\@secondoftwo}%
   {\let\mglsisfirstuse\@firstoftwo}%
%    \end{macrocode}
% Only obtain pre-option keys:
%    \begin{macrocode}
   \edef\@mgls@dooptions{%
      \noexpand\setkeys*{glsxtrcombinedpreopts}{\expandonce\mglscurrentoptions}}%
   \@mgls@dooptions
%    \end{macrocode}
% Save remaining setup options.
%    \begin{macrocode}
   \let\@mgls@setupoptions\XKV@rm
%    \end{macrocode}
% Apply \cs{mgls} options.
%    \begin{macrocode}
   \mgls@disable@setup
   \ifdefvoid\@gls@combined@mglsopts
   {}%
   {\glsxtr@mgls@applyopts\@gls@combined@mglsopts}%
   \mgls@enable@setup
%    \end{macrocode}
% Apply options provided in \verb|#1|.
%    \begin{macrocode}
   \ifstrempty{#1}{}{\def\@mgls@options{#1}\glsxtr@mgls@applyopts\@mgls@options}%
%    \end{macrocode}
% Check for attribute settings.
%    \begin{macrocode}
   \ifx\@gls@combined@category\empty
%    \end{macrocode}
% No category
%    \begin{macrocode}
   \else
%    \end{macrocode}
% Attribute options:
%    \begin{macrocode}
     \glshascategoryattribute{\@gls@combined@category}{multioptions}%
     {%
       \letcs\@mgls@attroptions{@glsxtr@categoryattr@@\@gls@combined@category 
           @multioptions}%
%    \end{macrocode}
% Only obtain pre-option keys:
%    \begin{macrocode}
       \let\@gls@combined@mglsopts\@empty
       \edef\@mgls@dooptions{%
         \noexpand\setkeys*{glsxtrcombinedpreopts}{\expandonce\@mgls@attroptions}}%
       \@mgls@dooptions
%    \end{macrocode}
% Append remaining options:
%    \begin{macrocode}
       \eappto\@mgls@setupoptions{,\expandonce\XKV@rm}%
       \ifx\@gls@combined@mglsopts\@empty
       \else
%    \end{macrocode}
% mgls options found:
%    \begin{macrocode}
         \let\@mgls@setup\@empty
         \mgls@disable@setup
         \glsxtr@mgls@applyopts\@gls@combined@mglsopts
         \mgls@enable@setup
       \fi
     }%
     {}%
   \fi
%    \end{macrocode}
% Apply setup options.
%    \begin{macrocode}
   \edef\@mgls@dooptions{%
      \noexpand\setkeys{glsxtrcombined}{\expandonce\@mgls@setupoptions}}%
   \@mgls@dooptions
%    \end{macrocode}
% Provide local user-level access to category:
%    \begin{macrocode}
   \let\mglscurrentcategory\@gls@combined@category
%    \end{macrocode}
% Should the entire content be a hyperlink?
%    \begin{macrocode}
   \ifnum\@gls@combined@hyper=1\relax
     \def\@mgls@combinedlink{\@mgls@hyperlink{\mglscurrentmainlabel}}%
   \else
     \def\@mgls@combinedlink{\@firstofone}%
   \fi
%    \end{macrocode}
% Entire content encapsulator.
%    \begin{macrocode}
   \def\@gls@combined@encapsulator##1{%
       \@mgls@combinedlink{\csuse{\@gls@combined@textformat}{##1}}}%
%    \end{macrocode}
% Initialise.
%    \begin{macrocode}
   \let\@mgls@do@current@element\@firstofone
%    \end{macrocode}
% Check if all elements are being skipped.
%    \begin{macrocode}
   \mglsisfirstuse
   {%
     \ifKV@glsxtrcombined@firstskipmain
       \ifKV@glsxtrcombined@firstskipothers
%    \end{macrocode}
% Just do the warning and insert. This will ignore the loop.
%    \begin{macrocode}
         \let\@gls@org@combined@encapsulator\@gls@combined@encapsulator
         \def\@gls@combined@encapsulator##1{%
           \glsxtrmglsWarnAllSkipped{All elements skipped for
             first use of multi-entry `#2'}{#3}%
             {\@gls@org@combined@encapsulator}%
         }%
         \let\@mgls@do@current@element\@gobble
       \fi
     \fi
   }%
   {%
     \ifKV@glsxtrcombined@usedskipmain
       \ifKV@glsxtrcombined@usedskipothers
%    \end{macrocode}
% Just do the warning and insert. This will ignore the loop.
%    \begin{macrocode}
         \let\@gls@org@combined@encapsulator\@gls@combined@encapsulator
         \def\@gls@combined@encapsulator##1{%
           \glsxtrmglsWarnAllSkipped{All elements skipped for
             subsequent use of multi-entry `#2'}{#3}%
             {\@gls@org@combined@encapsulator}%
         }%
         \let\@mgls@do@current@element\@gobble
       \fi
     \fi
   }%
%    \end{macrocode}
% Determine prefix and suffix.
%    \begin{macrocode}
   \mglsisfirstuse
   {%
     \let\mglscurrentprefix\@gls@combined@firstprefix
     \let\mglscurrentsuffix\@gls@combined@firstsuffix
   }%
   {%
     \let\mglscurrentprefix\@gls@combined@usedprefix
     \let\mglscurrentsuffix\@gls@combined@usedsuffix
   }%
%    \end{macrocode}
%Set up post-link hook used after current scope.
%    \begin{macrocode}
   \xdef\@mgls@post@hookdefs{%
    \noexpand\def\noexpand\mglslastmultilabel{\expandonce\mglscurrentmultilabel}%
    \noexpand\def\noexpand\mglslastcategory{\mglscurrentcategory}%
   }%
   \ifx\@mgls@do@current@element\@gobble
     \gappto\@mgls@post@hookdefs{%
       \let\mglsiflastelementskipped\@firstoftwo
       \let\mglslastelementlabel\@empty
       \let\mglsiflastelementwasfirstuse\@firstoftwo
       \let\mglsiflastelementwasplural\@secondoftwo
       \let\mglsiflastelementcapscase\@firstofthree
     }%
   \fi
   \mglsisfirstuse
   {%
     \gappto\@mgls@post@hookdefs{\let\mglswasfirstuse\@firstoftwo}%
%    \end{macrocode}
% Determine if the multi-entry post-link hook should be applied.
%    \begin{macrocode}
     \ifcase\@gls@combined@mpostlink@nr\relax
%    \end{macrocode}
% \texttt{mpostlink=false}.
%    \begin{macrocode}
       \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\relax}%
     \or
%    \end{macrocode}
% \texttt{mpostlink=true}.
%    \begin{macrocode}
       \ifcase\@gls@combined@mpostlinkelement@nr\relax
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastelementpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastmainpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglscustompostlinkhook}%
       \fi
     \or
%    \end{macrocode}
% \texttt{mpostlink=firstonly}.
%    \begin{macrocode}
       \ifcase\@gls@combined@mpostlinkelement@nr\relax
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastelementpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastmainpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglscustompostlinkhook}%
       \fi
     \or
%    \end{macrocode}
% \texttt{mpostlink=usedonly}.
%    \begin{macrocode}
       \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\relax}%
     \fi
   }%
   {%
     \gappto\@mgls@post@hookdefs{\let\mglswasfirstuse\@secondoftwo}%
%    \end{macrocode}
% Determine if the multi-entry post-link hook should be applied.
%    \begin{macrocode}
     \ifcase\@gls@combined@mpostlink@nr\relax
%    \end{macrocode}
% \texttt{mpostlink=false}.
%    \begin{macrocode}
       \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\relax}%
     \or
%    \end{macrocode}
% \texttt{mpostlink=true}.
%    \begin{macrocode}
       \ifcase\@gls@combined@mpostlinkelement@nr\relax
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastelementpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastmainpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglscustompostlinkhook}%
       \fi
     \or
%    \end{macrocode}
% \texttt{mpostlink=firstonly}.
%    \begin{macrocode}
       \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\relax}%
     \or
%    \end{macrocode}
% \texttt{mpostlink=usedonly}.
%    \begin{macrocode}
       \ifcase\@gls@combined@mpostlinkelement@nr\relax
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastelementpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastmainpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglscustompostlinkhook}%
       \fi
     \fi
   }%
%    \end{macrocode}
% Save current post-link hook.
%    \begin{macrocode}
   \let\mgls@org@postlinkhook\glspostlinkhook
%    \end{macrocode}
% Prefix.
%    \begin{macrocode}
   \mglsprefix
%    \end{macrocode}
% Initialise last element label (for \cs{mglssuffix}).
%    \begin{macrocode}
   \let\mglslastelementlabel\@empty
   \@gls@combined@encapsulator
   {%
%    \end{macrocode}
% Save previous label.
%    \begin{macrocode}
    \def\@mgls@previouslabel{}%
    \mglselementindex=0\relax
    \@for\mglscurrentlabel:=\mglscurrentlist\do{%
     \advance\mglselementindex by 1\relax
     \glsxtr@setup@docurrent
%    \end{macrocode}
% Is this the last element?
%    \begin{macrocode}
     \ifx\@xfor@nextelement\@nnil
       \let\mglsiflast\@firstoftwo
     \else
       \let\mglsiflast\@secondoftwo
%    \end{macrocode}
% Are any elements being skipped?
%    \begin{macrocode}
       \mglsisfirstuse
       {%
        \glsxtr@mgls@checklastelement{first}{#2}%
       }%
       {%
        \glsxtr@mgls@checklastelement{used}{#2}%
       }%
     \fi
%    \end{macrocode}
% Should the element post-link hook be used?
%    \begin{macrocode}
     \ifcase\@gls@combined@postlinks@nr\relax
%    \end{macrocode}
% \texttt{postlinks=none}
%    \begin{macrocode}
       \let\glspostlinkhook\relax
     \or
%    \end{macrocode}
% \texttt{postlinks=all}
%    \begin{macrocode}
       \let\glspostlinkhook\mgls@org@postlinkhook
     \or
%    \end{macrocode}
% \texttt{postlinks=notlast}
%    \begin{macrocode}
       \mglsiflast
       {%
         \let\glspostlinkhook\relax
       }%
       {%
         \let\glspostlinkhook\mgls@org@postlinkhook
       }%
     \or
%    \end{macrocode}
% \texttt{postlinks=mainnotlast}
%    \begin{macrocode}
       \ifx\mglscurrentlabel\mglscurrentmainlabel
         \mglsiflast
         {%
           \let\glspostlinkhook\relax
         }%
         {%
           \let\glspostlinkhook\mgls@org@postlinkhook
         }%
       \else
         \let\glspostlinkhook\relax
       \fi
     \or
%    \end{macrocode}
% \texttt{postlinks=mainonly}
%    \begin{macrocode}
       \ifx\mglscurrentlabel\mglscurrentmainlabel
         \let\glspostlinkhook\mgls@org@postlinkhook
       \else
         \let\glspostlinkhook\relax
       \fi
     \or
%    \end{macrocode}
% \texttt{postlinks=othernotlast}
%    \begin{macrocode}
       \ifx\mglscurrentlabel\mglscurrentmainlabel
         \let\glspostlinkhook\relax
       \else
         \mglsiflast
         {%
           \let\glspostlinkhook\relax
         }%
         {%
           \let\glspostlinkhook\mgls@org@postlinkhook
         }%
       \fi
     \or
%    \end{macrocode}
% \texttt{postlinks=otheronly}
%    \begin{macrocode}
       \ifx\mglscurrentlabel\mglscurrentmainlabel
         \let\glspostlinkhook\relax
       \else
         \let\glspostlinkhook\mgls@org@postlinkhook
       \fi
     \fi
%    \end{macrocode}
% Save the last element for the multi-entry post-link hook.
%    \begin{macrocode}
     \mglsiflast
     {%
       \xappto\@mgls@post@hookdefs{%
         \noexpand\def\noexpand\mglslastelementlabel
           {\expandonce\mglscurrentlabel}}%
     }%
     {}%
%    \end{macrocode}
% Do current element:
%    \begin{macrocode}
     \@mgls@do@current@element
     {%
%    \end{macrocode}
% Pre element hook.
%    \begin{macrocode}
       \mglselementprehook
%    \end{macrocode}
% Is this the first use of the current element?
%    \begin{macrocode}
       \GlsXtrIfUnusedOrUndefined{\mglscurrentlabel}%
       {\let\@mgls@current@iffirstuse\@firstoftwo}%
       {\let\@mgls@current@iffirstuse\@secondoftwo}%
       \ifx\mglscurrentlabel\mglscurrentmainlabel
%    \end{macrocode}
% Main element.
% Location encap option:
%    \begin{macrocode}
         \edef\@mgls@current@options{format=\@gls@combined@encapmain}%
%    \end{macrocode}
%Indexing option:
%    \begin{macrocode}
         \ifcase\@gls@combined@indexmain
          \appto\@mgls@current@options{,noindex}%
         \or
          \appto\@mgls@current@options{,noindex=false}%
         \or
          \@mgls@current@iffirstuse
          {\appto\@mgls@current@options{,noindex=false}}%
          {\appto\@mgls@current@options{,noindex}}%
         \fi
%    \end{macrocode}
% Hyperlink option:
%    \begin{macrocode}
         \ifcase\@gls@combined@hyper\relax
           \appto\@mgls@current@options{,hyper=false}% none
         \or
           \appto\@mgls@current@options{,hyper=false}% allmain
         \or
           \eappto\@mgls@current@options{,\@mgls@hyper}% mainonly
         \or
           \eappto\@mgls@current@options{,\@mgls@hyper}% individual
         \or
           \appto\@mgls@current@options{,hyper=false}% otheronly
         \or
          \mglsisfirstuse
          {%
           \appto\@mgls@current@options{,hyper=false}% notmainfirst
          }%
          {%
           \eappto\@mgls@current@options{,\@mgls@hyper}% notmainfirst
          }%
         \or
           \eappto\@mgls@current@options{,\@mgls@hyper}% nototherfirst
         \or
          \mglsisfirstuse
          {%
           \appto\@mgls@current@options{,hyper=false}% notfirst
          }%
          {%
           \eappto\@mgls@current@options{,\@mgls@hyper}% notfirst
          }%
         \fi
%    \end{macrocode}
%Append all and then main:
%    \begin{macrocode}
         \eappto\@mgls@current@options{,\@mgls@all,\@mgls@main}%
       \else
%    \end{macrocode}
% Other element.
% Location encap option:
%    \begin{macrocode}
         \edef\@mgls@current@options{format=\@gls@combined@encapothers}%
%    \end{macrocode}
% Indexing option:
%    \begin{macrocode}
         \ifcase\@gls@combined@indexothers\relax
          \appto\@mgls@current@options{,noindex}%
         \or
          \appto\@mgls@current@options{,noindex=false}%
         \or
          \@mgls@current@iffirstuse
          {\appto\@mgls@current@options{,noindex=false}}%
          {\appto\@mgls@current@options{,noindex}}%
         \fi
%    \end{macrocode}
% Hyperlink option:
%    \begin{macrocode}
         \ifcase\@gls@combined@hyper\relax
           \appto\@mgls@current@options{,hyper=false}% none
         \or
           \appto\@mgls@current@options{,hyper=false}% allmain
         \or
           \appto\@mgls@current@options{,hyper=false}% mainonly
         \or
           \eappto\@mgls@current@options{,\@mgls@hyper}% individual
         \or
           \eappto\@mgls@current@options{,\@mgls@hyper}% otheronly
         \or
           \eappto\@mgls@current@options{,\@mgls@hyper}% notmainfirst
         \or
          \mglsisfirstuse
          {%
           \appto\@mgls@current@options{,hyper=false}% nototherfirst
          }%
          {%
           \eappto\@mgls@current@options{,\@mgls@hyper}% nototherfirst
          }%
         \or
          \mglsisfirstuse
          {%
           \appto\@mgls@current@options{,hyper=false}% notfirst
          }%
          {%
           \eappto\@mgls@current@options{,\@mgls@hyper}% notfirst
          }%
         \fi
%    \end{macrocode}
%Append all and then others:
%    \begin{macrocode}
         \eappto\@mgls@current@options{,\@mgls@all,\@mgls@others}%
       \fi
%    \end{macrocode}
% Is this the first element?
%    \begin{macrocode}
       \ifx\@mgls@previouslabel\empty
        \ifx\mglscurrentlabel\mglscurrentmainlabel
          \let\@mgls@cs#6\relax
        \else
          \let\@mgls@cs#4\relax
        \fi
       \else
%    \end{macrocode}
% Not the first element so add separator.
%    \begin{macrocode}
         \@mgls@previous@iffirstuse
         {%
           \@mgls@current@iffirstuse
           {\glscombinedfirstsepfirst{\@mgls@previouslabel}{\mglscurrentlabel}}%
           {\glscombinedfirstsep{\@mgls@previouslabel}{\mglscurrentlabel}}%
         }%
         {%
           \@mgls@current@iffirstuse
           {\glscombinedsepfirst{\@mgls@previouslabel}{\mglscurrentlabel}}%
           {\glscombinedsep{\@mgls@previouslabel}{\mglscurrentlabel}}%
         }%
        \ifx\mglscurrentlabel\mglscurrentmainlabel
          \let\@mgls@cs#7\relax
        \else
          \let\@mgls@cs#5\relax
        \fi
       \fi
%    \end{macrocode}
% Is this the last element?
%    \begin{macrocode}
       \mglsiflast
        {\expandafter\@mgls@cs\expandafter{\@mgls@current@options}{\mglscurrentlabel}[#3]}%
        {\expandafter\@mgls@cs\expandafter{\@mgls@current@options}{\mglscurrentlabel}[]}%
%    \end{macrocode}
% Is this the main element? If so, save information for post-link
% hook.
%    \begin{macrocode}
       \ifx\mglscurrentlabel\mglscurrentmainlabel
        \xappto\@mgls@post@hookdefs{%
          \noexpand\def\noexpand\mglslastmainlabel
            {\expandonce\mglscurrentmainlabel}%
        }%
        \glsxtrifwasfirstuse
        {%
         \gappto\@mgls@post@hookdefs{\let\mglsiflastmainwasfirstuse\@firstoftwo}%
        }%
        {%
         \gappto\@mgls@post@hookdefs{\let\mglsiflastmainwasfirstuse\@secondoftwo}%
        }%
        \glsifplural
        {%
         \gappto\@mgls@post@hookdefs{\let\mglsiflastmainwasplural\@firstoftwo}%
        }%
        {%
         \gappto\@mgls@post@hookdefs{\let\mglsiflastmainwasplural\@secondoftwo}%
        }%
        \glscapscase
        {%
          \gappto\@mgls@post@hookdefs{%
            \let\mglsiflastmaincapscase\@firstofthree
          }%
        }%
        {%
          \gappto\@mgls@post@hookdefs{%
            \let\mglsiflastmaincapscase\@secondofthree
          }%
        }%
        {%
          \gappto\@mgls@post@hookdefs{%
            \let\mglsiflastmaincapscase\@thirdofthree
          }%
        }%
       \fi
       \let\@mgls@previouslabel\mglscurrentlabel
       \let\@mgls@previous@iffirstuse\@mgls@current@iffirstuse
      }%
%    \end{macrocode}
% Post element hook.
%    \begin{macrocode}
       \mglselementposthook
    }%
    \ifx\mglslastmainlabel\@empty
     \gappto\@mgls@post@hookdefs{\let\mglsiflastmainskipped\@firstoftwo}%
    \else
     \gappto\@mgls@post@hookdefs{\let\mglsiflastmainskipped\@secondoftwo}%
    \fi
%    \end{macrocode}
% Encapsulator may introduce grouping so check here.
%    \begin{macrocode}
    \ifx\@mgls@do@current@element\@gobble
     \gappto\@mgls@post@hookdefs{\let\mglsiflastelementskipped\@firstoftwo}%
    \else
     \gappto\@mgls@post@hookdefs{\let\mglsiflastelementskipped\@secondoftwo}%
    \fi
    \glsxtrifwasfirstuse
    {%
     \gappto\@mgls@post@hookdefs{\let\mglsiflastelementwasfirstuse\@firstoftwo}%
    }%
    {%
     \gappto\@mgls@post@hookdefs{\let\mglsiflastelementwasfirstuse\@secondoftwo}%
    }%
    \glsifplural
    {%
     \gappto\@mgls@post@hookdefs{\let\mglsiflastelementwasplural\@firstoftwo}%
    }%
    {%
     \gappto\@mgls@post@hookdefs{\let\mglsiflastelementwasplural\@secondoftwo}%
    }%
    \glscapscase
    {%
      \gappto\@mgls@post@hookdefs{%
        \let\mglsiflastelementcapscase\@firstofthree
      }%
    }%
    {%
      \gappto\@mgls@post@hookdefs{%
        \let\mglsiflastelementcapscase\@secondofthree
      }%
    }%
    {%
      \gappto\@mgls@post@hookdefs{%
        \let\mglsiflastelementcapscase\@thirdofthree
      }%
    }%
   }%
%    \end{macrocode}
% Suffix needs post-link hook commands.
%    \begin{macrocode}
   \@mgls@post@hookdefs
   \mglssuffix
%    \end{macrocode}
%Unset multi-entry first use flag after current scope.
%    \begin{macrocode}
   \ifcase\@mgls@unsetaction\relax
     \xappto\@mgls@post@hookdefs{%
       \noexpand\mglsunset{\expandonce\mglscurrentmultilabel}}%
   \or
     \xappto\@mgls@post@hookdefs{%
       \noexpand\mglslocalunset{\expandonce\mglscurrentmultilabel}}%
   \fi
 }%
 \glsxtrmglswrite{#2}%
 \egroup
 \@mgls@post@hookdefs
 \mgls@do@postlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglscustompostlinkhook}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglscustompostlinkhook}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglslastelementpostlinkhook}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglslastelementpostlinkhook}{%
 \let\glsxtrifwasfirstuse\mglsiflastelementwasfirstuse
 \let\glsifplural\mglsiflastelementwasplural
 \let\glscapscase\mglsiflastelementcapscase
 \let\glslabel\mglslastelementlabel
 \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglslastmainpostlinkhook}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglslastmainpostlinkhook}{%
 \let\glsxtrifwasfirstuse\mglsiflastmainwasfirstuse
 \let\glsifplural\mglsiflastmainwasplural
 \let\glscapscase\mglsiflastmaincapscase
 \let\glslabel\mglslastmainlabel
 \glspostlinkhook
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsdefcategoryprefix}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglsdefcategoryprefix}[2]{%
 \csdef{mglsprefix@#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglshascategoryprefix}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglshascategoryprefix}[3]{%
 \ifcsdef{mglsprefix@#1}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsusecategoryprefix}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglsusecategoryprefix}[1]{%
 \csuse{mglsprefix@#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsprefix}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglsprefix}{%
 \ifdefempty\mglscurrentcategory
 {\mglscurrentprefix}%
 {%
   \mglshascategoryprefix{\mglscurrentcategory}%
   {\mglsusecategoryprefix{\mglscurrentcategory}}%
   {\mglscurrentprefix}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsdefcategorysuffix}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglsdefcategorysuffix}[2]{%
 \csdef{mglssuffix@#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglshascategorysuffix}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglshascategorysuffix}[3]{%
 \ifcsdef{mglssuffix@#1}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsusecategorysuffix}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglsusecategorysuffix}[1]{%
 \csuse{mglssuffix@#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglssuffix}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglssuffix}{%
 \ifdefempty\mglscurrentcategory
 {\ifdefempty{\mglscurrentsuffix}{}{\space(\mglscurrentsuffix)}}%
 {%
   \mglshascategorysuffix{\mglscurrentcategory}%
   {\mglsusecategorysuffix{\mglscurrentcategory}}%
   {\ifdefempty{\mglscurrentsuffix}{}{\space(\mglscurrentsuffix)}}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglselementprehook}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglselementprehook}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglselementposthook}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mglselementposthook}{}
%    \end{macrocode}
%\end{macro}
%
%Separators.
%\begin{macro}{\glscombinedsep}
%\changes{1.48}{2021-11-22}{new}
%Separator between two elements that have been marked as used.
%This takes the two element labels as arguments.
%    \begin{macrocode}
\newcommand*{\glscombinedsep}[2]{%
  \glshasattribute{#1}{combinedsep}%
  {\glsgetattribute{#1}{combinedsep}}%
  { }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glscombinedfirstsepfirst}
%\changes{1.48}{2021-11-22}{new}
%Separator following and preceding a first use.
%    \begin{macrocode}
\newcommand*{\glscombinedfirstsepfirst}[2]{%
  \glshasattribute{#1}{combinedfirstsepfirst}%
  {\glsgetattribute{#1}{combinedfirstsepfirst}}%
  {\glscombinedsep{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glscombinedfirstsep}
%\changes{1.48}{2021-11-22}{new}
%Separator following a first use.
%    \begin{macrocode}
\newcommand*{\glscombinedfirstsep}[2]{%
  \glshasattribute{#1}{combinedfirstsep}%
  {\glsgetattribute{#1}{combinedfirstsep}}%
  {\glscombinedsep{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glscombinedsepfirst}
%\changes{1.48}{2021-11-22}{new}
%Separator preceding a first use.
%    \begin{macrocode}
\newcommand*{\glscombinedsepfirst}[2]{%
  \glshasattribute{#1}{combinedsepfirst}%
  {\glsgetattribute{#1}{combinedsepfirst}}%
  {\glscombinedsep{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glssetcombinedsepabbrvnbsp}
%\changes{1.48}{2021-11-22}{new}
%Provide shortcut for using non-breakable space following an
%abbreviation that has already been used.
%\changes{1.49}{2022-10-14}{corrected spelling of \cs{ifglshasshort}}
%    \begin{macrocode}
\newcommand*{\glssetcombinedsepabbrvnbsp}{%
 \renewcommand*{\glscombinedsep}[2]{%
  \glshasattribute{##1}{combinedsep}%
  {\glsgetattribute{##1}{combinedsep}}%
  {\ifglshasshort{##1}{~}{ }}%
 }%
 \renewcommand*{\glscombinedsepfirst}[2]{%
  \glshasattribute{##1}{combinedsepfirst}%
  {\glsgetattribute{##1}{combinedsepfirst}}%
  {\ifglshasshort{##1}{~}{ }}%
 }%
 \renewcommand*{\glscombinedfirstsep}[2]{%
  \glshasattribute{##1}{combinedfirstsep}%
  {\glsgetattribute{##1}{combinedfirstsep}}%
  { }%
 }%
 \renewcommand*{\glscombinedfirstsepfirst}[2]{%
  \glshasattribute{##1}{combinedfirstsepfirst}%
  {\glsgetattribute{##1}{combinedfirstsepfirst}}%
  { }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glssetcombinedsepabbrvnone}
%\changes{1.48}{2021-11-22}{new}
%Provide shortcut for using nothing if either on next use are
%abbreviations (otherwise use space).
%\changes{1.49}{2022-10-14}{corrected spelling of \cs{ifglshasshort}}
%    \begin{macrocode}
\newcommand*{\glssetcombinedsepabbrvnone}{%
 \renewcommand*{\glscombinedsep}[2]{%
   \glshasattribute{##1}{combinedsep}%
   {\glsgetattribute{##1}{combinedsep}}%
   {\ifglshasshort{##1}{}{\ifglshasshort{##2}{}{ }}}%
 }%
 \renewcommand*{\glscombinedsepfirst}[2]{%
   \glshasattribute{##1}{combinedsepfirst}%
   {\glsgetattribute{##1}{combinedsepfirst}}%
   {\ifglshasshort{##1}{}{ }}%
 }%
 \renewcommand*{\glscombinedfirstsep}[2]{%
  \glshasattribute{##1}{combinedfirstsep}%
  {\glsgetattribute{##1}{combinedfirstsep}}%
  {\ifglshasshort{##2}{}{ }}%
 }%
 \renewcommand*{\glscombinedfirstsepfirst}[2]{%
  \glshasattribute{##1}{combinedfirstsepfirst}%
  {\glsgetattribute{##1}{combinedfirstsepfirst}}%
  { }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glssetcombinedsepnarrow}
%\changes{1.48}{2021-11-22}{new}
%\changes{1.49}{2022-10-14}{corrected spelling of \cs{ifglshasshort}}
%Measures both.
%    \begin{macrocode}
\newcommand*{\glssetcombinedsepnarrow}[2]{%
 \renewcommand*{\glscombinedsep}[2]{%
  \glshasattribute{##1}{combinedsep}%
  {\glsgetattribute{##1}{combinedsep}}%
  {%
   \ifglshasshort{##1}%
   {\glsmeasurewidth{\dimen@}{\glsentryshort{##1}}}%
   {\glsmeasurewidth{\dimen@}{\glsentrytext{##1}}}%
   \ifdim\dimen@<#1\relax
    #2%
   \else
     \ifglshasshort{##2}%
     {\glsmeasurewidth{\dimen@}{\glsentryshort{##2}}}%
     {\glsmeasurewidth{\dimen@}{\glsentrytext{##2}}}%
     \ifdim\dimen@<#1\relax
      #2%
     \else
      \space
     \fi
   \fi
  }%
 }%
 \renewcommand*{\glscombinedsepfirst}[2]{%
  \glshasattribute{##1}{combinedsepfirst}%
  {\glsgetattribute{##1}{combinedsepfirst}}%
  {%
   \ifglshasshort{##1}%
   {\glsmeasurewidth{\dimen@}{\glsentryshort{##1}}}%
   {\glsmeasurewidth{\dimen@}{\glsentrytext{##1}}}%
   \ifdim\dimen@<#1\relax
    #2%
   \else
     \ifhaslong{##2}%
     {\glsmeasurewidth{\dimen@}{\glsentrylong{##2}}}%
     {\glsmeasurewidth{\dimen@}{\glsentryfirst{##2}}}%
     \ifdim\dimen@<#1\relax
      #2%
     \else
      \space
     \fi
   \fi
  }%
 }%
 \renewcommand*{\glscombinedfirstsep}[2]{%
  \glshasattribute{##1}{combinedfirstsep}%
  {\glsgetattribute{##1}{combinedfirstsep}}%
  {%
    \ifhaslong{##1}%
    {\glsmeasurewidth{\dimen@}{\glsentrylong{##1}}}%
    {\glsmeasurewidth{\dimen@}{\glsentryfirst{##1}}}%
    \ifdim\dimen@<#1\relax
     #2%
    \else
      \ifglshasshort{##2}%
      {\glsmeasurewidth{\dimen@}{\glsentryshort{##2}}}%
      {\glsmeasurewidth{\dimen@}{\glsentrytext{##2}}}%
      \ifdim\dimen@<#1\relax
       #2%
      \else
       \space
      \fi
    \fi
  }%
 }%
 \renewcommand*{\glscombinedfirstsepfirst}[2]{%
  \glshasattribute{##1}{combinedfirstsepfirst}%
  {\glsgetattribute{##1}{combinedfirstsepfirst}}%
  {%
    \ifhaslong{##1}%
    {\glsmeasurewidth{\dimen@}{\glsentrylong{##1}}}%
    {\glsmeasurewidth{\dimen@}{\glsentryfirst{##1}}}%
    \ifdim\dimen@<#1\relax
     #2%
    \else
      \ifhaslong{##2}%
      {\glsmeasurewidth{\dimen@}{\glsentrylong{##2}}}%
      {\glsmeasurewidth{\dimen@}{\glsentryfirst{##2}}}%
      \ifdim\dimen@<#1\relax
       #2%
      \else
       \space
      \fi
    \fi
  }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@mglswrite}
%\changes{1.48}{2021-11-22}{new}
%Write information to the aux file for \app{bib2gls} to pick up, but
%only need to do it once per label since it only indicates which multi-entry
%has been referenced without any additional information.
%    \begin{macrocode}
\newcommand{\glsxtrmglswrite}[1]{%
 \ifx\@glsxtr@record@setting\@glsxtr@record@setting@off
 \else
  \protected@edef\@glsxtr@mglslabel{#1}%
  \ifdef\@glsxtr@mglsreflist
  {%
    \expandafter\DTLifinlist\expandafter{\@glsxtr@mglslabel}%
    {\@glsxtr@mglsreflist}{}%
    {%
      \xappto\@glsxtr@mglsreflist{,\expandonce\@glsxtr@mglslabel}%
      \if@mgls@writeseparaterefs
        \protected@write\@auxout{}{\string\@glsxtr@mglsrefs{#1}}%
      \fi
    }%
  }%
  {%
    \global\let\@glsxtr@mglsreflist\@glsxtr@mglslabel
    \if@mgls@writeseparaterefs
      \protected@write\@auxout{}{\string\@glsxtr@mglsrefs{#1}}%
    \else
%    \end{macrocode}
%\changes{1.52}{2023-06-28}{replaced \cs{protected@write} with \cs{write}}
%Bug fix \#262: \cs{immediate}\cs{protected@write} doesn't work in
%end document hook when \sty{tikz} loaded. No real need for
%\cs{protected@write} as \cs{@glsxtr@mglsreflist} is just a
%comma-separated list of labels, but use \cs{expandonce} in case
%labels contain UTF-8 characters.
%    \begin{macrocode}
      \AtEndDocument{\immediate\write\@auxout
        {\string\@glsxtr@mglsrefs{\expandonce{\@glsxtr@mglsreflist}}}}%
    \fi
    \@mgls@disable@writeseparateref@cond
  }%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@mglsrefs}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand{\@glsxtr@mglsrefs}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\if@mgls@writeseparaterefs}
%\changes{1.48}{2021-11-22}{new}
%If this conditional is changed, it must be done before the first
%instance of any \cs{mgls}-like command.
%    \begin{macrocode}
\newif\if@mgls@writeseparaterefs \@mgls@writeseparaterefsfalse
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsWriteSeparateRefsTrue}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand{\mglsWriteSeparateRefsTrue}{\global\@mgls@writeseparaterefstrue}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsWriteSeparateRefsFalse}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand{\mglsWriteSeparateRefsFalse}{\global\@mgls@writeseparaterefsfalse}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mgls@disable@writeseparateref@cond}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@mgls@disable@writeseparateref@cond}{%
  \gdef\mglsWriteSeparateRefsTrue{\PackageError{glossaries-extra}%
   {Too late to use \string\mglsWriteSeparateRefsTrue}%
   {\string\mglsWriteSeparateRefsTrue\space can only be used before
   the first instance of any \string\mgls-like command}}%
  \gdef\mglsWriteSeparateRefsFalse{\PackageError{glossaries-extra}%
   {Too late to use \string\mglsWriteSeparateRefsFalse}%
   {\string\mglsWriteSeparateRefsFalse\space can only be used before
   the first instance of any \string\mgls-like command}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@newmgls}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand{\glsxtr@newmgls}[6][]{%
  \edef\@glsxr@newmgls@do{%
   \noexpand\newrobustcmd*{\expandonce{\csname #2\endcsname}}%
    {\noexpand\@gls@hyp@opt\expandonce{\csname ns@glsxtr@#2\endcsname}}%
   \noexpand\newcommand*{\expandonce{\csname ns@glsxtr@#2\endcsname}}[2][]{%
    \noexpand\new@ifnextchar[%
     {\expandonce{\csname glsxtr@#2\endcsname}{####1}{####2}}%
     {\expandonce{\csname glsxtr@#2\endcsname}{####1}{####2}[]}%
   }%
   \noexpand\def\expandonce{\csname glsxtr@#2\endcsname}####1####2[####3]{%
     \noexpand\@glsxtr@mgls@linkdefs{\unexpanded{#1}}%
     \noexpand\def\noexpand\glsxtrcurrentmglscsname{#2}%
     \noexpand\glsxtr@mgls@inner{####1}{####2}{####3}%
      {\noexpand#3}{\noexpand#4}{\noexpand#5}{\noexpand#6}%
    }%
  }%
  \@glsxr@newmgls@do
  \ifx\@glsxtr@record@setting\@glsxtr@record@setting@off
  \else
%    \end{macrocode}
% Provide a way for \app{bib2gls} to recognise the command (this will
% make it easier to add extra commands without having to modify
% \app{bib2gls}).
%    \begin{macrocode}
    \ifdef\@glsxtr@mglslikelist
    {\xappto\@glsxtr@mglslikelist{,#2}}%
    {%
      \gdef\@glsxtr@mglslikelist{#2}%
      \AtEndDocument{\immediate\protected@write\@auxout{}%
        {\string\@glsxtr@mglslike{\@glsxtr@mglslikelist}}}%
    }%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@mgls@linkdefs}
%\changes{1.54}{2025-01-03}{new}
%    \begin{macrocode}
\newcommand{\@glsxtr@mgls@linkdefs}[1]{%
 \ifstrempty{#1}%
  {%
    \let\glsxtrifwasglslike\@firstoftwo
    \def\glsxtrcurrentfield{}%
  }%
  {%
    \let\glsxtrifwasglslike\@secondoftwo
    \def\glsxtrcurrentfield{#1}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@mglslike}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtr@mglslike}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrMglsOrGls}
%\begin{definition}
%\cs{GlsXtrMglsOrGls}\marg{mgls cs}\marg{gls cs}\meta{modifier}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%\changes{1.48}{2021-11-22}{new}
%\changes{1.49}{2022-10-14}{removed spurious \cs{PLUS}}
%    \begin{macrocode}
\newcommand*{\GlsXtrMglsOrGls}[2]{%
  \def\@glsxtr@mgls@or@gls@mcs{#1}%
  \def\@glsxtr@mgls@or@gls@gcs{#2}%
  \@ifstar{\s@GlsXtrMglsOrGls}%
  {%
   \@ifnextchar+{\@firstoftwo{\p@GlsXtrMglsOrGls}}%
   {%
     \ifdefempty\@gls@alt@hyp@opt@char\@GlsXtrMglsOrGls\alt@GlsXtrMglsOrGls
   }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\alt@GlsXtrMglsOrGls}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\alt@GlsXtrMglsOrGls}{
 \expandafter\@ifnextchar\@gls@alt@hyp@opt@char
 {\@firstoftwo{\@alt@GlsXtrMglsOrGls}}{\@GlsXtrMglsOrGls}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GlsXtrMglsOrGls}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@GlsXtrMglsOrGls}[2][]{%
  \glsxtrifmulti{#2}%
  {\@glsxtr@mgls@or@gls@mcs[#1]{#2}}%
  {\@glsxtr@mgls@or@gls@gcs[#1]{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@GlsXtrMglsOrGls}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\s@GlsXtrMglsOrGls}[2][]{%
  \glsxtrifmulti{#2}%
  {\@glsxtr@mgls@or@gls@mcs*[#1]{#2}}%
  {\@glsxtr@mgls@or@gls@gcs*[#1]{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\p@GlsXtrMglsOrGls}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\p@GlsXtrMglsOrGls}[2][]{%
  \glsxtrifmulti{#2}%
  {\@glsxtr@mgls@or@gls@mcs+[#1]{#2}}%
  {\@glsxtr@mgls@or@gls@gcs+[#1]{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@alt@GlsXtrMglsOrGls}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@alt@GlsXtrMglsOrGls}[2][]{%
  \glsxtrifmulti{#2}%
  {\expandafter\@glsxtr@mgls@or@gls@mcs\@gls@alt@hyp@opt@char[#1]{#2}}%
  {\expandafter\@glsxtr@mgls@or@gls@gcs\@gls@alt@hyp@opt@char[#1]{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mgls}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mgls}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use \cs{gls} for all elements.
%    \begin{macrocode}
\glsxtr@newmgls{mgls}{\@gls@}{\@gls@}{\@gls@}{\@gls@}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglspl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mglspl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use \cs{glspl} for all elements.
%    \begin{macrocode}
\glsxtr@newmgls{mglspl}{\@glspl@}{\@glspl@}{\@glspl@}{\@glspl@}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsmainpl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mglsmainpl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Only use \cs{glspl} for the main element, otherwise use \cs{gls}.
%    \begin{macrocode}
\glsxtr@newmgls{mglsmainpl}{\@gls@}{\@gls@}{\@glspl@}{\@glspl@}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Mgls}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{Mgls}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Use \cs{Gls} for first element and \cs{gls} for others.
%    \begin{macrocode}
\glsxtr@newmgls{Mgls}{\@Gls@}{\@gls@}{\@Gls@}{\@gls@}%
\glsmfuaddmap{\mgls}{\Mgls}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Mglspl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{Mglspl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Use \cs{Glspl} for first element and \cs{glspl} for others.
%    \begin{macrocode}
\glsxtr@newmgls{Mglspl}{\@Glspl@}{\@glspl@}{\@Glspl@}{\@glspl@}%
\glsmfuaddmap{\mglspl}{\Mglspl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Mglsmainpl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{Mglsmainpl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Upper case the first element, no case change for others.
%Use plural for the main element only.
%    \begin{macrocode}
\glsxtr@newmgls{Mglsmainpl}{\@Gls@}{\@gls@}{\@Glspl@}{\@glspl@}%
\glsmfuaddmap{\mglsmainpl}{\Mglsmainpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MGls}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MGls}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Use \cs{Gls} for all elements.
%    \begin{macrocode}
\glsxtr@newmgls{MGls}{\@Gls@}{\@Gls@}{\@Gls@}{\@Gls@}%
\glsmfublocker{\MGls}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MGlspl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MGlspl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Use \cs{Glspl} for all elements.
%    \begin{macrocode}
\glsxtr@newmgls{MGlspl}{\@Glspl@}{\@Glspl@}{\@Glspl@}{\@Glspl@}%
\glsmfublocker{\MGlspl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MGlsmainpl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MGlsmainpl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Start all elements with upper case. Only use plural for main
%element.
%    \begin{macrocode}
\glsxtr@newmgls{MGlsmainpl}{\@Gls@}{\@Gls@}{\@Glspl@}{\@Glspl@}%
\glsmfublocker{\MGlsmainpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MGLS}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MGLS}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Use \cs{GLS} for all elements.
%    \begin{macrocode}
\glsxtr@newmgls{MGLS}{\@GLS@}{\@GLS@}{\@GLS@}{\@GLS@}%
\glsmfublocker{\MGLS}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MGLSpl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MGLSpl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Use \cs{GLSpl} for all elements.
%    \begin{macrocode}
\glsxtr@newmgls{MGLSpl}{\@GLSpl@}{\@GLSpl@}{\@GLSpl@}{\@GLSpl@}%
\glsmfublocker{\MGLSpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MGLSmainpl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MGLSmainpl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Upper case all elements. Only use plural for main element.
%    \begin{macrocode}
\glsxtr@newmgls{MGLSmainpl}{\@GLS@}{\@GLS@}{\@GLSpl@}{\@GLSpl@}%
\glsmfublocker{\MGLSmainpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glslongortext@}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@glslongortext#1#2[#3]{%
  \ifglshaslong{#2}{\@glsxtrlong{#1}{#2}[#3]}{\@glstext@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsshortortext@}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@glsshortortext#1#2[#3]{%
  \ifglshasshort{#2}{\@glsxtrshort{#1}{#2}[#3]}{\@glstext@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsfullorfirst@}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@glsfullorfirst#1#2[#3]{%
  \ifglshasshort{#2}{\@glsxtr@full{#1}{#2}[#3]}{\@glsfirst@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glslongortext@}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@Glslongortext#1#2[#3]{%
  \ifglshaslong{#2}{\@Glsxtrlong{#1}{#2}[#3]}{\@Glstext@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsshortortext@}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@Glsshortortext#1#2[#3]{%
  \ifglshasshort{#2}{\@Glsxtrshort{#1}{#2}[#3]}{\@Glstext@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsfullorfirst@}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@Glsfullorfirst#1#2[#3]{%
  \ifglshasshort{#2}{\@Glsxtr@full{#1}{#2}[#3]}{\@Glsfirst@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsshort}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mglsshort}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use short or text for all elements.
%    \begin{macrocode}
\glsxtr@newmgls[short]{mglsshort}%
{\@glsshortortext}{\@glsshortortext}{\@glsshortortext}{\@glsshortortext}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglslong}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mglslong}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use long or text for all elements.
%    \begin{macrocode}
\glsxtr@newmgls[long]{mglslong}%
{\@glslongortext}{\@glslongortext}{\@glslongortext}{\@glslongortext}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsfull}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mglsfull}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use full or first for all elements.
%    \begin{macrocode}
\glsxtr@newmgls[first]{mglsfull}%
{\@glsfullorfirst}{\@glsfullorfirst}{\@glsfullorfirst}{\@glsfullorfirst}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Mglsshort}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{Mglsshort}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use short or text for all elements with initial cap on first element.
%    \begin{macrocode}
\glsxtr@newmgls[short]{Mglsshort}%
{\@Glsshortortext}{\@glsshortortext}{\@Glsshortortext}{\@glsshortortext}%
\glsmfuaddmap{\mglsshort}{\Mglsshort}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Mglslong}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{Mglslong}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use long or text for all elements with initial cap on first
% element.
%    \begin{macrocode}
\glsxtr@newmgls[long]{Mglslong}%
{\@Glslongortext}{\@glslongortext}{\@Glslongortext}{\@glslongortext}%
\glsmfuaddmap{\mglslong}{\Mglslong}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Mglsfull}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{Mglsfull}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use full or first for all elements with initial cap on first
% element.
%    \begin{macrocode}
\glsxtr@newmgls[first]{Mglsfull}%
{\@Glsfullorfirst}{\@glsfullorfirst}{\@Glsfullorfirst}{\@glsfullorfirst}%
\glsmfuaddmap{\mglsfull}{\Mglsfull}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsname}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mglsname}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use name for all elements.
%    \begin{macrocode}
\glsxtr@newmgls[name]{mglsname}%
 {\@glsname@}{\@glsname@}{\@glsname@}{\@glsname@}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Mglsname}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{Mglsname}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use name for all elements with initial cap on first
% element.
%    \begin{macrocode}
\glsxtr@newmgls[name]{Mglsname}%
 {\@Glsname@}{\@glsname@}{\@Glsname@}{\@glsname@}%
\glsmfuaddmap{\mglsname}{\Mglsname}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MGlsname}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MGlsname}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use name for all elements with initial cap on all
% elements.
%    \begin{macrocode}
\glsxtr@newmgls[name]{MGlsname}%
 {\@Glsname@}{\@Glsname@}{\@Glsname@}{\@Glsname@}%
\glsmfublocker{\MGlsname}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glssymbolorgls}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@glssymbolorgls#1#2[#3]{%
  \ifglshassymbol{#2}{\@glssymbol@{#1}{#2}[#3]}{\@gls@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glssymbolorGls}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@glssymbolorGls#1#2[#3]{%
  \ifglshassymbol{#2}{\@glssymbol@{#1}{#2}[#3]}{\@Gls@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglssymbol}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mglssymbol}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use \cs{glssymbol} if the \gloskey{symbol} key is set otherwise
% use \cs{gls}.
%    \begin{macrocode}
\glsxtr@newmgls[symbol]{mglssymbol}%
 {\@glssymbolorgls}{\@glssymbolorgls}{\@glssymbolorgls}{\@glssymbolorgls}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Mglssymbol}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{Mglssymbol}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% As above but initial the first element if it's not a symbol.
%    \begin{macrocode}
\glsxtr@newmgls[symbol]{Mglssymbol}%
 {\@glssymbolorGls}{\@glssymbolorgls}{\@glssymbolorGls}{\@glssymbolorgls}%
\glsmfuaddmap{\mglssymbol}{\Mglssymbol}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MGlssymbol}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MGlssymbol}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% As above but initial each element if it's not a symbol.
%    \begin{macrocode}
\glsxtr@newmgls[symbol]{MGlssymbol}%
 {\@glssymbolorGls}{\@glssymbolorGls}{\@glssymbolorGls}{\@glssymbolorGls}%
\glsmfublocker{\MGlssymbol}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsfield}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand{\mglsfield}{useri}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@glsfieldorgls}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@glsfieldorgls#1#2[#3]{%
  \glsxtrifhasfield{\mglsfield}{#2}%
  {\@glsdisp[#1]{#2}{\glscurrentfieldvalue#3}}%
  {\@gls@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Glsfieldorgls}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@Glsfieldorgls#1#2[#3]{%
  \glsxtrifhasfield{\mglsfield}{#2}%
  {\@glsdisp[#1]{#2}{%
    \expandafter\glssentencecase\expandafter{\glscurrentfieldvalue#3}}}%
  {\@Gls@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mglsusefield}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mglsusefield}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use the field given by \cs{mglsfield}.
%    \begin{macrocode}
\glsxtr@newmgls[\mglsfield]{mglsusefield}%
 {\@glsfieldorgls}{\@glsfieldorgls}{\@glsfieldorgls}{\@glsfieldorgls}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Mglsusefield}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{Mglsusefield}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% As above but use initial cap for first element only.
%    \begin{macrocode}
\glsxtr@newmgls[\mglsfield]{Mglsusefield}%
 {\@Glsfieldorgls}{\@glsfieldorgls}{\@Glsfieldorgls}{\@glsfieldorgls}%
\glsmfuaddmap{\mglsusefield}{\Mglsusefield}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MGlsusefield}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MGlsusefield}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% As above but use initial cap for all elements.
%    \begin{macrocode}
\glsxtr@newmgls[\mglsfield]{MGlsusefield}%
 {\@Glsfieldorgls}{\@Glsfieldorgls}{\@Glsfieldorgls}{\@Glsfieldorgls}%
\glsmfublocker{\MGlsusefield}
%    \end{macrocode}
%\end{macro}
%
% Use commands provided by \sty{glossaries-prefix} if it has been
% loaded.
%\begin{macro}{\mpglsWarning}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\mpglsWarning}{%
  \GlossariesExtraWarning{glossaries-prefix.sty is required for
   \string\mpgls\space family of commands}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@pglsorgls}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@pglsorgls#1#2[#3]{%
  \ifdef\@pgls@{\@pgls@{#1}{#2}[#3]}{\mpglsWarning\@gls@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@pglsorglspl}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@pglsorglspl#1#2[#3]{%
  \ifdef\@pglspl@{\@pglspl@{#1}{#2}[#3]}{\mpglsWarning\@glspl@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Pglsorgls}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@Pglsorgls#1#2[#3]{%
  \ifdef\@Pgls@{\@Pgls@{#1}{#2}[#3]}{\mpglsWarning\@Gls@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@pglsorglspl}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@pglsorglspl#1#2[#3]{%
  \ifdef\@pglspl@{\@pglspl@{#1}{#2}[#3]}{\mpglsWarning\@glspl@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@Pglsorglspl}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@Pglsorglspl#1#2[#3]{%
  \ifdef\@Pglspl@{\@Pglspl@{#1}{#2}[#3]}{\mpglsWarning\@Glspl@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@PGLSorgls}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@PGLSorgls#1#2[#3]{%
  \ifdef\@PGLS@{\@PGLS@{#1}{#2}[#3]}{\mpglsWarning\@GLS@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@PGLSorglspl}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\def\@PGLSorglspl#1#2[#3]{%
  \ifdef\@PGLSpl@{\@PGLSpl@{#1}{#2}[#3]}{\mpglsWarning\@GLSpl@{#1}{#2}[#3]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mpgls}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mpgls}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use \cs{pgls} for the first element and \cs{gls} for the remainder.
%    \begin{macrocode}
\glsxtr@newmgls{mpgls}{\@pglsorgls@}{\@gls@}{\@pglsorgls@}{\@gls@}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mpglspl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mpglspl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use \cs{pglspl} for the first element and \cs{glspl} for the remainder.
%    \begin{macrocode}
\glsxtr@newmgls{mpglspl}{\@pglsorglspl@}{\@glspl@}{\@pglsorglspl@}{\@glspl@}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mpglsmainpl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{mpglsmainpl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Only use plural for main element and only use prefixing command for
%first element.
%    \begin{macrocode}
\glsxtr@newmgls{mpglsmainpl}{\@pglsorgls@}{\@gls@}{\@pglsorglspl@}{\@glspl@}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Mpgls}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{Mpgls}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use \cs{Pgls} for the first element and \cs{gls} for the remainder.
%    \begin{macrocode}
\glsxtr@newmgls{Mpgls}{\@Pglsorgls@}{\@gls@}{\@Pglsorgls@}{\@gls@}%
\glsmfuaddmap{\mpgls}{\Mpgls}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Mpglspl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{Mpglspl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use \cs{Pglspl} for the first element and \cs{glspl} for the remainder.
%    \begin{macrocode}
\glsxtr@newmgls{Mpglspl}{\@Pglsorglspl@}{\@glspl@}{\@Pglsorglspl@}{\@glspl@}%
\glsmfuaddmap{\mpglspl}{\Mpglspl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Mpglsmainpl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{Mpglsmainpl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Only use plural for main element and only use first letter
%uppercase prefixing command for first element.
%    \begin{macrocode}
\glsxtr@newmgls{Mpglsmainpl}{\@Pglsorgls@}{\@gls@}{\@Pglsorglspl@}{\@glspl@}%
\glsmfuaddmap{\mpglsmainpl}{\Mpglsmainpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MPGls}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MPGls}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Use \cs{Pgls} for the first element and \cs{Gls} for the remainder.
%    \begin{macrocode}
\glsxtr@newmgls{MPGls}{\@Pglsorgls@}{\@Gls@}{\@Pglsorgls@}{\@Gls@}%
\glsmfublocker{\MPGls}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MPGlspl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MPGlspl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use \cs{Pglspl} for the first element and \cs{Glspl} for the remainder.
%    \begin{macrocode}
\glsxtr@newmgls{MPGlspl}{\@Pglsorglspl@}{\@Glspl@}{\@Pglsorglspl@}{\@Glspl@}%
\glsmfublocker{\MPGlspl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MPGlsmainpl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MPGlsmainpl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Only use plural for main element and first letter uppercase all
%elements.
%    \begin{macrocode}
\glsxtr@newmgls{MPGlsmainpl}{\@Pglsorgls@}{\@Gls@}{\@Pglsorglspl@}{\@Glspl@}%
\glsmfublocker{\MPGlsmainpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MPGLS}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MPGLS}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use \cs{PGLS} for the first element and \cs{GLS} for the remainder.
%    \begin{macrocode}
\glsxtr@newmgls{MPGLS}{\@PGLSorgls@}{\@GLS@}{\@PGLSorgls@}{\@GLS@}%
\glsmfublocker{\MPGLS}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MPGLSpl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MPGLSpl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
% Use \cs{PGLSpl} for the first element and \cs{GLSpl} for the remainder.
%    \begin{macrocode}
\glsxtr@newmgls{MPGLSpl}{\@PGLSorglspl@}{\@GLSpl@}{\@PGLSorglspl@}{\@GLSpl@}%
\glsmfublocker{\MPGLSpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MPGLSmainpl}
%\changes{1.48}{2021-11-22}{new}
%\begin{definition}
%\cs{MPGLSmainpl}\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%Only use plural for main element and uppercase all elements.
%    \begin{macrocode}
\glsxtr@newmgls{MPGLSmainpl}{\@PGLSorgls@}{\@GLS@}{\@PGLSorglspl@}{\@GLSpl@}%
\glsmfublocker{\MPGLSmainpl}
%    \end{macrocode}
%\end{macro}
%
%Not currently implementing any other variations.
%
%\subsection{Multi-Lingual Support}
% Add the facility to load language modules, if they are installed,
% but none are provided with this package.
%
%\begin{macro}{\glsxtrcontinuedname}
%\changes{1.50}{2022-11-08}{new}
%Provide for use in \cs{printunsrttable}.
%    \begin{macrocode}
\providecommand{\glsxtrcontinuedname}{continued}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\RequireGlossariesExtraLang}
%\changes{0.5.3}{2015-12-09}{new}
%    \begin{macrocode}
\newcommand*{\RequireGlossariesExtraLang}[1]{%
  \@ifundefined{ver@glossariesxtr-#1.ldf}{\input{glossariesxtr-#1.ldf}}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\ProvidesGlossariesExtraLang}
%\changes{0.5.3}{2015-12-09}{new}
%    \begin{macrocode}
\newcommand*{\ProvidesGlossariesExtraLang}[1]{%
  \ProvidesFile{glossariesxtr-#1.ldf}%
}
%    \end{macrocode}
%\end{macro}
%
% Load any required language modules that are available. This
% doesn't generate any warning if none are found, since they're not 
% essential. (The only command that really needs defining for the
% document is \cs{abbreviationsname}, which can simply be
% redefined. However, with \app{bib2gls} it might be useful to
% provide custom rules for a particular locale.)
%
%\begin{macro}{\glsxtr@loaddialect}
%The dialect label should be stored in \cs{this@dialect}
%before using this command.
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand{\glsxtr@loaddialect}{%
  \IfTrackedLanguageFileExists{\this@dialect}%
  {glossariesxtr-}% prefix
  {.ldf}%
  {%
    \RequireGlossariesExtraLang{\CurrentTrackedTag}%
  }%
  {}% not found
%    \end{macrocode}
% If \sty{glossaries-extra-bib2gls} has been loaded,
% \cs{@glsxtrdialecthook} will check for the associated script,
% otherwise it will do nothing.
%    \begin{macrocode}
  \@glsxtrdialecthook
}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
\@ifpackageloaded{tracklang} {%
  \AnyTrackedLanguages
  {%
    \ForEachTrackedDialect{\this@dialect}{\glsxtr@loaddialect}%
  }%
  {}%
} {}
%    \end{macrocode}
% The style needs to be set at the end to ensure that
% \cs{setglossarystyle} has been redefined and extra style commands
% have been defined.
% Load \sty{glossaries-extra-stylemods} if required.
%    \begin{macrocode}
\@glsxtr@redefstyles
%    \end{macrocode}
% and set the style:
%    \begin{macrocode}
\@glsxtr@do@style
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossaries-extra.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossaries-extra-abbrstyles.def>
%    \end{macrocode}
%\fi
%\section{Predefined Abbreviation Styles (glossaries-extra-abbrstyles.def)}
%\changes{1.49}{2022-10-24}{added glossaries-extra-abbrstyles.def}
%    \begin{macrocode}
\ProvidesFile{glossaries-extra-abbrstyles.def}[2026/03/06 v2.0 (NLCT)]
%    \end{macrocode}
%This file contains the predefined abbreviation styles.
%Some helper commands first.
%
%\begin{macro}{\glsxtrlongshortname}
%\changes{1.25}{2017-11-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlongshortname}{%
  \glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
}
%    \end{macrocode}
%\end{macro}
%
%Provide convenient wrappers for common formats.
%\begin{macro}{\glsxtrlongformat}
%\begin{definition}
%\cs{glsxtrlongformat}\marg{label}\marg{insert}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlongformat}[3]{%
%    \end{macrocode}
%Don't add inner formatting if markwords attribute set as the inner formatting
%is implemented within \cs{glsxtrword} and \cs{glsxtrwordsep}.
%    \begin{macrocode}
  \glsifattribute{#1}{markwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\glsaccesslong{#1}\glsxtrgenentrytextfmt{#2}}%
    \else
      #3{\glsaccesslong{#1}}\glsxtrgenentrytextfmt{#2}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
      #3{\glsaccessfmtlong{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
      #3{\glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{#1}}%
      \glsxtrgenentrytextfmt{#2}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrlongplformat}
%\begin{definition}
%\cs{glsxtrlongplformat}\marg{label}\marg{insert}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlongplformat}[3]{%
  \glsifattribute{#1}{markwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\glsaccesslongpl{#1}\glsxtrgenentrytextfmt{#2}}%
    \else
      #3{\glsaccesslongpl{#1}}\glsxtrgenentrytextfmt{#2}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
      #3{\glsaccessfmtlongpl{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
      #3{\glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{#1}}%
      \glsxtrgenentrytextfmt{#2}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrlongformat}
%\begin{definition}
%\cs{Glsxtrlongformat}\marg{label}\marg{insert}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrlongformat}[3]{%
  \glsifattribute{#1}{markwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\Glsaccesslong{#1}\glsxtrgenentrytextfmt{#2}}%
    \else
      #3{\Glsaccesslong{#1}}\glsxtrgenentrytextfmt{#2}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
      #3{\Glsaccessfmtlong{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
      #3{\Glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{#1}}%
      \glsxtrgenentrytextfmt{#2}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrlongplformat}
%\begin{definition}
%\cs{Glsxtrlongplformat}\marg{label}\marg{insert}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrlongplformat}[3]{%
  \glsifattribute{#1}{markwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\Glsaccesslongpl{#1}\glsxtrgenentrytextfmt{#2}}%
    \else
      #3{\Glsaccesslongpl{#1}}\glsxtrgenentrytextfmt{#2}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
      #3{\Glsaccessfmtlongpl{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
      #3{\Glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{#1}}%
      \glsxtrgenentrytextfmt{#2}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrlongformat}
%\begin{definition}
%\cs{GLSxtrlongformat}\marg{label}\marg{insert}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrlongformat}[3]{%
  \glsifattribute{#1}{markwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\GLSaccesslong{#1}\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
    \else
      #3{\GLSaccesslong{#1}}\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
      #3{\GLSaccessfmtlong{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
      #3{\GLSaccessfmtlong{}{\glsxtrgenentrytextfmt}{#1}}%
      \mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrlongplformat}
%\begin{definition}
%\cs{GLSxtrlongplformat}\marg{label}\marg{insert}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrlongplformat}[3]{%
  \glsifattribute{#1}{markwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\GLSaccesslongpl{#1}\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
    \else
      #3{\GLSaccesslongpl{#1}}\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
      #3{\GLSaccessfmtlongpl{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
      #3{\GLSaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{#1}}%
      \mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrlongformatgrp}
%\begin{definition}
%\cs{glsxtrlongformatgrp}\marg{label}\marg{insert}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%Add grouping around insert.
%    \begin{macrocode}
\newcommand*{\glsxtrlongformatgrp}[3]{%
  \glsifattribute{#1}{markwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\glsaccesslong{#1}{\glsxtrgenentrytextfmt{#2}}}%
    \else
      #3{\glsaccesslong{#1}}{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    #3{\glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{#1}}%
    \ifglsxtrinsertinside
      {#3{\glsxtrgenentrytextfmt{#2}}}%
    \else
      {\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrlongplformatgrp}
%\begin{definition}
%\cs{glsxtrlongformatplgrp}\marg{label}\marg{insert}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%Add grouping around insert.
%    \begin{macrocode}
\newcommand*{\glsxtrlongplformatgrp}[3]{%
  \glsifattribute{#1}{markwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\glsaccesslongpl{#1}{\glsxtrgenentrytextfmt{#2}}}%
    \else
      #3{\glsaccesslongpl{#1}}{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    #3{\glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{#1}}%
    \ifglsxtrinsertinside
      {#3{\glsxtrgenentrytextfmt{#2}}}%
    \else
      {\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrlongformatgrp}
%\begin{definition}
%\cs{Glsxtrlongformatgrp}\marg{label}\marg{insert}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%Add grouping around insert.
%    \begin{macrocode}
\newcommand*{\Glsxtrlongformatgrp}[3]{%
  \glsifattribute{#1}{markwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\Glsaccesslong{#1}{\glsxtrgenentrytextfmt{#2}}}%
    \else
      #3{\Glsaccesslong{#1}}{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    #3{\Glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{#1}}%
    \ifglsxtrinsertinside
      {#3{\glsxtrgenentrytextfmt{#2}}}%
    \else
      {\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrlongplformatgrp}
%\begin{definition}
%\cs{Glsxtrlongformatplgrp}\marg{label}\marg{insert}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%Add grouping around insert.
%    \begin{macrocode}
\newcommand*{\Glsxtrlongplformatgrp}[3]{%
  \glsifattribute{#1}{markwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\Glsaccesslongpl{#1}{\glsxtrgenentrytextfmt{#2}}}%
    \else
      #3{\Glsaccesslongpl{#1}}{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    #3{\Glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{#1}}%
    \ifglsxtrinsertinside
      {#3{\glsxtrgenentrytextfmt{#2}}}%
    \else
      {\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrlongformatgrp}
%\begin{definition}
%\cs{GLSxtrlongformatgrp}\marg{label}\marg{insert}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%Add grouping around insert.
%    \begin{macrocode}
\newcommand*{\GLSxtrlongformatgrp}[3]{%
  \glsifattribute{#1}{markwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\GLSaccesslong{#1}{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}}%
    \else
      #3{\GLSaccesslong{#1}}{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
    \fi
  }%
  {%
    #3{\GLSaccessfmtlong{}{\glsxtrgenentrytextfmt}{#1}}%
    \ifglsxtrinsertinside
      {\mfirstucMakeUppercase{#3{\glsxtrgenentrytextfmt{#2}}}}%
    \else
      {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrlongplformatgrp}
%\begin{definition}
%\cs{GLSxtrlongformatplgrp}\marg{label}\marg{insert}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%Add grouping around insert.
%    \begin{macrocode}
\newcommand*{\GLSxtrlongplformatgrp}[3]{%
  \glsifattribute{#1}{markwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\GLSaccesslongpl{#1}{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}}%
    \else
      #3{\GLSaccesslongpl{#1}}{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
    \fi
  }%
  {%
    #3{\GLSaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{#1}}%
    \ifglsxtrinsertinside
      {\mfirstucMakeUppercase{#3{\glsxtrgenentrytextfmt{#2}}}}%
    \else
      {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrshortformat}
%\begin{definition}
%\cs{glsxtrshortformat}\marg{label}\marg{insert}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrshortformat}[3]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\glsaccessshort{#1}\glsxtrgenentrytextfmt{#2}}%
    \else
      #3{\glsaccessshort{#1}}\glsxtrgenentrytextfmt{#2}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
      #3{\glsaccessfmtshort{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
      #3{\glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{#1}}%
      \glsxtrgenentrytextfmt{#2}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrshortplformat}
%\begin{definition}
%\cs{glsxtrshortplformat}\marg{label}\marg{insert}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrshortplformat}[3]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\glsaccessshortpl{#1}\glsxtrgenentrytextfmt{#2}}%
    \else
      #3{\glsaccessshortpl{#1}}\glsxtrgenentrytextfmt{#2}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
      #3{\glsaccessfmtshortpl{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
      #3{\glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{#1}}%
      \glsxtrgenentrytextfmt{#2}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrshortformat}
%\begin{definition}
%\cs{Glsxtrshortformat}\marg{label}\marg{insert}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrshortformat}[3]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\Glsaccessshort{#1}\glsxtrgenentrytextfmt{#2}}%
    \else
      #3{\Glsaccessshort{#1}}\glsxtrgenentrytextfmt{#2}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
      #3{\Glsaccessfmtshort{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
      #3{\Glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{#1}}%
      \glsxtrgenentrytextfmt{#2}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrshortplformat}
%\begin{definition}
%\cs{Glsxtrshortplformat}\marg{label}\marg{insert}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrshortplformat}[3]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\Glsaccessshortpl{#1}\glsxtrgenentrytextfmt{#2}}%
    \else
      #3{\Glsaccessshortpl{#1}}\glsxtrgenentrytextfmt{#2}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
      #3{\Glsaccessfmtshortpl{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
      #3{\Glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{#1}}%
      \glsxtrgenentrytextfmt{#2}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrshortformat}
%\begin{definition}
%\cs{GLSxtrshortformat}\marg{label}\marg{insert}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrshortformat}[3]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\GLSaccessshort{#1}\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
    \else
      #3{\GLSaccessshort{#1}}\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
      #3{\GLSaccessfmtshort{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
      #3{\GLSaccessfmtshort{}{\glsxtrgenentrytextfmt}{#1}}%
      \mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrshortplformat}
%\begin{definition}
%\cs{GLSxtrshortplformat}\marg{label}\marg{insert}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrshortplformat}[3]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\GLSaccessshortpl{#1}\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
    \else
      #3{\GLSaccessshortpl{#1}}\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    \ifglsxtrinsertinside
      #3{\GLSaccessfmtshortpl{#2}{\glsxtrgenentrytextfmt}{#1}}%
    \else
      #3{\GLSaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{#1}}%
      \mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrshortformatgrp}
%\begin{definition}
%\cs{glsxtrshortformatgrp}\marg{label}\marg{insert}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%Add grouping around insert.
%    \begin{macrocode}
\newcommand*{\glsxtrshortformatgrp}[3]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\glsaccessshort{#1}{\glsxtrgenentrytextfmt{#2}}}%
    \else
      #3{\glsaccessshort{#1}}{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    #3{\glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{#1}}%
    \ifglsxtrinsertinside
      {#3{\glsxtrgenentrytextfmt{#2}}}%
    \else
      {\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrshortplformatgrp}
%\begin{definition}
%\cs{glsxtrshortplformatgrp}\marg{label}\marg{insert}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%Add grouping around insert.
%    \begin{macrocode}
\newcommand*{\glsxtrshortplformatgrp}[3]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\glsaccessshortpl{#1}{\glsxtrgenentrytextfmt{#2}}}%
    \else
      #3{\glsaccessshortpl{#1}}{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    #3{\glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{#1}}%
    \ifglsxtrinsertinside
      {#3{\glsxtrgenentrytextfmt{#2}}}%
    \else
      {\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrshortformatgrp}
%\begin{definition}
%\cs{Glsxtrshortformatgrp}\marg{label}\marg{insert}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%Add grouping around insert.
%    \begin{macrocode}
\newcommand*{\Glsxtrshortformatgrp}[3]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\Glsaccessshort{#1}{\glsxtrgenentrytextfmt{#2}}}%
    \else
      #3{\Glsaccessshort{#1}}{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    #3{\Glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{#1}}%
    \ifglsxtrinsertinside
      {#3{\glsxtrgenentrytextfmt{#2}}}%
    \else
      {\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrshortplformatgrp}
%\begin{definition}
%\cs{Glsxtrshortplformatgrp}\marg{label}\marg{insert}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%Add grouping around insert.
%    \begin{macrocode}
\newcommand*{\Glsxtrshortplformatgrp}[3]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\Glsaccessshortpl{#1}{\glsxtrgenentrytextfmt{#2}}}%
    \else
      #3{\Glsaccessshortpl{#1}}{\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
  {%
    #3{\Glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{#1}}%
    \ifglsxtrinsertinside
      {#3{\glsxtrgenentrytextfmt{#2}}}%
    \else
      {\glsxtrgenentrytextfmt{#2}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrshortformatgrp}
%\begin{definition}
%\cs{GLSxtrshortformatgrp}\marg{label}\marg{insert}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%Add grouping around insert.
%    \begin{macrocode}
\newcommand*{\GLSxtrshortformatgrp}[3]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\GLSaccessshort{#1}{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}}%
    \else
      #3{\GLSaccessshort{#1}}{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
    \fi
  }%
  {%
    #3{\GLSaccessfmtshort{}{\glsxtrgenentrytextfmt}{#1}}%
    \ifglsxtrinsertinside
      {\mfirstucMakeUppercase{#3{\glsxtrgenentrytextfmt{#2}}}}%
    \else
      {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrshortplformatgrp}
%\begin{definition}
%\cs{GLSxtrshortplformatgrp}\marg{label}\marg{insert}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%Add grouping around insert.
%    \begin{macrocode}
\newcommand*{\GLSxtrshortplformatgrp}[3]{%
  \glsifattribute{#1}{markshortwords}{true}%
  {%
    \ifglsxtrinsertinside
      #3{\GLSaccessshortpl{#1}{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}}%
    \else
      #3{\GLSaccessshortpl{#1}}{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
    \fi
  }%
  {%
    #3{\GLSaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{#1}}%
    \ifglsxtrinsertinside
      {\mfirstucMakeUppercase{#3{\glsxtrgenentrytextfmt{#2}}}}%
    \else
      {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
    \fi
  }%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrlongshortformat}
%\begin{definition}
%\cs{glsxtrlongshortformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlongshortformat}[4]{%
  \glsxtrlongformat{#1}{#2}{#3}%
  \glsxtrfullsep{#1}%
  \glsxtrparen{\glsxtrshortformat{#1}{}{#4}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrlongshortplformat}
%\begin{definition}
%\cs{glsxtrlongshortplformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlongshortplformat}[4]{%
  \glsxtrlongplformat{#1}{#2}{#3}%
  \glsxtrfullsep{#1}%
  \glsxtrparen{\glsxtrshortplformat{#1}{}{#4}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrlongshortformat}
%\begin{definition}
%\cs{Glsxtrlongshortformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrlongshortformat}[4]{%
  \Glsxtrlongformat{#1}{#2}{#3}%
  \glsxtrfullsep{#1}%
  \glsxtrparen{\glsxtrshortformat{#1}{}{#4}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrlongshortplformat}
%\begin{definition}
%\cs{Glsxtrlongshortplformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrlongshortplformat}[4]{%
  \Glsxtrlongplformat{#1}{#2}{#3}%
  \glsxtrfullsep{#1}%
  \glsxtrparen{\glsxtrshortplformat{#1}{}{#4}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrlongshortformat}
%\begin{definition}
%\cs{GLSxtrlongshortformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrlongshortformat}[4]{%
  \GLSxtrlongformat{#1}{#2}{#3}%
  \glsxtrfullsep{#1}%
  \glsxtrparen{\GLSxtrshortformat{#1}{}{#4}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrlongshortplformat}
%\begin{definition}
%\cs{GLSxtrlongshortplformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrlongshortplformat}[4]{%
  \GLSxtrlongplformat{#1}{#2}{#3}%
  \glsxtrfullsep{#1}%
  \glsxtrparen{\GLSxtrshortplformat{#1}{}{#4}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrshortlongformat}
%\begin{definition}
%\cs{glsxtrshortlongformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrshortlongformat}[4]{%
  \glsxtrshortformat{#1}{#2}{#4}%
  \glsxtrfullsep{#1}%
  \glsxtrparen{\glsxtrlongformat{#1}{}{#3}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrshortlongplformat}
%\begin{definition}
%\cs{glsxtrshortlongplformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrshortlongplformat}[4]{%
  \glsxtrshortplformat{#1}{#2}{#4}%
  \glsxtrfullsep{#1}%
  \glsxtrparen{\glsxtrlongplformat{#1}{}{#3}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrshortlongformat}
%\begin{definition}
%\cs{Glsxtrshortlongformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrshortlongformat}[4]{%
  \Glsxtrshortformat{#1}{#2}{#4}%
  \glsxtrfullsep{#1}%
  \glsxtrparen{\glsxtrlongformat{#1}{}{#3}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrshortlongplformat}
%\begin{definition}
%\cs{Glsxtrshortlongplformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrshortlongplformat}[4]{%
  \Glsxtrshortplformat{#1}{#2}{#4}%
  \glsxtrfullsep{#1}%
  \glsxtrparen{\glsxtrlongplformat{#1}{}{#3}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrshortlongformat}
%\begin{definition}
%\cs{GLSxtrshortlongformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrshortlongformat}[4]{%
  \GLSxtrshortformat{#1}{#2}{#4}%
  \glsxtrfullsep{#1}%
  \glsxtrparen{\GLSxtrlongformat{#1}{}{#3}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrshortlongplformat}
%\begin{definition}
%\cs{GLSxtrshortlongplformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrshortlongplformat}[4]{%
  \GLSxtrshortplformat{#1}{#2}{#4}%
  \glsxtrfullsep{#1}%
  \glsxtrparen{\GLSxtrlongplformat{#1}{}{#3}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfootnotelongformat}
%\begin{definition}
%\cs{glsxtrfootnotelongformat}\marg{label}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrfootnotelongformat}[2]{%
  \glsxtrlongformat{#1}{}{#2}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfootnotelongplformat}
%\begin{definition}
%\cs{glsxtrfootnotelongplformat}\marg{label}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrfootnotelongplformat}[2]{%
  \glsxtrlongplformat{#1}{}{#2}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostfootnotelongformat}
%\begin{definition}
%\cs{glsxtrpostfootnotelongformat}\marg{label}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrpostfootnotelongformat}{%
  \glsxtrfootnotelongformat
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostusershortformat}
%\begin{definition}
%\cs{glsxtruserpostshortformat}\marg{label}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrpostusershortformat}[2]{%
  \glsxtrifallcaps
  {\GLSxtrusershortformat{#1}{#2}}%
  {\glsxtrusershortformat{#1}{#2}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrusershortformat}
%\begin{definition}
%\cs{glsxtrusershortformat}\marg{label}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrusershortformat}[2]{%
  \glsxtruserparen{\glsxtrshortformat{#1}{}{#2}}{#1}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrusershortplformat}
%\begin{definition}
%\cs{glsxtrusershortplformat}\marg{label}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrusershortplformat}[2]{%
  \glsxtruserparen{\glsxtrshortplformat{#1}{}{#2}}{#1}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrusershortformat}
%\begin{definition}
%\cs{GLSxtrusershortformat}\marg{label}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrusershortformat}[2]{%
  \GLSxtruserparen{\GLSxtrshortformat{#1}{}{#2}}{#1}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrusershortplformat}
%\begin{definition}
%\cs{GLSxtrusershortplformat}\marg{label}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrusershortplformat}[2]{%
  \GLSxtruserparen{\GLSxtrshortplformat{#1}{}{#2}}{#1}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostuserlongformat}
%\begin{definition}
%\cs{glsxtruserpostlongformat}\marg{label}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrpostuserlongformat}[2]{%
  \glsxtrifallcaps
  {\GLSxtruserlongformat{#1}{#2}}%
  {\glsxtruserlongformat{#1}{#2}}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtruserlongformat}
%\begin{definition}
%\cs{glsxtruserlongformat}\marg{label}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtruserlongformat}[2]{%
  \glsxtruserparen{\glsxtrlongformat{#1}{}{#2}}{#1}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtruserlongformat}
%\begin{definition}
%\cs{GLSxtruserlongformat}\marg{label}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtruserlongformat}[2]{%
  \GLSxtruserparen{\GLSxtrlongformat{#1}{}{#2}}{#1}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtruserlongplformat}
%\begin{definition}
%\cs{glsxtruserlongplformat}\marg{label}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtruserlongplformat}[2]{%
  \glsxtruserparen{\glsxtrlongplformat{#1}{}{#2}}{#1}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtruserlongplformat}
%\begin{definition}
%\cs{GLSxtruserlongplformat}\marg{label}\marg{longfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtruserlongplformat}[2]{%
  \GLSxtruserparen{\GLSxtrlongplformat{#1}{}{#2}}{#1}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtruserlongshortformat}
%\begin{definition}
%\cs{glsxtruserlongshortformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtruserlongshortformat}[4]{%
  \glsxtrlongformat{#1}{#2}{#3}%
  \glsxtrusershortformat{#1}{#4}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtruserlongshortplformat}
%\begin{definition}
%\cs{glsxtruserlongshortplformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtruserlongshortplformat}[4]{%
  \glsxtrlongplformat{#1}{#2}{#3}%
  \glsxtrusershortplformat{#1}{#4}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtruserlongshortformat}
%\begin{definition}
%\cs{Glsxtruserlongshortformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtruserlongshortformat}[4]{%
  \Glsxtrlongformat{#1}{#2}{#3}%
  \glsxtrusershortformat{#1}{#4}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtruserlongshortplformat}
%\begin{definition}
%\cs{Glsxtruserlongshortplformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtruserlongshortplformat}[4]{%
  \Glsxtrlongplformat{#1}{#2}{#3}%
  \glsxtrusershortplformat{#1}{#4}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtruserlongshortformat}
%\begin{definition}
%\cs{GLSxtruserlongshortformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtruserlongshortformat}[4]{%
  \GLSxtrlongformat{#1}{#2}{#3}%
  \GLSxtrusershortformat{#1}{#4}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtruserlongshortplformat}
%\begin{definition}
%\cs{GLSxtruserlongshortplformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtruserlongshortplformat}[4]{%
  \GLSxtrlongplformat{#1}{#2}{#3}%
  \GLSxtrusershortplformat{#1}{#4}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrusershortlongformat}
%\begin{definition}
%\cs{glsxtrusershortlongformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrusershortlongformat}[4]{%
  \glsxtrshortformat{#1}{#2}{#3}%
  \glsxtruserlongformat{#1}{#4}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrusershortlongplformat}
%\begin{definition}
%\cs{glsxtrusershortlongplformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrusershortlongplformat}[4]{%
  \glsxtrshortplformat{#1}{#2}{#3}%
  \glsxtruserlongplformat{#1}{#4}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrusershortlongformat}
%\begin{definition}
%\cs{Glsxtrusershortlongformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrusershortlongformat}[4]{%
  \Glsxtrshortformat{#1}{#2}{#3}%
  \glsxtruserlongformat{#1}{#4}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrusershortlongplformat}
%\begin{definition}
%\cs{Glsxtrusershortlongplformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrusershortlongplformat}[4]{%
  \Glsxtrshortplformat{#1}{#2}{#3}%
  \glsxtruserlongplformat{#1}{#4}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrusershortlongformat}
%\begin{definition}
%\cs{GLSxtrusershortlongformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrusershortlongformat}[4]{%
  \GLSxtrshortformat{#1}{#2}{#3}%
  \GLSxtruserlongformat{#1}{#4}%
}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrusershortlongplformat}
%\begin{definition}
%\cs{GLSxtrusershortlongplformat}\marg{label}\marg{insert}\marg{longfmtcs}\marg{shortfmtcs}
%\end{definition}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrusershortlongplformat}[4]{%
  \GLSxtrshortplformat{#1}{#2}{#3}%
  \GLSxtruserlongplformat{#1}{#4}%
}%
%    \end{macrocode}
%\end{macro}
%
%\subsection{Predefined Styles (Default Font)}
%\changes{1.17}{2017-08-09}{removed some inconsistencies in the abbreviation
%styles}
%\begin{abbrvstyle}{long-short}
%    \begin{macrocode}
\newabbreviationstyle{long-short}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}},%
%    \end{macrocode}
%\changes{1.15}{2017-05-10}{fixed spelling of \cs{glsabbrvfont}}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    description={\the\glslongtok}}%
%    \end{macrocode}
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrrevert}[1]{\glsxtrdefaultrevert{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
% Set this as the default style for general abbreviations:
%    \begin{macrocode}
\setabbreviationstyle{long-short}
%    \end{macrocode}
%
%\begin{macro}{\glsxtrlongshortdescsort}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlongshortdescsort}{%
 \expandonce\glsxtrorglong\space (\expandonce\glsxtrorgshort)%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrlongshortdescname}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlongshortdescname}{%
  \glsxplongfont{\the\glslongtok}{\glscategorylabel}%
  \protect\glsxtrfullsep{\the\glslabeltok}%
  \protect\glsxtrparen{\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-short-desc}
% User supplies description. The long form is included in the name.
%\changes{0.3}{2015-12-02}{fixed name to use \cs{glslabeltok}}
%    \begin{macrocode}
\newabbreviationstyle{long-short-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},%
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}},%
%    \end{macrocode}
%The \gloskey{text} key should only have the short form.
%\changes{1.07}{2016-08-15}{added missing text key}
%    \begin{macrocode}
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
%    \end{macrocode}
%\changes{1.07}{2016-08-15}{fixed misspelling of \cs{glsabbrvfont}}
%    \begin{macrocode}
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}%
  }%
%    \end{macrocode}
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-short}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrshortlongname}
%\changes{1.25}{2017-11-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrshortlongname}{%
  \glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{short-long}
% Short form followed by long form in parenthesis on first use.
%    \begin{macrocode}
\newabbreviationstyle{short-long}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}}},%
%    \end{macrocode}
%\changes{1.15}{2017-05-10}{fixed spelling of \cs{glsabbrvfont}}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrshortlongdescsort}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrshortlongdescsort}{\expandonce\glsxtrorgshort}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrshortlongdescname}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrshortlongdescname}{%
  \glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
  \protect\glsxtrfullsep{\the\glslabeltok}%
  \protect\glsxtrparen{\glsxplongfont{\the\glslongtok}{\glscategorylabel}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{short-long-desc}
% User supplies description. The long form is included in the name.
%\changes{0.3}{2015-12-02}{fixed name to use \cs{glslabeltok}}
%    \begin{macrocode}
\newabbreviationstyle{short-long-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},
    sort={\glsxtrshortlongdescsort},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}}},%
%    \end{macrocode}
%\changes{1.07}{2016-08-15}{added text key}
%    \begin{macrocode}
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
%    \end{macrocode}
%\changes{1.07}{2016-08-15}{fixed misspelling of \cs{glsabbrvfont} in plural
%key}
%    \begin{macrocode}
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}%
  }%
%    \end{macrocode}
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-long}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsfirstlongfootnotefont}
%\changes{1.05}{2016-06-10}{new}
%Only used by the \qt{footnote} styles.
%    \begin{macrocode}
\newcommand*{\glsfirstlongfootnotefont}[1]{\glslongfootnotefont{#1}}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongfootnotefont}
%\changes{1.05}{2016-06-10}{new}
%Only used by the \qt{footnote} styles.
%    \begin{macrocode}
\newcommand*{\glslongfootnotefont}[1]{\glslongdefaultfont{#1}}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrabbrvfootnote}
%\begin{definition}
%\cs{glsxtrabbrvfootnote}\marg{label}\marg{long}
%\end{definition}
%\changes{1.07}{2016-08-15}{new}
%Command used by footnote abbreviation styles. The default
%definition ignores the first argument. The second argument
%\meta{long} includes the font changing command and may be the
%singular or plural form, depending on the command that was used
%(for example, \cs{gls} or \cs{glspl}).
%    \begin{macrocode}
\newcommand*{\glsxtrabbrvfootnote}[2]{\footnote{#2}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrpostabbrvfootnote}
%\changes{1.49}{2022-10-24}{new}
%Used by post-footnote style to include formatting.
%    \begin{macrocode}
\newrobustcmd*{\glsxtrpostabbrvfootnote}[2]{%
  \glsxtrabbrvfootnote{#1}%
  {#2\glsxtrpostfootnotelongformat{#1}{\glsfirstlongfootnotefont}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\xpglsxtrpostabbrvfootnote}
%\changes{1.49}{2022-10-24}{new}
%Perform all the appropriate expansions to ensure \cs{glslabel} and 
%\cs{glsxtrassignlinktextfmt} are expanded
% as they may be lost by the time the footnote occurs.
%    \begin{macrocode}
\newcommand*{\xpglsxtrpostabbrvfootnote}{%
  \expandafter\expandafter\expandafter
  \glsxtrpostabbrvfootnote
  \expandafter\expandafter\expandafter
    {\expandafter\glslabel\expandafter}\expandafter
    {\glsxtrassignlinktextfmt}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfootnotename}
%\changes{1.25}{2017-11-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrfootnotename}{%
  \glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{footnote}
% Short form followed by long form in footnote on first use.
%    \begin{macrocode}
\newabbreviationstyle{footnote}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled. (Add
% \catattr{firstshortaccess} since long form is hidden in a
% footnote on first use.) The inner formatting isn't be applied to
% the footnote text because the innertextformat key value may have
% gone out of scope by that the time the footnote text is processed. 
% (Neither is the outer formatting applied.)
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
%    \end{macrocode}
%\changes{1.07}{2016-08-15}{changed first forms to use
%\cs{glsfirstlongfootnotefont}}
%    \begin{macrocode}
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
%    \end{macrocode}
%\changes{1.15}{2017-05-10}{fixed spelling of \cs{glsabbrvfont}}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Switch off hyperlinks on first use to prevent nested hyperlinks,
% and unset the \catattr{regular} attribute if it has been set.
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
%    \end{macrocode}
% The full format displays the short form followed by the long form
% as a footnote.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongplformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongplformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongplformat{##1}{\glsfirstlongfootnotefont}}%
  }%
%    \end{macrocode}
% The first use full form and the inline full form use the short
% (long) style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{short-footnote}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\letabbreviationstyle{short-footnote}{footnote}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrfootnotedescname}
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrfootnotedescname}{%
  \glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
  \protect\glsxtrfullsep{\the\glslabeltok}%
  \protect\glsxtrparen{\glsxplongfont{\the\glslongtok}{\glscategorylabel}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfootnotedescsort}
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrfootnotedescsort}{\the\glsshorttok}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{short-footnote-desc}
% Like \abbrstyle{short-footnote} but with user supplied description.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newabbreviationstyle{short-footnote-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Switch off hyperlinks on first use to prevent nested hyperlinks,
% and unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{footnote}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{footnote-desc}
%\changes{1.42}{2020-02-03}{new}
%Synonym.
%    \begin{macrocode}
\letabbreviationstyle{footnote-desc}{short-footnote-desc}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{postfootnote}
% Similar to \abbrstyle{footnote} but the footnote is placed afterwards,
% outside the link. This avoids nested links and can also move the
% footnote marker after any following punctuation mark.
% Pre v1.07 included \cs{footnote} in the first keys, which was
% incorrect as it caused duplicate footnotes.
%\changes{1.07}{2016-08-15}{removed \cs{footnote} from first keys}
%    \begin{macrocode}
\newabbreviationstyle{postfootnote}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled. (Add
% \catattr{firstshortaccess} since long form is hidden in a
% footnote on first use.)
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
%    \end{macrocode}
%\changes{1.15}{2017-05-10}{fixed spelling of \cs{glsabbrvfont}}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Make this category insert a footnote after the link if this was
% the first use, and
% unset the \catattr{regular} attribute if it has been set.
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
%    \end{macrocode}
%\changes{1.02}{2016-04-25}{added redef of \cs{glsxtrsetupfulldefs}}
% The footnote needs to be suppressed in the inline form.
%Previously this was done by redefining {glsxtrsetupfulldefs} but
%that interferes with other styles. Instead, this now uses \cs{glsxtrifwasglslike}
%\changes{1.49}{2022-10-24}{removed redef of \cs{glsxtrsetupfulldefs}}
%    \begin{macrocode}
      \glsxtrifwasglslikeandfirstuse
      {%
%    \end{macrocode}
% Ensure \cs{glslabel} and \cs{glsxtrassignlinktextfmt} are expanded
% as they may be lost by the time the footnote occurs.
%    \begin{macrocode}
        \glsxtrdopostpunc{\expandafter\expandafter\expandafter
          \glsxtrpostabbrvfootnote
          \expandafter\expandafter\expandafter
            {\expandafter\glslabel\expandafter}\expandafter
            {\glsxtrassignlinktextfmt}}%
      }{}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
%    \end{macrocode}
% The full format displays the short form. The long form is
% deferred.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
%    \end{macrocode}
% The first use full form and the inline full form use the short
% (long) style.
%\changes{1.07}{2016-08-15}{switched from \cs{glsfirstlongfont} to
%\cs{glsfirstlongfootnotefont}}
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-postfootnote}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\letabbreviationstyle{short-postfootnote}{postfootnote}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-postfootnote-desc}
%\changes{1.42}{2020-02-03}{new}
% Like \abbrstyle{short-postfootnote} but with user supplied description.
%    \begin{macrocode}
\newabbreviationstyle{short-postfootnote-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
%    \end{macrocode}
%\changes{1.15}{2017-05-10}{fixed spelling of \cs{glsabbrvfont}}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Make this category insert a footnote after the link if this was
% the first use, and
% unset the \catattr{regular} attribute if it has been set.
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
%\changes{1.02}{2016-04-25}{added redef of \cs{glsxtrsetupfulldefs}}
%Previously this was done by redefining {glsxtrsetupfulldefs} but
%that interferes with other styles. Instead, this now uses \cs{glsxtrifwasglslike}
%\changes{1.49}{2022-10-24}{removed redef of \cs{glsxtrsetupfulldefs}}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasglslikeandfirstuse
      {%
%    \end{macrocode}
% Ensure \cs{glslabel} and \cs{glsxtrassignlinktextfmt} are expanded
% as they may be lost by the time the footnote occurs.
%    \begin{macrocode}
        \glsxtrdopostpunc{\expandafter\expandafter\expandafter
          \glsxtrpostabbrvfootnote
          \expandafter\expandafter\expandafter
            {\expandafter\glslabel\expandafter}\expandafter
            {\glsxtrassignlinktextfmt}}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{postfootnote}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{postfootnote-desc}
%\changes{1.42}{?}{new}
%    \begin{macrocode}
\letabbreviationstyle{postfootnote-desc}{short-postfootnote-desc}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrshortnolongname}
%\changes{1.25}{2017-11-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrshortnolongname}{%
  \glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{short}
% Provide a style that only displays the short form on first use,
% but the short and long form can be displayed with the \qt{full}
% commands that use the inline format. If the user supplies a
% description, the long form won't be displayed in the predefined
% glossary styles, but the post description hook can be employed to
% automatically insert it.
%    \begin{macrocode}
\newabbreviationstyle{short}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortnolongname},
    sort={\the\glsshorttok},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The inline full form displays the short form followed by the
% long form in parentheses.
%\changes{0.2}{2015-11-30}{switched inline full form to short (long)}
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the short form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
% Set this as the default style for acronyms:
%    \begin{macrocode}
\setabbreviationstyle[acronym]{short}
%    \end{macrocode}
%
%\begin{abbrvstyle}{short-nolong}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\letabbreviationstyle{short-nolong}{short}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-nolong-noreg}
%\changes{1.17}{2017-08-09}{new}
% Like \abbrstyle{short-nolong} but doesn't set the \catattr{regular} attribute.
%    \begin{macrocode}
\newabbreviationstyle{short-nolong-noreg}%
{%
  \GlsXtrUseAbbrStyleSetup{short-nolong}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-nolong}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%
%\begin{macro}{\glsxtrshortdescname}
%\changes{1.17}{2017-08-09}{new}
%\changes{1.39}{2019-03-22}{corrected to show long form as advertised in the
%manual}
%    \begin{macrocode}
\newcommand*{\glsxtrshortdescname}{%
  \glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
  \protect\glsxtrfullsep{\the\glslabeltok}%
  \protect\glsxtrparen{\glsxplongfont{\the\glslongtok}{\glscategorylabel}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{short-desc}
% The user must supply the description in this style. The long form
% is added to the name. The \abbrstyle{short} style (possibly with the
% post-description hooks set) might be a better option.
%\changes{1.01}{2016-02-02}{fixed typo in
%\cs{glsxtrinlinefullformat} and added missing second argument}
%\changes{1.39}{2019-03-22}{corrected to omit \gloskey{description} key as advertised in the
%manual}
%    \begin{macrocode}
\newabbreviationstyle{short-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortdescname},
    sort={\the\glsshorttok},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The inline full form displays the short format followed by the
% long form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the short form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{short-nolong-desc}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\letabbreviationstyle{short-nolong-desc}{short-desc}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-nolong-desc-noreg}
%\changes{1.17}{2017-08-09}{new}
% Like \abbrstyle{short-nolong-desc} but doesn't set the \catattr{regular} attribute.
%    \begin{macrocode}
\newabbreviationstyle{short-nolong-desc-noreg}%
{%
  \GlsXtrUseAbbrStyleSetup{short-nolong-desc}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-nolong-desc}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{nolong-short}
% Similar to \abbrstyle{short-nolong} but the full form shows the
% long form followed by the short form in parentheses.
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newabbreviationstyle{nolong-short}%
{%
  \GlsXtrUseAbbrStyleSetup{short-nolong}%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-nolong}%
%    \end{macrocode}
% The inline full form displays the long form followed by the
% short form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{nolong-short-noreg}
%\changes{1.21}{2017-11-03}{new}
% Like \abbrstyle{nolong-short} but doesn't set the \catattr{regular} attribute.
%    \begin{macrocode}
\newabbreviationstyle{nolong-short-noreg}%
{%
  \GlsXtrUseAbbrStyleSetup{nolong-short}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{nolong-short}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrlongnoshortdescname}
%\changes{1.25}{2017-11-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlongnoshortdescname}{%
  \glsxplongfont{\the\glslongtok}{\glscategorylabel}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-desc}
% Provide a style that only displays the long form,
% but the long and short form can be displayed with the \qt{full}
% commands that use the inline format. The predefined glossary styles
% won't show the short form. The user must supply a description for
% this style. The accessibility attributes don't need setting here.
%    \begin{macrocode}
\newabbreviationstyle{long-desc}%
{%
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortdescname},
    sort={\the\glslongtok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}},
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}},
    text={\glsxplongfont{\the\glslongtok}{\glscategorylabel}},
    plural={\glsxplongfont{\the\glslongpltok}{\glscategorylabel}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The format for subsequent use (not used when the regular attribute
% is set).
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrlongformat{##1}{##2}{\glslongfont}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glslongfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glslongfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glslongfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glslongfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentplfmt}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glslongfont}%
  }%
%    \end{macrocode}
% The inline full form displays the long format followed by the
% short form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
     {\glsfirstlongfont}{\glsfirstabbrvfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the long form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongformat{##1}{##2}{\glsfirstlongfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glsfirstlongfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glsfirstlongfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glsfirstlongfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glsfirstlongfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glsfirstlongfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{long-noshort-desc}
%\changes{1.04}{2016-05-02}{new}
%Provide a synonym that matches similar styles.
%    \begin{macrocode}
\letabbreviationstyle{long-noshort-desc}{long-desc}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-noshort-desc-noreg}
%\changes{1.17}{2017-08-09}{new}
% Like long-noshort-desc but doesn't set the \catattr{regular} attribute.
%    \begin{macrocode}
\newabbreviationstyle{long-noshort-desc-noreg}%
{%
  \GlsXtrUseAbbrStyleSetup{long-noshort-desc}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-noshort-desc}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrlongnoshortname}
%\changes{1.25}{2017-11-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlongnoshortname}{%
  \glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long}
% It doesn't really make a great deal of sense to have a long-only
% style that doesn't have a description (unless no glossary is
% required), but the best course of
% action here is to use the short form as the name and the long
% form as the description.
%    \begin{macrocode}
\newabbreviationstyle{long}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortname},
    sort={\the\glsshorttok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}},
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}},
    text={\glsxplongfont{\the\glslongtok}{\glscategorylabel}},
    plural={\glsxplongfont{\the\glslongpltok}{\glscategorylabel}},%
    description={\the\glslongtok}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-desc}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-noshort}
%\changes{1.04}{2016-05-02}{new}
%Provide a synonym that matches similar styles.
%    \begin{macrocode}
\letabbreviationstyle{long-noshort}{long}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-noshort-noreg}
%\changes{1.17}{2017-08-09}{new}
% Like long-noshort but doesn't set the \catattr{regular} attribute.
%    \begin{macrocode}
\newabbreviationstyle{long-noshort-noreg}%
{%
  \GlsXtrUseAbbrStyleSetup{long-noshort}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-noshort}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\subsection{Predefined Styles (Small Capitals)}
%These styles use \cs{textsc} for the short form.
%\begin{macro}{\glsxtrscfont}
%\changes{0.5}{2015-12-07}{new}
%Maintained for backward-compatibility.
%    \begin{macrocode}
\newcommand*{\glsxtrscfont}[1]{\textsc{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsabbrvscfont}
%\changes{1.17}{2017-08-09}{new}
%Added for consistent naming.
%    \begin{macrocode}
\newcommand*{\glsabbrvscfont}{\glsxtrscfont}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrfirstscfont}
%\changes{1.04}{2016-05-02}{new}
%Maintained for backward-compatibility.
%    \begin{macrocode}
\newcommand*{\glsxtrfirstscfont}[1]{\glsabbrvscfont{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsfirstabbrvscfont}
%\changes{1.17}{2017-08-09}{new}
%Added for consistent naming.
%    \begin{macrocode}
\newcommand*{\glsfirstabbrvscfont}{\glsxtrfirstscfont}
%    \end{macrocode}
%\end{macro}
% and for the default short form suffix:
%\begin{macro}{\glsxtrscsuffix}
%\changes{0.5}{2015-12-07}{new}
%\changes{1.42}{2020-02-03}{added \cs{protect}}
%\cs{protect} needs to come inside \cs{glsxtrscsuffix} to avoid
%interfering with all caps.
%    \begin{macrocode}
\newcommand*{\glsxtrscsuffix}{\protect\glstextup{\glsxtrabbrvpluralsuffix}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrscrevert}
%\changes{1.49}{2022-10-24}{new}
%Cancel smallcaps.
%    \begin{macrocode}
\newcommand*{\glsxtrscrevert}[1]{\glstextup{#1}}%
%    \end{macrocode}
%\end{macro}
%
%v1.49: the following now use commands like
%\cs{glsfirstinnerfmtabbrvfont} instead of
%\cs{glsfirstabbrvscfont} etc. This makes it easier to apply the inner
%formatting. The scoping added in v1.48 with \cs{glslinkwrcontent}
%should prevent formatting leakage in the event of nested commands.
%The only problem will be if commands like \cs{glsentryfirst} are
%used, but those aren't designed for consistent formatting. It will
%also make it easier to locally redefine \cs{glsfirstinnerfmtabbrvfont}
%to strip the formatting if those commands are used (rather than
%having to define all the possible abbreviation style formatting
%commands). Since these new commands are robust they don't need
%protecting.
%
%\begin{abbrvstyle}{long-short-sc}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{long-short-sc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% Use smallcaps and adjust the plural suffix to revert to upright.
%\changes{1.42}{2020-02-03}{moved \cs{protect} inside \cs{glsxtrscsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrscrevert{##1}}%
%    \end{macrocode}
% Use the default long fonts.
%    \begin{macrocode}
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
     {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
     {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
     {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
     {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
     {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
     {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-short-sc-desc}
%    \begin{macrocode}
\newabbreviationstyle{long-short-sc-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},%
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}%
  }%
%    \end{macrocode}
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% As long-short-sc style:
%    \begin{macrocode}
  \GlsXtrUseAbbrStyleFmts{long-short-sc}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sc-long}
% Now the short (long) version
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{short-sc-long}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% Use smallcaps and adjust the plural suffix to revert to upright.
%\changes{1.42}{2020-02-03}{moved \cs{protect} inside \cs{glsxtrscsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrscrevert{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sc-long-desc}
% As before but user provides description
%    \begin{macrocode}
\newabbreviationstyle{short-sc-long-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},
    sort={\glsxtrshortlongdescsort},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% As short-sc-long style:
%    \begin{macrocode}
  \GlsXtrUseAbbrStyleFmts{short-sc-long}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sc}
%    \begin{macrocode}
\newabbreviationstyle{short-sc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortnolongname},
    sort={\the\glsshorttok},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
% Use smallcaps and adjust the plural suffix to revert to upright.
%\changes{1.42}{2020-02-03}{moved \cs{protect} inside \cs{glsxtrscsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrscrevert{##1}}%
%    \end{macrocode}
% The inline full form displays the short form followed by the
% long form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
%    \end{macrocode}
%\changes{1.21}{2017-11-03}{corrected first letter uppercasing}
%    \begin{macrocode}
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the short form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sc-nolong}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\letabbreviationstyle{short-sc-nolong}{short-sc}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sc-desc}
%\changes{1.39}{2019-03-22}{bug fix: omit \gloskey{description} key as advertised in the
%manual}
%    \begin{macrocode}
\newabbreviationstyle{short-sc-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortdescname},
    sort={\the\glsshorttok},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
% Use smallcaps and adjust the plural suffix to revert to upright.
%\changes{1.42}{2020-02-03}{moved \cs{protect} inside \cs{glsxtrscsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrscrevert{##1}}%
%    \end{macrocode}
% The inline full form displays the short format followed by the
% long form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the short form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{short-sc-nolong-desc}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\letabbreviationstyle{short-sc-nolong-desc}{short-sc-desc}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{nolong-short-sc}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newabbreviationstyle{nolong-short-sc}%
{%
  \GlsXtrUseAbbrStyleSetup{short-sc-nolong}%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sc-nolong}%
%    \end{macrocode}
% The inline full form displays the long form followed by the
% short form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-noshort-sc}
%\changes{1.04}{2016-05-02}{renamed from \qt{long-sc}}
% The smallcaps font will only be used if
% the short form is explicitly invoked through commands like
% \cs{glsxtrshort}. No accessibility attributes needed here.
%    \begin{macrocode}
\newabbreviationstyle{long-noshort-sc}%
{%
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortname},
    sort={\the\glsshorttok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}},
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}},
    text={\glsxplongfont{\the\glslongtok}{\glscategorylabel}},
    plural={\glsxplongfont{\the\glslongpltok}{\glscategorylabel}},%
    description={\the\glslongtok}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
% Use smallcaps and adjust the plural suffix to revert to upright.
%\changes{1.42}{2020-02-03}{moved \cs{protect} inside \cs{glsxtrscsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrscrevert{##1}}%
%    \end{macrocode}
% The format for subsequent use (not used when the regular attribute
% is set).
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
%    \end{macrocode}
% The inline full form displays the long format followed by the
% short form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the long form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{long-sc}
%Backward compatibility: 
%    \begin{macrocode}
\@glsxtr@deprecated@abbrstyle{long-sc}{long-noshort-sc}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-noshort-sc-desc}
%\changes{1.04}{2016-05-02}{renamed from \qt{long-desc-sc}}
% The smallcaps font will only be used if
% the short form is explicitly invoked through commands like
% \cs{glsxtrshort}.
%    \begin{macrocode}
\newabbreviationstyle{long-noshort-sc-desc}%
{%
  \GlsXtrUseAbbrStyleSetup{long-noshort-desc}%
}%
{%
%    \end{macrocode}
% Use smallcaps and adjust the plural suffix to revert to upright.
%\changes{1.42}{2020-02-03}{moved \cs{protect} inside \cs{glsxtrscsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrscrevert{##1}}%
%    \end{macrocode}
% The format for subsequent use (not used when the regular attribute
% is set).
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentplfmt}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
%    \end{macrocode}
% The inline full form displays the long format followed by the
% short form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvscfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the long form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{long-desc-sc}
%Backward compatibility: 
%    \begin{macrocode}
\@glsxtr@deprecated@abbrstyle{long-desc-sc}{long-noshort-sc-desc}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sc-footnote}
%\changes{0.5}{2015-12-07}{new}
%\changes{1.04}{2016-05-02}{renamed from \qt{footnote-sc}}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{short-sc-footnote}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Switch off hyperlinks on first use to prevent nested hyperlinks,
% and unset the \catattr{regular} attribute if it has been set.
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% Use smallcaps and adjust the plural suffix to revert to upright.
%\changes{1.42}{2020-02-03}{moved \cs{protect} inside \cs{glsxtrscsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrscrevert{##1}}%
%    \end{macrocode}
% The full format displays the short form followed by the long form
% as a footnote.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvscfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvscfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongplformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvscfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvscfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongplformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvscfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvscfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongplformat{##1}{\glsfirstlongfootnotefont}}%
  }%
%    \end{macrocode}
% The first use full form and the inline full form use the short
% (long) style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvscfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{footnote-sc}
%Backward compatibility: 
%    \begin{macrocode}
\@glsxtr@deprecated@abbrstyle{footnote-sc}{short-sc-footnote}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sc-footnote-desc}
% Like \abbrstyle{short-sc-footnote} but with user supplied description.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newabbreviationstyle{short-sc-footnote-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Switch off hyperlinks on first use to prevent nested hyperlinks,
% and unset the \catattr{regular} attribute if it has been set.
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sc-footnote}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sc-postfootnote}
%\changes{0.5}{2015-12-07}{new}
%\changes{1.04}{2016-05-02}{renamed from \qt{postfootnote-sc}}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{short-sc-postfootnote}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Make this category insert a footnote after the link if this was
% the first use, and
% unset the \catattr{regular} attribute if it has been set.
% The footnote needs to be suppressed in the inline form.
%Previously this was done by redefining {glsxtrsetupfulldefs} but
%that interferes with other styles. Instead, this now uses \cs{glsxtrifwasglslike}
%\changes{1.49}{2022-10-24}{removed redef of \cs{glsxtrsetupfulldefs}}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasglslikeandfirstuse
      {%
        \glsxtrdopostpunc{\xpglsxtrpostabbrvfootnote}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% Use smallcaps and adjust the plural suffix to revert to upright.
%\changes{1.42}{2020-02-03}{moved \cs{protect} inside \cs{glsxtrscsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrscrevert{##1}}%
%    \end{macrocode}
% The full format displays the short form. The long form is
% deferred.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvscfont}%
  }%
%    \end{macrocode}
% The first use full form and the inline full form use the short
% (long) style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvscfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvscfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{postfootnote-sc}
%Backward compatibility: 
%    \begin{macrocode}
\@glsxtr@deprecated@abbrstyle{postfootnote-sc}{short-sc-postfootnote}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sc-postfootnote-desc}
% Like \abbrstyle{short-sc-footnote} but with user supplied description.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newabbreviationstyle{short-sc-postfootnote-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Make this category insert a footnote after the link if this was
% the first use, and
% unset the \catattr{regular} attribute if it has been set.
% The footnote needs to be suppressed in the inline form.
%Previously this was done by redefining {glsxtrsetupfulldefs} but
%that interferes with other styles. Instead, this now uses \cs{glsxtrifwasglslike}
%\changes{1.49}{2022-10-24}{removed redef of \cs{glsxtrsetupfulldefs}}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasglslikeandfirstuse
      {%
        \glsxtrdopostpunc{\xpglsxtrpostabbrvfootnote}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sc-postfootnote}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\subsection{Predefined Styles (Fake Small Capitals)}
% These styles require the \sty{relsize} package, which must be
% loaded by the user. These styles all use:
%\begin{macro}{\glsxtrsmfont}
%\changes{0.5}{2015-12-07}{new}
%Maintained for backward compatibility.
%    \begin{macrocode}
\newcommand*{\glsxtrsmfont}[1]{\textsmaller{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsabbrvsmfont}
%\changes{1.17}{2017-08-09}{new}
%Added for consistent naming.
%    \begin{macrocode}
\newcommand*{\glsabbrvsmfont}{\glsxtrsmfont}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrfirstsmfont}
%\changes{1.04}{2016-05-02}{new}
%Maintained for backward compatibility.
%    \begin{macrocode}
\newcommand*{\glsxtrfirstsmfont}[1]{\glsabbrvsmfont{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsfirstabbrvsmfont}
%\changes{1.17}{2017-08-09}{new}
%Added for consistent naming.
%    \begin{macrocode}
\newcommand*{\glsfirstabbrvsmfont}{\glsxtrfirstsmfont}
%    \end{macrocode}
%\end{macro}
% and for the default short form suffix:
%\begin{macro}{\glsxtrsmsuffix}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrsmsuffix}{\glsxtrabbrvpluralsuffix}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrsmrevert}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrsmrevert}[1]{\textlarger{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-short-sm}
%\changes{0.5}{2015-12-07}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{long-short-sm}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtrsmsuffix}}
%    \begin{macrocode}
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrsmrevert{##1}}%
%    \end{macrocode}
% Use the default long fonts.
%    \begin{macrocode}
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-short-sm-desc}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newabbreviationstyle{long-short-sm-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},%
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% As long-short-sm style:
%    \begin{macrocode}
  \GlsXtrUseAbbrStyleFmts{long-short-sm}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sm-long}
% Now the short (long) version
%\changes{0.5}{2015-12-07}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{short-sm-long}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtrsmsuffix}}
%    \begin{macrocode}
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrsmrevert{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sm-long-desc}
% As before but user provides description
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newabbreviationstyle{short-sm-long-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},
    sort={\glsxtrshortlongdescsort},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% As short-sm-long style:
%    \begin{macrocode}
  \GlsXtrUseAbbrStyleFmts{short-sm-long}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sm}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newabbreviationstyle{short-sm}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortnolongname},
    sort={\the\glsshorttok},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtrsmsuffix}}
%    \begin{macrocode}
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrsmrevert{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The inline full form displays the short form followed by the
% long form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
%    \end{macrocode}
%\changes{1.21}{2017-11-03}{corrected first letter uppercasing}
%    \begin{macrocode}
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the short form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sm-nolong}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\letabbreviationstyle{short-sm-nolong}{short-sm}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sm-desc}
%\changes{0.5}{2015-12-07}{new}
%\changes{1.39}{2019-03-22}{corrected to omit \gloskey{description} key as advertised in the
%manual}
%    \begin{macrocode}
\newabbreviationstyle{short-sm-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortdescname},
    sort={\the\glsshorttok},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtrsmsuffix}}
%    \begin{macrocode}
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrsmrevert{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The inline full form displays the short format followed by the
% long form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the short form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{short-sm-nolong-desc}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\letabbreviationstyle{short-sm-nolong-desc}{short-sm-desc}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{nolong-short-sm}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newabbreviationstyle{nolong-short-sm}%
{%
  \GlsXtrUseAbbrStyleSetup{short-sm-nolong}%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sm-nolong}%
%    \end{macrocode}
% The inline full form displays the long form followed by the
% short form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-noshort-sm}
%\changes{0.5}{2015-12-07}{new}
%\changes{1.04}{2016-05-02}{renamed from \qt{long-sm}}
% The smallcaps font will only be used if
% the short form is explicitly invoked through commands like
% \cs{glsxtrshort}.
%    \begin{macrocode}
\newabbreviationstyle{long-noshort-sm}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortname},
    sort={\the\glsshorttok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}},
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}},
    text={\glsxplongfont{\the\glslongtok}{\glscategorylabel}},
    plural={\glsxplongfont{\the\glslongpltok}{\glscategorylabel}},%
    description={\the\glslongtok}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtrsmsuffix}}
%    \begin{macrocode}
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrsmrevert{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The format for subsequent use (not used when the regular attribute
% is set).
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentplfmt}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
%    \end{macrocode}
% The inline full form displays the long format followed by the
% short form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the long form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{long-sm}
%Backward compatibility: 
%    \begin{macrocode}
\@glsxtr@deprecated@abbrstyle{long-sm}{long-noshort-sm}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-noshort-sm-desc}
%\changes{0.5}{2015-12-07}{new}
%\changes{1.04}{2016-05-02}{renamed from \cs{long-desc-sm}}
% The smaller font will only be used if
% the short form is explicitly invoked through commands like
% \cs{glsxtrshort}.
%    \begin{macrocode}
\newabbreviationstyle{long-noshort-sm-desc}%
{%
  \GlsXtrUseAbbrStyleSetup{long-noshort-desc}%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtrsmsuffix}}
%    \begin{macrocode}
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrsmrevert{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The format for subsequent use (not used when the regular attribute
% is set).
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentplfmt}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
%    \end{macrocode}
% The inline full form displays the long format followed by the
% short form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvsmfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the long form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{long-desc-sm}
%Backward compatibility: 
%    \begin{macrocode}
\@glsxtr@deprecated@abbrstyle{long-desc-sm}{long-noshort-sm-desc}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sm-footnote}
%\changes{0.5}{2015-12-07}{new}
%\changes{1.04}{2016-05-02}{renamed from \qt{footnote-sm}}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{short-sm-footnote}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Switch off hyperlinks on first use to prevent nested hyperlinks,
% and unset the \catattr{regular} attribute if it has been set.
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtrsmsuffix}}
%    \begin{macrocode}
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrsmrevert{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
%    \end{macrocode}
% The full format displays the short form followed by the long form
% as a footnote.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvsmfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvsmfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongplformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvsmfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvsmfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongplformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvsmfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvsmfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongplformat{##1}{\glsfirstlongfootnotefont}}%
  }%
%    \end{macrocode}
% The first use full form and the inline full form use the short
% (long) style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvsmfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{footnote-sm}
%Backward compatibility: 
%    \begin{macrocode}
\@glsxtr@deprecated@abbrstyle{footnote-sm}{short-sm-footnote}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sm-footnote-desc}
% Like \abbrstyle{short-footnote} but with user supplied description.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newabbreviationstyle{short-sm-footnote-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Switch off hyperlinks on first use to prevent nested hyperlinks,
% and unset the \catattr{regular} attribute if it has been set.
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sm-footnote}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sm-postfootnote}
%\changes{0.5}{2015-12-07}{new}
%\changes{1.04}{2016-05-02}{renamed from \qt{postfootnote-sm}}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{short-sm-postfootnote}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Make this category insert a footnote after the link if this was
% the first use, and
% unset the \catattr{regular} attribute if it has been set.
% The footnote needs to be suppressed in the inline form.
%Previously this was done by redefining {glsxtrsetupfulldefs} but
%that interferes with other styles. Instead, this now uses \cs{glsxtrifwasglslike}
%\changes{1.49}{2022-10-24}{removed redef of \cs{glsxtrsetupfulldefs}}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasglslikeandfirstuse
      {%
        \glsxtrdopostpunc{\xpglsxtrpostabbrvfootnote}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtrsmsuffix}}
%    \begin{macrocode}
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrsmrevert{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
%    \end{macrocode}
% The full format displays the short form. The long form is
% deferred.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvsmfont}%
  }%
%    \end{macrocode}
% The first use full form and the inline full form use the short
% (long) style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvsmfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvsmfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{postfootnote-sm}
%Backward compatibility: 
%    \begin{macrocode}
\@glsxtr@deprecated@abbrstyle{postfootnote-sm}{short-sm-postfootnote}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-sm-postfootnote-desc}
% Like \abbrstyle{short-sm-postfootnote} but with user supplied description.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newabbreviationstyle{short-sm-postfootnote-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Make this category insert a footnote after the link if this was
% the first use, and
% unset the \catattr{regular} attribute if it has been set.
% The footnote needs to be suppressed in the inline form.
%Previously this was done by redefining {glsxtrsetupfulldefs} but
%that interferes with other styles. Instead, this now uses \cs{glsxtrifwasglslike}
%\changes{1.49}{2022-10-24}{removed redef of \cs{glsxtrsetupfulldefs}}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasglslikeandfirstuse
      {%
%    \end{macrocode}
% Ensure \cs{glslabel} is expanded as it may be
% lost by the time the footnote occurs.
%    \begin{macrocode}
        \glsxtrdopostpunc{\xpglsxtrpostabbrvfootnote}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sm-postfootnote}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\subsection{Predefined Styles (Emphasized)}
% These styles use \cs{emph} for the short form.
%\begin{macro}{\glsabbrvemfont}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\glsabbrvemfont}[1]{\emph{#1}}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsfirstabbrvemfont}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\glsfirstabbrvemfont}[1]{\glsabbrvemfont{#1}}%
%    \end{macrocode}
%\end{macro}
% The default short form suffix:
%\begin{macro}{\glsxtremsuffix}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newcommand*{\glsxtremsuffix}{\glsxtrabbrvpluralsuffix}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsfirstlongemfont}
%\changes{1.04}{2016-05-02}{new}
%Only used by the \qt{long-em} styles.
%    \begin{macrocode}
\newcommand*{\glsfirstlongemfont}[1]{\glslongemfont{#1}}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongemfont}
%\changes{1.04}{2016-05-02}{new}
%Only used by the \qt{long-em} styles.
%    \begin{macrocode}
\newcommand*{\glslongemfont}[1]{\emph{#1}}%
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtremrevert}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtremrevert}[1]{\textup{#1}}%
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-short-em}
%\changes{0.5}{2015-12-07}{new}
% The long form is just set in the default long font.
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{long-short-em}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtremsuffix}}
%    \begin{macrocode}
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtremrevert{##1}}%
%    \end{macrocode}
% Use the default long fonts.
%    \begin{macrocode}
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-short-em-desc}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newabbreviationstyle{long-short-em-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},%
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% As long-short-em style:
%    \begin{macrocode}
  \GlsXtrUseAbbrStyleFmts{long-short-em}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-em-short-em}
%\changes{1.04}{2016-05-02}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{long-em-short-em}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%\cs{glslongemfont} is used in the description since \cs{glsdesc}
%doesn't set the style.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}},%
%    \end{macrocode}
%\changes{1.15}{2017-05-10}{fixed spelling of \cs{glsabbrvfont}}
%    \begin{macrocode}
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
    description={\protect\glslongemfont{\the\glslongtok}}}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtremsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtremrevert{##1}}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongemfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongemfont{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-em-short-em-desc}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newabbreviationstyle{long-em-short-em-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},%
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-em-short-em}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-em-long}
% Now the short (long) version
%\changes{0.5}{2015-12-07}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{short-em-long}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% Mostly as short-long style:
%\changes{1.05}{2016-06-10}{fixed incorrect font used by long form}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtremsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtremrevert{##1}}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-em-long-desc}
% As before but user provides description
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newabbreviationstyle{short-em-long-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},
    sort={\glsxtrshortlongdescsort},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-em-long}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-em-long-em}
%\changes{1.04}{2016-05-02}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{short-em-long-em}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%\cs{glslongemfont} is used in the description since \cs{glsdesc}
%doesn't set the style.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    description={\protect\glslongemfont{\the\glslongtok}},%
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}}},%
%    \end{macrocode}
%\changes{1.15}{2017-05-10}{fixed spelling of \cs{glsabbrvfont}}
%    \begin{macrocode}
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtremsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtremrevert{##1}}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongemfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongemfont{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-em-long-em-desc}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newabbreviationstyle{short-em-long-em-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},%
    sort={\glsxtrshortlongdescsort},%
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-em-long-em}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-em}
%\changes{0.5}{2015-12-07}{new}
%    \begin{macrocode}
\newabbreviationstyle{short-em}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortnolongname},
    sort={\the\glsshorttok},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtremsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtremrevert{##1}}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The inline full form displays the short form followed by the
% long form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the short form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-em-nolong}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\letabbreviationstyle{short-em-nolong}{short-em}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-em-desc}
%\changes{0.5}{2015-12-07}{new}
%\changes{1.39}{2019-03-22}{bug fix: omit \gloskey{description} key as advertised in the
%manual}
%    \begin{macrocode}
\newabbreviationstyle{short-em-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled. The default name includes
% the long form but \cs{glsxtrshortdescname} could be modified to
% omit the long form, so include the \category{nameshortaccess}
% attribute.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortdescname},
    sort={\the\glsshorttok},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtremsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtremrevert{##1}}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The inline full form displays the short format followed by the
% long form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the short form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{short-em-nolong-desc}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\letabbreviationstyle{short-em-nolong-desc}{short-em-desc}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{nolong-short-em}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newabbreviationstyle{nolong-short-em}%
{%
  \GlsXtrUseAbbrStyleSetup{short-em-nolong}%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-em-nolong}%
%    \end{macrocode}
% The inline full form displays the long form followed by the
% short form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-noshort-em}
%\changes{0.5}{2015-12-07}{new}
%\changes{1.04}{2016-05-02}{renamed from \qt{long-em}}
% The short form is explicitly invoked through commands like
% \cs{glsxtrshort}.
%    \begin{macrocode}
\newabbreviationstyle{long-noshort-em}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortname},
    sort={\the\glsshorttok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}},
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}},
    text={\glsxplongfont{\the\glslongtok}{\glscategorylabel}},
    plural={\glsxplongfont{\the\glslongpltok}{\glscategorylabel}},%
    description={\the\glslongtok}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtremsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtremrevert{##1}}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The format for subsequent use (not used when the regular attribute
% is set).
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentplfmt}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
%    \end{macrocode}
% The inline full form displays the long format followed by the
% short form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the long form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{long-em}
%Backward compatibility: 
%    \begin{macrocode}
\@glsxtr@deprecated@abbrstyle{long-em}{long-noshort-em}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-em-noshort-em}
%\changes{1.04}{2016-05-02}{new}
% The short form is explicitly invoked through commands like
% \cs{glsxtrshort}.
%    \begin{macrocode}
\newabbreviationstyle{long-em-noshort-em}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortname},
    sort={\the\glsshorttok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}},
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}},
    text={\glsxplongfont{\the\glslongtok}{\glscategorylabel}},
    plural={\glsxplongfont{\the\glslongpltok}{\glscategorylabel}},%
    description={\protect\glslongemfont{\the\glslongtok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtremsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtremrevert{##1}}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongemfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongemfont{##1}}%
%    \end{macrocode}
% The format for subsequent use (not used when the regular attribute
% is set).
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrlongformat{##1}{##2}{\glslongemfont}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glslongemfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glslongemfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glslongemfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glslongemfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentplfmt}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glslongemfont}%
  }%
%    \end{macrocode}
% The inline full form displays the long format followed by the
% short form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the long form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongformat{##1}{##2}{\glsfirstlongemfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glsfirstlongemfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glsfirstlongemfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glsfirstlongemfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glsfirstlongemfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glsfirstlongemfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-em-noshort-em-noreg}
%\changes{1.17}{2017-08-09}{new}
% Like long-em-noshort-em but doesn't set the \catattr{regular} attribute.
%    \begin{macrocode}
\newabbreviationstyle{long-em-noshort-em-noreg}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \GlsXtrUseAbbrStyleSetup{long-em-noshort-em}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-em-noshort-em}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-noshort-em-desc}
%\changes{1.04}{2016-05-02}{renamed from \qt{long-desc-em}}
%\changes{0.5}{2015-12-07}{new}
% The emphasized font will only be used if
% the short form is explicitly invoked through commands like
% \cs{glsxtrshort}.
%    \begin{macrocode}
\newabbreviationstyle{long-noshort-em-desc}%
{%
  \GlsXtrUseAbbrStyleSetup{long-noshort-desc}%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtremsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtremrevert{##1}}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
%    \end{macrocode}
% The format for subsequent use (not used when the regular attribute
% is set).
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glslongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentplfmt}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glslongdefaultfont}%
  }%
%    \end{macrocode}
% The inline full form displays the long format followed by the
% short form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongdefaultfont}{\glsfirstabbrvemfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the long form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glsfirstlongdefaultfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{long-desc-em}
%Backward compatibility: 
%    \begin{macrocode}
\@glsxtr@deprecated@abbrstyle{long-desc-em}{long-noshort-em-desc}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-em-noshort-em-desc}
%\changes{1.04}{2016-05-02}{new}
% The short form is explicitly invoked through commands like
% \cs{glsxtrshort}. The long form is emphasized. No accessibility
% attributes need to be set.
%    \begin{macrocode}
\newabbreviationstyle{long-em-noshort-em-desc}%
{%
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortdescname},
    sort={\the\glslongtok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}},
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}},
    text={\glsxplongfont{\the\glslongtok}{\glscategorylabel}},
    plural={\glsxplongfont{\the\glslongpltok}{\glscategorylabel}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtremsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtremrevert{##1}}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongemfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongemfont{##1}}%
%    \end{macrocode}
% The format for subsequent use (not used when the regular attribute
% is set).
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrlongformat{##1}{##2}{\glslongemfont}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glslongemfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glslongemfont}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glslongemfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glslongemfont}%
  }%
  \renewcommand*{\GLSxtrsubsequentplfmt}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glslongemfont}%
  }%
%    \end{macrocode}
% The inline full form displays the long format followed by the
% short form in parentheses.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongemfont}{\glsfirstabbrvemfont}%
  }%
%    \end{macrocode}
% The first use full form only displays the long form, but it
% typically won't be used as the \catattr{regular} attribute is set by this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongformat{##1}{##2}{\glsfirstlongemfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glsfirstlongemfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glsfirstlongemfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glsfirstlongemfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glsfirstlongemfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glsfirstlongemfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-em-noshort-em-desc-noreg}
%\changes{1.17}{2017-08-09}{new}
% Like long-em-noshort-em-desc but doesn't set the \catattr{regular} attribute.
%    \begin{macrocode}
\newabbreviationstyle{long-em-noshort-em-desc-noreg}%
{%
  \GlsXtrUseAbbrStyleSetup{long-em-noshort-em-desc}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-em-noshort-em-desc}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-em-footnote}
%\changes{0.5}{2015-12-07}{new}
%\changes{1.04}{2015-04-30}{renamed from \qt{footnote-em}}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{short-em-footnote}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Switch off hyperlinks on first use to prevent nested hyperlinks,
% and unset the \catattr{regular} attribute if it has been set.
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtremsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtremrevert{##1}}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
%    \end{macrocode}
% The full format displays the short form followed by the long form
% as a footnote.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvemfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvemfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongplformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvemfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvemfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongplformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvemfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongformat{##1}{\glsfirstlongfootnotefont}}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvemfont}%
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsxtrfootnotelongplformat{##1}{\glsfirstlongfootnotefont}}%
  }%
%    \end{macrocode}
% The first use inline full form uses the short (long) style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvemfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{footnote-em}
%Backward compatibility: 
%    \begin{macrocode}
\@glsxtr@deprecated@abbrstyle{footnote-em}{short-em-footnote}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-em-footnote-desc}
% Like \abbrstyle{short-em-footnote} but with user supplied description.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newabbreviationstyle{short-em-footnote-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Switch off hyperlinks on first use to prevent nested hyperlinks,
% and unset the \catattr{regular} attribute if it has been set.
%\changes{0.5.1}{2015-12-07}{switch off regular attribute if set}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-em-footnote}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-em-postfootnote}
%\changes{0.5}{2015-12-07}{new}
%\changes{1.04}{2016-05-02}{renamed from \qt{postfootnote-em}}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{short-em-postfootnote}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Make this category insert a footnote after the link if this was
% the first use, and
% unset the \catattr{regular} attribute if it has been set.
%Previously this was done by redefining {glsxtrsetupfulldefs} but
%that interferes with other styles. Instead, this now uses \cs{glsxtrifwasglslike}
%\changes{1.49}{2022-10-24}{removed redef of \cs{glsxtrsetupfulldefs}}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasglslikeandfirstuse
      {%
%    \end{macrocode}
% Ensure \cs{glslabel} is expanded as it may be
% lost by the time the footnote occurs.
%    \begin{macrocode}
        \glsxtrdopostpunc{\xpglsxtrpostabbrvfootnote}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtremsuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsxtrrevert[1]{\glsxtremrevert{##1}}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
%    \end{macrocode}
% The full format displays the short form. The long form is
% deferred.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvemfont}%
  }%
%    \end{macrocode}
% The inline full form uses the short (long) style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortlongformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvemfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortlongplformat{##1}{##2}%
      {\glsfirstlongfootnotefont}{\glsfirstabbrvemfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%\begin{abbrvstyle}{postfootnote-em}
%Backward compatibility: 
%    \begin{macrocode}
\@glsxtr@deprecated@abbrstyle{postfootnote-em}{short-em-postfootnote}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-em-postfootnote-desc}
% Like \abbrstyle{short-em-postfootnote} but with user supplied description.
%\changes{1.42}{2020-02-03}{new}
%    \begin{macrocode}
\newabbreviationstyle{short-em-postfootnote-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\glsfirstxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    firstplural={\glsfirstxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}}%
%    \end{macrocode}
% Make this category insert a footnote after the link if this was
% the first use, and
% unset the \catattr{regular} attribute if it has been set.
%Previously this was done by redefining {glsxtrsetupfulldefs} but
%that interferes with other styles. Instead, this now uses \cs{glsxtrifwasglslike}
%\changes{1.49}{2022-10-24}{removed redef of \cs{glsxtrsetupfulldefs}}
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasglslikeandfirstuse
      {%
        \glsxtrdopostpunc{\xpglsxtrpostabbrvfootnote}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-em-postfootnote}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\subsection{Predefined Styles (User Parentheses Hook)}
% These styles allow the user to adjust the parenthetical forms.
% These styles all test for the existence of the
% field given by:
%\begin{macro}{\glsxtruserfield}
%\changes{1.04}{2016-05-02}{new}
% Default is the useri field.
%    \begin{macrocode}
\newcommand*{\glsxtruserfield}{useri}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtruserparensep}
%\changes{1.49}{2022-10-24}{new}
% Separator used inside parenthetical content.
%    \begin{macrocode}
\newcommand*{\glsxtruserparensep}{, }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtruserfieldfmt}
%\changes{1.49}{2022-10-24}{new}
% Used to format the value of the field given by \cs{glsxtruserfield}.
%    \begin{macrocode}
\newcommand*{\glsxtruserfieldfmt}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtruserparen}
%\changes{1.04}{2016-05-02}{new}
% The format of the parenthetical information.
% The first argument is the long/short form. The second argument
% is the entry's label. If \cs{glscurrentfieldvalue} has been
% defined, then we have at least \sty{glossaries} v4.23, which makes
% it easier for the user to adjust this.
%    \begin{macrocode}
\ifdef\glscurrentfieldvalue
{
  \newcommand*{\glsxtruserparen}[2]{%
    \glsxtrfullsep{#2}%
    \glsxtrparen
    {#1\ifglshasfield{\glsxtruserfield}{#2}%
     {\expandafter\glsxtrgenentrytextfmt\expandafter{\glsxtruserparensep}%
      \glsxtruserfieldfmt{\expandafter\glsxtrgenentrytextfmt\expandafter{\glscurrentfieldvalue}}%
     }{}%
    }%
  }
}
{
  \newcommand*{\glsxtruserparen}[2]{%
    \glsxtrfullsep{#2}%
    \glsxtrparen
    {#1\ifglshasfield{\glsxtruserfield}{#2}%
     {\expandafter\glsxtrgenentrytextfmt\expandafter{\glsxtruserparensep}%
      \glsxtruserfieldfmt{\expandafter\glsxtrgenentrytextfmt\expandafter{\@glo@thisvalue}}%
     }{}%
    }%
  }
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtruserparen}
%\changes{1.49}{2022-10-24}{new}
% As above but converts the user supplied information to all-caps.
% The first argument should be provided in all-caps if required.
%    \begin{macrocode}
\ifdef\glscurrentfieldvalue
{
  \newcommand*{\GLSxtruserparen}[2]{%
    \glsxtrfullsep{#2}%
    \glsxtrparen
    {#1\ifglshasfield{\glsxtruserfield}{#2}%
      {\expandafter\glsxtrgenentrytextfmt\expandafter{\glsxtruserparensep}%
       \glsxtruserfieldfmt{\expandafter\mfirstucMakeUppercase\expandafter{\expandafter
        \glsxtrgenentrytextfmt\expandafter{\glscurrentfieldvalue}}}%
      }{}%
    }%
  }
}
{
  \newcommand*{\GLSxtruserparen}[2]{%
    \glsxtrfullsep{#2}%
    \glsxtrparen
    {#1\ifglshasfield{\glsxtruserfield}{#2}%
       {\expandafter\glsxtrgenentrytextfmt\expandafter{\glsxtruserparensep}% 
        \glsxtruserfieldfmt{\expandafter\mfirstucMakeUppercase\expandafter{\expandafter
        \glsxtrgenentrytextfmt\expandafter{\@glo@thisvalue}}}%
       }{}%
    }%
  }
}
%    \end{macrocode}
%\end{macro}
% Font used for short form:
%\begin{macro}{\glsabbrvuserfont}
%\changes{1.04}{2016-05-02}{new}
%\changes{1.17}{2017-08-09}{initialised to default font}
%    \begin{macrocode}
\newcommand*{\glsabbrvuserfont}[1]{\glsabbrvdefaultfont{#1}}
%    \end{macrocode}
%\end{macro}
% Font used for short form on first use:
%\begin{macro}{\glsfirstabbrvuserfont}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\glsfirstabbrvuserfont}[1]{\glsabbrvuserfont{#1}}
%    \end{macrocode}
%\end{macro}
% Font used for long form:
%\begin{macro}{\glslonguserfont}
%\changes{1.04}{2016-05-02}{new}
%\changes{1.17}{2017-08-09}{initialised to default font}
%    \begin{macrocode}
\newcommand*{\glslonguserfont}[1]{\glslongdefaultfont{#1}}
%    \end{macrocode}
%\end{macro}
% Font used for long form on first use:
%\begin{macro}{\glsfirstlonguserfont}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\glsfirstlonguserfont}[1]{\glslonguserfont{#1}}
%    \end{macrocode}
%\end{macro}
% The default short form suffix:
%\begin{macro}{\glsxtrusersuffix}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrusersuffix}{\glsxtrabbrvpluralsuffix}
%    \end{macrocode}
%\end{macro}
%
% Description encapsulator.
%\begin{macro}{\glsuserdescription}
%\changes{1.30}{2018-04-25}{new}
%The first argument is the description. The second argument is the
%label.
%    \begin{macrocode}
\newcommand*{\glsuserdescription}[2]{\glslonguserfont{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-short-user}
%\changes{1.04}{2016-05-02}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{long-short-user}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}%
     \protect\glsxtruserparen{\protect\glsfirstabbrvuserfont{\the\glsshorttok}}%
      {\the\glslabeltok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}%
     \protect\glsxtruserparen
      {\protect\glsfirstabbrvuserfont{\the\glsshortpltok}}{\the\glslabeltok}},%
%    \end{macrocode}
%\changes{1.15}{2017-05-10}{fixed spelling of \cs{glsabbrvfont}}
%    \begin{macrocode}
    text={\protect\glsabbrvuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvuserfont{\the\glsshortpltok}},%
    description={\protect\glsuserdescription{\the\glslongtok}%
     {\the\glslabeltok}}}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{2}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrusersuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonguserfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonguserfont{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtruserlongshortformat{##1}{##2}%
      {\glsfirstlonguserfont}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtruserlongshortplformat{##1}{##2}%
      {\glsfirstlonguserfont}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtruserlongshortformat{##1}{##2}%
      {\glsfirstlonguserfont}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtruserlongshortplformat{##1}{##2}%
      {\glsfirstlonguserfont}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtruserlongshortformat{##1}{##2}%
      {\glsfirstlonguserfont}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtruserlongshortplformat{##1}{##2}%
      {\glsfirstlonguserfont}{\glsfirstabbrvuserfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-postshort-user}
%\changes{1.12}{2017-02-03}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%Like \abbrstyle{long-short-user} but defers the parenthetical
%matter to after the link.
%    \begin{macrocode}
\newabbreviationstyle{long-postshort-user}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}},%
%    \end{macrocode}
%\changes{1.15}{2017-05-10}{fixed spelling of \cs{glsabbrvfont}}
%    \begin{macrocode}
    text={\protect\glsabbrvuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvuserfont{\the\glsshortpltok}},%
    description={\protect\glsuserdescription{\the\glslongtok}%
     {\the\glslabeltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrpostusershortformat{\glslabel}{\glsfirstabbrvuserfont}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrusersuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonguserfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonguserfont{##1}}%
%    \end{macrocode}
%First use full form:
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongformat{##1}{##2}{\glsfirstlonguserfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glsfirstlonguserfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glsfirstlonguserfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glsfirstlonguserfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glsfirstlonguserfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glsfirstlonguserfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%Small-caps is awkward, so support for that is added.
%\begin{macro}{\glsabbrvscuserfont}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsabbrvscuserfont}{\glsabbrvscfont}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsfirstabbrvscuserfont}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsfirstabbrvscuserfont}{\glsabbrvscuserfont}%
%    \end{macrocode}
%\end{macro}
% The default short form suffix:
%\begin{macro}{\glsxtrscusersuffix}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrscusersuffix}{\glsxtrscsuffix}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrscuserrevert}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrscuserrevert}{\glsxtrscrevert}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrlongshortscusername}
%\changes{1.48}{2021-11-22}{new}
% The default name format for this style.
%    \begin{macrocode}
\newcommand*{\glsxtrlongshortscusername}{%
  \protect\glsabbrvscuserfont{\the\glsshorttok}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-postshort-sc-user}
%\changes{1.48}{2021-11-22}{new}
%Like \abbrstyle{long-postshort-sc-user} but uses smallcaps.
%    \begin{macrocode}
\newabbreviationstyle{long-postshort-sc-user}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortscusername},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}},%
    text={\protect\glsabbrvscuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvscuserfont{\the\glsshortpltok}},%
    description={\protect\glsuserdescription{\the\glslongtok}%
     {\the\glslabeltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrpostusershortformat{\glslabel}{\glsfirstabbrvscuserfont}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscusersuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvscuserfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvscuserfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonguserfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonguserfont{##1}}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrscuserrevert{##1}}%
%    \end{macrocode}
%First use full form:
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongformat{##1}{##2}{\glsfirstlonguserfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glsfirstlonguserfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glsfirstlonguserfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glsfirstlonguserfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glsfirstlonguserfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glsfirstlonguserfont}%
  }%
%    \end{macrocode}
% In-line format is the same as the first use format.
%\changes{1.54}{2025-01-03}{corrected inline format}
%    \begin{macrocode}
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrlongshortuserdescname}
%\changes{1.25}{2017-11-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlongshortuserdescname}{%
  \protect\glslonguserfont{\the\glslongtok}%
  \protect\glsxtruserparen
   {\protect\glsabbrvuserfont{\the\glsshorttok}}{\the\glslabeltok}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-postshort-user-desc}
%\changes{1.12}{2017-02-03}{new}
%Like \abbrstyle{long-postshort-user} but the user supplies the
%description.
%    \begin{macrocode}
\newabbreviationstyle{long-postshort-user-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortuserdescname},
    sort={\the\glslongtok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}},%
%    \end{macrocode}
%\changes{1.15}{2017-05-10}{fixed spelling of \cs{glsabbrvfont}}
%    \begin{macrocode}
    text={\protect\glsabbrvuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvuserfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrpostusershortformat{\glslabel}{\glsfirstabbrvuserfont}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-postshort-user}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrlongshortscuserdescname}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlongshortscuserdescname}{%
  \protect\glslonguserfont{\the\glslongtok}%
  \protect\glsxtruserparen
   {\protect\glsabbrvscuserfont{\the\glsshorttok}}{\the\glslabeltok}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-postshort-sc-user-desc}
%\changes{1.48}{2021-11-22}{new}
%Like \abbrstyle{long-postshort-sc-user} but the user supplies the
%description.
%    \begin{macrocode}
\newabbreviationstyle{long-postshort-sc-user-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortscuserdescname},
    sort={\the\glslongtok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}},%
    text={\protect\glsabbrvscuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvscuserfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrpostusershortformat{\glslabel}{\glsfirstabbrvscuserfont}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-postshort-sc-user}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%
%\begin{abbrvstyle}{short-postlong-user}
%\changes{1.12}{2017-02-03}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%Like \abbrstyle{short-long-user} but defers the parenthetical
%matter to after the link.
%    \begin{macrocode}
\newabbreviationstyle{short-postlong-user}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}},%
%    \end{macrocode}
%\changes{1.15}{2017-05-10}{fixed spelling of \cs{glsabbrvfont}}
%    \begin{macrocode}
    text={\protect\glsabbrvuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvuserfont{\the\glsshortpltok}},%
    description={\protect\glsuserdescription{\the\glslongtok}%
     {\the\glslabeltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrpostuserlongformat{\glslabel}{\glsfirstlonguserfont}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrusersuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonguserfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonguserfont{##1}}%
%    \end{macrocode}
%First use full form:
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshortformat{##1}{##2}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshortplformat{##1}{##2}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrshortformat{##1}{##2}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrshortplformat{##1}{##2}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshortformat{##1}{##2}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshortplformat{##1}{##2}{\glsfirstabbrvuserfont}%
  }%
%    \end{macrocode}
% In-line format should be the same.
%    \begin{macrocode}
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrshortlonguserdescname}
%\changes{1.25}{2017-11-24}{new}
%\changes{1.51}{2023-04-24}{changed \cs{glslongpltok} to \cs{glslongtok}}
%    \begin{macrocode}
\newcommand*{\glsxtrshortlonguserdescname}{%
 \protect\glsabbrvuserfont{\the\glsshorttok}%
 \protect\glsxtruserparen
   {\protect\glslonguserfont{\the\glslongtok}}%
   {\the\glslabeltok}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{short-postlong-user-desc}
%\changes{1.12}{2017-02-03}{new}
%Like \abbrstyle{short-postlong-user} but leaves the user to specify
%the description.
%    \begin{macrocode}
\newabbreviationstyle{short-postlong-user-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlonguserdescname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}},%
%    \end{macrocode}
%\changes{1.15}{2017-05-10}{fixed spelling of \cs{glsabbrvfont}}
%    \begin{macrocode}
    text={\protect\glsabbrvuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvuserfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrpostuserlongformat{\glslabel}{\glsfirstlonguserfont}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-postlong-user}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-short-user-desc}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newabbreviationstyle{long-short-user-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortuserdescname},
    sort={\glsxtrlongshortdescsort},%
%    \end{macrocode}
%\changes{1.17}{2017-08-09}{corrected first forms}
%    \begin{macrocode}
    first={\protect\glsfirstlonguserfont{\the\glslongtok}%
     \protect\glsxtruserparen{\protect\glsfirstabbrvuserfont{\the\glsshorttok}}%
      {\the\glslabeltok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}%
     \protect\glsxtruserparen
      {\protect\glsfirstabbrvuserfont{\the\glsshortpltok}}{\the\glslabeltok}},%
    text={\protect\glsabbrvfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvfont{\the\glsshortpltok}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{2}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-short-user}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-long-user}
%\changes{1.04}{2016-05-02}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{short-long-user}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
%    \end{macrocode}
%\cs{glslonguserfont} is used in the description since \cs{glsdesc}
%doesn't set the style. (Now in \cs{glsuserdescription}.)
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    description={\protect\glsuserdescription{\the\glslongtok}%
      {\the\glslabeltok}},%
    first={\protect\glsfirstabbrvuserfont{\the\glsshorttok}%
     \protect\glsxtruserparen{\protect\glsfirstlonguserfont{\the\glslongtok}}%
       {\the\glslabeltok}},%
    firstplural={\protect\glsfirstabbrvuserfont{\the\glsshortpltok}%
     \protect\glsxtruserparen{\protect\glsfirstlonguserfont{\the\glslongpltok}}%
       {\the\glslabeltok}},%
%    \end{macrocode}
%\changes{1.15}{2017-05-10}{fixed spelling of \cs{glsabbrvfont}}
%    \begin{macrocode}
    text={\protect\glsabbrvuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvuserfont{\the\glsshortpltok}}}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{2}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrusersuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonguserfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonguserfont{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrusershortlongformat{##1}{##2}%
      {\glsfirstlonguserfont}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrusershortlongplformat{##1}{##2}%
      {\glsfirstlonguserfont}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrusershortlongformat{##1}{##2}%
      {\glsfirstlonguserfont}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrusershortlongplformat{##1}{##2}%
      {\glsfirstlonguserfont}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrusershortlongformat{##1}{##2}%
      {\glsfirstlonguserfont}{\glsfirstabbrvuserfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrusershortlongplformat{##1}{##2}%
      {\glsfirstlonguserfont}{\glsfirstabbrvuserfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-long-user-desc}
%\changes{1.04}{2016-05-02}{new}
%    \begin{macrocode}
\newabbreviationstyle{short-long-user-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlonguserdescname},
    sort={\glsxtrshortlongdescsort},%
%    \end{macrocode}
%\changes{1.17}{2017-08-09}{corrected first forms}
%    \begin{macrocode}
    first={\protect\glsfirstabbrvuserfont{\the\glsshorttok}%
     \protect\glsxtruserparen{\protect\glsfirstlonguserfont{\the\glslongtok}}%
       {\the\glslabeltok}},%
    firstplural={\protect\glsfirstabbrvuserfont{\the\glsshortpltok}%
     \protect\glsxtruserparen{\protect\glsfirstlonguserfont{\the\glslongpltok}}%
       {\the\glslabeltok}},%
    text={\protect\glsabbrvfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvfont{\the\glsshortpltok}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{2}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-long-user}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\subsection{Predefined Styles (Hyphen)}
%These styles are designed to work with the \catattr{markwords}
%attribute. They check if the inserted material (provided by the final
%optional argument of commands like \cs{gls}) starts with a hyphen.
%If it does, the insert is added to the parenthetical material. 
%Note that commands like \cs{glsxtrlong} set \cs{glsinsert} to empty 
%with the entire link-text stored in \cs{glscustomtext}.
%
%\begin{macro}{\glsxtrifhyphenstart}
%Checks if the argument starts with a hyphen. The argument may be
%\cs{glsinsert} so check for that and expand.
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newrobustcmd*{\glsxtrifhyphenstart}[3]{%
  \ifx\glsinsert#1\relax
   \expandafter\@glsxtrifhyphenstart#1\relax\relax
     \@end@glsxtrifhyphenstart{#2}{#3}%
  \else
   \@glsxtrifhyphenstart#1\relax\relax\@end@glsxtrifhyphenstart{#2}{#3}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrifhyphenstart}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\def\@glsxtrifhyphenstart#1#2\@end@glsxtrifhyphenstart#3#4{%
  \ifx-#1\relax#3\else #4\fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrlonghyphenshort}
%\changes{1.17}{2017-08-09}{new}
%\begin{definition}
%\cs{glsxtrlonghyphenshort}\marg{label}\marg{long}\marg{short}\marg{insert}
%\end{definition}
%The \meta{long} and \meta{short} arguments may be the plural form.
%The \meta{long} argument may also be the first letter uppercase form.
%This unfortunately doesn't fit in with the new \cs{glsxtrshortformat}
%etc commands, but is retained for backward-compatibility.
%This means that the inserted part has to have a separate encapsulation for the
%inner format. The \meta{long} and \meta{short} arguments will need to include
%the inner format.
%    \begin{macrocode}
\newcommand*{\glsxtrlonghyphenshort}[4]{%
%    \end{macrocode}
% Grouping is needed to localise the redefinitions.
%    \begin{macrocode}
 {%
%    \end{macrocode}
% If \meta{insert} starts with a hyphen, redefine \cs{glsxtrwordsep}
% to a hyphen. The inserted material is also inserted into the
% parenthetical part. (The inserted material is grouped as a
% precautionary measure.) No change is made to \cs{glsxtrwordsep} if
% \meta{insert} doesn't start with a hyphen.
%    \begin{macrocode}
   \glsxtrifhyphenstart{#4}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \glsfirstlonghyphenfont{#2\ifglsxtrinsertinside
     {\glsxtrgenentrytextfmt{#4}}\fi}%
   \ifglsxtrinsertinside\else{\glsxtrgenentrytextfmt{#4}}\fi
   \glsxtrfullsep{#1}%
   \glsxtrparen{\glsfirstabbrvhyphenfont{#3\ifglsxtrinsertinside
     {\glsxtrgenentrytextfmt{#4}}\fi}%
    \ifglsxtrinsertinside\else{\glsxtrgenentrytextfmt{#4}}\fi}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrlonghyphenshort}
%\changes{1.49}{2022-10-24}{new}
%As above but convert the insert to uppercase. The long and short
%should already have the case-change applied.
%    \begin{macrocode}
\newcommand*{\GLSxtrlonghyphenshort}[4]{%
 {%
   \glsxtrifhyphenstart{#4}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \glsfirstlonghyphenfont{#2\ifglsxtrinsertinside
     {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#4}}}\fi}%
   \ifglsxtrinsertinside\else
    {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#4}}}%
   \fi
   \glsxtrfullsep{#1}%
   \glsxtrparen{\glsfirstabbrvhyphenfont{#3\ifglsxtrinsertinside
     {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#4}}}\fi}%
    \ifglsxtrinsertinside\else
     {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#4}}}%
    \fi}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrshorthyphennolong}
%\changes{1.49}{2022-10-24}{new}
%\begin{definition}
%\cs{glsxtrshorthyphennolong}\marg{label}\marg{short}\marg{insert}
%\end{definition}
%The \meta{short} argument may be the plural form and may also be the first letter uppercase form.
%
%As \cs{glsxtrlonghyphenshort} but where only the short form should
%be shown.
%    \begin{macrocode}
\newcommand*{\glsxtrshorthyphennolong}[3]{%
%    \end{macrocode}
% Grouping is needed to localise the redefinitions.
%    \begin{macrocode}
 {%
%    \end{macrocode}
% If \meta{insert} starts with a hyphen, redefine \cs{glsxtrwordsep}
% to a hyphen.
%    \begin{macrocode}
   \glsxtrifhyphenstart{#3}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \glsfirstabbrvhyphenfont{#2\ifglsxtrinsertinside
     {\glsxtrgenentrytextfmt{#3}}\fi}%
   \ifglsxtrinsertinside\else{\glsxtrgenentrytextfmt{#3}}\fi
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrshorthyphennolong}
%\changes{1.49}{2022-10-24}{new}
%As above but all-caps.
%    \begin{macrocode}
\newcommand*{\GLSxtrshorthyphennolong}[3]{%
 {%
   \glsxtrifhyphenstart{#3}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \glsfirstabbrvhyphenfont{#2\ifglsxtrinsertinside
     {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#3}}}\fi}%
   \ifglsxtrinsertinside\else
     {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#3}}}%
   \fi
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsabbrvhyphenfont}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsabbrvhyphenfont}{\glsabbrvdefaultfont}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsfirstabbrvhyphenfont}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsfirstabbrvhyphenfont}{\glsabbrvhyphenfont}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslonghyphenfont}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glslonghyphenfont}{\glslongdefaultfont}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsfirstlonghyphenfont}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsfirstlonghyphenfont}{\glslonghyphenfont}%
%    \end{macrocode}
%\end{macro}
% The default short form suffix:
%\begin{macro}{\glsxtrhyphensuffix}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrhyphensuffix}{\glsxtrabbrvpluralsuffix}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrlonghyphenshortsort}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlonghyphenshortsort}{\expandonce\glsxtrorgshort}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-hyphen-short-hyphen}
%\changes{1.17}{2017-08-09}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%Designed for use with the \catattr{markwords} attribute.
%    \begin{macrocode}
\newabbreviationstyle{long-hyphen-short-hyphen}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\glsxtrlonghyphenshortsort},
    first={\protect\glsfirstlonghyphenfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\protect\glsfirstabbrvhyphenfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlonghyphenfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\protect\glsfirstabbrvhyphenfont{\the\glsshortpltok}}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}},%
    description={\protect\glslonghyphenfont{\the\glslongtok}}}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrhyphensuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonghyphenfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonghyphenfont{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlonghyphenshort{##1}%
     {%
       \glsifattribute{##1}{markwords}{true}%
       {%
         \glsaccesslong{##1}%
       }%
       {%
         \glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {%
       \glsifattribute{##1}{markshortwords}{true}%
       {%
         \glsaccessshort{##1}%
       }%
       {%
         \glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {##2}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlonghyphenshort{##1}%
     {%
       \glsifattribute{##1}{markwords}{true}%
       {%
         \glsaccesslongpl{##1}%
       }%
       {%
         \glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {%
       \glsifattribute{##1}{markshortwords}{true}%
       {%
         \glsaccessshortpl{##1}%
       }%
       {%
         \glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {##2}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsxtrlonghyphenshort{##1}%
     {%
       \glsifattribute{##1}{markwords}{true}%
       {%
         \Glsaccesslong{##1}%
       }%
       {%
         \Glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {%
       \glsifattribute{##1}{markshortwords}{true}%
       {%
         \glsaccessshort{##1}%
       }%
       {%
         \glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {##2}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsxtrlonghyphenshort{##1}%
     {%
       \glsifattribute{##1}{markwords}{true}%
       {%
         \Glsaccesslongpl{##1}%
       }%
       {%
         \Glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {%
       \glsifattribute{##1}{markshortwords}{true}%
       {%
         \glsaccessshortpl{##1}%
       }%
       {%
         \glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {##2}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlonghyphenshort{##1}%
     {%
       \glsifattribute{##1}{markwords}{true}%
       {%
         \GLSaccesslong{##1}%
       }%
       {%
         \GLSaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {%
       \glsifattribute{##1}{markshortwords}{true}%
       {%
         \GLSaccessshort{##1}%
       }%
       {%
         \GLSaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {##2}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlonghyphenshort{##1}%
     {%
       \glsifattribute{##1}{markwords}{true}%
       {%
         \GLSaccesslongpl{##1}%
       }%
       {%
         \GLSaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {%
       \glsifattribute{##1}{markshortwords}{true}%
       {%
         \GLSaccessshortpl{##1}%
       }%
       {%
         \GLSaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {##2}%
  }%
%    \end{macrocode}
%Subsequent form also needs checking for a hyphen in case the short
%form has spaces.
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrshorthyphennolong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \glsaccessshort{##1}%
      }%
      {%
        \glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrshorthyphennolong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \glsaccessshortpl{##1}%
      }%
      {%
        \glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glsxtrshorthyphennolong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \Glsaccessshort{##1}%
      }%
      {%
        \Glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glsxtrshorthyphennolong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \Glsaccessshortpl{##1}%
      }%
      {%
        \Glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \GLSxtrshorthyphennolong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \GLSaccessshort{##1}%
      }%
      {%
        \GLSaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrsubsequentplfmt}[2]{%
    \GLSxtrshorthyphennolong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \GLSaccessshortpl{##1}%
      }%
      {%
        \GLSaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-hyphen-short-hyphen-desc}
%\changes{1.17}{2017-08-09}{new}
%Like \abbrstyle{long-hyphen-short-hyphen} but the description
%must be supplied by the user.
%    \begin{macrocode}
\newabbreviationstyle{long-hyphen-short-hyphen-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},
    first={\protect\glsfirstlonghyphenfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\protect\glsfirstabbrvhyphenfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlonghyphenfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\protect\glsfirstabbrvhyphenfont{\the\glsshortpltok}}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-hyphen-short-hyphen}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrlonghyphennoshort}
%\changes{1.17}{2017-08-09}{new}
%\begin{definition}
%\cs{glsxtrlonghyphennoshort}\marg{label}\marg{long}\marg{insert}
%\end{definition}
%As with \cs{glsxtrlonghyphenshort} this doesn't fit in with the 
%new \cs{glsxtrshortformat} so the inserted part has to have a separate encapsulation for the
%inner format. The \meta{long} argument will need to include
%the inner format.
%    \begin{macrocode}
\newcommand*{\glsxtrlonghyphennoshort}[3]{%
%    \end{macrocode}
% Grouping is needed to localise the redefinitions.
%    \begin{macrocode}
 {%
%    \end{macrocode}
% If \meta{insert} starts with a hyphen, redefine \cs{glsxtrwordsep}
% to a hyphen. The inserted material is also inserted into the
% parenthetical part. (The inserted material is grouped as a
% precautionary measure.) No change is made to \cs{glsxtrwordsep} if
% \meta{insert} doesn't start with a hyphen.
%    \begin{macrocode}
   \glsxtrifhyphenstart{#3}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \glsfirstlonghyphenfont{#2\ifglsxtrinsertinside
     {\glsxtrgenentrytextfmt{#3}}\fi}%
   \ifglsxtrinsertinside\else{\glsxtrgenentrytextfmt{#3}}\fi
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrlonghyphennoshort}
%\changes{1.49}{2022-10-24}{new}
%As above but convert insert to all-caps.
%    \begin{macrocode}
\newcommand*{\GLSxtrlonghyphennoshort}[3]{%
 {%
   \glsxtrifhyphenstart{#3}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \glsfirstlonghyphenfont{#2\ifglsxtrinsertinside
     {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#3}}}\fi}%
   \ifglsxtrinsertinside\else
     {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#3}}}%
   \fi
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrlonghyphennoshortdescsort}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlonghyphennoshortdescsort}{\expandonce\glsxtrorglong}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-hyphen-noshort-desc-noreg}
%\changes{1.17}{2017-08-09}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%This version doesn't show the short form (except
%explicitly with \cs{glsxtrshort}). Since \cs{glsxtrshort} doesn't
%support the hyphen switch, the short form just uses the default
%short-form font command. This style won't work with the 
%\catattr{regular} as the regular form isn't flexible enough.
%No accessibility attributes need to be set.
%    \begin{macrocode}
\newabbreviationstyle{long-hyphen-noshort-desc-noreg}%
{%
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortdescname},
    sort={\glsxtrlonghyphennoshortdescsort},
    first={\protect\glsfirstlonghyphenfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonghyphenfont{\the\glslongpltok}},%
    text={\protect\glslonghyphenfont{\the\glslongtok}},%
    plural={\protect\glslonghyphenfont{\the\glslongpltok}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonghyphenfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonghyphenfont{##1}}%
%    \end{macrocode}
% The inline full form displays the long format followed by the
% short form in parentheses (as long-hyphen-short-hyphen).
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlonghyphenshort{##1}%
     {%
       \glsifattribute{##1}{markwords}{true}%
       {%
         \glsaccesslong{##1}%
       }%
       {%
         \glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {%
       \glsifattribute{##1}{markshortwords}{true}%
       {%
         \glsaccessshort{##1}%
       }%
       {%
         \glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {##2}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlonghyphenshort{##1}%
     {%
       \glsifattribute{##1}{markwords}{true}%
       {%
         \glsaccesslongpl{##1}%
       }%
       {%
         \glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {%
       \glsifattribute{##1}{markshortwords}{true}%
       {%
         \glsaccessshortpl{##1}%
       }%
       {%
         \glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {##2}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsxtrlonghyphenshort{##1}%
     {%
       \glsifattribute{##1}{markwords}{true}%
       {%
         \Glsaccesslong{##1}%
       }%
       {%
         \Glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {%
       \glsifattribute{##1}{markshortwords}{true}%
       {%
         \glsaccessshort{##1}%
       }%
       {%
         \glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {##2}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsxtrlonghyphenshort{##1}%
     {%
       \glsifattribute{##1}{markwords}{true}%
       {%
         \Glsaccesslongpl{##1}%
       }%
       {%
         \Glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {%
       \glsifattribute{##1}{markshortwords}{true}%
       {%
         \glsaccessshortpl{##1}%
       }%
       {%
         \glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {##2}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlonghyphenshort{##1}%
     {%
       \glsifattribute{##1}{markwords}{true}%
       {%
         \GLSaccesslong{##1}%
       }%
       {%
         \GLSaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {%
       \glsifattribute{##1}{markshortwords}{true}%
       {%
         \GLSaccessshort{##1}%
       }%
       {%
         \GLSaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {##2}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlonghyphenshort{##1}%
     {%
       \glsifattribute{##1}{markwords}{true}%
       {%
         \GLSaccesslongpl{##1}%
       }%
       {%
         \GLSaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {%
       \glsifattribute{##1}{markshortwords}{true}%
       {%
         \GLSaccessshortpl{##1}%
       }%
       {%
         \GLSaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
       }%
     }%
     {##2}%
  }%
%    \end{macrocode}
% The first use full form only displays the long form.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlonghyphennoshort{##1}%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \glsaccesslong{##1}%
      }%
      {%
        \glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlonghyphennoshort{##1}%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \glsaccesslongpl{##1}%
      }%
      {%
        \glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsxtrlonghyphennoshort{##1}%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \Glsaccesslong{##1}%
      }%
      {%
        \Glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsxtrlonghyphennoshort{##1}%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \Glsaccesslongpl{##1}%
      }%
      {%
        \Glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlonghyphennoshort{##1}%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \GLSaccesslong{##1}%
      }%
      {%
        \GLSaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlonghyphennoshort{##1}%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \GLSaccesslongpl{##1}%
      }%
      {%
        \GLSaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
%    \end{macrocode}
% The format for subsequent use (not used when the regular attribute
% is set).
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrlonghyphennoshort{##1}%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \glsaccesslong{##1}%
      }%
      {%
        \glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrlonghyphennoshort{##1}%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \glsaccesslongpl{##1}%
      }%
      {%
        \glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glsxtrlonghyphennoshort{##1}%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \Glsaccesslong{##1}%
      }%
      {%
        \Glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glsxtrlonghyphennoshort{##1}%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \Glsaccesslongpl{##1}%
      }%
      {%
        \Glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \GLSxtrlonghyphennoshort{##1}%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \GLSaccesslong{##1}%
      }%
      {%
        \GLSaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrsubsequentplfmt}[2]{%
    \GLSxtrlonghyphennoshort{##1}%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \GLSaccesslongpl{##1}%
      }%
      {%
        \GLSaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrlonghyphennoshortsort}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrlonghyphennoshortsort}{\expandonce\glsxtrorgshort}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-hyphen-noshort-noreg}
%\changes{1.17}{2017-08-09}{new}
% It doesn't really make a great deal of sense to have a long-only
% style that doesn't have a description (unless no glossary is
% required), but the best course of
% action here is to use the short form as the name and the long
% form as the description.
%    \begin{macrocode}
\newabbreviationstyle{long-hyphen-noshort-noreg}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetNameShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortname},
    sort={\glsxtrlonghyphennoshortsort},
    first={\protect\glsfirstlonghyphenfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonghyphenfont{\the\glslongpltok}},%
    text={\protect\glslonghyphenfont{\the\glslongtok}},%
    plural={\protect\glslonghyphenfont{\the\glslongpltok}},%
    description={\the\glslongtok}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
%\changes{1.40}{2019-03-31}{corrected formatting commands}
%    \begin{macrocode}
  \GlsXtrUseAbbrStyleFmts{long-hyphen-noshort-desc-noreg}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrlonghyphen}
%\changes{1.17}{2017-08-09}{new}
%\begin{definition}
%\cs{glsxtrlonghyphen}\marg{long}\marg{label}\marg{insert}
%\end{definition}
%Used by \abbrstyle{long-hyphen-postshort-hyphen}. The \meta{insert}
%is check to determine if it starts with a hyphen but isn't used
%here as it's moved to the post-link hook.
%
%The \meta{long} argument will need to include
%the inner format.
%    \begin{macrocode}
\newcommand*{\glsxtrlonghyphen}[3]{%
%    \end{macrocode}
% Grouping is needed to localise the redefinitions.
%    \begin{macrocode}
 {%
   \glsxtrifhyphenstart{#3}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \glsfirstlonghyphenfont{#1}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrposthyphenshort}
%\changes{1.17}{2017-08-09}{new}
%\begin{definition}
%\cs{glsxtrposthyphenshort}\marg{label}\marg{insert}
%\end{definition}
%Used in the post-link hook for the
%\abbrstyle{long-hyphen-postshort-hyphen} style. Much like
%\cs{glsxtrlonghyphenshort} but omits the \meta{long} part. This
%always uses the singular short form.
%    \begin{macrocode}
\newcommand*{\glsxtrposthyphenshort}[2]{%
 {%
   \glsxtrifhyphenstart{#2}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \ifglsxtrinsertinside
     {\glsfirstlonghyphenfont{\glsxtrgenentrytextfmt{#2}}}%
   \else
     {\glsxtrgenentrytextfmt{#2}}%
   \fi
   \glsxtrfullsep{#1}%
   \glsxtrparen
   {%
     \glsxtrshortformat{#1}{#2}{\glsfirstabbrvhyphenfont}%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrposthyphenshort}
%\changes{1.49}{2022-10-24}{new}
%As above but all caps.
%    \begin{macrocode}
\newcommand*{\GLSxtrposthyphenshort}[2]{%
 {%
   \glsxtrifhyphenstart{#2}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \ifglsxtrinsertinside
     {\glsfirstlonghyphenfont{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}}%
   \else
     {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
   \fi
   \glsxtrfullsep{#1}%
   \glsxtrparen
   {%
     \GLSxtrshortformat{#1}{#2}{\glsfirstabbrvhyphenfont}%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrposthyphenshortpl}
%\changes{1.49}{2022-10-24}{new}
%As above but plural.
%    \begin{macrocode}
\newcommand*{\glsxtrposthyphenshortpl}[2]{%
 {%
   \glsxtrifhyphenstart{#2}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \ifglsxtrinsertinside
     {\glsfirstlonghyphenfont{\glsxtrgenentrytextfmt{#2}}}%
   \else
     {\glsxtrgenentrytextfmt{#2}}%
   \fi
   \glsxtrfullsep{#1}%
   \glsxtrparen
   {%
     \glsxtrshortplformat{#1}{#2}{\glsfirstabbrvhyphenfont}%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrposthyphenshortpl}
%\changes{1.49}{2022-10-24}{new}
%As above but all caps.
%    \begin{macrocode}
\newcommand*{\GLSxtrposthyphenshortpl}[2]{%
 {%
   \glsxtrifhyphenstart{#2}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \ifglsxtrinsertinside
     {\glsfirstlonghyphenfont{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}}%
   \else
     {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
   \fi
   \glsxtrfullsep{#1}%
   \glsxtrparen
   {%
     \GLSxtrshortplformat{#1}{#2}{\glsfirstabbrvhyphenfont}%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\xpglsxtrposthyphenshort}
%\changes{1.49}{2022-10-24}{new}
%Expand placeholders and check for all caps.
%    \begin{macrocode}
\newcommand*{\xpglsxtrposthyphenshort}{%
  \glsxtrifallcaps
  {%
    \expandafter\GLSxtrposthyphenshort\expandafter\glslabel
     \expandafter{\glsinsert}%
  }%
  {%
    \expandafter\glsxtrposthyphenshort\expandafter\glslabel
     \expandafter{\glsinsert}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrposthyphensubsequent}
%\changes{1.17}{2017-08-09}{new}
%\begin{definition}
%\cs{glsxtrposthyphensubsequent}\marg{label}\marg{insert}
%\end{definition}
%Format in the post-link hook for subsequent use. The label is
%ignored by default. This just does the insert part with appropriate formatting.
%    \begin{macrocode}
\newcommand*{\glsxtrposthyphensubsequent}[2]{%
  \ifglsxtrinsertinside
    \glsabbrvfont{{\glsxtrgenentrytextfmt{#2}}}%
  \else
    {\glsxtrgenentrytextfmt{#2}}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrposthyphensubsequent}
%\changes{1.49}{2022-10-24}{new}
%As above but all caps.
%    \begin{macrocode}
\newcommand*{\GLSxtrposthyphensubsequent}[2]{%
  \ifglsxtrinsertinside
    \glsabbrvfont{{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}}%
  \else
    {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\xpglsxtrposthyphensubsequent}
%\changes{1.49}{2022-10-24}{new}
%Expand placeholders and check for all caps.
%    \begin{macrocode}
\newcommand*{\xpglsxtrposthyphensubsequent}{%
  \glsxtrifallcaps
  {%
    \expandafter\GLSxtrposthyphensubsequent\expandafter\glslabel
         \expandafter{\glsinsert}%
  }%
  {%
    \expandafter\glsxtrposthyphensubsequent\expandafter\glslabel
         \expandafter{\glsinsert}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrshorthyphennoinsert}
%\changes{1.17}{2017-08-09}{new}
%\begin{definition}
%\cs{glsxtrshorthyphennoinsert}\marg{label}\marg{short}\marg{insert}
%\end{definition}
%As with \cs{glsxtrshorthyphennolong} but doesn't actually show the
%insert.
%    \begin{macrocode}
\newcommand*{\glsxtrshorthyphennoinsert}[3]{%
%    \end{macrocode}
% Grouping is needed to localise the redefinitions.
%    \begin{macrocode}
 {%
%    \end{macrocode}
% If \meta{insert} starts with a hyphen, redefine \cs{glsxtrwordsep}
% to a hyphen.
%    \begin{macrocode}
   \glsxtrifhyphenstart{#3}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \glsfirstabbrvhyphenfont{#2}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-hyphen-postshort-hyphen}
%\changes{1.17}{2017-08-09}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%Like \abbrstyle{long-hyphen-short-hyphen} but shifts the insert
%and parenthetical material to the post-link hook.
%    \begin{macrocode}
\newabbreviationstyle{long-hyphen-postshort-hyphen}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\glsxtrlonghyphenshortsort},
    first={\protect\glsfirstlonghyphenfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonghyphenfont{\the\glslongpltok}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}},%
    description={\protect\glslonghyphenfont{\the\glslongtok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \xpglsxtrposthyphenshort
      }%
      {%
%    \end{macrocode}
% Put the insertion into the post-link:
%    \begin{macrocode}
        \xpglsxtrposthyphensubsequent
      }%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonghyphenfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonghyphenfont{##1}}%
%    \end{macrocode}
% Subsequent use needs to omit the insertion but it needs to perform
% the space-hyphen substitution:
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrshorthyphennoinsert{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \glsaccessshort{##1}%
      }%
      {%
        \glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrshorthyphennoinsert{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \glsaccessshortpl{##1}%
      }%
      {%
        \glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glsxtrshorthyphennoinsert{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \Glsaccessshort{##1}%
      }%
      {%
        \Glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glsxtrshorthyphennoinsert{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \Glsaccessshortpl{##1}%
      }%
      {%
        \Glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \glsxtrshorthyphennoinsert{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \GLSaccessshort{##1}%
      }%
      {%
        \GLSaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrsubsequentplfmt}[2]{%
    \glsxtrshorthyphennoinsert{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \GLSaccessshortpl{##1}%
      }%
      {%
        \GLSaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
%    \end{macrocode}
% First use full form:
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlonghyphen
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \glsaccesslong{##1}%
      }%
      {%
        \glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##1}{##2}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlonghyphen
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \glsaccesslongpl{##1}%
      }%
      {%
        \glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##1}{##2}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsxtrlonghyphen
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \Glsaccesslong{##1}%
      }%
      {%
        \Glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##1}{##2}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsxtrlonghyphen
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \Glsaccesslongpl{##1}%
      }%
      {%
        \Glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##1}{##2}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \glsxtrlonghyphen
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \GLSaccesslong{##1}%
      }%
      {%
        \GLSaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##1}{##2}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \glsxtrlonghyphen
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \GLSaccesslongpl{##1}%
      }%
      {%
        \GLSaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##1}{##2}%
  }%
%    \end{macrocode}
% In-line format.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongformatgrp{##1}{##2}{\glsfirstlonghyphenfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongplformatgrp{##1}{##2}{\glsfirstlonghyphenfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongformatgrp{##1}{##2}{\glsfirstlonghyphenfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongplformatgrp{##1}{##2}{\glsfirstlonghyphenfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongformatgrp{##1}{##2}{\glsfirstlonghyphenfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongplformatgrp{##1}{##2}{\glsfirstlonghyphenfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{long-hyphen-postshort-hyphen-desc}
%\changes{1.17}{2017-08-09}{new}
%Like \abbrstyle{long-hyphen-postshort-hyphen} but the description
%must be supplied by the user.
%    \begin{macrocode}
\newabbreviationstyle{long-hyphen-postshort-hyphen-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},%
    first={\protect\glsfirstlonghyphenfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonghyphenfont{\the\glslongpltok}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \xpglsxtrposthyphenshort
      }%
      {%
%    \end{macrocode}
% Put the insertion into the post-link:
%    \begin{macrocode}
        \xpglsxtrposthyphensubsequent
      }%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-hyphen-postshort-hyphen}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrshorthyphenlong}
%\changes{1.17}{2017-08-09}{new}
%\begin{definition}
%\cs{glsxtrshorthyphenlong}\marg{label}\marg{short}\marg{long}\marg{insert}
%\end{definition}
%The \meta{long} and \meta{short} arguments may be the plural form.
%The \meta{long} argument may also be the first letter uppercase form.
%
%As with \cs{glsxtrlonghyphenshort} this doesn't fit in with the 
%new \cs{glsxtrshortformat} so the inserted part has to have a separate encapsulation for the
%inner format. The \meta{long} argument will need to include
%the inner format.
%    \begin{macrocode}
\newcommand*{\glsxtrshorthyphenlong}[4]{%
%    \end{macrocode}
% Grouping is needed to localise the redefinitions.
%    \begin{macrocode}
 {%
%    \end{macrocode}
% If \meta{insert} starts with a hyphen, redefine \cs{glsxtrwordsep}
% to a hyphen. The inserted material is also inserted into the
% parenthetical part. (The inserted material is grouped as a
% precautionary measure.)
%    \begin{macrocode}
   \glsxtrifhyphenstart{#4}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \glsfirstabbrvhyphenfont{#2\ifglsxtrinsertinside
     {\glsxtrgenentrytextfmt{#4}}\fi}%
   \ifglsxtrinsertinside\else{\glsxtrgenentrytextfmt{#4}}\fi
   \glsxtrfullsep{#1}%
   \glsxtrparen{\glsfirstlonghyphenfont{#3%
     \ifglsxtrinsertinside{\glsxtrgenentrytextfmt{#4}}\fi}%
    \ifglsxtrinsertinside\else{\glsxtrgenentrytextfmt{#4}}\fi}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrshorthyphenlong}
%\changes{1.49}{2022-10-24}{new}
%As above but convert insert to all-caps. The long and short form
%arguments should be provided as all-caps.
%    \begin{macrocode}
\newcommand*{\GLSxtrshorthyphenlong}[4]{%
 {%
   \glsxtrifhyphenstart{#4}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \glsfirstabbrvhyphenfont{#2\ifglsxtrinsertinside
     {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#4}}}\fi}%
   \ifglsxtrinsertinside\else
     {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#4}}}%
   \fi
   \glsxtrfullsep{#1}%
   \glsxtrparen{\glsfirstlonghyphenfont{#3%
     \ifglsxtrinsertinside{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#4}}}\fi}%
    \ifglsxtrinsertinside\else
     {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#4}}}%
    \fi}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrshorthyphenlongsort}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrshorthyphenlongsort}{\expandonce\glsxtrorgshort}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{short-hyphen-long-hyphen}
%\changes{1.17}{2017-08-09}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%Designed for use with the \catattr{markwords} attribute.
%    \begin{macrocode}
\newabbreviationstyle{short-hyphen-long-hyphen}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\glsxtrshorthyphenlongsort},
    first={\protect\glsfirstabbrvhyphenfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\protect\glsfirstlonghyphenfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvhyphenfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\protect\glsfirstlonghyphenfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}},%
    description={\protect\glslonghyphenfont{\the\glslongtok}}}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrhyphensuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonghyphenfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonghyphenfont{##1}}%
%    \end{macrocode}
% The first use full form and the inline full form are the same for
% this style.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshorthyphenlong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \glsaccessshort{##1}%
      }%
      {%
        \glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \glsaccesslong{##1}%
      }%
      {%
        \glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshorthyphenlong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \glsaccessshortpl{##1}%
      }%
      {%
        \glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {%
      \glsifattribute{##1}{marklongwords}{true}%
      {%
        \glsaccesslongpl{##1}%
      }%
      {%
        \glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsxtrshorthyphenlong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \Glsaccessshort{##1}%
      }%
      {%
        \Glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \glsaccesslong{##1}%
      }%
      {%
        \glsaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsxtrshorthyphenlong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \Glsaccessshortpl{##1}%
      }%
      {%
        \Glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \glsaccesslongpl{##1}%
      }%
      {%
        \glsaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrshorthyphenlong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \GLSaccessshort{##1}%
      }%
      {%
        \GLSaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \GLSaccesslong{##1}%
      }%
      {%
        \GLSaccessfmtlong{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrshorthyphenlong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \GLSaccessshortpl{##1}%
      }%
      {%
        \GLSaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {%
      \glsifattribute{##1}{markwords}{true}%
      {%
        \GLSaccesslongpl{##1}%
      }%
      {%
        \GLSaccessfmtlongpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
%    \end{macrocode}
%Subsequent form also needs checking for a hyphen in case the short
%form has spaces.
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrshorthyphennolong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \glsaccessshort{##1}%
      }%
      {%
        \glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrshorthyphennolong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \glsaccessshortpl{##1}%
      }%
      {%
        \glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glsxtrshorthyphennolong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \Glsaccessshort{##1}%
      }%
      {%
        \Glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glsxtrshorthyphennolong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \Glsaccessshortpl{##1}%
      }%
      {%
        \Glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \GLSxtrshorthyphennolong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \GLSaccessshort{##1}%
      }%
      {%
        \GLSaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrsubsequentplfmt}[2]{%
    \GLSxtrshorthyphennolong{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \GLSaccessshortpl{##1}%
      }%
      {%
        \GLSaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-hyphen-long-hyphen-desc}
%\changes{1.17}{2017-08-09}{new}
%Like \abbrstyle{short-hyphen-long-hyphen} but the description
%must be supplied by the user.
%    \begin{macrocode}
\newabbreviationstyle{short-hyphen-long-hyphen-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},
    sort={\glsxtrshortlongdescsort},
    first={\protect\glsfirstabbrvhyphenfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\protect\glsfirstlonghyphenfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvhyphenfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \protect\glsxtrparen{\protect\glsfirstlonghyphenfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsxtrsetcomplexstyle{\the\glslabeltok}{3}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-hyphen-long-hyphen}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrshorthyphen}
%\changes{1.17}{2017-08-09}{new}
%\begin{definition}
%\cs{glsxtrshorthyphen}\marg{short}\marg{label}\marg{insert}
%\end{definition}
%Used by \abbrstyle{short-hyphen-postlong-hyphen}. The \meta{insert}
%is checked to determine if it starts with a hyphen but isn't used
%here as it's moved to the post-link hook.
%    \begin{macrocode}
\newcommand*{\glsxtrshorthyphen}[3]{%
%    \end{macrocode}
% Grouping is needed to localise the redefinitions.
%    \begin{macrocode}
 {%
   \glsxtrifhyphenstart{#3}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \glsfirstabbrvhyphenfont{#1}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrposthyphenlong}
%\changes{1.17}{2017-08-09}{new}
%\begin{definition}
%\cs{glsxtrposthyphenlong}\marg{label}\marg{insert}
%\end{definition}
%Used in the post-link hook for the
%\abbrstyle{short-hyphen-postlong-hyphen} style. Much like
%\cs{glsxtrshorthyphenlong} but omits the \meta{short} part. This
%always uses the singular long form.
%    \begin{macrocode}
\newcommand*{\glsxtrposthyphenlong}[2]{%
 {%
   \glsxtrifhyphenstart{#2}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \ifglsxtrinsertinside
    {\glsfirstabbrvhyphenfont{\glsxtrgenentrytextfmt{#2}}}%
   \else
    {\glsxtrgenentrytextfmt{#2}}%
   \fi
   \glsxtrfullsep{#1}%
   \glsxtrparen
     {\glsxtrlongformatgrp{#1}{#2}{\glsfirstlonghyphenfont}}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrposthyphenlong}
%\changes{1.49}{2022-10-24}{new}
%As above but all-caps.
%    \begin{macrocode}
\newcommand*{\GLSxtrposthyphenlong}[2]{%
 {%
   \glsxtrifhyphenstart{#2}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \ifglsxtrinsertinside
    {\glsfirstabbrvhyphenfont{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}}%
   \else
    {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
   \fi
   \glsxtrfullsep{#1}%
   \glsxtrparen
     {\GLSxtrlongformatgrp{#1}{#2}{\glsfirstlonghyphenfont}}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%Plural versions in case they are required.
%\begin{macro}{\glsxtrposthyphenlongpl}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrposthyphenlongpl}[2]{%
 {%
   \glsxtrifhyphenstart{#2}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \ifglsxtrinsertinside
    {\glsfirstabbrvhyphenfont{\glsxtrgenentrytextfmt{#2}}}%
   \else
    {\glsxtrgenentrytextfmt{#2}}%
   \fi
   \glsxtrfullsep{#1}%
   \glsxtrparen
     {\glsxtrlongplformatgrp{#1}{#2}{\glsfirstlonghyphenfont}}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrposthyphenlongpl}
%\changes{1.49}{2022-10-24}{new}
%As above but all-caps.
%    \begin{macrocode}
\newcommand*{\GLSxtrposthyphenlongpl}[2]{%
 {%
   \glsxtrifhyphenstart{#2}{\let\glsxtrwordsep\glsxtrwordsephyphen}{}%
   \ifglsxtrinsertinside
    {\glsfirstabbrvhyphenfont{\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}}%
   \else
    {\mfirstucMakeUppercase{\glsxtrgenentrytextfmt{#2}}}%
   \fi
   \glsxtrfullsep{#1}%
   \glsxtrparen
     {\GLSxtrlongplformatgrp{#1}{#2}{\glsfirstlonghyphenfont}}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\xpglsxtrposthyphenlong}
%\changes{1.49}{2022-10-24}{new}
%Expand placeholders and check for all caps.
%    \begin{macrocode}
\newcommand*{\xpglsxtrposthyphenlong}{%
  \glsxtrifallcaps
  {%
    \expandafter\GLSxtrposthyphenlong\expandafter\glslabel
         \expandafter{\glsinsert}%
  }%
  {%
    \expandafter\glsxtrposthyphenlong\expandafter\glslabel
         \expandafter{\glsinsert}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{short-hyphen-postlong-hyphen}
%\changes{1.17}{2017-08-09}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%Like \abbrstyle{short-hyphen-long-hyphen} but shifts the insert
%and parenthetical material to the post-link hook.
%    \begin{macrocode}
\newabbreviationstyle{short-hyphen-postlong-hyphen}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\glsxtrshorthyphenlongsort},
    first={\protect\glsfirstabbrvhyphenfont{\the\glsshorttok}},%
    firstplural={\protect\glsfirstabbrvhyphenfont{\the\glsshortpltok}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}},%
    description={\protect\glslonghyphenfont{\the\glslongtok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \xpglsxtrposthyphenlong
      }%
      {%
%    \end{macrocode}
% Put the insertion into the post-link:
%    \begin{macrocode}
        \xpglsxtrposthyphensubsequent
      }%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
% In case the user wants to mix and match font styles, these are
% redefined here.
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonghyphenfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonghyphenfont{##1}}%
%    \end{macrocode}
% Subsequent use needs to omit the insertion but it needs to perform
% the space-hyphen substitution:
%    \begin{macrocode}
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrshorthyphennoinsert{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \glsaccessshort{##1}%
      }%
      {%
        \glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrshorthyphennoinsert{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \glsaccessshortpl{##1}%
      }%
      {%
        \glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glsxtrshorthyphennoinsert{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \Glsaccessshort{##1}%
      }%
      {%
        \Glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glsxtrshorthyphennoinsert{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \Glsaccessshortpl{##1}%
      }%
      {%
        \Glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrsubsequentfmt}[2]{%
    \glsxtrshorthyphennoinsert{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \GLSaccessshort{##1}%
      }%
      {%
        \GLSaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
  \renewcommand*{\GLSxtrsubsequentplfmt}[2]{%
    \glsxtrshorthyphennoinsert{##1}%
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \GLSaccessshortpl{##1}%
      }%
      {%
        \GLSaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##2}%
  }%
%    \end{macrocode}
% First use full form:
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshorthyphen
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \glsaccessshort{##1}%
      }%
      {%
        \glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##1}{##2}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshorthyphen
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \glsaccessshortpl{##1}%
      }%
      {%
        \glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##1}{##2}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsxtrshorthyphen
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \Glsaccessshort{##1}%
      }%
      {%
        \Glsaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##1}{##2}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsxtrshorthyphen
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \Glsaccessshortpl{##1}%
      }%
      {%
        \Glsaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }{##1}{##2}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \glsxtrshorthyphen
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \GLSaccessshort{##1}%
      }%
      {%
        \GLSaccessfmtshort{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }%
    {##1}{##2}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \glsxtrshorthyphen
    {%
      \glsifattribute{##1}{markshortwords}{true}%
      {%
        \GLSaccessshortpl{##1}%
      }%
      {%
        \GLSaccessfmtshortpl{}{\glsxtrgenentrytextfmt}{##1}%
      }%
    }{##1}{##2}%
  }%
%    \end{macrocode}
% In-line format. Commands like \cs{glsxtrfull} set \cs{glsinsert}
% to empty. The entire link-text (provided by the following
% commands) is stored in \cs{glscustomtext}. Note that unless the
% insert is saved, it won't appear in the post-link hook.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrshortformatgrp{##1}{##2}{\glsfirstabbrvhyphenfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrshortplformatgrp{##1}{##2}{\glsfirstabbrvhyphenfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrshortformatgrp{##1}{##2}{\glsfirstabbrvhyphenfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrshortplformatgrp{##1}{##2}{\glsfirstabbrvhyphenfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrshortformatgrp{##1}{##2}{\glsfirstabbrvhyphenfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrshortplformatgrp{##1}{##2}{\glsfirstabbrvhyphenfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{abbrvstyle}{short-hyphen-postlong-hyphen-desc}
%\changes{1.17}{2017-08-09}{new}
%Like \abbrstyle{short-hyphen-postlong-hyphen} but the description
%must be supplied by the user.
%    \begin{macrocode}
\newabbreviationstyle{short-hyphen-postlong-hyphen-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},
    sort={\glsxtrshortlongdescsort},%
    first={\protect\glsfirstabbrvhyphenfont{\the\glsshorttok}},%
    firstplural={\protect\glsfirstabbrvhyphenfont{\the\glsshortpltok}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \xpglsxtrposthyphenlong
      }%
      {%
%    \end{macrocode}
% Put the insertion into the post-link:
%    \begin{macrocode}
        \xpglsxtrposthyphensubsequent
      }%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-hyphen-postlong-hyphen}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\subsection{Predefined Styles (No Short on First Use)}
%These styles show only the long form on first use and only the
%short form on subsequent use.
%\begin{macro}{\glsabbrvonlyfont}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsabbrvonlyfont}{\glsabbrvdefaultfont}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsfirstabbrvonlyfont}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsfirstabbrvonlyfont}{\glsabbrvonlyfont}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslongonlyfont}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glslongonlyfont}{\glslongdefaultfont}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsfirstlongonlyfont}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsfirstlongonlyfont}{\glslongonlyfont}%
%    \end{macrocode}
%\end{macro}
% The default short form suffix:
%\begin{macro}{\glsxtronlysuffix}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsxtronlysuffix}{\glsxtrabbrvpluralsuffix}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtronlyname}
%\changes{1.25}{2017-11-24}{new}
% The default name format for this style.
%    \begin{macrocode}
\newcommand*{\glsxtronlyname}{%
  \protect\glsabbrvonlyfont{\the\glsshorttok}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-only-short-only}
%\changes{1.17}{2017-08-09}{new}
%\changes{1.42}{2020-02-03}{added missing text key}
%    \begin{macrocode}
\newabbreviationstyle{long-only-short-only}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtronlyname},
    sort={\the\glsshorttok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}},%
    description={\protect\glslongonlyfont{\the\glslongtok}}}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{removed \cs{protect} from \cs{glsxtronlysuffix}}
%    \begin{macrocode}
  \renewcommand*{\abbrvpluralsuffix}{\glsxtronlysuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvonlyfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvonlyfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongonlyfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongonlyfont{##1}}%
%    \end{macrocode}
% The first use full form doesn't show the short form.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongformat{##1}{##2}{\glsfirstlongonlyfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glsfirstlongonlyfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glsfirstlongonlyfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glsfirstlongonlyfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glsfirstlongonlyfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glsfirstlongonlyfont}%
  }%
%    \end{macrocode}
% The inline full form does show the short form.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongonlyfont}{\glsfirstabbrvonlyfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongonlyfont}{\glsfirstabbrvonlyfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongonlyfont}{\glsfirstabbrvonlyfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongonlyfont}{\glsfirstabbrvonlyfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongonlyfont}{\glsfirstabbrvonlyfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongonlyfont}{\glsfirstabbrvonlyfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtronlydescsort}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsxtronlydescsort}{\the\glslongtok}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtronlydescname}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newcommand*{\glsxtronlydescname}{%
  \protect\glslongfont{\the\glslongtok}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-only-short-only-desc}
%\changes{1.17}{2017-08-09}{new}
%    \begin{macrocode}
\newabbreviationstyle{long-only-short-only-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtronlydescname},
    sort={\glsxtronlydescsort},%
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-only-short-only}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%Small-caps is awkward, so support for that is added.
%\begin{macro}{\glsabbrvsconlyfont}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsabbrvsconlyfont}{\glsabbrvscfont}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsfirstabbrvsconlyfont}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsfirstabbrvsconlyfont}{\glsabbrvsconlyfont}%
%    \end{macrocode}
%\end{macro}
% The default short form suffix:
%\begin{macro}{\glsxtrsconlysuffix}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrsconlysuffix}{\glsxtrscsuffix}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsconlyrevert}
%\changes{1.49}{2022-10-24}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrsconlyrevert}{\glsxtrscrevert}
%    \end{macrocode}
%\end{macro}
%
%
%\begin{macro}{\glsxtrsconlyname}
%\changes{1.48}{2021-11-22}{new}
% The default name format for this style.
%    \begin{macrocode}
\newcommand*{\glsxtrsconlyname}{%
  \protect\glsabbrvsconlyfont{\the\glsshorttok}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-only-short-sc-only}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newabbreviationstyle{long-only-short-sc-only}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrsconlyname},
    sort={\the\glsshorttok},
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}},%
    text={\protect\glsabbrvsconlyfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvsconlyfont{\the\glsshortpltok}},%
    description={\protect\glslongonlyfont{\the\glslongtok}}}%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glsexclapplyinnerfmtfield{\the\glslabeltok}{desc}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsconlysuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvsconlyfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvsconlyfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongonlyfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongonlyfont{##1}}%
  \renewcommand*\glsxtrrevert[1]{\glsxtrsconlyrevert{##1}}%
%    \end{macrocode}
% The first use full form doesn't show the short form.
%    \begin{macrocode}
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlongformat{##1}{##2}{\glsfirstlongonlyfont}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlongplformat{##1}{##2}{\glsfirstlongonlyfont}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \Glsxtrlongformat{##1}{##2}{\glsfirstlongonlyfont}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \Glsxtrlongplformat{##1}{##2}{\glsfirstlongonlyfont}%
  }%
  \renewcommand*{\GLSxtrfullformat}[2]{%
    \GLSxtrlongformat{##1}{##2}{\glsfirstlongonlyfont}%
  }%
  \renewcommand*{\GLSxtrfullplformat}[2]{%
    \GLSxtrlongplformat{##1}{##2}{\glsfirstlongonlyfont}%
  }%
%    \end{macrocode}
% The inline full form does show the short form.
%    \begin{macrocode}
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongonlyfont}{\glsfirstabbrvsconlyfont}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongonlyfont}{\glsfirstabbrvsconlyfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \Glsxtrlongshortformat{##1}{##2}%
      {\glsfirstlongonlyfont}{\glsfirstabbrvsconlyfont}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \Glsxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongonlyfont}{\glsfirstabbrvsconlyfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullformat}[2]{%
    \GLSxtrlongshortformat{##1}{##2}%
      {\glsfirstlongonlyfont}{\glsfirstabbrvsconlyfont}%
  }%
  \renewcommand*{\GLSxtrinlinefullplformat}[2]{%
    \GLSxtrlongshortplformat{##1}{##2}%
      {\glsfirstlongonlyfont}{\glsfirstabbrvsconlyfont}%
  }%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\begin{macro}{\glsxtrsconlydescsort}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrsconlydescsort}{\glsxtronlydescsort}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrsconlydescname}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrsconlydescname}{\glsxtronlydescname}
%    \end{macrocode}
%\end{macro}
%
%\begin{abbrvstyle}{long-only-short-sc-only-desc}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newabbreviationstyle{long-only-short-sc-only-desc}%
{%
%    \end{macrocode}
% Set accessibility attributes if enabled.
%    \begin{macrocode}
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
%    \end{macrocode}
% Setup the default fields.
%    \begin{macrocode}
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrsconlydescname},
    sort={\glsxtrsconlydescsort},%
    first={\glsfirstxplongfont{\the\glslongtok}{\glscategorylabel}},%
    firstplural={\glsfirstxplongfont{\the\glslongpltok}{\glscategorylabel}},%
    text={\glsxpabbrvfont{\the\glsshorttok}{\glscategorylabel}},%
    plural={\glsxpabbrvfont{\the\glsshortpltok}{\glscategorylabel}}%
  }%
%    \end{macrocode}
% Unset the \catattr{regular} attribute if it has been set.
%    \begin{macrocode}
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-only-short-sc-only}%
}
%    \end{macrocode}
%\end{abbrvstyle}
%
%\iffalse
%    \begin{macrocode}
%</glossaries-extra-abbrstyles.def>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossaries-extra-bib2gls.sty>
%    \end{macrocode}
%\fi
%\section{Commands Specific to bib2gls (glossaries-extra-bib2gls.sty)}
%\changes{1.27}{2018-02-26}{added glossaries-extra-bib2gls.sty}
%This package provides additional support for \app{bib2gls} and is
%automatically loaded by the record option.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
%    \end{macrocode}
% Rollback releases:
%    \begin{macrocode}
\DeclareRelease{v1.48}{2021-11-22}{glossaries-extra-bib2gls-2021-11-22.sty}
\DeclareCurrentRelease{1.9}{2025-11-03}
%    \end{macrocode}
% Declare package:
%    \begin{macrocode}
\ProvidesPackage{glossaries-extra-bib2gls}[2026/03/06 v2.0 (NLCT)]
%    \end{macrocode}
%Provide convenient shortcut commands for predefined glossary types.
%\begin{macro}{\printunsrtacronyms}
%\changes{1.40}{2019-03-31}{new}
%    \begin{macrocode}
\ifglsacronym
  \providecommand*{\printunsrtacronyms}[1][]{%
   \printunsrtglossary[type=\acronymtype,#1]}%
\fi
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtindex}
%\changes{1.40}{2019-03-31}{new}
%    \begin{macrocode}
\ifglossaryexists{index}
{
  \providecommand*{\printunsrtindex}[1][]{%
   \printunsrtglossary[type=index,#1]}%
}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtsymbols}
%\changes{1.40}{2019-03-31}{new}
%    \begin{macrocode}
\ifglossaryexists{symbols}
{
  \providecommand*{\printunsrtsymbols}[1][]{%
   \printunsrtglossary[type=symbols,#1]}%
}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtnumbers}
%\changes{1.40}{2019-03-31}{new}
%    \begin{macrocode}
\ifglossaryexists{numbers}
{
  \providecommand*{\printunsrtnumbers}[1][]{%
   \printunsrtglossary[type=numbers,#1]}%
}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrtabbreviations}
%\changes{1.40}{2019-03-31}{new}
%    \begin{macrocode}
\ifglossaryexists{abbreviations}
{
  \providecommand*{\printunsrtabbreviations}[1][]{%
   \printunsrtglossary[type=abbreviations,#1]}%
}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsdisplaynumberlist}
%\changes{1.42}{2020-02-03}{added}
%Allow \cs{glsdisplaynumberlist} and make it robust.
%    \begin{macrocode}
\renewcommand*{\glsdisplaynumberlist}[1]{%
  \glsdoifexists{#1}%
  {%
    {\let\bibglsdelimN\glsnumlistsep
     \let\bibglslastDelimN\glsnumlistlastsep
     \glsxtrusefield{#1}{location}%
    }%
  }%
}
\robustify\glsdisplaynumberlist
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsentrynumberlist}
%\changes{1.42}{2020-02-03}{added}
%    \begin{macrocode}
\renewcommand*{\glsentrynumberlist}[1]{\glsxtrusefield{#1}{location}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\IfTeXParserLib}
%\changes{1.49}{2022-10-14}{new}
%This is defined by the \TeX\ parser library to behave like
%\cs{@firstoftwo}. May be used to provide different code in fields
%that may be interpreted.
%    \begin{macrocode}
\providecommand{\IfTeXParserLib}[2]{#2}
%    \end{macrocode}
%\end{macro}
%
%The next command is similar but is specifically for \app{bib2gls}
%and won't in general be recognised by the \TeX\ parser library if
%used by other applications (such as the converter tools provided
%with \app{bib2gls}).
%\begin{macro}{\IfNotBibGls}
%\changes{1.54}{2025-01-03}{new}
%This is defined by the \app{bib2gls} interpreter to behave like
%\cs{@secondoftwo}. 
%    \begin{macrocode}
\providecommand{\IfNotBibGls}[2]{#1}
%    \end{macrocode}
%\end{macro}
%
%These are some convenient macros for use with custom rules.
%\begin{macro}{\glshex}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glshex}{\string\u}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glscapturedgroup}
%\changes{1.31}{2018-05-09}{new}
%    \begin{macrocode}
\newcommand*{\glscapturedgroup}{\string\$}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glshashchar}
%\changes{1.49}{2022-10-14}{new}
% Expands to a literal hash character (similar to \cs{glsbackslash})
%    \begin{macrocode}
\ifdef\glshashchar
{}
{\edef\glshashchar{\expandafter\@gobble\string\#}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrResourceInitEscSequences}
%\changes{1.51}{2023-04-24}{new}
% Protect commands that shouldn't expand in resource options as they
% have a special meaning in the context of those options.
% This command may be added to the definition of
% \cs{glsxtrresourceinit}.
%    \begin{macrocode}
\newcommand*{\GlsXtrResourceInitEscSequences}{%
 \def\u{\string\u}%
 \def\.{\string\.}%
 \def\\{\string\\}%
 \def\/{\string\/}%
 \def\|{\string\|}%
 \def\&{\string\&}%
 \def\+{\string\+}%
 \def\<{\string\<}%
 \def\>{\string\>}%
 \def\*{\string\*}%
 \def\${\string\$}%
 \def\^{\string\^}%
 \def\~{\string\~}%
 \def\({\string\(}%
 \def\){\string\)}%
 \def\[{\string\[}%
 \def\]{\string\]}%
 \def\"{\string\"}%
 \def\-{\string\-}%
 \def\?{\string\?}%
 \def\#{\string\#}%
 \def\:{\string\:}%
 \def\cs##1{\glsbackslash##1}%
 \def\CS{\string\CS}%
 \def\NULL{\string\NULL\space}%
 \def\IN{\string\IN\space}%
 \def\NIN{\string\NIN\space}%
 \def\PREFIXOF{\string\PREFIXOF\space}%
 \def\NOTPREFIXOF{\string\NOTPREFIXOF\space}%
 \def\SUFFIXOF{\string\SUFFIXOF\space}%
 \def\NOTSUFFIXOF{\string\NOTSUFFIXOF\space}%
 \def\LC{\string\LC}%
 \def\UC{\string\UC}%
 \def\FIRSTLC{\string\FIRSTLC}%
 \def\FIRSTUC{\string\FIRSTUC}%
 \def\TITLE{\string\TITLE}%
 \def\MGP{\string\MGP}%
 \def\LEN{\string\LEN}%
 \def\TRIM{\string\TRIM}%
 \def\INTERPRET{\string\INTERPRET}%
 \def\LABELIFY{\string\LABELIFY}%
 \def\LABELIFYLIST{\string\LABELIFYLIST}%
 \def\CAT{\string\CAT}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrIfHasNonZeroChildCount}
%\changes{1.31}{2018-05-09}{new}
%\changes{1.47}{2021-11-04}{added starred version}
%For use with \app{bib2gls}'s \texttt{save-child-count} resource option.
%    \begin{macrocode}
\newcommand*{\GlsXtrIfHasNonZeroChildCount}{%
  \@ifstar\s@GlsXtrIfHasNonZeroChildCount\@GlsXtrIfHasNonZeroChildCount
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@GlsXtrIfHasNonZeroChildCount}
%\changes{1.47}{2021-11-04}{new}
%    \begin{macrocode}
\newcommand*{\@GlsXtrIfHasNonZeroChildCount}[3]{%
  \@GlsXtrIfFieldNonZero{childcount}{#1}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\s@GlsXtrIfHasNonZeroChildCount}
%\changes{1.47}{2021-11-04}{new}
%    \begin{macrocode}
\newcommand*{\s@GlsXtrIfHasNonZeroChildCount}[3]{%
  \s@GlsXtrIfFieldNonZero{childcount}{#1}{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrprovidecommand}
%\changes{1.27}{2018-02-26}{new}
%For use in \texttt{@preamble}, this behaves like
%\cs{providecommand} in the document but like \cs{renewcommand}
%in \app{bib2gls}.
%    \begin{macrocode}
\newcommand*{\glsxtrprovidecommand}{\providecommand}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsrenewcommand}
%\changes{1.37}{2018-11-30}{new}
%Like \cs{renewcommand} but only generates a warning rather than an
%error if the command isn't defined.
%    \begin{macrocode}
\newcommand*{\glsrenewcommand}{\@star@or@long\glsxtr@renewcommand}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@renewcommand}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@renewcommand}[1]{%
 \begingroup \escapechar\m@ne\xdef\@gtempa{{\string#1}}\endgroup
 \expandafter\@ifundefined\@gtempa
   {%
     \GlossariesExtraWarning{can't redefine \noexpand#1(not already defined)}%
   }%
   \relax
  \relax
 \let\@ifdefinable\@rc@ifdefinable
 \new@command#1%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@wrglossarylocation}
%\changes{1.29}{2018-04-09}{new}
%\begin{definition}
%\cs{glsxtr@wrglossarylocation}\marg{wr-loc}\marg{page}
%\end{definition}
%For use with \pkgopt{indexcounter} and \app{bib2gls}.
%This just expands to \meta{wr-loc} to allow \cs{glsnoidxdisplayloc}
%to obtain the hyperlink target. The page number obtained when
%\app{bib2gls} parses the aux file.
%    \begin{macrocode}
\newcommand*{\glsxtr@wrglossarylocation}[2]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrIndexCounterLink}
%\changes{1.29}{2018-04-09}{new}
%\begin{definition}
%\cs{GlsXtrIndexCounterLink}\marg{text}\marg{label}
%\end{definition}
%For use with \pkgopt{indexcounter} and \app{bib2gls}.
%    \begin{macrocode}
\ifdef\hyperref
{%
  \newcommand*{\GlsXtrIndexCounterLink}[2]{%
    \glsxtrifhasfield{indexcounter}{#2}%
    {\hyperref[wrglossary.\glscurrentfieldvalue]{#1}}%
    {#1}%
  }
}
{
  \newcommand*{\GlsXtrIndexCounterLink}[2]{#1}
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrDualField}
%\changes{1.30}{2018-04-25}{new}
%\begin{definition}
%\cs{GlsXtrDualField}
%\end{definition}
%The internal field used to store the dual label. The
%\texttt{dual-field} defaults to \texttt{dual} if no value is
%supplied so that's used as the default.
%    \begin{macrocode}
\newcommand*{\GlsXtrDualField}{dual}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrDualBackLink}
%\changes{1.30}{2018-04-25}{new}
%\changes{1.49}{2022-10-14}{corrected false part}
%\begin{definition}
%\cs{GlsXtrDualBackLink}\marg{text}\marg{label}
%\end{definition}
%Adds a hyperlink to the dual entry.
%    \begin{macrocode}
\newcommand*{\GlsXtrDualBackLink}[2]{%
  \glsxtrifhasfield{\GlsXtrDualField}{#2}%
  {\glshyperlink[#1]{\glscurrentfieldvalue}}%
  {#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrBibTeXEntryAliases}
%\changes{1.29}{2018-04-09}{new}
%Convenient shortcut for use with \texttt{entry-type-aliases} to
%alias standard \BibTeX\ entry types to \texttt{@bibtexentry}.
%    \begin{macrocode}
\newcommand*{\GlsXtrBibTeXEntryAliases}{%
  article=bibtexentry,
  book=bibtexentry,
  booklet=bibtexentry,
  conference=bibtexentry,
  inbook=bibtexentry,
  incollection=bibtexentry,
  inproceedings=bibtexentry,
  manual=bibtexentry,
  mastersthesis=bibtexentry,
  misc=bibtexentry,
  phdthesis=bibtexentry,
  proceedings=bibtexentry,
  techreport=bibtexentry,
  unpublished=bibtexentry
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrProvideBibTeXFields}
%\changes{1.29}{2018-04-09}{new}
%Convenient shortcut to define the standard \BibTeX\ fields.
%    \begin{macrocode}
\newcommand*{\GlsXtrProvideBibTeXFields}{%
  \glsaddstoragekey{address}{}{\glsxtrbibaddress}%
  \glsaddstoragekey{author}{}{\glsxtrbibauthor}%
  \glsaddstoragekey{booktitle}{}{\glsxtrbibbooktitle}%
  \glsaddstoragekey{chapter}{}{\glsxtrbibchapter}%
  \glsaddstoragekey{edition}{}{\glsxtrbibedition}%
  \glsaddstoragekey{howpublished}{}{\glsxtrbibhowpublished}%
  \glsaddstoragekey{institution}{}{\glsxtrbibinstitution}%
  \glsaddstoragekey{journal}{}{\glsxtrbibjournal}%
  \glsaddstoragekey{month}{}{\glsxtrbibmonth}%
  \glsaddstoragekey{note}{}{\glsxtrbibnote}%
  \glsaddstoragekey{number}{}{\glsxtrbibnumber}%
  \glsaddstoragekey{organization}{}{\glsxtrbiborganization}%
  \glsaddstoragekey{pages}{}{\glsxtrbibpages}%
  \glsaddstoragekey{publisher}{}{\glsxtrbibpublisher}%
  \glsaddstoragekey{school}{}{\glsxtrbibschool}%
  \glsaddstoragekey{series}{}{\glsxtrbibseries}%
  \glsaddstoragekey{title}{}{\glsxtrbibtitle}%
  \glsaddstoragekey{bibtextype}{}{\glsxtrbibtype}%
  \glsaddstoragekey{volume}{}{\glsxtrbibvolume}%
}
%    \end{macrocode}
%\end{macro}
%
%Multiple supplementary references are only supported with
%\app{bib2gls}.
%\begin{macro}{\glsxtrmultisupplocation}
%\changes{1.36}{2018-08-18}{new}
%This is like \cs{glsxtrsupphypernumber} but the second argument is
%the external file name (which isn't obtained from the
%\catattr{externallocation} attribute). The third argument is the
%formatting (encap) control sequence \emph{name}. This is ignored by
%default, but is set by \app{bib2gls} to the original encap in case
%it's required.
%    \begin{macrocode}
\newcommand*{\glsxtrmultisupplocation}[3]{%
 {%
   \def\glsxtrsupplocationurl{#2}%
   \glshypernumber{#1}%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrdisplaysupploc}
%\changes{1.36}{2018-08-18}{new}
%\begin{definition}
%\cs{glsxtrdisplaysupploc}\marg{prefix}\marg{counter}\marg{format}\marg{src}\marg{location}
%\end{definition}
%This is like \cs{glsnoidxdisplayloc} but is used for supplementary
%locations and so requires an extra argument.
%    \begin{macrocode}
\newcommand*\glsxtrdisplaysupploc[5]{%
  \setentrycounter[#1]{#2}%
  \glsxtrmultisupplocation{#5}{#4}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@setlocationanchor}
%\changes{1.54}{2025-01-03}{new}
%    \begin{macrocode}
\ExplSyntaxOn
\cs_new:Npn \glsxtr@setlocationanchor #1 #2 
 {
   \group_begin:
     \glswrglossdisableanchorcmds
     \exp_args:NNNe
   \group_end:
   \tl_set:Nn #1 { \text_purify:n { #2 } }
 }
\ExplSyntaxOff
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrdisplaylocnameref}
%\changes{1.37}{2018-11-30}{new}
%\cs{glsxtrdisplaylocnameref}\marg{prefix}\marg{counter}\marg{format}\marg{location}\marg{name}\marg{href}\marg{hcounter}\marg{external
%file}
%Used with the \sty[nameref]{record} package option. The \meta{href}
%argument was obtained from \cs{@currentHref} and the
%\meta{hcounter} argument was obtained from \cs{theHentrycounter},
%which is more reliable.
%If \sty{hyperref} hasn't been loaded, this just behaves like \cs{glsnoidxdisplayloc}.
%    \begin{macrocode}
\ifundef\hyperlink
{
  \newcommand*{\glsxtrdisplaylocnameref}[8]{%
    \glsnoidxdisplayloc{#1}{#2}{#3}{#4}%
  }
}
{
%    \end{macrocode}
% Default action uses \meta{hcounter}. Equations and pages typically don't
% have a title, so check the counter name (otherwise the title may be the
% section or chapter title, which can be confusing). As from v1.42,
% this now checks if the control sequence
% \cs{glsxtr\meta{counter}locfmt} is defined. The prefix argument is
% redundant.
%    \begin{macrocode}
  \newcommand*{\glsxtrdisplaylocnameref}[8]{%
    \def\glsxtrrecentanchor{#6}%
    \glsxtr@setlocationanchor\glsxtrlocationanchor{#2.#7}%
%    \end{macrocode}
% Initialise \cs{glsxtractualanchor}:
%    \begin{macrocode}
    \let\glsxtractualanchor\glsxtrlocationanchor
    \glsxtrsetactualanchor{#2}%
    \ifcsdef{glsxtr#2locfmt}%
    {\glsxtrnamereflink{#3}{\csuse{glsxtr#2locfmt}{#4}{#5}}{\glsxtractualanchor}{#8}}%
    {%
      \ifstrempty{#5}%
      {%
%    \end{macrocode}
%No title, so just use the location as the link text.
%    \begin{macrocode}
        \glsxtrnamereflink{#3}{#4}{\glsxtractualanchor}{#8}%
      }%
      {%
        \ifstrequal{#2}{page}%
        {\glsxtrnamereflink{#3}{#4}{\glsxtractualanchor}{#8}}%
        {\glsxtrtitlednamereflink{#3}{#4}{#5}{#8}}%
      }%
    }%
  }
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtractualanchor}
%\changes{1.49}{2022-10-14}{new}
%Does nothing by default. May be redefined to override the default.
%    \begin{macrocode}
\newcommand{\glsxtrsetactualanchor}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtitlednamereflink}
%\begin{definition}
%\cs{glsxtrtitlednamereflink}\marg{format}\marg{location}\marg{title}\marg{file}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glsxtrtitlednamereflink}[4]{%
  \glsxtrnamereflink{#1}{#2}{\glsxtrrecentanchor}{#4}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrequationlocfmt}
%\changes{1.42}{2020-02-03}{new}
%\begin{definition}
%\cs{glsxtrequationlocfmt}\marg{location}\marg{title}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\glsxtrequationlocfmt}[2]{(#1)}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrwrglossarylocfmt}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsxtrwrglossarylocfmt}\marg{location}\marg{title}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\glsxtrwrglossarylocfmt}[2]{%
  {\@@glsxtrwrglosscountermark{#1}%
  \let\glsxtr@wrglossarylocation\@secondoftwo
  #1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnamereflink}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glsxtrnamereflink}\marg{format}\marg{title}\marg{href}\marg{external
%file}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\glsxtrnamereflink}[4]{%
%    \end{macrocode}
%Locally change \cs{glshypernumber} to \cs{@firstofone} to 
%remove the normal location hyperlink.
%    \begin{macrocode}
  \begingroup
    \let\glshypernumber\@firstofone
%    \end{macrocode}
%If the \meta{external file} argument is empty, an internal link is used,
%otherwise an external one is needed.
%    \begin{macrocode}
    \ifstrempty{#4}%
    {\glsxtrfmtinternalnameref{#3}{#1}{#2}}%
    {\glsxtrfmtexternalnameref{#3}{#1}{#2}{#4}}%
  \endgroup
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnameloclink}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glsxtrnameloclink}\marg{prefix}\marg{counter}\marg{format}\marg{location}\marg{text}\marg{external
%file}
%\end{definition}
%Like \cs{@gls@numberlink}, this creates a hyperlink to the
%target obtained from the prefix, counter and location but uses
%\meta{text} as the hyperlink text. As with regular indexing, this
%will fail if the target name can't be formed by prefixing the
%location value.
%    \begin{macrocode}
\newcommand{\glsxtrnameloclink}[6]{%
 \begingroup
  \setentrycounter[#1]{#2}%
  \def\glsxtr@locationhypertext{#5}%
  \let\glshypernumber\@firstofone
  \def\@glsnumberformat{#3}%
  \def\glsxtrsupplocationurl{#6}%
  \toks@={}%
  \@glsxtr@bibgls@removespaces#4 \@nil
 \endgroup
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@bibgls@removespaces}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\def\@glsxtr@bibgls@removespaces#1 #2\@nil{%
 \toks@=\expandafter{\the\toks@#1}%
 \ifx\\#2\\%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{x} to \cs{@glo@tmp}}
%    \begin{macrocode}
   \edef\@glo@tmp{\the\toks@}%
   \ifx\@glo@tmp\empty
   \else
     \protected@edef\@glo@tmp{\glsentrycounter\@glo@counterprefix\the\toks@}%
     \ifdefvoid\glsxtrsupplocationurl
     {%
       \expandafter\glsxtrfmtinternalnameref\expandafter{\@glo@tmp}%
       {\@glsnumberformat}{\glsxtr@locationhypertext}%
     }%
     {%
       \expandafter\glsxtrfmtexternalnameref\expandafter{\@glo@tmp}%
       {\@glsnumberformat}{\glsxtr@locationhypertext}{\glsxtrsupplocationurl}%
     }%
   \fi
 \else
   \@gls@ReturnAfterFi{%
     \@glsxtr@bibgls@removespaces#2\@nil
   }%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfmtinternalnameref}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glsxtrfmtinternalnameloc}\marg{target}\marg{format}\marg{title}
%\end{definition}
%
%    \begin{macrocode}
\newcommand*{\glsxtrfmtinternalnameref}[3]{%
  \csuse{#2}{\glsdohyperlink{#1}{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfmtexternalnameref}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glsxtrfmtexternalnameloc}\marg{target}\marg{format}\marg{title}\marg{file}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\glsxtrfmtexternalnameref}[4]{%
  \csuse{#2}{\hyperref{#4}{}{#1}{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrSetWidest}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glsxtrSetWidest}\marg{type}\marg{level}\marg{text}
%\end{definition}
%As from \app{bib2gls} v1.8, this is used by the \texttt{set-widest}
%resource option for the \glostyle{alttree} and the styles
%provided by the \sty{glossary-longextra} package.
%    \begin{macrocode}
\newcommand*{\glsxtrSetWidest}[3]{%
%    \end{macrocode}
%Check which style options have been provided. (The style packages
%may not have been loaded.)
%    \begin{macrocode}
  \ifdef\glsupdatewidest
  {%
    \ifdef\glslongextraUpdateWidest
    {%
%    \end{macrocode}
%Relevant style packages all loaded.
%If the \meta{type} has been given, append to glossary preamble.
%    \begin{macrocode}
      \ifstrempty{#1}
      {%
        \glsupdatewidest[#2]{#3}%
        \ifnum#2=0\relax
          \glslongextraUpdateWidest{#3}%
        \else
          \glslongextraUpdateWidestChild{#2}{#3}%
        \fi
      }%
      {%
        \apptoglossarypreamble[#1]{\glsupdatewidest[#2]{#3}}%
        \ifnum#2=0\relax
          \apptoglossarypreamble[#1]{\glslongextraUpdateWidest{#3}}%
        \else
          \apptoglossarypreamble[#1]{\glslongextraUpdateWidestChild{#2}{#3}}%
        \fi
      }%
    }%
    {%
%    \end{macrocode}
%Only \glostyle{alttree}.
%    \begin{macrocode}
      \ifstrempty{#1}
      {%
        \glsupdatewidest[#2]{#3}%
      }%
      {%
        \apptoglossarypreamble[#1]{\glsupdatewidest[#2]{#3}}%
      }%
    }%
  }%
  {%
%    \end{macrocode}
%\cs{glsupdatewidest} hasn't been defined. This could just mean
%that the \sty{glossaries-extra-stylemods} package hasn't been
%loaded.
%    \begin{macrocode}
    \ifdef\glssetwidest
    {%
      \ifdef\glslongextraUpdateWidest
      {%
%    \end{macrocode}
%Relevant \sty{glossary-tree} and \sty{glossary-longextra} have been loaded.
%If the \meta{type} has been given, append to glossary preamble.
%    \begin{macrocode}
        \ifstrempty{#1}
        {%
          \glssetwidest[#2]{#3}%
          \ifnum#2=0\relax
            \glslongextraUpdateWidest{#3}%
          \else
            \glslongextraUpdateWidestChild{#2}{#3}%
          \fi
        }%
        {%
          \apptoglossarypreamble[#1]{\glssetwidest[#2]{#3}}%
          \ifnum#2=0\relax
            \apptoglossarypreamble[#1]{\glslongextraUpdateWidest{#3}}%
          \else
            \apptoglossarypreamble[#1]{\glslongextraUpdateWidestChild{#2}{#3}}%
          \fi
        }%
      }%
      {%
%    \end{macrocode}
%Only \glostyle{alttree}.
%    \begin{macrocode}
        \ifstrempty{#1}
        {%
          \glssetwidest[#2]{#3}%
        }%
        {%
          \apptoglossarypreamble[#1]{\glssetwidest[#2]{#3}}%
        }%
      }%
    }%
    {%
      \ifdef\glslongextraUpdateWidest
      {%
%    \end{macrocode}
%\sty{glossary-longextra} has been loaded.
%    \begin{macrocode}
        \ifstrempty{#1}
        {%
          \ifnum#2=0\relax
            \glslongextraUpdateWidest{#3}%
          \else
            \glslongextraUpdateWidestChild{#2}{#3}%
          \fi
        }%
        {%
          \ifnum#2=0\relax
            \apptoglossarypreamble[#1]{\glslongextraUpdateWidest{#3}}%
          \else
            \apptoglossarypreamble[#1]{\glslongextraUpdateWidestChild{#2}{#3}}%
          \fi
        }%
      }%
%    \end{macrocode}
%Neither \sty{glossary-tree} nor \sty{glossary-longextra} have been
%loaded. Do nothing.
%    \begin{macrocode}
      {}%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrSetWidestFallback}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glsxtrSetWidestFallback}\marg{max depth}\marg{list}
%\end{definition}
%Used when \app{bib2gls} can't determine the widest name.
%The \meta{list} argument is a comma-separated list of glossary
%labels. The \meta{max depth} refers to the maximum hierarchical
%depth. This will either be 0 (only top-level entries) or 2
%(up to two child-levels).
%    \begin{macrocode}
\newcommand*{\glsxtrSetWidestFallback}[2]{%
  \ifnum#1=0\relax
   \ifdef\glsFindWidestTopLevelName
   {%
     \glsFindWidestTopLevelName[#2]%
   }%
   {%
     \GlossariesExtraWarning{You need stylemods={tree} to
       provide a fallback for set-widest}%
   }%
  \else
   \ifdef\glsFindWidestLevelTwo
   {%
     \glsFindWidestLevelTwo[#2]%
     \ifdef\glslongextraUpdateWidestChild
     {%
      \glslongextraUpdateWidestChild{#1}{\csuse{@glswidestnamei}}%
      \glslongextraUpdateWidestChild{#1}{\csuse{@glswidestnameii}}%
     }%
     {}%
   }%
   {%
     \GlossariesExtraWarning{You need stylemods={tree} to
       provide a fallback for set-widest}%
   }%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@labelprefixes}
%\changes{1.37}{2018-11-30}{new}
%List of label prefixes.
%    \begin{macrocode}
\newcommand*{\@glsxtr@labelprefixes}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrclearlabelprefixes}
%\changes{1.37}{2018-11-30}{new}
%List of label prefixes.
%    \begin{macrocode}
\newcommand*{\glsxtrclearlabelprefixes}{%
  \renewcommand*{\@glsxtr@labelprefixes}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtraddlabelprefix}
%\changes{1.37}{2018-11-30}{new}
%Add prefix to the list.
%These should be added in the order of precedence with the last one
%as a fallback. This doesn't check against
%duplicates as it may be useful to replicate a prefix at the end as
%the fallback.
%    \begin{macrocode}
\newcommand*{\glsxtraddlabelprefix}[1]{%
  \ifstrempty{#1}%
  {\glsxtraddlabelprefix{\empty}}%
  {%
    \ifdefempty\@glsxtr@labelprefixes
    {\def\@glsxtr@labelprefixes{#1}}%
    {\appto\@glsxtr@labelprefixes{,#1}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrprependlabelprefix}
%\changes{1.37}{2018-11-30}{new}
%Inserts at the start of the list.
%    \begin{macrocode}
\newcommand*{\glsxtrprependlabelprefix}[1]{%
  \ifstrempty{#1}%
  {\glsxtrprependlabelprefix{\empty}}%
  {%
    \ifdefempty\@glsxtr@labelprefixes
    {\def\@glsxtr@labelprefixes{#1}}%
    {\preto\@glsxtr@labelprefixes{#1,}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrifinlabelprefixlist}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glsxtrifinlabelprefixlist}\marg{prefix}\marg{true}\marg{false}
%\end{definition}
%Test if the given prefix is in the list.
%    \begin{macrocode}
\newcommand*{\glsxtrifinlabelprefixlist}[3]{%
  \ifstrempty{#1}%
  {\glsxtrifinlabelprefixlist{\empty}{#2}{#3}}%
  {%
    \DTLifinlist{#1}{\@glsxtr@labelprefixes}{#2}{#3}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@prefixlabellist}
%\changes{1.37}{2018-11-30}{new}
%This is provided for the benefit of \app{bib2gls}. It's possible
%that the user may add more prefixes after the start of the
%document, but that can lead to inconsistencies. The final element
%of the list (the fallback) is the only prefix of interest for \app{bib2gls}.
%    \begin{macrocode}
\AtBeginDocument{%
 \protected@write\@auxout{}{\string\providecommand{\string\@glsxtr@prefixlabellist}[1]{}}%
 \protected@write\@auxout{}{\string\@glsxtr@prefixlabellist{\@glsxtr@labelprefixes}}%
}
%    \end{macrocode}
%\end{macro}
%
% Before v1.49, the last label was used as a fallback, but this
% doesn't make sense when the first matching label is used when
% entries are defined. The selection should be deferred to
% \app{bib2gls}, which means passing the list of label choices to
% \app{bib2gls}.
%
%\begin{macro}{\@glsxtr@dglsnomatch}
%\changes{1.49}{2022-10-14}{new}
%No match found so record all possibilities. Requires \app{bib2gls} v3.0+.
%This will add the final insert argument but won't be able to apply
%any case-changing etc.
%    \begin{macrocode}
\def\@glsxtr@dglsnomatch#1#2[#3]{%
 \begingroup
%    \end{macrocode}
% This is a cut-down version of \cs{@@glsxtr@record}.
% Use the fallback label in the event any hooks have to reference
% \cs{glslabel}. This is mainly to prevent an undefined control
% sequence error. It can't be relied on as the actual label.
%    \begin{macrocode}
  \let\glslabel\@gls@thislabel
  \let\@glsnumberformat\@glsxtr@defaultnumberformat
  \def\@glsxtr@thevalue{}%
  \def\@glsxtr@theHvalue{\@glsxtr@thevalue}%
  \let\@glsxtr@org@theHvalue\@glsxtr@theHvalue
  \let\@gls@counter\glscounter
  \if@glsxtr@equations
    \@glsxtr@use@equation@counter
  \fi
  \@gls@setdefault@glslink@opts
  \@glsxtr@glslink@prekeys
  \setkeys{glslink}{#1}%
  \glsxtr@do@autoadd{glslink}%
%    \end{macrocode}
% Can't increment associated counter.
%    \begin{macrocode}
  \ifKV@glslink@noindex
    \GlossariesExtraWarning{Can't obtain a match for prefix
     candidates: \@glsxtr@prefixedlist. Check the label spelling or rerun}%
  \else
    \ifdefempty{\@glsxtr@thevalue}%
    {%
      \ifx\@glsxtr@org@theHvalue\@glsxtr@theHvalue
      \else
        \let\theHglsentrycounter\@glsxtr@theHvalue
      \fi
    }%
    {%
      \let\theglsentrycounter\@glsxtr@thevalue
      \let\theHglsentrycounter\@glsxtr@theHvalue
    }%
    \glsxtr@saveentrycounter
    \@@glsxtr@dorecord\@glsxtr@prefixedlist
      \glsxtr@select@entry\glsxtr@do@select@nameref@record
%    \end{macrocode}
% Issue warning.
%    \begin{macrocode}
    \GlossariesExtraWarning{Can't obtain a match for prefix
     candidates: \@glsxtr@prefixedlist. Check the label spelling, use bib2gls v3.0+ to
     select entry and rerun LaTeX}%
  \fi
  \@glsxtrundeftag#3%
 \endgroup
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@select@entry}
%\changes{1.49}{2022-10-14}{new}
%Instruction to \app{bib2gls} to select the first found label in the
%list.
%    \begin{macrocode}
\newcommand*{\glsxtr@select@entry}[5]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@select@entry@nameref}
%\changes{1.49}{2022-10-14}{new}
%Instruction to \app{bib2gls} to select the first found label in the
%list as though it has a record.
%    \begin{macrocode}
\newcommand*{\glsxtr@select@entry@nameref}[8]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtr@do@select@nameref@record}
%\changes{1.49}{2022-10-14}{new}
%Instruction to \app{bib2gls} to select the first found label in the
%list as though it has a record.
%    \begin{macrocode}
\newcommand*{\glsxtr@do@select@nameref@record}[5]{%
  \gls@ifnotmeasuring
  {%
    \protected@write\@auxout{}{\string\glsxtr@select@entry@nameref
     {#1}{#2}{#3}{#4}{#5}%
     {\csuse{@currentlabelname}}{\csuse{@currentHref}}%
     {\theHglsentrycounter}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\ifGlsXtrPrefixLabelFallbackLast}
%\changes{1.49}{2022-10-14}{new}
% Determine whether the first or last label should be used as the
% fallback in the event that there's no match on any prefixes.
%    \begin{macrocode}
\newif\ifGlsXtrPrefixLabelFallbackLast
\GlsXtrPrefixLabelFallbackLasttrue
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtr@get@prefixedlabel}
%\changes{1.37}{2018-11-30}{new}
%Iterate through all the prefixes and find the first 
%prefix and label combination that exists. If none found, this could
%mean that it's the first \LaTeX\ run. 
%    \begin{macrocode}
\newcommand*{\@glsxtr@get@prefixedlabel}[1]{%
%    \end{macrocode}
% Grouping is used in case of a nested for loop.
%    \begin{macrocode}
 \begingroup
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%Initialise to the unprefixed label in the event that the list is
%empty.
%    \begin{macrocode}
 \protected@edef\@gls@thislabel{#1}%
%    \end{macrocode}
%Save the first label.
%    \begin{macrocode}
 \let\@glsxtr@prefixedfirstlabel\@gls@thislabel
 \def\@glsxtr@set@prefixedfirstlabel{%
   \let\@glsxtr@prefixedfirstlabel\@gls@thislabel
   \let\@glsxtr@set@prefixedfirstlabel\relax
 }%
%    \end{macrocode}
%List of labels in the event that no combination is found.
%    \begin{macrocode}
 \let\@glsxtr@prefixedlist\@empty
%    \end{macrocode}
% Iterate over all labels.
%    \begin{macrocode}
 \count@=0\relax
 \@for\@glsxtr@prefix:=\@glsxtr@labelprefixes\do
 {%
   \advance\count@ by 1\relax
   \protected@edef\@gls@thislabel{\@glsxtr@prefix#1}%
   \@glsxtr@set@prefixedfirstlabel
%    \end{macrocode}
% Check if this label exists.
%    \begin{macrocode}
   \ifglsentryexists{\@gls@thislabel}%
   {%
     \@endfortrue
%    \end{macrocode}
% Found a label that exists. Clear the list.
%    \begin{macrocode}
     \let\@glsxtr@prefixedlist\@empty
   }%
   {%
%    \end{macrocode}
% Append or prepend to list.
%    \begin{macrocode}
     \ifdefempty\@glsxtr@prefixedlist
     {\let\@glsxtr@prefixedlist\@gls@thislabel}%
     {%
       \ifGlsXtrPrefixLabelFallbackLast
         \epreto\@glsxtr@prefixedlist{\expandonce\@gls@thislabel,}%
       \else
         \eappto\@glsxtr@prefixedlist{,\expandonce\@gls@thislabel}%
       \fi
     }%
   }%
 }%
 \if@endfor
%    \end{macrocode}
% Loop ended prematurely, which means label was found.
%    \begin{macrocode}
 \else
  \ifnum\count@>1\relax
    \ifGlsXtrPrefixLabelFallbackLast
    \else
%    \end{macrocode}
% Fallback on first label.
%    \begin{macrocode}
      \let\@gls@thislabel\@glsxtr@prefixedfirstlabel
    \fi
  \else
%    \end{macrocode}
% Only one prefix so assume that one.
%    \begin{macrocode}
     \let\@glsxtr@prefixedlist\@empty
  \fi
 \fi
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{x} to \cs{@glo@tmp}}
%    \begin{macrocode}
 \edef\@glo@tmp{\endgroup
  \noexpand\def\noexpand\@glsxtr@prefixedlist{\expandonce\@glsxtr@prefixedlist}%
  \noexpand\def\noexpand\@gls@thislabel{\expandonce\@gls@thislabel}}\@glo@tmp
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\predglshook}
%\changes{1.8}{2025-08-13}{new}
%Hook for use at the start of the \cs{dgls}-like commands. The argument
%is the found prefixed label. Not used if no match found.
%    \begin{macrocode}
\newcommand\predglshook[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@dgls@}
%\changes{1.49}{2022-10-14}{new}
%Used by all the \cs{dgls}-like commands to find the first match.
%    \begin{macrocode}
\newcommand*{\@@dgls@}[3]{%
  \@glsxtr@get@prefixedlabel{#2}%
  \ifx\@glsxtr@prefixedlist\@empty
   \predglshook{\@gls@thislabel}%
   \let\@dgls@@next#3%
  \else
   \let\@dgls@@next\@glsxtr@dglsnomatch
  \fi
  \new@ifnextchar[{\@dgls@@next{#1}{\@gls@thislabel}}%
   {\@dgls@@next{#1}{\@gls@thislabel}[]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dgls}
%\changes{1.37}{2018-11-30}{new}
%Like \cs{gls} but tries the prefixes. (Can't use \cs{pgls} as
%that's provided by \sty{glossaries-prefix}.) Since this command
%is designed for \app{bib2gls}'s dual entry system, the \qt{d}
%stands for \qt{dual}.
%    \begin{macrocode}
\newrobustcmd*{\dgls}{\@gls@hyp@opt\@dgls}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dgls}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand*{\@dgls}[2][]{\@@dgls@{#1}{#2}{\@gls@}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dglspl}
%    \begin{macrocode}
\newrobustcmd*{\dglspl}{\@gls@hyp@opt\@dglspl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dglspl}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand*{\@dglspl}[2][]{\@@dgls@{#1}{#2}{\@glspl@}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dGls}
%    \begin{macrocode}
\newrobustcmd*{\dGls}{\@gls@hyp@opt\@dGls}
\glsmfuaddmap{\dgls}{\dGls}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dGls}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand*{\@dGls}[2][]{\@@dgls@{#1}{#2}{\@Gls@}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dGlspl}
%    \begin{macrocode}
\newrobustcmd*{\dGlspl}{\@gls@hyp@opt\@dGlspl}
\glsmfuaddmap{\dglspl}{\dGlspl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dGlspl}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand*{\@dGlspl}[2][]{\@@dgls@{#1}{#2}{\@Glspl@}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dGLS}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newrobustcmd*{\dGLS}{\@gls@hyp@opt\@dGLS}
\glsmfublocker{\dGLS}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dGLS}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand*{\@dGLS}[2][]{\@@dgls@{#1}{#2}{\@GLS@}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dGLSpl}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newrobustcmd*{\dGLSpl}{\@gls@hyp@opt\@dGLSpl}
\glsmfublocker{\dGLSpl}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dGLSpl}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand*{\@dGLSpl}[2][]{\@@dgls@{#1}{#2}{\@GLSpl@}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dglslink}
%\changes{1.37}{2018-11-30}{new}
%Like \cs{glslink} but tries the prefixes.
%    \begin{macrocode}
\newrobustcmd*{\dglslink}{\@gls@hyp@opt\@dglslink}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\predglslinkhook}
%\changes{1.8}{2025-08-13}{new}
%Hook for use at the start of the \cs{dglslink} and \cs{dglsdisp}. The argument
%is the found prefixed label. Not used if no match found.
%    \begin{macrocode}
\newcommand\predglslinkhook[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dglslink}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@dglslink}[3][]{%
  \@glsxtr@get@prefixedlabel{#2}%
  \predglslinkhook{\@gls@thislabel}%
  \glslink[#1]{\@gls@thislabel}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dGlslink}
%\changes{1.49}{2022-10-14}{new}
%Sentence-case version to provide a mapping.
%    \begin{macrocode}
\newrobustcmd*{\dGlslink}{\@gls@hyp@opt\@dGlslink}
\glsmfuaddmap{\dglslink}{\dGlslink}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dGlslink}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@dGlslink}[3][]{%
  \dglslink[#1]{#2}{\glssentencecase{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dglsdisp}
%\changes{1.37}{2018-11-30}{new}
%Like \cs{glsdisp} but tries the prefixes.
%    \begin{macrocode}
\newrobustcmd*{\dglsdisp}{\@gls@hyp@opt\@dglsdisp}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dglsdisp}
%\changes{1.49}{2022-10-14}{new}
%Like \cs{glsdisp} but tries the prefixes.
%    \begin{macrocode}
\newcommand*{\@dglsdisp}[3][]{%
  \@glsxtr@get@prefixedlabel{#2}%
  \predglslinkhook{\@gls@thislabel}%
  \glsdisp[#1]{\@gls@thislabel}{#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dGlsdisp}
%\changes{1.49}{2022-10-14}{new}
%Sentence-case version to provide a mapping.
%    \begin{macrocode}
\newrobustcmd*{\dGlsdisp}{\@gls@hyp@opt\@dGlsdisp}
\glsmfuaddmap{\dglsdisp}{\dGlsdisp}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dGlsdisp}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@dGlsdisp}[3][]{%
  \dglsdisp[#1]{#2}{\glssentencecase{#3}}%
}
%    \end{macrocode}
%\end{macro}
%
%Similar to the above but searches for a match with the given field
%set.
%\begin{macro}{\@glsxtr@get@prefixedlabel@field}
%\changes{1.49}{2022-10-14}{new}
%The second argument is the field's internal label.
%    \begin{macrocode}
\newcommand*{\@glsxtr@get@prefixedlabel@field}[2]{%
  \protected@edef\dglsfieldcurrentfieldlabel{#2}%
  \let\dglsfieldactualfieldlabel\dglsfieldcurrentfieldlabel
%    \end{macrocode}
% Grouping is used in case of a nested for loop.
%    \begin{macrocode}
 \begingroup
%    \end{macrocode}
%Initialise to the unprefixed label in the event that the list is
%empty.
%    \begin{macrocode}
 \protected@edef\@gls@thislabel{#1}%
%    \end{macrocode}
%Save the first label.
%    \begin{macrocode}
 \let\@glsxtr@prefixedfirstlabel\@gls@thislabel
 \def\@glsxtr@set@prefixedfirstlabel{%
   \let\@glsxtr@prefixedfirstlabel\@gls@thislabel
   \let\@glsxtr@set@prefixedfirstlabel\relax
 }%
%    \end{macrocode}
%Initialise fallback label.
%    \begin{macrocode}
 \let\@gls@fallbacklabel\relax
%    \end{macrocode}
%List of labels in the event that no combination is found.
%    \begin{macrocode}
 \let\@glsxtr@prefixedlist\@empty
%    \end{macrocode}
% Iterate over all labels.
%    \begin{macrocode}
 \count@=0\relax
 \@for\@glsxtr@prefix:=\@glsxtr@labelprefixes\do
 {%
   \advance\count@ by 1\relax
   \protected@edef\@gls@thislabel{\@glsxtr@prefix#1}%
   \@glsxtr@set@prefixedfirstlabel
%    \end{macrocode}
% Check if this label exists.
%    \begin{macrocode}
   \ifglsentryexists{\@gls@thislabel}%
   {%
%    \end{macrocode}
% Found a label that exists. Has the field been set?
%    \begin{macrocode}
     \ifcsvoid{glo@\glsdetoklabel{\@gls@thislabel}@#2}%
     {%
%    \end{macrocode}
%Field hasn't been set. Has a fallback been set yet?
%    \begin{macrocode}
       \ifx\@gls@fallbacklabel\relax
        \ifcsvoid
        {glo@\glsdetoklabel{\@gls@thislabel}@\dglsfieldfallbackfieldlabel}%
        {%
          \GlossariesExtraInfo{Found entry `\@gls@thislabel' that
           matches prefix `\@glsxtr@prefix' but field `#2' not set
           and fallback field `\dglsfieldfallbackfieldlabel' not set}%
        }%
        {%
          \let\@gls@fallbacklabel\@gls@thislabel
          \GlossariesExtraInfo{Found entry `\@gls@thislabel' that
           matches prefix `\@glsxtr@prefix' but field `#2' not set.
           Fallback field `\dglsfieldfallbackfieldlabel' is set
           so setting fallback entry to `\@gls@fallbacklabel' with
           field `\dglsfieldfallbackfieldlabel'}%
        }%
       \else
         \GlossariesExtraInfo{Found entry `\@gls@thislabel' that
          matches prefix `\@glsxtr@prefix' but field `#2' not set.
          Fallback entry: `\@gls@fallbacklabel'}%
       \fi
%    \end{macrocode}
%\changes{1.51}{2023-04-24}{add found entry to list}
% Add to list. (A new entry with the desired field may have been
% added, so allow it to be selected.)
%    \begin{macrocode}
       \ifdefempty\@glsxtr@prefixedlist
       {\let\@glsxtr@prefixedlist\@gls@thislabel}%
       {%
         \ifGlsXtrPrefixLabelFallbackLast
           \epreto\@glsxtr@prefixedlist{\expandonce\@gls@thislabel,}%
         \else
           \eappto\@glsxtr@prefixedlist{,\expandonce\@gls@thislabel}%
         \fi
       }%
     }%
     {%
       \@endfortrue
%    \end{macrocode}
% The field has been set. Clear the list.
%    \begin{macrocode}
       \let\@glsxtr@prefixedlist\@empty
     }%
   }%
   {%
%    \end{macrocode}
% Append or prepend to list.
%    \begin{macrocode}
     \ifdefempty\@glsxtr@prefixedlist
     {\let\@glsxtr@prefixedlist\@gls@thislabel}%
     {%
       \ifGlsXtrPrefixLabelFallbackLast
         \epreto\@glsxtr@prefixedlist{\expandonce\@gls@thislabel,}%
       \else
         \eappto\@glsxtr@prefixedlist{,\expandonce\@gls@thislabel}%
       \fi
     }%
   }%
 }%
 \if@endfor
%    \end{macrocode}
% Loop ended prematurely, which means label was found.
%    \begin{macrocode}
 \else
%    \end{macrocode}
% Label not found. Was the fallback field found?
%    \begin{macrocode}
  \ifx\@gls@fallbacklabel\relax
    \GlossariesExtraWarning{No fallback found for `#1'}%
%    \end{macrocode}
% No field fallback found.
%    \begin{macrocode}
    \ifnum\count@>1\relax
      \ifGlsXtrPrefixLabelFallbackLast
      \else
%    \end{macrocode}
% Fallback on first label.
%    \begin{macrocode}
        \let\@gls@thislabel\@glsxtr@prefixedfirstlabel
      \fi
    \else
%    \end{macrocode}
% Only one prefix so assume that one.
%    \begin{macrocode}
       \let\@glsxtr@prefixedlist\@empty
    \fi
  \else
%    \end{macrocode}
% Fallback field was found. Use the fallback entry.
%    \begin{macrocode}
    \let\@gls@thislabel\@gls@fallbacklabel
    \let\dglsfieldactualfieldlabel\dglsfieldfallbackfieldlabel
%    \end{macrocode}
%Clear prefix candidate list.
%\changes{1.51}{2023-04-24}{clear list}
%    \begin{macrocode}
    \let\@glsxtr@prefixedlist\@empty
  \fi
 \fi
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{x} to \cs{@glo@tmp}}
%    \begin{macrocode}
 \edef\@glo@tmp{\endgroup
  \noexpand\def\noexpand\@glsxtr@prefixedlist{\expandonce\@glsxtr@prefixedlist}%
  \noexpand\def\noexpand\@gls@thislabel{\expandonce\@gls@thislabel}%
  \noexpand\def\noexpand\dglsfieldactualfieldlabel
   {\expandonce\dglsfieldactualfieldlabel}%
 }%
 \@glo@tmp
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\predglsfieldhook}
%\changes{1.8}{2025-08-13}{new}
%Hook for use at the start of the \cs{dglsfield}-like commands. The argument
%is the found prefixed label. Not used if no match found.
%    \begin{macrocode}
\newcommand\predglsfieldhook[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@dgls@@field}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{@@dgls@@field}\marg{options}\marg{label}\marg{field}\marg{cs}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\@@dgls@@field}[4]{%
  \@glsxtr@get@prefixedlabel@field{#2}{#3}%
  \ifx\@glsxtr@prefixedlist\@empty
   \predglsfieldhook{\@gls@thislabel}%
   \let\@dgls@@next#4%
  \else
   \let\@dgls@@next\@glsxtr@dglsnomatch
  \fi
  \new@ifnextchar[{\@dgls@@next{#1}{\@gls@thislabel}}%
   {\@dgls@@next{#1}{\@gls@thislabel}[]}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dglsfieldcurrentfieldlabel}
%\changes{1.49}{2022-10-14}{new}
%Set by the \cs{dglsfield} commands to the current field label.
%This is the field requested in the argument of \cs{dglsfield}.
%    \begin{macrocode}
\newcommand*{\dglsfieldcurrentfieldlabel}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dglsfieldfallbackfieldlabel}
%\changes{1.49}{2022-10-14}{new}
%The field to use if the required field isn't set.
%    \begin{macrocode}
\newcommand*{\dglsfieldfallbackfieldlabel}{text}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dglsfieldactualfieldlabel}
%\changes{1.49}{2022-10-14}{new}
%This is the field that's actually used.
%    \begin{macrocode}
\newcommand*{\dglsfieldactualfieldlabel}{\dglsfieldcurrentfieldlabel}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dglsfield}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{dglsfield}\oarg{options}\marg{label}\marg{field}\oarg{insert}
%\end{definition}
%    \begin{macrocode}
\newrobustcmd*{\dglsfield}{\@gls@hyp@opt\@dglsfield}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dglsfield}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@dglsfield}[3][]{%
 \@@dgls@@field{#1}{#2}{#3}{\@dgls@field}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dgls@field}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\def\@dgls@field#1#2[#3]{%
  \@gls@field@link{#1}{#2}{\glsxtrusefield{#2}{\dglsfieldactualfieldlabel}#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dGlsfield}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{dGlsfield}\oarg{options}\marg{label}\marg{field}\oarg{insert}
%\end{definition}
%    \begin{macrocode}
\newrobustcmd*{\dGlsfield}{\@gls@hyp@opt\@dGlsfield}
\glsmfuaddmap{\dglsfield}{\dGlsfield}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dGlsfield}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@dGlsfield}[3][]{%
 \@@dgls@@field{#1}{#2}{#3}{\@dGls@field}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dGls@field}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\def\@dGls@field#1#2[#3]{%
  \@gls@field@link{#1}{#2}{\Glsxtrusefield{#2}{\dglsfieldactualfieldlabel}#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\dGLSfield}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{dGlsfield}\oarg{options}\marg{label}\marg{field}\oarg{insert}
%\end{definition}
%    \begin{macrocode}
\newrobustcmd*{\dGLSfield}{\@gls@hyp@opt\@dGLSfield}
\glsmfublocker{\dGLSfield}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dGLSfield}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@dGLSfield}[3][]{%
 \@@dgls@@field{#1}{#2}{#3}{\@dGLS@field}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@dGLS@field}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\def\@dGLS@field#1#2[#3]{%
  \@gls@field@link{#1}{#2}{\GLSxtrusefield{#2}{\dglsfieldactualfieldlabel}#3}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\d@inner@glsfield}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{d@inner@glsfield}\marg{default options}\marg{field}\meta{modifier}%
%\oarg{options}\marg{label}\oarg{insert}
%\end{definition}
%    \begin{macrocode}
\newrobustcmd*{\d@inner@glsfield}[2]{%
 \ifstrempty{#1}
 {\def\@d@inner@glsfield@opts{}}%
 {\def\@d@inner@glsfield@opts{#1,}}%
 \def\dglsfieldcurrentfieldlabel{#2}%
 \@gls@hyp@opt\@d@inner@glsfield
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@d@inner@glsfield}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@d@inner@glsfield}[2][]{%
 \expandafter\@@dgls@@field\expandafter
  {\@d@inner@glsfield@opts#1}{#2}{\dglsfieldcurrentfieldlabel}{\@dgls@field}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\d@inner@Glsfield}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\d@inner@Glsfield}[2]{%
 \ifstrempty{#1}
 {\def\@d@inner@glsfield@opts{}}%
 {\def\@d@inner@glsfield@opts{#1,}}%
 \def\dglsfieldcurrentfieldlabel{#2}%
 \@gls@hyp@opt\@d@inner@Glsfield
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@d@inner@Glsfield}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@d@inner@Glsfield}[2][]{%
 \expandafter\@@dgls@@field\expandafter
  {\@d@inner@glsfield@opts#1}{#2}{\dglsfieldcurrentfieldlabel}{\@dGls@field}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\d@inner@GLSfield}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newrobustcmd*{\d@inner@GLSfield}[2]{%
 \ifstrempty{#1}
 {\def\@d@inner@glsfield@opts{}}%
 {\def\@d@inner@glsfield@opts{#1,}}%
 \def\dglsfieldcurrentfieldlabel{#2}%
 \@gls@hyp@opt\@d@inner@GLSfield
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@d@inner@GLSfield}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@d@inner@GLSfield}[2][]{%
 \expandafter\@@dgls@@field\expandafter
  {\@d@inner@glsfield@opts#1}{#2}{\dglsfieldcurrentfieldlabel}{\@dGLS@field}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\newdglsfield}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{newdglsfield}\oarg{options}\marg{field}\marg{cs}
%\end{definition}
%    \begin{macrocode}
\newrobustcmd*{\newdglsfield}[3][]{%
  \newrobustcmd*{#3}{\d@inner@glsfield{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\newdglsfieldlike}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{newdglsfieldlike}\oarg{options}\marg{field}\marg{cs}\marg{Cs}\marg{CS}
%\end{definition}
%    \begin{macrocode}
\newrobustcmd*{\newdglsfieldlike}[5][]{%
  \newrobustcmd*{#3}{\d@inner@glsfield{#1}{#2}}%
  \newrobustcmd*{#4}{\d@inner@Glsfield{#1}{#2}}%
  \newrobustcmd*{#5}{\d@inner@GLSfield{#1}{#2}}%
  \glsmfuaddmap{#3}{#4}%
  \glsmfublocker{#5}%
}
%    \end{macrocode}
%\end{macro}
%
%Multi (compound/combined) entry commands used by \app{bib2gls}.
%\begin{macro}{\glsxtrmultientryadjustedname}
%\begin{definition}
%\cs{glsxtrmultientryadjustedname}\marg{list1}\marg{name}\marg{list2}\marg{label}
%\end{definition}
%\changes{1.48}{2021-11-22}{new}
%This command is used by \app{bib2gls} when it adjusts the name
%field of an entry that's been identified as a main entry in the
%multi-entry set \meta{label}.
%
%The final argument \meta{label} is the multi-entry label from which
%the set was obtained. The first
%argument \meta{list1} is the list of other labels that come before
%the main label. The third argument \meta{list2} is the remaining
%list of other labels. The \meta{name} argument is the previous name before
%adjustment.
%    \begin{macrocode}
\newrobustcmd*{\glsxtrmultientryadjustedname}[4]{%
  \bgroup
    \let\@glsxtrmultientryadjustednamesep\glsxtrmultientryadjustednamesep
    \let\@glsxtrmultientryadjustednamepresep\glsxtrmultientryadjustednamepresep
    \let\@glsxtrmultientryadjustednamepostsep\glsxtrmultientryadjustednamepostsep
    \let\@glsxtrmultientryadjustednameother\glsxtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefmt\glsxtrmultientryadjustednamefmt
    \let\@glsxtrmultientryadjustednamefirstother\glsxtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefirstfmt\glsxtrmultientryadjustednamefmt
    \@glsxtrmultientryadjustedname{#1}{#2}{#3}{#4}%
  \egroup
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrmultientryadjustedname}
%\changes{1.48}{2021-11-22}{new}
%First letter upper case
%    \begin{macrocode}
\newrobustcmd*{\Glsxtrmultientryadjustedname}[4]{%
  \bgroup
    \let\@glsxtrmultientryadjustednamesep\glsxtrmultientryadjustednamesep
    \let\@glsxtrmultientryadjustednamepresep\glsxtrmultientryadjustednamepresep
    \let\@glsxtrmultientryadjustednamepostsep\glsxtrmultientryadjustednamepostsep
    \let\@glsxtrmultientryadjustednameother\glsxtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefmt\glsxtrmultientryadjustednamefmt
    \let\@glsxtrmultientryadjustednamefirstother\Glsxtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefirstfmt\Glsxtrmultientryadjustednamefmt
    \@glsxtrmultientryadjustedname{#1}{#2}{#3}{#4}%
  \egroup
}
\glsmfuaddmap{\glsxtrmultientryadjustedname}{\Glsxtrmultientryadjustedname}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrmultientryadjustedname}
%\changes{1.48}{2021-11-22}{new}
%Title case
%    \begin{macrocode}
\newrobustcmd*{\GlsXtrmultientryadjustedname}[4]{%
  \bgroup
    \let\@glsxtrmultientryadjustednamesep\glsxtrmultientryadjustednamesep
    \let\@glsxtrmultientryadjustednamepresep\glsxtrmultientryadjustednamepresep
    \let\@glsxtrmultientryadjustednamepostsep\glsxtrmultientryadjustednamepostsep
    \let\@glsxtrmultientryadjustednameother\GlsXtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefmt\GlsXtrmultientryadjustednamefmt
    \let\@glsxtrmultientryadjustednamefirstother\GlsXtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefirstfmt\GlsXtrmultientryadjustednamefmt
    \@glsxtrmultientryadjustedname{#1}{#2}{#3}{#4}%
  \egroup
}
\glsmfublocker{\GlsXtrmultientryadjustedname}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrmultientryadjustedname}
%\changes{1.48}{2021-11-22}{new}
%All caps.
%    \begin{macrocode}
\newrobustcmd*{\GLSxtrmultientryadjustedname}[4]{%
  \bgroup
    \let\@glsxtrmultientryadjustednamesep\glsxtrmultientryadjustednamesep
    \let\@glsxtrmultientryadjustednamepresep\glsxtrmultientryadjustednamepresep
    \let\@glsxtrmultientryadjustednamepostsep\glsxtrmultientryadjustednamepostsep
    \let\@glsxtrmultientryadjustednameother\GLSxtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefmt\GLSxtrmultientryadjustednamefmt
    \let\@glsxtrmultientryadjustednamefirstother\GLSxtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefirstfmt\GLSxtrmultientryadjustednamefmt
    \@glsxtrmultientryadjustedname{#1}{#2}{#3}{#4}%
  \egroup
}
\glsmfublocker{\GLSxtrmultientryadjustedname}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrmultientryadjustedname}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\@glsxtrmultientryadjustedname}[4]{%
  \letcs\mglscurrentmainlabel{@gls@combined@#4@main}%
  \letcs\mglscurrentmainlist{@gls@combined@#4@list}%
  \letcs\mglscurrentmainoptions{@gls@combined@#4@options}%
  \ifblank{#1}%
  {%
    \@glsxtrmultientryadjustednamefirstfmt{#2}%
  }%
  {%
    \def\@mgls@previouslabel{}%
    \let\@gls@xtradjustedother\@glsxtrmultientryadjustednamefirstother
    \@for\mglscurrentlabel:=#1\do{%
       \ifx\@mgls@previouslabel\empty
       \else
         \@glsxtrmultientryadjustednamesep{\@mgls@previouslabel}{\mglscurrentlabel}%
       \fi
       \@gls@xtradjustedother{\mglscurrentlabel}%
       \let\@mgls@previouslabel\mglscurrentlabel
       \let\@gls@xtradjustedother\@glsxtrmultientryadjustednameother
    }%
    \@glsxtrmultientryadjustednamepresep{\@mgls@previouslabel}{\mglscurrentmainlabel}%
    \@glsxtrmultientryadjustednamefmt{#2}%
  }%
  \ifblank{#3}%
  {}%
  {%
    \let\@mgls@previouslabel\mglscurrentmainlabel
    \let\@gls@xtrmultientryadjustednamesep\@glsxtrmultientryadjustednamepostsep
    \@for\mglscurrentlabel:=#3\do{%
       \@gls@xtrmultientryadjustednamesep{\@mgls@previouslabel}{\mglscurrentlabel}%
       \@glsxtrmultientryadjustednameother{\mglscurrentlabel}%
       \let\@mgls@previouslabel\mglscurrentlabel
       \let\@gls@xtrmultientryadjustednamesep\@glsxtrmultientryadjustednamesep
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrmultientryadjustednamesep}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrmultientryadjustednamesep}{\glscombinedfirstsepfirst}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrmultientryadjustednamepresep}
%\changes{1.48}{2021-11-22}{new}
% Separator before main name.
%    \begin{macrocode}
\newcommand*{\glsxtrmultientryadjustednamepresep}{\glsxtrmultientryadjustednamesep}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrmultientryadjustednamepostsep}
%\changes{1.48}{2021-11-22}{new}
% Separator after main name.
%    \begin{macrocode}
\newcommand*{\glsxtrmultientryadjustednamepostsep}{\glsxtrmultientryadjustednamesep}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrmultientryadjustednamefmt}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrmultientryadjustednamefmt}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrmultientryadjustednameother}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrmultientryadjustednameother}[1]{\glsentryname{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrmultientryadjustednamefmt}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrmultientryadjustednamefmt}[1]{\glssentencecase{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Glsxtrmultientryadjustednameother}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\Glsxtrmultientryadjustednameother}[1]{\Glsentryname{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrmultientryadjustednameother}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\GlsXtrmultientryadjustednameother}[1]{%
 \glsentrytitlecase{#1}{name}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GlsXtrmultientryadjustednamefmt}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\ifdef\glscapitalisewords
{%
  \newcommand*{\GlsXtrmultientryadjustednamefmt}[1]{\glscapitalisewords{#1}}
}
{
  \newcommand*{\GlsXtrmultientryadjustednamefmt}[1]{\capitalisewords{#1}}
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrmultientryadjustednameother}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrmultientryadjustednameother}[1]{%
 \glsuppercase{\glsentryname{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\GLSxtrmultientryadjustednamefmt}
%\changes{1.48}{2021-11-22}{new}
%    \begin{macrocode}
\newcommand*{\GLSxtrmultientryadjustednamefmt}[1]{\glsuppercase{#1}}
%    \end{macrocode}
%\end{macro}
%
%Provide missing Greek letters for use in maths mode.
%These commands are recognised by \app{bib2gls} and will be mapped to the
%Mathematical Greek Italic letters. This ensures that the Greek
%letters that have the same shape as Latin letters are kept
%with the other mathematical Greek letters for sorting purposes. 
%The \LaTeX\ version of these commands (provided here) use an upright font 
%for capitals and italic for lower case to provide a better match 
%with the other Greek symbols provided by the kernel.
%
%\begin{macro}{\Alpha}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Alpha}{\mathrm{A}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Beta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Beta}{\mathrm{B}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Epsilon}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Epsilon}{\mathrm{E}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Zeta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Zeta}{\mathrm{Z}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Eta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Eta}{\mathrm{H}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Iota}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Iota}{\mathrm{I}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Kappa}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Kappa}{\mathrm{K}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Mu}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Mu}{\mathrm{M}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Nu}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Nu}{\mathrm{N}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Omicron}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Omicron}{\mathrm{O}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Rho}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Rho}{\mathrm{P}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Tau}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Tau}{\mathrm{T}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Chi}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Chi}{\mathrm{X}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Digamma}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\Digamma}{\mathrm{F}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\omicron}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\providecommand*{\omicron}{\mathit{o}}
%    \end{macrocode}
%\end{macro}
%
%Provide corresponding upright characters if \sty{upgreek} has been
%loaded. (The upper case characters are the same as above.)
%    \begin{macrocode}
\@ifpackageloaded{upgreek}%
{
%    \end{macrocode}
%\begin{macro}{\Upalpha}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\Upalpha}{\mathrm{A}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Upbeta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\Upbeta}{\mathrm{B}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Upepsilon}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\Upepsilon}{\mathrm{E}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Upzeta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\Upzeta}{\mathrm{Z}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Upeta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\Upeta}{\mathrm{H}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Upiota}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\Upiota}{\mathrm{I}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Upkappa}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\Upkappa}{\mathrm{K}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Upmu}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\Upmu}{\mathrm{M}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Upnu}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\Upnu}{\mathrm{N}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Upomicron}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\Upomicron}{\mathrm{O}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Uprho}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\Uprho}{\mathrm{P}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Uptau}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\Uptau}{\mathrm{T}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\Upchi}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\Upchi}{\mathrm{X}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\upomicron}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
  \providecommand*{\upomicron}{\mathrm{o}}
%    \end{macrocode}
%\end{macro}
%
%    \begin{macrocode}
}%
{}% upgreek.sty not loaded
%    \end{macrocode}
%
%This package provides some basic rules, but it's not intended for
%complete coverage of all locales. The CLDR should provide the
%appropriate locale-sensitive rules. These macros are primarily to
%help construct custom rules to include, for example, Greek maths symbols
%mixed with Latin. For the full rule syntax, see the Java API for
%\href{https://docs.oracle.com/javase/8/docs/api/java/text/RuleBasedCollator.html}{RuleBaseCollator}
%
%If you want to provide a rule-block for a particular locale to
%allow for customization within that locale, create a file called 
%\texttt{glossariesxtr-\meta{tag}.ldf} (where \meta{tag} identifies
%the locale) and add similar commands. See the description
%of \cs{IfTrackedLanguageFileExists} in the \sty{tracklang} manual
%for the allowed forms of \meta{tag}. The simplest is to just use
%the root language label or ISO code. The file will then be automatically loaded
%by \sty{glossaries-extra} if the document has support for that
%language.
%
%When combining these blocks of rules, remember to separate them
%with the appropriate character. For example:
%\begin{verbatim}
%sort-rule={\glsxtrcontrolrules
% ;\glsxtrspacerules
% ;\glsxtrnonprintablerules
% ;\glsxtrcombiningdiacriticrules
% ;\glsxtrhyphenrules
% <\glsxtrgeneralpuncrules
% <\glsxtrdigitrules
% <\glsxtrfractionrules
% <\glsxtrGeneralLatinIVrules
% <\glsxtrMathItalicGreekIrules
%}
%\end{verbatim}
%
%\begin{macro}{\glsxtrIgnorableRules}
%\changes{1.49}{2022-10-14}{new}
%A shortcut command for common ignorable characters.
%    \begin{macrocode}
\newcommand{\glsxtrIgnorableRules}{%
 \glsxtrcontrolrules
 \string;\glsxtrspacerules
 \string;\glsxtrnonprintablerules
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralInitRules}
%\changes{1.49}{2022-10-14}{new}
%A shortcut command for common initial rules for ignorables,
%diacritics, punctuation and digits.
%    \begin{macrocode}
\newcommand{\glsxtrGeneralInitRules}{%
 \glsxtrIgnorableRules
 \string;\glsxtrcombiningdiacriticrules
 \string;\glsxtrhyphenrules
 \string<\glsxtrgeneralpuncrules
 \string<\glsxtrdigitrules
 \string<\glsxtrfractionrules
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralPuncRules}
%\changes{1.56}{2025-02-07}{new}
%A shortcut command for common punctuation and digits.
%    \begin{macrocode}
\newcommand{\glsxtrGeneralPuncRules}{%
 \glsxtrgeneralpuncmarksrules
 \string<\glsxtrgeneralpuncdotrules
 \string<\glsxtrgeneralpuncaccentsrules
 \string<\glsxtrgeneralpuncquoterules
 \string<\glsxtrgeneralpuncbracketrules
 \string<\glsxtrgeneralpuncsignrules
 \string<\glsxtrcurrencyrules
 \string<\glsxtrgeneralpuncIIIrules
 \string<\glsxtrdigitrules
 \string<\glsxtrfractionrules
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrcontrolrules}
%\changes{1.27}{2018-02-26}{new}
%These are control characters that are usually placed at the start
%of a rule in the `ignored characters' section. These control
%characters are unlikely to appear in any entry fields but are
%provided for completeness. (They may appear with the marker
%commands provided with \verb|--datatool-sort-markers| which
%emulates the marker commands provided by \sty{datatool-base} for
%use in the sort hook, in which case those particular control codes
%shouldn't be ignored.)
%\cs{string} is used for punctuation characters in case they've been
%made active.
%    \begin{macrocode}
\newcommand*{\glsxtrcontrolrules}{%
 \string'\glshex 200B\string'\string=\glshex 200C\string=\glshex 200D
 \string=\glshex 200E\string=\glshex 200F\string=\glshex 0000\string=\glshex 0001
 \string=\glshex 0002\string=\glshex 0003\string=\glshex 0004\string=\glshex 0005
 \string=\glshex 0006\string=\glshex 0007\string=\glshex 0008
 \string=\string'\glshex 0009\string'\string=\string'\glshex 000B\string'
 \string=\glshex 000E\string=\glshex 000F\string=\string'\glshex
0010\string'\string=\glshex 0011
 \string=\glshex 0012\string=\glshex 0013\string=\glshex 0014\string=\glshex 0015
 \string=\glshex 0016\string=\glshex 0017\string=\glshex 0018\string=\glshex 0019
 \string=\glshex 001A\string=\glshex 001B\string=\glshex 001C\string=\glshex 001D
 \string=\glshex 001E\string=\glshex 001F\string=\glshex 007F\string=\glshex 0080
 \string=\glshex 0081\string=\glshex 0082\string=\glshex 0083\string=\glshex 0084
 \string=\glshex 0085\string=\glshex 0086\string=\glshex 0087\string=\glshex 0088
 \string=\glshex 0089\string=\glshex 008A\string=\glshex 008B\string=\glshex 008C
 \string=\glshex 008D\string=\glshex 008E\string=\glshex 008F\string=\glshex 0090
 \string=\glshex 0091\string=\glshex 0092\string=\glshex 0093\string=\glshex 0094
 \string=\glshex 0095\string=\glshex 0096\string=\glshex 0097\string=\glshex 0098
 \string=\glshex 0099\string=\glshex 009A\string=\glshex 009B\string=\glshex 009C
 \string=\glshex 009D\string=\glshex 009E\string=\glshex 009F
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrcontrolIrules}
%\changes{1.54}{2025-01-03}{new}
%Subset of control rules. Doesn't include 0, 1C, 1D, 1E, 1F, and 7F.
%    \begin{macrocode}
\newcommand*{\glsxtrcontrolIrules}{%
 \string'\glshex 200B\string'\string=\glshex 200C\string=\glshex 200D
 \string=\glshex 200E\string=\glshex 200F\string=\glshex 0001
 \string=\glshex 0002\string=\glshex 0003\string=\glshex 0004\string=\glshex 0005
 \string=\glshex 0006\string=\glshex 0007\string=\glshex 0008
 \string=\string'\glshex 0009\string'\string=\string'\glshex 000B\string'
 \string=\glshex 000E\string=\glshex 000F\string=\string'\glshex
0010\string'\string=\glshex 0011
 \string=\glshex 0012\string=\glshex 0013\string=\glshex 0014\string=\glshex 0015
 \string=\glshex 0016\string=\glshex 0017\string=\glshex 0018\string=\glshex 0019
 \string=\glshex 001A\string=\glshex 001B\string=\glshex 0080
 \string=\glshex 0081\string=\glshex 0082\string=\glshex 0083\string=\glshex 0084
 \string=\glshex 0085\string=\glshex 0086\string=\glshex 0087\string=\glshex 0088
 \string=\glshex 0089\string=\glshex 008A\string=\glshex 008B\string=\glshex 008C
 \string=\glshex 008D\string=\glshex 008E\string=\glshex 008F\string=\glshex 0090
 \string=\glshex 0091\string=\glshex 0092\string=\glshex 0093\string=\glshex 0094
 \string=\glshex 0095\string=\glshex 0096\string=\glshex 0097\string=\glshex 0098
 \string=\glshex 0099\string=\glshex 009A\string=\glshex 009B\string=\glshex 009C
 \string=\glshex 009D\string=\glshex 009E\string=\glshex 009F
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrcontrolIIrules}
%\changes{1.54}{2025-01-03}{new}
%Subset of ordered control rules (information separators). Doesn't include 7F.
%    \begin{macrocode}
\newcommand*{\glsxtrcontrolIIrules}{%
 \glshex 001C\string<\glshex 001D
 \string<\glshex 001E\string<\glshex 001F
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrspacerules}
%\changes{1.27}{2018-02-26}{new}
%These are space characters.
%    \begin{macrocode}
\newcommand*{\glsxtrspacerules}{%
 \string' \string'\string;
 \string'\glshex 00A0\string'\string;
 \string'\glshex 2000\string'\string;
 \string'\glshex 2001\string'\string;
 \string'\glshex 2002\string'\string;
 \string'\glshex 2003\string'\string;
 \string'\glshex 2004\string'\string;
 \string'\glshex 2005\string'\string;
 \string'\glshex 2006\string'\string;
 \string'\glshex 2007\string'\string;
 \string'\glshex 2008\string'\string;
 \string'\glshex 2009\string'\string;
 \string'\glshex 200A\string'\string;
 \string'\glshex 3000\string'
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrnonprintablerules}
%\changes{1.27}{2018-02-26}{new}
%These are non-printable characters (BOM, tabs, line feed and carriage
%return).
%    \begin{macrocode}
\newcommand*{\glsxtrnonprintablerules}{%
 \string'\glshex FEFF\string'\string;
 \string'\glshex 000A\string'\string;
 \string'\glshex 0009\string'\string;
 \string'\glshex 000C\string'\string;
 \string'\glshex 000B\string'
}
%    \end{macrocode}
%\end{macro}

%\begin{macro}{\glsxtrcombiningdiacriticrules}
%\changes{1.27}{2018-02-26}{new}
%Combining diacritic marks. This is split into multiple macros.
%    \begin{macrocode}
\newcommand*{\glsxtrcombiningdiacriticrules}{%
 \glsxtrcombiningdiacriticIrules\string;
 \glsxtrcombiningdiacriticIIrules\string;
 \glsxtrcombiningdiacriticIIIrules\string;
 \glsxtrcombiningdiacriticIVrules
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrcombiningdiacriticIrules}
%\changes{1.27}{2018-02-26}{new}
%First set of combining diacritic marks.
%    \begin{macrocode}
\newcommand*{\glsxtrcombiningdiacriticIrules}{%
 \glshex 0301\string;% combining acute
 \glshex 0300\string;% combining grave 
 \glshex 0306\string;% combining breve
 \glshex 0302\string;% combining circumflex
 \glshex 030C\string;% combining caron
 \glshex 030A\string;% combining ring
 \glshex 030D\string;% combining vertical line above
 \glshex 0308\string;% combining diaeresis
 \glshex 030B\string;% combining double acute
 \glshex 0303\string;% combining tilde
 \glshex 0307\string;% combining dot above
 \glshex 0304% combining macron
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrcombiningdiacriticIIrules}
%\changes{1.27}{2018-02-26}{new}
%Second set of combining diacritic marks.
%    \begin{macrocode}
\newcommand*{\glsxtrcombiningdiacriticIIrules}{%
 \glshex 0337\string;% combining short solidus overlay
 \glshex 0327\string;% combining cedilla
 \glshex 0328\string;% combining ogonek
 \glshex 0323\string;% combining dot below 
 \glshex 0332\string;% combining low line
 \glshex 0305\string;% combining overline
 \glshex 0309\string;% combining hook above
 \glshex 030E\string;% combining double vertical line above
 \glshex 030F\string;% combining double grave accent
 \glshex 0310\string;% combining candrabindu
 \glshex 0311\string;% combining inverted breve
 \glshex 0312\string;% combining turned comma above
 \glshex 0313\string;% combining comma above
 \glshex 0314\string;% combining reversed comma above
 \glshex 0315\string;% combining comma above right
 \glshex 0316\string;% combining grave accent below
 \glshex 0317% combining acute accent below
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrcombiningdiacriticIIIrules}
%\changes{1.27}{2018-02-26}{new}
%Third set of combining diacritic marks.
%    \begin{macrocode}
\newcommand*{\glsxtrcombiningdiacriticIIIrules}{%
 \glshex 0318\string;% combining left tack below
 \glshex 0319\string;% combining right tack below
 \glshex 031A\string;% combining left angle above
 \glshex 031B\string;% combining horn
 \glshex 031C\string;% combining left half ring below
 \glshex 031D\string;% combining up tack below
 \glshex 031E\string;% combining down tack below
 \glshex 031F\string;% combining plus sign below
 \glshex 0320\string;% combining minus sign below
 \glshex 0321\string;% combining palatalized hook below
 \glshex 0322\string;% combining retroflex hook below
 \glshex 0324\string;% combining diaresis below
 \glshex 0325\string;% combining ring below
 \glshex 0326\string;% combining comma below
 \glshex 0329\string;% combining vertical line below
 \glshex 032A\string;% combining bridge below
 \glshex 032B\string;% combining inverted double arch below
 \glshex 032C\string;% combining caron below
 \glshex 032D\string;% combining circumflex accent below
 \glshex 032E\string;% combining breve below
 \glshex 032F\string;% combining inverted breve below
 \glshex 0330\string;% combining tilde below
 \glshex 0331\string;% combining macron below
 \glshex 0333\string;% combining double low line
 \glshex 0334\string;% combining tilde overlay
 \glshex 0335\string;% combining short stroke overlay
 \glshex 0336\string;% combining long stroke overlay
 \glshex 0338\string;% combining long solidus overlay
 \glshex 0339\string;% combining combining right half ring below
 \glshex 033A\string;% combining inverted bridge below
 \glshex 033B\string;% combining square below
 \glshex 033C\string;% combining seagull below
 \glshex 033D\string;% combining x above
 \glshex 033E\string;% combining vertical tilde
 \glshex 033F\string;% combining double overline
 \glshex 0342\string;% combining Greek perispomeni
 \glshex 0344\string;% combining Greek dialytika tonos
 \glshex 0345\string;% combining Greek ypogegrammeni
 \glshex 0360\string;% combining double tilde
 \glshex 0361\string;% combining double inverted breve
 \glshex 0483\string;% combining Cyrillic titlo
 \glshex 0484\string;% combining Cyrillic palatalization
 \glshex 0485\string;% combining Cyrillic dasia pneumata
 \glshex 0486% combining Cyrillic psili pneumata
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrcombiningdiacriticIVrules}
%\changes{1.27}{2018-02-26}{new}
%Fourth set of combining diacritic marks.
%    \begin{macrocode}
\newcommand*{\glsxtrcombiningdiacriticIVrules}{%
 \glshex 20D0\string;% combining left harpoon above
 \glshex 20D1\string;% combining right harpoon above
 \glshex 20D2\string;% combining long vertical line overlay
 \glshex 20D3\string;% combining short vertical line overlay
 \glshex 20D4\string;% combining anticlockwise arrow above
 \glshex 20D5\string;% combining clockwise arrow above
 \glshex 20D6\string;% combining left arrow above
 \glshex 20D7\string;% combining right arrow above
 \glshex 20D8\string;% combining ring overlay
 \glshex 20D9\string;% combining clockwise ring overlay
 \glshex 20DA\string;% combining anticlockwise ring overlay
 \glshex 20DB\string;% combining three dots above
 \glshex 20DC\string;% combining four dots above
 \glshex 20DD\string;% combining enclosing circle
 \glshex 20DE\string;% combining enclosing square
 \glshex 20DF\string;% combining enclosing diamond
 \glshex 20E0\string;% combining enclosing circle backslash
 \glshex 20E1%  combining left right arrow above
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrhyphenrules}
%\changes{1.27}{2018-02-26}{new}
%Hyphens.
%    \begin{macrocode}
\newcommand*{\glsxtrhyphenrules}{%
 \glsxtrhyphenIrules\string;% hyphens
 \glsxtrminusrules% minus signs
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrhyphenIrules}
%\changes{1.56}{2025-02-07}{new}
%Textual hyphens.
%    \begin{macrocode}
\newcommand*{\glsxtrhyphenIrules}{%
 \string'\string-\string'\string;% ASCII hyphen
 \glshex 00AD\string;% soft hyphen
 \glshex 2010\string;% hyphen
 \glshex 2011\string;% non-breaking hyphen
 \glshex 2012\string;% figure dash
 \glshex 2013\string;% en dash
 \glshex 2014\string;% em dash
 \glshex 2015% horizontal bar
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrhyphenIIrules}
%\changes{1.56}{2025-02-07}{new}
%Alternative rule for textual hyphens.
%    \begin{macrocode}
\newcommand*{\glsxtrhyphenIIrules}{%
 \string'\string-\string'% ASCII hyphen
 \string<\glshex 00AD% soft hyphen
 \string<\glshex 2010% hyphen
 \string<\glshex 2011% non-breaking hyphen
 \string<\glshex 2012% figure dash
 \string<\glshex 2013% en dash
 \string<\glshex 2014% em dash
 \string<\glshex 2015% horizontal bar
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrminusrules}
%\changes{1.56}{2025-02-07}{new}
%Minus signs.
%    \begin{macrocode}
\newcommand*{\glsxtrminusrules}{%
 \glshex 2212\string=\glshex 207B\string=\glshex 208B% minus sign
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncrules}
%\changes{1.27}{2018-02-26}{new}
%General punctuation.
%    \begin{macrocode}
\newcommand*{\glsxtrgeneralpuncrules}{%
  \glsxtrgeneralpuncIrules
  \string<\glsxtrcurrencyrules
  \string<\glsxtrgeneralpuncIIrules
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncIrules}
%\changes{1.27}{2018-02-26}{new}
%First set of general punctuation.
%    \begin{macrocode}
\newcommand*{\glsxtrgeneralpuncIrules}{%
 \glsxtrgeneralpuncmarksrules
 \string<\glsxtrgeneralpuncaccentsrules
 \string<\glsxtrgeneralpuncquoterules
 \string<\glsxtrgeneralpuncbracketrules
 \string<\glsxtrgeneralpuncsignrules
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncmarksrules}
%\changes{1.49}{2022-10-14}{new}
%Punctuation marks subset.
%    \begin{macrocode}
\newcommand*{\glsxtrgeneralpuncmarksrules}{%
 \string'\glshex 005F\string'% underscore
 \string<\glshex 00AF% macron
 \string<\string'\glshex 002C\string'% comma
 \string<\string'\glshex 003B\string'% semi-colon
 \string<\string'\glshex 003A\string'% colon
 \string<\string'\glshex 0021\string'% exclamation mark
 \string<\glshex 00A1% inverted exclamation mark 
 \string<\string'\glshex 003F\string'% question mark
 \string<\glshex 00BF% inverted question mark
 \string<\string'\glshex 002F\string'% solidus
 \string<\string'\glshex 002E\string'% full stop
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncdotrules}
%\changes{1.56}{2025-02-07}{new}
%Punctuation marks subset: dots.
%    \begin{macrocode}
\newcommand*\glsxtrgeneralpuncdotrules{%
  \glshex 2024% one dot leader
  \string<\glshex 2025% two dot leader
  \string<\glshex 2026% horizontal ellipsis
  \string<\glshex 204F% reversed semicolon
  \string<\glshex 205A% vertical two dots
  \string<\glshex 205D% vertical three dots
  \string<\glshex 205E% vertical four dots
  \string<\glshex 2056% three dot punctuation
  \string<\glshex 2058% four dot punctuation
  \string<\glshex 2059% five dot punctuation
  \string<\glshex 205B% four dot mark
  \string<\glshex 203B% reference mark
  \string<\glshex 203C% dotted cross
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncaccentsrules}
%\changes{1.49}{2022-10-14}{new}
%Punctuation marks subset: accent characters.
%    \begin{macrocode}
\newcommand*{\glsxtrgeneralpuncaccentsrules}{%
 \glshex 00B4% acute accent
 \string<\string'\glshex 0060\string'% grave accent
 \string<\string'\glshex 005E\string'% circumflex accent
 \string<\glshex 00A8% diaersis
 \string<\string'\glshex 007E\string'% tilde
 \string<\glshex 00B7% middle dot
 \string<\glshex 00B8% cedilla
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncquoterules}
%\changes{1.49}{2022-10-14}{new}
%Punctuation marks subset: quotes.
%    \begin{macrocode}
\newcommand*{\glsxtrgeneralpuncquoterules}{%
 \string'\glshex 0027\string'% straight apostrophe
 \string<\string'\glshex 0022\string'% straight double quote
 \string<\glshex 00AB% left guillemet
 \string<\glshex 00BB% right guillemet
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncbracketrules}
%\changes{1.49}{2022-10-14}{new}
%Punctuation marks subset: brackets.
%May be redefined to include extra bracket subsets.
%    \begin{macrocode}
\newcommand*{\glsxtrgeneralpuncbracketrules}{%
 \glsxtrgeneralpuncbracketIrules
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncbracketIrules}
%\changes{1.56}{2025-02-07}{new}
%First set of bracket rules (general brackets).
%    \begin{macrocode}
\newcommand*{\glsxtrgeneralpuncbracketIrules}{%
 \string'\glshex 0028\string'% left parenthesis
  \string=\glshex 207D\string=\glshex 208D% super/subscript left parenthesis
 \string<\string'\glshex 0029\string'% right parenthesis
  \string=\glshex 207E\string=\glshex 208E% super/subscript right parenthesis
 \string<\string'\glshex 005B\string'% left square bracket
 \string<\string'\glshex 005D\string'% right square bracket
 \string<\string'\glshex 007B\string'% left curly bracket
 \string<\string'\glshex 007D\string'% right curly bracket
%    \end{macrocode}
%v1.56 added:
%    \begin{macrocode}
 \string<\glshex 2045% left square bracket with quill
 \string<\glshex 2046% right square bracket with quill
 \string<\glshex 2329% left angle bracket
 \string<\glshex 232A% right angle bracket
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncbracketIIrules}
%\changes{1.56}{2025-02-07}{new}
%Second set of bracket rules (miscellaneous mathematical symbols-A).
%    \begin{macrocode}
\newcommand*\glsxtrgeneralpuncbracketIIrules{%
 \glshex 27E6% mathematical left white square bracket
 \string<\glshex 27E7% mathematical right white square bracket
 \string<\glshex 27E8% mathematical left angle bracket
 \string<\glshex 27E9% mathematical right angle bracket
 \string<\glshex 27EA% mathematical left chevron bracket
 \string<\glshex 27EB% mathematical right chevron bracket
 \string<\glshex 27EC% mathematical left white tortoise shell bracket
 \string<\glshex 27ED% mathematical right white tortoise shell bracket
 \string<\glshex 27EE% mathematical left flattened parenthesis
 \string<\glshex 27EF% mathematical right flattened parenthesis
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncbracketIIIrules}
%\changes{1.56}{2025-02-07}{new}
%Third set of bracket rules (miscellaneous mathematical symbols-B).
%    \begin{macrocode}
\newcommand*\glsxtrgeneralpuncbracketIIIrules{%
 \glshex 2983% left white curly bracket
 \string<\glshex 2984% right white curly bracket
 \string<\glshex 2985% left white parenthesis
 \string<\glshex 2986% right white parenthesis
 \string<\glshex 2987% left image bracket
 \string<\glshex 2988% right image bracket
 \string<\glshex 2989% left binding bracket
 \string<\glshex 298A% right binding bracket
 \string<\glshex 298B% left square bracket with underbar
 \string<\glshex 298C% right square bracket with underbar
 \string<\glshex 298D% left square bracket with top tick
 \string<\glshex 298E% right square bracket with bottom tick
 \string<\glshex 298F% left square bracket with bottom tick
 \string<\glshex 2990% right square bracket with top tick
 \string<\glshex 2991% left angle bracket with dot
 \string<\glshex 2992% right angle bracket with dot
 \string<\glshex 2993% left arc less-than bracket
 \string<\glshex 2994% right arc greater-than bracket
 \string<\glshex 2995% double left arc less-than bracket
 \string<\glshex 2996% double right arc greater-than bracket
 \string<\glshex 2997% left black tortoise shell bracket
 \string<\glshex 2998% right black tortoise shell bracket
 \string<\glshex 29FC% left curved angle bracket
 \string<\glshex 29FD% right curved angle bracket
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncbracketIVrules}
%\changes{1.56}{2025-02-07}{new}
%Fourth set of bracket rules (dingbat brackets).
%Quotation marks not included. They should go with other quote
%marks,
%    \begin{macrocode}
\newcommand*\glsxtrgeneralpuncbracketIVrules{%
 \glshex 2768% medium left parenthesis ornament
 \string<\glshex 2769% medium right parenthesis ornament
 \string<\glshex 276A% medium flattened left parenthesis ornament
 \string<\glshex 276B% medium flattened right parenthesis ornament
 \string<\glshex 276C% medium left angle bracket ornament
 \string<\glshex 276D% medium right angle bracket ornament
 \string<\glshex 2770% heavy left angle bracket ornament
 \string<\glshex 2771% heavy right angle bracket ornament
 \string<\glshex 2772% light left tortoise shell bracket ornament
 \string<\glshex 2773% light right tortoise shell bracket ornament
 \string<\glshex 2774% medium left curly bracket ornament
 \string<\glshex 2775% medium right curly bracket ornament
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncsignrules}
%\changes{1.49}{2022-10-14}{new}
%Punctuation marks subset: signs.
%    \begin{macrocode}
\newcommand*{\glsxtrgeneralpuncsignrules}{%
 \glshex 00A7% section sign
 \string<\glshex 00B6% pilcrow sign
 \string<\glshex 00A9% copyright sign
 \string<\glshex 00AE% registered sign
 \string<\string'\glshex 0040\string'% at sign
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrcurrencyrules}
%\changes{1.27}{2018-02-26}{new}
%General punctuation.
%    \begin{macrocode}
\newcommand*{\glsxtrcurrencyrules}{%
 \glshex 00A4% currency sign
 \string<\glshex 0E3F% Thai currency symbol baht
 \string<\glshex 00A2% cent sign
 \string<\glshex 20A1% colon sign
 \string<\glshex 20A2% cruzeiro sign
 \string<\string'\glshex 0024\string'% dollar sign
 \string<\glshex 20AB% dong sign
 \string<\glshex 20AC% euro sign
 \string<\glshex 20A3% French franc sign
 \string<\glshex 20A4% lira sign
 \string<\glshex 20A5% mill sign
 \string<\glshex 20A6% naira sign
 \string<\glshex 20A7% peseta sign
 \string<\glshex 00A3% pound sign
 \string<\glshex 20A8% rupee sign
 \string<\glshex 20AA% new sheqel sign
 \string<\glshex 20A9% won sign
 \string<\glshex 00A5% yen sign
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncIIrules}
%\changes{1.27}{2018-02-26}{new}
%Second set of general punctuation.
%    \begin{macrocode}
\newcommand*{\glsxtrgeneralpuncIIrules}{%
 \string'\glshex 002A\string'% asterisk
 \string<\string'\glshex 005C\string'% backslash
 \string<\string'\glshex 0026\string'% ampersand
 \string<\string'\glshex 0023\string'% hash sign
 \string<\string'\glshex 0025\string'% percent sign
 \string<\string'\glshex 002B\string'% plus sign
  \string=\glshex 207A\string=\glshex 208A% super/subscript plus sign
 \string<\glshex 00B1% plus-minus sign
 \string<\glshex 00F7% division sign
 \string<\glshex 00D7% multiplication sign
 \string<\string'\glshex 003C\string'% less-than sign
 \string<\string'\glshex 003D\string'% equals sign
 \string<\string'\glshex 003E\string'% greater-than sign
 \string<\glshex 00AC% not sign
 \string<\string'\glshex 007C\string'% vertical bar (pipe)
 \string<\glshex 00A6% broken bar 
 \string<\glshex 00B0% degree sign
 \string<\glshex 00B5% micron sign
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrgeneralpuncIIIrules}
%\changes{1.56}{2025-02-07}{new}
%Alternative set of general punctuation.
%    \begin{macrocode}
\newcommand*{\glsxtrgeneralpuncIIIrules}{%
 \string'\glshex 002A\string'% asterisk
 \string<\string'\glshex 005C\string'% backslash
 \string<\string'\glshex 0026\string'% ampersand
 \string<\string'\glshex 0023\string'% hash sign
 \string<\string'\glshex 0025\string'% percent sign
 \string<\glsxtrhyphenIIrules % hyphens
 \string<\glshex 2052% commercial minus sign
 \string<\glsxtrminusrules % minus signs
 \string<\string'\glshex 002B\string'% plus sign
  \string=\glshex 207A\string=\glshex 208A% super/subscript plus sign
 \string<\glshex 00B1% plus-minus sign
 \string<\glshex 00F7% division sign
 \string<\glshex 00D7% multiplication sign
 \string<\string'\glshex 003C\string'% less-than sign
 \string<\string'\glshex 003D\string'% equals sign
 \string<\string'\glshex 003E\string'% greater-than sign
 \string<\glshex 00AC% not sign
 \string<\string'\glshex 007C\string'% vertical bar (pipe)
 \string<\glshex 00A6% broken bar 
 \string<\glshex 00B0% degree sign
 \string<\glshex 00B5% micron sign
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralLatinIrules}
%\changes{1.27}{2018-02-26}{new}
%Basic Latin alphabet.
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinIrules}{%
 \glsxtrLatinA
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS 
 \string<\glsxtrLatinT
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralLatinIIrules}
%\changes{1.27}{2018-02-26}{new}
%General Latin alphabet (eth between D and E, \ss\ treated as SS).
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinIIrules}{%
 \glsxtrLatinA
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinEth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS
 \string& SS \string, \glsxtrLatinEszettSs
 \string<\glsxtrLatinT
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralLatinIIIrules}
%\changes{1.27}{2018-02-26}{new}
%General Latin alphabet (eth between D and E, \ss\ treated as SZ).
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinIIIrules}{%
 \glsxtrLatinA
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinEth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS 
 \string& SZ, \glsxtrLatinEszettSz
 \string<\glsxtrLatinT
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralLatinIVrules}
%\changes{1.27}{2018-02-26}{new}
%General Latin alphabet (\AE\ treated as AE and \OE treated as OE,
%\TH treated as TH, \ss\ treated as SS, eth between D and E).
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinIVrules}{%
 \glsxtrLatinA
 \string& AE , \glsxtrLatinAELigature
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinEth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string& OE , \glsxtrLatinOELigature
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS 
 \string& SS , \glsxtrLatinEszettSs
 \string<\glsxtrLatinT
 \string& th =\glshex 00DE 
 \string& TH =\glshex 00FE 
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralLatinVrules}
%\changes{1.27}{2018-02-26}{new}
%General Latin alphabet (eth between D and E, \ss\ treated as SS,
%\TH\ treated as TH).
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinVrules}{%
 \glsxtrLatinA
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinEth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS
 \string& SS , \glsxtrLatinEszettSs
 \string<\glsxtrLatinT
 \string& th =\glshex 00DE 
 \string& TH =\glshex 00FE 
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralLatinVIrules}
%\changes{1.27}{2018-02-26}{new}
%General Latin alphabet (eth between D and E, \ss\ treated as SZ,
%\TH\ treated as TH).
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinVIrules}{%
 \glsxtrLatinA
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinEth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS
 \string& SZ , \glsxtrLatinEszettSz
 \string<\glsxtrLatinT
 \string& th =\glshex 00DE 
 \string& TH =\glshex 00FE 
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralLatinVIIrules}
%\changes{1.27}{2018-02-26}{new}
%General Latin alphabet (\AE\ between A and B, eth between D and E,
%insular G as G, \OE\ between O and P, long S equivalent to S, 
%\TH\ between T and U and wynn as W).
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinVIIrules}{%
 \glsxtrLatinA
 \string<\glsxtrLatinAELigature
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinEth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<\glsxtrLatinInsularG
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinOELigature
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glshex 017F=\glsxtrLatinS % s and long s 
 \string<\glsxtrLatinT
 \string<\glsxtrLatinThorn
 \string<u,U%
 \string<v,V%
 \string< w\string=\glshex 01BF, W\string=\glshex 01F7
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralLatinVIIIrules}
%\changes{1.27}{2018-02-26}{new}
%General Latin alphabet (\AE\ treated as AE and \OE treated as OE,
%\TH treated as TH, \ss\ treated as SS, eth treated as D, \O\
%treated as O, \L\ treated as L).
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinVIIIrules}{%
 \glsxtrLatinA
 \string& AE , \glsxtrLatinAELigature
 \string<b,B%
 \string<c,C%
 \string<\glshex 00F0\string;d,\glshex 00D0\string;D% D and eth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glshex 0142\string=\glsxtrLatinL\string=\glshex 0141% L and \L
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glshex 00F8\string=\glsxtrLatinO\string=\glshex 00D8% O and \O
 \string& OE , \glsxtrLatinOELigature
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS
 \string& SS , \glsxtrLatinEszettSs
 \string<\glsxtrLatinT
 \string& th =\glshex 00DE 
 \string& TH =\glshex 00FE 
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
%    \end{macrocode}
%\end{macro}
%
%Fragments.
%\begin{macro}{\glsxtrGeneralLatinAtoMrules}
%\changes{1.49}{2022-10-14}{new}
%Basic Latin alphabet A--M.
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinAtoMrules}{%
 \glsxtrLatinA
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralLatinNtoZrules}
%\changes{1.49}{2022-10-14}{new}
%Basic Latin alphabet N--Z.
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinNtoZrules}{%
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS 
 \string<\glsxtrLatinT
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralLatinAtoGrules}
%\changes{1.49}{2022-10-14}{new}
%Basic Latin alphabet A--G.
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinAtoGrules}{%
 \glsxtrLatinA
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralLatinHtoMrules}
%\changes{1.49}{2022-10-14}{new}
%Basic Latin alphabet H--M.
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinHtoMrules}{%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrGeneralLatinNtoSrules}
%\changes{1.49}{2022-10-14}{new}
%Basic Latin alphabet N--S.
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinNtoSrules}{%
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS 
}
%    \end{macrocode}
%\end{macro}
%
%
%\begin{macro}{\glsxtrGeneralLatinTtoZrules}
%\changes{1.49}{2022-10-14}{new}
%Basic Latin alphabet T--Z.
%    \begin{macrocode}
\newcommand*{\glsxtrGeneralLatinTtoZrules}{%
 \string<\glsxtrLatinT
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z
}
%    \end{macrocode}
%\end{macro}
%
%
%\begin{macro}{\glsxtrLatinA}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinA}{%
  a\string=\glshex 00AA\string=\glshex 2090,A
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinE}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinE}{%
  e\string=\glshex 2091,E
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinH}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinH}{%
  h\string=\glshex 2095,H
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinI}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinI}{%
  i\string=\glshex 2071,I
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinK}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinK}{%
  k\string=\glshex 2096,K
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinL}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinL}{%
  l\string=\glshex 2097,L
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinM}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinM}{%
  m\string=\glshex 2098,M
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinN}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinN}{%
  n\string=\glshex 207F\string=\glshex 2099,N
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinO}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinO}{%
  o\string=\glshex 00BA\string=\glshex 2092,O
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinP}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinP}{%
  p\string=\glshex 209A,P
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinS}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinS}{%
  s\string=\glshex 209B,S
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinT}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinT}{%
  t\string=\glshex 209C,T
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinX}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinX}{%
  x\string=\glshex 2093,X
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinSchwa}
%\changes{1.27}{2018-02-26}{new}
%Latin schwa (lower case, subscript and upper case).
%    \begin{macrocode}
\newcommand*{\glsxtrLatinSchwa}{%
  \glshex 0259\string=\glshex 2094,\glshex 018F
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinEszettSs}
%\changes{1.27}{2018-02-26}{new}
%\SS=ss
%    \begin{macrocode}
\newcommand*{\glsxtrLatinEszettSs}{%
 \glshex 00DF% eszett
 \string=\glshex 017Fs % "long S"s 
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinEszettSz}
%\changes{1.27}{2018-02-26}{new}
%\SS=sz
%    \begin{macrocode}
\newcommand*{\glsxtrLatinEszettSz}{%
 \glshex 00DF% eszett
 \string= \glshex 017Fz % "long S"z 
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinEth}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinEth}{%
 \glshex 00F0,\glshex 00D0% eth
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinThorn}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinThorn}{%
 \glshex 00FE,\glshex 00DE% thorn
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinAELigature}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinAELigature}{%
 \glshex 00E6,\glshex 00C6% AE-ligature
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinOELigature}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinOELigature}{%
 \glshex 0153,\glshex 0152% OE-ligature
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinAA}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinAA}{%
 \glshex 00E5=a\glshex 030A,% \aa
 \glshex 00C5=A\glshex 030A% \AA
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinWynn}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinWynn}{%
 \glshex 01BF,\glshex 01F7% wynn
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinInsularG}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinInsularG}{%
 \glshex 1D79,\glshex A77D% insular G
 \string; g, G
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinOslash}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinOslash}{%
 \glshex 00F8,\glshex 00D8% \o, \O
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrLatinLslash}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrLatinLslash}{%
 \glshex 0142,\glshex 0141% \l, \L
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathUpGreekIrules}
%\changes{1.27}{2018-02-26}{new}
%Includes digamma between epsilon and zeta.
%    \begin{macrocode}
\newcommand*{\glsxtrMathUpGreekIrules}{%
 \glsxtrUpAlpha
 \string<\glsxtrUpBeta
 \string<\glsxtrUpGamma
 \string<\glsxtrUpDelta
 \string<\glsxtrUpEpsilon
 \string<\glsxtrUpDigamma
 \string<\glsxtrUpZeta
 \string<\glsxtrUpEta
 \string<\glsxtrUpTheta
 \string<\glsxtrUpIota
 \string<\glsxtrUpKappa
 \string<\glsxtrUpLambda
 \string<\glsxtrUpMu
 \string<\glsxtrUpNu
 \string<\glsxtrUpXi
 \string<\glsxtrUpOmicron
 \string<\glsxtrUpPi
 \string<\glsxtrUpRho
 \string<\glsxtrUpSigma
 \string<\glsxtrUpTau
 \string<\glsxtrUpUpsilon
 \string<\glsxtrUpPhi
 \string<\glsxtrUpChi
 \string<\glsxtrUpPsi
 \string<\glsxtrUpOmega
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathUpGreekIIrules}
%\changes{1.27}{2018-02-26}{new}
%Doesn't include digamma.
%    \begin{macrocode}
\newcommand*{\glsxtrMathUpGreekIIrules}{%
 \glsxtrUpAlpha
 \string<\glsxtrUpBeta
 \string<\glsxtrUpGamma
 \string<\glsxtrUpDelta
 \string<\glsxtrUpEpsilon
 \string<\glsxtrUpZeta
 \string<\glsxtrUpEta
 \string<\glsxtrUpTheta
 \string<\glsxtrUpIota
 \string<\glsxtrUpKappa
 \string<\glsxtrUpLambda
 \string<\glsxtrUpMu
 \string<\glsxtrUpNu
 \string<\glsxtrUpXi
 \string<\glsxtrUpOmicron
 \string<\glsxtrUpPi
 \string<\glsxtrUpRho
 \string<\glsxtrUpSigma
 \string<\glsxtrUpTau
 \string<\glsxtrUpUpsilon
 \string<\glsxtrUpPhi
 \string<\glsxtrUpChi
 \string<\glsxtrUpPsi
 \string<\glsxtrUpOmega
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicGreekIrules}
%\changes{1.27}{2018-02-26}{new}
%Includes (upright) digamma between epsilon and zeta (there isn't
%an italic digamma), so don't mix with \cs{glsxtrMathUpGreekIrules}
%or there may be unexpected results.
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicGreekIrules}{%
 \glsxtrMathItalicAlpha
 \string<\glsxtrMathItalicBeta
 \string<\glsxtrMathItalicGamma
 \string<\glsxtrMathItalicDelta
 \string<\glsxtrMathItalicEpsilon
 \string<\glsxtrUpDigamma
 \string<\glsxtrMathItalicZeta
 \string<\glsxtrMathItalicEta
 \string<\glsxtrMathItalicTheta
 \string<\glsxtrMathItalicIota
 \string<\glsxtrMathItalicKappa
 \string<\glsxtrMathItalicLambda
 \string<\glsxtrMathItalicMu
 \string<\glsxtrMathItalicNu
 \string<\glsxtrMathItalicXi
 \string<\glsxtrMathItalicOmicron
 \string<\glsxtrMathItalicPi
 \string<\glsxtrMathItalicRho
 \string<\glsxtrMathItalicSigma
 \string<\glsxtrMathItalicTau
 \string<\glsxtrMathItalicUpsilon
 \string<\glsxtrMathItalicPhi
 \string<\glsxtrMathItalicChi
 \string<\glsxtrMathItalicPsi
 \string<\glsxtrMathItalicOmega
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicGreekIIrules}
%\changes{1.27}{2018-02-26}{new}
%Doesn't include digamma.
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicGreekIIrules}{%
 \glsxtrMathItalicAlpha
 \string<\glsxtrMathItalicBeta
 \string<\glsxtrMathItalicGamma
 \string<\glsxtrMathItalicDelta
 \string<\glsxtrMathItalicEpsilon
 \string<\glsxtrMathItalicZeta
 \string<\glsxtrMathItalicEta
 \string<\glsxtrMathItalicTheta
 \string<\glsxtrMathItalicIota
 \string<\glsxtrMathItalicKappa
 \string<\glsxtrMathItalicLambda
 \string<\glsxtrMathItalicMu
 \string<\glsxtrMathItalicNu
 \string<\glsxtrMathItalicXi
 \string<\glsxtrMathItalicOmicron
 \string<\glsxtrMathItalicPi
 \string<\glsxtrMathItalicRho
 \string<\glsxtrMathItalicSigma
 \string<\glsxtrMathItalicTau
 \string<\glsxtrMathItalicUpsilon
 \string<\glsxtrMathItalicPhi
 \string<\glsxtrMathItalicChi
 \string<\glsxtrMathItalicPsi
 \string<\glsxtrMathItalicOmega
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicUpperGreekIrules}
%\changes{1.27}{2018-02-26}{new}
%Upper case only (includes upright digamma).
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicUpperGreekIrules}{%
 \glshex 1D6E2% upper case alpha (maths italic)
 \string<\glshex 1D6E3% upper case beta (maths italic)
 \string<\glshex 1D6E4% upper case gamma (maths italic)
 \string<\glshex 1D6E5% upper case delta (maths italic)
 \string<\glshex 1D6E6% upper case epsilon (maths italic)
 \string<\glshex 03DC% upper case digamma
 \string<\glshex 1D6E7% upper case zeta (maths italic)
 \string<\glshex 1D6E8% upper case eta (maths italic)
 \string<\glshex 1D6E9% upper case theta (maths italic)
 \string=\glshex 1D6F3% upper case theta variant (maths italic)
 \string<\glshex 1D6EA% upper case iota (maths italic)
 \string<\glshex 1D6EB% upper case kappa (maths italic)
 \string<\glshex 1D6EC% upper case lambda (maths italic)
 \string<\glshex 1D6ED% upper case mu (maths italic)
 \string<\glshex 1D6EE% upper case nu (maths italic)
 \string<\glshex 1D6EF% upper case xi (maths italic)
 \string<\glshex 1D6F0% upper case omicron (maths italic)
 \string<\glshex 1D6F1% upper case pi (maths italic)
 \string<\glshex 1D6F2% upper case rho (maths italic)
 \string<\glshex 1D6F4% upper case sigma (maths italic)
 \string<\glshex 1D6F5% upper case tau (maths italic)
 \string<\glshex 1D6F6% upper case upsilon (maths italic)
 \string<\glshex 1D6F7% upper case phi (maths italic)
 \string<\glshex 1D6F8% upper case chi (maths italic)
 \string<\glshex 1D6F9% upper case psi (maths italic)
 \string<\glshex 1D6FA% upper case omega (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicUpperGreekIIrules}
%\changes{1.27}{2018-02-26}{new}
%Upper case only (doesn't include upright digamma).
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicUpperGreekIIrules}{%
 \glshex 1D6E2% upper case alpha (maths italic)
 \string<\glshex 1D6E3% upper case beta (maths italic)
 \string<\glshex 1D6E4% upper case gamma (maths italic)
 \string<\glshex 1D6E5% upper case delta (maths italic)
 \string<\glshex 1D6E6% upper case epsilon (maths italic)
 \string<\glshex 1D6E7% upper case zeta (maths italic)
 \string<\glshex 1D6E8% upper case eta (maths italic)
 \string<\glshex 1D6E9% upper case theta (maths italic)
 \string=\glshex 1D6F3% upper case theta variant (maths italic)
 \string<\glshex 1D6EA% upper case iota (maths italic)
 \string<\glshex 1D6EB% upper case kappa (maths italic)
 \string<\glshex 1D6EC% upper case lambda (maths italic)
 \string<\glshex 1D6ED% upper case mu (maths italic)
 \string<\glshex 1D6EE% upper case nu (maths italic)
 \string<\glshex 1D6EF% upper case xi (maths italic)
 \string<\glshex 1D6F0% upper case omicron (maths italic)
 \string<\glshex 1D6F1% upper case pi (maths italic)
 \string<\glshex 1D6F2% upper case rho (maths italic)
 \string<\glshex 1D6F4% upper case sigma (maths italic)
 \string<\glshex 1D6F5% upper case tau (maths italic)
 \string<\glshex 1D6F6% upper case upsilon (maths italic)
 \string<\glshex 1D6F7% upper case phi (maths italic)
 \string<\glshex 1D6F8% upper case chi (maths italic)
 \string<\glshex 1D6F9% upper case psi (maths italic)
 \string<\glshex 1D6FA% upper case omega (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicLowerGreekIrules}
%\changes{1.27}{2018-02-26}{new}
%Lower case only (includes upright digamma).
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicLowerGreekIrules}{%
 \glshex 1D6FC% lower case alpha (maths italic)
 \string<\glshex 1D6FD% lower case beta (maths italic)
 \string<\glshex 1D6FE% lower case gamma (maths italic)
 \string<\glshex 1D6FF% lower case delta (maths italic)
 \string<\glshex 1D700% lower case epsilon (maths italic)
 \string=\glshex 1D716% lower case epsilon variant (maths italic)
 \string<\glshex 03DD% lower case digamma
 \string<\glshex 1D701% lower case zeta (maths italic)
 \string<\glshex 1D702% lower case eta (maths italic)
 \string<\glshex 1D703% lower case theta (maths italic)
 \string=\glshex 1D717% lower case theta variant (maths italic)
 \string<\glshex 1D704% lower case iota (maths italic)
 \string<\glshex 1D705% lower case kappa (maths italic)
 \string=\glshex 1D718% lower case kappa variant (maths italic)
 \string<\glshex 1D706% lower case lambda (maths italic)
 \string<\glshex 1D707% lower case mu (maths italic)
 \string<\glshex 1D708% lower case nu (maths italic)
 \string<\glshex 1D709% lower case xi (maths italic)
 \string<\glshex 1D70A% lower case omicron (maths italic)
 \string<\glshex 1D70B% lower case pi (maths italic)
 \string=\glshex 1D71B% lower case pi variant (maths italic)
 \string<\glshex 1D70C% lower case rho (maths italic)
 \string=\glshex 1D71A% lower case rho variant (maths italic)
 \string<\glshex 1D70D% lower case final sigma (maths italic)
 \string=\glshex 1D70E% lower case sigma (maths italic)
 \string<\glshex 1D70F% lower case tau (maths italic)
 \string<\glshex 1D710% lower case upsilon (maths italic)
 \string<\glshex 1D711% lower case phi (maths italic)
 \string=\glshex 1D719% lower case phi variant (maths italic)
 \string<\glshex 1D712% lower case chi (maths italic)
 \string<\glshex 1D713% lower case psi (maths italic)
 \string<\glshex 1D714% lower case omega (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicLowerGreekIIrules}
%\changes{1.27}{2018-02-26}{new}
%Lower case only (doesn't includes upright digamma).
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicLowerGreekIIrules}{%
 \glshex 1D6FC% lower case alpha (maths italic)
 \string<\glshex 1D6FD% lower case beta (maths italic)
 \string<\glshex 1D6FE% lower case gamma (maths italic)
 \string<\glshex 1D6FF% lower case delta (maths italic)
 \string<\glshex 1D700% lower case epsilon (maths italic)
 \string=\glshex 1D716% lower case epsilon variant (maths italic)
 \string<\glshex 1D701% lower case zeta (maths italic)
 \string<\glshex 1D702% lower case eta (maths italic)
 \string<\glshex 1D703% lower case theta (maths italic)
 \string=\glshex 1D717% lower case theta variant (maths italic)
 \string<\glshex 1D704% lower case iota (maths italic)
 \string<\glshex 1D705% lower case kappa (maths italic)
 \string=\glshex 1D718% lower case kappa variant (maths italic)
 \string<\glshex 1D706% lower case lambda (maths italic)
 \string<\glshex 1D707% lower case mu (maths italic)
 \string<\glshex 1D708% lower case nu (maths italic)
 \string<\glshex 1D709% lower case xi (maths italic)
 \string<\glshex 1D70A% lower case omicron (maths italic)
 \string<\glshex 1D70B% lower case pi (maths italic)
 \string=\glshex 1D71B% lower case pi variant (maths italic)
 \string<\glshex 1D70C% lower case rho (maths italic)
 \string=\glshex 1D71A% lower case rho variant (maths italic)
 \string<\glshex 1D70D% lower case final sigma (maths italic)
 \string=\glshex 1D70E% lower case sigma (maths italic)
 \string<\glshex 1D70F% lower case tau (maths italic)
 \string<\glshex 1D710% lower case upsilon (maths italic)
 \string<\glshex 1D711% lower case phi (maths italic)
 \string=\glshex 1D719% lower case phi variant (maths italic)
 \string<\glshex 1D712% lower case chi (maths italic)
 \string<\glshex 1D713% lower case psi (maths italic)
 \string<\glshex 1D714% lower case omega (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathGreekIrules}
%\changes{1.27}{2018-02-26}{new}
%Includes both upright and italic with digamma between epsilon and
%zeta.
%    \begin{macrocode}
\newcommand*{\glsxtrMathGreekIrules}{%
 \glsxtrMathItalicAlpha
 \string;\glsxtrUpAlpha
 \string<\glsxtrMathItalicBeta
 \string;\glsxtrUpBeta
 \string<\glsxtrMathItalicGamma
 \string;\glsxtrUpGamma
 \string<\glsxtrMathItalicDelta
 \string;\glsxtrUpDelta
 \string<\glsxtrMathItalicEpsilon
 \string;\glsxtrUpEpsilon
 \string<\glsxtrUpDigamma
 \string<\glsxtrMathItalicZeta
 \string;\glsxtrUpZeta
 \string<\glsxtrMathItalicEta
 \string;\glsxtrUpEta
 \string<\glsxtrMathItalicTheta
 \string;\glsxtrUpTheta
 \string<\glsxtrMathItalicIota
 \string;\glsxtrUpIota
 \string<\glsxtrMathItalicKappa
 \string;\glsxtrUpKappa
 \string<\glsxtrMathItalicLambda
 \string;\glsxtrUpLambda
 \string<\glsxtrMathItalicMu
 \string;\glsxtrUpMu
 \string<\glsxtrMathItalicNu
 \string;\glsxtrUpNu
 \string<\glsxtrMathItalicXi
 \string;\glsxtrUpXi
 \string<\glsxtrMathItalicOmicron
 \string;\glsxtrUpOmicron
 \string<\glsxtrMathItalicPi
 \string;\glsxtrUpPi
 \string<\glsxtrMathItalicRho
 \string;\glsxtrUpRho
 \string<\glsxtrMathItalicSigma
 \string;\glsxtrUpSigma
 \string<\glsxtrMathItalicTau
 \string;\glsxtrUpTau
 \string<\glsxtrMathItalicUpsilon
 \string;\glsxtrUpUpsilon
 \string<\glsxtrMathItalicPhi
 \string;\glsxtrUpPhi
 \string<\glsxtrMathItalicChi
 \string;\glsxtrUpChi
 \string<\glsxtrMathItalicPsi
 \string;\glsxtrUpPsi
 \string<\glsxtrMathItalicOmega
 \string;\glsxtrUpOmega
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathGreekIIrules}
%\changes{1.27}{2018-02-26}{new}
%Includes both upright and italic (digamma not included).
%    \begin{macrocode}
\newcommand*{\glsxtrMathGreekIIrules}{%
 \glsxtrMathItalicAlpha
 \string;\glsxtrUpAlpha
 \string<\glsxtrMathItalicBeta
 \string;\glsxtrUpBeta
 \string<\glsxtrMathItalicGamma
 \string;\glsxtrUpGamma
 \string<\glsxtrMathItalicDelta
 \string;\glsxtrUpDelta
 \string<\glsxtrMathItalicEpsilon
 \string;\glsxtrUpEpsilon
 \string<\glsxtrMathItalicZeta
 \string;\glsxtrUpZeta
 \string<\glsxtrMathItalicEta
 \string;\glsxtrUpEta
 \string<\glsxtrMathItalicTheta
 \string;\glsxtrUpTheta
 \string<\glsxtrMathItalicIota
 \string;\glsxtrUpIota
 \string<\glsxtrMathItalicKappa
 \string;\glsxtrUpKappa
 \string<\glsxtrMathItalicLambda
 \string;\glsxtrUpLambda
 \string<\glsxtrMathItalicMu
 \string;\glsxtrUpMu
 \string<\glsxtrMathItalicNu
 \string;\glsxtrUpNu
 \string<\glsxtrMathItalicXi
 \string;\glsxtrUpXi
 \string<\glsxtrMathItalicOmicron
 \string;\glsxtrUpOmicron
 \string<\glsxtrMathItalicPi
 \string;\glsxtrUpPi
 \string<\glsxtrMathItalicRho
 \string;\glsxtrUpRho
 \string<\glsxtrMathItalicSigma
 \string;\glsxtrUpSigma
 \string<\glsxtrMathItalicTau
 \string;\glsxtrUpTau
 \string<\glsxtrMathItalicUpsilon
 \string;\glsxtrUpUpsilon
 \string<\glsxtrMathItalicPhi
 \string;\glsxtrUpPhi
 \string<\glsxtrMathItalicChi
 \string;\glsxtrUpChi
 \string<\glsxtrMathItalicPsi
 \string;\glsxtrUpPsi
 \string<\glsxtrMathItalicOmega
 \string;\glsxtrUpOmega
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpAlpha}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpAlpha}{%
 \glshex 03B1,% lower case alpha
 \glshex 0391% upper case alpha
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpBeta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpBeta}{%
 \glshex 03B2,% lower case beta
 \glshex 0392% upper case beta
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpGamma}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpGamma}{%
 \glshex 03B3,% lower case gamma
 \glshex 0393% upper case gamma
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpDelta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpDelta}{%
 \glshex 03B4,% lower case delta
 \glshex 0394% upper case delta
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpEpsilon}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpEpsilon}{%
 \glshex 03B5% lower case epsilon
 \string=\glshex 03F5,% lower case epsilon variant
 \glshex 0395% upper case epsilon
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpDigamma}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpDigamma}{%
 \glshex 03DD,% lower case digamma
 \glshex 03DC% upper case digamma
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpZeta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpZeta}{%
 \glshex 03B6,% lower case zeta
 \glshex 0396% upper case zeta
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpEta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpEta}{%
 \glshex 03B7,% lower case eta
 \glshex 0397% upper case eta
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpTheta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpTheta}{%
 \glshex 03B8% lower case theta
 \string=\glshex 03D1,% lower case theta variant
 \glshex 0398% upper case theta
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpIota}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpIota}{%
 \glshex 03B9,% lower case iota
 \glshex 0399% upper case iota
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpKappa}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpKappa}{%
 \glshex 03BA% lower case kappa
 \string=\glshex 03F0,% lower case kappa variant
 \glshex 039A% upper case kappa
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpLambda}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpLambda}{%
 \glshex 03BB,% lower lambda
 \glshex 039B% upper case lambda
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpMu}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpMu}{%
 \glshex 03BC,% lower case mu
 \glshex 039C% upper case mu
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpNu}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpNu}{%
 \glshex 03BD,% lower case nu
 \glshex 039D% upper case nu
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpXi}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpXi}{%
 \glshex 03BE,% lower case xi
 \glshex 039E% upper case xi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpOmicron}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpOmicron}{%
 \glshex 03BF,% lower case omicron
 \glshex 039F% upper case omicron
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpPi}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpPi}{%
 \glshex 03C0% lower case pi
 \string=\glshex 03D6,% lower case pi variant
 \glshex 03A0% upper case pi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpRho}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpRho}{%
 \glshex 03C1% lower case rho
 \string=\glshex 03F1,% lower case rho variant
 \glshex 03A1% upper case rho
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpSigma}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpSigma}{%
 \glshex 03C2% lower case sigma
 \string=\glshex 03C3,% lower case sigma
 \glshex 03A3% upper case sigma
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpTau}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpTau}{%
 \glshex 03C4,% lower case tau
 \glshex 03A4% upper case tau
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpUpsilon}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpUpsilon}{%
 \glshex 03C5,% lower case upsilon
 \glshex 03A5% upper case upsilon
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpPhi}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpPhi}{%
 \glshex 03C6% lower case phi
 \string=\glshex 03D5,% lower case phi variant
 \glshex 03A6% upper case phi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpChi}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpChi}{%
 \glshex 03C7,% lower case chi
 \glshex 03A7% upper case chi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpPsi}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpPsi}{%
 \glshex 03C8,% lower case psi
 \glshex 03A8% upper case psi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrUpOmega}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrUpOmega}{%
 \glshex 03C9,% lower case omega
 \glshex 03A9% upper case omega
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicAlpha}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicAlpha}{%
 \glshex 1D6FC,% lower case alpha (maths italic)
 \glshex 1D6E2% upper case alpha (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicBeta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicBeta}{%
 \glshex 1D6FD,% lower case beta (maths italic)
 \glshex 1D6E3% upper case beta (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicGamma}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicGamma}{%
 \glshex 1D6FE,% lower case gamma (maths italic)
 \glshex 1D6E4% upper case gamma (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicDelta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicDelta}{%
 \glshex 1D6FF,% lower case delta (maths italic)
 \glshex 1D6E5% upper case delta (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicEpsilon}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicEpsilon}{%
 \glshex 1D700% lower case epsilon (maths italic)
 \string=\glshex 1D716,% lower case epsilon variant (maths italic)
 \glshex 1D6E6% upper case epsilon (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicZeta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicZeta}{%
 \glshex 1D701,% lower case zeta (maths italic)
 \glshex 1D6E7% upper case zeta (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicEta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicEta}{%
 \glshex 1D702,% lower case eta (maths italic)
 \glshex 1D6E8% upper case eta (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicTheta}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicTheta}{%
 \glshex 1D703% lower case theta (maths italic)
 \string=\glshex 1D717,% lower case theta variant (maths italic)
 \glshex 1D6E9% upper case theta (maths italic)
 \string=\glshex 1D6F3% upper case theta variant (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicIota}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicIota}{%
 \glshex 1D704,% lower case iota (maths italic)
 \glshex 1D6EA% upper case iota (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicKappa}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicKappa}{%
 \glshex 1D705% lower case kappa (maths italic)
 \string=\glshex 1D718,% lower case kappa variant (maths italic)
 \glshex 1D6EB% upper case kappa (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicLambda}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicLambda}{%
 \glshex 1D706,% lower case lambda (maths italic)
 \glshex 1D6EC% upper case lambda (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicMu}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicMu}{%
 \glshex 1D707,% lower case mu (maths italic)
 \glshex 1D6ED% upper case mu (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicNu}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicNu}{%
 \glshex 1D708,% lower case nu (maths italic)
 \glshex 1D6EE% upper case nu (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicXi}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicXi}{%
 \glshex 1D709,% lower case xi (maths italic)
 \glshex 1D6EF% upper case xi (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicOmicron}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicOmicron}{%
 \glshex 1D70A,% lower case omicron (maths italic)
 \glshex 1D6F0% upper case omicron (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicPi}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicPi}{%
 \glshex 1D70B% lower case pi (maths italic)
 \string=\glshex 1D71B,% lower case pi variant (maths italic)
 \glshex 1D6F1% upper case pi (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicRho}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicRho}{%
 \glshex 1D70C% lower case rho (maths italic)
 \string=\glshex 1D71A,% lower case rho variant (maths italic)
 \glshex 1D6F2% upper case rho (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicSigma}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicSigma}{%
 \glshex 1D70D% lower case final sigma (maths italic)
 \string=\glshex 1D70E,% lower case sigma (maths italic)
 \glshex 1D6F4% upper case sigma (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicTau}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicTau}{%
 \glshex 1D70F,% lower case tau (maths italic)
 \glshex 1D6F5% upper case tau (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicUpsilon}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicUpsilon}{%
 \glshex 1D710,% lower case upsilon (maths italic)
 \glshex 1D6F6% upper case upsilon (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicPhi}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicPhi}{%
 \glshex 1D711% lower case phi (maths italic)
 \string=\glshex 1D719,% lower case phi variant (maths italic)
 \glshex 1D6F7% upper case phi (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicChi}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicChi}{%
 \glshex 1D712,% lower case chi (maths italic)
 \glshex 1D6F8% upper case chi (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicPsi}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicPsi}{%
 \glshex 1D713,% lower case psi (maths italic)
 \glshex 1D6F9% upper case psi (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicOmega}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicOmega}{%
 \glshex 1D714,% lower case omega (maths italic)
 \glshex 1D6FA% upper case omega (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicPartial}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicPartial}{%
 \glshex 1D715% partial differential (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrMathItalicNabla}
%\changes{1.27}{2018-02-26}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrMathItalicNabla}{%
 \glshex 1D6FB% nabla (maths italic)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrdigitrules}
%\changes{1.27}{2018-02-26}{new}
%Digits from the Basic Latin set and subscript and superscript digit
%rules.
%    \begin{macrocode}
\newcommand*{\glsxtrdigitrules}{%
 0\string=\glshex 2080\string=\glshex 2070
 \string<1\string=\glshex 2081\string=\glshex 00B9
 \string<2\string=\glshex 2082\string=\glshex 00B2
 \string<3\string=\glshex 2083\string=\glshex 00B3
 \string<4\string=\glshex 2084\string=\glshex 2074
 \string<5\string=\glshex 2085\string=\glshex 2075
 \string<6\string=\glshex 2086\string=\glshex 2076
 \string<7\string=\glshex 2087\string=\glshex 2077
 \string<8\string=\glshex 2088\string=\glshex 2078
 \string<9\string=\glshex 2089\string=\glshex 2079
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrBasicDigitrules}
%\changes{1.27}{2018-02-26}{new}
%Digits from the Basic Latin set.
%    \begin{macrocode}
\newcommand*{\glsxtrBasicDigitrules}{%
 0\string<1\string<2\string<3\string<4%
 \string<5\string<6\string<7\string<8\string<9%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrSubScriptDigitrules}
%\changes{1.27}{2018-02-26}{new}
%Subscript digits.
%    \begin{macrocode}
\newcommand*{\glsxtrSubScriptDigitrules}{%
 \glshex 2080% subscript 0
 \string<\glshex 2081% subscript 1
 \string<\glshex 2082% subscript 2
 \string<\glshex 2083% subscript 3
 \string<\glshex 2084% subscript 4
 \string<\glshex 2085% subscript 5
 \string<\glshex 2086% subscript 6
 \string<\glshex 2087% subscript 7
 \string<\glshex 2088% subscript 8
 \string<\glshex 2089% subscript 9
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrSuperScriptDigitrules}
%\changes{1.27}{2018-02-26}{new}
%Superscript digits.
%    \begin{macrocode}
\newcommand*{\glsxtrSuperScriptDigitrules}{%
 \glshex 2070% superscript 0
 \string<\glshex 00B9% superscript 1
 \string<\glshex 00B2% superscript 2
 \string<\glshex 00B3% superscript 3
 \string<\glshex 2074% superscript 4
 \string<\glshex 2075% superscript 5
 \string<\glshex 2076% superscript 6
 \string<\glshex 2077% superscript 7
 \string<\glshex 2078% superscript 8
 \string<\glshex 2079% superscript 9
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrfractionrules}
%\changes{1.27}{2018-02-26}{new}
%Vulgar fractions.
%    \begin{macrocode}
\newcommand*{\glsxtrfractionrules}{%
 \glshex 215F% fraction numerator one (1/)
 \string<\glshex 2189% zero thirds (0/3 = 0)
 \string<\glshex 2152% one tenth (1/10 = 0.1)
 \string<\glshex 2151% one ninth (1/9 ~ 0.111)
 \string<\glshex 215B% one eighth (1/8 = 0.125)
 \string<\glshex 2150% one seventh (1/7 ~ 0.143)
 \string<\glshex 2159% one sixth (1/6 ~ 0.167)
 \string<\glshex 2155% one fifth (1/5 = 0.2)
 \string<\glshex 00BC% one quarter (1/4 = 0.25)
 \string<\glshex 2153% one third (1/3 ~ 0.333)
 \string<\glshex 215C% three eighths (3/8 = 0.375)
 \string<\glshex 2156% two fifths (2/5 = 0.4)
 \string<\glshex 00BD% one half (1/2 = 0.5)
 \string<\glshex 2157% three fifths (3/5 = 0.6)
 \string<\glshex 215D% five eighths (5/8 = 0.625)
 \string<\glshex 2154% two thirds (2/3 ~ 0.667)
 \string<\glshex 00BE% three quarters (3/4 = 0.75)
 \string<\glshex 2158% four fifths (4/5 = 0.8)
 \string<\glshex 215A% five sixths (5/6 ~ 0.833)
 \string<\glshex 215E% seven eighths (7/8 = 0.875)
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glsxtrdialecthook}
%Check for scripts associated with the document dialects.
%\changes{1.28}{2018-03-06}{save and restore \cs{TrackLangRequireDialectPrefix}}
%    \begin{macrocode}
\renewcommand{\@glsxtrdialecthook}{%
  \ifundef\CurrentTrackedScript
  {%
    \TrackLangIfHasDefaultScript{\CurrentTrackedLanguage}%
    {%
     \edef\CurrentTrackedScript{%
       \TrackLangGetDefaultScript\CurrentTrackedLanguage}%
    }%
    {}%
  }%
  {}%
  \ifdef\CurrentTrackedScript
  {%
    \let\gls@orgTrackLangRequireDialectPrefix\TrackLangRequireDialectPrefix
    \def\TrackLangRequireDialectPrefix{glossariesxtr-}%
    \let\CurrentTrackedTag\CurrentTrackedScript
    \IfFileExists{\TrackLangRequireDialectPrefix\CurrentTrackedTag.ldf}
    {\RequireGlossariesExtraLang{\CurrentTrackedTag}}%
    {}%
    \let\TrackLangRequireDialectPrefix\gls@orgTrackLangRequireDialectPrefix
  }%
  {}%
}
%    \end{macrocode}
%\end{macro}
%If \cs{glsxtr@loaddialect} has been defined, then
%\sty{glossaries-extra-bib2gls} has been loaded after
%\sty{glossaries-extra}. (For example, through
%\cs{glossariesextrasetup}.) Not recommended, but if this has been
%done try to find the associated language resources.
%    \begin{macrocode}
\ifdef\glsxtr@loaddialect
{%
  \@ifpackageloaded{tracklang}
  {%
    \AnyTrackedLanguages
    {%
      \ForEachTrackedDialect{\this@dialect}{\glsxtr@loaddialect}%
    }%
    {}%
  }
  {}
}
{}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossaries-extra-bib2gls.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossaries-extra-stylemods.sty>
%    \end{macrocode}
%\fi
%\section{Style Adjustments (\sty{glossaries-extra-stylemods.sty})}
% This package adjusts the predefined styles so that they include the post
% description hook. Also, some other minor adjustments may be made
% to make existing styles more flexible.
%
%\subsection{Package Initialisation}
% First identify package:
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
%    \end{macrocode}
% Rollback releases:
%    \begin{macrocode}
\DeclareRelease{v1.48}{2021-11-22}{glossaries-extra-stylemods-2021-11-22.sty}
\DeclareCurrentRelease{1.9}{2025-11-03}
%    \end{macrocode}
% Declare package:
%    \begin{macrocode}
\ProvidesPackage{glossaries-extra-stylemods}[2026/03/06 v2.0 (NLCT)]
%    \end{macrocode}
% Provide package options to automatically load required predefined
% styles. The simplest method is to just test for the existence of
% the file \texttt{glossary-}\meta{option}\texttt{.sty}. Packages
% can't be loaded whilst the options are being processed, so save
% the list in \cs{@glsxtr@loadstyles}.
%\begin{macro}{\@glsxtr@loadstyles}
%    \begin{macrocode}
\newcommand*{\@glsxtr@loadstyles}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{all}
%\changes{1.21}{2017-11-03}{new}
%\changes{1.38}{2018-12-01}{added \sty{glossary-longextra}}
%\changes{1.40}{2019-03-22}{added \sty{glossary-topic}}
%\changes{1.50}{2022-11-08}{added \sty{glossary-table}}
%Provide all known styles.
%    \begin{macrocode}
\DeclareOption{all}{%
  \appto\@glsxtr@loadstyles{%
    \RequirePackage{glossary-inline}%
    \RequirePackage{glossary-list}%
    \RequirePackage{glossary-tree}%
    \RequirePackage{glossary-mcols}%
    \RequirePackage{glossary-long}%
    \RequirePackage{glossary-longragged}%
    \RequirePackage{glossary-longbooktabs}%
    \RequirePackage{glossary-super}%
    \RequirePackage{glossary-superragged}%
    \RequirePackage{glossary-bookindex}%
    \RequirePackage{glossary-longextra}%
    \RequirePackage{glossary-topic}%
    \RequirePackage{glossary-table}%
  }
}
%    \end{macrocode}
%\end{option}
%
%    \begin{macrocode}
\DeclareOption*{%
  \IfFileExists{glossary-\CurrentOption.sty}
   {\eappto\@glsxtr@loadstyles{%
      \noexpand\RequirePackage{glossary-\CurrentOption}}%
   }%
   {%
     \PackageError{glossaries-extra-styles}%
     {Unknown option `\CurrentOption'}{}%
   }%
}
%    \end{macrocode}
% Process the package options:
%    \begin{macrocode}
\ProcessOptions
%    \end{macrocode}
%
% Load the required packages:
%    \begin{macrocode}
\@glsxtr@loadstyles
%    \end{macrocode}
% Adjust the styles so that they all have the post description hook.
% Also, instead of having a hard-coded \cs{space} before the
% location, use:
%\begin{macro}{\glsxtrprelocation}
%\changes{1.21}{2017-11-03}{new}
%This uses \cs{providecommand} as the same command is also
%provided by \sty{glossary-bookindex}.
%    \begin{macrocode}
\providecommand*{\glsxtrprelocation}{\space}
%    \end{macrocode}
%\end{macro}
%
%In case we have an old version of \sty{glossaries}:
%\begin{macro}{\renewglossarystyle}
%    \begin{macrocode}
\providecommand{\renewglossarystyle}[2]{%
  \ifcsundef{@glsstyle@#1}%
  {%
    \PackageError{glossaries-extra}{Glossary style `#1' isn't already defined}{}%
  }%
  {%
    \csdef{@glsstyle@#1}{#2}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\subsection{List-Like Styles}
% The list-like styles mostly already use the post description hook.
% Only the \glostyle{listdotted} style need modifying to add this.
%    \begin{macrocode}
\ifdef{\@glsstyle@listdotted}
{%
 \renewglossarystyle{listdotted}{%
   \setglossarystyle{list}%
   \renewcommand*{\glossentry}[2]{%
    \item[]\makebox[\glslistdottedwidth][l]{%
      \glsentryitem{##1}%
      \glstarget{##1}{\glossentryname{##1}}%
      \unskip\leaders\hbox to 2.9mm{\hss.}\hfill\strut}%
      \glossentrydesc{##1}\glspostdescription}%
   \renewcommand*{\subglossentry}[3]{%
    \item[]\makebox[\glslistdottedwidth][l]{%
    \glssubentryitem{##2}%
    \glstarget{##2}{\glossentryname{##2}}%
    \unskip\leaders\hbox to 2.9mm{\hss.}\hfill\strut}%
    \glossentrydesc{##2}\glspostdescription}%
 }
}
{%
%    \end{macrocode}
% Assume the style isn't required if it hasn't already been defined.
%    \begin{macrocode}
}
%    \end{macrocode}
% The \glostyle{sublistdotted} style doesn't display the description
% for top-level entries. Sub-level entries use the
% \glostyle{listdottedstyle}.
%
%The other list styles would be easier to adapt if the space
%before the number list wasn't hard coded.
%\changes{1.21}{2017-11-03}{modified list to remove hard coded \cs{space}}
%    \begin{macrocode}
\ifdef{\@glsstyle@list}
{%
%    \end{macrocode}
%\begin{macro}{\glslistprelocation}
%\changes{1.21}{2017-11-03}{new}
%Space before number list for top-level entries.
%    \begin{macrocode}
  \newcommand{\glslistprelocation}{\glsxtrprelocation}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslistchildprelocation}
%\changes{1.21}{2017-11-03}{new}
%Space before number list for child entries.
%    \begin{macrocode}
  \newcommand{\glslistchildprelocation}{\glslistprelocation}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslistchildpostlocation}
%\changes{1.21}{2017-11-03}{new}
%Full stop after number list.
%    \begin{macrocode}
  \newcommand{\glslistchildpostlocation}{.}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslistdesc}
%\changes{1.31}{2018-05-09}{new}
%    \begin{macrocode}
  \newcommand{\glslistdesc}[1]{\glossentrydesc{#1}\glspostdescription}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslistgroupskip}
%\changes{1.41}{2019-04-09}{new}
%    \begin{macrocode}
  \newcommand{\glslistgroupskip}{\nobreak\indexspace\nobreak}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslistitem}
%\changes{1.47}{2021-11-04}{new}
%    \begin{macrocode}
  \newcommand{\glslistitem}[1]{%
    \item[\glsentryitem{#1}%
          \glstarget{#1}{\glossentryname{#1}}]%
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslistinit}
%\changes{1.47}{2021-11-04}{new}
%This command was only added to \sty{glossary-list} v4.48 so provide
%it if it hasn't been defined:
%    \begin{macrocode}
  \providecommand{\glslistinit}{%
    \ifdef\GetTitleStringDisableCommands
    {%
      \GetTitleStringSetup{expand}%
      \GetTitleStringDisableCommands{%
        \let\glsentryitem\@gobble
        \let\glstarget\@secondoftwo
        \let\glossentryname\glslistexpandedname
        \let\glslistgroupheaderfmt\@firstofone
        \let\glsgetgrouptitle\@firstofone
%    \end{macrocode}
%Technically this has an optional argument but it's not used in the
%list styles.
%    \begin{macrocode}
        \let\glsnavhypertarget\@secondoftwo
        \let\glsnavigation\relax
      }%
    }%
    {}%
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslistexpandedname}
%\changes{1.47}{2021-11-04}{new}
%This command was only added to \sty{glossary-list} v4.48 so provide
%it if it hasn't been defined. The original definition uses 
%\cs{glsunexpandedfieldvalue} which
%was added to \sty{glossaries} v4.48 (so if \cs{glslistexpandedname}
%hasn't been defined then neither will \cs{glsunexpandedfieldvalue}).
%    \begin{macrocode}
  \providecommand{\glslistexpandedname}[1]{%
    \ifcsname glo@\glsdetoklabel{#1}@name\endcsname
     \expandafter\expandonce\csname glo@\glsdetoklabel{#1}@name\expandafter\endcsname
    \fi
  }
%    \end{macrocode}
%\end{macro}
%Redefine \glostyle{list} to use these commands.
%    \begin{macrocode}
  \renewglossarystyle{list}{%
    \renewenvironment{theglossary}%
      {\glslistinit\begin{description}}{\end{description}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}. This
% does nothing as the sub-entries don't have the name displayed for
% the list styles.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand*{\glossentry}[2]{%
      \glslistitem{##1}\glslistdesc{##1}\glslistprelocation ##2}%
    \renewcommand*{\subglossentry}[3]{%
      \glssubentryitem{##2}%
      \glstarget{##2}{\strut}\space
      \glslistdesc{##2}%
      \glslistchildprelocation ##3\glslistchildpostlocation}%
    \renewcommand*{\glsgroupskip}{\ifglsnogroupskip\else\glslistgroupskip\fi}%
  }
}
{}
%    \end{macrocode}
%Similarly for \glostyle{altlist}. Since it requires \glostyle{list},
%the new commands should have been defined above.
%    \begin{macrocode}
\ifdef{\@glsstyle@altlist}
{%
%    \end{macrocode}
%\begin{macro}{\glsaltlistitem}
%\changes{1.47}{2021-11-04}{new}
%    \begin{macrocode}
  \newcommand{\glsaltlistitem}[1]{%
    \glslistitem{#1}%
    \mbox{}\par\nobreak\@afterheading
  }
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
  \renewglossarystyle{altlist}{%
    \setglossarystyle{list}%
    \renewcommand*{\glossentry}[2]{%
      \glsaltlistitem{##1}%
      \glslistdesc{##1}\glslistprelocation ##2}%
    \renewcommand{\subglossentry}[3]{%
      \par
      \glssubentryitem{##2}%
      \glstarget{##2}{\strut}\glslistdesc{##2}%
      \glslistchildprelocation ##3}%
  }
}
{}
%    \end{macrocode}
%Redefine \glostyle{listgroup} so that it discourages a break
%after group headings.
%\changes{1.21}{2017-11-03}{redefined \texttt{listgroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@listgroup}
{%
%    \end{macrocode}
%\begin{macro}{\glslistgroupheaderitem}
%\changes{1.47}{2021-11-04}{new}
%    \begin{macrocode}
  \newcommand{\glslistgroupheaderitem}[2]{\item[{#2}]}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslistgroupafterheader}
%\changes{1.47}{2021-11-04}{new}
%    \begin{macrocode}
  \newcommand{\glslistgroupafterheader}{%
      \mbox{}\par\nobreak\@afterheading
  }
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
  \renewglossarystyle{listgroup}{%
    \setglossarystyle{list}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glslistgroupheaderitem{##1}{\glslistgroupheaderfmt{\glsgetgrouptitle{##1}}}%
      \glslistgroupafterheader
    }%
  }
}
{}
%    \end{macrocode}
%Similarly for \glostyle{listhypergroup}.
%\changes{1.21}{2017-11-03}{redefined \texttt{listhypergroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@listhypergroup}
{%
  \renewglossarystyle{listhypergroup}{%
    \setglossarystyle{list}%
    \renewcommand*{\glossaryheader}{%
      \glslistnavigationitem{\glsnavigation}}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glslistgroupheaderitem{##1}{\glslistgroupheaderfmt
         {\glsnavhypertarget{##1}{\glsgetgrouptitle{##1}}}}%
      \glslistgroupafterheader
    }%
  }
}
{}
%    \end{macrocode}
%Similarly for \glostyle{altlistgroup}.
%\changes{1.21}{2017-11-03}{redefined \texttt{altlistgroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@altlistgroup}
{%
  \renewglossarystyle{altlistgroup}{%
    \setglossarystyle{altlist}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glslistgroupheaderitem{##1}%
        {\glslistgroupheaderfmt{\glsgetgrouptitle{##1}}}%
      \glslistgroupafterheader
    }%
  }
}
{}
%    \end{macrocode}
%Similarly for \glostyle{altlisthypergroup}.
%\changes{1.21}{2017-11-03}{redefined \texttt{altlisthypergroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@altlisthypergroup}
{%
  \renewglossarystyle{altlisthypergroup}{%
    \setglossarystyle{altlist}%
    \renewcommand*{\glossaryheader}{%
      \glslistnavigationitem{\glsnavigation}}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glslistgroupheaderitem{##1}{\glslistgroupheaderfmt
        {\glsnavhypertarget{##1}{\glsgetgrouptitle{##1}}}}%
      \glslistgroupafterheader
    }%
  }
}
{}
%    \end{macrocode}
%
%\subsection{Longtable Styles}
% The three and four column styles require adjustment to add the
% post-description hook. The two column styles need the hard-coded
% \cs{space} changed to \cs{glsxtrprelocation}.
%    \begin{macrocode}
\ifcsdef{@glsstyle@long}
{%
  \renewglossarystyle{long}{%
    \renewenvironment{theglossary}%
       {\begin{longtable}{lp{\glsdescwidth}}}%
       {\end{longtable}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}. This
% does nothing as the sub-entries don't have the name displayed for
% the long styles.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription
      \glsxtrprelocation ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription
       \glsxtrprelocation ##3\tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{ & \tabularnewline}%
    \fi
  }
}
{}
%    \end{macrocode}
%Three column style:
%    \begin{macrocode}
\ifcsdef{@glsstyle@long3col}
{%
  \renewglossarystyle{long3col}{%
    \renewenvironment{theglossary}%
      {\begin{longtable}{lp{\glsdescwidth}p{\glspagelistwidth}}}%
      {\end{longtable}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}. This
% does nothing as the sub-entries don't have the name displayed for
% the long styles.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription & ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       ##3\tabularnewline
    }%
%    \end{macrocode}
%Conditional needs to be outside of \cs{glsgroupskip} otherwise it
%can cause \qt{Incomplete \cs{iftrue}} errors.
%\changes{1.21}{2017-11-03}{moved conditional outside of \cs{glsgroupskip}}
%    \begin{macrocode}
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{& &\tabularnewline}%
    \fi
  }
}
{}
%    \end{macrocode}
% Four column style:
%    \begin{macrocode}
\ifcsdef{@glsstyle@long4col}
{%
  \renewglossarystyle{long4col}{%
    \renewenvironment{theglossary}%
      {\begin{longtable}{llll}}%
      {\end{longtable}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}. This
% does nothing as the sub-entries don't have the name displayed for
% the long styles.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription &
      \glossentrysymbol{##1} &
      ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       \glossentrysymbol{##2} & ##3\tabularnewline
    }%
%    \end{macrocode}
%\changes{1.21}{2017-11-03}{moved conditional outside of \cs{glsgroupskip}}
%    \begin{macrocode}
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else 
      \renewcommand*{\glsgroupskip}{& & &\tabularnewline}%
    \fi
  }
}
{}
%    \end{macrocode}
%
%The styles in \sty{glossary-longbooktabs} are all based on the
%styles in \sty{glossary-long}, so no adjustments are needed for
%that package.
%
%\subsection{Long Ragged Styles}
% The three and four column styles require adjustment for the
% post-description hook, but not the two column styles. However, the
% two-column styles need to have \cs{space} replaced with
% \cs{glsxtrprelocation}.
%    \begin{macrocode}
\ifcsdef{@glsstyle@longragged}
{%
  \renewglossarystyle{longragged}{%
    \renewenvironment{theglossary}%
       {\begin{longtable}{l>{\raggedright}p{\glsdescwidth}}}%
       {\end{longtable}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}. This
% does nothing as the sub-entries don't have the name displayed for
% the longragged styles.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription\glsxtrprelocation ##2%
      \tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}%
       \glspostdescription\glsxtrprelocation ##3%
       \tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{ & \tabularnewline}%
    \fi
  }
}
{}
%    \end{macrocode}
%Three and four column styles don't use \cs{glsxtrprelocation} since the number
%list is in its own column.
%    \begin{macrocode}
\ifcsdef{@glsstyle@longragged3col}
{%
  \renewglossarystyle{longragged3col}{%
    \renewenvironment{theglossary}%
      {\begin{longtable}{l>{\raggedright}p{\glsdescwidth}%
         >{\raggedright}p{\glspagelistwidth}}}%
      {\end{longtable}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}. This
% does nothing as the sub-entries don't have the name displayed for
% the longragged styles.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription & ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       ##3\tabularnewline
    }%
%    \end{macrocode}
%\changes{1.21}{2017-11-03}{moved conditional outside of \cs{glsgroupskip}}
%    \begin{macrocode}
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else 
      \renewcommand*{\glsgroupskip}{& &\tabularnewline}%
    \fi
  }
}
{}
%    \end{macrocode}
% Four column style:
%    \begin{macrocode}
\ifcsdef{@glsstyle@altlongragged4col}
{%
  \renewglossarystyle{altlongragged4col}{%
    \renewenvironment{theglossary}%
      {\begin{longtable}{l>{\raggedright}p{\glsdescwidth}l%
         >{\raggedright}p{\glspagelistwidth}}}%
      {\end{longtable}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}. This
% does nothing as the sub-entries don't have the name displayed for
% the longragged styles.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription & \glossentrysymbol{##1} &
      ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       \glossentrysymbol{##2} & ##3\tabularnewline
    }%
%    \end{macrocode}
%\changes{1.21}{2017-11-03}{moved conditional outside of \cs{glsgroupskip}}
%    \begin{macrocode}
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else 
      \renewcommand*{\glsgroupskip}{& & &\tabularnewline}%
    \fi
  }
}
{}
%    \end{macrocode}
%
%\subsection{Supertabular Styles}
% The three and four column styles require adjustment to add the
% post-description hook. The two column styles need the hard-coded
% \cs{space} changed to \cs{glsxtrprelocation}.
%    \begin{macrocode}
\ifcsdef{@glsstyle@super}
{%
  \renewglossarystyle{super}{%
    \renewenvironment{theglossary}%
      {\tablehead{}\tabletail{}%
       \begin{supertabular}{lp{\glsdescwidth}}}%
      {\end{supertabular}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}. This
% does nothing as the sub-entries don't have the name displayed for
% the super styles.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription
      \glsxtrprelocation ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription
       \glsxtrprelocation ##3\tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{& \tabularnewline}%
    \fi
  }
}
{}
%    \end{macrocode}
%Three column style:
%    \begin{macrocode}
\ifcsdef{@glsstyle@super3col}
{%
  \renewglossarystyle{super3col}{%
    \renewenvironment{theglossary}%
      {\tablehead{}\tabletail{}%
       \begin{supertabular}{lp{\glsdescwidth}p{\glspagelistwidth}}}%
      {\end{supertabular}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}. This
% does nothing as the sub-entries don't have the name displayed for
% the super styles.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription & ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       ##3\tabularnewline
    }%
%    \end{macrocode}
%\changes{1.21}{2017-11-03}{moved conditional outside of \cs{glsgroupskip}}
%    \begin{macrocode}
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else 
      \renewcommand*{\glsgroupskip}{ & &\tabularnewline}%
    \fi
  }
}
{}
%    \end{macrocode}
% Four column styles:
%    \begin{macrocode}
\ifcsdef{@glsstyle@super4col}
{%
  \renewglossarystyle{super4col}{%
    \renewenvironment{theglossary}%
      {\tablehead{}\tabletail{}%
       \begin{supertabular}{llll}}{%
       \end{supertabular}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}. This
% does nothing as the sub-entries don't have the name displayed for
% the super styles.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription &
      \glossentrysymbol{##1} & ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       \glossentrysymbol{##2} & ##3\tabularnewline
    }%
%    \end{macrocode}
%\changes{1.21}{2017-11-03}{moved conditional outside of \cs{glsgroupskip}}
%    \begin{macrocode}
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else 
      \renewcommand*{\glsgroupskip}{& & &\tabularnewline}%
    \fi
  }
}
{}
%    \end{macrocode}
%
%\subsection{Super Ragged Styles}
% The three and four column styles require adjustment for the
% post-description hook, but not the two column styles. However, the
% two-column styles need to have \cs{space} replaced with
% \cs{glsxtrprelocation}.
%    \begin{macrocode}
\ifcsdef{@glsstyle@superragged}
{%
  \renewglossarystyle{superragged}{%
    \renewenvironment{theglossary}%
      {\tablehead{}\tabletail{}%
       \begin{supertabular}{l>{\raggedright}p{\glsdescwidth}}}%
      {\end{supertabular}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}. This
% does nothing as the sub-entries don't have the name displayed for
% the super styles.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription\glsxtrprelocation ##2%
      \tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription
       \glsxtrprelocation ##3%
       \tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{& \tabularnewline}%
    \fi
  }
}
{}
%    \end{macrocode}
%Three column style:
%    \begin{macrocode}
\ifcsdef{@glsstyle@superragged3col}
{%
  \renewglossarystyle{superragged3col}{%
    \renewenvironment{theglossary}%
      {\tablehead{}\tabletail{}%
       \begin{supertabular}{l>{\raggedright}p{\glsdescwidth}%
          >{\raggedright}p{\glspagelistwidth}}}%
      {\end{supertabular}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}. This
% does nothing as the sub-entries don't have the name displayed for
% the super styles.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription &
      ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       ##3\tabularnewline
    }%
%    \end{macrocode}
%\changes{1.21}{2017-11-03}{moved conditional outside of \cs{glsgroupskip}}
%    \begin{macrocode}
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{ & &\tabularnewline}%
    \fi
  }
}
{}
%    \end{macrocode}
% Four columns:
%    \begin{macrocode}
\ifcsdef{@glsstyle@altsuperragged4col}
{%
  \renewglossarystyle{altsuperragged4col}{%
    \renewenvironment{theglossary}%
      {\tablehead{}\tabletail{}%
       \begin{supertabular}{l>{\raggedright}p{\glsdescwidth}l%
         >{\raggedright}p{\glspagelistwidth}}}%
      {\end{supertabular}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription &
      \glossentrysymbol{##1} & ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       \glossentrysymbol{##2} & ##3\tabularnewline
    }%
%    \end{macrocode}
%\changes{1.21}{2017-11-03}{moved conditional outside of \cs{glsgroupskip}}
%    \begin{macrocode}
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else 
      \renewcommand*{\glsgroupskip}{& & &\tabularnewline}%
    \fi
  }
}
{}
%    \end{macrocode}
%
%\subsection{Inline Style}
% The \glostyle{inline} style is dealt with slightly differently.
% The \cs{glspostdescription} hook is actually in
% \cs{glspostinline}, which is called at the end of the glossary.
% The original definition of \cs{glspostinline} also includes a
% space, which is unnecessary. Here, instead of redefining the
% \glostyle{inline} style, just redefine \cs{glspostinline} and 
% \cs{glsinlinedescformat}.
%    \begin{macrocode}
\ifdef{\@glsstyle@inline}
{%
   \renewcommand*{\glspostinline}{.\spacefactor\sfcode`\.}
%    \end{macrocode}
% Just use \cs{glsxtrpostdescription} instead of
% \cs{glspostdescription}.
%    \begin{macrocode}
   \renewcommand*{\glsinlinedescformat}[3]{%
     \space#1\glsxtrpostdescription}
   \renewcommand*{\glsinlinesubdescformat}[3]{%
     #1\glsxtrpostdescription}
%    \end{macrocode}
% The default settings don't show the location lists, so there's no
% adjustment for \cs{glsxtrprelocation}.
%    \begin{macrocode}
}
{}
%    \end{macrocode}
%
%\subsection{Tree Styles}
% Redefine both \cs{glstreenamefmt} and \cs{glstreegroupheaderfmt}
% in terms of \cs{glstreedefaultnamefmt} to make it easier to change
% both at the same time or only change one without affecting the
% other.
%    \begin{macrocode}
\ifdef\glstreenamefmt
{
%    \end{macrocode}
%\begin{macro}{\glstreedefaultnamefmt}
%\changes{1.31}{2018-05-09}{new}
%    \begin{macrocode}
  \newcommand{\glstreedefaultnamefmt}[1]{\textbf{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstreenamefmt}
%\changes{1.31}{2018-05-09}{added redefinition}
%    \begin{macrocode}
  \renewcommand{\glstreenamefmt}[1]{\glstreedefaultnamefmt{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstreegroupheaderfmt}
%\changes{1.31}{2018-05-09}{added redefinition}
%This command was only introduced to \sty{glossary-tree} v4.22, so
%it may not be defined.
%    \begin{macrocode}
  \def\glstreegroupheaderfmt#1{\glstreedefaultnamefmt{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstreenavigationfmt}
%\changes{1.31}{2018-05-09}{added redefinition}
%This command was only introduced to \sty{glossary-tree} v4.22, so
%it may not be defined.
%    \begin{macrocode}
  \def\glstreenavigationfmt#1{\glstreedefaultnamefmt{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstreePreHeader}
%\changes{1.41}{2019-04-09}{new}
%Takes the label as the first argument and title as the second
%argument so this can be modified to add a bookmark.
%    \begin{macrocode}
  \newcommand{\glstreePreHeader}[2]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstreeSubPreHeader}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glstreeSubPreHeader}\marg{previous group level}\marg{level}\marg{parent label}\marg{group label}\marg{title}
%\end{definition}
%    \begin{macrocode}
  \newcommand{\glstreeSubPreHeader}[5]{}
%    \end{macrocode}
%\end{macro}
%
%    \begin{macrocode}
}
{}
%    \end{macrocode}
% The \glostyle{index} style is redefined so that the space before
% the number list isn't hard coded.
%\changes{1.21}{2017-11-03}{modified index to remove hard coded \cs{space}}
%    \begin{macrocode}
\ifdef{\@glsstyle@index}
{
%    \end{macrocode}
%\begin{macro}{\glstreeprelocation}
%\changes{1.21}{2017-11-03}{new}
%The space before the number list for top-level entries. This is
%shared by the other tree styles.
%    \begin{macrocode}
  \newcommand*{\glstreeprelocation}{\glsxtrprelocation}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstreechildprelocation}
%\changes{1.21}{2017-11-03}{new}
%The space before the number list for child entries. This is
%shared by the other tree styles.
%    \begin{macrocode}
  \newcommand*{\glstreechildprelocation}{\glstreeprelocation}
%    \end{macrocode}
%\end{macro}
%Don't prohibit a page break at the start of a new group if there's
%no header.
%\begin{macro}{\glstreegroupskip}
%\changes{1.41}{2019-04-09}{new}
%    \begin{macrocode}
  \newcommand{\glstreegroupskip}{\indexspace}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstreegroupheaderskip}
%\changes{1.42}{2020-02-03}{new}
%This doesn't include \cs{@afterheading} as it can cause
%interference with some styles.
%    \begin{macrocode}
  \newcommand{\glstreegroupheaderskip}{\nopagebreak\glstreegroupskip\nobreak}
%    \end{macrocode}
%\end{macro}
%Modify the \glostyle{index} style.
%    \begin{macrocode}
  \renewglossarystyle{index}{%
    \renewenvironment{theglossary}%
      {\setlength{\parindent}{0pt}%
       \setlength{\parskip}{0pt plus 0.3pt}%
       \let\item\glstreeitem
       \let\subitem\glstreesubitem
       \let\subsubitem\glstreesubsubitem
      }%
    {\par}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand*{\glossentry}[2]{%
       \item\glsentryitem{##1}%
       \glstreenamefmt{\glstarget{##1}{\glossentryname{##1}}}%
       \glstreesymbol{##1}%
       \glstreeDescLoc{##1}{##2}%
    }%
    \renewcommand{\subglossentry}[3]{%
      \ifcase##1\relax
        \item
      \or
        \subitem
        \glssubentryitem{##2}%
      \else
        \subsubitem
      \fi
      \glstreenamefmt{\glstarget{##2}{\glossentryname{##2}}}%
      \glstreechildsymbol{##2}%
      \glstreeChildDescLoc{##2}{##3}%
    }%
    \renewcommand*{\glsgroupskip}{\ifglsnogroupskip\else\glstreegroupskip\fi}%
  }
}
{}
%    \end{macrocode}
%
% The \glostyle{indexgroup} style is redefined to discourage a page
% break after the heading.
%\changes{1.21}{2017-11-03}{redefined \texttt{indexgroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@indexgroup}
{%
%    \end{macrocode}
% Provide formatting command for sub-headings to make it easier to
% adjust.
%\begin{macro}{\glsindexsubgroupitem}
%\begin{definition}
%\cs{glsindexsubgroupitem}\marg{previous group level}\marg{level}\marg{parent label}\marg{group label}\marg{title}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glsindexsubgroupitem}[5]{%
    \ifcase#2\relax
%    \end{macrocode}
%This case shouldn't occur as \cs{glsgroupheading} will be used
%instead, but include for completeness.
%    \begin{macrocode}
     \item \glstreegroupheaderfmt{#5}%
     \glstreegroupheaderskip
    \or
     \smallskip
     \subitem \glstreegroupheaderfmt{#5}%
     \smallskip
    \else
     \smallskip
     \subsubitem \glstreegroupheaderfmt{#5}%
     \smallskip
    \fi
  }
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
  \renewglossarystyle{indexgroup}{%
    \setglossarystyle{index}%
%    \end{macrocode}
% Group heading.
%    \begin{macrocode}
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \item\glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip\@afterheading
    }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
      \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
      \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
      \glsindexsubgroupitem{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
      \@afterheading
    }%
  }
}
{}
%    \end{macrocode}
%
%Similarly for \glostyle{indexhypergroup}.
%\changes{1.21}{2017-11-03}{redefined \texttt{indexhypergroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@indexhypergroup}
{%
  \renewglossarystyle{indexhypergroup}{%
    \setglossarystyle{index}%
    \renewcommand*{\glossaryheader}{%
      \item\glstreenavigationfmt{\glsnavigation}%
       \glstreegroupheaderskip\@afterheading}%
%    \end{macrocode}
% Group heading.
%    \begin{macrocode}
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \item\glstreegroupheaderfmt
        {\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
      \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
      \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
      \glsindexsubgroupitem{##1}{##2}{##3}{##4}%
        {\glsnavhypertarget{##4}{\glsxtr@grptitle}}%
      \@afterheading
    }%
  }%
}
{}
%    \end{macrocode}
%
%Adjust \glostyle{tree} style to remove hard coded space before
%number list.
%    \begin{macrocode}
\ifdef{\@glsstyle@tree}
{%
%    \end{macrocode}
% The original \glostyle{alttree} style doesn't use \cs{glstreepredesc}
% but since v1.42 the modified style (below) has switched to using
% \cs{glstreeDescLoc} so provide an alternative that can be used
% with \glostyle{alttree}.
%\begin{macro}{\glsxtrtreepredesc}
%\changes{1.46}{2021-09-20}{new}
%    \begin{macrocode}
  \newcommand{\glsxtrtreepredesc}{\glstreepredesc}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrtreechildpredesc}
%\changes{1.46}{2021-09-20}{new}
%    \begin{macrocode}
  \newcommand{\glsxtrtreechildpredesc}{\glstreechildpredesc}
%    \end{macrocode}
%\end{macro}
%Provide a command for use with the \glostyle{tree} styles that displays
%the pre-description separator, the
%description and post-description hook.
%\begin{macro}{\glstreedesc}
%\changes{1.31}{2018-05-09}{new}
%    \begin{macrocode}
  \newcommand{\glstreedesc}[1]{%
    \glsxtrtreepredesc\glossentrydesc{#1}\glspostdescription
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstreeDescLoc}
%\changes{1.41}{2019-04-09}{new}
%\begin{definition}
%\cs{glstreeDescLoc}\marg{label}\marg{location}
%\end{definition}
%This checks for the description and symbol. If both are missing,
%a different separator may be required. For example, a comma and
%space if there's no description or symbol but just a space if
%either of those fields are present.
%    \begin{macrocode}
  \newcommand{\glstreeDescLoc}[2]{%
    \ifglshasdesc{#1}%
    {\glstreedesc{#1}\glstreeprelocation}%
    {\ifglshassymbol{#1}{\glstreeprelocation}{\glstreeNoDescSymbolPreLocation}}%
    #2%
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstreeNoDescSymbolPreLocation}
%\changes{1.42}{2020-02-03}{new}
%\begin{definition}
%\cs{glstreeNoDescSymbolPreLocation}
%\end{definition}
%    \begin{macrocode}
  \newcommand{\glstreeNoDescSymbolPreLocation}{\space}
%    \end{macrocode}
%\end{macro}
%Similarly for the symbol.
%\begin{macro}{\glstreesymbol}
%\changes{1.31}{2018-05-09}{new}
%    \begin{macrocode}
  \newcommand{\glstreesymbol}[1]{%
    \ifglshassymbol{#1}{\space(\glossentrysymbol{#1})}{}%
  }%
%    \end{macrocode}
%\end{macro}
%And for the child entries:
%\begin{macro}{\glstreechilddesc}
%\changes{1.31}{2018-05-09}{new}
%    \begin{macrocode}
  \newcommand{\glstreechilddesc}[1]{%
    \glsxtrtreechildpredesc\glossentrydesc{#1}\glspostdescription
  }%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstreeChildDescLoc}
%\changes{1.41}{2019-04-09}{new}
%\changes{1.42}{2020-02-03}{added \cs{glstreeNoDescSymbolPreLocation}}
%    \begin{macrocode}
  \newcommand{\glstreeChildDescLoc}[2]{%
    \ifglshasdesc{#1}%
    {\glstreechilddesc{#1}\glstreechildprelocation}%
    {\ifglshassymbol{#1}{\glstreechildprelocation}%
      {\glstreeNoDescSymbolPreLocation}%
    }%
    #2%
  }%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstreechildsymbol}
%\changes{1.31}{2018-05-09}{new}
%This just behaves in the same way as the top-level.
%    \begin{macrocode}
  \newcommand{\glstreechildsymbol}[1]{%
    \glstreesymbol{#1}%
  }%
%    \end{macrocode}
%\end{macro}
%Redefine tree style.
%    \begin{macrocode}
  \renewglossarystyle{tree}{%
    \renewenvironment{theglossary}%
      {\setlength{\parindent}{0pt}%
       \setlength{\parskip}{0pt plus 0.3pt}}%
      {}%
    \renewcommand*{\glossaryheader}{}%
%    \end{macrocode}
% Group heading.
%    \begin{macrocode}
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
%    \end{macrocode}
% Top level entry.
%    \begin{macrocode}
    \renewcommand{\glossentry}[2]{%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glsentryitem{##1}\glstreenamefmt{\glstarget{##1}{\glossentryname{##1}}}%
      \glstreesymbol{##1}%
      \glstreeDescLoc{##1}{##2}\par
    }%
%    \end{macrocode}
% Sub entries.
%    \begin{macrocode}
    \renewcommand{\subglossentry}[3]{%
      \hangindent##1\glstreeindent\relax
      \parindent##1\glstreeindent\relax
      \ifnum##1=1\relax
        \glssubentryitem{##2}%
      \fi
      \glstreenamefmt{\glstarget{##2}{\glossentryname{##2}}}%
      \glstreechildsymbol{##2}%
      \glstreeChildDescLoc{##2}{##3}\par
    }%
    \renewcommand*{\glsgroupskip}{\ifglsnogroupskip\else\glstreegroupskip\fi}%
  }%
}
{}
%    \end{macrocode}
%
% The \glostyle{treegroup} style is redefined to discourage a page
% break after the heading.
%\changes{1.21}{2017-11-03}{redefined \texttt{treegroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@treegroup}
{%
%    \end{macrocode}
% Provide formatting command for sub-headings to make it easier to
% adjust.
%\begin{macro}{\glstreesubgroupitem}
%\begin{definition}
%\cs{glstreesubgroupitem}\marg{previous group level}\marg{level}\marg{parent label}\marg{group label}\marg{title}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
  \newcommand*{\glstreesubgroupitem}[5]{%
    \par\smallskip\noindent\hspace{#2\glstreeindent}%
    \glstreegroupheaderfmt{#5}\smallskip\par
  }
%    \end{macrocode}
%\end{macro}
% Redefine treegroup style.
%    \begin{macrocode}
  \renewglossarystyle{treegroup}{%
    \setglossarystyle{tree}%
%    \end{macrocode}
% Group heading.
%    \begin{macrocode}
    \renewcommand{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent\glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip\@afterheading}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
     \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
     \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
     \glstreesubgroupitem{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
    }%
  }
}
{}
%    \end{macrocode}
%
%Similarly for \glostyle{treehypergroup}
%\changes{1.21}{2017-11-03}{redefined \texttt{treehypergroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@treehypergroup}
{%
  \renewglossarystyle{treehypergroup}{%
    \setglossarystyle{tree}%
    \renewcommand*{\glossaryheader}{%
      \par\noindent\glstreenavigationfmt{\glsnavigation}%
      \glstreegroupheaderskip\@afterheading}%
%    \end{macrocode}
% Group heading.
%    \begin{macrocode}
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent
      \glstreegroupheaderfmt
        {\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
      \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
      \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
      \glstreesubgroupitem{##1}{##2}{##3}{##4}%
        {\glsnavhypertarget{##4}{\glsxtr@grptitle}}%
    }%
  }
}
{}
%    \end{macrocode}
%
%Adjust \glostyle{treenoname} style to remove hard coded space before
%number list.
%    \begin{macrocode}
\ifdef{\@glsstyle@treenoname}
{%
%    \end{macrocode}
%Provide a command for use with the \glostyle{treenoname} styles that displays
%the pre-description separator, the
%description and post-description hook.
%\begin{macro}{\glstreenonamedesc}
%\changes{1.31}{2018-05-09}{new}
%    \begin{macrocode}
  \newcommand{\glstreenonamedesc}[1]{%
    \glstreepredesc\glossentrydesc{#1}\glspostdescription
  }%
%    \end{macrocode}
%\end{macro}
%Similarly for the symbol.
%\begin{macro}{\glstreenonamesymbol}
%\changes{1.31}{2018-05-09}{new}
%    \begin{macrocode}
  \newcommand{\glstreenonamesymbol}[1]{%
    \ifglshassymbol{#1}{\space(\glossentrysymbol{#1})}{}%
  }%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstreenonameDescLoc}
%\changes{1.45}{2020-04-01}{new}
%    \begin{macrocode}
  \newcommand{\glstreenonameDescLoc}[2]{%
    \glstreenonamedesc{#1}\glstreeprelocation#2%
  }
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstreenonamechilddesc}
%\changes{1.31}{2018-05-09}{new}
%The child entry doesn't have the pre-description separator as the
%name isn't displayed.
%    \begin{macrocode}
  \newcommand{\glstreenonamechilddesc}[1]{%
    \glossentrydesc{#1}\glspostdescription
  }%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstreenonameChildDescLoc}
%\changes{1.45}{2020-04-01}{new}
%    \begin{macrocode}
  \newcommand{\glstreenonameChildDescLoc}[2]{%
    \glstreenonamechilddesc{#1}\glstreechildprelocation#2%
  }
%    \end{macrocode}
%\end{macro}
%Redefine treenoname style
%    \begin{macrocode}
  \renewglossarystyle{treenoname}{%
    \renewenvironment{theglossary}%
      {\setlength{\parindent}{0pt}%
       \setlength{\parskip}{0pt plus 0.3pt}}%
      {}%
    \renewcommand*{\glossaryheader}{}%
%    \end{macrocode}
% Group heading.
%    \begin{macrocode}
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand{\glossentry}[2]{%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glsentryitem{##1}\glstreenamefmt{\glstarget{##1}{\glossentryname{##1}}}%
      \glstreenonamesymbol{##1}%
%    \end{macrocode}
%\changes{1.45}{2020-04-01}{removed duplicate description}
%    \begin{macrocode}
      \glstreenonameDescLoc{##1}{##2}\par
    }%
    \renewcommand{\subglossentry}[3]{%
      \hangindent##1\glstreeindent\relax
      \parindent##1\glstreeindent\relax
      \ifnum##1=1\relax
        \glssubentryitem{##2}%
      \fi
      \glstarget{##2}{\strut}%
      \glstreenonameChildDescLoc{##2}{##3}\par
    }%
    \renewcommand*{\glsgroupskip}{\ifglsnogroupskip\else\glstreegroupskip\fi}%
  }
}
{}
%    \end{macrocode}
%
% The \glostyle{treenonamegroup} style is redefined to discourage a page
% break after the heading. There are no sub-groups as sub-entries
% don't have the name shown.
%\changes{1.21}{2017-11-03}{redefined \texttt{treenonamegroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@treenonamegroup}
{%
  \renewglossarystyle{treenonamegroup}{%
    \setglossarystyle{treenoname}%
    \renewcommand{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent\glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip\@afterheading
    }%
  }
}
{}
%    \end{macrocode}
%
%Similarly for \glostyle{treenonamehypergroup}
%\changes{1.21}{2017-11-03}{redefined \texttt{treenonamehypergroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@treenonamehypergroup}
{%
  \renewglossarystyle{treenonamehypergroup}{%
    \setglossarystyle{treenoname}%
    \renewcommand*{\glossaryheader}{%
      \par\noindent\glstreenavigationfmt{\glsnavigation}%
      \glstreegroupheaderskip\@afterheading}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading}%
  }
}
{}
%    \end{macrocode}
%
% Version 1.6: Check for the existence of new function added to
% \sty{glossary-tree} v4.59.
%    \begin{macrocode}
\ExplSyntaxOn
\cs_if_exist:NT \glossaries_tree_set_widest_name:nn
 {
%    \end{macrocode}
%\begin{macro}{\gglssetwidest}
%\changes{1.21}{2017-11-03}{new}
%\changes{1.6}{2025-04-12}{check for new function}
%    \begin{macrocode}
   \NewDocumentCommand \gglssetwidest { O{0} m }
    {
      \glossaries_tree_gset_widest_name:nn { #1 } { #2 }
    }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\eglssetwidest}
%\changes{1.05}{2016-06-10}{new}
%\changes{1.6}{2025-04-12}{check for new function}
%\changes{1.7}{2025-05-14}{use protected expansion}
%Locally set expanded value. NB protected expansion is required
%in case of fragile commands.
%    \begin{macrocode}
  \NewDocumentCommand \eglssetwidest { O{0} m }
   {
     \int_compare:nNnT
      { #1 } > { \l__glossaries_tree_max_known_level_int }
      {
        \int_set:Nn \l__glossaries_tree_max_known_level_int { #1 }
      }
     \protected@csedef { @glswidestname \romannumeral #1 } { #2 }
   }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\xglssetwidest}
%\changes{1.05}{2016-06-10}{new}
%\changes{1.6}{2025-04-12}{check for new function}
%\changes{1.7}{2025-05-14}{use protected expansion}
%Globally set expanded value. NB protected expansion is required
%in case of fragile commands.
%    \begin{macrocode}
  \NewDocumentCommand \xglssetwidest { O{0} m }
   {
     \int_compare:nNnT
      { #1 } > { \l__glossaries_tree_max_known_level_int }
      {
        \int_gset:Nn \l__glossaries_tree_max_known_level_int { #1 }
      }
     \protected@csxdef { @glswidestname \romannumeral #1 } { #2 }
   }
%    \end{macrocode}
%\end{macro}
%
%Only set if wider than the current value.
%    \begin{macrocode}
  \cs_new:Nn \__glossaries_extra_update_widest:Nnn
   {
    \ifcsundef { @glswidestname \romannumeral #2 }
     { #1 [ #2 ] { #3 } }
     {
       \exp_args:NNv \glsmeasurewidth \l__glossaries_tmpa_dim
        { @glswidestname \romannumeral #2 }
       \glsmeasurewidth \l__glossaries_tmpb_dim { #3 }
       \dim_compare:nNnT
          { \l__glossaries_tmpb_dim } > { \l__glossaries_tmpa_dim }
        {
          #1 [ #2 ] { #3 }
        }
     }
   }
%    \end{macrocode}
%
%\begin{macro}{\glsupdatewidest}
%\changes{1.23}{2017-11-12}{new}
%\changes{1.6}{2025-04-12}{changed to document command}
%Only sets if new value is wider than old value.
%    \begin{macrocode}
  \NewDocumentCommand \glsupdatewidest { O{0} m }
   {
     \__glossaries_extra_update_widest:Nnn
      \glssetwidest { #1 } { #2 }
   }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\gglsupdatewidest}
%\changes{1.23}{2017-11-12}{new}
%\changes{1.6}{2025-04-12}{changed to document command}
%As above but global definition.
%    \begin{macrocode}
  \NewDocumentCommand \gglsupdatewidest { O{0} m }
   {
     \__glossaries_extra_update_widest:Nnn
      \gglssetwidest { #1 } { #2 }
   }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\eglsupdatewidest}
%\changes{1.23}{2017-11-12}{new}
%\changes{1.6}{2025-04-12}{changed to document command}
%As \cs{glsupdatewidest} but expands value.
%    \begin{macrocode}
  \NewDocumentCommand \eglsupdatewidest { O{0} m }
   {
     \__glossaries_extra_update_widest:Nnn
      \eglssetwidest { #1 } { #2 }
   }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\xglsupdatewidest}
%\changes{1.23}{2017-11-12}{new}
%\changes{1.6}{2025-04-12}{changed to document command}
%As above but global.
%    \begin{macrocode}
  \NewDocumentCommand \xglsupdatewidest { O{0} m }
   {
     \__glossaries_extra_update_widest:Nnn
      \xglssetwidest { #1 } { #2 }
   }
%    \end{macrocode}
%\end{macro}
%
%    \begin{macrocode}
 }
\ExplSyntaxOff
%    \end{macrocode}
%
% The \glostyle{alttree} style is redefined to make it easier to
% made minor adjustments.
%    \begin{macrocode}
\ifdef{\@glsstyle@alttree}
{%
%    \end{macrocode}
% Only redefine this style if it's already been defined.
%
%\begin{macro}{\glsalttreepredesc}
%\changes{1.46}{2021-09-20}{new}
%    \begin{macrocode}
\newcommand{\glsalttreepredesc}{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsalttreechildpredesc}
%\changes{1.46}{2021-09-20}{new}
%    \begin{macrocode}
\newcommand{\glsalttreechildpredesc}{\glsalttreepredesc}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtralttreeSymbolDescLocation}
%\changes{1.05}{2016-06-10}{new}
%\begin{definition}
%\cs{glsxtralttreeSymbolDescLocation}\marg{label}\marg{location
%list}
%\end{definition}
%Layout the symbol, description and location for top-level entries.
%    \begin{macrocode}
  \newcommand{\glsxtralttreeSymbolDescLocation}[2]{%
    {%
      \let\par\glsxtrAltTreePar
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{switch to using \cs{glsalttreepredesc} and
%\cs{glsalttreechildpredesc}}
%    \begin{macrocode}
      \let\glsxtrtreepredesc\glsalttreepredesc
      \let\glsxtrtreechildpredesc\glsalttreechildpredesc
      \ifglshassymbol{#1}{(\glossentrysymbol{#1})\space}{}%
%    \end{macrocode}
%\changes{1.41}{2019-04-09}{added check for description}
%\changes{1.42}{2020-02-03}{switched to using \cs{glstreeDescLoc}}
%\changes{1.44}{2020-03-23}{removed duplicate description}
%    \begin{macrocode}
      \glstreeDescLoc{#1}{#2}\par
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrAltTreeIndent}
%\changes{1.05}{2016-06-10}{new}
% Paragraph indent for subsequent paragraphs in multi-paragraph
% descriptions.
%    \begin{macrocode}
  \newlength\glsxtrAltTreeIndent
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrAltTreePar}
%\changes{1.05}{2016-06-10}{new}
%Multi-paragraph descriptions need to keep the hanging indent.
%    \begin{macrocode}
  \newcommand{\glsxtrAltTreePar}{%
    \@@par
    \glsxtrAltTreeSetHangIndent
    \setlength{\parindent}{\dimexpr\hangindent+\glsxtrAltTreeIndent}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtralttreeSubSymbolDescLocation}
%\changes{1.05}{2016-06-10}{new}
%\begin{definition}
%\cs{glsxtralttreeSubSymbolDescLocation}\marg{level}\marg{label}\marg{location
%list}
%\end{definition}
%Layout the symbol, description and location for sub-entries.
% Defaults to the same as the top-level.
%    \begin{macrocode}
  \newcommand{\glsxtralttreeSubSymbolDescLocation}[3]{%
    \glsxtralttreeSymbolDescLocation{#2}{#3}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrtreetopindent}
%\changes{1.05}{2016-06-10}{new}
% The original style has to keep computing the width of the name at
% each entry. This register allows the style to compute it once for
% the top-level at the start of the glossary.
%    \begin{macrocode}
  \newlength\glsxtrtreetopindent
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtralttreeInit}
%\changes{1.05}{2016-06-10}{new}
% User-level initialisation for the \glostyle{alttree} style.
%    \begin{macrocode}
  \newcommand*{\glsxtralttreeInit}{%
    \glsmeasurewidth{\glsxtrtreetopindent}{\glstreenamefmt{\glsgetwidestname\space}}%
    \glsxtrAltTreeIndent=\parindent
  }
%    \end{macrocode}
%\end{macro}
%
% Older definitions. Now use \cs{ProvideDocumentCommand}
% to provide fallback definitions if an older version of
% \sty{glossary-tree} is installed.
%
%Globally set the widest value.
%    \begin{macrocode}
   \ProvideDocumentCommand\gglssetwidest{O{0}m}{%
     \csgdef{@glswidestname\romannumeral#1}{#2}%
   }
%    \end{macrocode}
% Local protected expansion:
%    \begin{macrocode}
   \ProvideDocumentCommand\eglssetwidest{O{0}m}{%
     \protected@csedef{@glswidestname\romannumeral#1}{#2}%
   }
%    \end{macrocode}
%Like the above but uses \cs{protected@csxdef}.
%    \begin{macrocode}
   \ProvideDocumentCommand\xglssetwidest{O{0}m}{%
     \protected@csxdef{@glswidestname\romannumeral#1}{#2}%
   }
%    \end{macrocode}
%
%Only sets if new value is wider than old value.
%    \begin{macrocode}
  \ProvideDocumentCommand\glsupdatewidest{O{0}m}{%
    \ifcsundef{@glswidestname\romannumeral#1}%
    {\csdef{@glswidestname\romannumeral#1}{#2}}%
    {%
      \settowidth{\dimen@}{\csuse{@glswidestname\romannumeral#1}}%
      \settowidth{\dimen@ii}{#2}%
      \ifdim\dimen@ii>\dimen@
       \csdef{@glswidestname\romannumeral#1}{#2}%
      \fi
    }%
   }
%    \end{macrocode}
%
%As above but global definition.
%    \begin{macrocode}
  \ProvideDocumentCommand\gglsupdatewidest{O{0}m}{%
    \ifcsundef{@glswidestname\romannumeral#1}%
    {\csgdef{@glswidestname\romannumeral#1}{#2}}%
    {%
      \settowidth{\dimen@}{\csuse{@glswidestname\romannumeral#1}}%
      \settowidth{\dimen@ii}{#2}%
      \ifdim\dimen@ii>\dimen@
       \csgdef{@glswidestname\romannumeral#1}{#2}%
      \fi
    }%
   }
%    \end{macrocode}
%
%As \cs{glsupdatewidest} but expands value.
%    \begin{macrocode}
  \ProvideDocumentCommand\eglsupdatewidest{O{0}m}{%
    \ifcsundef{@glswidestname\romannumeral#1}%
    {\protected@csedef{@glswidestname\romannumeral#1}{#2}}%
    {%
      \settowidth{\dimen@}{\csuse{@glswidestname\romannumeral#1}}%
      \settowidth{\dimen@ii}{#2}%
      \ifdim\dimen@ii>\dimen@
       \protected@csedef{@glswidestname\romannumeral#1}{#2}%
      \fi
    }%
   }
%    \end{macrocode}
%
%    \begin{macrocode}
  \ProvideDocumentCommand\xglsupdatewidest{O{0}m}{%
    \ifcsundef{@glswidestname\romannumeral#1}%
    {\protected@csxdef{@glswidestname\romannumeral#1}{#2}}%
    {%
      \settowidth{\dimen@}{\csuse{@glswidestname\romannumeral#1}}%
      \settowidth{\dimen@ii}{#2}%
      \ifdim\dimen@ii>\dimen@
       \protected@csxdef{@glswidestname\romannumeral#1}{#2}%
      \fi
    }%
   }
%    \end{macrocode}
%
%\begin{macro}{\glsgetwidestname}
%\changes{1.05}{2016-06-10}{new}
% Provide a user-level macro to obtain the widest top-level name.
%    \begin{macrocode}
  \newcommand*{\glsgetwidestname}{\@glswidestname}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsgetwidestsubname}
%\changes{1.05}{2016-06-10}{new}
% Provide a user-level macro to obtain the widest sub-entry name.
%    \begin{macrocode}
  \newcommand*{\glsgetwidestsubname}[1]{%
    \ifcsundef{@glswidestname\romannumeral#1}%
    {\@glswidestname}%
    {\csuse{@glswidestname\romannumeral#1}}%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsFindWidestTopLevelName}
%CamelCase is easier for long command names. Provide a CamelCase
%synonym of \cs{glsfindwidesttoplevelname}.
%    \begin{macrocode}
  \let\glsFindWidestTopLevelName\glsfindwidesttoplevelname
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsFindWidestUsedTopLevelName}
%\changes{1.05}{2016-06-10}{new}
% Like \cs{glsfindwidesttoplevelname} but has an additional check
% that the entry has been used. Only useful if the glossaries occur
% at the end of the document, in which case this command should go
% at the start of the glossary. Alternatively, place at the end of
% the document and save for the next run.
%    \begin{macrocode}
  \newrobustcmd*{\glsFindWidestUsedTopLevelName}[1][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglsused{\@glo@label}%
        {%
          \ifglshasparent{\@glo@label}%
          {}%
          {%
            \glsmeasurewidth{\dimen@}%
             {\glstreenamefmt{\glsentryname{\@glo@label}}}%
            \ifdim\dimen@>\gls@tmplen
              \gls@tmplen=\dimen@
              \eglssetwidest{\glsentryname{\@glo@label}}%
            \fi
          }%
        }%
        {}%
      }%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsFindWidestUsedAnyName}
%\changes{1.05}{2016-06-10}{new}
% Like the above but doesn't check the parent key. Useful if all
% levels should have the same width for the name.
%    \begin{macrocode}
  \newrobustcmd*{\glsFindWidestUsedAnyName}[1][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglsused{\@glo@label}%
        {%
          \glsmeasurewidth{\dimen@}%
           {\glstreenamefmt{\glsentryname{\@glo@label}}}%
          \ifdim\dimen@>\gls@tmplen
            \gls@tmplen=\dimen@
            \eglssetwidest{\glsentryname{\@glo@label}}%
          \fi
        }%
        {}%
      }%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsFindWidestAnyName}
%\changes{1.05}{2016-06-10}{new}
% Like the above but doesn't check is the entry has been used.
%    \begin{macrocode}
  \newrobustcmd*{\glsFindWidestAnyName}[1][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \glsmeasurewidth{\dimen@}%
         {\glstreenamefmt{\glsentryname{\@glo@label}}}%
        \ifdim\dimen@>\gls@tmplen
          \gls@tmplen=\dimen@
          \eglssetwidest{\glsentryname{\@glo@label}}%
        \fi
      }%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsFindWidestUsedLevelTwo}
%\changes{1.05}{2016-06-10}{new}
% This is like \cs{glsFindWidestUsedTopLevelName} but also sets the
% first two sub-levels as well. Any entry that has a
% great-grandparent is ignored.
%    \begin{macrocode}
  \newrobustcmd*{\glsFindWidestUsedLevelTwo}[1][\@glo@types]{%
    \dimen@=0pt\relax
    \dimen@i=0pt\relax
    \dimen@ii=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglsused{\@glo@label}%
        {%
          \ifglshasparent{\@glo@label}%
          {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
            \protected@edef\@glo@parent{\csuse{glo@\glsdetoklabel{\@glo@label}@parent}}%
            \ifglshasparent{\@glo@parent}%
            {%
              \protected@edef\@glo@parent{\csuse{glo@\glsdetoklabel{\@glo@parent}@parent}}%
              \ifglshasparent{\@glo@parent}%
              {}%
              {%
                \glsmeasurewidth{\gls@tmplen}%
                   {\glstreenamefmt{\glsentryname{\@glo@label}}}%
                \ifdim\gls@tmplen>\dimen@ii
                  \dimen@ii=\gls@tmplen
                  \eglssetwidest[2]{\glsentryname{\@glo@label}}%
                \fi
              }%
            }%
            {%
              \glsmeasurewidth{\gls@tmplen}%
                 {\glstreenamefmt{\glsentryname{\@glo@label}}}%
              \ifdim\gls@tmplen>\dimen@i
                \dimen@i=\gls@tmplen
                \eglssetwidest[1]{\glsentryname{\@glo@label}}%
              \fi
            }%
          }%
          {%
            \glsmeasurewidth{\gls@tmplen}%
               {\glstreenamefmt{\glsentryname{\@glo@label}}}%
            \ifdim\gls@tmplen>\dimen@
              \dimen@=\gls@tmplen
              \eglssetwidest{\glsentryname{\@glo@label}}%
            \fi
          }%
        }%
        {}%
      }%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsFindWidestLevelTwo}
%\changes{1.05}{2016-06-10}{new}
% This is like \cs{glsFindWidestUsedLevelTwo} but doesn't check if the
% entry has been used.
%    \begin{macrocode}
  \newrobustcmd*{\glsFindWidestLevelTwo}[1][\@glo@types]{%
    \dimen@=0pt\relax
    \dimen@i=0pt\relax
    \dimen@ii=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglshasparent{\@glo@label}%
        {%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{changed \cs{edef} to \cs{protected@edef}}
%    \begin{macrocode}
          \protected@edef\@glo@parent{\csuse{glo@\glsdetoklabel{\@glo@label}@parent}}%
          \ifglshasparent{\@glo@parent}%
          {%
            \protected@edef\@glo@parent{\csuse{glo@\glsdetoklabel{\@glo@parent}@parent}}%
            \ifglshasparent{\@glo@parent}%
            {}%
            {%
              \glsmeasurewidth{\gls@tmplen}%
                 {\glstreenamefmt{\glsentryname{\@glo@label}}}%
              \ifdim\gls@tmplen>\dimen@ii
                \dimen@ii=\gls@tmplen
                \eglssetwidest[2]{\glsentryname{\@glo@label}}%
              \fi
            }%
          }%
          {%
            \glsmeasurewidth{\gls@tmplen}%
               {\glstreenamefmt{\glsentryname{\@glo@label}}}%
            \ifdim\gls@tmplen>\dimen@i
              \dimen@i=\gls@tmplen
              \eglssetwidest[1]{\glsentryname{\@glo@label}}%
            \fi
          }%
        }%
        {%
          \glsmeasurewidth{\gls@tmplen}%
             {\glstreenamefmt{\glsentryname{\@glo@label}}}%
          \ifdim\gls@tmplen>\dimen@
            \dimen@=\gls@tmplen
            \eglssetwidest{\glsentryname{\@glo@label}}%
          \fi
        }%
      }%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsFindWidestUsedAnyNameSymbol}
%\changes{1.05}{2016-06-10}{new}
% Like the \cs{glsFindWidestUsedAnyName} but also measures the
% symbol. The length of the widest symbol is stored in the second argument
% should be a length register.
%    \begin{macrocode}
  \newrobustcmd*{\glsFindWidestUsedAnyNameSymbol}[2][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    #2=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglsused{\@glo@label}%
        {%
          \glsmeasurewidth{\dimen@}%
           {\glstreenamefmt{\glsentryname{\@glo@label}}}%
          \ifdim\dimen@>\gls@tmplen
            \gls@tmplen=\dimen@
            \eglssetwidest{\glsentryname{\@glo@label}}%
          \fi
          \glsmeasurewidth{\dimen@}%
           {\glsentrysymbol{\@glo@label}}%
          \ifdim\dimen@>#2\relax
            #2=\dimen@
          \fi
        }%
        {}%
      }%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsFindWidestAnyNameSymbol}
%\changes{1.05}{2016-06-10}{new}
% Like the above but doesn't check if the entry has been used.
%    \begin{macrocode}
  \newrobustcmd*{\glsFindWidestAnyNameSymbol}[2][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    #2=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \glsmeasurewidth{\dimen@}%
         {\glstreenamefmt{\glsentryname{\@glo@label}}}%
        \ifdim\dimen@>\gls@tmplen
          \gls@tmplen=\dimen@
          \eglssetwidest{\glsentryname{\@glo@label}}%
        \fi
        \glsmeasurewidth{\dimen@}%
         {\glsentrysymbol{\@glo@label}}%
        \ifdim\dimen@>#2\relax
          #2=\dimen@
        \fi
      }%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsFindWidestUsedAnyNameSymbolLocation}
%\changes{1.05}{2016-06-10}{new}
% Like the \cs{glsFindWidestUsedAnyNameSymbol} but also measures the
% location list. This requires \cs{glsentrynumberlist}.
% The length of the widest symbol is stored in the second argument
% should be a length register. The length of the widest location
% list is stored in the third argument, which should also be a
% length register.
%    \begin{macrocode}
  \newrobustcmd*{\glsFindWidestUsedAnyNameSymbolLocation}[3][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    #2=0pt\relax
    #3=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglsused{\@glo@label}%
        {%
          \glsmeasurewidth{\dimen@}%
           {\glstreenamefmt{\glsentryname{\@glo@label}}}%
          \ifdim\dimen@>\gls@tmplen
            \gls@tmplen=\dimen@
            \eglssetwidest{\glsentryname{\@glo@label}}%
          \fi
          \glsmeasurewidth{\dimen@}%
           {\glsentrysymbol{\@glo@label}}%
          \ifdim\dimen@>#2\relax
            #2=\dimen@
          \fi
          \glsmeasurewidth{\dimen@}%
           {\GlsXtrFormatLocationList{\glsentrynumberlist{\@glo@label}}}%
          \ifdim\dimen@>#3\relax
            #3=\dimen@
          \fi
        }%
        {}%
      }%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsFindWidestAnyNameSymbolLocation}
%\changes{1.05}{2016-06-10}{new}
% Like the \cs{glsFindWidestUsedAnyNameSymbol} but doesn't check if
% the entry has been used.
%    \begin{macrocode}
  \newrobustcmd*{\glsFindWidestAnyNameSymbolLocation}[3][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    #2=0pt\relax
    #3=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \glsmeasurewidth{\dimen@}%
         {\glstreenamefmt{\glsentryname{\@glo@label}}}%
        \ifdim\dimen@>\gls@tmplen
          \gls@tmplen=\dimen@
          \eglssetwidest{\glsentryname{\@glo@label}}%
        \fi
        \glsmeasurewidth{\dimen@}%
         {\glsentrysymbol{\@glo@label}}%
        \ifdim\dimen@>#2\relax
          #2=\dimen@
        \fi
        \glsmeasurewidth{\dimen@}%
          {\GlsXtrFormatLocationList{\glsentrynumberlist{\@glo@label}}}%
        \ifdim\dimen@>#3\relax
          #3=\dimen@
        \fi
      }%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsFindWidestUsedAnyNameLocation}
%\changes{1.05}{2016-06-10}{new}
% Like the \cs{glsFindWidestUsedAnyNameSymbolLocation} but doesn't
% measure the symbol. The length of the widest location
% list is stored in the second argument, which should be a
% length register.
%    \begin{macrocode}
  \newrobustcmd*{\glsFindWidestUsedAnyNameLocation}[2][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    #2=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglsused{\@glo@label}%
        {%
          \glsmeasurewidth{\dimen@}%
           {\glstreenamefmt{\glsentryname{\@glo@label}}}%
          \ifdim\dimen@>\gls@tmplen
            \gls@tmplen=\dimen@
            \eglssetwidest{\glsentryname{\@glo@label}}%
          \fi
          \glsmeasurewidth{\dimen@}%
           {\GlsXtrFormatLocationList{\glsentrynumberlist{\@glo@label}}}%
          \ifdim\dimen@>#2\relax
            #2=\dimen@
          \fi
        }%
        {}%
      }%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsFindWidestAnyNameLocation}
%\changes{1.05}{2016-06-10}{new}
% Like the \cs{glsFindWidestAnyNameLocation} but doesn't
% check the first use flag.
%    \begin{macrocode}
  \newrobustcmd*{\glsFindWidestAnyNameLocation}[2][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    #2=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \glsmeasurewidth{\dimen@}%
         {\glstreenamefmt{\glsentryname{\@glo@label}}}%
        \ifdim\dimen@>\gls@tmplen
          \gls@tmplen=\dimen@
          \eglssetwidest{\glsentryname{\@glo@label}}%
        \fi
        \glsmeasurewidth{\dimen@}%
         {\GlsXtrFormatLocationList{\glsentrynumberlist{\@glo@label}}}%
        \ifdim\dimen@>#2\relax
          #2=\dimen@
        \fi
      }%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrComputeTreeIndent}
%\changes{1.05}{2016-06-10}{new}
% Compute the value of \cs{glstreeindent}. Argument is the entry label.
% (Ignored in default definition, but this command may be redefined
% to take the particular entry into account.)  Note that the
% sub-levels modify \cs{glstreeindent}.
%    \begin{macrocode}
  \newcommand*{\glsxtrComputeTreeIndent}[1]{%
    \glstreeindent=\glsxtrtreetopindent\relax
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrComputeTreeSubIndent}
%\changes{1.05}{2016-06-10}{new}
%\begin{definition}
%\cs{glsxtrComputeTreeSubIndent}\marg{level}\marg{label}\marg{register}
%\end{definition}
% Compute the indent for the sub-entries. The first argument is the
% level, the second argument is the entry label and the third
% argument is the length register used to store the computed indent.
%    \begin{macrocode}
  \newcommand*{\glsxtrComputeTreeSubIndent}[3]{%
    \ifcsundef{@glswidestname\romannumeral#1}%
    {%
      \glsmeasurewidth{#3}{\glstreenamefmt{\@glswidestname\space}}%
    }%
    {%
      \glsmeasurewidth{#3}{\glstreenamefmt{%
             \csname @glswidestname\romannumeral#1\endcsname\space}}%
    }%
  }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrAltTreeSetHangIndent}
%\changes{1.05}{2016-06-10}{new}
% Set \cs{hangindent} for top-level entries:
%    \begin{macrocode}
  \newcommand*{\glsxtrAltTreeSetHangIndent}{\hangindent\glstreeindent}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrAltTreeSetSubHangIndent}
%\changes{1.05}{2016-06-10}{new}
% Set \cs{hangindent} for sub-entries:
%    \begin{macrocode}
  \newcommand*{\glsxtrAltTreeSetSubHangIndent}[1]{\hangindent\glstreeindent}
%    \end{macrocode}
%\end{macro}
%
% Redefine \glostyle{alttree}:
%    \begin{macrocode}
  \renewglossarystyle{alttree}{%
    \renewenvironment{theglossary}%
      {%
       \glsxtralttreeInit
       \def\@gls@prevlevel{-1}%
       \mbox{}\par}%
      {\par}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{}%
    \renewcommand{\glossentry}[2]{%
      \ifnum\@gls@prevlevel=0\relax
      \else
        \glsxtrComputeTreeIndent{##1}%
      \fi
      \parindent\glstreeindent
      \glsxtrAltTreeSetHangIndent
      \makebox[0pt][r]%
      {%
        \glstreenamebox{\glstreeindent}%
        {%
           \glsentryitem{##1}%
           \glstreenamefmt{\glstarget{##1}{\glossentryname{##1}}}%
        }%
      }%
      \glsxtralttreeSymbolDescLocation{##1}{##2}%
      \def\@gls@prevlevel{0}%
    }
    \renewcommand{\subglossentry}[3]{%
      \ifnum##1=1\relax
        \glssubentryitem{##2}%
      \fi
      \ifnum\@gls@prevlevel=##1\relax
      \else
        \glsxtrComputeTreeSubIndent{##1}{##2}{\gls@tmplen}%
        \ifnum\@gls@prevlevel<##1\relax
          \setlength\glstreeindent\gls@tmplen
          \addtolength\glstreeindent\parindent
          \parindent\glstreeindent
        \else
          \ifnum\@gls@prevlevel=0\relax
            \glsxtrComputeTreeIndent{##2}%
          \else
            \glsxtrComputeTreeSubIndent{\@gls@prevlevel}{##2}{\glstreeindent}%
          \fi
          \addtolength\parindent{-\glstreeindent}%
          \setlength\glstreeindent\parindent
        \fi
      \fi
      \glsxtrAltTreeSetSubHangIndent{##1}%
      \makebox[0pt][r]{\glstreenamebox{\gls@tmplen}{%
        \glstreenamefmt{\glstarget{##2}{\glossentryname{##2}}}}}%
      \glsxtralttreeSubSymbolDescLocation{##1}{##2}{##3}%
      \def\@gls@prevlevel{##1}%
    }%
    \renewcommand*{\glsgroupskip}{\ifglsnogroupskip\else\glstreegroupskip\fi}%
  }
}%
{%
}
%    \end{macrocode}
%Redefine \glostyle{alttreegroup} so that it discourages a break
%after group headings.
%\changes{1.21}{2017-11-03}{redefined \texttt{alttreegroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@alttreegroup}
{
%    \end{macrocode}
%\begin{macro}{\glsalttreesubgroupitem}
%\begin{definition}
%\cs{glsalttreesubgroupheader}\marg{previous group level}\marg{group
%level}\marg{parent label}\marg{group label}\marg{title}\marg{width}
%\end{definition}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
 \newcommand*{\glsalttreesubgroupheader}[6]{%
   \par\smallskip
   \makebox[0pt][r]{\glstreenamebox{#6}%
     {\glstreegroupheaderfmt{#5}}}%
   \smallskip\par
  }
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
  \renewglossarystyle{alttreegroup}{%
    \setglossarystyle{alttree}%
    \renewcommand{\glsgroupheading}[1]{\par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \glstreegroupheaderfmt{\glsxtr@grptitle}%
%    \end{macrocode}
%Can't use \cs{@afterheading} here as it messes with the first item
%of the group.
%    \begin{macrocode}
      \glstreegroupheaderskip
    }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
      \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
      \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
%    \end{macrocode}
%This is similar to \cs{subglossentry}
%    \begin{macrocode}
      \ifnum\@gls@prevlevel=##2\relax
      \else
        \ifcsundef{@glswidestname\romannumeral##2}%
        {%
          \glsmeasurewidth{\gls@tmplen}{\glstreenamefmt{\@glswidestname\space}}%
        }%
        {%
          \glsmeasurewidth{\gls@tmplen}{\glstreenamefmt{%
                 \csname @glswidestname\romannumeral##2\endcsname\space}}%
        }%
        \ifnum\@gls@prevlevel<##2\relax
          \setlength\glstreeindent\gls@tmplen
          \addtolength\glstreeindent\parindent
          \parindent\glstreeindent
        \else
          \ifnum\@gls@prevlevel=0\relax
            \glsxtrComputeTreeIndent{##2}%
          \else
            \ifcsundef{@glswidestname\romannumeral##2}%
            {%
              \glsmeasurewidth{\glstreeindent}{\glstreenamefmt{\@glswidestname\space}}%
            }%
            {%
              \glsmeasurewidth{\glstreeindent}{\glstreenamefmt{%
                     \csname @glswidestname\romannumeral##2\endcsname\space}}%
            }%
          \fi
          \addtolength\parindent{-\glstreeindent}%
          \setlength\glstreeindent\parindent
        \fi
      \fi
      \glsxtrAltTreeSetSubHangIndent{##2}%
      \glsalttreesubgroupheader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}{\gls@tmplen}%
      \def\@gls@prevlevel{##2}%
      \par
    }%
  }%
}%
{%
}
%    \end{macrocode}
%Similarly for \glostyle{alttreehypergroup}.
%\changes{1.21}{2017-11-03}{redefined \texttt{alttreehypergroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@alttreehypergroup}
{%
  \renewglossarystyle{alttreehypergroup}{%
    \setglossarystyle{alttree}%
    \renewcommand*{\glossaryheader}{%
      \par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glstreenavigationfmt{\glsnavigation}%
%    \end{macrocode}
%Can't use \cs{@afterheading} here as it messes with the first item
%of the group.
%    \begin{macrocode}
      \glstreegroupheaderskip
    }%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
%    \end{macrocode}
%Can't use \cs{@afterheading} here as it messes with the first item
%of the group.
%    \begin{macrocode}
      \glstreegroupheaderskip
    }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
      \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
      \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
%    \end{macrocode}
%This is similar to \cs{subglossentry}
%    \begin{macrocode}
      \ifnum\@gls@prevlevel=##2\relax
      \else
        \ifcsundef{@glswidestname\romannumeral##2}%
        {%
          \glsmeasurewidth{\gls@tmplen}{\glstreenamefmt{\@glswidestname\space}}%
        }%
        {%
          \glsmeasurewidth{\gls@tmplen}{\glstreenamefmt{%
                 \csname @glswidestname\romannumeral##2\endcsname\space}}%
        }%
        \ifnum\@gls@prevlevel<##2\relax
          \setlength\glstreeindent\gls@tmplen
          \addtolength\glstreeindent\parindent
          \parindent\glstreeindent
        \else
          \ifnum\@gls@prevlevel=0\relax
            \glsxtrComputeTreeIndent{##2}%
          \else
            \ifcsundef{@glswidestname\romannumeral##2}%
            {%
              \glsmeasurewidth{\glstreeindent}{\glstreenamefmt{\@glswidestname\space}}%
            }%
            {%
              \glsmeasurewidth{\glstreeindent}{\glstreenamefmt{%
                     \csname @glswidestname\romannumeral##2\endcsname\space}}%
            }%
          \fi
          \addtolength\parindent{-\glstreeindent}%
          \setlength\glstreeindent\parindent
        \fi
      \fi
      \glsxtrAltTreeSetSubHangIndent{##2}%
      \glsalttreesubgroupheader{##1}{##2}{##3}{##4}%
        {\glsnavhypertarget{##4}{\glsxtr@grptitle}}{\gls@tmplen}%
      \def\@gls@prevlevel{##2}%
      \par
    }%
  }
}%
{%
}
%    \end{macrocode}
%
%\subsection{Multicolumn Styles}
%Adjust \glostyle{mcolindexgroup} to discourage page breaks after
%the group headings.
%\changes{1.21}{2017-11-03}{redefined \texttt{mcolindexgroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@mcolindexgroup}
{%
  \renewglossarystyle{mcolindexgroup}{%
    \setglossarystyle{mcolindex}%
%    \end{macrocode}
% Group heading as \glostyle{indexgroup}.
%    \begin{macrocode}
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \item\glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip\@afterheading
    }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
      \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
      \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
      \glsindexsubgroupitem{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
      \@afterheading
    }%
  }
}%
{%
}
%    \end{macrocode}
%Similarly for \glostyle{mcolindexhypergroup}.
%\changes{1.21}{2017-11-03}{redefined \texttt{mcolindexhypergroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@mcolindexhypergroup}
{%
  \renewglossarystyle{mcolindexhypergroup}{%
    \setglossarystyle{mcolindex}%
    \renewcommand*{\glossaryheader}{%
      \item\glstreenavigationfmt{\glsnavigation}%
%    \end{macrocode}
%\changes{1.42}{2020-02-03}{added \cs{@afterheading}}
%    \begin{macrocode}
      \glstreegroupheaderskip\@afterheading
    }%
%    \end{macrocode}
% Group heading.
%    \begin{macrocode}
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \item\glstreegroupheaderfmt
        {\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading
    }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
      \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
      \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
      \glsindexsubgroupitem{##1}{##2}{##3}{##4}%
        {\glsnavhypertarget{##4}{\glsxtr@grptitle}}%
      \@afterheading
    }%
  }
}%
{%
}
%    \end{macrocode}
%Similarly for \glostyle{mcolindexspannav}.
%\changes{1.21}{2017-11-03}{redefined \texttt{mcolindexspannav} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@mcolindexspannav}
{%
  \renewglossarystyle{mcolindexspannav}{%
    \setglossarystyle{index}%
    \renewenvironment{theglossary}%
    {%
     \begin{multicols}{\glsmcols}[\noindent\glstreenavigationfmt{\glsnavigation}]%
     \setlength{\parindent}{0pt}%
     \setlength{\parskip}{0pt plus 0.3pt}%
     \let\item\glstreeitem}%
    {\end{multicols}}%
%    \end{macrocode}
% Group heading.
%    \begin{macrocode}
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \item\glstreegroupheaderfmt
        {\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading
    }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
      \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
      \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
      \glsindexsubgroupitem{##1}{##2}{##3}{##4}%
        {\glsnavhypertarget{##4}{\glsxtr@grptitle}}%
      \@afterheading
    }%
  }
}%
{%
}
%    \end{macrocode}
%Similarly for \glostyle{mcoltreegroup}.
%\changes{1.21}{2017-11-03}{redefined \texttt{mcoltreegroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@mcoltreegroup}
{%
  \renewglossarystyle{mcoltreegroup}{%
    \setglossarystyle{mcoltree}%
%    \end{macrocode}
% Group heading.
%    \begin{macrocode}
    \renewcommand{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent\glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip\@afterheading
    }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
     \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
     \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
     \glstreesubgroupitem{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
    }%
  }
}%
{%
}
%    \end{macrocode}
%Similarly for \glostyle{mcoltreehypergroup}.
%\changes{1.21}{2017-11-03}{redefined \texttt{mcoltreehypergroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@mcoltreehypergroup}
{%
  \renewglossarystyle{mcoltreehypergroup}{%
    \setglossarystyle{mcoltree}%
    \renewcommand*{\glossaryheader}{%
      \par\noindent\glstreenavigationfmt{\glsnavigation}%
      \glstreegroupheaderskip
    }%
%    \end{macrocode}
% Group heading.
%    \begin{macrocode}
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading
    }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
      \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
      \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
      \glstreesubgroupitem{##1}{##2}{##3}{##4}%
        {\glsnavhypertarget{##4}{\glsxtr@grptitle}}%
    }%
  }
}%
{%
}
%    \end{macrocode}
%Similarly for \glostyle{mcoltreespannav}.
%\changes{1.21}{2017-11-03}{redefined \texttt{mcoltreespannav} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@mcoltreespannav}
{%
  \renewglossarystyle{mcoltreespannav}{%
    \setglossarystyle{tree}%
    \renewenvironment{theglossary}%
    {%
       \begin{multicols}{\glsmcols}%
         [\noindent\glstreenavigationfmt{\glsnavigation}]%
       \setlength{\parindent}{0pt}%
       \setlength{\parskip}{0pt plus 0.3pt}%
    }%
    {\end{multicols}}%
%    \end{macrocode}
% Group heading.
%    \begin{macrocode}
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading
    }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
      \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
      \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
      \glstreesubgroupitem{##1}{##2}{##3}{##4}%
        {\glsnavhypertarget{##4}{\glsxtr@grptitle}}%
    }%
  }
}%
{%
}
%    \end{macrocode}
%Similarly for \glostyle{mcoltreenonamegroup}.
%\changes{1.21}{2017-11-03}{redefined \texttt{mcoltreenonamegroup} to discourage
%breaks after group headings}
%There are no sub-groups for this style as it doesn't show the name
%of the child entries.
%    \begin{macrocode}
\ifdef{\@glsstyle@mcoltreenonamegroup}
{%
  \renewglossarystyle{mcoltreenonamegroup}{%
    \setglossarystyle{mcoltreenoname}%
    \renewcommand{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent\glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip\@afterheading
    }%
  }
}%
{%
}
%    \end{macrocode}
%Similarly for \glostyle{mcoltreenonamehypergroup}.
%\changes{1.21}{2017-11-03}{redefined \texttt{mcoltreenonamehypergroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@mcoltreenonamehypergroup}
{%
  \renewglossarystyle{mcoltreenonamehypergroup}{%
    \setglossarystyle{mcoltreenoname}%
    \renewcommand*{\glossaryheader}{%
      \par\noindent\glstreenavigationfmt{\glsnavigation}%
      \glstreegroupheaderskip
    }%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading}%
  }
}%
{%
}
%    \end{macrocode}
%Similarly for \glostyle{mcoltreenonamespannav}.
%\changes{1.21}{2017-11-03}{redefined \texttt{mcoltreenonamespannav} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@mcoltreenonamespannav}
{%
  \renewglossarystyle{mcoltreenonamespannav}{%
    \setglossarystyle{treenoname}%
    \renewenvironment{theglossary}%
    {%
       \begin{multicols}{\glsmcols}%
         [\noindent\glstreenavigationfmt{\glsnavigation}]%
       \setlength{\parindent}{0pt}%
       \setlength{\parskip}{0pt plus 0.3pt}%
    }%
    {\end{multicols}}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading}%
  }
}%
{%
}
%    \end{macrocode}
%\glostyle{mcolalttree} needs adjusting so that it uses \cs{glsxtralttreeInit}
%This doesn't use \verb|\mbox{}\par| which would unbalance the top
%of the columns.
%\changes{1.21}{2017-11-03}{adjusted mcolalttree}
%    \begin{macrocode}
\ifdef{\@glsstyle@mcolalttree}
{%
  \renewglossarystyle{mcolalttree}{%
    \setglossarystyle{alttree}%
    \renewenvironment{theglossary}%
    {%
       \glsxtralttreeInit
       \def\@gls@prevlevel{-1}%
       \begin{multicols}{\glsmcols}%
    }%
    {\par\end{multicols}}%
  }
}%
{%
}
%    \end{macrocode}
%Redefine \glostyle{mcolalttreegroup} to discourage page breaks
%after the group headings.
%\changes{1.21}{2017-11-03}{redefined \texttt{mcolalttreegroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@mcolalttreegroup}
{%
  \renewglossarystyle{mcolalttreegroup}{%
    \setglossarystyle{mcolalttree}%
    \renewcommand{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip
    }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
      \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
      \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
%    \end{macrocode}
%This is similar to \cs{subglossentry}
%    \begin{macrocode}
      \ifnum\@gls@prevlevel=##2\relax
      \else
        \ifcsundef{@glswidestname\romannumeral##2}%
        {%
          \glsmeasurewidth{\gls@tmplen}{\glstreenamefmt{\@glswidestname\space}}%
        }%
        {%
          \glsmeasurewidth{\gls@tmplen}{\glstreenamefmt{%
                 \csname @glswidestname\romannumeral##2\endcsname\space}}%
        }%
        \ifnum\@gls@prevlevel<##2\relax
          \setlength\glstreeindent\gls@tmplen
          \addtolength\glstreeindent\parindent
          \parindent\glstreeindent
        \else
          \ifnum\@gls@prevlevel=0\relax
            \glsxtrComputeTreeIndent{##2}%
          \else
            \ifcsundef{@glswidestname\romannumeral##2}%
            {%
              \glsmeasurewidth{\glstreeindent}{\glstreenamefmt{\@glswidestname\space}}%
            }%
            {%
              \glsmeasurewidth{\glstreeindent}{\glstreenamefmt{%
                     \csname @glswidestname\romannumeral##2\endcsname\space}}%
            }%
          \fi
          \addtolength\parindent{-\glstreeindent}%
          \setlength\glstreeindent\parindent
        \fi
      \fi
      \glsxtrAltTreeSetSubHangIndent{##2}%
      \glsalttreesubgroupheader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}{\gls@tmplen}%
      \def\@gls@prevlevel{##2}%
      \par
    }%
  }
}%
{%
}
%    \end{macrocode}
%Similarly for \glostyle{mcolalttreehypergroup}.
%\changes{1.21}{2017-11-03}{redefined \texttt{mcolalttreehypergroup} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@mcolalttreehypergroup}
{%
  \renewglossarystyle{mcolalttreehypergroup}{%
    \setglossarystyle{mcolalttree}%
    \renewcommand*{\glossaryheader}{%
      \par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glstreenavigationfmt{\glsnavigation}%
      \glstreegroupheaderskip
    }%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip
    }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
      \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
      \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
%    \end{macrocode}
%This is similar to \cs{subglossentry}
%    \begin{macrocode}
      \ifnum\@gls@prevlevel=##2\relax
      \else
        \ifcsundef{@glswidestname\romannumeral##2}%
        {%
          \glsmeasurewidth{\gls@tmplen}{\glstreenamefmt{\@glswidestname\space}}%
        }%
        {%
          \glsmeasurewidth{\gls@tmplen}{\glstreenamefmt{%
                 \csname @glswidestname\romannumeral##2\endcsname\space}}%
        }%
        \ifnum\@gls@prevlevel<##2\relax
          \setlength\glstreeindent\gls@tmplen
          \addtolength\glstreeindent\parindent
          \parindent\glstreeindent
        \else
          \ifnum\@gls@prevlevel=0\relax
            \glsxtrComputeTreeIndent{##2}%
          \else
            \ifcsundef{@glswidestname\romannumeral##2}%
            {%
              \glsmeasurewidth{\glstreeindent}{\glstreenamefmt{\@glswidestname\space}}%
            }%
            {%
              \glsmeasurewidth{\glstreeindent}{\glstreenamefmt{%
                     \csname @glswidestname\romannumeral##2\endcsname\space}}%
            }%
          \fi
          \addtolength\parindent{-\glstreeindent}%
          \setlength\glstreeindent\parindent
        \fi
      \fi
      \glsxtrAltTreeSetSubHangIndent{##2}%
      \glsalttreesubgroupheader{##1}{##2}{##3}{##4}%
        {\glsnavhypertarget{##4}{\glsxtr@grptitle}}{\gls@tmplen}%
      \def\@gls@prevlevel{##2}%
      \par
    }%
  }
}%
{%
}
%    \end{macrocode}
%Similarly for \glostyle{mcolalttreespannav}.
%\changes{1.21}{2017-11-03}{redefined \texttt{mcolalttreespannav} to discourage
%breaks after group headings}
%    \begin{macrocode}
\ifdef{\@glsstyle@mcolalttreespannav}
{%
  \renewglossarystyle{mcolalttreespannav}{%
    \setglossarystyle{alttree}%
    \renewenvironment{theglossary}%
    {%
       \glsxtralttreeInit
       \def\@gls@prevlevel{-1}%
       \begin{multicols}{\glsmcols}%
          [\noindent\glstreenavigationfmt{\glsnavigation}]%
    }%
    {\par\end{multicols}}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip
    }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
    \renewcommand*{\glssubgroupheading}[4]{%
      \glsxtrgetgrouptitle{##4}{\glsxtr@grptitle}%
      \glstreeSubPreHeader{##1}{##2}{##3}{##4}{\glsxtr@grptitle}%
%    \end{macrocode}
%This is similar to \cs{subglossentry}
%    \begin{macrocode}
      \ifnum\@gls@prevlevel=##2\relax
      \else
        \ifcsundef{@glswidestname\romannumeral##2}%
        {%
          \glsmeasurewidth{\gls@tmplen}{\glstreenamefmt{\@glswidestname\space}}%
        }%
        {%
          \glsmeasurewidth{\gls@tmplen}{\glstreenamefmt{%
                 \csname @glswidestname\romannumeral##2\endcsname\space}}%
        }%
        \ifnum\@gls@prevlevel<##2\relax
          \setlength\glstreeindent\gls@tmplen
          \addtolength\glstreeindent\parindent
          \parindent\glstreeindent
        \else
          \ifnum\@gls@prevlevel=0\relax
            \glsxtrComputeTreeIndent{##2}%
          \else
            \ifcsundef{@glswidestname\romannumeral##2}%
            {%
              \glsmeasurewidth{\glstreeindent}{\glstreenamefmt{\@glswidestname\space}}%
            }%
            {%
              \glsmeasurewidth{\glstreeindent}{\glstreenamefmt{%
                     \csname @glswidestname\romannumeral##2\endcsname\space}}%
            }%
          \fi
          \addtolength\parindent{-\glstreeindent}%
          \setlength\glstreeindent\parindent
        \fi
      \fi
      \glsxtrAltTreeSetSubHangIndent{##2}%
      \glsalttreesubgroupheader{##1}{##2}{##3}{##4}%
        {\glsnavhypertarget{##4}{\glsxtr@grptitle}}{\gls@tmplen}%
      \def\@gls@prevlevel{##2}%
      \par
    }%
  }
}%
{%
}
%    \end{macrocode}
%
% Reset the default style
%    \begin{macrocode}
\ifx\@glossary@default@style\relax
\else
  \setglossarystyle{\@glsxtr@current@style}
\fi
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossaries-extra-stylemods.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossary-bookindex.sty>
%    \end{macrocode}
%\fi
%\section{bookindex style (\sty{glossary-bookindex.sty})}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
%    \end{macrocode}
% Rollback releases:
%    \begin{macrocode}
\DeclareRelease{v1.48}{2021-11-22}{glossary-bookindex-2021-11-22.sty}
\DeclareCurrentRelease{1.9}{2025-11-03}
%    \end{macrocode}
% Declare package:
%    \begin{macrocode}
\ProvidesPackage{glossary-bookindex}[2026/03/06 v2.0 (NLCT)]
%    \end{macrocode}
%Load required packages.
%    \begin{macrocode}
\RequirePackage{multicol}
\RequirePackage{glossary-tree}
%    \end{macrocode}
%\begin{macro}{\glsxtrbookindexcols}
%\changes{1.21}{2017-11-03}{new}
% Number of columns.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexcols}{2}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindextarget}
%\changes{1.54}{2025-01-03}{new}
%Create the target for top-level items.
%    \begin{macrocode}
\newcommand*{\glsxtrbookindextarget}[2]{\glstarget{#1}{#2}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindexsubtarget}
%\changes{1.54}{2025-01-03}{new}
%Create the target for child items.
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexsubtarget}[2]{\glsxtrbookindextarget{#1}{#2}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindexname}
%\changes{1.21}{2017-11-03}{new}
%Format used for top-level entries.
% (Argument is the label.)
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexname}[1]{\glossentryname{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindexsubname}
%\changes{1.21}{2017-11-03}{new}
%Format used for sub entries.
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexsubname}[1]{\glsxtrbookindexname{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrprelocation}
%\changes{1.21}{2017-11-03}{new}
%Provide in case \sty{glossaries-stylemods} isn't loaded.
%    \begin{macrocode}
\providecommand*{\glsxtrprelocation}{\space}
%    \end{macrocode}
%\end{macro}

%\begin{macro}{\glsxtrbookindexprelocation}
%\changes{1.21}{2017-11-03}{new}
%Separator used before location list for top-level entries.
%Version 1.22 has removed the \cs{ifglsnopostdot} check 
%since this style doesn't display the description.
%\changes{1.22}{2017-11-08}{removed check for no post dot}
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexprelocation}[1]{%
  \glsxtrifhasfield{location}{#1}%
  {,\glsxtrprelocation}%
  {\glsxtrprelocation}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindexsubprelocation}
%\changes{1.21}{2017-11-03}{new}
%Separator used before location list for sub-entries.
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexsubprelocation}[1]{%
 \glsxtrbookindexprelocation{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexlocation}
%\changes{1.39}{2019-03-22}{new}
%\begin{definition}
%\cs{glsxtrbookindexlocation}\marg{label}\marg{location}
%\end{definition}
%Displays the location.
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexlocation}[2]{#2}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexsublocation}
%\changes{1.39}{2019-03-22}{new}
%\begin{definition}
%\cs{glsxtrbookindexlocation}\marg{label}\marg{location}
%\end{definition}
%Displays the location for sub-entries.
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexsublocation}{\glsxtrbookindexlocation}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexparentchildsep}
%\changes{1.21}{2017-11-03}{new}
%Separator used between top-level parent and child entry.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexparentchildsep}{\nopagebreak}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindexparentsubchildsep}
%\changes{1.21}{2017-11-03}{new}
%Separator used between sub-level parent and child entry.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexparentsubchildsep}{\glsxtrbookindexparentchildsep}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexbetween}
%\changes{1.21}{2017-11-03}{new}
%Between two top-level entries identified by the labels in the
%arguments.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexbetween}[2]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindexsubbetween}
%\changes{1.21}{2017-11-03}{new}
%Between two level~1 entries identified by the labels in the
%arguments.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexsubbetween}[2]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindexsubsubbetween}
%\changes{1.21}{2017-11-03}{new}
%Between two level~2 entries identified by the labels in the
%arguments.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexsubsubbetween}[2]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindexatendgroup}
%\changes{1.21}{2017-11-03}{new}
%At the end of a letter group. The argument is the label of the last
%top-level entry.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexatendgroup}[1]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindexsubatendgroup}
%\changes{1.21}{2017-11-03}{new}
%At the end of a letter group. The argument is the label of the last
%level~1 entry.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexsubatendgroup}[1]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindexsubsubatendgroup}
%\changes{1.21}{2017-11-03}{new}
%At the end of a letter group. The argument is the label of the last
%level~2 entry.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexsubsubatendgroup}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexgroupskip}
%\changes{1.21}{2017-11-03}{new}
%Group separator.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexgroupskip}{\ifglsnogroupskip\else\indexspace\fi}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexpregroupskip}
%\changes{1.49}{2022-10-14}{new}
%After group header. The argument is the skip that would normally
%be inserted if there wasn't a group header.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexpregroupskip}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexpostgroupskip}
%\changes{1.49}{2022-10-14}{new}
%After group header.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexpostgroupskip}{\indexspace}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexpresubgroupskip}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glsxtrbookindexpresubgroupskip}\marg{default}\marg{prev group
%level}\marg{group level}
%\end{definition}
%Before sub-group separator.
%The first argument is the skip that would normally be used at this
%point if there wasn't a header.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexpresubgroupskip}[3]{\par\medskip}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexpostsubgroupskip}
%\changes{1.49}{2022-10-14}{new}
%After sub-group separator.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexpostsubgroupskip}[2]{\par\medskip}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexsubsubitem}
%\changes{1.54}{2025-01-03}{new}
%Sub-sub item and lower. The argument is the level, which will be 2
%or more.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexsubsubitem}[1]{\glstreesubsubitem}
%    \end{macrocode}
%\end{macro}
%
%Format group title.
%\begin{macro}{\glsxtrbookindexformatheader}
%\changes{1.21}{2017-11-03}{new}
%Group header.
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexformatheader}[1]{%
  \par{\centering\glstreegroupheaderfmt{#1}\par}%
}
%    \end{macrocode}
%\end{macro}
%Format sub-group title.
%\begin{macro}{\glsxtrbookindexformatsubheader}
%\changes{1.49}{2022-10-14}{new}
%Sub-group header. This defaults to the same format as the
%top-level group.
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexformatsubheader}[5]{%
 \ifnum#2>1\relax
  \glsxtrbookindexsubsubitem{#2}\glstreegroupheaderfmt{#5}%
 \else
  \glstreesubitem\glstreegroupheaderfmt{#5}%
 \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindexbookmark}
%\changes{1.21}{2017-11-03}{new}
%Book mark group heading if supported.
%    \begin{macrocode}
\ifdef\pdfbookmark
{%
  \newcommand*{\glsxtrbookindexbookmark}[2]{%
    \ifdefstring{\@@glossarysec}{chapter}%
    {\pdfbookmark[1]{#1}{#2}}%
    {\pdfbookmark[2]{#1}{#2}}%
  }
}
{%
  \newcommand*{\glsxtrbookindexbookmark}[2]{}
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexsubbookmark}
%\changes{1.49}{2022-10-14}{new}
%Book mark sub-group heading if supported.
%    \begin{macrocode}
\ifdef\pdfbookmark
{%
  \newcommand*{\glsxtrbookindexsubbookmark}[3]{%
    \ifdefstring{\@@glossarysec}{chapter}%
    {\expandafter\pdfbookmark\expandafter[\number\numexpr#1+1]{#3}{#2}}%
    {\expandafter\pdfbookmark\expandafter[\number\numexpr#1+2]{#3}{#2}}%
  }
}
{%
  \newcommand*{\glsxtrbookindexsubbookmark}[3]{}
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexbookmarkprefix}
%\changes{1.42}{2020-02-03}{new}
%Make the bookmark label prefix used for letter groups depend on the glossary label
%(instead of original hardcoded ``index.'').
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexbookmarkprefix}{\currentglossary.}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexcolspread}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexcolspread}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexmulticolsenv}
%\changes{1.25}{2017-11-14}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexmulticolsenv}{multicols}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{bookindex}
%Define the style.
%    \begin{macrocode}
\newglossarystyle{bookindex}{%
  \setglossarystyle{index}%
  \renewenvironment{theglossary}%
  {%
    \ifnum\glsxtrbookindexcols>1\relax
      \ifdefempty\glsxtrbookindexcolspread
      {%
        \edef\glsxtr@beginbookindex{%
          \noexpand\begin{\glsxtrbookindexmulticolsenv}
            {\glsxtrbookindexcols}%
        }%
      }%
      {%
        \edef\glsxtr@beginbookindex{%
          \noexpand\begin{\glsxtrbookindexmulticolsenv}%
            {\glsxtrbookindexcols}[\glsxtrbookindexcolspread]%
        }%
      }%
    \else
      \def\glsxtr@beginbookindex{}%
    \fi
    \glsxtr@beginbookindex
    \setlength{\parindent}{0pt}%
    \setlength{\parskip}{0pt plus 0.3pt}%
    \let\@glsxtr@bookindex@sep\glsxtrbookindexparentchildsep
    \let\@glsxtr@bookindex@subsep\glsxtrbookindexparentsubchildsep
    \let\@glsxtr@bookindex@between\@gobble
    \let\@glsxtr@bookindex@subbetween\@gobble
    \let\@glsxtr@bookindex@subsubbetween\@gobble
    \let\@glsxtr@bookindex@atendgroup\relax
    \let\@glsxtr@bookindex@subatendgroup\relax
    \let\@glsxtr@bookindex@subsubatendgroup\relax
    \let\@glsxtr@bookindexgroupskip\relax
  }%
  {%
%    \end{macrocode}
% Do end group hooks.
%    \begin{macrocode}
     \@glsxtr@bookindex@subsubatendgroup
     \@glsxtr@bookindex@subatendgroup
     \@glsxtr@bookindex@atendgroup
%    \end{macrocode}
%End \env{multicols} environment.
%    \begin{macrocode}
    \ifnum\glsxtrbookindexcols>1\relax
      \edef\glsxtr@endbookindex{%
        \noexpand\end{\glsxtrbookindexmulticolsenv}%
      }%
    \else
      \def\glsxtr@endbookindex{}%
    \fi
    \glsxtr@endbookindex
  }%
%    \end{macrocode}
%Use ragged right as columns are likely to be narrow and
%indexes tend not to be fully justified.
%    \begin{macrocode}
  \renewcommand*{\glossaryheader}{\raggedright}%
%    \end{macrocode}
%Top level entry format.
%    \begin{macrocode}
  \renewcommand*{\glossentry}[2]{%
%    \end{macrocode}
%Do separator.
%    \begin{macrocode}
    \@glsxtr@bookindex@between{##1}%
%    \end{macrocode}
%Update separators.
%    \begin{macrocode}
    \let\@glsxtr@bookindex@sep\glsxtrbookindexparentchildsep
    \let\@glsxtr@bookindex@subsep\glsxtrbookindexparentsubchildsep
    \let\@glsxtr@bookindex@subbetween\@gobble
    \let\@glsxtr@bookindex@subsubbetween\@gobble
%    \end{macrocode}
%The second argument of \cs{glsxtrbookindexbetween} will be supplied
%as the argument to \cs{@glsxtr@bookindex@between}.
%\changes{1.49}{2022-10-14}{replaced \cs{edef} with \cs{protected@edef}}
%    \begin{macrocode}
    \protected@edef\@glsxtr@bookindex@between{%
       \noexpand\glsxtrbookindexbetween{##1}%
    }%
    \protected@edef\@glsxtr@bookindex@atendgroup{%
      \noexpand\glsxtrbookindexatendgroup{##1}%
    }%
    \let\@glsxtr@bookindex@subatendgroup\relax
    \let\@glsxtr@bookindex@subsubatendgroup\relax
%    \end{macrocode}
%Format entry.
%    \begin{macrocode}
    \glstreeitem
      \glsentryitem{##1}%
      \glsxtrbookindextarget{##1}{\glsxtrbookindexname{##1}}%
    \glsxtrbookindexprelocation{##1}%
    \glsxtrbookindexlocation{##1}{##2}%
  }%
  \renewcommand{\subglossentry}[3]{%
    \ifcase##1\relax
%    \end{macrocode}
% Level 0 (shouldn't happen as that's formatted with \cs{glossentry}).
%    \begin{macrocode}
      \glstreeitem
    \or
%    \end{macrocode}
% Level 1.
%    \begin{macrocode}
      \@glsxtr@bookindex@sep
      \@glsxtr@bookindex@subbetween{##2}%
      \let\@glsxtr@bookindex@sep\relax
%    \end{macrocode}
% Update separators.
%    \begin{macrocode}
      \let\@glsxtr@bookindex@subsubbetween\@gobble
      \let\@glsxtr@bookindex@subsep\glsxtrbookindexparentsubchildsep
      \edef\@glsxtr@bookindex@subbetween{%
         \noexpand\glsxtrbookindexsubbetween{##2}%
      }%
      \edef\@glsxtr@bookindex@atsubendgroup{%
        \noexpand\glsxtrbookindexatsubendgroup{##1}%
      }%
%    \end{macrocode}
% Start sub-item.
%    \begin{macrocode}
      \glstreesubitem
      \glssubentryitem{##2}%
    \else
%    \end{macrocode}
% All other levels.
%    \begin{macrocode}
      \@glsxtr@bookindex@subsep
      \@glsxtr@bookindex@subsubbetween{##2}%
%    \end{macrocode}
% Update separators.
%    \begin{macrocode}
      \let\@glsxtr@bookindex@subsep\relax
      \edef\@glsxtr@bookindex@subsubbetween{%
         \noexpand\glsxtrbookindexsubsubbetween{##2}%
      }%
      \edef\@glsxtr@bookindex@atsubsubendgroup{%
        \noexpand\glsxtrbookindexatsubsubendgroup{##1}%
      }%
%    \end{macrocode}
% Start sub-sub-item.
%    \begin{macrocode}
      \glsxtrbookindexsubsubitem{##1}%
    \fi
%    \end{macrocode}
% Format entry.
%    \begin{macrocode}
    \glsxtrbookindexsubtarget{##2}{\glsxtrbookindexsubname{##2}}%
    \glsxtrbookindexsubprelocation{##2}%
    \glsxtrbookindexsublocation{##2}{##3}%
  }%
%    \end{macrocode}
% The group skip is moved to the group heading to avoid interfering
% with the end letter group hooks.
%    \begin{macrocode}
  \renewcommand*{\glsgroupskip}{}%
%    \end{macrocode}
% Group heading format.
%    \begin{macrocode}
  \renewcommand*{\glsgroupheading}[1]{%
%    \end{macrocode}
% Do end group hooks.
%    \begin{macrocode}
    \@glsxtr@bookindex@subsubatendgroup
    \@glsxtr@bookindex@subatendgroup
    \@glsxtr@bookindex@atendgroup
    \glsxtrbookindexpregroupskip\@glsxtr@bookindexgroupskip
%    \end{macrocode}
% Update separators.
%    \begin{macrocode}
    \let\@glsxtr@bookindexgroupskip\glsxtrbookindexgroupskip
    \let\@glsxtr@bookindex@between\@gobble
    \let\@glsxtr@bookindex@atendgroup\relax
    \let\@glsxtr@bookindex@subatendgroup\relax
    \let\@glsxtr@bookindex@subsubatendgroup\relax
%    \end{macrocode}
% Fetch the group title from the label supplied in \verb|#1|.
%\changes{1.41}{2019-04-09}{changed \cs{thisgrptitle} to
%\cs{glsxtrcurrentgrptitle}}%
%    \begin{macrocode}
    \glsxtrgetgrouptitle{##1}{\glsxtrcurrentgrptitle}%
%    \end{macrocode}
% Do the PDF bookmark if supported.
%    \begin{macrocode}
    \glsxtrbookindexbookmark{\glsxtrcurrentgrptitle}{\glsxtrbookindexbookmarkprefix##1}%
%    \end{macrocode}
% Format the group title.
%    \begin{macrocode}
    \glsxtrbookindexformatheader{\glsxtrcurrentgrptitle}%
    \nopagebreak\glsxtrbookindexpostgroupskip\nopagebreak\@afterheading
  }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}[4]{%
%    \end{macrocode}
% Do end group hooks.
%    \begin{macrocode}
    \@glsxtr@bookindex@subsubatendgroup
    \@glsxtr@bookindex@subatendgroup
    \@glsxtr@bookindex@atendgroup
    \glsxtrbookindexpresubgroupskip\@glsxtr@bookindexgroupskip{##1}{##2}%
%    \end{macrocode}
% Update separators.
%    \begin{macrocode}
    \let\@glsxtr@bookindexgroupskip\glsxtrbookindexgroupskip
    \let\@glsxtr@bookindex@between\@gobble
    \let\@glsxtr@bookindex@atendgroup\relax
    \let\@glsxtr@bookindex@subatendgroup\relax
    \let\@glsxtr@bookindex@subsubatendgroup\relax
%    \end{macrocode}
% Get group title.
%    \begin{macrocode}
    \glsxtrgetgrouptitle{##4}{\glsxtrcurrentgrptitle}%
%    \end{macrocode}
% Do the PDF bookmark if supported.
%    \begin{macrocode}
    \glsxtrbookindexsubbookmark{##2}{##4}{\glsxtrcurrentgrptitle}%
%    \end{macrocode}
% Format the group title.
%    \begin{macrocode}
    \glsxtrbookindexformatsubheader{##1}{##2}{##3}{##4}{\glsxtrcurrentgrptitle}%
    \nopagebreak\glsxtrbookindexpostsubgroupskip{##1}{##2}\nopagebreak\@afterheading
  }
}
%    \end{macrocode}
%\end{style}
% Some supplementary commands that may be useful.
% These store the entry label for the current page. Since the page
% number is needed in the control sequence, this uses
% \cs{glsxtrbookindexthepage} instead of \cs{thepage} in case
% the page numbering has been set to something that contains
% formatting commands.
%\begin{macro}{\glsxtrbookindexthepage}
%\changes{1.21}{2017-11-03}{new}
%The \cs{@printglossary} sets \cs{currentglossary} to the current
%glossary label. This is used as a prefix in case the page number is
%reset.
%    \begin{macrocode}
\newcommand{\glsxtrbookindexthepage}{%
 \ifdef\currentglossary{\currentglossary.\arabic{page}}{\arabic{page}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexmarkentry}
%\changes{1.21}{2017-11-03}{new}
%Writes entry information to the \texttt{.aux} file. The argument is
%the entry label.
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexmarkentry}[1]{%
  \protected@write\@auxout
  {\let\glsxtrbookindexthepage\relax}%
  {\string\glsxtr@setbookindexmark{\glsxtrbookindexthepage}{#1}}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtr@setbookindexmark}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtr@setbookindexmark}[2]{%
 \ifcsundef{glsxtr@idxfirstmark@#1}%
 {\csgdef{glsxtr@idxfirstmark@#1}{#2}}%
 {}%
 \csgdef{glsxtr@idxlastmark@#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexfirstmarkfmt}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexfirstmarkfmt}[1]{%
  \glsentryname{#1}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindexfirstmark}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexfirstmark}{%
  \letcs{\glsxtr@label}{glsxtr@idxfirstmark@\glsxtrbookindexthepage}%
  \ifdef\glsxtr@label
  {\glsxtrbookindexfirstmarkfmt{\glsxtr@label}}%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glsxtrbookindexlastmarkfmt}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexlastmarkfmt}[1]{%
  \glsentryname{#1}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glsxtrbookindexlastmark}
%\changes{1.21}{2017-11-03}{new}
%    \begin{macrocode}
\newcommand*{\glsxtrbookindexlastmark}{%
  \letcs{\glsxtr@label}{glsxtr@idxlastmark@\glsxtrbookindexthepage}%
  \ifdef\glsxtr@label
  {\glsxtrbookindexlastmarkfmt{\glsxtr@label}}%
  {}%
}
%    \end{macrocode}
%\end{macro}
%
%\iffalse
%    \begin{macrocode}
%</glossary-bookindex.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossary-longextra.sty>
%    \end{macrocode}
%\fi
%\section{longextra styles (\sty{glossary-longextra.sty})}
%\changes{1.37}{2018-11-30}{new}
%Provides additional long styles.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
%    \end{macrocode}
% Rollback releases:
%    \begin{macrocode}
\DeclareRelease{v1.48}{2021-11-22}{glossary-longextra-2021-11-22.sty}
\DeclareCurrentRelease{1.9}{2025-11-03}
%    \end{macrocode}
% Declare package:
%    \begin{macrocode}
\ProvidesPackage{glossary-longextra}[2026/03/06 v2.0 (NLCT)]
%    \end{macrocode}
%Load required packages.
%    \begin{macrocode}
\RequirePackage{glossary-longbooktabs}
%    \end{macrocode}
%
%\begin{macro}{\glslongextraNameFmt}
%\changes{1.37}{2018-11-30}{new}
%\changes{1.38}{2018-12-01}{bug fix: removed double param}
%\begin{definition}
%\cs{glslongextraNameFmt}\marg{label}
%\end{definition}
%Governs the way the name is displayed.
%    \begin{macrocode}
\newcommand{\glslongextraNameFmt}[1]{%
 \glsentryitem{#1}\glstarget{#1}{\glossentryname{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraDescFmt}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glslongextraDescFmt}\marg{label}
%\end{definition}
%Governs the way the description is displayed.
%    \begin{macrocode}
\newcommand{\glslongextraDescFmt}[1]{%
  \glossentrydesc{#1}\glspostdescription
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSymbolFmt}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glslongextraSymbolFmt}\marg{label}
%\end{definition}
%Governs the way the symbol is displayed.
%    \begin{macrocode}
\newcommand{\glslongextraSymbolFmt}[1]{\glossentrysymbol{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSymbolTargetFmt}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glslongextraSymbolTargetFmt}\marg{label}
%\end{definition}
%Governs the way the symbol is displayed if it needs to include the
%target.
%    \begin{macrocode}
\newcommand{\glslongextraSymbolTargetFmt}[1]{%
 \glsentryitem{#1}\glstarget{#1}{\glslongextraSymbolFmt{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSymbolOrName}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glslongextraSymbolOrName}\marg{label}
%\end{definition}
%Governs the way the symbol is displayed if it needs to include the
%target.
%    \begin{macrocode}
\newcommand{\glslongextraSymbolOrName}[1]{%
  \ifglshassymbol{#1}%
  {\glslongextraSymbolTargetFmt{#1}}%
  {\glslongextraNameFmt{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraLocationFmt}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glslongextraLocationFmt}\marg{label}\marg{location list}
%\end{definition}
%Governs the way the location is displayed.
%    \begin{macrocode}
\newcommand{\glslongextraLocationFmt}[2]{#2}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraShortTargetFmt}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glslongextraShortTargetFmt}\marg{label}
%\end{definition}
%Governs the way the short form is displayed if it needs to include the
%target.
%    \begin{macrocode}
\newcommand{\glslongextraShortTargetFmt}[1]{%
 \glsentryitem{#1}\glstarget{#1}{{\glsxtrshort[noindex,hyper=false]{#1}}}%
 \glsxtrpostnamehook{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraLongFmt}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glslongextraLongFmt}\marg{label}
%\end{definition}
%Governs the way the long form is displayed.
%    \begin{macrocode}
\newcommand{\glslongextraLongFmt}[1]{%
 {\glsxtrlong[noindex,hyper=false]{#1}}\glspostdescription
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSubNameFmt}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glslongextraSubNameFmt}\marg{level}\marg{label}
%\end{definition}
%Governs the way the child name is displayed. Just does the
%sub-entry counter, if enabled, and the target.
%    \begin{macrocode}
\newcommand{\glslongextraSubNameFmt}[2]{%
 \glssubentryitem{#2}\glstarget{#2}{\strut}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSubDescFmt}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glslongextraSubDescFmt}\marg{level}\marg{label}
%\end{definition}
%Governs the way the child description is displayed.
%    \begin{macrocode}
\newcommand{\glslongextraSubDescFmt}[2]{%
  \glslongextraDescFmt{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSubSymbolFmt}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glslongextraSubSymbolFmt}\marg{level}\marg{label}
%\end{definition}
%Governs the way the child symbol is displayed.
%    \begin{macrocode}
\newcommand{\glslongextraSubSymbolFmt}[2]{%
  \glslongextraSymbolFmt{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSubSymbolTargetFmt}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glslongextraSubSymbolTargetFmt}\marg{level}\marg{label}
%\end{definition}
%Governs the way the child symbol is displayed if the target is
%required.
%    \begin{macrocode}
\newcommand{\glslongextraSubSymbolTargetFmt}[2]{%
 \glssubentryitem{#2}\glstarget{#2}{\glslongextraSymbolFmt{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSubSymbolOrName}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glslongextraSubSymbolOrName}\marg{level}\marg{label}
%\end{definition}
%Shows the symbol or the name (if the symbol isn't set) as the
%target for sub-entries.
%    \begin{macrocode}
\newcommand{\glslongextraSubSymbolOrName}[2]{%
  \ifglshassymbol{#2}%
  {\glslongextraSubSymbolTargetFmt{#1}{#2}}%
  {\glslongextraSubNameFmt{#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSubShortTargetFmt}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glslongextraSubShortTargetFmt}\marg{level}\marg{label}
%\end{definition}
%Governs the way the short form is displayed if it needs to include the
%target.
%    \begin{macrocode}
\newcommand{\glslongextraSubShortTargetFmt}[2]{%
 \glssubentryitem{#2}\glstarget{#2}{{\glsxtrshort[noindex,hyper=false]{#2}}}%
 \glsxtrpostnamehook{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSubLongFmt}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glslongextraSubLongFmt}\marg{label}
%\end{definition}
%Governs the way the long form is displayed.
%    \begin{macrocode}
\newcommand{\glslongextraSubLongFmt}[2]{\glslongextraLongFmt{#2}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSubLocationFmt}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glslongextraSubLocationFmt}\marg{level}\marg{label}\marg{location list}
%\end{definition}
%Governs the way the child location list is displayed.
%    \begin{macrocode}
\newcommand{\glslongextraSubLocationFmt}[3]{#3}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameAlign}
%\changes{1.37}{2018-11-30}{new}
%Alignment for the name column.
%    \begin{macrocode}
\newcommand{\glslongextraNameAlign}{l}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraDescAlign}
%\changes{1.37}{2018-11-30}{new}
%Alignment for the description column.
%    \begin{macrocode}
\newcommand{\glslongextraDescAlign}{>{\raggedright}p{\glsdescwidth}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSymbolAlign}
%\changes{1.37}{2018-11-30}{new}
%Alignment for the symbol column.
%    \begin{macrocode}
\newcommand{\glslongextraSymbolAlign}{c}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSymbolNameAlign}
%\changes{1.49}{2022-10-14}{new}
%Alignment for the symbol column when it's being used instead of the
%name.
%    \begin{macrocode}
\newcommand{\glslongextraSymbolNameAlign}{l}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraLocationAlign}
%\changes{1.37}{2018-11-30}{new}
%Alignment for the location column.
%    \begin{macrocode}
\newcommand{\glslongextraLocationAlign}{>{\raggedright}p{\glspagelistwidth}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraGroupHeading}
%\changes{1.37}{2018-11-30}{new}
%Used to format the letter group headings. The first argument is the
%number of columns in the table. The second is the group
%\emph{label} (not the title).
%    \begin{macrocode}
\newcommand{\glslongextraGroupHeading}[2]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSubGroupHeading}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glslongextraSubGroupHeading}\marg{number of columns}\marg{prev group level}\marg{group
%level}\marg{parent entry}\marg{group label}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\glslongextraSubGroupHeading}[5]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraHeaderFormat}
%\changes{1.37}{2018-11-30}{new}
%Format for the column headers.
%    \begin{macrocode}
\newcommand{\glslongextraHeaderFmt}[1]{\textbf{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameDescHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameDescHeader}{%
 \glslongextraNameDescTabularHeader\endhead
 \glslongextraNameDescTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameDescTabularHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameDescTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname & 
 \glslongextraHeaderFmt\descriptionname\tabularnewline
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameDescTabularFooter}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameDescTabularFooter}{%
 \bottomrule
}
%    \end{macrocode}
%\end{macro}
%
%Unlike the \glostyle{alttree} style, there aren't different widths
%for the hierarchical levels.
%\begin{macro}{\glslongextraSetWidest}
%\changes{1.37}{2018-11-30}{new}
%Provide in case the tree styles haven't been loaded.
%    \begin{macrocode}
\newcommand*{\glslongextraSetWidest}[1]{%
 \def\@glslongextrawidestname{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glslongextrawidestname}
%\changes{1.37}{2018-11-30}{new}
%Pick up the widest name from the \glostyle{alttree} style if it has
%been set. (Will expand to nothing otherwise.)
%    \begin{macrocode}
\newcommand*{\@glslongextrawidestname}{\csuse{@glswidestname}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraUpdateWidest}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand*{\glslongextraUpdateWidest}[1]{%
  \ifundef\@glslongextrawidestname
  {\def\@glslongextrawidestname{#1}}%
  {%
    \glsmeasurewidth{\dimen@}{\@glslongextrawidestname}%
    \glsmeasurewidth{\dimen@ii}{#1}%
    \ifdim\dimen@ii>\dimen@
     \def\@glslongextrawidestname{#1}%
    \fi
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraUpdateWidestChild}
%\changes{1.37}{2018-11-30}{new}
%\begin{definition}
%\cs{glslongextraUpdateWidestChild}\marg{level}\marg{text}
%\end{definition}
%Used by \cs{glsxtrSetWidest} in \sty{glossaries-extra-bib2gls}.
%Does nothing by default, since the default action in these styles
%is to omit the child name. If the child name should be displayed,
%then this needs to be redefined to use
%\cs{glslongextraUpdateWidest}.
%    \begin{macrocode}
\newcommand*{\glslongextraUpdateWidestChild}[2]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSetDescWidth}
%\changes{1.37}{2018-11-30}{new}
% Computes the value of \cs{glsdescwidth} for the styles that only
% have name and description columns.
%    \begin{macrocode}
\newcommand{\glslongextraSetDescWidth}{%
  \glsmeasurewidth{\gls@tmplen}{\glslongextraHeaderFmt\entryname}%
%    \end{macrocode}
% Has the widest name been set.
%    \begin{macrocode}
  \glsmeasurewidth{\dimen@}{\glsnamefont{\@glslongextrawidestname}}%
  \ifdim\dimen@>\gls@tmplen
   \gls@tmplen=\dimen@
  \fi
%    \end{macrocode}
% Description width is \cs{linewidth} less 4\cs{tabcolsep} less the
% width of the name column.
%    \begin{macrocode}
  \setlength{\glsdescwidth}{\dimexpr\linewidth-4\tabcolsep-\gls@tmplen}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSymSetDescWidth}
%\changes{1.37}{2018-11-30}{new}
% Computes the value of \cs{glsdescwidth} for the styles that only
% have name, symbol and description columns.
%    \begin{macrocode}
\newcommand{\glslongextraSymSetDescWidth}{%
%    \end{macrocode}
% Work out the size for just the name and description style.
%    \begin{macrocode}
  \glslongextraSetDescWidth
%    \end{macrocode}
% Now work out the symbol column width. This is assuming that the
% column title will be the widest text in the column.
%    \begin{macrocode}
  \glsmeasurewidth{\gls@tmplen}{\glslongextraHeaderFmt\symbolname}%
%    \end{macrocode}
% Subtract 2\cs{tabcolsep} and the symbol header width.
%    \begin{macrocode}
  \setlength{\glsdescwidth}{\dimexpr\glsdescwidth-2\tabcolsep-\gls@tmplen}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSymNoNameSetDescWidth}
%\changes{1.49}{2022-10-14}{new}
% Computes the value of \cs{glsdescwidth} for the styles that only
% have symbol and description columns.
%    \begin{macrocode}
\newcommand{\glslongextraSymNoNameSetDescWidth}{%
%    \end{macrocode}
% Now work out the symbol column width. This is assuming that the
% column title will be the widest text in the column.
%    \begin{macrocode}
  \glsmeasurewidth{\gls@tmplen}{\glslongextraHeaderFmt\symbolname}%
%    \end{macrocode}
% Subtract 4\cs{tabcolsep} and the symbol header width.
%    \begin{macrocode}
  \setlength{\glsdescwidth}{\dimexpr\linewidth-4\tabcolsep-\gls@tmplen}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraLocSetDescWidth}
%\changes{1.37}{2018-11-30}{new}
% Computes the value of \cs{glsdescwidth} for the styles that only
% have name, location and description columns.
%    \begin{macrocode}
\newcommand{\glslongextraLocSetDescWidth}{%
%    \end{macrocode}
% Work out the size for just the name and description style.
%    \begin{macrocode}
  \glslongextraSetDescWidth
%    \end{macrocode}
% Subtract 2\cs{tabcolsep} and the location list column width.
%    \begin{macrocode}
  \setlength{\glsdescwidth}{\dimexpr\glsdescwidth-2\tabcolsep-\glspagelistwidth}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSymLocSetDescWidth}
%\changes{1.37}{2018-11-30}{new}
% Computes the value of \cs{glsdescwidth} for the styles that 
% have name, symbol, location and description columns.
%    \begin{macrocode}
\newcommand{\glslongextraSymLocSetDescWidth}{%
%    \end{macrocode}
% Work out the size for just the name, symbol and description style.
%    \begin{macrocode}
  \glslongextraSymSetDescWidth
%    \end{macrocode}
% Subtract 2\cs{tabcolsep} and the location list column width.
%    \begin{macrocode}
  \setlength{\glsdescwidth}{\dimexpr\glsdescwidth-2\tabcolsep-\glspagelistwidth}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraShortNoNameSetDescWidth}
%\changes{1.49}{2022-10-14}{new}
% Computes the value of \cs{glsdescwidth} for the styles that only
% have short and long columns. The long form will essentially be
% treated like a description column.
%    \begin{macrocode}
\newcommand{\glslongextraShortNoNameSetDescWidth}{%
%    \end{macrocode}
% Now work out the short column width. This is assuming that the
% column title will be the widest text in the column.
%    \begin{macrocode}
  \glsmeasurewidth{\gls@tmplen}{\glslongextraHeaderFmt\glslongextraShortHeader}%
%    \end{macrocode}
% Subtract 4\cs{tabcolsep} and the above header width.
%    \begin{macrocode}
  \setlength{\glsdescwidth}{\dimexpr\linewidth-4\tabcolsep-\gls@tmplen}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\ifGlsLongExtraUseTabular}
%\changes{1.37}{2018-11-30}{new}
%If true use \env{tabular} instead of \env{longtable}. Obviously
%only intended for short glossaries that can fit into a single page.
%    \begin{macrocode}
\newif\ifGlsLongExtraUseTabular
\GlsLongExtraUseTabularfalse
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraTabularVAlign}
%\changes{1.37}{2018-11-30}{new}
%Only used with the \env{tabular} setting.
%    \begin{macrocode}
\newcommand*{\glslongextraTabularVAlign}{c}
%    \end{macrocode}
%\end{macro}
%\begin{style}{long-name-desc}
%\changes{1.37}{2018-11-30}{new}
%Two column style with multi-lined descriptions and header.
%This is similar to the \glostyle{longragged-booktabs} style.
%    \begin{macrocode}
\newglossarystyle{long-name-desc}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign}}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraNameDescTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign}}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{2}{##1}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{2}}%
%    \end{macrocode}
%Top-level entry.
%    \begin{macrocode}
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraDescFmt{##1}\tabularnewline
  }%
%    \end{macrocode}
%Child entry.
%    \begin{macrocode}
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} 
     &
     \glslongextraSubDescFmt{##1}{##2}%
     \tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraNameDescLocationHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameDescLocationHeader}{%
 \glslongextraNameDescLocationTabularHeader\endhead
 \glslongextraNameDescLocationTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameDescLocationTabularHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameDescLocationTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname & 
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\pagelistname\tabularnewline
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameDescLocationTabularFooter}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameDescLocationTabularFooter}{%
 \bottomrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-name-desc-loc}
%\changes{1.37}{2018-11-30}{new}
%Three columns: name, description and location list.
%    \begin{macrocode}
\newglossarystyle{long-name-desc-loc}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraLocationAlign
      }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraNameDescLocationTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescLocationTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraLocationAlign
      }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescLocationHeader}%
   \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraDescFmt{##1} &
    \glslongextraLocationFmt{##1}{##2}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2}&
     \glslongextraSubDescFmt{##1}{##2}&
     \glslongextraSubLocationFmt{##1}{##2}{##3}%
     \tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraDescNameHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescNameHeader}{%
 \glslongextraDescNameTabularHeader\endhead
 \glslongextraDescNameTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraDescNameTabularHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescNameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\descriptionname& 
 \glslongextraHeaderFmt\entryname \tabularnewline
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraDescNameTabularFooter}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescNameTabularFooter}{%
 \bottomrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-desc-name}
%\changes{1.37}{2018-11-30}{new}
%Like \glostyle{name-desc} but swaps the columns.
%    \begin{macrocode}
\newglossarystyle{long-desc-name}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign}}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraDescNameTabularFooter
      \end{tabular}%
    }%
    \renewcommand*{\glossaryheader}{\glslongextraDescNameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign}}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
    \renewcommand*{\glossaryheader}{\glslongextraDescNameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{2}{##1}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{2}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraDescFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraLocationDescNameHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraLocationDescNameHeader}{%
 \glslongextraLocationDescNameTabularHeader\endhead
 \glslongextraLocationDescNameTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraLocationDescNameTabularHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraLocationDescNameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\pagelistname& 
 \glslongextraHeaderFmt\descriptionname& 
 \glslongextraHeaderFmt\entryname \tabularnewline
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraLocationDescNameTabularFooter}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraLocationDescNameTabularFooter}{%
 \bottomrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-loc-desc-name}
%\changes{1.37}{2018-11-30}{new}
%Three columns: location, description and name.
%    \begin{macrocode}
\newglossarystyle{long-loc-desc-name}%
{%
  \ifGlsLongExtraUseTabular 
   {%
     \glslongextraLocSetDescWidth
     \edef\@glslongextra@begintab{%
       \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
         \expandonce\glslongextraLocationAlign
         \expandonce\glslongextraDescAlign
         \expandonce\glslongextraNameAlign}}%
     \@glslongextra@begintab
   }%
   {%
     \glslongextraLocationDescNameTabularFooter
     \end{tabular}%
   }%
   \renewcommand*{\glossaryheader}{\glslongextraLocationDescNameTabularHeader}%
  \else
  \renewenvironment{theglossary}%
   {%
     \glspatchLToutput
     \glslongextraLocSetDescWidth
     \edef\@glslongextra@begintab{%
       \noexpand\begin{longtable}{%
         \expandonce\glslongextraLocationAlign
         \expandonce\glslongextraDescAlign
         \expandonce\glslongextraNameAlign}}%
     \@glslongextra@begintab
   }%
   {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraLocationDescNameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraLocationFmt{##1}{##2} &
    \glslongextraDescFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubLocationFmt{##1}{##2}{##3} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraNameDescSymHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameDescSymHeader}{%
 \glslongextraNameDescSymTabularHeader\endhead
 \glslongextraNameDescSymTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameDescSymTabularHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameDescSymTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname & 
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\symbolname\tabularnewline
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameDescSymTabularFooter}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameDescSymTabularFooter}{%
 \bottomrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-name-desc-sym}
%\changes{1.37}{2018-11-30}{new}
%Three column style with symbol in the third column.
%    \begin{macrocode}
\newglossarystyle{long-name-desc-sym}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraNameDescSymTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescSymTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescSymHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraDescFmt{##1} &
    \glslongextraSymbolFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubSymbolFmt{##1}{##2}%
     \tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraNameDescSymLocationHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameDescSymLocationHeader}{%
 \glslongextraNameDescSymLocationTabularHeader\endhead
 \glslongextraNameDescSymLocationTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameDescSymLocationTabularHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameDescSymLocationTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname & 
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\pagelistname\tabularnewline
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameDescSymLocationTabularFooter}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameDescSymLocationTabularFooter}{%
 \bottomrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-name-desc-sym-loc}
%\changes{1.37}{2018-11-30}{new}
%Four columns: name, description and location
%    \begin{macrocode}
\newglossarystyle{long-name-desc-sym-loc}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraLocationAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraNameDescSymLocationTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescSymLocationTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraLocationAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescSymLocationHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{4}{##1}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{4}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraDescFmt{##1} &
    \glslongextraSymbolFmt{##1}&
    \glslongextraLocationFmt{##1}{##2}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubSymbolFmt{##1}{##2}&
     \glslongextraSubLocationFmt{##1}{##2}{##3}%
     \tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraNameSymDescHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameSymDescHeader}{%
 \glslongextraNameSymDescTabularHeader\endhead
 \glslongextraNameSymDescTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameSymDescTabularHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameSymDescTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname & 
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\descriptionname\tabularnewline
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameSymDescTabularFooter}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameSymDescTabularFooter}{%
 \bottomrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-name-sym-desc}
%\changes{1.37}{2018-11-30}{new}
%Three column style with symbol in the second column.
%    \begin{macrocode}
\newglossarystyle{long-name-sym-desc}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraNameSymDescTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameSymDescTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameSymDescHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraSymbolFmt{##1} &
    \glslongextraDescFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubSymbolFmt{##1}{##2} &
     \glslongextraSubDescFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraNameSymDescLocationHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameSymDescLocationHeader}{%
 \glslongextraNameSymDescLocationTabularHeader\endhead
 \glslongextraNameSymDescLocationTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameSymDescLocationTabularHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameSymDescLocationTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname & 
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\pagelistname\tabularnewline
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameSymDescLocationTabularFooter}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameSymDescLocationTabularFooter}{%
 \bottomrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-name-sym-desc-loc}
%\changes{1.37}{2018-11-30}{new}
%Four column style with symbol in the second column.
%    \begin{macrocode}
\newglossarystyle{long-name-sym-desc-loc}%
{%
  \ifGlsLongExtraUseTabular 
    \renewenvironment{theglossary}%
     {%
       \glslongextraSymLocSetDescWidth
       \edef\@glslongextra@begintab{%
         \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
           \expandonce\glslongextraNameAlign
           \expandonce\glslongextraSymbolAlign
           \expandonce\glslongextraDescAlign
           \expandonce\glslongextraLocationAlign
         }}%
       \@glslongextra@begintab
     }%
     {%
       \glslongextraNameSymDescLocationTabularFooter
       \end{tabular}%
     }%
    \renewcommand*{\glossaryheader}{\glslongextraNameSymDescLocationTabularHeader}%
  \else
    \renewenvironment{theglossary}%
     {%
       \glspatchLToutput
       \glslongextraSymLocSetDescWidth
       \edef\@glslongextra@begintab{%
         \noexpand\begin{longtable}{%
           \expandonce\glslongextraNameAlign
           \expandonce\glslongextraSymbolAlign
           \expandonce\glslongextraDescAlign
           \expandonce\glslongextraLocationAlign
         }}%
       \@glslongextra@begintab
     }%
     {\end{longtable}}%
    \renewcommand*{\glossaryheader}{\glslongextraNameSymDescLocationHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{4}{##1}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{4}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraSymbolFmt{##1} &
    \glslongextraDescFmt{##1} &
    \glslongextraLocationFmt{##1}{##2}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubSymbolFmt{##1}{##2} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubLocationFmt{##1}{##2}{##3}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraSymDescNameHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraSymDescNameHeader}{%
 \glslongextraSymDescNameTabularHeader\endhead
 \glslongextraSymDescNameTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSymDescNameTabularHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraSymDescNameTabularHeader}{%
 \toprule 
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\entryname\tabularnewline 
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSymDescNameTabularFooter}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraSymDescNameTabularFooter}{%
 \bottomrule 
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-sym-desc-name}
%\changes{1.37}{2018-11-30}{new}
%Three column style with symbol in the first column, description in
%the second and name in the third.
%    \begin{macrocode}
\newglossarystyle{long-sym-desc-name}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraSymDescNameTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraSymDescNameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraSymDescNameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraSymbolFmt{##1} &
    \glslongextraDescFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubSymbolFmt{##1}{##2} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraLocationSymDescNameHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraLocationSymDescNameHeader}{%
 \glslongextraLocationSymDescNameTabularHeader\endhead
 \glslongextraLocationSymDescNameTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraLocationSymDescNameTabularHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraLocationSymDescNameTabularHeader}{%
 \toprule 
 \glslongextraHeaderFmt\pagelistname &
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\entryname\tabularnewline 
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraLocationSymDescNameTabularFooter}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraLocationSymDescNameTabularFooter}{%
 \bottomrule 
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-loc-sym-desc-name}
%\changes{1.37}{2018-11-30}{new}
%Four column style with location list, symbol, description and name.
%    \begin{macrocode}
\newglossarystyle{long-loc-sym-desc-name}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraLocationAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraLocationSymDescNameTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraLocationSymDescNameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraLocationAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraLocationSymDescNameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{4}{##1}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{4}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraLocationFmt{##1}{##2} &
    \glslongextraSymbolFmt{##1} &
    \glslongextraDescFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubLocationFmt{##1}{##2}{##3} &
     \glslongextraSubSymbolFmt{##1}{##2} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraDescSymNameHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescSymNameHeader}{%
 \glslongextraDescSymNameTabularHeader\endhead
 \glslongextraDescSymNameTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraDescSymNameTabularHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescSymNameTabularHeader}{%
 \toprule 
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\entryname\tabularnewline 
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraDescSymNameTabularFooter}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescSymNameTabularFooter}{%
 \bottomrule 
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-desc-sym-name}
%\changes{1.37}{2018-11-30}{new}
%Three column style with description in the first column, symbol in
%the second and name in the third.
%    \begin{macrocode}
\newglossarystyle{long-desc-sym-name}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraDescSymNameTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraDescSymNameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraDescSymNameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraDescFmt{##1} &
    \glslongextraSymbolFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubSymbolFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraLocationDescSymNameHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraLocationDescSymNameHeader}{%
 \glslongextraLocationDescSymNameTabularHeader\endhead
 \glslongextraLocationDescSymNameTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraLocationDescSymNameTabularHeader}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraLocationDescSymNameTabularHeader}{%
 \toprule 
 \glslongextraHeaderFmt\pagelistname &
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\entryname\tabularnewline 
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraLocationDescSymNameTabularFooter}
%\changes{1.37}{2018-11-30}{new}
%    \begin{macrocode}
\newcommand{\glslongextraLocationDescSymNameTabularFooter}{%
 \bottomrule 
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-loc-desc-sym-name}
%\changes{1.37}{2018-11-30}{new}
%Four column style with location list, description, symbol and name.
%    \begin{macrocode}
\newglossarystyle{long-loc-desc-sym-name}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraLocationAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraLocationDescSymNameTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraLocationDescSymNameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraLocationAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraLocationDescSymNameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{4}{##1}}%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{4}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraLocationFmt{##1}{##2} &
    \glslongextraDescFmt{##1} &
    \glslongextraSymbolFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubLocationFmt{##1}{##2}{##3} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubSymbolFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{style}{long-sym-desc}
%\changes{1.49}{2022-10-14}{new}
%Two column style with symbol in the first column and description in
%the second. The name isn't shown unless the symbol is missing.
%    \begin{macrocode}
\newglossarystyle{long-sym-desc}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymNoNameSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraSymbolNameAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraSymDescTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraSymDescTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymNoNameSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraSymbolNameAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraSymDescHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraSymbolOrName{##1} &
    \glslongextraDescFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubSymbolOrName{##1}{##2} &
     \glslongextraSubDescFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraSymDescHeader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraSymDescHeader}{%
 \glslongextraSymDescTabularHeader\endhead
 \glslongextraSymDescTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSymDescTabularHeader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraSymDescTabularHeader}{%
 \toprule 
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\descriptionname\tabularnewline 
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSymDescTabularFooter}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraSymDescTabularFooter}{%
 \bottomrule 
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-desc-sym}
%\changes{1.49}{2022-10-14}{new}
%Two column style with description in the first column and symbol in
%the second. The name isn't shown.
%    \begin{macrocode}
\newglossarystyle{long-desc-sym}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymNoNameSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraDescSymTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraDescSymTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymNoNameSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraDescSymHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraDescFmt{##1} &
    \glslongextraSymbolOrName{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubSymbolOrName{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraDescSymHeader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescSymHeader}{%
 \glslongextraDescSymTabularHeader\endhead
 \glslongextraDescSymTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraDescSymTabularHeader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescSymTabularHeader}{%
 \toprule 
 \glslongextraHeaderFmt\descriptionname & 
 \glslongextraHeaderFmt\symbolname\tabularnewline
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraDescSymTabularFooter}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescSymTabularFooter}{%
 \bottomrule 
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{abbr-short-long}
%\changes{1.49}{2022-10-14}{new}
%Two column style with the short field in the first column and the
%long field in the second. The name, symbol and description aren't shown
%(although the abbreviation style may mean that they will happen to
%be shown if they are the same as the short or long field).
%    \begin{macrocode}
\newglossarystyle{abbr-short-long}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraShortNoNameSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraShortLongTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraShortLongTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraShortNoNameSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraShortLongHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \ifglshasshort{##1}%
    {\glslongextraShortTargetFmt{##1}}%
    {\glslongextraNameFmt{##1}}%
     &
    \ifglshaslong{##1}%
    {\glslongextraLongFmt{##1}}%
    {\glslongextraDescFmt{##1}}%
    \tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \ifglshasshort{##2}%
     {\glslongextraSubShortTargetFmt{##1}{##2}}%
     {\glslongextraSubNameFmt{##1}{##2}}%
      &
     \ifglshaslong{##2}%
     {\glslongextraSubLongFmt{##1}{##2}}%
     {\glslongextraSubDescFmt{##1}{##2}}%
     \tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraShortLongHeader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraShortLongHeader}{%
 \glslongextraShortLongTabularHeader\endhead
 \glslongextraShortLongTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraShortHeader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraShortHeader}{\entryname}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslongextraLongHeader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraLongHeader}{\descriptionname}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glslongextraShortLongTabularHeader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraShortLongTabularHeader}{%
 \toprule 
 \glslongextraHeaderFmt\glslongextraShortHeader &
 \glslongextraHeaderFmt\glslongextraLongHeader\tabularnewline 
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraShortLongTabularFooter}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraShortLongTabularFooter}{%
 \bottomrule 
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{abbr-long-short}
%\changes{1.49}{2022-10-14}{new}
%Two column style with the short field in the first column and the
%long field in the second. The name, symbol and description aren't shown
%(although the abbreviation style may mean that they will happen to
%be shown if they are the same as the short or long field).
%    \begin{macrocode}
\newglossarystyle{abbr-long-short}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraShortNoNameSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraLongShortTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraLongShortTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraShortNoNameSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraLongShortHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \ifglshaslong{##1}%
    {\glslongextraLongFmt{##1}}%
    {\glslongextraDescFmt{##1}}%
    &
    \ifglshasshort{##1}%
    {\glslongextraShortTargetFmt{##1}}%
    {\glslongextraNameFmt{##1}}%
    \tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \ifglshaslong{##2}%
     {\glslongextraSubLongFmt{##1}{##2}}%
     {\glslongextraSubDescFmt{##1}{##2}}%
      &
     \ifglshasshort{##2}%
     {\glslongextraSubShortTargetFmt{##1}{##2}}%
     {\glslongextraSubNameFmt{##1}{##2}}%
     \tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraLongShortHeader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraLongShortHeader}{%
 \glslongextraLongShortTabularHeader\endhead
 \glslongextraLongShortTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraLongShortTabularHeader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraLongShortTabularHeader}{%
 \toprule 
 \glslongextraHeaderFmt\glslongextraLongHeader &
 \glslongextraHeaderFmt\glslongextraShortHeader\tabularnewline 
 \midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraLongShortTabularFooter}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glslongextraLongShortTabularFooter}{%
 \bottomrule 
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIField}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomIField}{useri}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomIHeader}{%
 \MFUsentencecase{\glslongextraCustomIField}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIFmt}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomIFmt}[1]{%
  \glsxtrusefield{#1}{\glslongextraCustomIField}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSubCustomIFmt}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraSubCustomIFmt}[2]{%
 \glslongextraCustomIFmt{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIIField}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomIIField}{userii}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIIHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomIIHeader}{%
 \MFUsentencecase{\glslongextraCustomIIField}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIIFmt}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomIIFmt}[1]{%
  \glsxtrusefield{#1}{\glslongextraCustomIIField}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSubCustomIIFmt}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraSubCustomIIFmt}[2]{%
 \glslongextraCustomIIFmt{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIIIField}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomIIIField}{useriii}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIIIHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomIIIHeader}{%
 \MFUsentencecase{\glslongextraCustomIIIField}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIIIFmt}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomIIIFmt}[1]{%
  \glsxtrusefield{#1}{\glslongextraCustomIIIField}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraSubCustomIIIFmt}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraSubCustomIIIFmt}[2]{%
 \glslongextraCustomIIIFmt{#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIAlign}
%\changes{1.50}{2022-11-08}{new}
%Alignment for the custom1 column.
%    \begin{macrocode}
\newcommand{\glslongextraCustomIAlign}{l}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIIAlign}
%\changes{1.50}{2022-11-08}{new}
%Alignment for the custom2 column.
%    \begin{macrocode}
\newcommand{\glslongextraCustomIIAlign}{l}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIIIAlign}
%\changes{1.50}{2022-11-08}{new}
%Alignment for the custom3 column.
%    \begin{macrocode}
\newcommand{\glslongextraCustomIIIAlign}{l}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomTabularFooter}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomTabularFooter}{%
 \bottomrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameCustomIHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameCustomIHeader}{%
 \glslongextraNameCustomITabularHeader\endhead
 \glslongextraCustomTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameCustomITabularHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameCustomITabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname & 
 \glslongextraHeaderFmt{\glslongextraCustomIHeader}%
 \tabularnewline\midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomINameHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomINameHeader}{%
 \glslongextraCustomINameTabularHeader\endhead
 \glslongextraCustomTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomINameTabularHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomINameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt{\glslongextraCustomIHeader} & 
 \glslongextraHeaderFmt\entryname
 \tabularnewline\midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameCustomIIHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameCustomIIHeader}{%
 \glslongextraNameCustomIITabularHeader\endhead
 \glslongextraCustomTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameCustomIITabularHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameCustomIITabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname & 
 \glslongextraHeaderFmt{\glslongextraCustomIHeader} &
 \glslongextraHeaderFmt{\glslongextraCustomIIHeader}%
 \tabularnewline\midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIINameHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomIINameHeader}{%
 \glslongextraCustomIINameTabularHeader\endhead
 \glslongextraCustomTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIINameTabularHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomIINameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt{\glslongextraCustomIHeader} &
 \glslongextraHeaderFmt{\glslongextraCustomIIHeader} &
 \glslongextraHeaderFmt\entryname 
 \tabularnewline\midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameCustomIIIHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameCustomIIIHeader}{%
 \glslongextraNameCustomIIITabularHeader\endhead
 \glslongextraCustomTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameCustomIIITabularHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameCustomIIITabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname & 
 \glslongextraHeaderFmt{\glslongextraCustomIHeader} &
 \glslongextraHeaderFmt{\glslongextraCustomIIHeader} &
 \glslongextraHeaderFmt{\glslongextraCustomIIIHeader}%
 \tabularnewline\midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomNameIIIHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomIIINameHeader}{%
 \glslongextraCustomIIINameTabularHeader\endhead
 \glslongextraCustomTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIIINameTabularHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraCustomIIINameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt{\glslongextraCustomIHeader} &
 \glslongextraHeaderFmt{\glslongextraCustomIIHeader} &
 \glslongextraHeaderFmt{\glslongextraCustomIIIHeader} &
 \glslongextraHeaderFmt\entryname 
 \tabularnewline\midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-name-custom1}
%\changes{1.50}{2022-11-08}{new}
%Two column style with custom 1 field in the second column.
%    \begin{macrocode}
\newglossarystyle{long-name-custom1}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraCustomIAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraCustomTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameCustomITabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraCustomIAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameCustomIHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{2}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{2}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraCustomIFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubCustomIFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{style}{long-custom1-name}
%\changes{1.50}{2022-11-08}{new}
%Two column style with custom 1 field in the first column.
%    \begin{macrocode}
\newglossarystyle{long-custom1-name}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraCustomTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraCustomINameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraCustomINameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{2}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{2}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraCustomIFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubCustomIFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{style}{long-name-custom2}
%\changes{1.50}{2022-11-08}{new}
%Three column style with custom 1 field in the second column and
%custom 2 field in the third column.
%    \begin{macrocode}
\newglossarystyle{long-name-custom2}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraCustomTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameCustomIITabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameCustomIIHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraCustomIFmt{##1}&
    \glslongextraCustomIIFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubCustomIFmt{##1}{##2} &
     \glslongextraSubCustomIIFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{style}{long-custom2-name}
%\changes{1.50}{2022-11-08}{new}
%As long-name-custom2 but with the name column at the end.
%    \begin{macrocode}
\newglossarystyle{long-custom2-name}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraCustomTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraCustomIINameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraCustomIINameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraCustomIFmt{##1}&
    \glslongextraCustomIIFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubCustomIFmt{##1}{##2} &
     \glslongextraSubCustomIIFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{style}{long-name-custom3}
%\changes{1.50}{2022-11-08}{new}
%Four column style with custom 1 field in the second column,
%custom 2 field in the third column and custom 3 field in the fourth
%column.
%    \begin{macrocode}
\newglossarystyle{long-name-custom3}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraCustomIIAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraCustomTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameCustomIIITabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraCustomIIIAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameCustomIIIHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{4}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{4}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraCustomIFmt{##1}&
    \glslongextraCustomIIFmt{##1}&
    \glslongextraCustomIIIFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubCustomIFmt{##1}{##2} &
     \glslongextraSubCustomIIFmt{##1}{##2} &
     \glslongextraSubCustomIIIFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{style}{long-custom3-name}
%\changes{1.50}{2022-11-08}{new}
%As long-name-custom3 but with the name in the end column.
%    \begin{macrocode}
\newglossarystyle{long-custom3-name}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraCustomTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraCustomIIINameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraCustomIIIAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraCustomIIINameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{4}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{4}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraCustomIFmt{##1}&
    \glslongextraCustomIIFmt{##1}&
    \glslongextraCustomIIIFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubCustomIFmt{##1}{##2} &
     \glslongextraSubCustomIIFmt{##1}{##2} &
     \glslongextraSubCustomIIIFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraCustomISetDescWidth}
%\changes{1.50}{2022-11-08}{new}
% Computes the value of \cs{glsdescwidth} for the styles that 
% have name, custom1 and description columns.
%    \begin{macrocode}
\newcommand{\glslongextraCustomISetDescWidth}{%
%    \end{macrocode}
% Work out the size for just the name and description style.
%    \begin{macrocode}
  \glslongextraSetDescWidth
%    \end{macrocode}
% Now work out the custom1 column width. This is assuming that the
% column title will be the widest text in the column.
%    \begin{macrocode}
  \glsmeasurewidth{\gls@tmplen}{\glslongextraHeaderFmt\glslongextraCustomIHeader}%
%    \end{macrocode}
% Subtract 2\cs{tabcolsep} and the custom1 header width.
%    \begin{macrocode}
  \setlength{\glsdescwidth}{\dimexpr\glsdescwidth-2\tabcolsep-\gls@tmplen}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIISetDescWidth}
%\changes{1.50}{2022-11-08}{new}
% Computes the value of \cs{glsdescwidth} for the styles that 
% have name, custom1, custom2 and description columns.
%    \begin{macrocode}
\newcommand{\glslongextraCustomIISetDescWidth}{%
  \glslongextraCustomISetDescWidth
  \glsmeasurewidth{\gls@tmplen}{\glslongextraHeaderFmt\glslongextraCustomIIHeader}%
  \setlength{\glsdescwidth}{\dimexpr\glsdescwidth-2\tabcolsep-\gls@tmplen}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraCustomIIISetDescWidth}
%\changes{1.50}{2022-11-08}{new}
% Computes the value of \cs{glsdescwidth} for the styles that 
% have name, custom1, custom2 and description columns.
%    \begin{macrocode}
\newcommand{\glslongextraCustomIIISetDescWidth}{%
  \glslongextraCustomIISetDescWidth
  \glsmeasurewidth{\gls@tmplen}{\glslongextraHeaderFmt\glslongextraCustomIIIHeader}%
  \setlength{\glsdescwidth}{\dimexpr\glsdescwidth-2\tabcolsep-\gls@tmplen}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameCustomIDescHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameCustomIDescHeader}{%
 \glslongextraNameCustomIDescTabularHeader\endhead
 \glslongextraCustomTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameCustomIDescTabularHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameCustomIDescTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname & 
 \glslongextraHeaderFmt{\glslongextraCustomIHeader} &
 \glslongextraHeaderFmt\descriptionname 
 \tabularnewline\midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameCustomIIDescHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameCustomIIDescHeader}{%
 \glslongextraNameCustomIIDescTabularHeader\endhead
 \glslongextraCustomTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameCustomIIDescTabularHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameCustomIIDescTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname & 
 \glslongextraHeaderFmt{\glslongextraCustomIHeader} &
 \glslongextraHeaderFmt{\glslongextraCustomIIHeader} &
 \glslongextraHeaderFmt\descriptionname 
 \tabularnewline\midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameCustomIIIDescHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameCustomIIIDescHeader}{%
 \glslongextraNameCustomIIIDescTabularHeader\endhead
 \glslongextraCustomTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraNameCustomIIIDescTabularHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraNameCustomIIIDescTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname & 
 \glslongextraHeaderFmt{\glslongextraCustomIHeader} &
 \glslongextraHeaderFmt{\glslongextraCustomIIHeader} &
 \glslongextraHeaderFmt{\glslongextraCustomIIIHeader} &
 \glslongextraHeaderFmt\descriptionname 
 \tabularnewline\midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-name-custom1-desc}
%\changes{1.50}{2022-11-08}{new}
%Three column style with custom 1 field in the second column and the
%description in the third.
%    \begin{macrocode}
\newglossarystyle{long-name-custom1-desc}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraCustomISetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraCustomTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameCustomIDescTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraCustomISetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameCustomIDescHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraCustomIFmt{##1}&
    \glslongextraDescFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubCustomIFmt{##1}{##2}&
     \glslongextraSubDescFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{style}{long-name-custom2-desc}
%\changes{1.50}{2022-11-08}{new}
%Four column style with custom 1 field in the second column, custom
%2 field in the third column and the description in the fourth.
%    \begin{macrocode}
\newglossarystyle{long-name-custom2-desc}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraCustomIISetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraCustomTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameCustomIIDescTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraCustomIISetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameCustomIIDescHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{4}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{4}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraCustomIFmt{##1}&
    \glslongextraCustomIIFmt{##1}&
    \glslongextraDescFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubCustomIFmt{##1}{##2}&
     \glslongextraSubCustomIIFmt{##1}{##2}&
     \glslongextraSubDescFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{style}{long-name-custom3-desc}
%\changes{1.50}{2022-11-08}{new}
%Five column style with custom 1 field in the second column, custom
%2 field in the third column, custom 3 field in the fourth column,
%and the description in the fifth.
%    \begin{macrocode}
\newglossarystyle{long-name-custom3-desc}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraCustomIIISetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraCustomIIIAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraCustomTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameCustomIIIDescTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraCustomIIISetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraCustomIIIAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameCustomIIIDescHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{5}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{5}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraCustomIFmt{##1}&
    \glslongextraCustomIIFmt{##1}&
    \glslongextraCustomIIIFmt{##1}&
    \glslongextraDescFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubCustomIFmt{##1}{##2}&
     \glslongextraSubCustomIIFmt{##1}{##2}&
     \glslongextraSubCustomIIIFmt{##1}{##2}&
     \glslongextraSubDescFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{macro}{\glslongextraDescCustomINameHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescCustomINameHeader}{%
 \glslongextraDescCustomINameTabularHeader\endhead
 \glslongextraCustomTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraDescCustomINameTabularHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescCustomINameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt{\glslongextraCustomIHeader} &
 \glslongextraHeaderFmt\entryname 
 \tabularnewline\midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraDescCustomIINameHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescCustomIINameHeader}{%
 \glslongextraDescCustomIINameTabularHeader\endhead
 \glslongextraCustomTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraDescCustomIINameTabularHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescCustomIINameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\descriptionname & 
 \glslongextraHeaderFmt{\glslongextraCustomIHeader} &
 \glslongextraHeaderFmt{\glslongextraCustomIIHeader} &
 \glslongextraHeaderFmt\entryname 
 \tabularnewline\midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraDescCustomIIINameHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescCustomIIINameHeader}{%
 \glslongextraDescCustomIIINameTabularHeader\endhead
 \glslongextraCustomTabularFooter\endfoot
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glslongextraDescCustomIIINameTabularHeader}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glslongextraDescCustomIIINameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\descriptionname & 
 \glslongextraHeaderFmt{\glslongextraCustomIHeader} &
 \glslongextraHeaderFmt{\glslongextraCustomIIHeader} &
 \glslongextraHeaderFmt{\glslongextraCustomIIIHeader} &
 \glslongextraHeaderFmt\entryname 
 \tabularnewline\midrule
}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{long-desc-custom1-name}
%\changes{1.50}{2022-11-08}{new}
%As long-name-custom1-desc but with the name and description columns
%the other way around.
%    \begin{macrocode}
\newglossarystyle{long-desc-custom1-name}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraCustomISetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraCustomTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraDescCustomINameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraCustomISetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraDescCustomINameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{3}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraDescFmt{##1} &
    \glslongextraCustomIFmt{##1}&
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubCustomIFmt{##1}{##2}&
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{style}{long-desc-custom2-name}
%\changes{1.50}{2022-11-08}{new}
%As long-name-custom2-desc but with the name and description columns
%the other way around.
%    \begin{macrocode}
\newglossarystyle{long-desc-custom2-name}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraCustomIISetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraCustomTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraDescCustomIINameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraCustomIISetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraDescCustomIINameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{4}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{4}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraDescFmt{##1} &
    \glslongextraCustomIFmt{##1}&
    \glslongextraCustomIIFmt{##1}&
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubCustomIFmt{##1}{##2}&
     \glslongextraSubCustomIIFmt{##1}{##2}&
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\begin{style}{long-desc-custom3-name}
%\changes{1.50}{2022-11-08}{new}
%As long-name-custom-desc but with the name and description columns
%switched.
%    \begin{macrocode}
\newglossarystyle{long-desc-custom3-name}%
{%
  \ifGlsLongExtraUseTabular 
   \renewenvironment{theglossary}%
    {%
      \glslongextraCustomIIISetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraCustomIIIAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraCustomTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraDescCustomIIINameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraCustomIIISetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraCustomIAlign
          \expandonce\glslongextraCustomIIAlign
          \expandonce\glslongextraCustomIIIAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraDescCustomIIINameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{5}{##1}}%
%    \end{macrocode}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glslongextraSubGroupHeading{5}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraDescFmt{##1} &
    \glslongextraCustomIFmt{##1}&
    \glslongextraCustomIIFmt{##1}&
    \glslongextraCustomIIIFmt{##1}&
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubCustomIFmt{##1}{##2}&
     \glslongextraSubCustomIIFmt{##1}{##2}&
     \glslongextraSubCustomIIIFmt{##1}{##2}&
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\end{style}
%
%\iffalse
%    \begin{macrocode}
%</glossary-longextra.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossary-topic.sty>
%    \end{macrocode}
%\fi
%\section{topic styles (\sty{glossary-topic.sty})}
%\changes{1.40}{2019-03-22}{new}
%Provides \qt{topic} styles where top-level entries are considered a
%topic.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
%    \end{macrocode}
% Rollback releases:
%    \begin{macrocode}
\DeclareRelease{v1.48}{2021-11-22}{glossary-topic-2021-11-22.sty}
\DeclareCurrentRelease{1.9}{2025-11-03}
%    \end{macrocode}
% Declare package:
%    \begin{macrocode}
\ProvidesPackage{glossary-topic}[2026/03/06 v2.0 (NLCT)]
%    \end{macrocode}
%Load required package.
%    \begin{macrocode}
\RequirePackage{multicol}
%    \end{macrocode}
%The top-level entries act like headers. If the top-level entry has a
%description it's placed below the name.
%\begin{style}{topic}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newglossarystyle{topic}{%
  \renewenvironment{theglossary}%
  {%
    \glstopicInit
    \def\glstopic@prechildren{}%
    \def\glstopic@prevlevel{-1}%
  }%
  {\par}%
  \renewcommand*{\glossaryheader}{}%
  \renewcommand*{\glsgroupheading}[1]{%
    \def\glstopic@prevlevel{-1}%
    \glstopicGroupHeading{##1}%
  }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glstopicSubGroupHeading}%
  \renewcommand{\glossentry}[2]{%
    \hangindent0pt\relax
    \parindent\glstopicParIndent\relax
    \glstopicItem{##1}{##2}%
%    \end{macrocode}
%\changes{1.41}{2019-04-09}{added penalty if no description}
%If there isn't a description, penalise a page break.
%    \begin{macrocode}
     \ifglshasdesc{##1}%
     {%
       \def\glstopic@prechildren{}%
     }%
     {%
       \def\glstopic@prechildren{\nopagebreak}%
     }%
  }%
  \renewcommand{\subglossentry}[3]{%
    \ifnum\glstopic@prevlevel=0\relax\glstopic@prechildren\fi
    \def\glstopic@prevlevel{##1}%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{grouping added to scope \cs{everypar} (bug 182)}
%Grouping is added to scope the effect of \cs{everypar}.
%    \begin{macrocode}
    \begingroup
    \glstopicAssignSubIndent{##1}%
    \glstopicSubItem{##1}{##2}{##3}%
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{added \cs{par} (bug 176)}
%    \begin{macrocode}
    \par
    \endgroup
  }%
  \renewcommand*{\glsgroupskip}{}%
}
%    \end{macrocode}
%\end{style}
%\begin{macro}{\glstopicGroupHeading}
%\changes{1.40}{2019-03-22}{new}
%\begin{definition}
%\cs{glstopicGroupHeading}\marg{group label}
%\end{definition}
%May be redefined if letter group headings are required. For
%example:
%\begin{verbatim}
%\renewcommand*{\glstopicGroupHeading}[1]{%
%  \glsxtrgetgrouptitle{#1}{\thisgrptitle}%
%  \section*{\thisgrptitle}%
%}
%\end{verbatim}
%    \begin{macrocode}
\newcommand*{\glstopicGroupHeading}[1]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicSubGroupHeading}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glstopicSubGroupHeading}\marg{prev group level}\marg{group
%level}\marg{parent entry}\marg{group label}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\glstopicSubGroupHeading}[4]{%
 \begingroup
  \glspar\glstopicPreSkip\glspar\noindent
  \glsxtrgetgrouptitle{#4}{\glstopicsubgrouptitle}%
  \glstopicAssignSubIndent{#2}%
  \glstopicSubItemBox{#2}{\glstopicTitleFont{\glstopicsubgrouptitle}}%
  \glstopicSubItemSep
  \glspar\nobreak\glstopicPostSkip
  \par
 \endgroup
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicItem}
%\changes{1.40}{2019-03-22}{new}
%\begin{definition}
%\cs{glstopicItem}\marg{label}\marg{location list}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\glstopicItem}[2]{%
  \glspar\glstopicPreSkip\glspar\noindent
  \glstopicMarker{#1}%
  \glstopicTitleFont
  {%
    \glsentryitem{#1}\glstarget{#1}{\glstopicTitle{#1}}%
  }%
  \ifglshasdesc{#1}%
  {\glspar\nobreak\glstopicMidSkip\glspar\nobreak
   \@afterheading\glstopicDesc{#1}\glspar\glstopicPostSkip
  }%
  {\glspar\nobreak\glstopicPostSkip}%
  \glstopicLoc{#1}{#2}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicMarker}
%\changes{1.40}{2019-03-22}{new}
% May be used to insert a bookmark etc if required.
%    \begin{macrocode}
\newcommand*{\glstopicMarker}[1]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicName}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand*{\glstopicTitle}[1]{\Glossentryname{#1}%
  \ifglshassymbol{#1}{\space(\glossentrysymbol{#1})}{}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicTitleFont}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand*{\glstopicTitleFont}[1]{\textbf{\large #1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicDesc}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand*{\glstopicDesc}[1]{\Glossentrydesc{#1}\glspostdescription}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicLoc}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand*{\glstopicLoc}[2]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicParIndent}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newlength\glstopicParIndent
\setlength\glstopicParIndent{20pt}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicSubIndent}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newlength\glstopicSubIndent
\setlength\glstopicSubIndent{20pt}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicInit}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand{\glstopicInit}{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicAssignSubIndent}
%\changes{1.40}{2019-03-22}{new}
%\begin{definition}
%\cs{glstopicAssignSubIndent}\marg{level}
%\end{definition}
%Used to set the indentation for sub-levels.
%    \begin{macrocode}
\newcommand*{\glstopicAssignSubIndent}[1]{%
%    \end{macrocode}
%\changes{1.41}{2019-04-09}{moved \cs{par} from \cs{glstopicSubItem}}
%    \begin{macrocode}
  \par
  \parindent\dimexpr#1\glstopicSubIndent-\glstopicSubIndent\relax
  \glstopicAssignWidest{#1}%
  \glstopicsubitemhangindent=\dimexpr\parindent+\glstopicwidest\relax
  \hangindent\glstopicsubitemhangindent\relax
%    \end{macrocode}
%\changes{1.46}{2021-09-20}{bug 182 maintain hangindent for multiple paragraphs}
%    \begin{macrocode}
  \everypar{\hangindent\glstopicsubitemhangindent\relax
    \parindent\dimexpr\glstopicSubItemParIndent+\glstopicsubitemhangindent\relax}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstopicsubitemhangindent}
%\changes{1.46}{2021-09-20}{new}
%    \begin{macrocode}
\newlength\glstopicsubitemhangindent
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstopicSubItemParIndent}
%\changes{1.46}{2021-09-20}{new}
%    \begin{macrocode}
\newlength\glstopicSubItemParIndent
\glstopicSubItemParIndent\parindent
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstopicwidest}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newlength\glstopicwidest
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstopicAssignWidest}
%\changes{1.40}{2019-03-22}{new}
%\begin{definition}
%\cs{glstopicAssignWidest}\marg{level}
%\end{definition}
%Used in the definition of \cs{glstopicAssignSubIndent}
%to set the indentation from the widest name for the given
%level. This will require \sty{glossary-tree} to set the values.
%    \begin{macrocode}
\newcommand*{\glstopicAssignWidest}[1]{%
  \ifcsundef{@glswidestlength\romannumeral#1}%
  {%
    \ifcsdef{@glswidestname\romannumeral#1}%
    {%
      \glsmeasurewidth{\glstopicwidest}{%
       \glstopicSubNameFont{\csuse{@glswidestname\romannumeral#1}}%
       \glstopicSubItemSep
      }%
    }%
    {\setlength{\glstopicwidest}{0pt}}%
%    \end{macrocode}
%Save the value so that it doesn't have to keep being recalculated.
%    \begin{macrocode}
    \csedef{@glswidestlength\romannumeral#1}{\the\glstopicwidest}%
  }%
  {\setlength{\glstopicwidest}{\csuse{@glswidestlength\romannumeral#1}}}%
}
%    \end{macrocode}
%\end{macro}
%
%
%\begin{macro}{\glstopicPreSkip}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand*{\glstopicPreSkip}{\medskip}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicMidSkip}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand*{\glstopicMidSkip}{\smallskip}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicPostSkip}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand*{\glstopicPostSkip}{\smallskip}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicSubItem}
%\changes{1.40}{2019-03-22}{new}
%\begin{definition}
%\cs{glstopicSubItem}\marg{level}\marg{label}\marg{location list}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\glstopicSubItem}[3]{%
%    \end{macrocode}
%\changes{1.41}{2019-04-09}{moved \cs{par} to \cs{glstopicAssignSubIndent}}
%    \begin{macrocode}
  \glstopicSubItemBox{#1}{\glstopicSubNameFont{\glsentryitem{#2}%
    \glstarget{#2}{\glossentryname{#2}}}%
    \glstopicSubItemSep
  }%
  \ifglshassymbol{#2}{(\glossentrysymbol{#2})\space}{}%
%    \end{macrocode}
%\changes{1.41}{2019-04-09}{added check for description}
%    \begin{macrocode}
  \ifglshasdesc{#2}%
   {\glossentrydesc{#2}\glspostdescription\glstopicSubPreLocSep}{}%
  \glstopicSubLoc{#2}{#3}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicSubItemSep}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand*{\glstopicSubItemSep}{\quad}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicSubItemBox}
%\changes{1.40}{2019-03-22}{new}
%\begin{definition}
%\cs{glstopicSubItemBox}\marg{level}\marg{text}
%\end{definition}
%    \begin{macrocode}
\newcommand*{\glstopicSubItemBox}[2]{%
  \ifdim\glstopicwidest>0pt\relax\makebox[\glstopicwidest][l]{#2}\else#2\fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicSubNameFont}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand*{\glstopicSubNameFont}[1]{\textbf{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicSubPreLocSep}
%\changes{1.41}{2019-04-09}{new}
%    \begin{macrocode}
\newcommand*{\glstopicSubPreLocSep}{\space}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstopicSubLoc}
%\changes{1.40}{2019-03-22}{new}
%\changes{1.41}{2019-04-09}{moved \cs{space} to \cs{glstopicSubPreLocSep}}
%    \begin{macrocode}
\newcommand*{\glstopicSubLoc}[2]{#2}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstopicCols}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand*{\glstopicCols}{2}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstopicColsEnv}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newcommand*{\glstopicColsEnv}{multicols}
%    \end{macrocode}
%\end{macro}
%
%\begin{style}{topicmcols}
%\changes{1.40}{2019-03-22}{new}
%    \begin{macrocode}
\newglossarystyle{topicmcols}{%
  \renewenvironment{theglossary}%
  {%
    \glstopicInit
    \def\glstopic@prechildren{}%
    \def\glstopic@postchildren{}%
    \def\glstopic@prevlevel{-1}%
  }%
  {%
    \ifnum\glstopic@prevlevel>0\relax\glstopic@postchildren\fi
    \par
  }%
  \renewcommand*{\glossaryheader}{}%
  \renewcommand*{\glsgroupheading}[1]{%
    \ifnum\glstopic@prevlevel>0\relax\glstopic@postchildren\fi
    \def\glstopic@prevlevel{-1}%
    \glstopicGroupHeading{##1}%
  }%
%    \end{macrocode}
%\changes{1.49}{2022-10-14}{added \cs{glssubgroupheading}}
% Sub-groups are only supported with \cs{printunsrtglossary}.
%    \begin{macrocode}
  \renewcommand*{\glssubgroupheading}{\glstopicSubGroupHeading}%
  \renewcommand{\glossentry}[2]{%
    \ifnum\glstopic@prevlevel>0\relax\glstopic@postchildren\fi
    \def\glstopic@prevlevel{0}%
    \hangindent0pt\relax
    \parindent\glstopicParIndent\relax
    \glstopicItem{##1}{##2}%
    \ifnum\glstopicCols>1\relax
%    \end{macrocode}
%\changes{1.41}{2019-04-09}{added penalty if no description}
%If there isn't a description, penalise a page break.
%    \begin{macrocode}
      \ifglshasdesc{##1}%
      {%
        \edef\glstopic@prechildren{%
          \noexpand\begin{\glstopicColsEnv}{\glstopicCols}%
        }%
      }%
      {%
        \edef\glstopic@prechildren{%
          \noexpand\nopagebreak
          \noexpand\begin{\glstopicColsEnv}{\glstopicCols}%
         }%
      }%
      \edef\glstopic@postchildren{\noexpand\end{\glstopicColsEnv}}%
    \fi
  }%
  \renewcommand{\subglossentry}[3]{%
    \ifnum\glstopic@prevlevel=0\relax\glstopic@prechildren\fi
    \def\glstopic@prevlevel{##1}%
    \glstopicAssignSubIndent{##1}%
    \glstopicSubItem{##1}{##2}{##3}%
  }%
  \renewcommand*{\glsgroupskip}{}%
}
%    \end{macrocode}
%\end{style}
%\iffalse
%    \begin{macrocode}
%</glossary-topic.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossary-table.sty>
%    \end{macrocode}
%\fi
%\section{table styles (\sty{glossary-table.sty})}
%\changes{1.49}{2022-10-14}{new}
%Intended for use with \app{bib2gls}. This is still experimental.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
%    \end{macrocode}
% Declare package:
%    \begin{macrocode}
\ProvidesPackage{glossary-table}[2026/03/06 v2.0 (NLCT)]
%    \end{macrocode}
%Load required packages.
%    \begin{macrocode}
\RequirePackage{longtable}
\RequirePackage{array}
\RequirePackage{booktabs}
%    \end{macrocode}
%Check if \cs{gls@start@measuring} has been defined (introduced to
%\sty{glossaries} v4.51). This package also requires \cs{ifglsfieldvoid}
%which was added to \sty{glossaries} v4.50.
%    \begin{macrocode}
\ifdef\gls@start@measuring
{}
{\PackageError{glossary-table}%
 {glossaries.sty v4.51+ required. Please update glossaries.sty}
 {Your version of glossaries.sty is too old. Minimum version 4.51 required}
}
%    \end{macrocode}
%\begin{macro}{\glstableblockperrowcount}
%\changes{1.49}{2022-10-14}{new}
%Number of blocks (entries) per row.
%    \begin{macrocode}
\newcount\glstableblockperrowcount
\glstableblockperrowcount=2\relax
%    \end{macrocode}
%\end{macro}
%Add a key to allow this value to be changed.
%    \begin{macrocode}
\define@key{printglosstable}{blocks}{\glstableblockperrowcount=#1\relax}
%    \end{macrocode}
%
%\begin{macro}{\glstablecurrentblockindex}
%Keep track of current block (entry) index.
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcount\glstablecurrentblockindex
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstabletotalcols}
%\changes{1.49}{2022-10-14}{new}
%Total number of columns. This will be updated at the start of
%\cs{printunsrttable}, but is a user level command so that it can be
%used in any hooks.
%    \begin{macrocode}
\newcount\glstabletotalcols
\glstabletotalcols=4\relax
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablenameheader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstablenameheader}{\entryname}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstabledescheader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstabledescheader}{\descriptionname}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableotherheader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableotherheader}{\MFUsentencecase{\glstableotherfield}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablesymbolheader}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstablesymbolheader}{\symbolname}
%    \end{macrocode}
%\end{macro}
%
%Provide boolean option to suppress header.
%    \begin{macrocode}
\define@boolkey{printglosstable}{header}[true]{}
\KV@printglosstable@headertrue
%    \end{macrocode}
%
%Provide boolean option to suppress rules.
%    \begin{macrocode}
\define@boolkey{printglosstable}{rules}[true]{}
\KV@printglosstable@rulestrue
%    \end{macrocode}
%
%Provide boolean option to suppress caption.
%    \begin{macrocode}
\define@boolkey{printglosstable}{caption}[true]{}
\KV@printglosstable@captiontrue
%    \end{macrocode}
%
%    \begin{macrocode}
\define@key{printglosstable}{blocksep}{\renewcommand{\glstable@blockalignsep}{#1}}
%    \end{macrocode}
%
%\begin{macro}{\glstable@blockalignsep}
%\changes{1.49}{2022-10-14}{new}
%Alignment spec between blocks.
%    \begin{macrocode}
\newcommand{\glstable@blockalignsep}{|}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablesubentryalign}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstablesubentryalign}{%
 \glstableleftalign{\dimexpr\glstablesubentrywidth-\tabcolsep}@{}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablesubentrywidth}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstablesubentrywidth}{\glstabledescwidth}
%    \end{macrocode}
%\end{macro}
%
%\begin{environment}{glstablesubentries}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newenvironment{glstablesubentries}%
 {%
   \protected@edef\@gls@dotabular{%
     \noexpand\begin{tabular}[t]{\glstablesubentryalign}}%
   \@gls@dotabular
 }%
 {\end{tabular}}
%    \end{macrocode}
%\end{environment}
%
%\begin{macro}{\glstablePreChildren}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstablePreChildren}{\glstableifpar{\par}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableblocksubentrysep}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableblocksubentrysep}{\glstablenewline}
%    \end{macrocode}
%\end{macro}
%
%Provide boolean option to allow paragraph cells.
%    \begin{macrocode}
\define@choicekey{printglosstable}{par}
[\@glstable@par@val\@glstable@par@n]
{false,justified,ragged}
{%
  \ifcase\@glstable@par@n
    \renewcommand{\glstable@parcase}[3]{##1}%
  \or
    \renewcommand{\glstable@parcase}[3]{##2}%
  \or
    \renewcommand{\glstable@parcase}[3]{##3}%
  \fi
}
%    \end{macrocode}
%
%\begin{macro}{\glstable@parcase}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstable@parcase}[3]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableifpar}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableifpar}[1]{\glstable@parcase{}{#1}{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableleftalign}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableleftalign}[1]{%
 \glstable@parcase{l}{p{#1}}{>{\protect\raggedright}p{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablerightalign}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstablerightalign}[1]{%
 \glstable@parcase{r}{p{#1}}{>{\protect\raggedleft}p{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablecenteralign}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstablecenteralign}[1]{%
 \glstable@parcase{c}{p{#1}}{>{\protect\centering}p{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablenamecolalign}
%\changes{1.49}{2022-10-14}{new}
%The alignment for the name column.
%    \begin{macrocode}
\newcommand{\glstablenamecolalign}{\glstableleftalign{\glstablenamewidth}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstabledesccolalign}
%\changes{1.49}{2022-10-14}{new}
%The alignment for the description column.
%    \begin{macrocode}
\newcommand{\glstabledesccolalign}{\glstableleftalign{\glstabledescwidth}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableothercolalign}
%\changes{1.50}{2022-11-08}{new}
%The alignment for the description column.
%    \begin{macrocode}
\newcommand{\glstableothercolalign}{\glstableleftalign{\glstableotherwidth}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablesymbolcolalign}
%\changes{1.49}{2022-10-14}{new}
%The alignment for the symbol column.
%    \begin{macrocode}
\newcommand{\glstablesymbolcolalign}{\glstablecenteralign{\glstablesymbolwidth}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableNameTarget}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableNameTarget}[1]{%
 \glstarget{#1}{\glstableName{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableNameFmt}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableNameFmt}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableName}
%\changes{1.50}{2022-11-08}{new}
%Entry item needs to be included in measuring to ensure there's
%enough room for it as well.
%    \begin{macrocode}
\newcommand{\glstableName}[1]{%
 \glsentryitem{#1}%
 \glstableNameFmt{\glossentryname{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubNameTarget}
%\changes{1.49}{2022-10-14}{new}
%\changes{1.50}{move}{moved \cs{glssubentryitem}}
%    \begin{macrocode}
\newcommand{\glstableSubNameTarget}[1]{%
 \glstarget{#1}{\glstableSubName{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubNameFmt}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableSubNameFmt}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubName}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSubName}[1]{%
 \glssubentryitem{#1}%
 \glstableSubNameFmt{\glossentryname{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableotherfield}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableotherfield}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableifhasotherfield}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableifhasotherfield}[3]{%
  \ifdefvoid\glstableotherfield
  {#3}%
  {%
    \ifglsfieldvoid{\glstableotherfield}{#1}{#3}{#2}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%Add an extra key to allow this value to be changed.
%    \begin{macrocode}
\define@key{printglosstable}{other}{\renewcommand{\glstableotherfield}{#1}}
%    \end{macrocode}
%
%\begin{macro}{\glstableOther}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableOther}[1]{%
 \glstableOtherFmt{\glsxtrusefield{#1}{\glstableotherfield}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableOtherFmt}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableOtherFmt}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubOther}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableSubOther}[1]{\glstableOther{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableOtherWithSep}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableOtherWithSep}[3]{%
 \glstableifhasotherfield{#2}%
 {#1\glstableOther{#2}#3}%
 {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubOtherWithSep}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSubOtherWithSep}[3]{%
 \glstableifhasotherfield{#2}%
 {#1\glstableSubOther{#2}#3}%
 {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableNameSingleFmt}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableNameSingleFmt}[1]{%
  \glstableNameTarget{#1}%
  \ifglshasdesc{#1}%
  {%
%    \end{macrocode}
%Has description.
%    \begin{macrocode}
    \glstableNameSinglePostName
    \glstableNameSingleSuppl
    {%
      \ifglshassymbol{#1}%
      {\glstableSymbol{#1}\glstableNameSingleSymSep}%
      {}%
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{changed \cs{GlsXtrIfFieldUndef} to
%\cs{ifglsfieldvoid}}
%    \begin{macrocode}
      \glstableOtherWithSep{}{#1}{\glstableOtherSep}%
      \glstableDesc{#1}%
    }%
  }%
  {%
%    \end{macrocode}
%No description.
%    \begin{macrocode}
   \ifglshassymbol{#1}%
   {%
%    \end{macrocode}
%Has symbol
%    \begin{macrocode}
      \glstableNameSinglePostName
      \glstableNameSingleSuppl
      {%
        \glstableSymbol{#1}%
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{moved other field inside \cs{glstableNameSingleSuppl}}
%    \begin{macrocode}
        \glstableifhasotherfield{#1}%
        {%
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{changed \cs{GlsXtrIfFieldUndef} to
%\cs{ifglsfieldvoid}}
%    \begin{macrocode}
          \glstableNameSingleSymSep\glstableOther{#1}%
        }%
        {}%
      }%
   }%
   {%
%    \end{macrocode}
%No description or symbol.
%    \begin{macrocode}
      \glstableifhasotherfield{#1}%
      {%
%    \end{macrocode}
%Has other but no description or symbol
%    \begin{macrocode}
       \glstableNameSinglePostName
       \glstableNameSingleSuppl{\glstableOther{#1}}%
      }%
      {%
%    \end{macrocode}
%No description, symbol or other.
%    \begin{macrocode}
      }%
    }%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableNameSingleSuppl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableNameSingleSuppl}[1]{(#1)}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableNameSinglePostName}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableNameSinglePostName}{ }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableNameSingleSymSep}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableNameSingleSymSep}{ }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableOtherSep}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableOtherSep}{, }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubOtherSep}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSubOtherSep}{\glstableOtherSep}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubDescSep}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSubDescSep}{\glstableSubOtherSep}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubNameSingleFmt}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableSubNameSingleFmt}[1]{%
 \glstableSubNameTarget{#1}%
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{changed \cs{GlsXtrIfFieldUndef} to
%\cs{ifglshasdesc}}
%    \begin{macrocode}
 \ifglshasdesc{#1}%
 {%
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{changed \cs{GlsXtrIfFieldUndef} to
%\cs{ifglshassymbol}}
%    \begin{macrocode}
   \ifglshassymbol{#1}%
   {%
     \glstableifhasotherfield{#1}%
     {%
%    \end{macrocode}
%Description, symbol and other
%    \begin{macrocode}
       \glstableNameSinglePostSubName
       \glstableNameSingleSubSuppl
       {%
         \glstableSubSymbol{#1}%
         \glstableNameSingleSymSep
         \glstableSubOtherWithSep{}{#1}{\glstableSubOtherSep}%
         \glstableSubDesc{#1}%
       }%
     }%
     {%
%    \end{macrocode}
%Description and symbol but no other.
%    \begin{macrocode}
      \glstableNameSinglePostSubName
      \glstableNameSingleSubSuppl
      {%
        \glstableSubSymbol{#1}%
        \glstableNameSingleSymSep
        \glstableSubDesc{#1}%
      }%
    }%
   }%
   {%
%    \end{macrocode}
%Description but no symbol.
%    \begin{macrocode}
     \glstableNameSinglePostSubName
     \glstableNameSingleSubSuppl
     {%
       \glstableSubOtherWithSep{}{#1}{\glstableSubOtherSep}%
       \glstableSubDesc{#1}%
     }%
   }%
 }%
 {%
%    \end{macrocode}
%No description.
%\changes{1.50}{2022-11-08}{changed \cs{GlsXtrIfFieldUndef} to
%\cs{ifglshassymbol}}
%    \begin{macrocode}
   \ifglshassymbol{#1}%
   {%
%    \end{macrocode}
%No description but has symbol.
%    \begin{macrocode}
     \glstableNameSinglePostSubName
     \glstableNameSingleSubSuppl
     {%
       \glstableifhasotherfield{#1}%
       {%
%    \end{macrocode}
%No description, but has symbol and other.
%    \begin{macrocode}
         \glstableSubSymbol{#1}\glstableNameSingleSymSep
         \glstableSubOther{#1}%
       }%
       {%
%    \end{macrocode}
%No description or other but has symbol.
%    \begin{macrocode}
         \glstableSubSymbol{#1}%
       }%
     }%
   }%
   {%
     \glstableifhasotherfield{#1}%
     {%
%    \end{macrocode}
%No description or symbol but has other.
%    \begin{macrocode}
       \glstableNameSinglePostSubName
       \glstableNameSingleSubSuppl{\glstableSubOther{#1}}%
     }%
     {%
%    \end{macrocode}
%No description, symbol or other.
%    \begin{macrocode}
     }%
   }%
 }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableNameSingleSubSuppl}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableNameSingleSubSuppl}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableNameSinglePostSubName}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableNameSinglePostSubName}{ }
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubSep}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSubSep}{\space}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubNameSep}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSubNameSep}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableNameNoDesc}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableNameNoDesc}[1]{%
  \glstableNameTarget{#1}%
  \glstableOtherWithSep{\glstableSubNameSep}{##1}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubNameNoDesc}
%\changes{1.49}{2022-10-14}{new}
%\changes{1.50}{2022-11-08}{changed \cs{glstableOther} to
%\cs{glstableSubOtherWithSep}}
%    \begin{macrocode}
\newcommand{\glstableSubNameNoDesc}[1]{%
  \glstableSubNameTarget{#1}%
  \glstableSubOtherWithSep{\glstableSubNameSep}{#1}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubNameSymbolNoDesc}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSubNameSymbolNoDesc}[1]{%
  \glstableSubNameTarget{#1}%
  \glstableifhasotherfield{#1}%
  {%
    \glstableSubOther{#1}%
    \ifglshassymbol{#1}%
    {\glstableSubOtherSep\glstableSubSymbol{#1}}%
    {}%
  }%
  {%
    \ifglshassymbol{#1}%
    {\glstableSubSymbol{#1}}%
    {}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSymbolFmt}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableSymbolFmt}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSymbol}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSymbol}[1]{\glstableSymbolFmt{\glossentrysymbol{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubSymbolFmt}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableSubSymbolFmt}[1]{\glstableSymbolFmt{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubSymbol}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSubSymbol}[1]{\glstableSubSymbolFmt{\glossentrysymbol{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubSymbolWithSep}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSubSymbolWithSep}[3]{%
 \ifglshassymbol{#2}%
 {#1\glstableSubSymbol{#2}#3}%
 {}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSymbolNameTarget}
%\changes{1.49}{2022-10-14}{new}
%Where the symbol takes place of the name.
%    \begin{macrocode}
\newcommand{\glstableSymbolNameTarget}[1]{%
 \glstarget{#1}{\glstableSymbolName{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSymbolNameFmt}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableSymbolNameFmt}[1]{%
 \glstableSymbolFmt{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSymbolName}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSymbolName}[1]{%
 \glsentryitem{#1}\glstableSymbolNameFmt{\glossentrysymbol{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubSymbolNameTarget}
%\changes{1.49}{2022-10-14}{new}
%Where the symbol takes place of the name.
%    \begin{macrocode}
\newcommand{\glstableSubSymbolNameTarget}[1]{%
 \glstarget{#1}{\glstableSubSymbolName{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubSymbolNameFmt}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableSubSymbolNameFmt}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubSymbolName}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSubSymbolName}[1]{%
 \glssubentryitem{#1}\glstableSubSymbolNameFmt{\glossentrysymbol{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableDesc}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableDesc}[1]{%
 \glstableDescFmt{\glossentrydesc{#1}\glspostdescription}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableDescFmt}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableDescFmt}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableDescWithOther}
%\changes{1.49}{2022-10-14}{new}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableDescWithOther}[1]{%
  \glstableifhasotherfield{#1}%
  {%
    \glstableOther{#1}%
    \ifglshasdesc{#1}{\glstableOtherSep\glstableDesc{#1}}{}%
  }%
  {%
    \ifglshasdesc{#1}{\glstableDesc{#1}}{}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubDescFmt}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableSubDescFmt}[1]{\glstableDescFmt{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubDesc}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableSubDesc}[1]{%
 \glstableSubDescFmt{\glossentrydesc{#1}\glspostdescription}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstableSubDescWithOther}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableSubDescWithOther}[1]{\glstableDescWithOther{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubDescSymbolOther}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSubDescSymbolOther}[1]{%
  \ifglshasdesc{#1}%
  {%
    \glstableSubDesc{#1}%
    \ifglshassymbol{#1}%
    {%
      \glstableSubDescSep
      \glstableSubSymbol{#1}%
      \glstableSubOtherWithSep{\glstableSubSep}{#1}{}%
    }%
    {%
      \glstableSubOtherWithSep{\glstableSubOtherSep}{#1}{}%
    }%
  }%
  {%
    \ifglshassymbol{#1}%
    {%
      \glstableSubSymbol{#1}%
      \glstableSubOtherWithSep{\glstableSubSep}{#1}{}%
    }%
    {\glstableSubOther{#1}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableOtherNoDesc}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableOtherNoDesc}[1]{%
 \glstableOtherIfSet{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableOtherIfSet}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableOtherIfSet}[1]{%
  \glstableifhasotherfield{#1}{\glstableOther{#1}}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableSubOtherNoDesc}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableSubOtherNoDesc}[1]{%
 \glstableOtherNoDesc{#1}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstableSubOtherIfSet}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableSubOtherIfSet}[1]{%
 \glstableOtherIfSet{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableHeaderFmt}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableHeaderFmt}[1]{\textbf{#1}}
%    \end{macrocode}
%\end{macro}
%
%    \begin{macrocode}
\define@key{printglosstable}{block-style}
{\glstablesetstyle{#1}}
%    \end{macrocode}
%
%\begin{macro}{\glstablecolsperblock}
%\changes{1.49}{2022-10-14}{new}
%Number of columns per block (entry).
%Assigned by block style.
%    \begin{macrocode}
\newcount\glstablecolsperblock
\glstablecolsperblock=2\relax
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableblockheader}
%\changes{1.49}{2022-10-14}{new}
%The column header, which may cover multiple columns.
%Redefined by block style.
%    \begin{macrocode}
\newcommand{\glstableblockheader}{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\glstableblockalign}
%\changes{1.49}{2022-10-14}{new}
%The column alignment specs for the block.
%Redefined by the block style.
%    \begin{macrocode}
\newcommand{\glstableblockalign}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableblockentry}
%\changes{1.49}{2022-10-14}{new}
%The entry item, which may cover multiple columns.
%Redefined by block style.
%    \begin{macrocode}
\newcommand{\glstableblockentry}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableblocksubentry}
%\changes{1.49}{2022-10-14}{new}
%The sub-entry is in a single column of the block (requires children to be saved)
%Redefined by block style.
%    \begin{macrocode}
\newcommand{\glstableblocksubentry}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableinitlengthupdates}
%\changes{1.49}{2022-10-14}{new}
%Block style command.
%    \begin{macrocode}
\newcommand{\glstableinitlengthupdates}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablelengthupdate}
%\changes{1.49}{2022-10-14}{new}
%Block style command.
%    \begin{macrocode}
\newcommand{\glstablelengthupdate}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablefinishlengthupdates}
%\changes{1.49}{2022-10-14}{new}
%Block style command.
%    \begin{macrocode}
\newcommand{\glstablefinishlengthupdates}{}
%    \end{macrocode}
%\end{macro}
%
%
%\begin{macro}{\glstablesetstyle}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstablesetstyle}[1]{%
  \ifcsdef{@glstable@style@#1}%
  {\csuse{@glstable@style@#1}}%
  {\PackageError{glossary-table}{Unknown style `#1'}{}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablenewstyle}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstablenewstyle}[2]{%
  \ifcsdef{@glstable@style@#1}%
  {\PackageError{glossary-table}{style `#1' already defined}{}}%
  {\csdef{@glstable@style@#1}{#2}}%
}
%    \end{macrocode}
%\end{macro}
%
%Provide some common layouts.
%\begin{blockstyle}{name-desc}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\glstablenewstyle{name-desc}{%
%    \end{macrocode}
% 2 columns per block (name, description).
%    \begin{macrocode}
 \glstablecolsperblock=2\relax
%    \end{macrocode}
% Initialise length registers (need to calculate max name 
% width if par align).
%    \begin{macrocode}
 \renewcommand{\glstableinitlengthupdates}{%
   \ifKV@printglosstable@header
     \glsmeasurewidth{\glstablenamewidth}%
       {\glstableHeaderFmt\glstablenameheader}%
   \else
     \setlength{\glstablenamewidth}{0pt}%
   \fi
   \setlength{\glstabledescwidth}{0pt}%
 }%
%    \end{macrocode}
% Update width in unsrt hook.
%    \begin{macrocode}
 \renewcommand{\glstablelengthupdate}[1]{%
   \glstablemeasureandupdate{\glstablenamewidth}{\glstableName{##1}}%
 }%
%    \end{macrocode}
% Finally set the description width to the remaining available.
%    \begin{macrocode}
 \renewcommand{\glstablefinishlengthupdates}{%
   \setlength{\glstabledescwidth}{\dimexpr\glstableblockwidth
    - \glstablenamewidth}%
   \ifdim\glstabledescwidth<0pt\relax
     \setlength{\glstablenamewidth}{\dimexpr0.5\glstableblockwidth}%
     \setlength{\glstabledescwidth}{\glstablenamewidth}%
   \fi
 }%
%    \end{macrocode}
% How to format the top-level entry in the block.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableNameTarget{##1} & 
   \glstableDescWithOther{##1}%
   \glstableChildEntries{##1}%
 }%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubNameTarget{##1}\glstableSubNameSep
   \glstableSubDescWithOther{##1}%
 }%
%    \end{macrocode}
%Available width for child entries.
%    \begin{macrocode}
 \renewcommand{\glstablesubentrywidth}{\glstabledescwidth}
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstablenameheader &
   \glstableHeaderFmt\glstabledescheader}%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{\glstablenamecolalign\glstabledesccolalign}%
}
%    \end{macrocode}
%\end{blockstyle}
%Set the default style.
%    \begin{macrocode}
\glstablesetstyle{name-desc}
%    \end{macrocode}
%
%\begin{blockstyle}{name}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\glstablenewstyle{name}{%
%    \end{macrocode}
% 1 columns per block (name optionally with symbol and description).
%    \begin{macrocode}
 \glstablecolsperblock=1\relax
%    \end{macrocode}
% Initialise length registers (no calculation required, column width
% same as block width).
%    \begin{macrocode}
 \renewcommand{\glstableinitlengthupdates}{}%
%    \end{macrocode}
% No measuring required.
%    \begin{macrocode}
 \renewcommand{\glstablelengthupdate}[1]{}%
%    \end{macrocode}
% Set the name width to the amount available.
%    \begin{macrocode}
 \renewcommand{\glstablefinishlengthupdates}{%
   \setlength{\glstablenamewidth}{\glstableblockwidth}%
 }%
%    \end{macrocode}
% How to format the top-level entry in the block.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableNameSingleFmt{##1}%
   \glstableChildEntries{##1}%
}%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubNameSingleFmt{##1}}%
%    \end{macrocode}
%Available width for child entries.
%    \begin{macrocode}
 \renewcommand{\glstablesubentrywidth}{\glstableblockwidth}
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstablenameheader}%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{\glstablenamecolalign}%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{name-symbol}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\glstablenewstyle{name-symbol}{%
%    \end{macrocode}
% 2 columns per block (name and symbol).
%    \begin{macrocode}
 \glstablecolsperblock=2\relax
%    \end{macrocode}
% Initialise length registers (need to calculate max symbol
% width if par align). This assumes the symbol requires the minimal
% width and any leftover can be assigned to the name.
%    \begin{macrocode}
 \renewcommand{\glstableinitlengthupdates}{%
   \ifKV@printglosstable@header
     \glsmeasurewidth{\glstablesymbolwidth}%
       {\glstableHeaderFmt\glstablesymbolheader}%
   \else
     \setlength{\glstablesymbolwidth}{0pt}%
   \fi
   \setlength{\glstablenamewidth}{0pt}%
 }%
%    \end{macrocode}
% Update widths in unsrt hook.
%    \begin{macrocode}
 \renewcommand{\glstablelengthupdate}[1]{%
   \glstablemeasureandupdate{\glstablesymbolwidth}{\glstableSymbol{##1}}%
 }%
%    \end{macrocode}
% Finally set the name width to the remaining available.
%    \begin{macrocode}
 \renewcommand{\glstablefinishlengthupdates}{%
   \setlength{\glstablenamewidth}{\dimexpr\glstableblockwidth
    - \glstablesymbolwidth}%
   \ifdim\glstablenamewidth<0pt\relax
     \setlength{\glstablenamewidth}{\dimexpr0.5\glstableblockwidth}%
     \setlength{\glstablesymbolwidth}{\glstablenamewidth}%
   \fi
 }%
%    \end{macrocode}
% How to format the top-level entry in the block.
%v1.50 child entries now in name column.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableNameNoDesc{##1}%
   \glstableChildEntries{##1}%
 & \glstableSymbol{##1}}%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubNameSymbolNoDesc{##1}}%
%    \end{macrocode}
%Available width for child entries.
%    \begin{macrocode}
 \renewcommand{\glstablesubentrywidth}{\glstablenamewidth}
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstablenameheader &
   \glstableHeaderFmt\glstablesymbolheader}%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{\glstablenamecolalign\glstablesymbolcolalign}%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{desc-name}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\glstablenewstyle{desc-name}{%
%    \end{macrocode}
% 2 columns per block (description, name).
%    \begin{macrocode}
 \glstablecolsperblock=2\relax
%    \end{macrocode}
% Initialise length registers (need to calculate max name 
% width if par align).
%    \begin{macrocode}
 \renewcommand{\glstableinitlengthupdates}{%
   \ifKV@printglosstable@header
     \glsmeasurewidth{\glstablenamewidth}%
       {\glstableHeaderFmt\glstablenameheader}%
   \else
     \setlength{\glstablenamewidth}{0pt}%
   \fi
   \setlength{\glstabledescwidth}{0pt}%
 }%
%    \end{macrocode}
% Update width in unsrt hook.
%    \begin{macrocode}
 \renewcommand{\glstablelengthupdate}[1]{%
   \glstablemeasureandupdate{\glstablenamewidth}{\glstableName{##1}}%
 }%
%    \end{macrocode}
% Finally set the description width to the remaining available.
%    \begin{macrocode}
 \renewcommand{\glstablefinishlengthupdates}{%
   \setlength{\glstabledescwidth}{\dimexpr\glstableblockwidth
    - \glstablenamewidth}%
   \ifdim\glstabledescwidth<0pt\relax
     \setlength{\glstablenamewidth}{\dimexpr0.5\glstableblockwidth}%
     \setlength{\glstabledescwidth}{\glstablenamewidth}%
   \fi
 }%
%    \end{macrocode}
% How to format the top-level entry in the block.
%v1.50 child entries now in description column
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableDescWithOther{##1}%
   \glstableChildEntries{##1}%
 &
   \glstableNameTarget{##1}%
 }%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubDescWithOther{##1}\glstableSubNameSep 
   \glstableSubNameTarget{##1}%
 }%
%    \end{macrocode}
%Available width for child entries.
%    \begin{macrocode}
 \renewcommand{\glstablesubentrywidth}{\glstabledescwidth}
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstabledescheader &
   \glstableHeaderFmt\glstablenameheader
 }%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{\glstabledesccolalign\glstablenamecolalign}%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{symbol-name}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\glstablenewstyle{symbol-name}{%
%    \end{macrocode}
% 2 columns per block (symbol, name).
%    \begin{macrocode}
 \glstablecolsperblock=2\relax
%    \end{macrocode}
% Initialise length registers (need to calculate max symbol
% width if par align).
%    \begin{macrocode}
 \renewcommand{\glstableinitlengthupdates}{%
   \ifKV@printglosstable@header
     \glsmeasurewidth{\glstablesymbolwidth}%
       {\glstableHeaderFmt\glstablesymbolheader}%
   \else
     \setlength{\glstablesymbolwidth}{0pt}%
   \fi
   \setlength{\glstablenamewidth}{0pt}%
 }%
%    \end{macrocode}
% Update widths in unsrt hook.
%    \begin{macrocode}
 \renewcommand{\glstablelengthupdate}[1]{%
   \glstablemeasureandupdate{\glstablesymbolwidth}{\glstableSymbol{##1}}%
 }%
%    \end{macrocode}
% Finally set the name width to the remaining available.
%    \begin{macrocode}
 \renewcommand{\glstablefinishlengthupdates}{%
   \setlength{\glstablenamewidth}{\dimexpr\glstableblockwidth
    - \glstablesymbolwidth}%
   \ifdim\glstablenamewidth<0pt\relax
     \setlength{\glstablenamewidth}{\dimexpr0.5\glstableblockwidth}%
     \setlength{\glstablesymbolwidth}{\glstablenamewidth}%
   \fi
 }%
%    \end{macrocode}
% How to format the top-level entry in the block.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableSymbol{##1} &
   \glstableNameNoDesc{##1}%
   \glstableChildEntries{##1}%
%
 }%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubSymbolWithSep{}{##1}{\glstableSubSep}%
   \glstableSubNameNoDesc{##1}%
 }%
%    \end{macrocode}
%Available width for child entries.
%    \begin{macrocode}
 \renewcommand{\glstablesubentrywidth}{\glstablenamewidth}
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstablesymbolheader &
   \glstableHeaderFmt\glstablenameheader
 }%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{\glstablesymbolcolalign\glstablenamecolalign}%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{name-symbol-desc}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\glstablenewstyle{name-symbol-desc}{%
%    \end{macrocode}
% 3 columns per block (name, symbol, description).
%    \begin{macrocode}
 \glstablecolsperblock=3\relax
%    \end{macrocode}
% Initialise length registers (need to calculate max name and symbol
% widths if par align).
%    \begin{macrocode}
 \renewcommand{\glstableinitlengthupdates}{%
   \ifKV@printglosstable@header
     \glsmeasurewidth{\glstablenamewidth}%
       {\glstableHeaderFmt\glstablenameheader}%
     \glsmeasurewidth{\glstablesymbolwidth}%
       {\glstableHeaderFmt\glstablesymbolheader}%
   \else
     \setlength{\glstablenamewidth}{0pt}%
     \setlength{\glstablesymbolwidth}{0pt}%
   \fi
   \setlength{\glstabledescwidth}{0pt}%
 }%
%    \end{macrocode}
% Update widths in unsrt hook.
%    \begin{macrocode}
 \renewcommand{\glstablelengthupdate}[1]{%
   \glstablemeasureandupdate{\glstablenamewidth}{\glstableName{##1}}%
   \glstablemeasureandupdate{\glstablesymbolwidth}{\glstableSymbol{##1}}%
 }%
%    \end{macrocode}
% Finally set the description width to the remaining available.
%    \begin{macrocode}
 \renewcommand{\glstablefinishlengthupdates}{%
   \setlength{\glstabledescwidth}{\dimexpr\glstableblockwidth
    - \glstablesymbolwidth - \glstablenamewidth}%
   \ifdim\glstabledescwidth<0pt\relax
     \setlength{\glstablenamewidth}{\dimexpr0.5\glstableblockwidth
    - 0.5\glstablesymbolwidth}%
     \setlength{\glstabledescwidth}{\glstablenamewidth}%
   \fi
 }%
%    \end{macrocode}
% How to format the top-level entry in the block.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableNameTarget{##1} &
   \glstableSymbol{##1} &
   \glstableDescWithOther{##1}%
   \glstableChildEntries{##1}%
}%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubNameTarget{##1}\glstableSubNameSep 
   \glstableSubSymbolWithSep{}{##1}{\glstableSubSep}%
   \glstableSubDescWithOther{##1}%
 }%
%    \end{macrocode}
%Available width for child entries.
%    \begin{macrocode}
 \renewcommand{\glstablesubentrywidth}{\glstabledescwidth}
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstablenameheader &
   \glstableHeaderFmt\glstablesymbolheader &
   \glstableHeaderFmt\glstabledescheader}%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{%
   \glstablenamecolalign\glstablesymbolcolalign\glstabledesccolalign}%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{name-other-desc}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\glstablenewstyle{name-other-desc}{%
%    \end{macrocode}
% 3 columns per block (name, other, description).
%    \begin{macrocode}
 \glstablecolsperblock=3\relax
%    \end{macrocode}
% Initialise length registers (need to calculate max name and other
% widths if par align).
%    \begin{macrocode}
 \renewcommand{\glstableinitlengthupdates}{%
   \ifKV@printglosstable@header
     \glsmeasurewidth{\glstablenamewidth}%
       {\glstableHeaderFmt\glstablenameheader}%
     \glsmeasurewidth{\glstableotherwidth}%
       {\glstableHeaderFmt\glstableotherheader}%
   \else
     \setlength{\glstablenamewidth}{0pt}%
     \setlength{\glstableotherwidth}{0pt}%
   \fi
   \setlength{\glstabledescwidth}{0pt}%
 }%
%    \end{macrocode}
% Update widths in unsrt hook.
%    \begin{macrocode}
 \renewcommand{\glstablelengthupdate}[1]{%
   \glstablemeasureandupdate{\glstablenamewidth}{\glstableName{##1}}%
   \glstablemeasureandupdate{\glstableotherwidth}{\glstableOther{##1}}%
 }%
%    \end{macrocode}
% Finally set the description width to the remaining available.
%    \begin{macrocode}
 \renewcommand{\glstablefinishlengthupdates}{%
   \setlength{\glstabledescwidth}{\dimexpr\glstableblockwidth
    - \glstableotherwidth - \glstablenamewidth}%
   \ifdim\glstabledescwidth<0pt\relax
     \setlength{\glstablenamewidth}{\dimexpr0.5\glstableblockwidth
    - 0.5\glstableotherwidth}%
     \setlength{\glstabledescwidth}{\glstablenamewidth}%
   \fi
 }%
%    \end{macrocode}
% How to format the top-level entry in the block.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableNameTarget{##1} &
   \glstableOther{##1} &
   \glstableDesc{##1}%
   \glstableChildEntries{##1}%
}%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubNameTarget{##1}\glstableSubNameSep 
   \glstableSubOtherWithSep{}{##1}{\glstableSubOtherSep}% 
   \glstableSubDesc{##1}}%
%    \end{macrocode}
%Available width for child entries.
%    \begin{macrocode}
 \renewcommand{\glstablesubentrywidth}{\glstabledescwidth}
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstablenameheader &
   \glstableHeaderFmt\glstableotherheader &
   \glstableHeaderFmt\glstabledescheader}%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{%
   \glstablenamecolalign\glstableothercolalign\glstabledesccolalign}%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{desc-other-name}
%\changes{1.50}{2022-11-08}{new}
%As name-other-desc but with the end columns switched.
%    \begin{macrocode}
\glstablenewstyle{desc-other-name}{%
  \glstablesetstyle{name-other-desc}%
%    \end{macrocode}
% How to format the top-level entry in the block.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableDesc{##1}%
   \glstableChildEntries{##1} &
   \glstableOther{##1} &
   \glstableNameTarget{##1}%
 }%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubDesc{##1}%
   \glstableSubOtherWithSep{\glstableSubOtherSep}{##1}{}%
   \glstableSubNameSep 
   \glstableSubNameTarget{##1}% 
 }%
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstabledescheader &
   \glstableHeaderFmt\glstableotherheader &
   \glstableHeaderFmt\glstablenameheader
 }%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{%
   \glstabledesccolalign
   \glstableothercolalign
   \glstablenamecolalign
 }%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{name-symbol-other-desc}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\glstablenewstyle{name-symbol-other-desc}{%
%    \end{macrocode}
% 4 columns per block (name, symbol, other, description).
%    \begin{macrocode}
 \glstablecolsperblock=4\relax
%    \end{macrocode}
% Initialise length registers (need to calculate max name, symbol
% and other widths if par align).
%    \begin{macrocode}
 \renewcommand{\glstableinitlengthupdates}{%
   \ifKV@printglosstable@header
     \glsmeasurewidth{\glstablenamewidth}%
       {\glstableHeaderFmt\glstablenameheader}%
     \glsmeasurewidth{\glstablesymbolwidth}%
       {\glstableHeaderFmt\glstablesymbolheader}%
     \glsmeasurewidth{\glstableotherwidth}%
       {\glstableHeaderFmt\glstableotherheader}%
   \else
     \setlength{\glstablenamewidth}{0pt}%
     \setlength{\glstablesymbolwidth}{0pt}%
     \setlength{\glstableotherwidth}{0pt}%
   \fi
   \setlength{\glstabledescwidth}{0pt}%
 }%
%    \end{macrocode}
% Update widths in unsrt hook.
%    \begin{macrocode}
 \renewcommand{\glstablelengthupdate}[1]{%
   \glstablemeasureandupdate{\glstablenamewidth}{\glstableName{##1}}%
   \glstablemeasureandupdate{\glstablesymbolwidth}{\glstableSymbol{##1}}%
   \glstablemeasureandupdate{\glstableotherwidth}{\glstableOther{##1}}%
 }%
%    \end{macrocode}
% Finally set the description width to the remaining available.
%    \begin{macrocode}
 \renewcommand{\glstablefinishlengthupdates}{%
   \setlength{\glstabledescwidth}{\dimexpr\glstableblockwidth
    - \glstablesymbolwidth - \glstablenamewidth - \glstableotherwidth}%
   \ifdim\glstabledescwidth<0pt\relax
%    \end{macrocode}
% Not enough room so balance them out evenly.
%    \begin{macrocode}
     \setlength{\glstablenamewidth}{\dimexpr0.25\glstableblockwidth}%
     \setlength{\glstablesymbolwidth}{\glstablenamewidth}%
     \setlength{\glstableotherwidth}{\glstablenamewidth}%
     \setlength{\glstabledescwidth}{\glstablenamewidth}%
   \fi
 }%
%    \end{macrocode}
% How to format the top-level entry in the block.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableNameTarget{##1} &
   \glstableSymbol{##1} &
   \glstableOther{##1} &
   \glstableDesc{##1}%
   \glstableChildEntries{##1}%
}%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubNameTarget{##1}\glstableSubNameSep 
   \glstableSubSymbolWithSep{}{##1}{\glstableSubSep}% 
   \glstableSubOtherWithSep{}{##1}{\glstableSubOtherSep}% 
   \glstableSubDesc{##1}}%
%    \end{macrocode}
%Available width for child entries.
%    \begin{macrocode}
 \renewcommand{\glstablesubentrywidth}{\glstabledescwidth}
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstablenameheader &
   \glstableHeaderFmt\glstablesymbolheader &
   \glstableHeaderFmt\glstableotherheader &
   \glstableHeaderFmt\glstabledescheader}%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{%
   \glstablenamecolalign
   \glstablesymbolcolalign
   \glstableothercolalign
   \glstabledesccolalign}%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{name-desc-symbol}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\glstablenewstyle{name-desc-symbol}{%
%    \end{macrocode}
% 3 columns per block (name, description, symbol).
%    \begin{macrocode}
 \glstablecolsperblock=3\relax
%    \end{macrocode}
% Initialise length registers (need to calculate max name and symbol
% widths if par align).
%    \begin{macrocode}
 \renewcommand{\glstableinitlengthupdates}{%
   \ifKV@printglosstable@header
     \glsmeasurewidth{\glstablenamewidth}%
       {\glstableHeaderFmt\glstablenameheader}%
     \glsmeasurewidth{\glstablesymbolwidth}%
       {\glstableHeaderFmt\glstablesymbolheader}%
   \else
     \setlength{\glstablenamewidth}{0pt}%
     \setlength{\glstablesymbolwidth}{0pt}%
   \fi
   \setlength{\glstabledescwidth}{0pt}%
 }%
%    \end{macrocode}
% Update widths in unsrt hook.
%    \begin{macrocode}
 \renewcommand{\glstablelengthupdate}[1]{%
   \glstablemeasureandupdate{\glstablenamewidth}{\glstableName{##1}}%
   \glstablemeasureandupdate{\glstablesymbolwidth}{\glstableSymbol{##1}}%
 }%
%    \end{macrocode}
% Finally set the description width to the remaining available.
%    \begin{macrocode}
 \renewcommand{\glstablefinishlengthupdates}{%
   \setlength{\glstabledescwidth}{\dimexpr\glstableblockwidth
    - \glstablesymbolwidth - \glstablenamewidth}%
   \ifdim\glstabledescwidth<0pt\relax
     \setlength{\glstablenamewidth}{\dimexpr0.5\glstableblockwidth
    - 0.5\glstablesymbolwidth}%
     \setlength{\glstabledescwidth}{\glstablenamewidth}%
   \fi
 }%
%    \end{macrocode}
% How to format the top-level entry in the block.
%v1.50 child entries in description column.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableNameTarget{##1} &
   \glstableDescWithOther{##1}%
   \glstableChildEntries{##1}%
 &
   \glstableSymbol{##1}%
 }%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubNameTarget{##1}\glstableSubNameSep 
   \glstableSubDescWithOther{##1}% 
   \glstableSubSymbolWithSep{\glstableSubSep}{##1}{}%
 }%
%    \end{macrocode}
%Available width for child entries.
%    \begin{macrocode}
 \renewcommand{\glstablesubentrywidth}{\glstabledescwidth}
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstablenameheader &
   \glstableHeaderFmt\glstabledescheader &
   \glstableHeaderFmt\glstablesymbolheader
 }%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{%
   \glstablenamecolalign\glstabledesccolalign\glstablesymbolcolalign}%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{desc-symbol-other-name}
%\changes{1.50}{2022-11-08}{new}
%As name-symbol-other-desc but with the end columns switched.
%    \begin{macrocode}
\glstablenewstyle{desc-symbol-other-name}{%
  \glstablesetstyle{name-symbol-other-desc}%
%    \end{macrocode}
% How to format the top-level entry in the block.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableDesc{##1}%
   \glstableChildEntries{##1} &
   \glstableSymbol{##1} &
   \glstableOther{##1} &
   \glstableNameTarget{##1}%
 }%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubDescSymbolOther{##1}%
   \glstableSubNameSep 
   \glstableSubNameTarget{##1}%
 }%
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstabledescheader &
   \glstableHeaderFmt\glstablesymbolheader &
   \glstableHeaderFmt\glstableotherheader &
   \glstableHeaderFmt\glstablenameheader
 }%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{%
   \glstabledesccolalign
   \glstablesymbolcolalign
   \glstableothercolalign
   \glstablenamecolalign
 }%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{desc-other-symbol-name}
%\changes{1.50}{2022-11-08}{new}
%As name-symbol-other-desc but column order is description, other, symbol
%and name.
%    \begin{macrocode}
\glstablenewstyle{desc-other-symbol-name}{%
  \glstablesetstyle{name-symbol-other-desc}%
%    \end{macrocode}
% How to format the top-level entry in the block.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableDesc{##1}%
   \glstableChildEntries{##1} &
   \glstableOther{##1} &
   \glstableSymbol{##1} &
   \glstableNameTarget{##1}%
 }%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubDesc{##1}%
   \glstableSubOtherWithSep{\glstableSubOtherSep}{##1}{}%
   \glstableSubSymbolWithSep{\glstableSubSep}{##1}{}%
   \glstableSubNameSep 
   \glstableSubNameTarget{##1}%
 }%
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstabledescheader &
   \glstableHeaderFmt\glstableotherheader &
   \glstableHeaderFmt\glstablesymbolheader &
   \glstableHeaderFmt\glstablenameheader
 }%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{%
   \glstabledesccolalign
   \glstableothercolalign
   \glstablesymbolcolalign
   \glstablenamecolalign
 }%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{name-other-symbol-desc}
%\changes{1.50}{2022-11-08}{new}
%As name-symbol-other-desc but column order is name, other, symbol
%and description.
%    \begin{macrocode}
\glstablenewstyle{name-other-symbol-desc}{%
  \glstablesetstyle{name-symbol-other-desc}%
%    \end{macrocode}
% How to format the top-level entry in the block.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableNameTarget{##1} &
   \glstableOther{##1} &
   \glstableSymbol{##1} &
   \glstableDesc{##1}%
   \glstableChildEntries{##1}%
 }%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubNameTarget{##1}\glstableSubNameSep 
   \glstableSubOtherWithSep{}{##1}{\glstableSubOtherSep}%
   \glstableSubSymbolWithSep{}{##1}{\glstableSubSep}% 
   \glstableSubDesc{##1}%
 }%
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstablenameheader &
   \glstableHeaderFmt\glstableotherheader &
   \glstableHeaderFmt\glstablesymbolheader &
   \glstableHeaderFmt\glstabledescheader
 }%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{%
   \glstablenamecolalign
   \glstableothercolalign
   \glstablesymbolcolalign
   \glstabledesccolalign
 }%
}
%    \end{macrocode}
%\end{blockstyle}
%
%
%\begin{blockstyle}{name-other}
%\changes{1.49}{2022-10-14}{new}
%As name-desc but the other field is put in the description column.
%    \begin{macrocode}
\glstablenewstyle{name-other}{%
%    \end{macrocode}
% 2 columns per block (name, other).
%    \begin{macrocode}
 \glstablecolsperblock=2\relax
%    \end{macrocode}
% Initialise length registers (need to calculate max name 
% width if par align).
%    \begin{macrocode}
 \renewcommand{\glstableinitlengthupdates}{%
   \ifKV@printglosstable@header
     \glsmeasurewidth{\glstablenamewidth}%
       {\glstableHeaderFmt\glstablenameheader}%
   \else
     \setlength{\glstablenamewidth}{0pt}%
   \fi
   \setlength{\glstableotherwidth}{0pt}%
 }%
%    \end{macrocode}
% Update width in unsrt hook.
%    \begin{macrocode}
 \renewcommand{\glstablelengthupdate}[1]{%
   \glstablemeasureandupdate{\glstablenamewidth}{\glstableName{##1}}%
 }%
%    \end{macrocode}
% Finally set the other width to the remaining available.
%    \begin{macrocode}
 \renewcommand{\glstablefinishlengthupdates}{%
   \setlength{\glstableotherwidth}{\dimexpr\glstableblockwidth
    - \glstablenamewidth}%
   \ifdim\glstableotherwidth<0pt\relax
     \setlength{\glstablenamewidth}{\dimexpr0.5\glstableblockwidth}%
     \setlength{\glstableotherwidth}{\glstablenamewidth}%
   \fi
 }%
%    \end{macrocode}
% How to format the top-level entry in the block.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableNameTarget{##1} & \glstableOtherNoDesc{##1}%
   \glstableChildEntries{##1}%
}%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubNameTarget{##1}\glstableSubNameSep \glstableSubOtherNoDesc{##1}}%
%    \end{macrocode}
%Available width for child entries.
%    \begin{macrocode}
 \renewcommand{\glstablesubentrywidth}{\glstableotherwidth}
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstablenameheader &
   \glstableHeaderFmt\glstableotherheader}%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{\glstablenamecolalign\glstableothercolalign}%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{other-name}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\glstablenewstyle{other-name}{%
%    \end{macrocode}
% 2 columns per block (other, name).
%    \begin{macrocode}
 \glstablecolsperblock=2\relax
%    \end{macrocode}
% Initialise length registers (need to calculate max name 
% width if par align).
%    \begin{macrocode}
 \renewcommand{\glstableinitlengthupdates}{%
   \ifKV@printglosstable@header
     \glsmeasurewidth{\glstablenamewidth}%
       {\glstableHeaderFmt\glstablenameheader}%
   \else
     \setlength{\glstablenamewidth}{0pt}%
   \fi
   \setlength{\glstableotherwidth}{0pt}%
 }%
%    \end{macrocode}
% Update width in unsrt hook.
%    \begin{macrocode}
 \renewcommand{\glstablelengthupdate}[1]{%
   \glstablemeasureandupdate{\glstablenamewidth}{\glstableName{##1}}%
 }%
%    \end{macrocode}
% Finally set the other width to the remaining available.
%    \begin{macrocode}
 \renewcommand{\glstablefinishlengthupdates}{%
   \setlength{\glstableotherwidth}{\dimexpr\glstableblockwidth
    - \glstablenamewidth}%
   \ifdim\glstableotherwidth<0pt\relax
     \setlength{\glstablenamewidth}{\dimexpr0.5\glstableblockwidth}%
     \setlength{\glstableotherwidth}{\glstablenamewidth}%
   \fi
 }%
%    \end{macrocode}
% How to format the top-level entry in the block.
%v1.50 child entries in other column.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableOtherNoDesc{##1}%
   \glstableChildEntries{##1}%
 &
   \glstableNameTarget{##1}}%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubOtherNoDesc{##1}\glstableSubNameSep
   \glstableSubNameTarget{##1}}%
%    \end{macrocode}
%Available width for child entries.
%    \begin{macrocode}
 \renewcommand{\glstablesubentrywidth}{\glstableotherwidth}
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstableotherheader &
   \glstableHeaderFmt\glstablenameheader}%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{\glstableothercolalign\glstablenamecolalign}%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{symbol-other}
%\changes{1.49}{2022-10-14}{new}
%As name-other but the use the symbol in place of the name.
%    \begin{macrocode}
\glstablenewstyle{symbol-other}{%
%    \end{macrocode}
% 2 columns per block (symbol, other).
%    \begin{macrocode}
 \glstablecolsperblock=2\relax
%    \end{macrocode}
% Initialise length registers (need to calculate max symbol 
% width if par align).
%    \begin{macrocode}
 \renewcommand{\glstableinitlengthupdates}{%
   \ifKV@printglosstable@header
     \glsmeasurewidth{\glstablesymbolwidth}%
       {\glstableHeaderFmt\glstablesymbolheader}%
   \else
     \setlength{\glstablesymbolwidth}{0pt}%
   \fi
   \setlength{\glstableotherwidth}{0pt}%
 }%
%    \end{macrocode}
% Update width in unsrt hook.
%    \begin{macrocode}
 \renewcommand{\glstablelengthupdate}[1]{%
   \glstablemeasureandupdate{\glstablesymbolwidth}{\glstableSymbolName{##1}}%
 }%
%    \end{macrocode}
% Finally set the other width to the remaining available.
%    \begin{macrocode}
 \renewcommand{\glstablefinishlengthupdates}{%
   \setlength{\glstableotherwidth}{\dimexpr\glstableblockwidth
    - \glstablesymbolwidth}%
   \ifdim\glstableotherwidth<0pt\relax
     \setlength{\glstablesymbolwidth}{\dimexpr0.5\glstableblockwidth}%
     \setlength{\glstableotherwidth}{\glstablesymbolwidth}%
   \fi
 }%
%    \end{macrocode}
% How to format the top-level entry in the block.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableSymbolNameTarget{##1} & \glstableOtherNoDesc{##1}%
   \glstableChildEntries{##1}%
}%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubSymbolNameTarget{##1}\glstableSubNameSep
   \glstableSubOtherNoDesc{##1}}%
%    \end{macrocode}
%Available width for child entries.
%    \begin{macrocode}
 \renewcommand{\glstablesubentrywidth}{\glstableotherwidth}
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstablesymbolheader &
   \glstableHeaderFmt\glstableotherheader}%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{\glstablesymbolcolalign\glstableothercolalign}%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{blockstyle}{other-symbol}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\glstablenewstyle{other-symbol}{%
%    \end{macrocode}
% 2 columns per block (other-symbol).
%    \begin{macrocode}
 \glstablecolsperblock=2\relax
%    \end{macrocode}
% Initialise length registers (need to calculate max symbol 
% width if par align).
%    \begin{macrocode}
 \renewcommand{\glstableinitlengthupdates}{%
   \ifKV@printglosstable@header
     \glsmeasurewidth{\glstablesymbolwidth}%
       {\glstableHeaderFmt\glstablesymbolheader}%
   \else
     \setlength{\glstablesymbolwidth}{0pt}%
   \fi
   \setlength{\glstableotherwidth}{0pt}%
 }%
%    \end{macrocode}
% Update width in unsrt hook.
%    \begin{macrocode}
 \renewcommand{\glstablelengthupdate}[1]{%
   \glstablemeasureandupdate{\glstablesymbolwidth}{\glstableSymbolName{##1}}%
 }%
%    \end{macrocode}
% Finally set the other width to the remaining available.
%    \begin{macrocode}
 \renewcommand{\glstablefinishlengthupdates}{%
   \setlength{\glstableotherwidth}{\dimexpr\glstableblockwidth
    - \glstablesymbolwidth}%
   \ifdim\glstableotherwidth<0pt\relax
     \setlength{\glstablesymbolwidth}{\dimexpr0.5\glstableblockwidth}%
     \setlength{\glstableotherwidth}{\glstablesymbolwidth}%
   \fi
 }%
%    \end{macrocode}
% How to format the top-level entry in the block.
%v1.50 child entries in other column.
%    \begin{macrocode}
 \renewcommand{\glstableblockentry}[1]{%
   \glstableOtherNoDesc{##1}%
   \glstableChildEntries{##1}%
 & \glstableSymbolNameTarget{##1}}%
%    \end{macrocode}
% How to format the entry's children.
%    \begin{macrocode}
 \renewcommand{\glstableblocksubentry}[1]{%
   \glstableSubOtherWithSep{}{##1}{\glstableSubSep}%
   \glstableSubSymbol{##1}%
   \glstableSubNameSep
   \glstableSubSymbolNameTarget{##1}}%
%    \end{macrocode}
%Available width for child entries.
%    \begin{macrocode}
 \renewcommand{\glstablesubentrywidth}{\glstableotherwidth}
%    \end{macrocode}
% How to format the block's header row, if required.
%    \begin{macrocode}
 \renewcommand{\glstableblockheader}{%
   \glstableHeaderFmt\glstableotherheader &
   \glstableHeaderFmt\glstablesymbolheader}%
%    \end{macrocode}
% Set the block's column alignments.
%    \begin{macrocode}
 \renewcommand{\glstableblockalign}{\glstableothercolalign\glstablesymbolcolalign}%
}
%    \end{macrocode}
%\end{blockstyle}
%
%\begin{macro}{\glstablecaption}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glstablecaption}\marg{toc title}\marg{title}\marg{label code}
%\end{definition}
%The \meta{label code} will be \cs{@@glossaryseclabel}.
%    \begin{macrocode}
\newcommand{\glstablecaption}[3]{%
 \caption[#1]{#3#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablepostnextcaption}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstablepostnextcaption}{ (\MFUsentencecase{\glsxtrcontinuedname})}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablenextcaption}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glstablenextcaption}\marg{toc title}\marg{title}
%\end{definition}
%    \begin{macrocode}
\newcommand{\glstablenextcaption}[2]{%
 \caption[]{#1\glstablepostnextcaption}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablefoot}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glstablefoot}\marg{postamble}
%\end{definition}
%    \begin{macrocode}
\newcommand{\glstablefoot}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablelastfoot}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glstablelastfoot}\marg{postamble}
%\end{definition}
%    \begin{macrocode}
\newcommand{\glstablelastfoot}[1]{\glstablerowspan{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablehead}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glstablehead}\marg{preamble}
%\end{definition}
%    \begin{macrocode}
\newcommand{\glstablehead}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablefirsthead}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glstablefirsthead}\marg{preamble}
%\end{definition}
%    \begin{macrocode}
\newcommand{\glstablefirsthead}[1]{\glstablerowspan{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablepostpreambleskip}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newlength\glstablepostpreambleskip
\setlength\glstablepostpreambleskip{5pt}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableprepostambleskip}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newlength\glstableprepostambleskip
\setlength\glstableprepostambleskip{5pt}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablefootstrut}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstablefootstrut}{%
 \rule{0pt}{\dimexpr\baselineskip+\glstableprepostambleskip}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablerowspan}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glstablerowspan}\marg{text}
%\end{definition}
%    \begin{macrocode}
\newcommand{\glstablerowspan}[1]{%
 \multicolumn{\glstabletotalcols}{c}{\parbox{\glstablespanwidth}{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablespanwidth}
%\changes{1.50}{2022-11-08}{new}
%This will be updated if column widths are measured. This width
%doesn't include \cs{tabcolsep} on either side. The default is to
%use \cs{LTcapwidth}, which may not be the same size as the table.
%    \begin{macrocode}
\newcommand{\glstablespanwidth}{\LTcapwidth}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstable@begin}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstable@begin}{%
 \PackageError{glossary-table}{table style can only be used with
  \string\printunsrttable}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstable@filter}
%\changes{1.49}{2022-10-14}{new}
%Filter all child entries, but take level offset into account and
%apply custom handler.
%    \begin{macrocode}
\newcommand{\glstable@filter}[1]{%
  \ifnum\glscurrententrylevel>0\relax
    \printunsrtglossaryskipentry
  \else
    \glstableiffilter{#1}%
    {\printunsrtglossaryskipentry}%
    {%
      \glstable@calclengths{\glstablelengthupdate{#1}}%
    }%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableiffilter}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableiffilter}[3]{#3}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablenamewidth}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newlength\glstablenamewidth
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableblockwidth}
%\changes{1.49}{2022-10-14}{new}
%Maximum width available for each block.
%    \begin{macrocode}
\newlength\glstableblockwidth
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstabledescwidth}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newlength\glstabledescwidth
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablesymbolwidth}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newlength\glstablesymbolwidth
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableotherwidth}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newlength\glstableotherwidth
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableifmeasuring}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glstableifmeasuring}\marg{true}\marg{false}
%\end{definition}
%    \begin{macrocode}
\newcommand{\glstableifmeasuring}[2]{#2}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstable@stepentry}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstable@stepentry}[1]{%
 \ifglsentrycounter
  \stepcounter{glossaryentry}%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstable@stepsubentry}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstable@stepsubentry}[1]{%
 \ifglssubentrycounter
  \stepcounter{glossarysubentry}%
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablemeasureandupdate}
%\changes{1.49}{2022-10-14}{new}
%\begin{definition}
%\cs{glstablemeasureandupdate}\marg{len reg}\marg{text}
%\end{definition}
%    \begin{macrocode}
\newcommand{\glstablemeasureandupdate}[2]{%
%    \end{macrocode}
%Measure.
%    \begin{macrocode}
  \glsmeasurewidth{\dimen@}{#2}%
%    \end{macrocode}
%Update if wider.
%    \begin{macrocode}
  \ifdim\dimen@>#1\relax
    \setlength{#1}{\dimen@}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstable@ifhaspreamble}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstable@ifhaspreamble}[2]{%
 \ifdefempty\glossarypreamble
 {#2}%
 {%
  \ifx\@glstable@defaultpreamble\glossarypreamble
    \ifcsvoid{@glossarypreamble@\currentglossary}{#2}{#1}%
  \else
    #1%
  \fi
 }%
}
%    \end{macrocode}
%\end{macro}
%
%Need the type, preamble and postamble.
%    \begin{macrocode}
\define@key{printglosstable}{type}{\renewcommand{\@glo@type}{#1}}
\define@key{printglosstable}{preamble}{\renewcommand{\glossarypreamble}{#1}}
\define@key{printglosstable}{postamble}{\renewcommand{\glossarypostamble}{#1}}
%    \end{macrocode}
%
%Allow localised initialisation.
%\begin{macro}{\glstable@init}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand\glstable@init{}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
\define@cmdkey{printglosstable}[glstable@]{init}{}
%    \end{macrocode}
%
%The default setting is groups=false, unlike the usual default for
%\cs{printunsrtglossary}. Support for groups isn't fully
%implemented.
%    \begin{macrocode}
\define@choicekey{printglosstable}{groups}
[\@glstable@groups@val\@glstable@groups@n]
{false,true,noskip,addskip}[true]%
{%
 \ifcase\@glstable@groups@n\relax
  \let\glstable@groupheading\@gobble
  \glsxtr@printgloss@groupsfalse
 \or
  \let\glstable@groupheading\glstablegroupheading
  \glsxtr@printgloss@groupstrue
 \or
  \let\glstable@groupheading\glstablegroupheading
  \glsxtr@printgloss@groupstrue
  \glsnogroupskiptrue
 \or
  \let\glstable@groupheading\glstablegroupheading
  \glsxtr@printgloss@groupstrue
  \glsnogroupskipfalse
 \fi
}
%    \end{macrocode}
%
%\begin{macro}{\glstable@groupheading}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstable@groupheading}[1]{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablegroupheading}
%\changes{1.49}{2022-10-14}{new}
%This isn't quite working as it puts a spurious line above if it
%occurs at the start of a new row.
%    \begin{macrocode}
\newcommand{\glstablegroupheading}[1]{%
 \multicolumn{\glstabletotalcols}{c}{%
   \glsxtrgetgrouptitle{#1}{\glsxtrcurrentgrptitle}%
   \glstableGroupHeaderFmt\glsxtrcurrentgrptitle
 }%
 \glstablePostGroupNewLine
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablePostGroupNewLine}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstablePostGroupNewLine}{\glstablenewline*}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableGroupHeaderFmt}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableGroupHeaderFmt}{\glstableHeaderFmt}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstable@preentryhook}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstable@preentryhook}[1]{%
  \if@glstable@afterheading
  \else
   \advance\glstablecurrentblockindex by 1\relax
   \ifnum\glstablecurrentblockindex<\glstableblockperrowcount
     \appto#1{&}%
   \else
     \appto#1{\glstablenewline}%
   \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablenewline}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstablenewline}{\tabularnewline}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstable@postentryhook}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstable@postentryhook}[1]{%
 \ifnum\glstableblockperrowcount=\glstablecurrentblockindex
   \glstablecurrentblockindex=0\relax
 \fi
 \@glstable@afterheadingfalse
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstable@grouphook}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstable@grouphook}[1]{%
  \if@glstable@afterheading
  \else
    \preto#1{\glstablenewline}%
    \advance\glstablecurrentblockindex by 1\relax
    \ifnum\glstablecurrentblockindex<\glstableblockperrowcount\relax
      \expandafter\glstable@n@to@amps\expandafter
      {\numexpr\glstableblockperrowcount-\glstablecurrentblockindex}%
      {\preto}{#1}%
    \fi
  \fi
  \glstablecurrentblockindex=0\relax
  \@glstable@afterheadingtrue
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstable@finish}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstable@finish}[1]{%
  \if@glstable@afterheading
  \else
    \advance\glstablecurrentblockindex by 1\relax
    \ifnum\glstablecurrentblockindex<\glstableblockperrowcount\relax
      \expandafter\glstable@n@to@amps\expandafter
      {\numexpr\glstableblockperrowcount-\glstablecurrentblockindex}%
      {\appto}{#1}%
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glstable@defaultpreamble}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\let\@glstable@defaultpreamble\glossarypreamble
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glstable@clearpage}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\@glstable@clearpage}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@glstable@clearpage@iflt}
%\changes{1.50}{2022-11-08}{new}
%Clear page if less than given length available.
%    \begin{macrocode}
\newcommand{\@glstable@clearpage@iflt}[1]{%
  \par
  \ifdim #1>\dimexr\pagegoal-\pagetotal\relax
   \clearpage
  \fi
}
%    \end{macrocode}
%\end{macro}
%
% Allow \cs{clearpage} to be inserted.
%    \begin{macrocode}
\define@key{printglosstable}{clearpage}[true]{%
  \ifstrequal{#1}{true}%
  {%
    \renewcommand{\@glstable@clearpage}{\clearpage}%
  }%
  {%
    \ifstrequal{#1}{false}%
    {%
      \renewcommand{\@glstable@clearpage}{}%
    }%
    {%
      \renewcommand{\@glstable@clearpage}{\@glstable@clearpage@iflt{#1}}%
    }%
  }%
}
%    \end{macrocode}
%
%\begin{macro}{\if@glstable@afterheading}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newif\if@glstable@afterheading
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\printunsrttable}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\NewDocumentCommand\printunsrttable{O{}}{%
 \bgroup
%    \end{macrocode}
%Initialise glossary type.
%    \begin{macrocode}
  \def\@glo@type{\glsdefaulttype}%
%    \end{macrocode}
%Initialise title.
%    \begin{macrocode}
  \def\glossarytitle{%
   \ifcsdef{@glotype@\@glo@type @title}%
   {\csuse{@glotype@\@glo@type @title}}%
   {\glossaryname}%
  }%
  \def\glossarytoctitle{\glossarytitle}%
%    \end{macrocode}
%Initialise preamble.
%    \begin{macrocode}
  \let\glossarypreamble\@glstable@defaultpreamble
%    \end{macrocode}
%Initialise groups=false.
%    \begin{macrocode}
  \glsxtr@printgloss@groupsfalse
%    \end{macrocode}
%Initialise nogroupskip=true.
%    \begin{macrocode}
  \glsnogroupskiptrue
%    \end{macrocode}
%Set table keys.
%    \begin{macrocode}
  \setkeys*{printglosstable}{#1}%
%\changes{1.50}{2022-11-08}{added check for caption and floats options}
%    \end{macrocode}
%If this table should have a caption, check the floats package
%option to determine whether or not to switch counter. Can be
%counteracted by redefining \cs{glscounter} in init code.
%    \begin{macrocode}
  \ifKV@printglosstable@caption
   \if@glsxtr@floats
    \renewcommand{\glscounter}{table}%
   \fi
  \fi
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{moved init hook just after keys set}
%Initialisation hook.
%    \begin{macrocode}
  \glstable@init
%    \end{macrocode}
%Should lengths be calculated?
%    \begin{macrocode}
  \let\glstable@calclengths\glstableifpar
%    \end{macrocode}
%Has nogroupskip=false been used?
%    \begin{macrocode}
  \ifglsnogroupskip
  \else
   \ifundef\glspenaltygroupskip
   {%
     \PackageError{glossary-table}{\string\printunsrttable[nogroupskip=false]
     requires glossary-longbooktabs.sty}%
     {You need to load glossary-longbooktabs.sty in addition to
     loading glossary-table.sty if you want the group skip}%
     \glsnogroupskiptrue
   }%
   {\glspatchLToutput}%
  \fi
  \let\currentglossary\@glo@type
  \protected@edef\glstable@opts{type=\@glo@type,style=table}%
  \ifdefempty\XKV@rm{}{\epreto\glstable@opts{\expandonce\XKV@rm,}}%
%    \end{macrocode}
%Calculate the total number of columns.
%    \begin{macrocode}
  \glstabletotalcols=\numexpr\glstablecolsperblock*\glstableblockperrowcount\relax
%    \end{macrocode}
%If the widest name is non-void, calculate the remaining width
%available for the blocks. 1pt is subtracted to allow for rounding
%errors.
%    \begin{macrocode}
  \glstable@calclengths 
  {%
    \edef\glstablespanwidth{\dimexpr\linewidth-2\tabcolsep-1pt}%
    \glstableblockwidth=\dimexpr
     (\linewidth-\glstabletotalcols\tabcolsep-\glstabletotalcols\tabcolsep)
      /\glstableblockperrowcount-1pt
      \relax
    \glstableinitlengthupdates
  }%
%    \end{macrocode}
%Build the header row.
%    \begin{macrocode}
  \def\glstable@alignment{}%
  \ifKV@printglosstable@rules
    \def\glstable@header{\toprule}%
  \else
    \def\glstable@header{}%
  \fi
  \global\glstablecurrentblockindex=0\relax
  \loop
%    \end{macrocode}
%Add to alignment spec.
%    \begin{macrocode}
    \ifnum\glstablecurrentblockindex>0\relax
     \protected@eappto\glstable@alignment{\glstable@blockalignsep}%
    \fi
    \protected@eappto\glstable@alignment{\glstableblockalign}%
    \ifKV@printglosstable@header
%    \end{macrocode}
%Add to header.
%    \begin{macrocode}
     \ifnum\glstablecurrentblockindex>0\relax
      \appto\glstable@header{&}%
     \fi
     \eappto\glstable@header{\expandonce\glstableblockheader}%
    \fi
%    \end{macrocode}
%Increment loop counter
%    \begin{macrocode}
     \advance\glstablecurrentblockindex by 1\relax
  \ifnum\glstablecurrentblockindex<\glstableblockperrowcount
  \repeat
  \ifKV@printglosstable@header
%    \end{macrocode}
%Append cr to header.
%    \begin{macrocode}
    \appto\glstable@header{\glstablenewline}%
    \ifKV@printglosstable@rules
      \appto\glstable@header{\midrule}%
    \fi
  \fi
  \protected@edef\glstable@begin{%
    \noexpand\begin{longtable}{\expandonce\glstable@alignment}%
  }%
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{added expandafter}
%Use \cs{expandafter} after to allow an empty \cs{glossarytoctitle}
%to prevent the caption from being added to the table of contents.
%    \begin{macrocode}
  \ifKV@printglosstable@caption
    \appto\glstable@begin{%
      \expandafter\glstablecaption\expandafter
        {\glossarytoctitle}{\glossarytitle}%
        {\@@glossaryseclabel}%
      \glstablenewline
    }%
  \fi
%    \end{macrocode}
%Add preamble if set.
%    \begin{macrocode}
  \glstable@ifhaspreamble
  {%
    \eappto\glstable@begin{%
      \noexpand\glstablefirsthead
       {\expandonce\glossarypreamble}%
      \noexpand\glstablenewline[\glstablepostpreambleskip]%
      \expandonce\glstable@header
      \noexpand\endfirsthead
    }%
    \ifKV@printglosstable@caption
      \appto\glstable@begin{%
        \expandafter\glstablenextcaption\expandafter
         {\glossarytoctitle}{\glossarytitle}%
        \glstablenewline
      }%
    \fi
    \ifx\glstablehead\@gobble
    \else
      \eappto\glstable@begin{%
        \noexpand\glstablehead{\expandonce\glossarypreamble}%
        \noexpand\glstablenewline[\glstablepostpreambleskip]%
      }%
    \fi
  }%
  {%
    \eappto\glstable@begin{%
      \expandonce\glstable@header
      \noexpand\endfirsthead
    }%
    \ifKV@printglosstable@caption
      \appto\glstable@begin{%
        \expandafter\glstablenextcaption\expandafter
         {\glossarytoctitle}{\glossarytitle}%
        \glstablenewline
      }%
    \fi
  }%
  \eappto\glstable@begin{%
    \expandonce\glstable@header
    \noexpand\endhead
  }%
%    \end{macrocode}
%Add postamble if set.
%    \begin{macrocode}
  \ifdefvoid\glossarypostamble
  {%
%    \end{macrocode}
%Just add rule, if required.
%    \begin{macrocode}
    \ifKV@printglosstable@rules
      \appto\glstable@begin{\bottomrule\endfoot}%
    \fi
  }
  {%
    \ifKV@printglosstable@rules
      \eappto\glstable@begin{%
       \noexpand\bottomrule
       \noexpand\glstablefoot
        {\noexpand\glstablefootstrut\expandonce\glossarypostamble}%
       \noexpand\glstablenewline
       \noexpand\endfoot
       \noexpand\bottomrule
       \noexpand\glstablelastfoot
        {\noexpand\glstablefootstrut\expandonce\glossarypostamble}%
       \noexpand\glstablenewline
       \noexpand\endlastfoot
      }%
    \else
      \eappto\glstable@begin{%
       \noexpand\glstablefoot{\expandonce\glossarypostamble}%
       \noexpand\glstablenewline[\glstableprepostambleskip]%
       \noexpand\endfoot
       \noexpand\glstablelastfoot{\expandonce\glossarypostamble}%
       \noexpand\glstablenewline[\glstableprepostambleskip]%
       \noexpand\endlastfoot
      }%
    \fi
  }%
%    \end{macrocode}
%Set up filtering.
%    \begin{macrocode}
  \let\printunsrtglossaryentryprocesshook\glstable@filter
%    \end{macrocode}
%Use the hooks to add tab and new
%lines to avoid awkward conditionals within \env{longtable}.
%    \begin{macrocode}
  \renewcommand{\printunsrtglossarypreentryprocesshook}{%
    \glstable@preentryhook
  }%
  \renewcommand{\printunsrtglossarypostentryprocesshook}{%
    \glstable@postentryhook
  }%
  \renewcommand{\printunsrtglossarygrouphook}{%
    \glstable@grouphook
  }%
  \renewcommand{\printunsrtglossarypreend}{%
    \glstable@finish
  }%
%    \end{macrocode}
%Disable preamble and postamble commands as their content has
%already been added to the table specs.
%    \begin{macrocode}
  \let\glossarypostamble\relax
  \let\glossarypreamble\relax
%    \end{macrocode}
%Disable the section command as the title and toc title are now in
%the caption.
%    \begin{macrocode}
  \renewcommand{\glossarysection}[2][]{}%
%    \end{macrocode}
%Used in hooks.
%    \begin{macrocode}
  \glstablecurrentblockindex=0\relax
  \@glstable@afterheadingtrue
%    \end{macrocode}
%Clear page if required.
%    \begin{macrocode}
  \@glstable@clearpage
%    \end{macrocode}
%Finish updating lengths in hook.
%    \begin{macrocode}
  \let\glstable@org@predoglossary\printunsrtglossarypredoglossary
  \renewcommand{\printunsrtglossarypredoglossary}
  {%
    \glstable@calclengths{\glstablefinishlengthupdates}%
    \glstable@org@predoglossary
  }%
%    \end{macrocode}
%The glossary will be empty on the first \LaTeX\ run as the entries
%won't be defined until \app{bib2gls} has selected them.
%    \begin{macrocode}
  \glsxtrifemptyglossary{\currentglossary}
  {%
    \GlossariesExtraWarning{Glossary `\currentglossary' is empty}%
%    \end{macrocode}
%Just do the table header and footer to allow it to be added to the
%list of tables and have the label added to the aux file.
%    \begin{macrocode}
    \edef\@glsxtr@tmp{\noexpand\setkeys{printgloss}{\expandonce\glstable@opts}}%
    \@glsxtr@tmp
    \glstable@begin% \begin{longtable}{specs}
    \end{longtable}%
  }%
  {%
    \expandafter\printunsrtglossary\expandafter[\glstable@opts]\relax
  }%
 \egroup
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableiffilterchild}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstableiffilterchild}[3]{#3}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstable@child}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstable@child}[1]{%
  \glstableiffilterchild{#1}{}%
  {%
    \ifdefempty\glstable@dochildren{}%
    {\appto\glstable@dochildren{\glstableblocksubentrysep}}%
    \appto\glstable@dochildren{\glstableblocksubentry{#1}}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstableChildEntries}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand{\glstableChildEntries}[1]{%
  \def\glstable@dochildren{}%
  \GlsXtrIfFieldNonZero*{childcount}{#1}%
  {%
    \glsxtrfieldforlistloop{#1}{childlist}{\glstable@child}%
    \ifdefempty\glstable@dochildren
    {}%
    {%
      \preto\glstable@dochildren{%
        \glstablePreChildren
        \begin{glstablesubentries}%
      }%
      \appto\glstable@dochildren{\end{glstablesubentries}}%
    }%
  }%
  {}%
  \glstable@dochildren
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstable@n@amps}
%\changes{1.49}{2022-10-14}{new}
%\changes{1.50}{removed}{new}
%Removed.
%\end{macro}
%\begin{macro}{\glstable@n@to@amps}
%\changes{1.50}{2022-11-08}{new}
%    \begin{macrocode}
\newcommand{\glstable@n@to@amps}[3]{%
 \ifnum#1>0\relax
   \count@=0\relax
   \loop 
     \advance\count@ by 1\relax
     #2#3{&}%
   \ifnum\count@<#1
   \repeat
 \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\glstablefinishrow}
%\changes{1.49}{2022-10-14}{new}
%\changes{1.50}{2022-10-14}{new}
%Removed in v1.50.
%\end{macro}
%
%\begin{style}{table}
%\changes{1.49}{2022-10-14}{new}
%    \begin{macrocode}
\newglossarystyle{table}%
{%
  \renewenvironment{theglossary}%
  {%
   \glstable@begin
  }
  {%
    \end{longtable}%
  }%
  \renewcommand*{\glossaryheader}{}%
  \renewcommand*{\glsgroupheading}[1]{\glstable@groupheading{##1}}%
  \renewcommand*{\glssubgroupheading}[4]{}%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
  \renewcommand{\glossentry}[2]{%
    \glstableblockentry{##1}%
%    \end{macrocode}
%\changes{1.50}{2022-11-08}{\cs{glstableChildEntries} moved to block style}
%v1.50: \cs{glstableChildEntries} moved to block style and
%conditionals moved to processing hooks.
%    \begin{macrocode}
  }%
  \renewcommand{\subglossentry}[3]{}%
}
%    \end{macrocode}
%\end{style}
%\iffalse
%    \begin{macrocode}
%</glossary-table.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-xr.tex>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% This file is part of the glossaries-extra bundle
% These are dummy glossary entries with cross-references for use in
% test documents.
%COMMENT
\newglossaryentry{lorem}{name={lorem},description={ipsum}}

\newglossaryentry{alias-lorem}{name={alias-lorem},description={ipsum},
  alias={lorem}}

\newglossaryentry{dolor}{name={dolor},description={sit}}

\newglossaryentry{amet}{name={amet},description={consectetuer},
 see={dolor}}

\newglossaryentry{adipiscing}{name={adipiscing},description={elit}}

\newglossaryentry{ut}{name={ut},description={purus}}

\newglossaryentry{elit}{name={elit},description={vestibulum},
 seealso={adipiscing,ut}}

\newglossaryentry{placerat}{name={placerat},description={ac}}

\newglossaryentry{vitae}{name={vitae},description={felis}}

\newglossaryentry{curabitur}{name={curabitur},description={gravida}}

\newglossaryentry{mauris}{name={mauris},description={nam}}

\newglossaryentry{arcu}{name={arcu},description={libero},
 seealso={placerat,vitae,curabitur}}

\newglossaryentry{nonummy}{name={nonummy},description={eget},
 seealso={mauris}}

\newglossaryentry{consectetuer}{name={consectetuer},description={id},
 parent={nonummy}}

\newglossaryentry{vulputate}{name={vulputate},description={a magna},
 parent={nonummy}}

\newglossaryentry{donec}{name={donec},description={vehicula}}

\newglossaryentry{augue}{name={augue},description={eu neque}}

\newglossaryentry{pellentesque}{name={pellentesque},description={habitant},
 see={augue}}

\newglossaryentry{morbi}{name={morbi},description={tristique}}

\newglossaryentry{senectus}{name={senectus},description={et netus}}

\newglossaryentry{et}{name={et},description={malesuada},
 see={vulputate}}

\newglossaryentry{fames}{name={fames},description={ac}}

\newglossaryentry{turpis}{name={turpis},description={egestas},
 seealso={consectetuer}}

\newglossaryentry{leo}{name={leo},description={cras}}

\newglossaryentry{viverra}{name={viverra},description={metus}}

\newglossaryentry{rhoncus}{name={rhoncus},description={sem}}

\newglossaryentry{nulla}{name={nulla},description={et}}

\newglossaryentry{lectus}{name={lectus},description={vestibulum}}

\newglossaryentry{urna}{name={urna},description={fringilla},
 parent={lectus},see={nulla}}

\newglossaryentry{ultrices}{name={ultrices},description={phasellus},
 parent={lectus}}

\newglossaryentry{eu}{name={eu},description={tellus},
 parent={lectus}}

\newglossaryentry{alias-eu}{name={alias-eu},description={tellus},
 alias={eu}}

\newglossaryentry{sit}{name={sit},description={amet}}

\newglossaryentry{tortor}{name={tortor},description={gravida}}

\newglossaryentry{integer}{name={integer},description={sapien}}

\newglossaryentry{est}{name={est},description={iaculis}}

\newglossaryentry{in}{name={in},description={pretium},
 seealso={sit,tortor,est}}

\newglossaryentry{quis}{name={quis},description={viverra}}

\newglossaryentry{ac}{name={ac},description={nunc}}

\newglossaryentry{praesent}{name={praesent},description={eget \gls{ac}}}

\newglossaryentry{sem}{name={sem},description={vel leo
\glshyperlink{quis}}}

\newglossaryentry{bibendum}{name={bibendum},description={ultrices}}

\newglossaryentry{aenean}{name={aenean},description={faucibus}}

\newglossaryentry{malesuada}{name={malesuada},description={eu},
 parent={aenean}}

\newglossaryentry{pulvinar}{name={pulvinar},description={at},
 parent={aenean}}

\newglossaryentry{mollis}{name={mollis},description={ac nulla},
 parent={aenean}}

\newglossaryentry{auctor}{name={auctor},description={semper},
 parent={aenean}}

\newglossaryentry{varius}{name={varius},description={orci},
 parent={aenean}}

\newglossaryentry{eget}{name={eget},description={risus}}

\newglossaryentry{duis}{name={duis},description={nibh}}

\newglossaryentry{mi}{name={mi},description={congue}}

\newglossaryentry{accumsan}{name={accumsan},description={eleifend}}

\newglossaryentry{sagittis}{name={sagittis},description={quis},
 see={eget}}

\newglossaryentry{diam}{name={diam},description={duis}}

\newglossaryentry{orci}{name={orci},description={dignissim},
 seealso={diam}}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-xr.tex>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-acronym-desc.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@acronym{ndl,
  description = {fringilla a, euismod sodales,
  sollicitudin vel, wisi},
  short = {NDL},
  long = {nam dui ligula}
}

@acronym{mal,
  description = {non justo},
  short = {MAL},
  long = {morbi auctor lorem}
}

@acronym{nll,
  description = {pretium at, lobortis vitae, ultricies et,
tellus},
  short = {NLL},
  long = {name lacus libero}
}

@acronym{da,
  description = {tortor sed accumsan bibendum, erat ligula
aliquet magna, vitae ornare odio metus a mi},
  short = {DA},
  long = {donec aliquet}
}

@acronym{mao,
  description = {et nisl hendrerit mollis},
  short = {MAO},
  long = {morbi ac orci}
}

@acronym{sum,
  description = {cras nec ante},
  short = {SUM},
  long = {suspendisse ut massa}
}

@acronym{pan,
  description = {cum sociis natoque penatibus et magnis dis
parturient montes, nascetur ridiculus mus},
  short = {PAN},
  long = {pellentesque a nulla}
}

@acronym{atu,
  description = {nulla ullamcorper vestibulum 
turpis},
  short = {ATU},
  long = {aliquam tincidunt urna}
}

@acronym{pclm,
  description = {nulla malesuada porttitor diam},
  short = {PCLM},
  long = {pellentesque cursus luctus mauris}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-acronym-desc.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-acronym.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@acronym{lid,
  short = {LID},
  long = {lorem ipsum dolor}
}

@acronym{stc,
  short = {STC},
  long = {sit amet consectetuer}
}

@acronym{aeu,
  short = {AEU},
  long = {adipiscing elit ut}
}

@acronym{pev,
  short = {PEV},
  long = {purus elit vestibulum}
}

@acronym{upa,
  short = {UPA},
  long = {ut placerat ac}
}

@acronym{avf,
  short = {AVF},
  long = {adipiscing vitae felis}
}

@acronym{cdg,
  short = {CDG},
  long = {curabitur dictum gravida}
}

@acronym{mna,
  short = {MNA},
  long = {mauris nam arcu}
}

@acronym{lne,
  short = {LNE},
  long = {libero nonummy eget}
}

@acronym{civ,
  short = {CIV},
  long = {consectetuer id vulputate}
}

@acronym{amd,
  short = {AMD},
  long = {a magna donec}
}

@acronym{vae,
  short = {VAE},
  long = {vehicula augue eu}
}

@acronym{nph,
  short = {NPH},
  long = {neque pellentesque habitant}
}

@acronym{mts,
  short = {MTS},
  long = {morbi tristique senectus}
}

@acronym{ene,
  short = {ENE},
  long = {et netus et}
}

@acronym{mfa,
  short = {MFA},
  long = {malesuada fames ac}
}

@acronym{tem,
  short = {TEM},
  long = {turpis egestas mauris}
}

@acronym{ulc,
  short = {ULC},
  long = {ut leo cras}
}

@acronym{vmr,
  short = {VMR},
  long = {viverra metus rhoncus}
}

@acronym{sne,
  short = {SNE},
  long = {sem nulla et}
}

@acronym{lvu,
  short = {LVU},
  long = {lectus vestibulum urna}
}

@acronym{fup,
  short = {FUP},
  long = {fringilla ultrices phasellus}
}

@acronym{ets,
  short = {ETS},
  long = {eu tellus sit}
}

@acronym{atg,
  short = {ATG},
  long = {amet tortor gravida}
}

@acronym{pis,
  short = {PIS},
  long = {placerat integer sapien}
}

@acronym{eii,
  short = {EII},
  long = {est iaculis in}
}

@acronym{pqv,
  short = {PQV},
  long = {pretium quis viverra}
}

@acronym{anp,
  short = {ANP},
  long = {ac nunc praesent}
}

@acronym{esv,
  short = {ESV},
  long = {eget sem vel}
}

@acronym{lub,
  short = {LUB},
  long = {leo ultrices bibendum}
}

@acronym{afm,
  short = {AFM},
  long = {aenean faucibus morbi}
}

@acronym{dnm,
  short = {DNM},
  long = {dolor nulla malesuada}
}

@acronym{epa,
  short = {EPA},
  long = {eu pulvinar at}
}

@acronym{man,
  short = {MAC},
  long = {mollis ac nulla}
}

@acronym{cas,
  short = {CAS},
  long = {curabitur auctor semper}
}

@acronym{ndv,
  short = {NDV},
  long = {nulla donec varius}
}

@acronym{oer,
  short = {OER},
  long = {orci eget risus}
}

@acronym{dnmc,
  short = {DNMC},
  long = {duis nibh mi congue}
}

@acronym{cea,
  short = {CEA},
  long = {congue eu accumsan}
}

@acronym{esq,
  short = {ESQ},
  long = {eleifend sagittis quis}
}

@acronym{dia,
  short = {DIA},
  long = {duis eget orci}
}

@acronym{sao,
  short = {SAO},
  long = {sit amet orci}
}

@acronym{drn,
  short = {DRN},
  long = {dignissim rutrum nam}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-acronym.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-acronyms-lang.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@acronym{li,
  user1 = {love itself},
  short = {LI},
  long = {lorem ipsum}
}

@acronym{np,
  user1 = {produces none},
  short = {NP},
  long = {nulla pariatur}
}

@acronym{sic,
  user1 = {blame belongs},
  short = {SIC},
  long = {sunt in culpa}
}

@acronym{esoc,
  user1 = {blinded by
desire},
  short = {ESOC},
  long = {excepturi sint obcaecati cupiditat}
}

@acronym{nmruu,
  short = {NMRUU},
  long = {nulla malesuada
risus ut urna}
}

@acronym{di,
  short = {DI},
  long = {duis iaculi}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-acronyms-lang.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-brief.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@entry{lorem,
  name = {lorem},
  description = {ipsum}
}

@entry{dolor,
  name = {dolor},
  description = {sit}
}

@entry{amet,
  name = {amet},
  description = {consectetuer}
}

@entry{adipiscing,
  name = {adipiscing},
  description = {elit}
}

@entry{ut,
  name = {ut},
  description = {purus}
}

@entry{elit,
  name = {elit},
  description = {vestibulum}
}

@entry{placerat,
  name = {placerat},
  description = {ac}
}

@entry{vitae,
  name = {vitae},
  description = {felis}
}

@entry{curabitur,
  name = {curabitur},
  description = {gravida}
}

@entry{mauris,
  name = {mauris},
  description = {nam}
}

@entry{arcu,
  name = {arcu},
  description = {libero}
}

@entry{nonummy,
  name = {nonummy},
  description = {eget}
}

@entry{consectetuer,
  name = {consectetuer},
  description = {id}
}

@entry{vulputate,
  name = {vulputate},
  description = {a magna}
}

@entry{donec,
  name = {donec},
  description = {vehicula}
}

@entry{augue,
  name = {augue},
  description = {eu neque}
}

@entry{pellentesque,
  name = {pellentesque},
  description = {habitant}
}

@entry{morbi,
  name = {morbi},
  description = {tristique}
}

@entry{senectus,
  name = {senectus},
  description = {et netus}
}

@entry{et,
  name = {et},
  description = {malesuada}
}

@entry{fames,
  name = {fames},
  description = {ac}
}

@entry{turpis,
  name = {turpis},
  description = {egestas}
}

@entry{leo,
  name = {leo},
  description = {cras}
}

@entry{viverra,
  name = {viverra},
  description = {metus}
}

@entry{rhoncus,
  name = {rhoncus},
  description = {sem}
}

@entry{nulla,
  name = {nulla},
  description = {et}
}

@entry{lectus,
  name = {lectus},
  description = {vestibulum}
}

@entry{urna,
  name = {urna},
  description = {fringilla}
}

@entry{ultrices,
  name = {ultrices},
  description = {phasellus}
}

@entry{eu,
  name = {eu},
  description = {tellus}
}

@entry{sit,
  name = {sit},
  description = {amet}
}

@entry{tortor,
  name = {tortor},
  description = {gravida}
}

@entry{integer,
  name = {integer},
  description = {sapien}
}

@entry{est,
  name = {est},
  description = {iaculis}
}

@entry{in,
  name = {in},
  description = {pretium}
}

@entry{quis,
  name = {quis},
  description = {viverra}
}

@entry{ac,
  name = {ac},
  description = {nunc}
}

@entry{praesent,
  name = {praesent},
  description = {eget}
}

@entry{sem,
  name = {sem},
  description = {vel leo}
}

@entry{bibendum,
  name = {bibendum},
  description = {ultrices}
}

@entry{aenean,
  name = {aenean},
  description = {faucibus}
}

@entry{malesuada,
  name = {malesuada},
  description = {eu}
}

@entry{pulvinar,
  name = {pulvinar},
  description = {at}
}

@entry{mollis,
  name = {mollis},
  description = {ac nulla}
}

@entry{auctor,
  name = {auctor},
  description = {semper}
}

@entry{varius,
  name = {varius},
  description = {orci}
}

@entry{eget,
  name = {eget},
  description = {risus}
}

@entry{duis,
  name = {duis},
  description = {nibh}
}

@entry{mi,
  name = {mi},
  description = {congue}
}

@entry{accumsan,
  name = {accumsan},
  description = {eleifend}
}

@entry{sagittis,
  name = {sagittis},
  description = {quis}
}

@entry{diam,
  name = {diam},
  description = {duis}
}

@entry{orci,
  name = {orci},
  description = {dignissim}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-brief.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-childmultipar.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
% Encoding: UTF-8
@entry{hiersedmattis,
  user1 = {example-image},
  name = {sed mattis},
  description = {Erat sit amet dolor sit amet, consectetuer adipiscing elit. Ut purus
elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur
dictum gravida mauris. Ut pellentesque augue sed urna. Vestibulum
diam eros, fringilla et, consectetuer eu, nonummy id, sapien. Nullam
at lectus. In sagittis ultrices mauris. Curabitur malesuada erat sit
amet massa. Fusce blandit. Aliquam erat volutpat.}
}

@entry{hierloremi-ii,
  parent = {hiersedmattis},
  name = {lorem 1--2},
  description = {Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit,
vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur
dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer
id, vulputate a, magna. Donec vehicula augue eu neque. Pellentesque
habitant morbi tristique senectus et netus et malesuada fames ac
turpis egestas. Mauris ut leo. Cras viverra metus rhoncus sem. Nulla
et lectus vestibulum urna fringilla ultrices.  Phasellus eu tellus
sit amet tortor gravida placerat. Integer sapien est, iaculis in,
pretium quis, viverra ac, nunc. Praesent eget sem vel leo ultrices
bibendum. Aenean faucibus. Morbi dolor nulla, malesuada eu, pulvinar
at, mollis ac, nulla.  Curabitur auctor semper nulla. Donec varius
orci eget risus. Duis nibh mi, congue eu, accumsan eleifend,
sagittis quis, diam. Duis eget orci sit amet orci dignissim rutrum.

Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel,
wisi. Morbi auctor lorem non justo. Nam lacus libero, pretium at,
lobortis vitae, ultricies et, tellus. Donec aliquet, tortor sed
accumsan bibendum, erat ligula aliquet magna, vitae ornare odio
metus a mi. Morbi ac orci et nisl hendrerit mollis. Suspendisse ut
massa. Cras nec ante. Pellentesque a nulla.  Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Aliquam tincidunt urna. Nulla ullamcorper vestibulum turpis.
Pellentesque cursus luctus mauris.}
}

@entry{hierloremiii-iv,
  user1 = {example-image},
  parent = {hiersedmattis},
  name = {lorem 3--4},
  description = {Nulla malesuada porttitor diam. Donec felis erat, congue non,
volutpat at, tincidunt tristique, libero.  Vivamus viverra fermentum
felis. Donec nonummy pellentesque ante.  Phasellus adipiscing semper
elit. Proin fermentum massa ac quam. Sed diam turpis, molestie
vitae, placerat a, molestie nec, leo. Maecenas lacinia. Nam ipsum
ligula, eleifend at, accumsan nec, suscipit a, ipsum. Morbi blandit
ligula feugiat magna. Nunc eleifend consequat lorem. Sed lacinia
nulla vitae enim. Pellentesque tincidunt purus vel magna. Integer
non enim. Praesent euismod nunc eu purus. Donec bibendum quam in
tellus. Nullam cursus pulvinar lectus. Donec et mi.  Nam vulputate
metus eu enim. Vestibulum pellentesque felis eu massa. 

Quisque ullamcorper placerat ipsum. Cras nibh.  Morbi vel justo
vitae lacus tincidunt ultrices. Lorem ipsum dolor sit amet,
consectetuer adipiscing elit. In hac habitasse platea dictumst.
Integer tempus convallis augue. Etiam facilisis. Nunc elementum
fermentum wisi. Aenean placerat. Ut imperdiet, enim sed gravida
sollicitudin, felis odio placerat quam, ac pulvinar elit purus eget
enim. Nunc vitae tortor. Proin tempus nibh sit amet nisl.  Vivamus
quis tortor vitae risus porta vehicula.}
}

@entry{hierloremv-vi,
  parent = {hiersedmattis},
  name = {lorem 5--6},
  description = {Fusce mauris. Vestibulum luctus nibh at lectus.  Sed bibendum, nulla
a faucibus semper, leo velit ultricies tellus, ac venenatis arcu
wisi vel nisl. Vestibulum diam. Aliquam pellentesque, augue quis
sagittis posuere, turpis lacus congue quam, in hendrerit risus eros
eget felis. Maecenas eget erat in sapien mattis porttitor.
Vestibulum porttitor. Nulla facilisi. Sed a turpis eu lacus commodo
facilisis. Morbi fringilla, wisi in dignissim interdum, justo lectus
sagittis dui, et vehicula libero dui cursus dui. Mauris tempor
ligula sed lacus. Duis cursus enim ut augue.  Cras ac magna. Cras
nulla. Nulla egestas. Curabitur a leo. Quisque egestas wisi eget
nunc. Nam feugiat lacus vel est. Curabitur consectetuer.%


Suspendisse vel felis. Ut lorem lorem, interdum eu, tincidunt sit
amet, laoreet vitae, arcu. Aenean faucibus pede eu ante. Praesent
enim elit, rutrum at, molestie non, nonummy vel, nisl. Ut lectus
eros, malesuada sit amet, fermentum eu, sodales cursus, magna. Donec
eu purus. Quisque vehicula, urna sed ultricies auctor, pede lorem
egestas dui, et convallis elit erat sed nulla.  Donec luctus.
Curabitur et nunc. Aliquam dolor odio, commodo pretium, ultricies
non, pharetra in, velit. Integer arcu est, nonummy in, fermentum
faucibus, egestas vel, odio.}
}

@entry{hiergravida,
  name = {gravida},
  description = {Malesuada libero, nonummy eget, consectetuer id, vulputate a, magna. Donec
vehicula augue eu neque. Pellentesque habitant morbi tristique
senectus et netus et malesuada fames ac turpis egestas. Mauris ut
leo.

Morbi ultrices rutrum lorem. Nam elementum ullamcorper
leo. Morbi dui. Aliquam sagittis. Nunc placerat.  Pellentesque
tristique sodales est. Maecenas imperdiet lacinia velit. Cras non
urna. Morbi eros pede, suscipit ac, varius vel, egestas non, eros.}
}

@entry{hierloremvii-viii,
  user1 = {example-image-b},
  parent = {hiergravida},
  name = {lorem 7--8},
  description = {Sed commodo posuere pede. Mauris ut est. Ut quis purus. Sed ac odio.
Sed vehicula hendrerit sem. Duis non odio.  Morbi ut dui. Sed
accumsan risus eget odio. In hac habitasse platea dictumst.
Pellentesque non elit. Fusce sed justo eu urna porta tincidunt.
Mauris felis odio, sollicitudin sed, volutpat a, ornare ac, erat.
Morbi quis dolor. Donec pellentesque, erat ac sagittis semper, nunc
dui lobortis purus, quis congue purus metus ultricies tellus. Proin
et quam. Class aptent taciti sociosqu ad litora torquent per conubia
nostra, per inceptos hymenaeos. Praesent sapien turpis, fermentum
vel, eleifend faucibus, vehicula eu, lacus.

Pellentesque habitant morbi tristique senectus et netus et malesuada
fames ac turpis egestas. Donec odio elit, dictum in, hendrerit sit
amet, egestas sed, leo. Praesent feugiat sapien aliquet odio.
Integer vitae justo. Aliquam vestibulum fringilla lorem. Sed neque
lectus, consectetuer at, consectetuer sed, eleifend ac, lectus.
Nulla facilisi. Pellentesque eget lectus.  Proin eu metus. Sed
porttitor. In hac habitasse platea dictumst.  Suspendisse eu lectus.
Ut mi mi, lacinia sit amet, placerat et, mollis vitae, dui. Sed ante
tellus, tristique ut, iaculis eu, malesuada ac, dui.  Mauris nibh
leo, facilisis non, adipiscing quis, ultrices a, dui.}
}

@entry{hierloremix-x,
  user1 = {example-image-c},
  parent = {hiergravida},
  name = {lorem 9--10},
  description = {Morbi luctus, wisi viverra faucibus pretium, nibh est placerat odio,
nec commodo wisi enim eget quam. Quisque libero justo, consectetuer
a, feugiat vitae, porttitor eu, libero.  Suspendisse sed mauris
vitae elit sollicitudin malesuada. Maecenas ultricies eros sit amet
ante. Ut venenatis velit. Maecenas sed mi eget dui varius euismod.
Phasellus aliquet volutpat odio.  Vestibulum ante ipsum primis in
faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque
sit amet pede ac sem eleifend consectetuer. Nullam elementum, urna
vel imperdiet sodales, elit ipsum pharetra ligula, ac pretium ante
justo a nulla. Curabitur tristique arcu eu metus. Vestibulum lectus.
Proin mauris. Proin eu nunc eu urna hendrerit faucibus. Aliquam
auctor, pede consequat laoreet varius, eros tellus scelerisque quam,
pellentesque hendrerit ipsum dolor sed augue. Nulla nec lacus.

Suspendisse vitae elit. Aliquam arcu neque, ornare in, ullamcorper
quis, commodo eu, libero. Fusce sagittis erat at erat tristique
mollis. Maecenas sapien libero, molestie et, lobortis in, sodales
eget, dui. Morbi ultrices rutrum lorem. Nam elementum ullamcorper
leo. Morbi dui. Aliquam sagittis. Nunc placerat.  Pellentesque
tristique sodales est. Maecenas imperdiet lacinia velit. Cras non
urna. Morbi eros pede, suscipit ac, varius vel, egestas non, eros.
Praesent malesuada, diam id pretium elementum, eros sem dictum
tortor, vel consectetuer odio sem sed wisi.}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-childmultipar.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-childnoname.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@entry{scelerisque,
  name = {scelerisque},
  description = {at}
}

@entry{vestibulum,
  parent = {scelerisque},
  description = {eu, nulla}
}

@entry{utodionisl,
  parent = {scelerisque},
  description = {facilisis id}
}

@entry{molliset,
  parent = {scelerisque},
  description = {nec, enim}
}

@entry{aeneansem,
  parent = {scelerisque},
  description = {sem leo}
}

@entry{pellentesquesit,
  parent = {scelerisque},
  description = {sit amet}
}

@entry{sapien,
  parent = {scelerisque},
  description = {vehicula
pellentesque}
}

@entry{consequat,
  parent = {scelerisque},
  description = {tellus
et tortor}
}

@entry{uttempor,
  name = {ut tempor},
  description = {laoreet
quam}
}

@entry{nullamid,
  parent = {uttempor},
  description = {wisi a
libero}
}

@entry{tristique,
  parent = {uttempor},
  description = {semper}
}

@entry{nullamnislmassa,
  parent = {uttempor},
  description = {rutrum
ut}
}

@entry{eleifend,
  name = {eleifend},
  description = {sit amet
faucibus}
}

@entry{elementum,
  parent = {eleifend},
  description = {elementum}
}

@entry{urnasapien,
  parent = {eleifend},
  description = {urna sapien}
}

@entry{consectetuermauris,
  name = {consectetuer},
  description = {mauris}
}

@entry{quisegestas,
  parent = {consectetuermauris},
  description = {quis egestas}
}

@entry{leojusto,
  parent = {consectetuermauris},
  description = {leo
justo}
}

@entry{nonrisus,
  name = {non risus},
  description = {morbi non
felis}
}

@entry{aclibero,
  parent = {nonrisus},
  description = {ac libero}
}

@entry{vulputatefringilla,
  parent = {nonrisus},
  description = {vulputate
fringilla}
}

@entry{maurislibero,
  name = {mauris},
  description = {libero eros}
}

@entry{lacinia,
  parent = {maurislibero},
  description = {lacinia
non}
}

@entry{sodales,
  parent = {maurislibero},
  description = {sodales
quis}
}

@entry{dapibus,
  parent = {maurislibero},
  description = {dapibus
porttitor, pede}
}

@entry{class,
  name = {class},
  description = {aptent taciti}
}

@entry{sociosqu,
  parent = {class},
  description = {sociosqu}
}

@entry{adlitora,
  parent = {class},
  description = {ad litora}
}

@entry{torquent,
  parent = {class},
  description = {torquent per
conubia}
}

@entry{nostra,
  name = {nostra},
  description = {per inceptos
hymenaeos}
}

@entry{morbidapibus,
  parent = {nostra},
  description = {morbi
dapibus}
}

@entry{mauriscondimentum,
  parent = {nostra},
  description = {mauris
condimentum nulla}
}

@entry{cumsociis,
  name = {cum sociis},
  description = {natoque
penatibus}
}

@entry{etmagnis,
  parent = {cumsociis},
  description = {et
magnis}
}

@entry{disparturient,
  parent = {cumsociis},
  description = {dis
parturient montes}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-childnoname.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-cite.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@entry{fusce,
  user1 = {article-minimal},
  name = {fusce},
  description = {suscipit cursus sem}
}

@entry{vivamus,
  user1 = {article-full},
  name = {vivamus},
  description = {risus mi, egestas ac}
}

@entry{imperdiet,
  user1 = {whole-journal},
  name = {imperdiet},
  description = {varius, faucibus quis, leo}
}

@entry{aenean2,
  user1 = {inbook-minimal},
  name = {aenean},
  description = {tincidunt}
}

@entry{crasid,
  user1 = {inbook-full},
  name = {cras id},
  description = {justo quis nibh scelerisque dignissim}
}

@entry{aliquam2,
  user1 = {book-minimal},
  name = {aliquam},
  description = {sagittis elementum dolor}
}

@entry{aeneanconsectetuer,
  user1 = {book-full},
  name = {aenean consectetuer},
  description = {justo in pede}
}

@entry{curabiturullamcorper,
  user1 = {booklet-minimal},
  name = {curabitur ullamcorper},
  description = {ligula nec orci}
}

@entry{aliquampurus,
  user1 = {booklet-full},
  name = {aliquam purus},
  description = {turpis, aliquam id}
}

@entry{ornarevitae,
  user1 = {incollection-minimal},
  name = {ornare vitae},
  description = {porttitor non, wisi}
}

@entry{maecenasluctus,
  user1 = {incollection-full},
  name = {maecenas luctus},
  description = {porta lorem}
}

@entry{donecvitae,
  user1 = {manual-minimal},
  name = {donec vitae},
  description = {ligula eu ante pretium varius}
}

@entry{proin,
  user1 = {manual-full},
  name = {proin},
  description = {tortor metus, convallis et}
}

@entry{hendrerit,
  user1 = {mastersthesis-minimal},
  name = {hendrerit},
  description = {non, scelerisque in, urna}
}

@entry{crasquis,
  user1 = {mastersthesis-full},
  name = {cras qui},
  description = {libero eu ligula bibendum tempor}
}

@entry{vivamustellus,
  user1 = {misc-minimal},
  name = {vivamus tellus},
  description = {quam, malesuada eu, tempus sed, tempor sed, velit}
}

@entry{doneclacinia,
  user1 = {misc-full},
  name = {donec lacinia},
  description = {auctor libero}
}

@entry{praesent2,
  user1 = {inproceedings-minimal},
  name = {praesent},
  description = {sed neque id pede mollis rutrum}
}

@entry{vestibulum2,
  user1 = {inproceedings-minimal,phdthesis-minimal},
  name = {vestibulum},
  description = {iaculis risus}
}

@entry{pellentesque2,
  name = {pellentesque},
  description = {lacus}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-cite.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-constants.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@preamble{"\providecommand{\constanti}{\ensuremath{i}}
\providecommand{\constantpi}{\ensuremath{\pi}}
\providecommand{\constantvarpi}{\ensuremath{\varpi}}
\providecommand{\constanttau}{\ensuremath{\tau}}
\providecommand{\constantphi}{\ensuremath{\varphi}}
\providecommand{\constantdeltaS}{\ensuremath{\delta_S}}
\providecommand{\constantpsi}{\ensuremath{\psi}}
\providecommand{\constante}{\ensuremath{e}}
\providecommand{\constantgamma}{\ensuremath{\gamma}}
"}

@symbol{i-constant,
  symbol = {\ensuremath{\sqrt{-1}}},
  name = {\constanti},
  description = {imaginary unit}
}

@symbol{pi-constant,
  user1 = {3.14159265358979323846},
  name = {\constantpi},
  description = {ratio of a circle's circumference to its diameter}
}

@symbol{tau-constant,
  user1 = {6.28318530717958647692},
  symbol = {\ensuremath{2\constantpi}},
  see = {pi-constant},
  name = {\constanttau},
  description = {ratio of a circle's circumference to its radius}
}

@symbol{phi-constant,
  user1 = {1.61803398874989484820},
  symbol = {\ensuremath{\frac{1+\sqrt{5}}{2}}},
  name = {\constantphi},
  description = {golden ratio}
}

@symbol{deltaS-constant,
  user1 = {2.41421356237309504880},
  symbol = {\ensuremath{\sqrt{2}+1}},
  name = {\constantdeltaS},
  description = {silver ratio}
}

@symbol{psi-constant,
  user1 = {1.46557123187676802665},
  symbol = {\ensuremath{
\frac{1
+ \sqrt[3]{\frac{29+3\sqrt{93}}{2}}
+ \sqrt[3]{\frac{29-3\sqrt{93}}{2}}
}{3}}},
  name = {\constantpsi},
  description = {supergolden ratio}
}

@symbol{e-constant,
  user1 = {2.71828182845904523536},
  symbol = {\ensuremath{\sum_{n=0}^\infty\frac{1}{n!}}},
  name = {\constante},
  description = {Euler's number}
}

@symbol{gamma-constant,
  user1 = {0.57721566490153286060},
  symbol = {\ensuremath{
\lim_{n\to\infty}
\left(
-\log n + \sum_{k=1}^n \frac{1}{k}
\right)
}},
  name = {\constantgamma},
  description = {Euler's constant}
}

@symbol{G-constant,
  name={\constantG}
}

@symbol{Gauss-constant,
 parent={G-constant},
 description={Gauss's constant},
 symbol={\ensuremath{\frac{\constantvarpi}{\constantpi}}},
 user1={0.83462684167407318628}
}

@symbol{Catalan-constant,
 parent={G-constant},
 description={Catalan's constant},
 symbol={\ensuremath{\beta(2)}},
 user1={0.91596559417721901505}
}

@symbol{Gieseking-constant,
 parent={G-constant},
 description={Gieseking constant},
 user1={1.01494160640965362502}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-constants.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-images.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@entry{sedfeugiat,
  user1 = {example-image},
  name = {sed feugiat},
  description = {Cum sociis natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Ut pellentesque augue sed urna. Vestibulum
diam eros, fringilla et, consectetuer eu, nonummy id, sapien. Nullam
at lectus. In sagittis ultrices mauris. Curabitur malesuada erat sit
amet massa. Fusce blandit. Aliquam erat volutpat.  Aliquam euismod.
Aenean vel lectus.  Nunc imperdiet justo nec dolor.

Etiam euismod. Fusce facilisis lacinia dui.  Suspendisse potenti. In
mi erat, cursus id, nonummy sed, ullamcorper eget, sapien. Praesent
pretium, magna in eleifend egestas, pede pede pretium lorem, quis
consectetuer tortor sapien facilisis magna.  Mauris quis magna
varius nulla scelerisque imperdiet. Aliquam non quam. Aliquam
porttitor quam a lacus. Praesent vel arcu ut tortor cursus volutpat.
In vitae pede quis diam bibendum placerat. Fusce elementum convallis
neque. Sed dolor orci, scelerisque ac, dapibus nec, ultricies ut,
mi. Duis nec dui quis leo sagittis commodo.
}
}

@entry{aliquamlectus,
  user1 = {example-image-a},
  name = {aliquam lectus},
  description = {Vivamus leo. Quisque ornare tellus ullamcorper nulla. Mauris
porttitor pharetra tortor. Sed fringilla justo sed mauris. Mauris
tellus. Sed non leo. Nullam elementum, magna in cursus sodales,
augue est scelerisque sapien, venenatis congue nulla arcu et pede.
Ut suscipit enim vel sapien.  Donec congue. Maecenas urna mi,
suscipit in, placerat ut, vestibulum ut, massa. Fusce ultrices nulla
et nisl.

Etiam ac leo a risus tristique nonummy. Donec dignissim tincidunt
nulla. Vestibulum rhoncus molestie odio. Sed lobortis, justo et
pretium lobortis, mauris turpis condimentum augue, nec ultricies
nibh arcu pretium enim. Nunc purus neque, placerat id, imperdiet
sed, pellentesque nec, nisl. Vestibulum imperdiet neque non sem
accumsan laoreet. In hac habitasse platea dictumst. Etiam
condimentum facilisis libero. Suspendisse in elit quis nisl aliquam
dapibus. Pellentesque auctor sapien. Sed egestas sapien nec lectus.
Pellentesque vel dui vel neque bibendum viverra.  Aliquam porttitor
nisl nec pede. Proin mattis libero vel turpis.  Donec rutrum mauris
et libero. Proin euismod porta felis. Nam lobortis, metus quis
elementum commodo, nunc lectus elementum mauris, eget vulputate
ligula tellus eu neque. Vivamus eu dolor.
}
}

@entry{nullainipsum,
  user1 = {example-image-b},
  name = {nulla in ipsum},
  description = {Praesent eros nulla, congue vitae, euismod ut, commodo a, wisi.
Pellentesque habitant morbi tristique senectus et netus et malesuada
fames ac turpis egestas.  Aenean nonummy magna non leo. Sed felis
erat, ullamcorper in, dictum non, ultricies ut, lectus. Proin vel
arcu a odio lobortis euismod.  Vestibulum ante ipsum primis in
faucibus orci luctus et ultrices posuere cubilia Curae; Proin ut
est. Aliquam odio. Pellentesque massa turpis, cursus eu, euismod
nec, tempor congue, nulla. Duis viverra gravida mauris. Cras
tincidunt. Curabitur eros ligula, varius ut, pulvinar in, cursus
faucibus, augue.

Nulla mattis luctus nulla. Duis commodo velit at leo.  Aliquam
vulputate magna et leo. Nam vestibulum ullamcorper leo.  Vestibulum
condimentum rutrum mauris. Donec id mauris. Morbi molestie justo et
pede. Vivamus eget turpis sed nisl cursus tempor.  Curabitur mollis
sapien condimentum nunc. In wisi nisl, malesuada at, dignissim sit
amet, lobortis in, odio. Aenean consequat arcu a ante. Pellentesque
porta elit sit amet orci. Etiam at turpis nec elit ultricies
imperdiet. Nulla facilisi. In hac habitasse platea dictumst.
Suspendisse viverra aliquam risus. Nullam pede justo, molestie
nonummy, scelerisque eu, facilisis vel, arcu.
}
}

@entry{curabiturtellusmagna,
  user1 = {example-image-c},
  name = {curabitur tellus magna},
  description = {Donec interdum. Praesent scelerisque.  Maecenas posuere sodales
odio. Vivamus metus lacus, varius quis, imperdiet quis, rhoncus a,
turpis. Etiam ligula arcu, elementum a, venenatis quis, sollicitudin
sed, metus. Donec nunc pede, tincidunt in, venenatis vitae, faucibus
vel, nibh. Pellentesque wisi. Nullam malesuada. Morbi ut tellus ut
pede tincidunt porta. Lorem ipsum dolor sit amet, consectetuer
adipiscing elit. Etiam congue neque id dolor.

Donec et nisl at wisi luctus bibendum. Nam interdum tellus ac
libero. Sed sem justo, laoreet vitae, fringilla at, adipiscing ut,
nibh. Maecenas non sem quis tortor eleifend fermentum. Etiam id
tortor ac mauris porta vulputate. Integer porta neque vitae massa.
Maecenas tempus libero a libero posuere dictum.  Vestibulum ante
ipsum primis in faucibus orci luctus et ultrices posuere cubilia
Curae; Aenean quis mauris sed elit commodo placerat.  Class aptent
taciti sociosqu ad litora torquent per conubia nostra, per inceptos
hymenaeos. Vivamus rhoncus tincidunt libero. Etiam elementum pretium
justo. Vivamus est. Morbi a tellus eget pede tristique commodo.
Nulla nisl. Vestibulum sed nisl eu sapien cursus rutrum.
}
}

@entry{nullanonmauris,
  user1 = {example-image-16x10},
  name = {nulla non mauris},
  description = {Nullam varius. Etiam dignissim elementum metus. Vestibulum faucibus,
metus sit amet mattis rhoncus, sapien dui laoreet odio, nec
ultricies nibh augue a enim. Fusce in ligula. Quisque at magna et
nulla commodo consequat.  Proin accumsan imperdiet sem. Nunc porta.
Donec feugiat mi at justo.  Phasellus facilisis ipsum quis ante. In
ac elit eget ipsum pharetra faucibus.  Maecenas viverra nulla in
massa.

Nulla ac nisl. Nullam urna nulla, ullamcorper in, interdum sit amet,
gravida ut, risus. Aenean ac enim. In luctus.  Phasellus eu quam
vitae turpis viverra pellentesque. Duis feugiat felis ut enim.
Phasellus pharetra, sem id porttitor sodales, magna nunc aliquet
nibh, nec blandit nisl mauris at pede. Suspendisse risus risus,
lobortis eget, semper at, imperdiet sit amet, quam.  Quisque
scelerisque dapibus nibh. Nam enim. Lorem ipsum dolor sit amet,
consectetuer adipiscing elit. Nunc ut metus. Ut metus justo, auctor
at, ultrices eu, sagittis ut, purus. Aliquam aliquam.
}
}

@entry{etiampedemassa,
  user1 = {example-image-10x16},
  name = {etiam pede massa},
  description = {Vestibulum luctus commodo lacus. Morbi lacus dui, tempor sed,
euismod eget, condimentum at, tortor. Phasellus aliquet odio ac
lacus tempor faucibus. Praesent sed sem. Praesent iaculis.  Cras
rhoncus tellus sed justo ullamcorper sagittis.  Donec quis orci.
Sed ut tortor quis tellus euismod tincidunt. Suspendisse congue nisl
eu elit. Aliquam tortor diam, tempus id, tristique eget, sodales
vel, nulla. Praesent tellus mi, condimentum sed, viverra at,
consectetuer quis, lectus. In auctor vehicula orci. Sed pede sapien,
euismod in, suscipit in, pharetra placerat, metus. Vivamus commodo
dui non odio. Donec et felis.

Etiam suscipit aliquam arcu. Aliquam sit amet est ac purus bibendum
congue. Sed in eros. Morbi non orci.  Pellentesque mattis lacinia
elit. Fusce molestie velit in ligula.  Nullam et orci vitae nibh
vulputate auctor. Aliquam eget purus.  Nulla auctor wisi sed ipsum.
Morbi porttitor tellus ac enim. Fusce ornare. Proin ipsum enim,
tincidunt in, ornare venenatis, molestie a, augue. Donec vel pede in
lacus sagittis porta. Sed hendrerit ipsum quis nisl.  Suspendisse
quis massa ac nibh pretium cursus.  Sed sodales. Nam eu neque quis
pede dignissim ornare. Maecenas eu purus ac urna tincidunt congue.
}
}

@entry{donecetnisl,
  user1 = {example-image-16x9},
  name = {donec et nisl},
  description = {Aenean dictum odio sit amet risus. Morbi purus. Nulla a est sit amet
purus venenatis iaculis. Vivamus viverra purus vel magna. Donec in
justo sed odio malesuada dapibus. Nunc ultrices aliquam nunc.
Vivamus facilisis pellentesque velit. Nulla nunc velit, vulputate
dapibus, vulputate id, mattis ac, justo. Nam mattis elit dapibus
purus.  Quisque enim risus, congue non, elementum ut, mattis quis,
sem.  Quisque elit.

Maecenas non massa. Vestibulum pharetra nulla at lorem. Duis quis
quam id lacus dapibus interdum. Nulla lorem.  Donec ut ante quis
dolor bibendum condimentum. Etiam egestas tortor vitae lacus.
Praesent cursus. Mauris bibendum pede at elit. Morbi et felis a
lectus interdum facilisis. Sed suscipit gravida turpis.  Nulla at
lectus. Vestibulum ante ipsum primis in faucibus orci luctus et
ultrices posuere cubilia Curae; Praesent nonummy luctus nibh. Proin
turpis nunc, congue eu, egestas ut, fringilla at, tellus. In hac
habitasse platea dictumst.
}
}

@entry{vivamuseutellus,
  user1 = {example-image-9x16},
  name = {vivamus eu tellus},
  description = {Nam orci orci, malesuada id, gravida nec, ultricies vitae, erat.
Donec risus turpis, luctus sit amet, interdum quis, porta sed,
ipsum.  Suspendisse condimentum, tortor at egestas posuere, neque
metus tempor orci, et tincidunt urna nunc a purus. Sed facilisis
blandit tellus. Nunc risus sem, suscipit nec, eleifend quis, cursus
quis, libero. Curabitur et dolor. Sed vitae sem. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Maecenas ante. Duis ullamcorper enim. Donec tristique enim eu leo.
Nullam molestie elit eu dolor. Nullam bibendum, turpis vitae
tristique gravida, quam sapien tempor lectus, quis pretium tellus
purus ac quam. Nulla facilisi.

Duis aliquet dui in est. Donec eget est. Nunc lectus odio, varius
at, fermentum in, accumsan non, enim. Aliquam erat volutpat. Proin
sit amet nulla ut eros consectetuer cursus.  Phasellus dapibus
aliquam justo. Nunc laoreet. Donec consequat placerat magna. Duis
pretium tincidunt justo. Sed sollicitudin vestibulum quam. Nam quis
ligula. Vivamus at metus. Etiam imperdiet imperdiet pede. Aenean
turpis. Fusce augue velit, scelerisque sollicitudin, dictum vitae,
tempor et, pede. Donec wisi sapien, feugiat in, fermentum ut,
sollicitudin adipiscing, metus.
}
}

@entry{donecvelnibh,
  user1 = {example-image-golden},
  name = {donec vel nibh},
  description = {Donec pede. Sed id quam id wisi laoreet suscipit. Nulla lectus
dolor, aliquam ac, fringilla eget, mollis ut, orci. In pellentesque
justo in ligula. Maecenas turpis. Donec eleifend leo at felis
tincidunt consequat. Aenean turpis metus, malesuada sed, condimentum
sit amet, auctor a, wisi. Pellentesque sapien elit, bibendum ac,
posuere et, congue eu, felis. Vestibulum mattis libero quis metus
scelerisque ultrices. Sed purus.

Donec molestie, magna ut luctus ultrices, tellus arcu nonummy velit,
sit amet pulvinar elit justo et mauris.  In pede.  Maecenas euismod
elit eu erat. Aliquam augue wisi, facilisis congue, suscipit in,
adipiscing et, ante. In justo. Cras lobortis neque ac ipsum. Nunc
fermentum massa at ante. Donec orci tortor, egestas sit amet,
ultrices eget, venenatis eget, mi.  Maecenas vehicula leo semper
est. Mauris vel metus. Aliquam erat volutpat. In rhoncus sapien ac
tellus. Pellentesque ligula.
}
}

@entry{crasdapibus,
  user1 = {example-image-golden-upright},
  name = {cras dapibus},
  description = {Aenean interdum nibh sed wisi. Praesent sollicitudin vulputate dui.
Praesent iaculis viverra augue. Quisque in libero. Aenean gravida
lorem vitae sem ullamcorper cursus. Nunc adipiscing rutrum ante.
Nunc ipsum massa, faucibus sit amet, viverra vel, elementum semper,
orci. Cras eros sem, vulputate et, tincidunt id, ultrices eget,
magna. Nulla varius ornare odio. Donec accumsan mauris sit amet
augue. Sed ligula lacus, laoreet non, aliquam sit amet, iaculis
tempor, lorem. Suspendisse eros. Nam porta, leo sed congue tempor,
felis est ultrices eros, id mattis velit felis non metus.  Curabitur
vitae elit non mauris varius pretium. Aenean lacus sem, tincidunt
ut, consequat quis, porta vitae, turpis. Nullam laoreet fermentum
urna. Proin iaculis lectus.

Sed mattis, erat sit amet gravida malesuada, elit augue egestas
diam, tempus scelerisque nunc nisl vitae libero.  Sed consequat
feugiat massa. Nunc porta, eros in eleifend varius, erat leo rutrum
dui, non convallis lectus orci ut nibh. Sed lorem massa, nonummy
quis, egestas id, condimentum at, nisl. Maecenas at nibh.  Aliquam
et augue at nunc pellentesque ullamcorper. Duis nisl nibh, laoreet
suscipit, convallis ut, rutrum id, enim. Phasellus odio.  Nulla
nulla elit, molestie non, scelerisque at, vestibulum eu, nulla. Ut
odio nisl, facilisis id, mollis et, scelerisque nec, enim.  Aenean
sem leo, pellentesque sit amet, scelerisque sit amet, vehicula
pellentesque, sapien.
}
}

@entry{sedconsequat,
  user1 = {example-image-1x1},
  name = {sed consequat},
  description = {Ut tempor laoreet quam. Nullam id wisi a libero tristique semper.
Nullam nisl massa, rutrum ut, egestas semper, mollis id, leo. Nulla
ac massa eu risus blandit mattis. Mauris ut nunc. In hac habitasse
platea dictumst.  Aliquam eget tortor. Quisque dapibus pede in erat.
Nunc enim. In dui nulla, commodo at, consectetuer nec, malesuada
nec, elit. Aliquam ornare tellus eu urna. Sed nec metus. Cum sociis
natoque penatibus et magnis dis parturient montes, nascetur
ridiculus mus.  Pellentesque habitant morbi tristique senectus et
netus et malesuada fames ac turpis egestas.

Phasellus id magna. Duis malesuada interdum arcu.  Integer metus.
Morbi pulvinar pellentesque mi. Suspendisse sed est eu magna
molestie egestas. Quisque mi lorem, pulvinar eget, egestas quis,
luctus at, ante. Proin auctor vehicula purus. Fusce ac nisl aliquam
ante hendrerit pellentesque. Class aptent taciti sociosqu ad litora
torquent per conubia nostra, per inceptos hymenaeos. Morbi wisi.
Etiam arcu mauris, facilisis sed, eleifend non, nonummy ut, pede.
Cras ut lacus tempor metus mollis placerat.  Vivamus eu tortor vel
metus interdum malesuada.
}
}

@entry{sedeleifend,
  name = {sed eleifend},
  description = {Morbi non felis ac libero vulputate fringilla. Mauris libero eros,
lacinia non, sodales quis, dapibus porttitor, pede.  Class aptent
taciti sociosqu ad litora torquent per conubia nostra, per inceptos
hymenaeos. Morbi dapibus mauris condimentum nulla.  Cum sociis
natoque penatibus et magnis dis parturient montes, nascetur
ridiculus mus. Etiam sit amet erat. Nulla varius. Etiam tincidunt
dui vitae turpis. Donec leo. Morbi vulputate convallis est.  Integer
aliquet. Pellentesque aliquet sodales urna.
}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-images.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-long.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@entry{loremipsum,
  name = {lorem ipsum},
  description = {dolor sit amet, consectetuer adipiscing elit. Ut purus
elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur
dictum gravida mauris.}
}

@entry{namearcu,
  name = {name arcu},
  description = {libero, nonummy eget, consectetuer id, vulputate a, magna. Donec
vehicula augue eu neque. Pellentesque habitant morbi tristique
senectus et netus et malesuada fames ac turpis egestas. Mauris ut
leo.}
}

@entry{crasviverra,
  name = {cras viverra},
  description = {metus rhoncus sem. Nulla et lectus vestibulum
urna fringilla ultrices.  Phasellus eu tellus sit amet tortor gravida
placerat.}
}

@entry{integersapien,
  name = {integer sapien},
  description = {est, iaculis in, pretium quis, viverra ac,
nunc. Praesent eget sem vel leo ultrices bibendum. Aenean
faucibus.}
}

@entry{morbidolor,
  name = {morbi dolor},
  description = {nulla, malesuada eu, pulvinar at, mollis ac, nulla.
Curabitur auctor semper nulla. Donec varius orci eget risus. Duis
nibh mi, congue eu, accumsan eleifend, sagittis quis, diam. Duis
eget orci sit amet orci dignissim rutrum.}
}

@entry{namdui,
  name = {nam dui},
  description = {ligula, fringilla a, euismod sodales,
sollicitudin vel, wisi. Morbi auctor lorem non justo.}
}

@entry{namlacus,
  name = {nam lacus},
  description = {libero, pretium at, lobortis vitae, ultricies et,
tellus. Donec aliquet, tortor sed accumsan bibendum, erat ligula aliquet magna,
vitae ornare odio metus a mi.}
}

@entry{morbiac,
  name = {morbi ac},
  description = {orci et nisl hendrerit mollis. Suspendisse ut massa.
Cras nec ante. Pellentesque a nulla.  Cum sociis natoque penatibus
et magnis dis parturient montes, nascetur ridiculus mus.}
}

@entry{aliquam,
  name = {aliquam},
  description = {tincidunt urna. Nulla ullamcorper
vestibulum turpis. Pellentesque cursus luctus mauris.}
}

@entry{nullamalesuada,
  name = {nulla malesuada},
  description = {porttitor diam. Donec felis erat, congue non, volutpat at, 
tincidunt tristique, libero.  Vivamus viverra fermentum felis.}
}

@entry{donecnonummy,
  name = {donec nonummy},
  description = {pellentesque ante. Phasellus
adipiscing semper elit. Proin fermentum massa ac quam. Sed diam
turpis, molestie vitae, placerat a, molestie nec, leo.}
}

@entry{maecenaslacinia,
  name = {maecenas lacinia},
  description = {nam ipsum ligula, eleifend at, accumsan nec, suscipit
a, ipsum. Morbi blandit ligula feugiat magna. Nunc eleifend consequat
lorem.}
}

@entry{sedlacinia,
  name = {sed lacinia},
  description = {nulla vitae enim. Pellentesque tincidunt purus
vel magna. Integer non enim. Praesent euismod nunc eu purus. Donec
bibendum quam in tellus.}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-long.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-longchild.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
% Encoding: UTF-8
@entry{longsedmattis,
  name = {sed mattis},
  description = {erat sit amet dolor sit amet, consectetuer adipiscing elit. Ut purus
elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur
dictum gravida mauris.}
}

@entry{longgravida,
  parent = {longsedmattis},
  name = {gravida},
  description = {malesuada libero, nonummy eget, consectetuer id, vulputate a, magna. Donec
vehicula augue eu neque. Pellentesque habitant morbi tristique
senectus et netus et malesuada fames ac turpis egestas. Mauris ut
leo.}
}

@entry{longelitaugue,
  parent = {longsedmattis},
  name = {elit augue},
  description = {egestas diam metus rhoncus sem. Nulla et lectus vestibulum
urna fringilla ultrices.  Phasellus eu tellus sit amet tortor gravida
placerat.}
}

@entry{longtempus,
  parent = {longsedmattis},
  name = {tempus},
  description = {scelerisque est, iaculis in, pretium quis, viverra ac,
nunc. Praesent eget sem vel leo ultrices bibendum. Aenean
faucibus.}
}

@entry{longnunc,
  name = {nunc},
  description = {nisl vitae nulla, malesuada eu, pulvinar at, mollis ac, nulla.
Curabitur auctor semper nulla. Donec varius orci eget risus. Duis
nibh mi, congue eu, accumsan eleifend, sagittis quis, diam. Duis
eget orci sit amet orci dignissim rutrum.}
}

@entry{longlibero,
  parent = {longnunc},
  name = {libero},
  description = {sed consequat ligula, fringilla a, euismod sodales,
sollicitudin vel, wisi. Morbi auctor lorem non justo.}
}

@entry{longfeugiat,
  parent = {longnunc},
  name = {feugiat},
  description = {massa libero, pretium at, lobortis vitae, ultricies et,
tellus. Donec aliquet, tortor sed accumsan bibendum, erat ligula aliquet magna,
vitae ornare odio metus a mi.}
}

@entry{longporta,
  parent = {longnunc},
  name = {porta},
  description = {eros in eleifend orci et nisl hendrerit mollis. Suspendisse ut massa.
Cras nec ante. Pellentesque a nulla.  Cum sociis natoque penatibus
et magnis dis parturient montes, nascetur ridiculus mus.}
}

@entry{longvariuserat,
  parent = {longnunc},
  name = {varius erat},
  description = {leo rutrum dui tincidunt urna. Nulla ullamcorper
vestibulum turpis. Pellentesque cursus luctus mauris.}
}

@entry{longnonconvallis,
  name = {non convallis},
  description = {lectus orci ut nibh porttitor diam. Donec felis erat,
congue non, volutpat at, tincidunt tristique, libero.  Vivamus
viverra fermentum felis.}
}

@entry{longsedlorem,
  parent = {longnonconvallis},
  name = {sedlorem},
  description = {massa pellentesque ante. Phasellus
adipiscing semper elit. Proin fermentum massa ac quam. Sed diam
turpis, molestie vitae, placerat a, molestie nec, leo.}
}

@entry{longnonummyquis,
  parent = {longnonconvallis},
  name = {nonummy
quis},
  description = {egestas id nam ipsum ligula, eleifend at, accumsan nec, suscipit
a, ipsum. Morbi blandit ligula feugiat magna. Nunc eleifend consequat
lorem.}
}

@entry{longcondimentum,
  name = {condimentum},
  description = {at nisl nulla vitae enim. Pellentesque tincidunt purus
vel magna. Integer non enim. Praesent euismod nunc eu purus. Donec
bibendum quam in tellus.}
}

@entry{longmaecenas,
  parent = {longcondimentum},
  name = {maecenas},
  description = {at nibh fringilla a, euismod sodales, sollicitudin vel,
wisi. Morbi auctor lorem non justo. Nam lacus libero, pretium at,
lobortis vitae, ultricies et, tellus. Donec aliquet, tortor sed
accumsan bibendum, erat ligula aliquet magna, vitae ornare odio
metus a mi. Morbi ac orci et nisl hendrerit mollis. Suspendisse ut
massa. Cras nec ante. Pellentesque a nulla.  Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Aliquam tincidunt urna. Nulla ullamcorper vestibulum turpis.
Pellentesque cursus luctus mauris.}
}

@entry{longaliquamet,
  name = {aliquam et},
  description = {augue felis erat, congue non,
volutpat at, tincidunt tristique, libero.  Vivamus viverra fermentum
felis. Donec nonummy pellentesque ante.}
}

@entry{longatnunc,
  parent = {longaliquamet},
  name = {at nunc},
  description = {pellentesque ullamcorper el justo
vitae lacus tincidunt ultrices. Lorem ipsum dolor sit amet,
consectetuer adipiscing elit.}
}

@entry{longduisnisl,
  parent = {longatnunc},
  name = {duisnisl},
  description = {laoreet suscipit ac venenatis arcu
wisi vel nisl. Vestibulum diam. Aliquam pellentesque, augue quis
sagittis posuere, turpis lacus congue quam, in hendrerit risus eros
eget felis. Maecenas eget erat in sapien mattis porttitor.}
}

@entry{longduisnibh,
  parent = {longatnunc},
  name = {duisnibh},
  description = {convallis ut justo lectus
sagittis dui, et vehicula libero dui cursus dui. Mauris tempor
ligula sed lacus. Duis cursus enim ut augue.  Cras ac magna.}
}

@entry{longrutrum,
  name = {rutrum},
  description = {id, enim elit, rutrum at, molestie non, nonummy vel, nisl. Ut lectus
eros, malesuada sit amet, fermentum eu, sodales cursus, magna. Donec
eu purus. Quisque vehicula, urna sed ultricies auctor, pede lorem
egestas dui, et convallis elit erat sed nulla.}
}

@entry{longphasellus,
  parent = {longrutrum},
  name = {phasellus},
  description = {odio volutpat a, ornare ac, erat.
Morbi quis dolor. Donec pellentesque, erat ac sagittis semper, nunc
dui lobortis purus, quis congue purus metus ultricies tellus. Proin
et quam.}
}

@entry{longnullanulla,
  parent = {longrutrum},
  name = {nulla nulla},
  description = {elit, molestie non wisi viverra faucibus pretium, nibh est placerat odio,
nec commodo wisi enim eget quam. Quisque libero justo, consectetuer
a, feugiat vitae, porttitor eu, libero.}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-longchild.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-multipar.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@entry{loremi-ii,
  name = {lorem 1--2},
  description = {Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit,
vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur
dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer
id, vulputate a, magna. Donec vehicula augue eu neque. Pellentesque
habitant morbi tristique senectus et netus et malesuada fames ac
turpis egestas. Mauris ut leo. Cras viverra metus rhoncus sem. Nulla
et lectus vestibulum urna fringilla ultrices.  Phasellus eu tellus
sit amet tortor gravida placerat. Integer sapien est, iaculis in,
pretium quis, viverra ac, nunc. Praesent eget sem vel leo ultrices
bibendum. Aenean faucibus. Morbi dolor nulla, malesuada eu, pulvinar
at, mollis ac, nulla.  Curabitur auctor semper nulla. Donec varius
orci eget risus. Duis nibh mi, congue eu, accumsan eleifend,
sagittis quis, diam. Duis eget orci sit amet orci dignissim rutrum.

Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel,
wisi. Morbi auctor lorem non justo. Nam lacus libero, pretium at,
lobortis vitae, ultricies et, tellus. Donec aliquet, tortor sed
accumsan bibendum, erat ligula aliquet magna, vitae ornare odio
metus a mi. Morbi ac orci et nisl hendrerit mollis. Suspendisse ut
massa. Cras nec ante. Pellentesque a nulla.  Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Aliquam tincidunt urna. Nulla ullamcorper vestibulum turpis.
Pellentesque cursus luctus mauris.}
}

@entry{loremiii-iv,
  name = {lorem 3--4},
  description = {Nulla malesuada porttitor diam. Donec felis erat, congue non,
volutpat at, tincidunt tristique, libero.  Vivamus viverra fermentum
felis. Donec nonummy pellentesque ante.  Phasellus adipiscing semper
elit. Proin fermentum massa ac quam. Sed diam turpis, molestie
vitae, placerat a, molestie nec, leo. Maecenas lacinia. Nam ipsum
ligula, eleifend at, accumsan nec, suscipit a, ipsum. Morbi blandit
ligula feugiat magna. Nunc eleifend consequat lorem. Sed lacinia
nulla vitae enim. Pellentesque tincidunt purus vel magna. Integer
non enim. Praesent euismod nunc eu purus. Donec bibendum quam in
tellus. Nullam cursus pulvinar lectus. Donec et mi.  Nam vulputate
metus eu enim. Vestibulum pellentesque felis eu massa. 

Quisque ullamcorper placerat ipsum. Cras nibh.  Morbi vel justo
vitae lacus tincidunt ultrices. Lorem ipsum dolor sit amet,
consectetuer adipiscing elit. In hac habitasse platea dictumst.
Integer tempus convallis augue. Etiam facilisis. Nunc elementum
fermentum wisi. Aenean placerat. Ut imperdiet, enim sed gravida
sollicitudin, felis odio placerat quam, ac pulvinar elit purus eget
enim. Nunc vitae tortor. Proin tempus nibh sit amet nisl.  Vivamus
quis tortor vitae risus porta vehicula.}
}

@entry{loremv-vi,
  name = {lorem 5--6},
  description = {Fusce mauris. Vestibulum luctus nibh at lectus.  Sed bibendum, nulla
a faucibus semper, leo velit ultricies tellus, ac venenatis arcu
wisi vel nisl. Vestibulum diam. Aliquam pellentesque, augue quis
sagittis posuere, turpis lacus congue quam, in hendrerit risus eros
eget felis. Maecenas eget erat in sapien mattis porttitor.
Vestibulum porttitor. Nulla facilisi. Sed a turpis eu lacus commodo
facilisis. Morbi fringilla, wisi in dignissim interdum, justo lectus
sagittis dui, et vehicula libero dui cursus dui. Mauris tempor
ligula sed lacus. Duis cursus enim ut augue.  Cras ac magna. Cras
nulla. Nulla egestas. Curabitur a leo. Quisque egestas wisi eget
nunc. Nam feugiat lacus vel est. Curabitur consectetuer.%


Suspendisse vel felis. Ut lorem lorem, interdum eu, tincidunt sit
amet, laoreet vitae, arcu. Aenean faucibus pede eu ante. Praesent
enim elit, rutrum at, molestie non, nonummy vel, nisl. Ut lectus
eros, malesuada sit amet, fermentum eu, sodales cursus, magna. Donec
eu purus. Quisque vehicula, urna sed ultricies auctor, pede lorem
egestas dui, et convallis elit erat sed nulla.  Donec luctus.
Curabitur et nunc. Aliquam dolor odio, commodo pretium, ultricies
non, pharetra in, velit. Integer arcu est, nonummy in, fermentum
faucibus, egestas vel, odio.}
}

@entry{loremvii-viii,
  name = {lorem 7--8},
  description = {Sed commodo posuere pede. Mauris ut est. Ut quis purus. Sed ac odio.
Sed vehicula hendrerit sem. Duis non odio.  Morbi ut dui. Sed
accumsan risus eget odio. In hac habitasse platea dictumst.
Pellentesque non elit. Fusce sed justo eu urna porta tincidunt.
Mauris felis odio, sollicitudin sed, volutpat a, ornare ac, erat.
Morbi quis dolor. Donec pellentesque, erat ac sagittis semper, nunc
dui lobortis purus, quis congue purus metus ultricies tellus. Proin
et quam. Class aptent taciti sociosqu ad litora torquent per conubia
nostra, per inceptos hymenaeos. Praesent sapien turpis, fermentum
vel, eleifend faucibus, vehicula eu, lacus.

Pellentesque habitant morbi tristique senectus et netus et malesuada
fames ac turpis egestas. Donec odio elit, dictum in, hendrerit sit
amet, egestas sed, leo. Praesent feugiat sapien aliquet odio.
Integer vitae justo. Aliquam vestibulum fringilla lorem. Sed neque
lectus, consectetuer at, consectetuer sed, eleifend ac, lectus.
Nulla facilisi. Pellentesque eget lectus.  Proin eu metus. Sed
porttitor. In hac habitasse platea dictumst.  Suspendisse eu lectus.
Ut mi mi, lacinia sit amet, placerat et, mollis vitae, dui. Sed ante
tellus, tristique ut, iaculis eu, malesuada ac, dui.  Mauris nibh
leo, facilisis non, adipiscing quis, ultrices a, dui.}
}

@entry{loremix-x,
  name = {lorem 9--10},
  description = {Morbi luctus, wisi viverra faucibus pretium, nibh est placerat odio,
nec commodo wisi enim eget quam. Quisque libero justo, consectetuer
a, feugiat vitae, porttitor eu, libero.  Suspendisse sed mauris
vitae elit sollicitudin malesuada. Maecenas ultricies eros sit amet
ante. Ut venenatis velit. Maecenas sed mi eget dui varius euismod.
Phasellus aliquet volutpat odio.  Vestibulum ante ipsum primis in
faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque
sit amet pede ac sem eleifend consectetuer. Nullam elementum, urna
vel imperdiet sodales, elit ipsum pharetra ligula, ac pretium ante
justo a nulla. Curabitur tristique arcu eu metus. Vestibulum lectus.
Proin mauris. Proin eu nunc eu urna hendrerit faucibus. Aliquam
auctor, pede consequat laoreet varius, eros tellus scelerisque quam,
pellentesque hendrerit ipsum dolor sed augue. Nulla nec lacus.

Suspendisse vitae elit. Aliquam arcu neque, ornare in, ullamcorper
quis, commodo eu, libero. Fusce sagittis erat at erat tristique
mollis. Maecenas sapien libero, molestie et, lobortis in, sodales
eget, dui. Morbi ultrices rutrum lorem. Nam elementum ullamcorper
leo. Morbi dui. Aliquam sagittis. Nunc placerat.  Pellentesque
tristique sodales est. Maecenas imperdiet lacinia velit. Cras non
urna. Morbi eros pede, suscipit ac, varius vel, egestas non, eros.
Praesent malesuada, diam id pretium elementum, eros sem dictum
tortor, vel consectetuer odio sem sed wisi.}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-multipar.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-parent.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@entry{sedmattis,
  name = {sed mattis},
  description = {erat sit amet}
}

@entry{nunc,
  name = {nunc},
  description = {nisl vitae}
}

@entry{nonconvallis,
  name = {non
convallis},
  description = {lectus orci ut nibh}
}

@entry{condimentum,
  name = {condimentum},
  description = {at
nisl}
}

@entry{aliquamet,
  name = {aliquam et},
  description = {augue}
}

@entry{rutrum,
  name = {rutrum},
  description = {id, enim}
}

%   child entries:


@entry{gravida,
  parent = {sedmattis},
  name = {gravida},
  description = {malesuada}
}

@entry{elitaugue,
  parent = {sedmattis},
  name = {elit augue},
  description = {egestas diam}
}

@entry{tempus,
  parent = {sedmattis},
  name = {tempus},
  description = {scelerisque}
}

@entry{libero,
  parent = {nunc},
  name = {libero},
  description = {sed
consequat}
}

@entry{feugiat,
  parent = {nunc},
  name = {feugiat},
  description = {massa}
}

@entry{porta,
  parent = {nunc},
  name = {porta},
  description = {eros
in eleifend}
}

@entry{variuserat,
  parent = {nunc},
  name = {varius erat},
  description = {leo rutrum dui}
}

@entry{sedlorem,
  parent = {nonconvallis},
  name = {sedlorem},
  description = {massa}
}

@entry{nonummyquis,
  parent = {nonconvallis},
  name = {nonummy
quis},
  description = {egestas id}
}

@entry{maecenas,
  parent = {condimentum},
  name = {maecenas},
  description = {at nibh}
}

@entry{atnunc,
  parent = {aliquamet},
  name = {at nunc},
  description = {pellentesque
ullamcorper}
}

@entry{phasellus,
  parent = {rutrum},
  name = {phasellus},
  description = {odio}
}

@entry{nullanulla,
  parent = {rutrum},
  name = {nulla nulla},
  description = {elit, molestie non}
}

% level 2:

@entry{duisnisl,
  parent = {atnunc},
  name = {duisnisl},
  description = {laoreet
suscipit}
}

@entry{duisnibh,
  parent = {atnunc},
  name = {duisnibh},
  description = {convallis ut}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-parent.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-symbolnames.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
% Encoding: UTF-8
@entry{sym.alpha,
  name = {\ensuremath{\alpha}},
  description = {Quisque ullamcorper placerat ipsum.}
}

@entry{sym.beta,
  name = {\ensuremath{\beta}},
  description = {Cras nibh.}
}

@entry{sym.gamma,
  name = {\ensuremath{\gamma}},
  description = {Morbi vel justo vitae lacus tincidunt ultrices.}
}

@entry{sym.delta,
  name = {\ensuremath{\delta}},
  description = {Lorem ipsum dolor sit amet, consectetuer adipiscing
elit.}
}

@entry{sym.epsilon,
  name = {\ensuremath{\epsilon}},
  description = {In hac habitasse platea dictumst.}
}

@entry{sym.zeta,
  name = {\ensuremath{\zeta}},
  description = {Integer tempus convallis augue.}
}

@entry{sym.eta,
  name = {\ensuremath{\eta}},
  description = {Etiam facilisis.}
}

@entry{sym.theta,
  name = {\ensuremath{\theta}},
  description = {Nunc elementum fermentum wisi.}
}

@entry{sym.iota,
  name = {\ensuremath{i}},
  description = {Aenean placerat.}
}

@entry{sym.kappa,
  name = {\ensuremath{\kappa}},
  description = {Ut imperdiet, enim sed gravida sollicitudin, felis odio
placerat quam, ac pulvinar elit purus eget enim.}
}

@entry{sym.lambda,
  name = {\ensuremath{\lambda}},
  description = {Nunc vitae tortor.}
}

@entry{sym.mu,
  name = {\ensuremath{\mu}},
  description = {Proin tempus nibh sit amet nisl.}
}

@entry{sym.nu,
  name = {\ensuremath{\nu}},
  description = {Vivamus quis tortor vitae risus porta vehicula.}
}

@entry{sym.xi,
  name = {\ensuremath{\xi}},
  description = {Fusce mauris.}
}

@entry{sym.pi,
  name = {\ensuremath{\pi}},
  description = {Vestibulum luctus nibh at lectus.}
}

@entry{sym.rho,
  name = {\ensuremath{\rho}},
  description = {Sed bibendum, nulla a faucibus semper, leo velit
ultricies tellus, ac venenatis arcu wisi vel nisl. Vestibulum diam.}
}

@entry{sym.sigma,
  name = {\ensuremath{\sigma}},
  description = {Aliquam pellentesque, augue quis sagittis posuere,
turpis lacus congue quam, in hendrerit risus eros eget felis.}
}

@entry{sym.tau,
  name = {\ensuremath{\tau}},
  description = {Maecenas eget erat in sapien mattis porttitor.}
}

@entry{sym.upsilon,
  name = {\ensuremath{\upsilon}},
  description = {Vestibulum porttitor.}
}

@entry{sym.phi,
  name = {\ensuremath{\phi}},
  description = {Nulla facilisi.}
}

@entry{sym.chi,
  name = {\ensuremath{\chi}},
  description = {Sed a turpis eu lacus commodo facilisis.}
}

@entry{sym.psi,
  name = {\ensuremath{\psi}},
  description = {Morbi fringilla, wisi in dignissim interdum, justo
lectus sagittis dui, et vehicula libero dui cursus dui.}
}

@entry{sym.omega,
  name = {\ensuremath{\omega}},
  description = {Mauris tempor ligula sed lacus.}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-symbolnames.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-symbols.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@entry{alpha,
  symbol = {\ensuremath{\alpha}},
  name = {alpha},
  description = {Quisque ullamcorper placerat ipsum.}
}

@entry{beta,
  symbol = {\ensuremath{\beta}},
  name = {beta},
  description = {Cras nibh.}
}

@entry{gamma,
  symbol = {\ensuremath{\gamma}},
  name = {gamma},
  description = {Morbi vel justo vitae lacus tincidunt ultrices.}
}

@entry{delta,
  symbol = {\ensuremath{\delta}},
  name = {delta},
  description = {Lorem ipsum dolor sit amet, consectetuer adipiscing
elit.}
}

@entry{epsilon,
  symbol = {\ensuremath{\epsilon}},
  name = {epsilon},
  description = {In hac habitasse platea dictumst.}
}

@entry{zeta,
  symbol = {\ensuremath{\zeta}},
  name = {zeta},
  description = {Integer tempus convallis augue.}
}

@entry{eta,
  symbol = {\ensuremath{\eta}},
  name = {eta},
  description = {Etiam facilisis.}
}

@entry{theta,
  symbol = {\ensuremath{\theta}},
  name = {theta},
  description = {Nunc elementum fermentum wisi.}
}

@entry{iota,
  symbol = {\ensuremath{i}},
  name = {iota},
  description = {Aenean placerat.}
}

@entry{kappa,
  symbol = {\ensuremath{\kappa}},
  name = {kappa},
  description = {Ut imperdiet, enim sed gravida sollicitudin, felis odio
placerat quam, ac pulvinar elit purus eget enim.}
}

@entry{lambda,
  symbol = {\ensuremath{\lambda}},
  name = {lambda},
  description = {Nunc vitae tortor.}
}

@entry{mu,
  symbol = {\ensuremath{\mu}},
  name = {mu},
  description = {Proin tempus nibh sit amet nisl.}
}

@entry{nu,
  symbol = {\ensuremath{\nu}},
  name = {nu},
  description = {Vivamus quis tortor vitae risus porta vehicula.}
}

@entry{xi,
  symbol = {\ensuremath{\xi}},
  name = {xi},
  description = {Fusce mauris.}
}

@entry{pi,
  symbol = {\ensuremath{\pi}},
  name = {pi},
  description = {Vestibulum luctus nibh at lectus.}
}

@entry{rho,
  symbol = {\ensuremath{\rho}},
  name = {rho},
  description = {Sed bibendum, nulla a faucibus semper, leo velit
ultricies tellus, ac venenatis arcu wisi vel nisl. Vestibulum diam.}
}

@entry{sigma,
  symbol = {\ensuremath{\sigma}},
  name = {sigma},
  description = {Aliquam pellentesque, augue quis sagittis posuere,
turpis lacus congue quam, in hendrerit risus eros eget felis.}
}

@entry{tau,
  symbol = {\ensuremath{\tau}},
  name = {tau},
  description = {Maecenas eget erat in sapien mattis porttitor.}
}

@entry{upsilon,
  symbol = {\ensuremath{\upsilon}},
  name = {upsilon},
  description = {Vestibulum porttitor.}
}

@entry{phi,
  symbol = {\ensuremath{\phi}},
  name = {phi},
  description = {Nulla facilisi.}
}

@entry{chi,
  symbol = {\ensuremath{\chi}},
  name = {chi},
  description = {Sed a turpis eu lacus commodo facilisis.}
}

@entry{psi,
  symbol = {\ensuremath{\psi}},
  name = {psi},
  description = {Morbi fringilla, wisi in dignissim interdum, justo
lectus sagittis dui, et vehicula libero dui cursus dui.}
}

@entry{omega,
  symbol = {\ensuremath{\omega}},
  name = {omega},
  description = {Mauris tempor ligula sed lacus.}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-symbols.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-url.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@entry{aenean-url,
  user1 = {http://uk.tug.org/},
  name = {aenean},
  description = {adipiscing auctor est}
}

@entry{morbi-url,
  user1 = {http://www.ctan.org/},
  name = {morbi},
  description = {quam arcu, malesuada sed, volutpat et, elementum sit
amet, libero}
}

@entry{duis-url,
  user1 = {http://www.tug.org/},
  name = {duis},
  description = {mattis}
}

@entry{sed-url,
  user1 = {http://theoval.cmp.uea.ac.uk/\protect~nlct/},
  name = {sed},
  description = {cursus lectus quis odio (uses
\texttt{\string\protect\string~})}
}

@entry{sed2-url,
  user1 = {http://theoval.cmp.uea.ac.uk/\string~nlct/},
  name = {sed},
  description = {cursus lectus quis odio (uses
\texttt{\string\string\string~})}
}

@entry{sed3-url,
  user1 = {http://theoval.cmp.uea.ac.uk/\glstildechar nlct/},
  name = {sed},
  description = {cursus lectus quis odio (uses
\texttt{\string\glstildechar})}
}

@entry{phasellus-url,
  user1 = {http://theoval.cmp.uea.ac.uk/},
  name = {phasellus},
  description = {arcu (catcode change)}
}

@entry{phasellus2-url,
  user1 = {http://theoval.cmp.uea.ac.uk/\%7Enlct
},
  name = {phasellus},
  description = {arcu (uses \texttt{\string\%})}
}

@entry{phasellus3-url,
  user1 = {http://theoval.cmp.uea.ac.uk/\glspercentchar 7Enlct
},
  name = {phasellus},
  description = {arcu  (uses 
 \texttt{\string\glspercentchar})}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-url.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-user.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@entry{sample-a,
  user1 = {A},
  symbol = {\ensuremath{\alpha}},
  user2 = {1},
  name = {a name},
  description = {a description},
  user5 = {25.2020788573521},
  user6 = {1585-11-06},
  user3 = {i},
  user4 = {A-i}
}

@entry{sample-b,
  user1 = {B},
  symbol = {\ensuremath{\beta}},
  user2 = {2},
  name = {b name},
  description = {b description},
  user5 = {45.5028357391029},
  user6 = {1412-06-16},
  user3 = {ii},
  user4 = {B-II}
}

@entry{sample-b-0,
  parent = {sample-b},
  symbol = {\ensuremath{\sigma}},
  user2 = {0},
  name = {b/0 name},
  description = {child 0 of b},
  user4 = {a-i}
}

@entry{sample-b-1,
  parent = {sample-b},
  symbol = {\ensuremath{\eta}},
  user2 = {1},
  name = {b/1 name},
  description = {child 1 of b},
  user5 = {-0.902193400956222},
  user3 = {ix}
}

@entry{sample-b-2,
  parent = {sample-b},
  symbol = {\ensuremath{\partial}},
  name = {b/2 name},
  description = {child 2 of b},
  user6 = {1857-01-23},
  user3 = {vii},
  user4 = {c-ix}
}

@entry{sample-c,
  user1 = {C},
  symbol = {\ensuremath{\gamma}},
  user2 = {3},
  name = {c name},
  description = {c description},
  user5 = {-38.3848347255729},
  user6 = {1277-04-20},
  user3 = {iii},
  user4 = {c-III}
}

@entry{sample-c-0,
  user1 = {F},
  parent = {sample-c},
  symbol = {\ensuremath{\iota}},
  user2 = {0},
  name = {c/0 name},
  description = {child 0 of c},
  user4 = {a-V}
}

@entry{sample-c-1,
  parent = {sample-c},
  symbol = {\ensuremath{\sigma_{0}}},
  name = {c/1 name},
  description = {child 1 of c},
  user3 = {vi},
  user4 = {B-I}
}

@entry{sample-c-2,
  parent = {sample-c},
  symbol = {\ensuremath{\psi}},
  name = {c/2 name},
  description = {child 2 of c},
  user4 = {C-ii}
}

@entry{sample-c-3,
  user1 = {U},
  parent = {sample-c},
  symbol = {\ensuremath{\upsilon}},
  user2 = {3},
  name = {c/3 name},
  description = {child 3 of c},
  user3 = {xx},
  user4 = {D-VI}
}

@entry{sample-d,
  user1 = {D},
  symbol = {\ensuremath{\delta}},
  user2 = {4},
  name = {d name},
  description = {d description},
  user5 = {-19.9143632163562},
  user6 = {1205-02-04},
  user3 = {iv},
  user4 = {d-IV}
}

@entry{sample-d-0,
  user1 = {D},
  parent = {sample-d},
  symbol = {\ensuremath{\alpha}},
  user2 = {0},
  name = {d/0 name},
  description = {child 0 of d},
  user3 = {ii}
}

@entry{sample-d-1,
  user1 = {A},
  parent = {sample-d},
  symbol = {\ensuremath{\delta}},
  user2 = {1},
  name = {d/1 name},
  description = {child 1 of d},
  user3 = {ii}
}

@entry{sample-d-2,
  user1 = {W},
  parent = {sample-d},
  symbol = {\ensuremath{\lambda_{3}}},
  user2 = {2},
  name = {d/2 name},
  description = {child 2 of d},
  user5 = {-0.607749542989112},
  user4 = {c-x}
}

@entry{sample-d-3,
  parent = {sample-d},
  symbol = {\ensuremath{\theta}},
  user2 = {3},
  name = {d/3 name},
  description = {child 3 of d}
}

@entry{sample-d-4,
  parent = {sample-d},
  symbol = {\ensuremath{\vartheta}},
  user2 = {4},
  name = {d/4 name},
  description = {child 4 of d},
  user5 = {0.837394196049765},
  user3 = {ii},
  user4 = {E-vi}
}

@entry{sample-e,
  user1 = {E},
  symbol = {\ensuremath{\epsilon}},
  user2 = {5},
  name = {e name},
  description = {e description},
  user5 = {33.9955092348848},
  user6 = {1911-11-30},
  user3 = {v},
  user4 = {e-V}
}

@entry{sample-e-0,
  parent = {sample-e},
  symbol = {\ensuremath{\rho_{1}}},
  name = {e/0 name},
  description = {child 0 of e}
}

@entry{sample-e-1,
  parent = {sample-e},
  symbol = {\ensuremath{\epsilon}},
  user2 = {1},
  name = {e/1 name},
  description = {child 1 of e},
  user3 = {vi}
}

@entry{sample-e-2,
  parent = {sample-e},
  symbol = {\ensuremath{\alpha_{1}}},
  name = {e/2 name},
  description = {child 2 of e},
  user5 = {0.443471941832193},
  user6 = {1478-02-27},
  user3 = {viii},
  user4 = {C-IX}
}

@entry{sample-e-3,
  parent = {sample-e},
  symbol = {\ensuremath{\mu^{3}}},
  user2 = {3},
  name = {e/3 name},
  description = {child 3 of e},
  user5 = {0.48628623899576},
  user3 = {xx}
}

@entry{sample-f,
  user1 = {F},
  symbol = {\ensuremath{\zeta}},
  user2 = {6},
  name = {f name},
  description = {f description},
  user5 = {10.2604280725252},
  user6 = {1593-03-08},
  user3 = {vi},
  user4 = {F-VI}
}

@entry{sample-f-0,
  user1 = {J},
  parent = {sample-f},
  symbol = {\ensuremath{\vartheta_{1}}},
  name = {f/0 name},
  description = {child 0 of f},
  user3 = {ii}
}

@entry{sample-f-1,
  user1 = {I},
  parent = {sample-f},
  symbol = {\ensuremath{\partial_{2}}},
  name = {f/1 name},
  description = {child 1 of f},
  user3 = {viii},
  user4 = {b-iv}
}

@entry{sample-f-2,
  parent = {sample-f},
  symbol = {\ensuremath{\gamma}},
  user2 = {2},
  name = {f/2 name},
  description = {child 2 of f},
  user4 = {C-VIII}
}

@entry{sample-f-3,
  parent = {sample-f},
  symbol = {\ensuremath{\zeta}},
  user2 = {3},
  name = {f/3 name},
  description = {child 3 of f},
  user5 = {-0.729404747551726}
}

@entry{sample-g,
  user1 = {G},
  symbol = {\ensuremath{\eta}},
  user2 = {7},
  name = {g name},
  description = {g description},
  user5 = {-6.0636327107396},
  user6 = {1432-09-18},
  user3 = {vii},
  user4 = {G-VII}
}

@entry{sample-g-0,
  parent = {sample-g},
  symbol = {\ensuremath{\psi}},
  user2 = {0},
  name = {g/0 name},
  description = {child 0 of g}
}

@entry{sample-g-1,
  parent = {sample-g},
  name = {g/1 name},
  description = {child 1 of g},
  user4 = {B-v}
}

@entry{sample-g-2,
  parent = {sample-g},
  symbol = {\ensuremath{\nabla_{3}^{2}}},
  user2 = {2},
  name = {g/2 name},
  description = {child 2 of g},
  user6 = {1718-05-25}
}

@entry{sample-g-3,
  user1 = {E},
  parent = {sample-g},
  symbol = {\ensuremath{\phi}},
  name = {g/3 name},
  description = {child 3 of g},
  user6 = {1336-07-06},
  user4 = {d-I}
}

@entry{sample-h,
  user1 = {H},
  symbol = {\ensuremath{\theta}},
  user2 = {8},
  name = {h name},
  description = {h description},
  user5 = {1.16736490031784},
  user6 = {1576-09-11},
  user3 = {viii},
  user4 = {H-VIII}
}

@entry{sample-h-0,
  user1 = {K},
  parent = {sample-h},
  symbol = {\ensuremath{\theta_{1}}},
  user2 = {0},
  name = {h/0 name},
  description = {child 0 of h},
  user3 = {iv},
  user4 = {A-v}
}

@entry{sample-h-1,
  parent = {sample-h},
  symbol = {\ensuremath{o_{3}^{1}}},
  user2 = {1},
  name = {h/1 name},
  description = {child 1 of h}
}

@entry{sample-h-2,
  parent = {sample-h},
  symbol = {\ensuremath{\varsigma}},
  user2 = {2},
  name = {h/2 name},
  description = {child 2 of h},
  user6 = {1794-02-11}
}

@entry{sample-h-3,
  parent = {sample-h},
  symbol = {\ensuremath{\iota}},
  user2 = {3},
  name = {h/3 name},
  description = {child 3 of h},
  user3 = {v},
  user4 = {d-II}
}

@entry{sample-i,
  user1 = {I},
  symbol = {\ensuremath{\iota}},
  user2 = {9},
  name = {i name},
  description = {i description},
  user5 = {-11.3537684013693},
  user6 = {1950-08-02},
  user3 = {ix},
  user4 = {i-IX}
}

@entry{sample-i-0,
  parent = {sample-i},
  symbol = {\ensuremath{\gamma}},
  user2 = {0},
  name = {i/0 name},
  description = {child 0 of i},
  user6 = {1345-03-21},
  user3 = {vi}
}

@entry{sample-i-1,
  parent = {sample-i},
  symbol = {\ensuremath{\kappa_{1}}},
  user2 = {1},
  name = {i/1 name},
  description = {child 1 of i},
  user5 = {-0.590962984569657},
  user4 = {b-ix}
}

@entry{sample-i-2,
  parent = {sample-i},
  user2 = {2},
  name = {i/2 name},
  description = {child 2 of i},
  user4 = {C-IX}
}

@entry{sample-j,
  user1 = {J},
  symbol = {\ensuremath{\kappa}},
  user2 = {10},
  name = {j name},
  description = {j description},
  user5 = {-37.172898553375},
  user6 = {1987-02-07},
  user3 = {x},
  user4 = {j-X}
}

@entry{sample-j-0,
  parent = {sample-j},
  symbol = {\ensuremath{\rho_{0}^{4}}},
  user2 = {0},
  name = {j/0 name},
  description = {child 0 of j},
  user6 = {1707-06-02},
  user3 = {vi},
  user4 = {a-V}
}

@entry{sample-j-1,
  user1 = {A},
  parent = {sample-j},
  symbol = {\ensuremath{\partial_{2}}},
  name = {j/1 name},
  description = {child 1 of j},
  user5 = {0.87706480362074},
  user3 = {i}
}

@entry{sample-j-2,
  parent = {sample-j},
  symbol = {\ensuremath{\omega^{1}}},
  user2 = {2},
  name = {j/2 name},
  description = {child 2 of j},
  user3 = {ii}
}

@entry{sample-k,
  user1 = {K},
  symbol = {\ensuremath{\lambda}},
  user2 = {11},
  name = {k name},
  description = {k description},
  user5 = {-5.42398189163826},
  user6 = {2047-05-26},
  user3 = {i},
  user4 = {k-I}
}

@entry{sample-k-0,
  parent = {sample-k},
  symbol = {\ensuremath{o_{3}}},
  user2 = {0},
  name = {k/0 name},
  description = {child 0 of k},
  user3 = {i},
  user4 = {A-IV}
}

@entry{sample-k-1,
  parent = {sample-k},
  symbol = {\ensuremath{\beta_{3}}},
  name = {k/1 name},
  description = {child 1 of k},
  user5 = {0.232380361266316}
}

@entry{sample-k-2,
  user1 = {B},
  parent = {sample-k},
  symbol = {\ensuremath{\epsilon_{0}}},
  user2 = {2},
  name = {k/2 name},
  description = {child 2 of k},
  user5 = {0.591482454759571},
  user6 = {1105-01-04},
  user3 = {ix}
}

@entry{sample-k-3,
  user1 = {Q},
  parent = {sample-k},
  symbol = {\ensuremath{\varphi_{3}}},
  name = {k/3 name},
  description = {child 3 of k},
  user5 = {-0.0648351546627168},
  user4 = {d-i}
}

@entry{sample-l,
  user1 = {L},
  symbol = {\ensuremath{\lambda}},
  user2 = {12},
  name = {l name},
  description = {l description},
  user5 = {-32.3944783154431},
  user6 = {1167-02-28},
  user3 = {ii},
  user4 = {l-II}
}

@entry{sample-l-0,
  user1 = {M},
  parent = {sample-l},
  symbol = {\ensuremath{\kappa}},
  name = {l/0 name},
  description = {child 0 of l}
}

@entry{sample-l-1,
  user1 = {R},
  parent = {sample-l},
  symbol = {\ensuremath{\upsilon_{2}}},
  name = {l/1 name},
  description = {child 1 of l},
  user5 = {0.17815330584132},
  user6 = {1373-11-27},
  user3 = {iv}
}

@entry{sample-l-2,
  user1 = {I},
  parent = {sample-l},
  symbol = {\ensuremath{\eta_{1}}},
  user2 = {2},
  name = {l/2 name},
  description = {child 2 of l},
  user5 = {0.697423736255566},
  user6 = {1274-01-03},
  user3 = {i},
  user4 = {c-VII}
}

@entry{sample-m,
  user1 = {M},
  symbol = {\ensuremath{\mu}},
  user2 = {13},
  name = {m name},
  description = {m description},
  user5 = {10.7510593632355},
  user6 = {1000-11-20},
  user3 = {iii},
  user4 = {m-iii}
}

@entry{sample-n,
  user1 = {N},
  symbol = {\ensuremath{\nu}},
  user2 = {14},
  name = {n name},
  description = {n description},
  user5 = {-27.709506256878},
  user6 = {1051-06-01},
  user3 = {iv},
  user4 = {N-iv}
}

@entry{sample-n-0,
  parent = {sample-n},
  symbol = {\ensuremath{\epsilon_{4}}},
  user2 = {0},
  name = {n/0 name},
  description = {child 0 of n},
  user5 = {0.154020875680295},
  user6 = {1441-02-03},
  user3 = {iv},
  user4 = {A-VI}
}

@entry{sample-n-1,
  user1 = {E},
  parent = {sample-n},
  symbol = {\ensuremath{\nabla_{3}}},
  name = {n/1 name},
  description = {child 1 of n}
}

@entry{sample-n-2,
  user1 = {E},
  parent = {sample-n},
  symbol = {\ensuremath{\upsilon}},
  user2 = {2},
  name = {n/2 name},
  description = {child 2 of n},
  user5 = {0.569781389654416},
  user3 = {ii}
}

@entry{sample-n-3,
  user1 = {J},
  parent = {sample-n},
  symbol = {\ensuremath{\alpha^{4}}},
  user2 = {3},
  name = {n/3 name},
  description = {child 3 of n}
}

@entry{sample-n-4,
  parent = {sample-n},
  symbol = {\ensuremath{\lambda_{3}}},
  name = {n/4 name},
  description = {child 4 of n},
  user5 = {0.789876283212593},
  user3 = {ii}
}

@entry{sample-o,
  user1 = {O},
  symbol = {\ensuremath{\xi}},
  user2 = {15},
  name = {o name},
  description = {o description},
  user5 = {-2.19251796377407},
  user6 = {1471-05-19},
  user3 = {v},
  user4 = {O-V}
}

@entry{sample-o-0,
  parent = {sample-o},
  symbol = {\ensuremath{\varepsilon_{1}}},
  name = {o/0 name},
  description = {child 0 of o},
  user3 = {i},
  user4 = {A-I}
}

@entry{sample-o-1,
  parent = {sample-o},
  user2 = {1},
  name = {o/1 name},
  description = {child 1 of o},
  user5 = {0.0347678723268814},
  user3 = {ix}
}

@entry{sample-o-2,
  parent = {sample-o},
  symbol = {\ensuremath{\delta_{1}}},
  user2 = {2},
  name = {o/2 name},
  description = {child 2 of o},
  user5 = {-0.240470091193039}
}

@entry{sample-o-3,
  user1 = {F},
  parent = {sample-o},
  symbol = {\ensuremath{\nu_{0}}},
  name = {o/3 name},
  description = {child 3 of o},
  user6 = {1792-07-01}
}

@entry{sample-p,
  user1 = {P},
  symbol = {\ensuremath{o}},
  user2 = {16},
  name = {p name},
  description = {p description},
  user5 = {35.2360917818377},
  user6 = {1664-09-11},
  user3 = {vi},
  user4 = {p-VI}
}

@entry{sample-q,
  user1 = {Q},
  symbol = {\ensuremath{\pi}},
  user2 = {17},
  name = {q name},
  description = {q description},
  user5 = {-48.2583741579603},
  user6 = {1369-11-13},
  user3 = {vii},
  user4 = {Q-vii}
}

@entry{sample-q-0,
  parent = {sample-q},
  symbol = {\ensuremath{\beta_{0}}},
  user2 = {0},
  name = {q/0 name},
  description = {child 0 of q},
  user3 = {vi}
}

@entry{sample-q-1,
  parent = {sample-q},
  symbol = {\ensuremath{\alpha_{0}^{1}}},
  user2 = {1},
  name = {q/1 name},
  description = {child 1 of q},
  user5 = {0.148247715337767},
  user4 = {B-X}
}

@entry{sample-r,
  user1 = {R},
  symbol = {\ensuremath{\rho}},
  user2 = {18},
  name = {r name},
  description = {r description},
  user5 = {40.2853631117384},
  user6 = {1286-05-07},
  user3 = {viii},
  user4 = {r-viii}
}

@entry{sample-r-0,
  user1 = {D},
  parent = {sample-r},
  symbol = {\ensuremath{\lambda^{2}}},
  name = {r/0 name},
  description = {child 0 of r},
  user3 = {v}
}

@entry{sample-r-1,
  parent = {sample-r},
  symbol = {\ensuremath{\kappa}},
  user2 = {1},
  name = {r/1 name},
  description = {child 1 of r},
  user4 = {b-II}
}

@entry{sample-r-2,
  parent = {sample-r},
  symbol = {\ensuremath{\tau_{3}}},
  user2 = {2},
  name = {r/2 name},
  description = {child 2 of r},
  user3 = {iv},
  user4 = {C-x}
}

@entry{sample-r-3,
  user1 = {G},
  parent = {sample-r},
  symbol = {\ensuremath{\varphi_{2}^{3}}},
  user2 = {3},
  name = {r/3 name},
  description = {child 3 of r},
  user5 = {0.277707140049884},
  user6 = {1343-07-04},
  user4 = {D-iii}
}

@entry{sample-s,
  user1 = {S},
  symbol = {\ensuremath{\varsigma}},
  user2 = {19},
  name = {s name},
  description = {s description},
  user5 = {37.6010311283697},
  user6 = {1748-05-28},
  user3 = {ix},
  user4 = {S-IX}
}

@entry{sample-s-0,
  parent = {sample-s},
  symbol = {\ensuremath{\psi_{2}}},
  user2 = {0},
  name = {s/0 name},
  description = {child 0 of s},
  user6 = {1338-03-25}
}

@entry{sample-s-1,
  parent = {sample-s},
  symbol = {\ensuremath{\vartheta^{4}}},
  name = {s/1 name},
  description = {child 1 of s},
  user3 = {iii},
  user4 = {B-vi}
}

@entry{sample-s-2,
  user1 = {S},
  parent = {sample-s},
  symbol = {\ensuremath{\zeta}},
  name = {s/2 name},
  description = {child 2 of s},
  user6 = {1019-07-22},
  user3 = {vi}
}

@entry{sample-s-3,
  parent = {sample-s},
  symbol = {\ensuremath{\psi}},
  name = {s/3 name},
  description = {child 3 of s},
  user5 = {-0.553040742885635},
  user3 = {i},
  user4 = {d-V}
}

@entry{sample-t,
  user1 = {T},
  symbol = {\ensuremath{\sigma}},
  user2 = {20},
  name = {t name},
  description = {t description},
  user5 = {-20.1734366193154},
  user6 = {1899-03-23},
  user3 = {xx},
  user4 = {T-xx}
}

@entry{sample-t-0,
  user1 = {V},
  parent = {sample-t},
  symbol = {\ensuremath{\lambda_{3}^{2}}},
  user2 = {0},
  name = {t/0 name},
  description = {child 0 of t},
  user5 = {-0.391532621914315}
}

@entry{sample-t-1,
  user1 = {F},
  parent = {sample-t},
  symbol = {\ensuremath{\kappa_{0}^{4}}},
  user2 = {1},
  name = {t/1 name},
  description = {child 1 of t},
  user6 = {1374-02-10}
}

@entry{sample-t-2,
  user1 = {Q},
  parent = {sample-t},
  symbol = {\ensuremath{\psi}},
  name = {t/2 name},
  description = {child 2 of t},
  user3 = {viii},
  user4 = {c-III}
}

@entry{sample-t-3,
  user1 = {E},
  parent = {sample-t},
  symbol = {\ensuremath{\lambda^{2}}},
  user2 = {3},
  name = {t/3 name},
  description = {child 3 of t},
  user4 = {D-II}
}

@entry{sample-t-4,
  user1 = {M},
  parent = {sample-t},
  symbol = {\ensuremath{\alpha_{4}}},
  name = {t/4 name},
  description = {child 4 of t},
  user5 = {-0.793735400177958},
  user3 = {vi}
}

@entry{sample-u,
  user1 = {U},
  symbol = {\ensuremath{\tau}},
  user2 = {21},
  name = {u name},
  description = {u description},
  user5 = {-25.6972113945611},
  user6 = {2085-03-10},
  user3 = {i},
  user4 = {u-I}
}

@entry{sample-u-0,
  parent = {sample-u},
  symbol = {\ensuremath{\vartheta}},
  name = {u/0 name},
  description = {child 0 of u},
  user4 = {A-IX}
}

@entry{sample-u-1,
  user1 = {Y},
  parent = {sample-u},
  symbol = {\ensuremath{\varphi}},
  name = {u/1 name},
  description = {child 1 of u},
  user5 = {0.777529065501923},
  user6 = {1615-02-09},
  user3 = {vi}
}

@entry{sample-v,
  user1 = {V},
  symbol = {\ensuremath{\upsilon}},
  user2 = {22},
  name = {v name},
  description = {v description},
  user5 = {1.13418559211489},
  user6 = {1228-10-11},
  user3 = {ii},
  user4 = {V-ii}
}

@entry{sample-v-0,
  parent = {sample-v},
  symbol = {\ensuremath{\varphi_{2}}},
  name = {v/0 name},
  description = {child 0 of v},
  user3 = {i}
}

@entry{sample-v-1,
  user1 = {W},
  parent = {sample-v},
  symbol = {\ensuremath{\tau}},
  name = {v/1 name},
  description = {child 1 of v},
  user4 = {B-ii}
}

@entry{sample-v-2,
  parent = {sample-v},
  symbol = {\ensuremath{\varepsilon_{1}}},
  name = {v/2 name},
  description = {child 2 of v},
  user3 = {ii},
  user4 = {c-IX}
}

@entry{sample-w,
  user1 = {W},
  symbol = {\ensuremath{\phi}},
  user2 = {23},
  name = {w name},
  description = {w description},
  user5 = {26.2263343281809},
  user6 = {1767-03-23},
  user3 = {iii},
  user4 = {W-III}
}

@entry{sample-w-0,
  parent = {sample-w},
  symbol = {\ensuremath{\rho_{2}}},
  name = {w/0 name},
  description = {child 0 of w},
  user3 = {iii}
}

@entry{sample-w-1,
  parent = {sample-w},
  symbol = {\ensuremath{\phi}},
  user2 = {1},
  name = {w/1 name},
  description = {child 1 of w},
  user5 = {0.0183220676669222},
  user3 = {ii}
}

@entry{sample-w-2,
  parent = {sample-w},
  symbol = {\ensuremath{\chi_{0}}},
  name = {w/2 name},
  description = {child 2 of w},
  user4 = {c-i}
}

@entry{sample-x,
  user1 = {X},
  symbol = {\ensuremath{\chi}},
  user2 = {24},
  name = {x name},
  description = {x description},
  user5 = {40.3451424964658},
  user6 = {1923-04-25},
  user3 = {iv},
  user4 = {X-IV}
}

@entry{sample-x-0,
  user1 = {E},
  parent = {sample-x},
  symbol = {\ensuremath{\zeta_{0}^{3}}},
  name = {x/0 name},
  description = {child 0 of x},
  user4 = {a-iii}
}

@entry{sample-x-1,
  user1 = {P},
  parent = {sample-x},
  symbol = {\ensuremath{\varepsilon_{0}}},
  user2 = {1},
  name = {x/1 name},
  description = {child 1 of x},
  user6 = {1534-02-09},
  user3 = {iii},
  user4 = {B-iv}
}

@entry{sample-x-2,
  user1 = {B},
  parent = {sample-x},
  symbol = {\ensuremath{\delta_{0}}},
  name = {x/2 name},
  description = {child 2 of x},
  user3 = {ii}
}

@entry{sample-y,
  user1 = {Y},
  symbol = {\ensuremath{\psi}},
  user2 = {25},
  name = {y name},
  description = {y description},
  user5 = {-23.7637920103467},
  user6 = {2039-01-15},
  user3 = {v},
  user4 = {Y-V}
}

@entry{sample-y-0,
  parent = {sample-y},
  symbol = {\ensuremath{\beta_{0}}},
  user2 = {0},
  name = {y/0 name},
  description = {child 0 of y}
}

@entry{sample-y-1,
  parent = {sample-y},
  symbol = {\ensuremath{\upsilon_{4}}},
  name = {y/1 name},
  description = {child 1 of y},
  user5 = {0.926300787977134},
  user6 = {2037-10-25},
  user4 = {b-iii}
}

@entry{sample-y-2,
  parent = {sample-y},
  symbol = {\ensuremath{\zeta}},
  user2 = {2},
  name = {y/2 name},
  description = {child 2 of y},
  user4 = {c-VIII}
}

@entry{sample-y-3,
  user1 = {Q},
  parent = {sample-y},
  symbol = {\ensuremath{\nu}},
  name = {y/3 name},
  description = {child 3 of y}
}

@entry{sample-y-4,
  user1 = {Q},
  parent = {sample-y},
  symbol = {\ensuremath{\delta_{3}}},
  user2 = {4},
  name = {y/4 name},
  description = {child 4 of y},
  user5 = {0.371448215019761},
  user4 = {E-ii}
}

@entry{sample-z,
  user1 = {Z},
  symbol = {\ensuremath{\omega}},
  user2 = {26},
  name = {z name},
  description = {z description},
  user5 = {16.4806453642409},
  user6 = {1005-06-21},
  user3 = {vi},
  user4 = {Z-vi}
}

@entry{sample-z-0,
  user1 = {U},
  parent = {sample-z},
  symbol = {\ensuremath{\iota_{0}}},
  user2 = {0},
  name = {z/0 name},
  description = {child 0 of z}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-user.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-utf8.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@entry{lórem,
  name = {lórem},
  description = {ipsum}
}

@entry{ðolor,
  name = {ðolor},
  description = {sit}
}

@entry{amèt,
  name = {amèt},
  description = {consectetuer}
}

@entry{ádipiscing,
  name = {ádipiscing},
  description = {elit}
}

@entry{üt,
  name = {üt},
  description = {purus}
}

@entry{ełit,
  name = {ełit},
  description = {vestibulum}
}

@entry{placeràt,
  name = {placeràt},
  description = {ac}
}

@entry{vitæ,
  name = {vitæ},
  description = {felis}
}

@entry{curabítur,
  name = {curabítur},
  description = {gravida}
}

@entry{maüris,
  name = {maüris},
  description = {nam}
}

@entry{arçu,
  name = {arçu},
  description = {libero}
}

@entry{nonummÿ,
  name = {nonummÿ},
  description = {eget}
}

@entry{çonsectetuer,
  name = {çonsectetuer},
  description = {id}
}

@entry{vulputâte,
  name = {vulputâte},
  description = {a magna}
}

@entry{donéc,
  name = {donéc},
  description = {vehicula}
}

@entry{aügue,
  name = {aügue},
  description = {eu neque}
}

@entry{pellentesqué,
  name = {pellentesqué},
  description = {habitant}
}

@entry{morbí,
  name = {morbí},
  description = {tristique}
}

@entry{sénectus,
  name = {sénectus},
  description = {et netus}
}

@entry{ét,
  name = {ét},
  description = {malesuada}
}

@entry{famés,
  name = {famés},
  description = {ac}
}

@entry{türpis,
  name = {türpis},
  description = {egestas}
}

@entry{léo,
  name = {léo},
  description = {cras}
}

@entry{vîverra,
  name = {vîverra},
  description = {metus}
}

@entry{rhonçus,
  name = {rhonçus},
  description = {sem}
}

@entry{nullá,
  name = {nullá},
  description = {et}
}

@entry{lectùs,
  name = {lectùs},
  description = {vestibulum}
}

@entry{ürna,
  name = {ürna},
  description = {fringilla}
}

@entry{ultrïces,
  name = {ultrïces},
  description = {phasellus}
}

@entry{eû,
  name = {eû},
  description = {tellus}
}

@entry{sït,
  name = {sït},
  description = {amet}
}

@entry{tôrtor,
  name = {tôrtor},
  description = {gravida}
}

@entry{intéger,
  name = {intéger},
  description = {sapien}
}

@entry{ést,
  name = {ést},
  description = {iaculis}
}

@entry{ïn,
  name = {ïn},
  description = {pretium}
}

@entry{quiß,
  name = {quiß},
  description = {viverra}
}

@entry{aç,
  name = {aç},
  description = {nunc}
}

@entry{præsent,
  name = {præsent},
  description = {eget}
}

@entry{sêm,
  name = {sêm},
  description = {vel leo}
}

@entry{bîbendum,
  name = {bîbendum},
  description = {ultrices}
}

@entry{ænean,
  name = {ænean},
  description = {faucibus}
}

@entry{mælesuada,
  name = {mælesuada},
  description = {eu}
}

@entry{pülvinar,
  name = {pülvinar},
  description = {at}
}

@entry{mollïs,
  name = {mollïs},
  description = {ac nulla}
}

@entry{áuctor,
  name = {áuctor},
  description = {semper}
}

@entry{variüs,
  name = {variüs},
  description = {orci}
}

@entry{éget,
  name = {éget},
  description = {risus}
}

@entry{duïs,
  name = {duïs},
  description = {nibh}
}

@entry{mï,
  name = {mï},
  description = {congue}
}

@entry{accumsàn,
  name = {accumsàn},
  description = {eleifend}
}

@entry{sagittïs,
  name = {sagittïs},
  description = {quis}
}

@entry{dïam,
  name = {dïam},
  description = {duis}
}

@entry{orçi,
  name = {orçi},
  description = {dignissim}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-utf8.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*example-glossaries-xr.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<<COMMENT
% Encoding: UTF-8
%COMMENT
@entry{lorem,
  name = {lorem},
  description = {ipsum}
}

@entry{alias-lorem,
  name = {alias-lorem},
  description = {ipsum},
  alias = {lorem}
}

@entry{dolor,
  name = {dolor},
  description = {sit}
}

@entry{amet,
  see = {dolor},
  name = {amet},
  description = {consectetuer}
}

@entry{adipiscing,
  name = {adipiscing},
  description = {elit}
}

@entry{ut,
  name = {ut},
  description = {purus}
}

@entry{elit,
  name = {elit},
  description = {vestibulum},
  seealso = {adipiscing,ut}
}

@entry{placerat,
  name = {placerat},
  description = {ac}
}

@entry{vitae,
  name = {vitae},
  description = {felis}
}

@entry{curabitur,
  name = {curabitur},
  description = {gravida}
}

@entry{mauris,
  name = {mauris},
  description = {nam}
}

@entry{arcu,
  name = {arcu},
  description = {libero},
  seealso = {placerat,vitae,curabitur}
}

@entry{nonummy,
  name = {nonummy},
  description = {eget},
  seealso = {mauris}
}

@entry{consectetuer,
  parent = {nonummy},
  name = {consectetuer},
  description = {id}
}

@entry{vulputate,
  parent = {nonummy},
  name = {vulputate},
  description = {a magna}
}

@entry{donec,
  name = {donec},
  description = {vehicula}
}

@entry{augue,
  name = {augue},
  description = {eu neque}
}

@entry{pellentesque,
  see = {augue},
  name = {pellentesque},
  description = {habitant}
}

@entry{morbi,
  name = {morbi},
  description = {tristique}
}

@entry{senectus,
  name = {senectus},
  description = {et netus}
}

@entry{et,
  see = {vulputate},
  name = {et},
  description = {malesuada}
}

@entry{fames,
  name = {fames},
  description = {ac}
}

@entry{turpis,
  name = {turpis},
  description = {egestas},
  seealso = {consectetuer}
}

@entry{leo,
  name = {leo},
  description = {cras}
}

@entry{viverra,
  name = {viverra},
  description = {metus}
}

@entry{rhoncus,
  name = {rhoncus},
  description = {sem}
}

@entry{nulla,
  name = {nulla},
  description = {et}
}

@entry{lectus,
  name = {lectus},
  description = {vestibulum}
}

@entry{urna,
  parent = {lectus},
  see = {nulla},
  name = {urna},
  description = {fringilla}
}

@entry{ultrices,
  parent = {lectus},
  name = {ultrices},
  description = {phasellus}
}

@entry{eu,
  parent = {lectus},
  name = {eu},
  description = {tellus}
}

@entry{alias-eu,
  name = {alias-eu},
  description = {tellus},
  alias = {eu}
}

@entry{sit,
  name = {sit},
  description = {amet}
}

@entry{tortor,
  name = {tortor},
  description = {gravida}
}

@entry{integer,
  name = {integer},
  description = {sapien}
}

@entry{est,
  name = {est},
  description = {iaculis}
}

@entry{in,
  name = {in},
  description = {pretium},
  seealso = {sit,tortor,est}
}

@entry{quis,
  name = {quis},
  description = {viverra}
}

@entry{ac,
  name = {ac},
  description = {nunc}
}

@entry{praesent,
  name = {praesent},
  description = {eget \gls{ac}}
}

@entry{sem,
  name = {sem},
  description = {vel leo
\glshyperlink{quis}}
}

@entry{bibendum,
  name = {bibendum},
  description = {ultrices}
}

@entry{aenean,
  name = {aenean},
  description = {faucibus}
}

@entry{malesuada,
  parent = {aenean},
  name = {malesuada},
  description = {eu}
}

@entry{pulvinar,
  parent = {aenean},
  name = {pulvinar},
  description = {at}
}

@entry{mollis,
  parent = {aenean},
  name = {mollis},
  description = {ac nulla}
}

@entry{auctor,
  parent = {aenean},
  name = {auctor},
  description = {semper}
}

@entry{varius,
  parent = {aenean},
  name = {varius},
  description = {orci}
}

@entry{eget,
  name = {eget},
  description = {risus}
}

@entry{duis,
  name = {duis},
  description = {nibh}
}

@entry{mi,
  name = {mi},
  description = {congue}
}

@entry{accumsan,
  name = {accumsan},
  description = {eleifend}
}

@entry{sagittis,
  see = {eget},
  name = {sagittis},
  description = {quis}
}

@entry{diam,
  name = {diam},
  description = {duis}
}

@entry{orci,
  name = {orci},
  description = {dignissim},
  seealso = {diam}
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</example-glossaries-xr.bib>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossaries-extra-2021-11-22.sty>
%    \end{macrocode}
%\fi
%\section{Rollback Files}
% \subsection{Rollback v1.48 (glossaries-extra-2021-11-22.sty)}
% Version 1.48 preserved for rollback.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{glossaries-extra}[2021/11/22 v1.48 (NLCT)]
\RequirePackage{xkeyval}
\RequirePackage{etoolbox}
\@ifpackageloaded{glossaries}
{%
   \newcommand{\glsxtr@dooption}[1]{\setupglossaries{#1}}%
   \let\@glsxtr@declareoption\@gls@declareoption
}
{%
   \newcommand{\glsxtr@dooption}[1]{%
     \PassOptionsToPackage{#1}{glossaries}%
   }%
   \PassOptionsToPackage{toc}{glossaries}
   \PassOptionsToPackage{nopostdot}{glossaries}
   \PassOptionsToPackage{noredefwarn}{glossaries}
   \@ifpackageloaded{polyglossia}%
   {}%
   {%
     \@ifpackageloaded{babel}%
     {\PassOptionsToPackage{translate=babel}{glossaries}}%
     {}%
   }%
   \newcommand*{\@glsxtr@declareoption}[2]{%
     \DeclareOptionX{#1}{#2}%
     \DeclareOption{#1}{#2}%
   }
}
\newcommand*{\glsxtrundefaction}[2]{%
  \@glsxtrundeftag\PackageError{glossaries-extra}{#1}{#2}%
}
\newcommand*{\glsxtr@warnonexistsordo}[1]{}
\newcommand*{\glsxtrundeftag}{??}
\newcommand*{\@glsxtrundeftag}{}
\newcommand*{\@glsxtr@warn@undefaction}[2]{%
  \@glsxtrundeftag\GlossariesExtraWarning{#1}%
}
\newcommand*{\@glsxtr@err@undefaction}[2]{%
  \@glsxtrundeftag\PackageError{glossaries-extra}{#1}{#2}%
}
\newcommand*{\@glsxtr@warn@onexistsordo}[1]{%
  \GlossariesExtraWarning{\string#1\space hasn't been defined, so
  some errors won't be converted to warnings.
  (This most likely means your version of
  glossaries.sty is below version 4.19.)}%
}

\newcommand*{\@glsxtr@redef@forglsentries}{}
\newcommand*{\@glsxtr@do@redef@forglsentries}{%
  \renewcommand*{\forglsentries}[3][\glsdefaulttype]{%
    \protected@edef\@@glo@list{\csname glolist@##1\endcsname}%
    \ifdefstring{\@@glo@list}{,}%
    {%
      \GlossariesExtraWarning{No entries defined in glossary `##1'}%
    }%
    {%
      \@for##2:=\@@glo@list\do
      {%
        \ifdefempty{##2}{}{##3}%
      }%
    }%
  }%
}%
\define@choicekey{glossaries-extra.sty}{undefaction}%
 [\glsxtr@undefaction@val\glsxtr@undefaction@nr]%
 {warn,error}%
 {%
   \ifcase\glsxtr@undefaction@nr\relax
     \let\glsxtrundefaction\@glsxtr@warn@undefaction
     \let\glsxtr@warnonexistsordo\@glsxtr@warn@onexistsordo
     \let\@glsxtr@redef@forglsentries\@glsxtr@do@redef@forglsentries
   \or
     \let\glsxtrundefaction\@glsxtr@err@undefaction
     \let\glsxtr@warnonexistsordo\@gobble
     \let\@glsxtr@redef@forglsentries\relax
   \fi
 }
\newcommand*{\@glsxtr@record}[3]{}
\newcommand*{\glsxtr@recordsee}[2]{}
\newcommand*{\@glsxtr@defaultnumberformat}{glsnumberformat}%
\newcommand*{\GlsXtrSetDefaultNumberFormat}[1]{%
  \renewcommand*{\@glsxtr@defaultnumberformat}{#1}%
}%
\newcommand*{\@glsxtr@do@record@wrglossary}[1]{%
 \begingroup
   \ifKV@glslink@noindex
   \else
     \protected@edef\@gls@label{\glsdetoklabel{#1}}%
     \let\glslabel\@gls@label
     \glswriteentry{#1}%
     {%
       \ifdefempty{\@glsxtr@thevalue}%
       {%
         \ifx\@glsxtr@org@theHvalue\@glsxtr@theHvalue
         \else
           \let\theHglsentrycounter\@glsxtr@theHvalue
         \fi
         \glsxtr@saveentrycounter
         \let\@@do@@wrglossary\@glsxtr@dorecord
       }%
       {%
         \let\theglsentrycounter\@glsxtr@thevalue
         \let\theHglsentrycounter\@glsxtr@theHvalue
         \let\@@do@@wrglossary\@glsxtr@dorecordnodefer
       }%
       \ifx\@glsxtr@record@setting\@glsxtr@record@setting@alsoindex
         \glsxtr@@do@wrglossary{#1}%
       \else
         \@@glsxtrwrglossmark
         \glsxtr@inc@wrglossaryctr{#1}%
         \@@do@@wrglossary
       \fi
     }%
   \fi
 \endgroup
}
\newcommand*{\glsxtr@do@alsoindex@wrglossary}[1]{%
  \glsxtr@@do@wrglossary{#1}%
  \@glsxtr@do@record@wrglossary{#1}%
}
\newcommand*{\@@glsxtr@record}[3]{%
 \protected@edef\@gls@label{\glsdetoklabel{#2}}%
 \let\glslabel\@gls@label
 \ifglsentryexists{#2}{}%
 {%
   \@@glsxtrwrglossmark
   \begingroup
     \let\@glsnumberformat\@glsxtr@defaultnumberformat
     \def\@glsxtr@thevalue{}%
     \def\@glsxtr@theHvalue{\@glsxtr@thevalue}%
     \let\@glsxtr@org@theHvalue\@glsxtr@theHvalue
     \let\@gls@counter\glscounter
     \if@glsxtr@equations
       \@glsxtr@use@equation@counter
     \fi
     \@gls@setdefault@glslink@opts
     \csuse{@glsxtr@#3@prekeys}%
     \setkeys{#3}{#1}%
     \glsxtr@do@autoadd{#3}%
     \csuse{@glsxtr@#3@postkeys}%
     \glsxtr@inc@wrglossaryctr{#2}%
     \ifKV@glslink@noindex
     \else
       \glswriteentry{#2}%
       {%
         \ifdefempty{\@glsxtr@thevalue}%
         {%
           \ifx\@glsxtr@org@theHvalue\@glsxtr@theHvalue
           \else
             \let\theHglsentrycounter\@glsxtr@theHvalue
           \fi
           \glsxtr@saveentrycounter
           \let\@@do@@wrglossary\@glsxtr@dorecord
         }%
         {%
           \let\theglsentrycounter\@glsxtr@thevalue
           \let\theHglsentrycounter\@glsxtr@theHvalue
           \let\@@do@@wrglossary\@glsxtr@dorecordnodefer
         }%
         \ifx\@glsxtr@record@setting\@glsxtr@record@setting@alsoindex
           \glsxtr@@do@wrglossary{#2}%
         \else
           \@@do@@wrglossary
         \fi
       }%
     \fi
   \endgroup
 }%
}
\newcommand{\@glsxtr@glslink@prekeys}{\glslinkpresetkeys}
\newcommand{\@glsxtr@glslink@postkeys}{\glslinkpostsetkeys}
\newcommand{\@glsxtr@glossadd@prekeys}{\glsaddpresetkeys}
\newcommand{\@glsxtr@glossadd@postkeys}{\glsaddpostsetkeys}
\newcommand*\@glsxtr@dorecord{%
   \global\let\@glsrecordlocref\theglsentrycounter
   \let\@glsxtr@orgprefix\@glo@counterprefix
   \ifx\theglsentrycounter\theHglsentrycounter
     \def\@glo@counterprefix{}%
   \else
     \protected@edef\@glsxtr@theentrycounter{\theglsentrycounter}%
     \protected@edef\@glsxtr@theHentrycounter{\theHglsentrycounter}%
     \@onelevel@sanitize\@glsxtr@theentrycounter
     \@onelevel@sanitize\@glsxtr@theHentrycounter
     \protected@edef\@do@gls@getcounterprefix{\noexpand\@gls@getcounterprefix
       {\@glsxtr@theentrycounter}{\@glsxtr@theHentrycounter}%
     }%
     \@do@gls@getcounterprefix
   \fi
   \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
     \@glsxtr@do@nameref@record
      {\@gls@label}{\@glo@counterprefix}{\@gls@counter}{\@glsnumberformat}%
      {\@glsrecordlocref}%
   \else
     \protected@write\@auxout{}{\string\glsxtr@record
        {\@gls@label}{\@glo@counterprefix}{\@gls@counter}{\@glsnumberformat}%
        {\@glsrecordlocref}}%
   \fi
   \@glsxtr@counterrecordhook
   \let\@glo@counterprefix\@glsxtr@orgprefix
}
\newcommand*\@glsxtr@dorecordnodefer{%
   \ifx\theglsentrycounter\theHglsentrycounter
     \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
       \@glsxtr@do@nameref@record
          {\@gls@label}{}{\@gls@counter}{\@glsnumberformat}%
          {\theglsentrycounter}%
     \else
       \protected@write\@auxout{}{\string\glsxtr@record
          {\@gls@label}{}{\@gls@counter}{\@glsnumberformat}%
          {\theglsentrycounter}}%
     \fi
   \else
     \edef\@do@gls@getcounterprefix{\noexpand\@gls@getcounterprefix
       {\theglsentrycounter}{\theHglsentrycounter}%
     }%
     \@do@gls@getcounterprefix
     \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
       \@glsxtr@do@nameref@record
          {\@gls@label}{\@glo@counterprefix}{\@gls@counter}%
          {\@glsnumberformat}{\theglsentrycounter}%
     \else
       \protected@write\@auxout{}{\string\glsxtr@record
         {\@gls@label}{\@glo@counterprefix}{\@gls@counter}{\@glsnumberformat}%
         {\theglsentrycounter}}%
     \fi
   \fi
   \@glsxtr@counterrecordhook
}
\newcommand{\@glsxtr@ifnum@mmode}[2]{%
 \ifmmode
   \ifst@rred
    #2%
   \else
     \if@display #1\else #2\fi
   \fi
 \else
   #2%
 \fi
}
\newcommand*{\@glsxtr@do@nameref@record}[5]{%
  \gls@ifnotmeasuring
  {%
    \protected@write\@auxout{}{\string\glsxtr@record@nameref
     {#1}{#2}{#3}{#4}{#5}%
     {\csuse{@currentlabelname}}{\csuse{@currentHref}}%
     {\theHglsentrycounter}}%
  }%
}
\newcommand*{\@@glsxtr@recordcounter}{%
  \@glsxtr@noop@recordcounter
}
\newcommand*{\@glsxtr@noop@recordcounter}[1]{%
  \PackageError{glossaries-extra}{\string\GlsXtrRecordCounter\space
   requires record=only or record=hybrid package option}{}%
}
\newcommand*{\@glsxtr@op@recordcounter}[1]{%
  \protected@eappto\@glsxtr@counterrecordhook{\noexpand\@glsxtr@docounterrecord{#1}}%
}
\newcommand*{\@glsxtr@recordsee}[2]{%
 \@@glsxtrwrglossmark
 \def\@gls@xref{#2}%
 \@onelevel@sanitize\@gls@xref
 \protected@write\@auxout{}{\string\glsxtr@recordsee{#1}{\@gls@xref}}%
}
\newcommand{\printunsrtglossaryunit}{%
  \print@noop@unsrtglossaryunit
}
\newcommand*{\glsxtr@setup@record}{\let\@@do@wrglossary\glsxtr@@do@wrglossary}
\newcommand*{\glsxtr@indexonly@saveentrycounter}{%
 \ifKV@glslink@noindex
 \else
   \glsxtr@saveentrycounter
 \fi
}
\newcommand*{\glsxtr@addloclistfield}{%
 \key@ifundefined{glossentry}{loclist}%
 {%
   \define@key{glossentry}{loclist}{\def\@glo@loclist{##1}}%
   \appto\@gls@keymap{,{loclist}{loclist}}%
   \appto\@newglossaryentryprehook{\def\@glo@loclist{}}%
   \appto\@newglossaryentryposthook{%
     \gls@assign@field{}{\@glo@label}{loclist}{\@glo@loclist}%
   }%
   \glssetnoexpandfield{loclist}%
 }%
 {}%
 \key@ifundefined{glossentry}{location}%
 {%
   \define@key{glossentry}{location}{\def\@glo@location{##1}}%
   \appto\@gls@keymap{,{location}{location}}%
   \appto\@newglossaryentryprehook{\def\@glo@location{}}%
   \appto\@newglossaryentryposthook{%
     \gls@assign@field{}{\@glo@label}{location}{\@glo@location}%
   }%
   \glssetnoexpandfield{location}%
 }%
 {}%
 \key@ifundefined{glossentry}{group}%
 {%
   \define@key{glossentry}{group}{\def\@glo@group{##1}}%
   \appto\@gls@keymap{,{group}{group}}%
   \appto\@newglossaryentryprehook{\def\@glo@group{}}%
   \appto\@newglossaryentryposthook{%
     \gls@assign@field{}{\@glo@label}{group}{\@glo@group}%
   }%
   \glssetnoexpandfield{group}%
 }%
 {}%
}
\newcommand*{\@glsxtr@record@setting}{off}
\newcommand*{\@glsxtr@record@setting@alsoindex}{alsoindex}
\newcommand*{\@glsxtr@record@setting@only}{only}
\newcommand*{\@glsxtr@record@setting@nameref}{nameref}
\newcommand*{\@glsxtr@if@record@only}[2]{%
 \ifx\@glsxtr@record@setting\@glsxtr@record@setting@only
  #1%
 \else
  \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
    #1%
  \else
    #2%
  \fi
 \fi
}
\newcommand*{\@glsxtr@record@setting@off}{off}
\newcommand\@glsxtr@warn@hybrid@noprintgloss{%
  \ifdefstring{\@glo@types}{,}%
  {%
    \GlossariesExtraWarningNoLine{No glossaries have been defined}%
  }%
  {%
    \GlossariesExtraWarningNoLine{No \string\printglossary\space
      or \string\printglossaries\space
      found. ^^JYou have requested the hybrid setting
      record=\@glsxtr@record@setting\space which requires a
      combination of bib2gls (to fetch entries) and makeindex/xindy
      (to sort and collate the entries). If you only want to use
      bib2gls then change the option to record=only or record=nameref}%
  }%
}
\newcommand*{\@glsxtr@record@only@setup}{%
 \def\glsxtr@setup@record{%
   \@glsxtr@autoseeindexfalse
   \let\@do@seeglossary\@glsxtr@recordsee
   \let\@glsxtr@record\@@glsxtr@record
   \let\@@do@wrglossary\@glsxtr@do@record@wrglossary
   \let\@gls@saveentrycounter\relax
   \let\glsxtrundefaction\@glsxtr@warn@undefaction
   \let\glsxtr@warnonexistsordo\@glsxtr@warn@onexistsordo
   \glsxtr@addloclistfield
   \renewcommand*{\@glsxtr@autoindexcrossrefs}{}%
   \let\@@glsxtr@recordcounter\@glsxtr@op@recordcounter
   \def\printunsrtglossaryunit{\print@op@unsrtglossaryunit}%
   \def\glsxtrsetaliasnoindex{}%
   \ifdef\@gls@setupsort@none{\@gls@setupsort@none}{}%
   \def\glsxtrNoGlossaryWarning{\@glsxtr@record@noglossarywarning}%
   \RequirePackage{glossaries-extra-bib2gls}[=v1.48]%
 }%
}
\define@choicekey{glossaries-extra.sty}{record}
 [\@glsxtr@record@setting\glsxtr@record@nr]%
 {off,only,alsoindex,nameref,hybrid}%
 [only]%
 {%
   \ifcase\glsxtr@record@nr\relax
     \def\glsxtr@setup@record{%
       \renewcommand*{\@do@seeglossary}{\@glsxtr@doseeglossary}%
       \renewcommand*{\@glsxtr@record}[3]{}%
       \let\@@do@wrglossary\glsxtr@@do@wrglossary
       \let\@gls@saveentrycounter\glsxtr@indexonly@saveentrycounter
       \let\glsxtrundefaction\@glsxtr@err@undefaction
       \let\glsxtr@warnonexistsordo\@gobble
       \let\@@glsxtr@recordcounter\@glsxtr@noop@recordcounter
       \def\printunsrtglossaryunit{\print@noop@unsrtglossaryunit}%
       \undef\glsxtrsetaliasnoindex
     }%
   \or
     \@glsxtr@record@only@setup
   \or
     \def\glsxtr@setup@record{%
       \renewcommand*{\@glsxtr@record@setting@alsoindex}{alsoindex}%
       \renewcommand*{\@do@seeglossary}{\@glsxtr@dosee@alsoindex@glossary}%
       \let\@glsxtr@record\@@glsxtr@record
       \let\@@do@wrglossary\glsxtr@do@alsoindex@wrglossary
       \let\@gls@saveentrycounter\glsxtr@indexonly@saveentrycounter
       \let\glsxtrundefaction\@glsxtr@warn@undefaction
       \let\glsxtr@warnonexistsordo\@glsxtr@warn@onexistsordo
       \glsxtr@addloclistfield
       \let\@@glsxtr@recordcounter\@glsxtr@op@recordcounter
       \def\printunsrtglossaryunit{\print@op@unsrtglossaryunit}%
       \undef\glsxtrsetaliasnoindex
     }%
   \or
     \@glsxtr@record@only@setup
     \ifundef\hyperlink
     {\GlossariesExtraWarning{You have requested record=nameref but
      the document doesn't support hyperlinks}}%
     {}%
   \or
     \def\glsxtr@setup@record{%
       \renewcommand*{\@glsxtr@record@setting@alsoindex}{hybrid}%
       \renewcommand*{\@do@seeglossary}{\@glsxtr@dosee@alsoindex@glossary}%
       \let\@glsxtr@record\@@glsxtr@record
       \let\@@do@wrglossary\glsxtr@do@alsoindex@wrglossary
       \let\@gls@saveentrycounter\glsxtr@indexonly@saveentrycounter
       \let\glsxtrundefaction\@glsxtr@warn@undefaction
       \let\glsxtr@warnonexistsordo\@glsxtr@warn@onexistsordo
       \glsxtr@addloclistfield
       \let\@@glsxtr@recordcounter\@glsxtr@op@recordcounter
       \def\printunsrtglossaryunit{\print@op@unsrtglossaryunit}%
       \undef\glsxtrsetaliasnoindex
     }%
   \fi
 }
\newcommand*{\@glsxtr@docdefval}{0}
\newcommand*{\if@glsxtrdocdef}{\ifnum\@glsxtr@docdefval>0 }
\newcommand*{\@glsxtrdocdeftrue}{\def\@glsxtr@docdefval{1}}
\newcommand*{\@glsxtrdocdeffalse}{\def\@glsxtr@docdefval{0}}
\define@choicekey{glossaries-extra.sty}{docdef}
 [\@glsxtr@docdefsetting\@glsxtr@docdefval]%
 {false,true,restricted,atom}[true]%
{%
  \ifnum\@glsxtr@docdefval>1\relax
    \renewcommand*{\@glsdoifexistsorwarn}{\glsdoifexists}%
  \else
    \renewcommand*{\@glsdoifexistsorwarn}{\glsdoifexistsorwarn}%
  \fi
}
\newcommand*{\if@glsxtrdocdefrestricted}{\ifnum\@glsxtr@docdefval>1 }
\newcommand*{\@glsdoifexistsorwarn}{\glsdoifexistsorwarn}
\define@boolkey{glossaries-extra.sty}[@glsxtr]{indexcrossrefs}[true]{%
 \if@glsxtrindexcrossrefs
 \else
  \renewcommand*{\@glsxtr@autoindexcrossrefs}{}%
 \fi
}
\@glsxtrindexcrossrefsfalse
\newcommand*{\@glsxtr@autoindexcrossrefs}{\@glsxtrindexcrossrefstrue}
\define@boolkey{glossaries-extra.sty}[@glsxtr@]{autoseeindex}[true]{%
}
\@glsxtr@autoseeindextrue
\define@boolkey{glossaries-extra.sty}[@glsxtr@]{equations}[true]{%
}
\@glsxtr@equationsfalse
\let\glsxtr@float\@float
\let\glsxtr@dblfloat\@dblfloat
\define@boolkey{glossaries-extra.sty}[@glsxtr@]{floats}[true]{%
  \if@glsxtr@floats
   \renewcommand*{\@float}[1]{\renewcommand{\glscounter}{##1}\glsxtr@float{##1}}%
   \renewcommand*{\@dblfloat}[1]{\renewcommand{\glscounter}{##1}\glsxtr@dblfloat{##1}}%
  \else
   \let\@float\glsxtr@float
   \let\@dblfloat\glsxtr@dblfloat
  \fi
}
\@glsxtr@floatsfalse
\newcommand*{\GlossariesExtraWarning}[1]{\PackageWarning{glossaries-extra}{#1}}
\newcommand*{\GlossariesExtraWarningNoLine}[1]{%
 \PackageWarningNoLine{glossaries-extra}{#1}}
\@glsxtr@declareoption{nowarn}{%
  \let\GlossariesExtraWarning\@gobble
  \let\GlossariesExtraWarningNoLine\@gobble
  \glsxtr@dooption{nowarn}%
}
\newcommand*{\@glsxtr@defpostpunc}{}
\@glsxtr@declareoption{postdot}{%
  \glsxtr@dooption{nopostdot=false}%
  \renewcommand*{\@glsxtr@defpostpunc}{%
    \renewcommand*{\glspostdescription}{%
      \ifglsnopostdot\else.\spacefactor\sfcode`\. \fi}%
  }%
}

\define@choicekey{glossaries-extra.sty}{nopostdot}{true,false}[true]{%
  \glsxtr@dooption{nopostdot=#1}%
  \renewcommand*{\@glsxtr@defpostpunc}{%
    \renewcommand*{\glspostdescription}{%
      \ifglsnopostdot\else.\spacefactor\sfcode`\. \fi}%
  }%
}
\define@key{glossaries-extra.sty}{postpunc}{%
  \glsxtr@dooption{nopostdot=false}%
  \ifstrequal{#1}{dot}%
  {%
    \renewcommand*{\@glsxtr@defpostpunc}{%
      \renewcommand*{\glspostdescription}{.\spacefactor\sfcode`\. }%
    }%
  }%
  {%
    \ifstrequal{#1}{comma}%
    {%
      \renewcommand*{\@glsxtr@defpostpunc}{%
        \renewcommand*{\glspostdescription}{,}%
      }%
    }%
    {%
      \ifstrequal{#1}{none}%
      {%
        \glsxtr@dooption{nopostdot=true}%
        \renewcommand*{\@glsxtr@defpostpunc}{%
          \renewcommand*{\glspostdescription}{}%
        }%
      }%
      {%
        \renewcommand*{\@glsxtr@defpostpunc}{%
          \renewcommand*{\glspostdescription}{#1}%
        }%
      }%
    }%
  }%
}
\newcommand*{\glsxtrabbrvtype}{\glsdefaulttype}
\newcommand*{\@glsxtr@abbreviationsdef}{}

\newcommand*{\@glsxtr@doabbreviationsdef}{%
  \@ifpackageloaded{babel}%
  {\providecommand{\abbreviationsname}{\acronymname}}%
  {\providecommand{\abbreviationsname}{Abbreviations}}%
  \newglossary[glg-abr]{abbreviations}{gls-abr}{glo-abr}{\abbreviationsname}%
  \renewcommand*{\glsxtrabbrvtype}{abbreviations}%
  \newcommand*{\printabbreviations}[1][]{%
    \printglossary[type=\glsxtrabbrvtype,##1]%
  }%
  \disable@keys{glossaries-extra.sty}{abbreviations}%
  \ifglsacronym
  \else
    \renewcommand*{\acronymtype}{\glsxtrabbrvtype}%
  \fi
}%
\@glsxtr@declareoption{abbreviations}{%
  \let\@glsxtr@abbreviationsdef\@glsxtr@doabbreviationsdef
}
\newcommand*{\GlsXtrDefineAbbreviationShortcuts}{%
  \newcommand*{\ab}{\cgls}%
  \newcommand*{\abp}{\cglspl}%
  \newcommand*{\as}{\glsxtrshort}%
  \newcommand*{\asp}{\glsxtrshortpl}%
  \newcommand*{\al}{\glsxtrlong}%
  \newcommand*{\alp}{\glsxtrlongpl}%
  \newcommand*{\af}{\glsxtrfull}%
  \newcommand*{\afp}{\glsxtrfullpl}%
  \newcommand*{\Ab}{\cGls}%
  \newcommand*{\Abp}{\cGlspl}%
  \newcommand*{\As}{\Glsxtrshort}%
  \newcommand*{\Asp}{\Glsxtrshortpl}%
  \newcommand*{\Al}{\Glsxtrlong}%
  \newcommand*{\Alp}{\Glsxtrlongpl}%
  \newcommand*{\Af}{\Glsxtrfull}%
  \newcommand*{\Afp}{\Glsxtrfullpl}%
  \newcommand*{\AB}{\cGLS}%
  \newcommand*{\ABP}{\cGLSpl}%
  \newcommand*{\AS}{\GLSxtrshort}%
  \newcommand*{\ASP}{\GLSxtrshortpl}%
  \newcommand*{\AL}{\GLSxtrlong}%
  \newcommand*{\ALP}{\GLSxtrlongpl}%
  \newcommand*{\AF}{\GLSxtrfull}%
  \newcommand*{\AFP}{\GLSxtrfullpl}%
  \providecommand*{\newabbr}{\newabbreviation}%
  \let\GlsXtrDefineAbbreviationShortcuts\relax
}
\newcommand*{\GlsXtrDefineAcShortcuts}{%
  \newcommand*{\ac}{\cgls}%
  \newcommand*{\acp}{\cglspl}%
  \newcommand*{\acs}{\glsxtrshort}%
  \newcommand*{\acsp}{\glsxtrshortpl}%
  \newcommand*{\acl}{\glsxtrlong}%
  \newcommand*{\aclp}{\glsxtrlongpl}%
  \newcommand*{\acf}{\glsxtrfull}%
  \newcommand*{\acfp}{\glsxtrfullpl}%
  \newcommand*{\Ac}{\cGls}%
  \newcommand*{\Acp}{\cGlspl}%
  \newcommand*{\Acs}{\Glsxtrshort}%
  \newcommand*{\Acsp}{\Glsxtrshortpl}%
  \newcommand*{\Acl}{\Glsxtrlong}%
  \newcommand*{\Aclp}{\Glsxtrlongpl}%
  \newcommand*{\Acf}{\Glsxtrfull}%
  \newcommand*{\Acfp}{\Glsxtrfullpl}%
  \newcommand*{\AC}{\cGLS}%
  \newcommand*{\ACP}{\cGLSpl}%
  \newcommand*{\ACS}{\GLSxtrshort}%
  \newcommand*{\ACSP}{\GLSxtrshortpl}%
  \newcommand*{\ACL}{\GLSxtrlong}%
  \newcommand*{\ACLP}{\GLSxtrlongpl}%
  \newcommand*{\ACF}{\GLSxtrfull}%
  \newcommand*{\ACFP}{\GLSxtrfullpl}%
  \providecommand*{\newabbr}{\newabbreviation}%
  \let\GlsXtrDefineAcShortcuts\relax
}
\newcommand*{\GlsXtrDefineOtherShortcuts}{%
  \newcommand*{\newentry}{\newglossaryentry}%
  \ifdef\printsymbols
  {%
    \newcommand*{\newsym}{\glsxtrnewsymbol}%
  }{}%
  \ifdef\printnumbers
  {%
    \newcommand*{\newnum}{\glsxtrnewnumber}%
  }{}%
  \let\GlsXtrDefineOtherShortcuts\relax
}
\newcommand*{\@glsxtr@setupshortcuts}{}
\newcommand*{\@glsxtr@shortcutsval}{\ifglsacrshortcuts acro\else none\fi}%
\define@choicekey{glossaries-extra.sty}{shortcuts}%
 [\@glsxtr@shortcutsval\@glsxtr@shortcutsnr]%
 {acronyms,acro,abbreviations,abbr,other,all,true,ac,none,false}[true]{%
   \ifcase\@glsxtr@shortcutsnr\relax % acronyms
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \glsacrshortcutstrue
       \DefineAcronymSynonyms
     }%
   \or % acro
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \glsacrshortcutstrue
       \DefineAcronymSynonyms
     }%
   \or % abbreviations
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \GlsXtrDefineAbbreviationShortcuts
     }%
   \or % abbr
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \GlsXtrDefineAbbreviationShortcuts
     }%
   \or % other
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \GlsXtrDefineOtherShortcuts
     }%
   \or % all
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \glsacrshortcutstrue
       \GlsXtrDefineAcShortcuts
       \GlsXtrDefineAbbreviationShortcuts
       \GlsXtrDefineOtherShortcuts
     }%
   \or % true
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \glsacrshortcutstrue
       \GlsXtrDefineAcShortcuts
       \GlsXtrDefineAbbreviationShortcuts
       \GlsXtrDefineOtherShortcuts
     }%
   \or % ac
     \renewcommand*{\@glsxtr@setupshortcuts}{%
       \glsacrshortcutstrue
       \GlsXtrDefineAcShortcuts
     }%
   \else % none, false
     \renewcommand*{\@glsxtr@setupshortcuts}{}%
   \fi
 }
\newcommand*{\@glsxtr@doaccsupp}{}
\@glsxtr@declareoption{accsupp}{%
 \renewcommand*{\@glsxtr@doaccsupp}{\RequirePackage{glossaries-accsupp}}}
\newcommand*{\@glsxtr@doloadprefix}{}
\@glsxtr@declareoption{prefix}{%
 \renewcommand*{\@glsxtr@doloadprefix}{\RequirePackage{glossaries-prefix}}}
\newcommand{\glsxtrNoGlossaryWarning}[1]{%
  \GlossariesExtraWarning{Glossary `#1' is missing}%
  \@glsxtr@defaultnoglossarywarning{#1}%
}
\define@choicekey{glossaries-extra.sty}{nomissingglstext}
 [\@glsxtr@nomissingglstextval\@glsxtr@nomissingglstextnr]%
 {true,false}[true]{%
   \ifcase\@glsxtr@nomissingglstextnr\relax % true
     \renewcommand{\glsxtrNoGlossaryWarning}[1]{\null}%
   \else % false
     \renewcommand{\glsxtrNoGlossaryWarning}[1]{%
       \@glsxtr@defaultnoglossarywarning{#1}%
     }%
   \fi
 }
\newcommand*{\@glsxtr@redefstyles}{}
\define@key{glossaries-extra.sty}{stylemods}[default]{%
  \ifstrequal{#1}{default}%
  {%
    \renewcommand*{\@glsxtr@redefstyles}{%
      \RequirePackage{glossaries-extra-stylemods}}%
  }%
  {%
    \ifstrequal{#1}{all}%
    {%
      \renewcommand*{\@glsxtr@redefstyles}{%
        \PassOptionsToPackage{all}{glossaries-extra-stylemods}%
        \RequirePackage{glossaries-extra-stylemods}%
      }%
    }%
    {%
      \renewcommand*{\@glsxtr@redefstyles}{}%
      \@for\@glsxtr@tmp:=#1\do{%
        \IfFileExists{glossary-\@glsxtr@tmp.sty}%
        {%
          \eappto\@glsxtr@redefstyles{%
            \noexpand\RequirePackage{glossary-\@glsxtr@tmp}}%
        }%
        {%
           \PackageError{glossaries-extra}%
             {Glossaries style package `glossary-\@glsxtr@tmp.sty'
              doesn't exist (did you mean to use the `style' key?)}%
             {The list of values (#1) in the `stylemods' key should
              match the glossary-xxx.sty files provided with
              glossaries.sty}%
        }%
      }%
      \appto\@glsxtr@redefstyles{\RequirePackage{glossaries-extra-stylemods}[=v1.48]}%
   }
  }%
}
\newcommand*{\@glsxtr@do@style}{}
\define@key{glossaries-extra.sty}{style}{%
 \renewcommand*{\@glsxtr@do@style}{%
   \setkeys{glossaries.sty}{style={#1}}%
   \setglossarystyle{#1}%
 }%
}
\newcommand*{\glsxtr@inc@wrglossaryctr}[1]{}
\newcommand*{\GlsXtrInternalLocationHyperlink}[3]{%
  \glsxtrhyperlink{#1#2#3}{#3}%
}
\newcommand*{\@glsxtr@wrglossary@locationhyperlink}[3]{%
  \pageref{wrglossary.#3}%
}
\@glsxtr@declareoption{indexcounter}{%
  \glsxtr@dooption{counter=wrglossary}%
  \ifundef\c@wrglossary
  {%
    \newcounter{wrglossary}%
    \renewcommand{\thewrglossary}{\arabic{wrglossary}}%
  }%
  {}%
  \renewcommand*{\glsxtr@inc@wrglossaryctr}[1]{%
    \ifdefstring\@gls@counter{wrglossary}%
    {%
      \refstepcounter{wrglossary}%
      \label{wrglossary.\thewrglossary}%
    }%
    {}%
  }%
  \renewcommand*{\GlsXtrInternalLocationHyperlink}[3]{%
    \ifdefstring\glsentrycounter{wrglossary}%
    {%
      \@glsxtr@wrglossary@locationhyperlink{##1}{##2}{##3}%
    }%
    {\glsxtrhyperlink{##1##2##3}{##3}}%
  }%
}
\newcommand*{\@glsxtrwrglossmark}{}
\newcommand*{\@@glsxtrwrglossmark}{}
\AtBeginDocument{\renewcommand*{\@@glsxtrwrglossmark}{\@glsxtrwrglossmark}}
\newcommand*{\glsxtrwrglossmark}{\ensuremath{\cdot}}
\newcommand\@glsxtr@doshowtarget[2]{#2}
\define@choicekey{glossaries-extra.sty}{debug}
 [\@glsxtr@debugval\@glsxtr@debugnr]%
 {true,false,showtargets,showwrgloss,all,showaccsupp}[true]{%
   \ifcase\@glsxtr@debugnr\relax % true
    \glsxtr@dooption{debug=true}%
    \renewcommand*{\@glsxtrwrglossmark}{}%
   \or % false
    \glsxtr@dooption{debug=false}%
    \renewcommand*{\@glsxtrwrglossmark}{}%
     \let\@glsxtr@doshowtarget\@secondoftwo
   \or % showtargets
    \glsxtr@dooption{debug=showtargets}%
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetleft}%
   \or % showwrgloss
    \glsxtr@dooption{debug=true}%
    \renewcommand*{\@glsxtrwrglossmark}{\glsxtrwrglossmark}%
   \or % all
    \glsxtr@dooption{debug=showtargets,debug=showaccsupp}%
    \renewcommand*{\@glsxtrwrglossmark}{\glsxtrwrglossmark}%
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetleft}%
   \or % showaccsupp
    \glsxtr@dooption{debug=showaccsupp}%
   \fi
 }
\newcommand*{\glsxtrshowtargetouter}{\glsshowtargetouter}
\newcommand*{\glsxtrshowtargetinner}[1]{\glsshowtargetinner{#1}}
\newcommand{\@glsxtrshowtargetleft}[2]{\@glsshowtarget{#1}#2\@glsxtrshowtargetmark}%
\newcommand{\@glsxtrshowtargetright}[2]{\@glsxtrshowtargetmark#2\@glsshowtarget{#1}}%
\newcommand{\@glsxtrshowtargetmark}{}%
\define@choicekey{glossaries-extra.sty}{showtargets}
 [\@glsxtr@showtargetsval\@glsxtr@showtargetsnr]%
 {left,right,innerleft,innerright,annoteleft,annoteright}%
 {%
   \glsxtr@dooption{debug=showtargets}%
   \ifcase\@glsxtr@showtargetsnr\relax
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetleft}%
     \def\glsxtrshowtargetouter{\glsshowtargetouter}%
     \def\glsxtrshowtargetinner{\glsshowtargetinner}%
     \let\@glsxtrshowtargetmark\empty
   \or
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetright}%
     \def\glsxtrshowtargetouter{\glsshowtargetouter}%
     \def\glsxtrshowtargetinner{\glsshowtargetinner}%
     \let\@glsxtrshowtargetmark\empty
   \or
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetleft}%
     \def\glsxtrshowtargetouter{\glsxtrshowtargetinner}%
     \def\glsxtrshowtargetinner{\glsshowtargetinnersymleft}%
     \let\@glsxtrshowtargetmark\empty
   \or
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetright}%
     \def\glsxtrshowtargetouter{\glsxtrshowtargetinner}%
     \def\glsxtrshowtargetinner{\glsshowtargetinnersymright}%
     \let\@glsxtrshowtargetmark\empty
   \or
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetleft}%
     \def\glsxtrshowtargetouter{\glsxtrshowtargetinner}%
     \def\glsxtrshowtargetinner{\glsshowtargetinnersymleft}%
     \def\@glsxtrshowtargetmark{\@glsshowtargetmarkfmt\glsxtrshowtargetsymbolright}%
   \or
     \def\@glsxtr@doshowtarget{\@glsxtrshowtargetright}%
     \def\glsxtrshowtargetouter{\glsxtrshowtargetinner}%
     \def\glsxtrshowtargetinner{\glsshowtargetinnersymright}%
     \def\@glsxtrshowtargetmark{\@glsshowtargetmarkfmt\glsxtrshowtargetsymbolleft}%
   \fi
 }
\DeclareOptionX*{%
 \expandafter\glsxtr@dooption\expandafter{\CurrentOption}}
\ProcessOptionsX
\RequirePackage{glossaries}
\@glsxtr@doaccsupp
\@glsxtr@doloadprefix
\@glsxtr@defpostpunc
\def\glsdoshowtarget{\@glsxtr@doshowtarget}
\newcommand{\glsxtrshowtargetsymbolright}{{\tiny$\triangleleft$}}%
\newcommand{\glsxtrshowtargetsymbolleft}{{\tiny$\triangleright$}}%
\providecommand*{\glsshowtargetinner}[1]{{\glsshowtargetfont [#1]}}
\providecommand*{\glsshowtargetfont}{\ttfamily\footnotesize}
\newcommand*{\glsshowtargetinnersymleft}[1]{%
 \glsshowtargetinner{#1}\allowbreak\glsxtrshowtargetsymbolleft}
\newcommand*{\glsshowtargetinnersymright}[1]{%
 \glsxtrshowtargetsymbolright\allowbreak\glsshowtargetinner{#1}}
\providecommand*{\glsshowtargetouter}[1]{%
 \glsshowtargetsymbol\marginpar{\glsshowtargetsymbol\glsshowtargetfont #1}}
\providecommand*{\@glsshowtarget}[1]{}
\def\glsshowtarget#1{%
 \glsxtrtitleorpdforheading
 {%
   \ifmmode
     \nfss@text{\glsxtrshowtargetinner{#1}}%
   \else
     \ifinner
       \glsxtrshowtargetinner{#1}%
     \else
       \glsxtrshowtargetouter{#1}%
     \fi
   \fi
 }%
 {[#1]}%
 {{\protect\glsshowtargetinner{#1}}}%
}
\newcommand*{\@glsshowtargetmarkfmt}[1]{%
 \glsxtrtitleorpdforheading
 {%
   \ifmmode \nfss@text{#1}\else #1\fi
 }%
 {}%
 {\ifmmode \nfss@text{#1}\else #1\fi}%
}
\let\@glsxtr@org@doseeglossary\@do@seeglossary
\newcommand*{\@glsxtr@doseeglossary}[2]{%
  \glsdoifexists{#1}%
  {%
    \@@glsxtrwrglossmark
    \@glsxtr@org@doseeglossary{#1}{#2}%
  }%
}
\newcommand*{\@glsxtr@dosee@alsoindex@glossary}[2]{%
  \@glsxtr@recordsee{#1}{#2}%
  \@glsxtr@doseeglossary{#1}{#2}%
}
\let\@glsxtr@org@gloautosee\@glo@autosee
\if@glsxtr@autoseeindex
\else
  \ifdef\@glsxtr@org@gloautosee
  {}%
  {\PackageError{glossaries-extra}{`autoseeindex=false' package
   option requires at least v4.30 of glossaries.sty}%
   {You need to update the glossaries.sty package}%
  }
\fi
\ifdef\@glo@autosee
{%
  \renewcommand*{\@glo@autosee}{%
    \if@glsxtr@autoseeindex\@glsxtr@org@gloautosee\fi}%
}%
{}
\renewcommand*{\gls@checkseeallowed}{%
 \if@glsxtr@autoseeindex\@gls@see@noindex\fi
}
\@glsxtr@abbreviationsdef
\let\@glsxtr@abbreviationsdef\relax
\@glsxtr@setupshortcuts
\@glsxtr@redef@forglsentries
\renewcommand{\glsxtr@dooption}[1]{\setupglossaries{#1}}%
\disable@keys{glossaries-extra.sty}{accsupp}
\newcommand*{\glossariesextrasetup}[1]{%
  \let\glsxtr@setup@record\relax
  \let\@glsxtr@setupshortcuts\relax
  \let\@glsxtr@redef@forglsentries\relax
  \let\@glsxtr@doloadprefix\relax
  \setkeys{glossaries-extra.sty}{#1}%
  \@glsxtr@abbreviationsdef
  \let\@glsxtr@abbreviationsdef\relax
  \@glsxtr@setupshortcuts
  \glsxtr@setup@record
  \@glsxtr@redef@forglsentries
  \@glsxtr@doloadprefix
}
\let\glsxtr@org@@do@wrglossary\@@do@wrglossary
\newcommand*{\glsxtr@@do@wrglossary}[1]{%
 \@@glsxtrwrglossmark
 \glsxtr@inc@wrglossaryctr{#1}%
 \glsxtr@org@@do@wrglossary{#1}%
}
\let\glsxtr@saveentrycounter\@gls@saveentrycounter
\let\@gls@saveentrycounter\glsxtr@indexonly@saveentrycounter
\renewcommand*\@gls@getcounterprefix[2]{%
  \protected@edef\@gls@thisloc{#1}\protected@edef\@gls@thisHloc{#2}%
  \ifx\@gls@thisloc\@gls@thisHloc
    \def\@glo@counterprefix{}%
  \else
    \def\@gls@get@counterprefix##1.#1##2\end@getprefix{%
      \def\@glo@tmp{##2}%
      \ifx\@glo@tmp\@empty
        \def\@glo@counterprefix{}%
      \else
        \def\@glo@counterprefix{##1}%
      \fi
    }%
    \@gls@get@counterprefix#2.#1\end@getprefix
    \ifx\@glo@counterprefix\@empty
      \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
      \else
        \GlossariesExtraWarning{Hyper target `#2' can't be formed by
         prefixing^^Jlocation `#1'. You need to modify the
         definition of \string\theH\@gls@counter^^Jotherwise you
         will get the warning: "`name{\@gls@counter.#1}' has been^^J
         referenced but does not exist"%
         \ifx\@glsxtr@record@setting\@glsxtr@record@setting@only
         . You may want to consider using record=nameref instead%
         \fi}%
      \fi
    \fi
  \fi
}
\newcommand*{\@glsxtrdialecthook}{}
\glsxtr@setup@record
\AtBeginDocument{%
  \disable@keys{glossaries-extra.sty}{abbreviations,docdef,record}%
  \def\@glsxtrundeftag{\glsxtrundeftag}%
}
\newcommand*{\GlsXtrIfUnusedOrUndefined}[3]{%
  \ifglsentryexists{#1}%
  {\ifbool{glo@\glsdetoklabel{#1}@flag}{#3}{#2}}%
  {#2}%
}
\ifdef\s@ifglossaryexists
{}
{
  \renewcommand{\ifglossaryexists}{%
    \@ifstar\s@ifglossaryexists\@ifglossaryexists
  }
  \newcommand{\@ifglossaryexists}[3]{%
    \ifcsundef{@glotype@#1@out}{#3}{#2}%
  }
  \newcommand{\s@ifglossaryexists}[3]{%
    \ifcsundef{glolist@#1}{#3}{#2}%
  }
}
\newcommand{\glsxtrifemptyglossary}[3]{%
  \ifcsdef{glolist@#1}%
  {%
    \ifcsstring{glolist@#1}{,}{#2}{#3}%
  }%
  {%
    \glsxtrundefaction{Glossary type `#1' doesn't exist}{}%
    #2%
  }%
}
\newcommand*{\glsxtrifkeydefined}[3]{%
  \key@ifundefined{glossentry}{#1}{#3}{#2}%
}
\newcommand*{\glsxtrprovidestoragekey}{%
  \@ifstar\@sglsxtr@provide@storagekey\@glsxtr@provide@storagekey
}
\newcommand*{\@glsxtr@provide@storagekey}[3]{%
  \key@ifundefined{glossentry}{#1}%
  {%
    \define@key{glossentry}{#1}{\csdef{@glo@#1}{##1}}%
    \appto\@gls@keymap{,{#1}{#1}}%
    \appto\@newglossaryentryprehook{\csdef{@glo@#1}{#2}}%
    \appto\@newglossaryentryposthook{%
      \letcs{\@glo@tmp}{@glo@#1}%
      \gls@assign@field{#2}{\@glo@label}{#1}{\@glo@tmp}%
    }%
    \ifblank{#3}
    {}%
    {%
       \newcommand*{#3}[1]{\@gls@entry@field{##1}{#1}}%
    }%
  }%
  {%
    \ifblank{#3}
    {}%
    {%
      \providecommand*{#3}[1]{\@gls@entry@field{##1}{#1}}%
    }%
  }%
}
\newcommand*{\s@glsxtr@provide@storagekey}[1]{%
  \key@ifundefined{glossentry}{#1}%
  {%
    \expandafter\newcommand\expandafter*\expandafter
     {\csname gls@assign@#1@field\endcsname}[2]{%
       \@@gls@expand@field{##1}{#1}{##2}%
     }%
  }%
  {}%
  \@glsxtr@provide@addstoragekey{#1}%
}
\newcommand{\GlsXtrFmtField}{useri}
\newcommand{\GlsXtrFmtDefaultOptions}{noindex}
\newrobustcmd*{\glsxtrfmt}{\@ifstar\s@glsxtrfmt\@glsxtrfmt}
\newcommand*{\@glsxtrfmt}[3][]{\@@glsxtrfmt{#1}{#2}{#3}{}}
\newcommand*{\s@glsxtrfmt}[3][]{%
 \new@ifnextchar[{\s@@glsxtrfmt{#1}{#2}{#3}}%
  {\@@glsxtrfmt{#1}{#2}{#3}{}}%
}
\def\s@@glsxtrfmt#1#2#3[#4]{\@@glsxtrfmt{#1}{#2}{#3}{#4}}
\newcommand*{\@@glsxtrfmt}[4]{%
 \begingroup
   \def\glslabel{#2}%
   \glsdoifexistsordo{#2}%
   {%
     \ifglshasfield{\GlsXtrFmtField}{#2}%
     {%
       \let\do@gls@link@checkfirsthyper\relax
       \expandafter\@gls@link\expandafter[\GlsXtrFmtDefaultOptions,#1]{#2}%
         {\glsxtrfmtdisplay{\glscurrentfieldvalue}{#3}{#4}}%
     }%
     {\glsxtrfmtdisplay{@firstofone}{#3}{#4}}%
   }%
   {%
     \begingroup
       \@gls@setdefault@glslink@opts
       \setkeys{glslink}{\GlsXtrFmtDefaultOptions,#1}%
       \ifKV@glslink@noindex\else\glsadd{#2}\fi
     \endgroup
     \glsxtrfmtdisplay{@firstofone}{#3}{#4}%
   }%
 \endgroup
}
\newcommand{\glsxtrfmtdisplay}[3]{\csuse{#1}{#2}#3}
\ifdef\texorpdfstring
{
  \newcommand*{\glsxtrentryfmt}[2]{%
    \texorpdfstring{\@glsxtrentryfmt{#1}{#2}}{\glsxtrpdfentryfmt{#1}{#2}}%
  }
}
{
  \newcommand*{\glsxtrentryfmt}{\@glsxtrentryfmt}
}
\newcommand*{\glsxtrpdfentryfmt}[2]{#2}
\newrobustcmd*{\@glsxtrentryfmt}[2]{%
 {%
   \protected@edef\glslabel{#1}%
   \glsdoifexistsordo{#1}%
   {%
     \ifglshasfield{\GlsXtrFmtField}{#1}%
     {%
       \csuse{\glscurrentfieldvalue}{#2}%
     }%
     {#2}%
   }%
   {#2}%
 }%
}
\newcommand*{\glsxtrfieldlistadd}[3]{%
  \listcsadd{glo@\glsdetoklabel{#1}@#2}{#3}%
}
\newcommand*{\glsxtrfieldlistgadd}[3]{%
  \listcsgadd{glo@\glsdetoklabel{#1}@#2}{#3}%
}
\newcommand*{\glsxtrfieldlisteadd}[3]{%
  \listcseadd{glo@\glsdetoklabel{#1}@#2}{#3}%
}
\newcommand*{\glsxtrfieldlistxadd}[3]{%
  \listcsxadd{glo@\glsdetoklabel{#1}@#2}{#3}%
}
\newcommand*{\glsxtrfielddolistloop}[2]{%
  \dolistcsloop{glo@\glsdetoklabel{#1}@#2}%
}
\newcommand*{\glsxtrfieldforlistloop}[3]{%
  \forlistcsloop{#3}{glo@\glsdetoklabel{#1}@#2}%
}
\newrobustcmd*{\glsxtrfieldformatlist}[2]{%
 \begingroup
  \def\@dtl@formatlist@itemsep{}%
  \def\@dtl@formatlist@lastitem{}%
  \def\@dtl@formatlist@prelastitem{}%
  \def\@dtl@formatlist@prelastitemsep{}%
  \forlistcsloop{\@dtl@formatlist@handler}{glo@\glsdetoklabel{#1}@#2}%
  \@dtl@formatlist@prelastitem\@dtl@formatlist@lastitem
 \endgroup
}
\newcommand*{\glsxtrfieldifinlist}[5]{%
  \ifinlistcs{#3}{glo@\glsdetoklabel{#1}@#2}{#4}{#5}%
}
\newcommand*{\glsxtrfieldxifinlist}[5]{%
  \xifinlistcs{#3}{glo@\glsdetoklabel{#1}@#2}{#4}{#5}%
}
\newcommand*{\glsxtrforcsvfield}{%
  \@ifstar\s@glsxtrforcsvfield\@glsxtrforcsvfield
}
\newcommand*{\@glsxtrforcsvfield}[3]{%
 \@glsxtrifhasfield{#2}{#1}%
 {%
   \let\glsxtrendfor\@endfortrue
   \@for\@glsxtr@label:=\glscurrentfieldvalue\do
   {\expandafter#3\expandafter{\@glsxtr@label}}}%
 {}%
}
\newcommand*{\s@glsxtrforcsvfield}[3]{%
 \s@glsxtrifhasfield{#2}{#1}%
 {%
   \let\glsxtrendfor\@endfortrue
   \@for\@glsxtr@label:=\glscurrentfieldvalue\do
   {\expandafter#3\expandafter{\@glsxtr@label}}}%
 {}%
}
\newrobustcmd*{\glsxtrfieldformatcsvlist}[2]{%
 \@glsxtrifhasfield{#2}{#1}%
 {\@dtlformatlist\glscurrentfieldvalue}%
 {}%
}
\newcommand*{\GlsXtrIfFieldValueInCsvList}{%
  \@ifstar\s@GlsXtrIfFieldValueInCsvList\@GlsXtrIfFieldValueInCsvList
}
\newcommand*{\@GlsXtrIfFieldValueInCsvList}[5]{%
 \@glsxtrifhasfield{#2}{#1}%
 {%
   \expandafter\DTLifinlist\expandafter{\glscurrentfieldvalue}%
   {#3}{#4}{#5}%
 }%
 {#5}%
}
\newcommand*{\s@GlsXtrIfFieldValueInCsvList}[5]{%
 \s@glsxtrifhasfield{#2}{#1}%
 {%
   \expandafter\DTLifinlist\expandafter{\glscurrentfieldvalue}%
   {#3}{#4}{#5}%
 }%
 {#5}%
}
\newcommand*{\GlsXtrIfValueInFieldCsvList}{%
  \@ifstar\s@GlsXtrIfValueInFieldCsvList\@GlsXtrIfValueInFieldCsvList
}
\newcommand*{\@GlsXtrIfValueInFieldCsvList}[5]{%
 \@glsxtrifhasfield{#2}{#1}%
 {%
   \DTLifinlist{#3}{\glscurrentfieldvalue}{#4}{#5}%
 }%
 {#5}%
}
\newcommand*{\s@GlsXtrIfValueInFieldCsvList}[5]{%
 \s@glsxtrifhasfield{#2}{#1}%
 {%
   \DTLifinlist{#3}{\glscurrentfieldvalue}{#4}{#5}%
 }%
 {#5}%
}
\newcommand*{\xGlsXtrIfValueInFieldCsvList}{%
  \@ifstar\s@xGlsXtrIfValueInFieldCsvList\@xGlsXtrIfValueInFieldCsvList
}
\newcommand*{\@xGlsXtrIfValueInFieldCsvList}[5]{%
 \@glsxtrifhasfield{#2}{#1}%
 {%
   \protected@edef\@gls@tmp{#3}%
   \expandafter\DTLifinlist\expandafter{\@gls@tmp}{\glscurrentfieldvalue}{#4}{#5}%
 }%
 {#5}%
}
\newcommand*{\s@xGlsXtrIfValueInFieldCsvList}[5]{%
 \s@glsxtrifhasfield{#2}{#1}%
 {%
   \protected@edef\@gls@tmp{#3}%
   \expandafter\DTLifinlist\expandafter{\@gls@tmp}{\glscurrentfieldvalue}{#4}{#5}%
 }%
 {#5}%
}
\newrobustcmd{\glsxtrifhasfield}{%
  \@ifstar{\s@glsxtrifhasfield}{\@glsxtrifhasfield}%
}
\newcommand{\@glsxtrifhasfield}[4]{%
  {\s@glsxtrifhasfield{#1}{#2}{#3}{#4}}%
}
\newcommand{\s@glsxtrifhasfield}[4]{%
  \letcs{\glscurrentfieldvalue}{glo@\glsdetoklabel{#2}@#1}%
  \ifundef\glscurrentfieldvalue
  {#4}%
  {%
   \ifdefempty\glscurrentfieldvalue{#4}{#3}%
  }%
}
\newcommand{\GlsXtrIfFieldNonZero}{%
  \@ifstar\s@GlsXtrIfFieldNonZero\@GlsXtrIfFieldNonZero
}
\newcommand{\@GlsXtrIfFieldNonZero}[4]{%
  \@GlsXtrIfFieldCmpNum{#1}{#2}{=}{0}{#4}{#3}%
}
\newcommand{\s@GlsXtrIfFieldNonZero}[4]{%
  \s@GlsXtrIfFieldCmpNum{#1}{#2}{=}{0}{#4}{#3}%
}
\newcommand{\GlsXtrIfFieldEqNum}{%
  \@ifstar\s@GlsXtrIfFieldEqNum\@GlsXtrIfFieldEqNum
}
\newcommand{\@GlsXtrIfFieldEqNum}[5]{%
  \@GlsXtrIfFieldCmpNum{#1}{#2}{=}{#3}{#4}{#5}%
}
\newcommand{\s@GlsXtrIfFieldEqNum}[5]{%
  \s@GlsXtrIfFieldCmpNum{#1}{#2}{=}{#3}{#4}{#5}%
}
\newcommand{\GlsXtrIfFieldCmpNum}{%
  \@ifstar\s@GlsXtrIfFieldCmpNum\@GlsXtrIfFieldCmpNum
}
\newcommand{\@GlsXtrIfFieldCmpNum}[6]{%
  {%
    \letcs{\glscurrentfieldvalue}{glo@\glsdetoklabel{#2}@#1}%
    \ifundef\glscurrentfieldvalue
    {\def\glscurrentfieldvalue{0}}%
    {%
     \ifdefempty\glscurrentfieldvalue
     {\def\glscurrentfieldvalue{0}}%
     {}%
    }%
    \ifnum\glscurrentfieldvalue#3#4\relax #5\else #6\fi
  }%
}
\newcommand{\s@GlsXtrIfFieldCmpNum}[6]{%
  \letcs{\glscurrentfieldvalue}{glo@\glsdetoklabel{#2}@#1}%
  \ifundef\glscurrentfieldvalue
  {\def\glscurrentfieldvalue{0}}%
  {%
   \ifdefempty\glscurrentfieldvalue
   {\def\glscurrentfieldvalue{0}}%
   {}%
  }%
  \ifnum\glscurrentfieldvalue#3#4\relax #5\else #6\fi
}
\newcommand{\GlsXtrIfFieldUndef}[2]{%
 \ifcsundef{glo@\glsdetoklabel{#2}@#1}%
}
\newcommand*{\glsxtrusefield}[2]{%
  \@gls@entry@field{#1}{#2}%
}
\ifdef\texorpdfstring
{
  \newcommand*{\Glsxtrusefield}[2]{%
    \texorpdfstring
     {\@Gls@entry@field{#1}{#2}}
     {\@gls@entry@field{#1}{#2}}%
  }
}
{
  \newcommand*{\Glsxtrusefield}[2]{%
    \@Gls@entry@field{#1}{#2}%
  }
}
\ifdef\texorpdfstring
{
  \newcommand*{\GLSxtrusefield}[2]{%
    \texorpdfstring
     {\glsdoifexists{#1}{\mfirstucMakeUppercase{\@gls@entry@field{#1}{#2}}}}%
     {\@gls@entry@field{#1}{#2}}%
  }
}
{
  \newcommand*{\GLSxtrusefield}[2]{%
    \glsdoifexists{#1}{\mfirstucMakeUppercase{\@gls@entry@field{#1}{#2}}}%
  }
}
\newcommand*{\glsxtrentryparentname}[1]{%
  \ifcsdef{glo@\glsdetoklabel{#1}@parent}%
  {\csuse{glo@\csuse{glo@\glsdetoklabel{#1}@parent}@name}}%
  {}%
}
\newcommand*{\glsxtrdeffield}[2]{\csdef{glo@\glsdetoklabel{#1}@#2}}
\newcommand*{\glsxtredeffield}[2]{\protected@csedef{glo@\glsdetoklabel{#1}@#2}}
\newcommand*{\glsxtrapptocsvfield}[3]{%
 \ifcsdef{glo@\glsdetoklabel{#1}@#2}%
 {\csappto{glo@\glsdetoklabel{#1}@#2}{,#3}}%
 {\csdef{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
\newcommand*{\glsxtrsetfieldifexists}[3]{\glsdoifexists{#1}{#3}}
\newrobustcmd*{\GlsXtrSetField}[3]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\csdef{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
\newrobustcmd*{\GlstrLetField}[3]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\cslet{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
\newrobustcmd*{\csGlsXtrLetField}[3]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\csletcs{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
\newrobustcmd*{\GlsXtrLetFieldToField}[4]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\csletcs{glo@\glsdetoklabel{#1}@#2}{glo@\glsdetoklabel{#3}@#4}}%
}
\newrobustcmd*{\gGlsXtrSetField}[3]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\csgdef{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
\newrobustcmd*{\xGlsXtrSetField}[3]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\protected@csxdef{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
\newrobustcmd*{\eGlsXtrSetField}[3]{%
  \glsxtrsetfieldifexists{#1}{#2}%
  {\protected@csedef{glo@\glsdetoklabel{#1}@#2}{#3}}%
}
\newcommand*{\GlsXtrIfFieldEqStr}{%
  \@ifstar\s@GlsXtrIfFieldEqStr\@GlsXtrIfFieldEqStr
}
\newrobustcmd*{\@GlsXtrIfFieldEqStr}[5]{%
  \@glsxtrifhasfield{#1}{#2}%
  {%
    \ifdefstring{\glscurrentfieldvalue}{#3}{#4}{#5}%
  }%
  {#5}%
}
\newrobustcmd*{\s@GlsXtrIfFieldEqStr}[5]{%
  \s@glsxtrifhasfield{#1}{#2}%
  {%
    \ifdefstring{\glscurrentfieldvalue}{#3}{#4}{#5}%
  }%
  {#5}%
}
\newcommand*{\GlsXtrIfFieldEqXpStr}{%
  \@ifstar\s@GlsXtrIfFieldEqXpStr\@GlsXtrIfFieldEqXpStr
}
\newrobustcmd*{\@GlsXtrIfFieldEqXpStr}[5]{%
  \@glsxtrifhasfield{#1}{#2}%
  {%
    \protected@edef\@gls@tmp{#3}%
    \ifdefequal{\glscurrentfieldvalue}{\@gls@tmp}{#4}{#5}%
  }%
  {#5}%
}
\newrobustcmd*{\s@GlsXtrIfFieldEqXpStr}[5]{%
  \s@glsxtrifhasfield{#1}{#2}%
  {%
    \protected@edef\@gls@tmp{#3}%
    \ifdefequal{\glscurrentfieldvalue}{\@gls@tmp}{#4}{#5}%
  }%
  {#5}%
}
\newcommand*{\GlsXtrIfXpFieldEqXpStr}{%
  \@ifstar\s@GlsXtrIfXpFieldEqXpStr\@GlsXtrIfXpFieldEqXpStr
}
\newrobustcmd*{\@GlsXtrIfXpFieldEqXpStr}[5]{%
  \@glsxtrifhasfield{#1}{#2}%
  {%
    \protected@edef\@gls@tmp{\glscurrentfieldvalue}%
    \let\glscurrentfieldvalue\@gls@tmp
    \protected@edef\@gls@tmp{#3}%
    \ifdefequal{\glscurrentfieldvalue}{\@gls@tmp}{#4}{#5}%
  }%
  {#5}%
}
\newrobustcmd*{\s@GlsXtrIfXpFieldEqXpStr}[5]{%
  \s@glsxtrifhasfield{#1}{#2}%
  {%
    \protected@edef\@gls@tmp{\glscurrentfieldvalue}%
    \let\glscurrentfieldvalue\@gls@tmp
    \protected@edef\@gls@tmp{#3}%
    \ifdefequal{\glscurrentfieldvalue}{\@gls@tmp}{#4}{#5}%
  }%
  {#5}%
}
\ifdef\foreignlanguage
{
  \ifdef\GetTrackedDialectFromLanguageTag
  {
    \newcommand{\GlsXtrForeignText}[2]{%
      \let\@glsxtr@org@currentfieldvalue\glscurrentfieldvalue
      \glsxtrifhasfield{\GlsXtrForeignTextField}{#1}%
      {%
        \expandafter\GetTrackedDialectFromLanguageTag\expandafter
          {\glscurrentfieldvalue}{\@glsxtr@dialect}%
        \let\@glsxtr@locale\glscurrentfieldvalue
        \let\glscurrentfieldvalue\@glsxtr@org@currentfieldvalue
        \ifdefempty\@glsxtr@dialect
        {%
          \ifundef\TrackedDialectClosestSubMatch
          {%
            \GlossariesExtraWarning{Can't obtain dialect label
              (tracklang v1.3.6+ required)}%
          }%
          {\let\@glsxtr@dialect\TrackedDialectClosestSubMatch}%
        }%
        {}%
        \ifdefempty\@glsxtr@dialect
        {%
        }%
        {%
          \ifcsundef{captions\@glsxtr@dialect}{}%
          {%
            \IfTrackedDialectHasMapping{\@glsxtr@dialect}%
            {%
              \edef\@glsxtr@dialect{%
                \GetTrackedDialectToMapping{\@glsxtr@dialect}}%
              \ifcsundef{captions\@glsxtr@dialect}{}%
              {%
                \ifcsundef{captions\@tracklang@lang}{}%
                {%
                  \let\@glsxtr@dialect\@tracklang@lang
                }%
              }%
            }%
            {%
              \ifcsundef{captions\@tracklang@lang}{}%
              {%
                \let\@glsxtr@dialect\@tracklang@lang
              }%
            }%
          }%
        }%
        \ifdefempty\@glsxtr@dialect
        {%
          \GlsXtrUnknownDialectWarning{\@glsxtr@locale}{\@tracklang@lang}%
          #2%
        }%
        {\foreignlanguage{\@glsxtr@dialect}{#2}}%
      }%
      {#2}% key not set
    }
  }
  {
    \newcommand{\GlsXtrForeignText}[2]{%
      \GlossariesExtraWarning{Can't encapsulate foreign text:
        tracklang v1.3.6+ required}%
      #2%
    }
  }
}
{
  \newcommand{\GlsXtrForeignText}[2]{#2}
}
\newcommand*{\GlsXtrForeignTextField}{userii}
\newcommand*{\GlsXtrUnknownDialectWarning}[2]{%
  \GlossariesExtraWarning{Can't determine valid dialect label
   for locale `#1' (root language: #2)}%
}
\ifdef\GlsEntryCounterLabelPrefix
{%
  \newcommand*{\glsxtrpageref}[1]{%
    \ifglsentrycounter
      \pageref{\GlsEntryCounterLabelPrefix\glsdetoklabel{#1}}%
    \else
      \ifglssubentrycounter
        \pageref{\GlsEntryCounterLabelPrefix\glsdetoklabel{#1}}%
      \else
        \gls{#1}%
      \fi
    \fi
  }
}%
{%
  \newcommand*{\glsxtrpageref}[1]{%
    \ifglsentrycounter
      \pageref{glsentry-\glsdetoklabel{#1}}%
    \else
      \ifglssubentrycounter
        \pageref{glsentry-\glsdetoklabel{#1}}%
      \else
        \gls{#1}%
      \fi
    \fi
  }
}%
\newcommand{\apptoglossarypreamble}[2][\glsdefaulttype]{%
  \ifcsdef{glolist@#1}%
  {%
   \ifcsundef{@glossarypreamble@#1}%
   {\csdef{@glossarypreamble@#1}{}}%
   {}%
   \csappto{@glossarypreamble@#1}{#2}%
  }%
  {%
    \GlossariesExtraWarning{Glossary `#1' is not defined}%
  }%
}
\newcommand{\preglossarypreamble}[2][\glsdefaulttype]{%
  \ifcsdef{glolist@#1}%
  {%
   \ifcsundef{@glossarypreamble@#1}%
   {\csdef{@glossarypreamble@#1}{}}%
   {}%
   \cspreto{@glossarypreamble@#1}{#2}%
  }%
  {%
    \GlossariesExtraWarning{Glossary `#1' is not defined}%
  }%
}
\ifdef\@gls@entry@field
{
 \renewcommand*{\@gls@entry@field}[2]{\csuse{glo@\glsdetoklabel{#1}@#2}}
}
{}
\renewcommand*{\ifglsused}[3]{%
  \glsdoifexists{#1}{\ifbool{glo@\glsdetoklabel{#1}@flag}{#2}{#3}}%
}
\renewcommand*{\longnewglossaryentry}{%
 \@ifstar\@glsxtr@s@longnewglossaryentry\@glsxtr@longnewglossaryentry
}
\newcommand{\@glsxtr@s@longnewglossaryentry}[3]{%
  \glsdoifnoexists{#1}%
  {%
     \bgroup
       \let\@org@newglossaryentryprehook\@newglossaryentryprehook
       \long\def\@newglossaryentryprehook{%
         \long\def\@glo@desc{#3}%
         \@org@newglossaryentryprehook
       }%
       \renewcommand*{\gls@assign@desc}[1]{%
          \global\cslet{glo@\glsdetoklabel{#1}@desc}{\@glo@desc}%
          \global\cslet{glo@\glsdetoklabel{#1}@descplural}{\@glo@descplural}%
        }
       \gls@defglossaryentry{#1}{#2}%
     \egroup
  }%
}
\newcommand{\@glsxtr@longnewglossaryentry}[3]{%
  \glsdoifnoexists{#1}%
  {%
     \bgroup
       \let\@org@newglossaryentryprehook\@newglossaryentryprehook
       \long\def\@newglossaryentryprehook{%
         \long\def\@glo@desc{#3\glsxtrpostlongdescription}%
         \@org@newglossaryentryprehook
       }%
       \renewcommand*{\gls@assign@desc}[1]{%
          \global\cslet{glo@\glsdetoklabel{#1}@desc}{\@glo@desc}%
          \global\cslet{glo@\glsdetoklabel{#1}@descplural}{\@glo@descplural}%
        }
       \gls@defglossaryentry{#1}{#2}%
     \egroup
  }%
}
\newcommand*{\glsxtrpostlongdescription}{\leavevmode\unskip\nopostdesc}
\renewcommand{\newignoredglossary}{%
 \@ifstar\glsxtr@s@newignoredglossary\glsxtr@org@newignoredglossary
}
\newcommand*{\glsxtr@org@newignoredglossary}[1]{%
  \ifcsdef{glolist@#1}
  {%
    \glsxtrundefaction{Glossary type `#1' already exists}{}%
  }%
  {%
    \ifdefempty\@ignored@glossaries
    {%
      \protected@edef\@ignored@glossaries{#1}%
    }%
    {%
      \protected@eappto\@ignored@glossaries{,#1}%
    }%
    \csgdef{glolist@#1}{,}%
    \ifcsundef{gls@#1@entryfmt}%
    {%
      \defglsentryfmt[#1]{\glsentryfmt}%
    }%
    {}%
    \ifdefempty\@gls@nohyperlist
    {%
       \renewcommand*{\@gls@nohyperlist}{#1}%
    }%
    {%
       \protected@eappto\@gls@nohyperlist{,#1}%
    }%
  }%
}
\newcommand*{\glsxtr@s@newignoredglossary}[1]{%
  \ifcsdef{glolist@#1}
  {%
    \glsxtrundefaction{Glossary type `#1' already exists}{}%
  }%
  {%
    \ifdefempty\@ignored@glossaries
    {%
      \protected@edef\@ignored@glossaries{#1}%
    }%
    {%
      \protected@eappto\@ignored@glossaries{,#1}%
    }%
    \csgdef{glolist@#1}{,}%
    \ifcsundef{gls@#1@entryfmt}%
    {%
      \defglsentryfmt[#1]{\glsentryfmt}%
    }%
    {}%
  }%
}
\glsifusetranslator
{%
  \renewcommand*{\glssettoctitle}[1]{%
    \ifcsdef{gls@tr@set@#1@toctitle}%
    {%
      \csuse{gls@tr@set@#1@toctitle}%
    }%
    {%
      \ifcsdef{@glotype@#1@title}%
      {\def\glossarytoctitle{\csname @glotype@#1@title\endcsname}}%
      {\def\glossarytoctitle{\glossarytitle}}%
    }%
  }%
}
{
  \renewcommand*{\glssettoctitle}[1]{%
    \ifcsdef{@glotype@#1@title}%
    {\def\glossarytoctitle{\csname @glotype@#1@title\endcsname}}%
    {\def\glossarytoctitle{\glossarytitle}}%
  }
}
\newcommand{\provideignoredglossary}{%
 \@ifstar\glsxtr@s@provideignoredglossary\glsxtr@provideignoredglossary
}
\newcommand*{\glsxtr@provideignoredglossary}[1]{%
  \ifcsdef{glolist@#1}
  {}%
  {%
    \ifdefempty\@ignored@glossaries
    {%
      \protected@edef\@ignored@glossaries{#1}%
    }%
    {%
      \protected@eappto\@ignored@glossaries{,#1}%
    }%
    \csgdef{glolist@#1}{,}%
    \ifcsundef{gls@#1@entryfmt}%
    {%
      \defglsentryfmt[#1]{\glsentryfmt}%
    }%
    {}%
    \ifdefempty\@gls@nohyperlist
    {%
       \renewcommand*{\@gls@nohyperlist}{#1}%
    }%
    {%
       \protected@eappto\@gls@nohyperlist{,#1}%
    }%
  }%
}
\newcommand*{\glsxtr@s@provideignoredglossary}[1]{%
  \ifcsdef{glolist@#1}
  {}%
  {%
    \ifdefempty\@ignored@glossaries
    {%
      \protected@edef\@ignored@glossaries{#1}%
    }%
    {%
      \protected@eappto\@ignored@glossaries{,#1}%
    }%
    \csgdef{glolist@#1}{,}%
    \ifcsundef{gls@#1@entryfmt}%
    {%
      \defglsentryfmt[#1]{\glsentryfmt}%
    }%
    {}%
  }%
}
\newcommand*{\glsxtrcopytoglossary}[2]{%
  \glsdoifexists{#1}%
  {%
    \ifcsdef{glolist@#2}
    {%
      \protected@cseappto{glolist@#2}{#1,}%
    }%
    {%
      \glsxtrundefaction{Glossary type `#2' doesn't exist}{}%
    }%
  }%
}
\renewcommand{\glsdoifexists}[2]{%
  \ifglsentryexists{#1}{#2}%
  {%
    \protected@edef\glslabel{\glsdetoklabel{#1}}%
    \glsxtrundefaction{Glossary entry `\glslabel'
    has not been defined}{You need to define a glossary entry before
    you can reference it.}%
  }%
}
\renewcommand{\glsdoifnoexists}[2]{%
   \ifglsentryexists{#1}{%
    \glsxtrundefaction{Glossary entry `\glsdetoklabel{#1}'
    has already been defined}{}}{#2}%
}
\ifdef\glsdoifexistsordo
{%
  \renewcommand{\glsdoifexistsordo}[3]{%
    \ifglsentryexists{#1}{#2}%
    {%
      \glsxtrundefaction{Glossary entry `\glsdetoklabel{#1}'
      has not been defined}{You need to define a glossary entry
      before you can use it.}%
      #3%
    }%
  }%
}
{%
  \glsxtr@warnonexistsordo\glsdoifexistsordo
  \newcommand{\glsdoifexistsordo}[3]{%
    \ifglsentryexists{#1}{#2}%
    {%
      \glsxtrundefaction{Glossary entry `\glsdetoklabel{#1}'
      has not been defined}{You need to define a glossary entry
      before you can use it.}%
      #3%
    }%
  }%
}
\ifdef\doifglossarynoexistsordo
{%
  \renewcommand{\doifglossarynoexistsordo}[3]{%
    \ifglossaryexists*{#1}%
    {%
      \glsxtrundefaction{Glossary type `#1' already exists}{}%
      #3%
    }%
    {#2}%
  }%
}
{%
  \glsxtr@warnonexistsordo\doifglossarynoexistsordo
  \newcommand{\doifglossarynoexistsordo}[3]{%
    \ifglossaryexists*{#1}%
    {%
      \glsxtrundefaction{Glossary type `#1' already exists}{}%
      #3%
    }%
    {#2}%
  }%
}

\appto\@newglossaryentryposthook{%
  \ifdefvoid\@glo@see
   {\csxdef{glo@\@glo@label @see}{}}%
   {%
     \csxdef{glo@\@glo@label @see}{\@glo@see}%
     \if@glsxtr@autoseeindex
       \@glsxtr@autoindexcrossrefs
     \fi
   }%
}
\appto\@gls@keymap{,{see}{see}}
\newcommand*{\glsxtrusesee}[1]{%
  \glsdoifexists{#1}%
  {%
    \letcs{\@glo@see}{glo@\glsdetoklabel{#1}@see}%
    \ifdefempty\@glo@see
    {}%
    {%
      \expandafter\glsxtr@usesee\@glo@see\@end@glsxtr@usesee
    }%
  }%
}
\newcommand*{\glsxtr@usesee}[1][\seename]{%
  \@glsxtr@usesee[#1]%
}
\def\@glsxtr@usesee[#1]#2\@end@glsxtr@usesee{%
  \glsxtruseseeformat{#1}{#2}%
}
\newcommand*{\glsxtruseseeformat}[2]{%
  \glsseeformat[#1]{#2}{}%
}
\renewcommand*{\glsseeitemformat}[1]{%
 \ifglshasshort{#1}{\glsfmttext{#1}}{\glsfmtname{#1}}%
}
\newcommand*{\glsxtrhiername}[1]{%
  \glsdoifexists{#1}%
  {%
    \glsxtrifhasfield{parent}{#1}%
    {\glsxtrhiername{\glscurrentfieldvalue}\glsxtrhiernamesep}%
    {}%
    \ifglshasshort{#1}{\glsfmttext{#1}}{\glsfmtname{#1}}%
  }%
}
\newcommand*{\Glsxtrhiername}[1]{%
  \glsdoifexists{#1}%
  {%
    \glsxtrifhasfield{parent}{#1}%
    {%
      \Glsxtrhiername{\glscurrentfieldvalue}\glsxtrhiernamesep
      \ifglshasshort{#1}{\glsfmttext{#1}}{\glsfmtname{#1}}%
    }%
    {\ifglshasshort{#1}{\Glsfmttext{#1}}{\Glsfmtname{#1}}}%
  }%
}
\newcommand*{\GlsXtrhiername}[1]{%
  \glsdoifexists{#1}%
  {%
    \glsxtrifhasfield{parent}{#1}%
    {\GlsXtrhiername{\glscurrentfieldvalue}\glsxtrhiernamesep}%
    {}%
    \ifglshasshort{#1}{\Glsfmttext{#1}}{\Glsfmtname{#1}}%
  }%
}
\newcommand*{\GLSxtrhiername}[1]{%
  \glsdoifexists{#1}%
  {%
    \glsxtrifhasfield{parent}{#1}%
    {%
      \GLSxtrhiername{\glscurrentfieldvalue}\glsxtrhiernamesep
      \ifglshasshort{#1}{\glsfmttext{#1}}{\glsfmtname{#1}}%
    }%
    {\ifglshasshort{#1}{\GLSfmttext{#1}}{\GLSfmtname{#1}}}%
  }%
}
\newcommand*{\GLSXTRhiername}[1]{%
  \glsdoifexists{#1}%
  {%
    \glsxtrifhasfield{parent}{#1}%
    {\GLSXTRhiername{\glscurrentfieldvalue}\glsxtrhiernamesep}%
    {}
    \ifglshasshort{#1}{\GLSfmttext{#1}}{\GLSfmtname{#1}}%
  }%
}
\newcommand*{\glsxtrhiernamesep}{\,{\small$\triangleright$}\,}
\newcommand*{\glsxtruseseealso}[1]{%
  \glsdoifexists{#1}%
  {%
    \letcs{\@glo@see}{glo@\glsdetoklabel{#1}@seealso}%
    \ifdefempty\@glo@see
    {}%
    {%
      \expandafter\glsxtruseseealsoformat\expandafter{\@glo@see}%
    }%
  }%
}
\newcommand*{\glsxtrusealias}[1]{%
  \glsdoifexists{#1}%
  {%
    \letcs{\@glo@see}{glo@\glsdetoklabel{#1}@alias}%
    \ifdefempty\@glo@see
    {}%
    {%
      \glsxtruseseeformat{\seename}{\@glo@see}%
    }%
  }%
}
\newcommand*{\glsxtruseseealsoformat}[1]{%
  \glsseeformat[\seealsoname]{#1}{}%
}
\newrobustcmd{\glsxtrseelist}[1]{%
  \protected@edef\@glo@tmp{\noexpand\glsseelist{#1}}\@glo@tmp
}
\renewrobustcmd*{\glsseelist}[1]{%
  \let\@gls@dolast\relax
  \let\@gls@donext\relax
  \let\@glsseeitem\@glsxtr@seefirstitem
  \let\@glsseelastsep\glsseelastsep
  \@for\@gls@thislabel:=#1\do{%
    \ifx\@xfor@nextelement\@nnil
      \@gls@dolast
    \else
      \@gls@donext
    \fi
    \expandafter\@glsseeitem\expandafter{\@gls@thislabel}%
    \let\@gls@dolast\@glsseelastsep
    \let\@gls@donext\glsseesep
    \let\@glsseeitem\@glsxtr@seeitem
    \let\@glsseelastsep\glsseelastoxfordsep
  }%
}
\newcommand*{\@glsxtr@seeitem}[1]{%
 \glsxtrifmulti{#1}{\mglsseeitem{#1}}{\glsseeitem{#1}}%
}
\newcommand*{\@glsxtr@seefirstitem}[1]{%
 \glsxtrifmulti{#1}{\mglsseefirstitem{#1}}{\glsseefirstitem{#1}}%
}
\newcommand*{\mglsseeitem}[1]{%
 \mglsname[all={noindex},setup={hyper=allmain}]{#1}%
}
\newcommand*{\mglsseefirstitem}{\mglsseeitem}
\newcommand*{\glsseefirstitem}{\glsseeitem}
\newcommand*{\glsseelastoxfordsep}{\glsseelastsep}
\ifdef\alsoname
{\providecommand{\seealsoname}{\alsoname}}
{\providecommand{\seealsoname}{see also}}
\ifdef\@xdycrossrefhook
{
  \appto\@xdycrossrefhook{%
    \write\glswrite{(define-crossref-class \string"seealso\string"
      :unverified )}%
    \write\glswrite{(markup-crossref-list
       :class \string"seealso\string"^^J\space\space\space
       :open \string"\string\glsxtruseseealsoformat\glsopenbrace\string"
       :close \string"\glsclosebrace\string")}%
  }
  \appto\@xdylocationclassorder{\space\string"seealso\string"}
  \newrobustcmd*{\glsxtrindexseealso}[2]{%
    \ifx\@glsxtr@record@setting\@glsxtr@record@setting@alsoindex
      \@glsxtr@recordsee{#1}{#2}%
    \fi
    \glsdoifexists{#1}%
    {%
      \@@glsxtrwrglossmark
      \def\@gls@xref{#2}%
      \@onelevel@sanitize\@gls@xref
      \@gls@checkmkidxchars\@gls@xref
      \gls@glossary{\csname glo@#1@type\endcsname}{%
        (indexentry
          :tkey (\csname glo@#1@index\endcsname)
          :xref (\string"\@gls@xref\string")
          :attr \string"seealso\string"
        )
      }%
    }%
  }
}
{
  \newrobustcmd*{\glsxtrindexseealso}{\glssee[\seealsoname]}
}
\ifdef\gls@set@xr@key
{
  \define@key{glossentry}{alias}{%
    \gls@set@xr@key{alias}{\@glo@alias}{#1}%
  }
  \define@key{glossentry}{seealso}{%
    \gls@set@xr@key{seealso}{\@glo@seealso}{#1}%
  }
  \appto\@gls@keymap{,{alias}{alias},{seealso}{seealso}}
  \appto\@newglossaryentryprehook{\def\@glo@alias{}\def\@glo@seealso{}}%
  \appto\@newglossaryentryposthook{%
    \ifdefvoid\@glo@seealso
     {\csxdef{glo@\@glo@label @seealso}{}}%
     {%
       \csxdef{glo@\@glo@label @seealso}{\@glo@seealso}%
       \if@glsxtr@autoseeindex
         \@glsxtr@autoindexcrossrefs
       \fi
     }%
    \ifdefvoid\@glo@alias
     {\csxdef{glo@\@glo@label @alias}{}}%
     {%
       \csxdef{glo@\@glo@label @alias}{\@glo@alias}%
     }%
  }
  \newcommand*{\glsxtralias}[1]{\@gls@entry@field{#1}{alias}}
  \newcommand*{\glsxtrseealsolabels}[1]{\@gls@entry@field{#1}{seealso}}
  \appto\@glo@autoseehook{%
    \ifdefvoid\@glo@alias
    {%
      \ifdefvoid\@glo@seealso
      {}%
      {%
        \protected@edef\@do@glssee{\noexpand\glsxtrindexseealso
          {\@glo@label}{\@glo@seealso}}%
        \@do@glssee
      }%
    }%
    {%
      \ifdefvoid\@glo@see
      {%
        \protected@edef\@do@glssee{\noexpand\glssee{\@glo@label}{\@glo@alias}}%
        \@do@glssee
      }%
      {}%
    }%
  }%
}
{
  \glsaddstoragekey*{alias}{}{\glsxtralias}
  \glsaddstoragekey*{seealso}{}{\glsxtrseealsolabels}
  \appto\@newglossaryentryposthook{%
    \ifcsvoid{glo@\@glo@label @alias}%
    {%
      \ifcsvoid{glo@\@glo@label @seealso}%
      {}%
      {%
        \protected@edef\@do@glssee{\noexpand\glsxtrindexseealso
          {\@glo@label}{\csuse{glo@\@glo@label @seealso}}}%
        \@do@glssee
      }%
    }%
    {%
      \ifdefvoid\@glo@see
      {%
        \protected@edef\@do@glssee{\noexpand\glssee
          {\@glo@label}{\csuse{glo@\@glo@label @alias}}}%
        \@do@glssee
      }%
      {}%
    }%
  }
}
\AtEndDocument{\if@glsxtrindexcrossrefs\glsxtraddallcrossrefs\fi}
\newcommand*{\glsxtraddallcrossrefs}{%
  \forallglossaries{\@glo@type}%
  {%
     \forglsentries[\@glo@type]{\@glo@label}%
     {%
       \ifglsused{\@glo@label}%
       {\expandafter\@glsxtr@addunusedxrefs\expandafter{\@glo@label}}{}%
     }%
  }%
}
\newcommand*{\@glsxtr@addunusedxrefs}[1]{%
  \letcs{\@glo@see}{glo@\glsdetoklabel{#1}@see}%
  \ifdefvoid\@glo@see
  {}%
  {%
    \expandafter\glsxtr@addunused\@glo@see\@end@glsxtr@addunused
  }%
  \letcs{\@glo@see}{glo@\glsdetoklabel{#1}@seealso}%
  \ifdefvoid\@glo@see
  {}%
  {%
    \expandafter\glsxtr@addunused\@glo@see\@end@glsxtr@addunused
  }%
}
\newcommand*{\glsxtr@addunused}[1][]{%
  \@glsxtr@addunused
}
\def\@glsxtr@addunused#1\@end@glsxtr@addunused{%
 \@for\@glsxtr@label:=#1\do
 {%
   \glsxtrifmulti\@glsxtr@label
   {%
     \letcs\@glsxtr@labellist{@gls@combined@\@glsxtr@label @list}%
     \@for\@glsxtr@multilabel:=\@glsxtr@labellist\do
     {\@glsxtr@addunused\@glsxtr@multilabel\@end@glsxtr@addunused}%
   }%
   {%
     \ifglsused{\@glsxtr@label}{}%
     {%
       \glsadd[format=glsxtrunusedformat]{\@glsxtr@label}%
       \glsunset{\@glsxtr@label}%
       \expandafter\@glsxtr@addunusedxrefs\expandafter{\@glsxtr@label}%
     }%
   }%
 }%
}
\newcommand*{\glsxtrunusedformat}[1]{\unskip}
\ifdef\gls@begindocdefs
{%
  \renewcommand*{\gls@begindocdefs}{%
    \ifnum\@glsxtr@docdefval=1\relax
      \@gls@enablesavenonumberlist
      \edef\@gls@restoreat{%
        \noexpand\catcode`\noexpand\@=\number\catcode`\@\relax}%
      \makeatletter
      \InputIfFileExists{\jobname.glsdefs}{}{}%
      \@gls@restoreat
      \undef\@gls@restoreat
      \gls@defdocnewglossaryentry
    \else
      \ifnum\@glsxtr@docdefval=3\relax
        \@gls@enablesavenonumberlist
        \let\gls@checkseeallowed\relax
        \let\newglossaryentry\new@atom@glossaryentry
        \global\newwrite\@gls@deffile
        \immediate\openout\@gls@deffile=\jobname.glsdefs
        \forallglsentries{\@glsentry}{\@gls@writedef{\@glsentry}}%
      \fi
    \fi
  }
}
{%
  \ifnum\@glsxtr@docdefval=3\relax
    \PackageError{glossaries-extra}{Package option
    `docdef=\@glsxtr@docdefsetting' requires at least version 4.37
    of the base glossaries.sty package}{}
  \fi
}
\newrobustcmd{\new@atom@glossaryentry}[2]{%
  \gls@defglossaryentry{#1}{#2}%
  \@gls@writedef{#1}%
}
\let\glsxtr@orgmakenoidxglossaries\makenoidxglossaries
\renewcommand{\makenoidxglossaries}{%
 \@domakeglossaries
 {%
  \ifdefequal\@glsxtr@record@setting\@glsxtr@record@setting@off
  {%
    \glsxtr@orgmakenoidxglossaries
    \renewcommand{\@do@seeglossary}[2]{%
      \@@glsxtrwrglossmark
      \protected@edef\@gls@label{\glsdetoklabel{##1}}%
      \protected@write\@auxout{}{%
        \string\@gls@reference
          {\csname glo@\@gls@label @type\endcsname}%
          {\@gls@label}%
          {%
            \string\glsseeformat##2{}%
          }%
      }%
    }%
    \if@glsxtrdocdefrestricted
      \renewcommand*{\@gls@reference}[3]{%
        \ifcsundef{@glsref@##1}{\csgdef{@glsref@##1}{}}{}%
        \ifinlistcs{##2}{@glsref@##1}%
        {}%
        {\listcsgadd{@glsref@##1}{##2}}%
        \ifcsundef{glo@\glsdetoklabel{##2}@loclist}%
        {\csgdef{glo@\glsdetoklabel{##2}@loclist}{}}%
        {}%
        \listcsgadd{glo@\glsdetoklabel{##2}@loclist}{##3}%
      }%
    \else
      \@glsxtrdocdeffalse
    \fi
    \disable@keys{glossaries-extra.sty}{docdef}%
  }%
  {%
    \PackageError{glossaries-extra}{\string\makenoidxglossaries\space
     not permitted\MessageBreak
     with record=\@glsxtr@record@setting\space package option}%
    {You may only use \string\makenoidxglossaries\ space with the
     record=off option}%
  }%
 }%
}
\renewcommand*{\gls@defdocnewglossaryentry}{%
  \ifcase\@glsxtr@docdefval
    \renewcommand*{\newglossaryentry}[2]{%
      \PackageError{glossaries-extra}{Glossary entries must
       be \MessageBreak defined in the preamble with \MessageBreak
       package option `docdef=false'\MessageBreak(consider using
       `docdef=restricted')}{Move your glossary definitions to
       the preamble. You can also put them in a \MessageBreak separate file
       and load them with \string\loadglsentries.}%
    }%
  \or
    \let\gls@checkseeallowed\relax
    \let\newglossaryentry\new@glossaryentry
  \else
    \let\gls@checkseeallowed\relax
  \fi
}%
\newcommand*{\GlsXtrEnableOnTheFly}{%
  \@ifstar\@sGlsXtrEnableOnTheFly\@GlsXtrEnableOnTheFly
}
\newcommand*{\@sGlsXtrEnableOnTheFly}{%
  \renewcommand*{\glsdetoklabel}[1]{%
    \expandafter\@glsxtr@ifcsstart\string##1 \@glsxtr@end@
    {%
      \expandafter\detokenize\expandafter{##1}%
    }%
    {\detokenize{##1}}%
  }%
  \@GlsXtrEnableOnTheFly
}
\def\@glsxtr@ifcsstart#1#2\@glsxtr@end@#3#4{%
  \expandafter\if\glsbackslash#1%
    #3%
  \else
    #4%
  \fi
}
\newcommand*{\glsxtrstarflywarn}{%
  \GlossariesExtraWarning{Experimental starred version of
  \string\GlsXtrEnableOnTheFly\space in use (please ensure you have
  read the warnings in the glossaries-extra user manual)}%
}
\newcommand*{\@GlsXtrEnableOnTheFly}{%
  \newcommand*{\glsxtrcat}{general}
  \newcommand*{\glsxtr}[1][]{%
   \def\glsxtr@keylist{##1}%
   \@glsxtr
  }
  \newcommand*{\@glsxtr}[2][]{%
   \ifglsentryexists{##2}%
   {%
     \ifblank{##1}{}{\GlsXtrWarning{##1}{##2}}%
   }%
   {%
     \gls@defglossaryentry{##2}{name={##2},category=\glsxtrcat,
       description={\nopostdesc},##1}%
   }%
   \expandafter\gls\expandafter[\glsxtr@keylist]{##2}%
  }
  \newcommand*{\Glsxtr}[1][]{%
   \def\glsxtr@keylist{##1}%
   \@Glsxtr
  }
  \newcommand*{\@Glsxtr}[2][]{%
   \ifglsentryexists{##2}%
   {%
     \ifblank{##1}{}{\GlsXtrWarning{##1}{##2}}%
   }%
   {%
     \gls@defglossaryentry{##2}{name={##2},category=\glsxtrcat,
       description={\nopostdesc},##1}%
   }%
   \expandafter\Gls\expandafter[\glsxtr@keylist]{##2}%
  }
  \newcommand*{\glsxtrpl}[1][]{%
   \def\glsxtr@keylist{##1}%
   \@glsxtrpl
  }
  \newcommand*{\@glsxtrpl}[2][]{%
   \ifglsentryexists{##2}%
   {%
     \ifblank{##1}{}{\GlsXtrWarning{##1}{##2}}%
   }%
   {%
     \gls@defglossaryentry{##2}{name={##2},category=\glsxtrcat,
       description={\nopostdesc},##1}%
   }%
   \expandafter\glspl\expandafter[\glsxtr@keylist]{##2}%
  }
  \newcommand*{\Glsxtrpl}[1][]{%
   \def\glsxtr@keylist{##1}%
   \@Glsxtrpl
  }
  \newcommand*{\@Glsxtrpl}[2][]{%
   \ifglsentryexists{##2}
   {%
     \ifblank{##1}{}{\GlsXtrWarning{##1}{##2}}%
   }%
   {%
     \gls@defglossaryentry{##2}{name={##2},category=\glsxtrcat,
       description={\nopostdesc},##1}%
   }%
   \expandafter\Glspl\expandafter[\glsxtr@keylist]{##2}%
  }
  \newcommand*{\GlsXtrWarning}[2]{%
    \def\@glsxtr@optlist{##1}%
    \@onelevel@sanitize\@glsxtr@optlist
    \GlossariesExtraWarning{The options `\@glsxtr@optlist' have
    been ignored for entry `##2' as it has already been defined}%
  }
  \renewcommand\@printglossary[2]{%
    \def\@glsxtr@printglossopts{##1}%
    \@glsxtr@orgprintglossary{##1}{##2}%
    \def\@glsxtr{\@glsxtr@disabledflycommand\glsxtr}%
    \def\@glsxtrpl{\@glsxtr@disabledflycommand\glsxtrpl}%
    \def\@Glsxtr{\@glsxtr@disabledflycommand\Glsxtr}%
    \def\@Glsxtrpl{\@glsxtr@disabledflycommand\Glsxtrpl}%
  }
  \newcommand*{\@glsxtr@disabledflycommand}[1]{%
    \PackageError{glossaries-extra}%
    {\string##1\space can't be used after any of the \MessageBreak
     glossaries have been displayed}%
    {The on-the-fly commands enabled by
     \string\GlsXtrEnableOnTheFly\space may only be used \MessageBreak
     before the glossaries. If you want to use any entries \MessageBreak
     after any of the glossaries, you must use the standard \MessageBreak
     method of first defining the entry and then using the \MessageBreak
     entry with commands like \string\gls}%
     \@@glsxtr@disabledflycommand
  }%
  \newcommand*{\@@glsxtr@disabledflycommand}[2][]{##2}
  \let\GlsXtrEnableOnTheFly\relax
}
\@onlypreamble\GlsXtrEnableOnTheFly
\newcommand*{\@glsxtr@current@style}{\@glossary@default@style}
\renewcommand*{\setglossarystyle}[1]{%
  \ifcsundef{@glsstyle@#1}%
  {%
    \PackageError{glossaries-extra}{Glossary style `#1' undefined}{}%
  }%
  {%
    \csname @glsstyle@#1\endcsname
    \protected@edef\@glsxtr@current@style{#1}%
  }%
  \ifx\@glossary@default@style\relax
    \protected@edef\@glossary@default@style{#1}%
  \fi
}
\ifdef\@glossary@default@style
{}
{%
  \let\@glossary@default@style\relax
}
\ifdef\glslistdottedwidth
{%
  \ifdim\glslistdottedwidth=.5\hsize
    \setlength{\glslistdottedwidth}{-\dimexpr\maxdimen-1sp\relax}
    \AtBeginDocument{%
      \ifdim\glslistdottedwidth=-\dimexpr\maxdimen-1sp\relax
       \setlength{\glslistdottedwidth}{.5\columnwidth}%
      \fi
    }%
  \fi
}
{}%
\ifdef\glsdescwidth
{%
  \ifdim\glsdescwidth=.6\hsize
    \setlength{\glsdescwidth}{-\dimexpr\maxdimen-1sp\relax}
    \AtBeginDocument{%
      \ifdim\glsdescwidth=-\dimexpr\maxdimen-1sp\relax
       \setlength{\glsdescwidth}{.6\columnwidth}%
      \fi
    }%
  \fi
}
{}%
\ifdef\glspagelistwidth
{%
  \ifdim\glspagelistwidth=.1\hsize
    \setlength{\glspagelistwidth}{-\dimexpr\maxdimen-1sp\relax}
    \AtBeginDocument{%
      \ifdim\glspagelistwidth=-\dimexpr\maxdimen-1sp\relax
       \setlength{\glspagelistwidth}{.1\columnwidth}%
      \fi
    }%
  \fi
}
{}%
\def\org@glossaryentrynumbers#1{#1\gls@save@numberlist{#1}}%
\ifx\org@glossaryentrynumbers\glossaryentrynumbers
  \glsnonumberlistfalse
  \renewcommand*{\glossaryentrynumbers}[1]{%
    \ifglsentryexists{\glscurrententrylabel}%
    {%
      \@glsxtrpreloctag
      \GlsXtrFormatLocationList{#1}%
      \@glsxtrpostloctag
      \gls@save@numberlist{#1}%
    }{}%
  }%
\else
  \glsnonumberlisttrue
  \renewcommand*{\glossaryentrynumbers}[1]{%
    \ifglsentryexists{\glscurrententrylabel}%
    {%
      \gls@save@numberlist{#1}%
    }{}%
  }%
\fi
\newcommand*{\GlsXtrFormatLocationList}[1]{#1}
\newcommand*{\GlsXtrEnablePreLocationTag}[2]{%
  \let\@glsxtrpreloctag\@@glsxtrpreloctag
  \let\@glsxtrpostloctag\@@glsxtrpostloctag
  \renewcommand*{\@glsxtr@pagetag}{#1}%
  \renewcommand*{\@glsxtr@pagestag}{#2}%
  \renewcommand*{\@glsxtr@savepreloctag}[2]{%
    \csgdef{@glsxtr@preloctag@##1}{##2}%
  }%
  \renewcommand*{\@glsxtr@doloctag}{%
    \ifcsundef{@glsxtr@preloctag@\glscurrententrylabel}%
    {%
      \GlossariesWarning{Missing pre-location tag for `\glscurrententrylabel'.
        Rerun required}%
    }%
    {%
      \csuse{@glsxtr@preloctag@\glscurrententrylabel}%
    }%
  }%
}
\@onlypreamble\GlsXtrEnablePreLocationTag
\newcommand*{\@@glsxtrpreloctag}{%
   \let\@glsxtr@org@delimN\delimN
   \let\@glsxtr@org@delimR\delimR
   \let\@glsxtr@org@glsignore\glsignore
   \gdef\@glsxtr@thisloctag{\@glsxtr@pagetag}%
   \renewcommand*{\delimN}{%
     \gdef\@glsxtr@thisloctag{\@glsxtr@pagestag}%
     \@glsxtr@org@delimN}%
   \renewcommand*{\delimR}{%
     \gdef\@glsxtr@thisloctag{\@glsxtr@pagestag}%
     \@glsxtr@org@delimR}%
   \renewcommand*{\glsignore}[1]{%
     \gdef\@glsxtr@thisloctag{\relax}%
     \@glsxtr@org@glsignore{##1}}%
   \@glsxtr@doloctag
}
\newcommand*{\@glsxtrpreloctag}{}
\newcommand*{\@glsxtr@pagetag}{}%
\newcommand*{\@glsxtr@pagestag}{}%
\newcommand*{\@@glsxtrpostloctag}{%
   \let\delimN\@glsxtr@org@delimN
   \let\delimR\@glsxtr@org@delimR
   \let\glsignore\@glsxtr@org@glsignore
   \protected@write\@auxout{}%
    {\string\@glsxtr@savepreloctag{\glscurrententrylabel}{\@glsxtr@thisloctag}}%
}
\newcommand*{\@glsxtrpostloctag}{}
\newcommand*{\@glsxtr@savepreloctag}[2]{}
\protected@write\@auxout{}{%
  \string\providecommand\string\@glsxtr@savepreloctag[2]{}}
\newcommand*{\@glsxtr@doloctag}{}
\renewcommand*{\KV@printgloss@nonumberlist}[1]{%
 \XKV@plfalse
 \XKV@sttrue
 \XKV@checkchoice[\XKV@resa]{#1}{true,false}%
 {%
   \csname glsnonumberlist\XKV@resa\endcsname
   \ifglsnonumberlist
     \def\glossaryentrynumbers##1{\gls@save@numberlist{##1}}%
   \else
     \def\glossaryentrynumbers##1{%
       \@glsxtrpreloctag
       \GlsXtrFormatLocationList{##1}%
       \@glsxtrpostloctag
       \gls@save@numberlist{##1}}%
   \fi
 }%
}
\renewcommand*{\glsentryfmt}{%
  \ifglshasshort{\glslabel}{\glssetabbrvfmt{\glscategory{\glslabel}}}{}%
  \glsifregular{\glslabel}%
  {\glsxtrregularfont{\glsgenentryfmt}}%
  {%
    \ifglshasshort{\glslabel}%
    {\glsxtrabbreviationfont{\glsxtrgenabbrvfmt}}%
    {\glsxtrregularfont{\glsgenentryfmt}}%
  }%
}
\newcommand*{\glsxtrregularfont}[1]{#1}
\newcommand*{\glsxtrabbreviationfont}[1]{#1}
\renewcommand{\@gls@field@link}[4][]{%
  \@glsxtr@record{#2}{#3}{glslink}%
  \glsdoifexists{#3}%
  {%
    \let\glsxtrorg@ifKV@glslink@hyper\ifKV@glslink@hyper
    \@gls@save@glslocal
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \def\glscustomtext{#4}%
    \@glsxtr@field@linkdefs
    #1%
    \@gls@link[#2]{#3}{#4}%
    \let\ifKV@glslink@hyper\glsxtrorg@ifKV@glslink@hyper
    \@gls@restore@glslocal
  }%
  \glspostlinkhook
}
\let\@glsxtr@org@gls@\@gls@
\def\@gls@#1#2{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \@glsxtr@org@gls@{#1}{#2}%
}%
\let\@glsxtr@org@glspl@\@glspl@
\def\@glspl@#1#2{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \@glsxtr@org@glspl@{#1}{#2}%
}%
\let\@glsxtr@org@Gls@\@Gls@
\def\@Gls@#1#2{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \@glsxtr@org@Gls@{#1}{#2}%
}%
\let\@glsxtr@org@Glspl@\@Glspl@
\def\@Glspl@#1#2{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \@glsxtr@org@Glspl@{#1}{#2}%
}%
\let\@glsxtr@org@GLS@\@GLS@
\def\@GLS@#1#2{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \@glsxtr@org@GLS@{#1}{#2}%
}%
\let\@glsxtr@org@GLSpl@\@GLSpl@
\def\@GLSpl@#1#2{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \@glsxtr@org@GLSpl@{#1}{#2}%
}%
\renewcommand*{\@glsdisp}[3][]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}{%
    \let\do@gls@link@checkfirsthyper\@gls@link@checkfirsthyper
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@firstofthree
    \def\glscustomtext{#3}%
    \def\glsinsert{}%
    \def\@glo@text{\csname gls@\glstype @entryfmt\endcsname}%
    \@gls@link[#1]{#2}{\@glo@text}%
    \@gls@do@glsunset{#2}%
  }%
  \glspostlinkhook
}
\renewcommand*{\@gls@@link}[3][]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexistsordo{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\relax
    \def\glscustomtext{#3}%
    \@glsxtr@field@linkdefs
    \@gls@link[#1]{#2}{#3}%
  }%
  {%
    \glstextformat{#3}%
  }%
  \glspostlinkhook
}
\newcommand*{\glsxtrinitwrgloss}{%
 \glsifattribute{\glslabel}{wrgloss}{after}%
 {%
   \glsxtrinitwrglossbeforefalse
 }%
 {%
   \glsxtrinitwrglossbeforetrue
 }%
}
\newif\ifglsxtrinitwrglossbefore
\glsxtrinitwrglossbeforetrue
\define@choicekey{glslink}{wrgloss}%
[\@glsxtr@wrglossval\@glsxtr@wrglossnr]%
{before,after}%
{%
  \ifcase\@glsxtr@wrglossnr\relax
    \glsxtrinitwrglossbeforetrue
  \or
    \glsxtrinitwrglossbeforefalse
  \fi
}
\define@key{glslink}{thevalue}{\def\@glsxtr@thevalue{#1}}
\define@key{glslink}{theHvalue}{\def\@glsxtr@theHvalue{#1}}
\define@boolkey{glslink}[glsxtr@]{hyperoutside}[true]{}
\glsxtr@hyperoutsidetrue
\define@key{glslink}{textformat}{%
  \ifcsdef{#1}
  {%
    \letcs{\@glsxtr@local@textformat}{#1}%
  }%
  {%
    \PackageError{glossaries-extra}{Unknown control sequence name `#1'}{}%
  }%
}
\define@key{glslink}{prefix}{\def\glolinkprefix{#1}}
\newcommand*{\glsxtrinithyperoutside}{%
 \glsifattribute{\glslabel}{hyperoutside}{false}%
 {%
   \glsxtr@hyperoutsidefalse
 }%
 {%
   \glsxtr@hyperoutsidetrue
 }%
}
\newcommand*{\glsxtr@inc@linkcount}{}
\newcommand*{\glslinkpresetkeys}{}
\newrobustcmd*{\GlsXtrExpandedFmt}[2]{%
  \protected@edef\@glsxtr@tmp{#2}%
  \expandafter#1\expandafter{\@glsxtr@tmp}%
}
\newcommand*{\@glsxtr@use@equation@counter}{%
  \@glsxtr@ifnum@mmode{\def\@gls@counter{equation}}{}%
}
\newcommand*{\glsxtr@do@autoadd}[1]{}
\newcommand*{\GlsXtrAutoAddOnFormat}[3][\glslabel]{%
  \renewcommand*{\glsxtr@do@autoadd}[1]{%
    \begingroup
      \protected@edef\@glsxtr@do@autoadd{%
         \noexpand\ifstrequal{##1}{glslink}%
         {%
           \noexpand\DTLifinlist{\@glsnumberformat}{#2}{\noexpand\glsadd[format={\@glsnumberformat},#3]{#1}}{}%
         }%
         {}%
      }%
      \@glsxtr@do@autoadd
    \endgroup
  }%
}
\providecommand*{\glslinkwrcontent}[1]{{#1}}
\def\@gls@link[#1]#2#3{%
  \leavevmode
  \protected@edef\glslabel{\glsdetoklabel{#2}}%
  \def\@gls@link@opts{#1}%
  \let\@gls@link@label\glslabel
  \let\@glsnumberformat\@glsxtr@defaultnumberformat
  \protected@edef\@gls@counter{\csname glo@\glslabel @counter\endcsname}%
  \protected@edef\glstype{\csname glo@\glslabel @type\endcsname}%
  \let\org@ifKV@glslink@hyper\ifKV@glslink@hyper
  \@gls@save@glslocal
  \let\@glsxtr@org@glolinkprefix\glolinkprefix
  \let\@glsxtr@local@textformat\relax
  \def\@glsxtr@thevalue{}%
  \def\@glsxtr@theHvalue{\@glsxtr@thevalue}%
  \glsxtrinitwrgloss
  \glsxtrinithyperoutside
  \@gls@setdefault@glslink@opts
   \glsxtr@inc@linkcount
   \if@glsxtr@equations
     \@glsxtr@use@equation@counter
   \fi
  \do@glsdisablehyperinlist
  \do@gls@link@checkfirsthyper
  \glslinkpresetkeys
  \setkeys{glslink}{#1}%
  \glsxtr@do@autoadd{glslink}%
  \glslinkpostsetkeys
  \ifdefempty{\@glsxtr@thevalue}%
  {%
    \@gls@saveentrycounter
  }%
  {%
    \let\theglsentrycounter\@glsxtr@thevalue
    \def\theHglsentrycounter{\@glsxtr@theHvalue}%
  }%
  \@gls@setsort{\glslabel}%
  \ifx\@glsxtr@local@textformat\relax
     \glshasattribute{\glslabel}{textformat}%
     {%
       \protected@edef\@glsxtr@attrval{\glsgetattribute{\glslabel}{textformat}}%
       \ifcsdef{\@glsxtr@attrval}%
       {%
         \letcs{\@glsxtr@textformat}{\@glsxtr@attrval}%
       }%
       {%
         \GlossariesExtraWarning{Unknown control sequence name
         `\@glsxtr@attrval' supplied in textformat attribute
         for entry `\glslabel'. Reverting to default \string\glstextformat}%
         \let\@glsxtr@textformat\glstextformat
       }%
     }%
     {%
       \let\@glsxtr@textformat\glstextformat
     }%
  \else
     \let\@glsxtr@textformat\@glsxtr@local@textformat
  \fi
  \glslinkwrcontent
  {%
    \ifglsxtrinitwrglossbefore
      \@do@wrglossary{#2}%
    \fi
    \ifKV@glslink@hyper
      \ifglsxtr@hyperoutside
        \@glslink{\glolinkprefix\glslabel}{\@glsxtr@textformat{#3}}%
      \else
        \@glsxtr@textformat{\@glslink{\glolinkprefix\glslabel}{#3}}%
      \fi
    \else
      \ifglsxtr@hyperoutside
        \glsdonohyperlink{\glolinkprefix\glslabel}{\@glsxtr@textformat{#3}}%
      \else
        \@glsxtr@textformat{\glsdonohyperlink{\glolinkprefix\glslabel}{#3}}%
      \fi
    \fi
    \ifglsxtrinitwrglossbefore
    \else
      \@do@wrglossary{#2}%
    \fi
  }%
  \let\glolinkprefix\@glsxtr@org@glolinkprefix
  \let\ifKV@glslink@hyper\org@ifKV@glslink@hyper
  \@gls@restore@glslocal
}
\define@key{glossadd}{thevalue}{\def\@glsxtr@thevalue{#1}}
\define@key{glossadd}{theHvalue}{\def\@glsxtr@theHvalue{#1}}
\newcommand*{\glsaddpresetkeys}{}

\newcommand*{\glsaddpostsetkeys}{}
\renewrobustcmd*{\glsadd}[2][]{%
  \glsxtrifinmark
  {}%
  {%
    \@gls@adjustmode
    \begingroup
      \@glsxtr@record{#1}{#2}{glossadd}%
      \glsdoifexists{#2}%
      {%
        \let\@glsnumberformat\@glsxtr@defaultnumberformat
        \protected@edef\@gls@counter{\csname glo@\glsdetoklabel{#2}@counter\endcsname}%
        \def\@glsxtr@thevalue{}%
        \def\@glsxtr@theHvalue{\@glsxtr@thevalue}%
        \glsaddpresetkeys
        \setkeys{glossadd}{#1}%
        \glsaddpostsetkeys
        \ifdefempty{\@glsxtr@thevalue}%
        {%
          \@gls@saveentrycounter
        }%
        {%
          \let\theglsentrycounter\@glsxtr@thevalue
          \def\theHglsentrycounter{\@glsxtr@theHvalue}%
        }%
        \@gls@setsort{#2}%
        \KV@glslink@noindexfalse
        \@@do@wrglossary{#2}%
      }%
    \endgroup
  }%
}
\newrobustcmd{\glsaddeach}[2][]{%
  \@for\@gls@thislabel:=#2\do{\glsadd[#1]{\@gls@thislabel}}%
}
\newcommand*{\@glsxtr@field@linkdefs}{%
  \let\glsxtrifwasfirstuse\@secondoftwo
  \let\glsifplural\@secondoftwo
  \let\glscapscase\@firstofthree
  \let\glsinsert\@empty
}
\newcommand*{\glsxtrassignfieldfont}[1]{%
  \ifglsentryexists{#1}%
  {%
    \ifglshasshort{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
      \glsifregular{#1}%
      {\let\@gls@field@font\glsxtrregularfont}%
      {\let\@gls@field@font\@firstofone}%
    }%
    {%
      \glsifnotregular{#1}%
      {\let\@gls@field@font\@firstofone}%
      {\let\@gls@field@font\glsxtrregularfont}%
    }%
  }%
  {%
    \let\@gls@field@font\@gobble
  }%
}
\def\@glstext@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link{#1}{#2}{\@gls@field@font{\glsaccesstext{#2}#3}}%
}
\def\@GLStext@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link[\let\glscapscase\@thirdofthree]{#1}{#2}%
    {\@gls@field@font{\GLSaccesstext{#2}\mfirstucMakeUppercase{#3}}}%
}
\def\@Glstext@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link[\let\glscapscase\@secondofthree]{#1}{#2}%
    {\@gls@field@font{\Glsaccesstext{#2}#3}}%
}
\newcommand*{\glsxtrchecknohyperfirst}[1]{%
  \glsifattribute{#1}{nohyperfirst}{true}{\KV@glslink@hyperfalse}{}%
}
\def\@glsfirst@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glsxtrifwasfirstuse\@firstoftwo
   \glsxtrchecknohyperfirst{#2}%
  ]{#1}{#2}%
  {\@gls@field@font{\glsaccessfirst{#2}#3}}%
}
\def\@Glsfirst@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glsxtrifwasfirstuse\@firstoftwo
   \let\glscapscase\@secondofthree
   \glsxtrchecknohyperfirst{#2}%
  ]%
   {#1}{#2}{\@gls@field@font{\Glsaccessfirst{#2}#3}}%
}
\def\@GLSfirst@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glsxtrifwasfirstuse\@firstoftwo
   \let\glscapscase\@thirdofthree
   \glsxtrchecknohyperfirst{#2}%
  ]%
   {#1}{#2}{\@gls@field@font{\GLSaccessfirst{#2}\mfirstucMakeUppercase{#3}}}%
}
\def\@glsplural@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link[\let\glsifplural\@firstoftwo]{#1}{#2}%
    {\@gls@field@font{\glsaccessplural{#2}#3}}%
}
\def\@Glsplural@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glsifplural\@firstoftwo
   \let\glscapscase\@secondofthree
  ]%
    {#1}{#2}{\@gls@field@font{\Glsaccessplural{#2}#3}}%
}
\def\@GLSplural@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glsifplural\@firstoftwo
   \let\glscapscase\@thirdofthree
  ]%
    {#1}{#2}{\@gls@field@font{\GLSaccessplural{#2}\mfirstucMakeUppercase{#3}}}%
}
\def\@glsfirstplural@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glsxtrifwasfirstuse\@firstoftwo
   \let\glsifplural\@firstoftwo
   \glsxtrchecknohyperfirst{#2}%
  ]%
   {#1}{#2}{\@gls@field@font{\glsaccessfirstplural{#2}#3}}%
}
\def\@Glsfirstplural@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glsxtrifwasfirstuse\@firstoftwo
   \let\glsifplural\@firstoftwo
   \let\glscapscase\@secondofthree
   \glsxtrchecknohyperfirst{#2}%
  ]%
   {#1}{#2}{\@gls@field@font{\Glsaccessfirstplural{#2}#3}}%
}
\def\@GLSfirstplural@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glsxtrifwasfirstuse\@firstoftwo
   \let\glsifplural\@firstoftwo
   \let\glscapscase\@thirdofthree
   \glsxtrchecknohyperfirst{#2}%
  ]%
   {#1}{#2}%
   {\@gls@field@font{\GLSaccessfirstplural{#2}\mfirstucMakeUppercase{#3}}}%
}
\def\@glsname@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link{#1}{#2}{\@gls@field@font{\glsaccessname{#2}#3}}%
}
\def\@Glsname@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@secondoftwo]{#1}{#2}%
  {\@gls@field@font{\Glsaccessname{#2}#3}}%
}
\def\@GLSname@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link[\let\glscapscase\@thirdoftwo]%
    {#1}{#2}%
    {\@gls@field@font{\GLSaccessname{#2}\mfirstucMakeUppercase{#3}}}%
}
\def\@glsdesc@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link{#1}{#2}{\@gls@field@font{\glsaccessdesc{#2}#3}}%
}
\def\@Glsdesc@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@secondoftwo]{#1}{#2}%
  {\@gls@field@font{\Glsaccessdesc{#2}#3}}%
}
\def\@GLSdesc@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link[\let\glscapscase\@thirdoftwo]%
    {#1}{#2}{\@gls@field@font{\GLSaccessdesc{#2}\mfirstucMakeUppercase{#3}}}%
}
\def\@glsdescplural@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@secondoftwo
   \let\glsifplural\@firstoftwo
  ]{#1}{#2}{\@gls@field@font{\glsaccessdescplural{#2}#3}}%
}
\def\@Glsdescplural@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@secondoftwo
   \let\glsifplural\@firstoftwo
  ]{#1}{#2}{\@gls@field@font{\Glsaccessdescplural{#2}#3}}%
}
\def\@GLSdesc@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@thirdoftwo
   \let\glsifplural\@firstoftwo
  ]%
    {#1}{#2}%
    {\@gls@field@font{\GLSaccessdescplural{#2}\mfirstucMakeUppercase{#3}}}%
}
\def\@glssymbol@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link{#1}{#2}{\@gls@field@font{\glsaccesssymbol{#2}#3}}%
}
\def\@Glssymbol@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@secondoftwo]%
   {#1}{#2}{\@gls@field@font{\Glsaccesssymbol{#2}#3}}%
}
\def\@GLSsymbol@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link[\let\glscapscase\@thirdoftwo]%
    {#1}{#2}{\@gls@field@font{\GLSaccesssymbol{#2}\mfirstucMakeUppercase{#3}}}%
}
\def\@glssymbolplural@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@secondoftwo
   \let\glsifplural\@firstoftwo
  ]{#1}{#2}{\@gls@field@font{\glsaccesssymbolplural{#2}#3}}%
}
\def\@Glssymbolplural@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@secondoftwo
   \let\glsifplural\@firstoftwo
  ]{#1}{#2}{\@gls@field@font{\Glsaccesssymbolplural{#2}#3}}%
}
\def\@GLSsymbol@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@thirdoftwo
   \let\glsifplural\@firstoftwo
  ]%
    {#1}{#2}%
    {\@gls@field@font{\GLSaccesssymbolplural{#2}\mfirstucMakeUppercase{#3}}}%
}
\def\@Glsuseri@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@secondoftwo]{#1}{#2}%
  {\@gls@field@font{\Glsentryuseri{#2}#3}}%
}
\def\@GLSuseri@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link[\let\glscapscase\@thirdoftwo]%
    {#1}{#2}{\@gls@field@font{\mfirstucMakeUppercase{\glsentryuseri{#2}#3}}}%
}
\def\@Glsuserii@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@secondoftwo]%
   {#1}{#2}{\@gls@field@font{\Glsentryuserii{#2}#3}}%
}
\def\@GLSuserii@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link[\let\glscapscase\@thirdoftwo]%
    {#1}{#2}{\@gls@field@font{\mfirstucMakeUppercase{\glsentryuserii{#2}#3}}}%
}
\def\@Glsuseriii@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@secondoftwo]%
   {#1}{#2}{\@gls@field@font{\Glsentryuseriii{#2}#3}}%
}
\def\@GLSuseriii@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link[\let\glscapscase\@thirdoftwo]%
    {#1}{#2}{\@gls@field@font{\mfirstucMakeUppercase{\glsentryuseriii{#2}#3}}}%
}
\def\@Glsuseriv@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@secondoftwo]%
   {#1}{#2}{\@gls@field@font{\Glsentryuseriv{#2}#3}}%
}
\def\@GLSuseriv@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link[\let\glscapscase\@thirdoftwo]%
    {#1}{#2}%
    {\@gls@field@font{\mfirstucMakeUppercase{\glsentryuseriv{#2}#3}}}%
}
\def\@Glsuserv@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@secondoftwo]%
   {#1}{#2}{\@gls@field@font{\Glsentryuserv{#2}#3}}%
}
\def\@GLSuserv@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link[\let\glscapscase\@thirdoftwo]%
    {#1}{#2}{\@gls@field@font{\mfirstucMakeUppercase{\glsentryuserv{#2}#3}}}%
}
\def\@Glsuservi@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link
  [\let\glscapscase\@secondoftwo]%
   {#1}{#2}{\@gls@field@font{\Glsentryuservi{#2}#3}}%
}
\def\@GLSuservi@#1#2[#3]{%
  \glsxtrassignfieldfont{#2}%
  \@gls@field@link[\let\glscapscase\@thirdoftwo]%
    {#1}{#2}{\@gls@field@font{\mfirstucMakeUppercase{\glsentryuservi{#2}#3}}}%
}
\newcommand*{\@@glsxtr@base@acrcmd@warn}[2]{%
  \GlossariesExtraWarning{Base acronym command \string#1\space
   should not be used with new abbreviation definitions. Use
   \string#2\space instead}%
}
\let\@glsxtr@base@acrcmd\@@glsxtr@base@acrcmd@warn
\def\@acrshort#1#2[#3]{%
  \@glsxtr@base@acrcmd\acrshort\glsxtrshort
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\glsaccessshort{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\def\@Acrshort#1#2[#3]{%
  \@glsxtr@base@acrcmd\Acrshort\Glsxtrshort
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\Glsaccessshort{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\def\@ACRshort#1#2[#3]{%
  \@glsxtr@base@acrcmd\ACRshort\GLSxtrshort
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \mfirstucMakeUppercase{\acronymfont{\glsaccessshort{#2}}#3}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\def\@acrshortpl#1#2[#3]{%
  \@glsxtr@base@acrcmd\acrshortpl\glsxtrshortpl
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\glsaccessshortpl{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\def\@Acrshortpl#1#2[#3]{%
  \@glsxtr@base@acrcmd\Acrshortpl\Glsxtrshortpl
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\Glsaccessshortpl{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\def\@ACRshortpl#1#2[#3]{%
  \@glsxtr@base@acrcmd\ACRshortpl\GLSxtrshortpl
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \mfirstucMakeUppercase{\acronymfont{\glsaccessshortpl{#2}}#3}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\def\@acrlong#1#2[#3]{%
  \@glsxtr@base@acrcmd\acrlong\glsxtrlong
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\glsaccesslong{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\def\@Acrlong#1#2[#3]{%
  \@glsxtr@base@acrcmd\Acrlong\Glsxtrlong
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\Glsaccesslong{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\def\@ACRlong#1#2[#3]{%
  \@glsxtr@base@acrcmd\ACRlong\GLSxtrlong
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \mfirstucMakeUppercase{\acronymfont{\glsaccesslong{#2}}#3}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\def\@acrlongpl#1#2[#3]{%
  \@glsxtr@base@acrcmd\acrlongpl\glsxtrlongpl
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\glsaccesslongpl{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\def\@Acrlongpl#1#2[#3]{%
  \@glsxtr@base@acrcmd\Acrlongpl\Glsxtrlongpl
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \acronymfont{\Glsaccesslongpl{#2}}#3%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\def\@ACRlongpl#1#2[#3]{%
  \@glsxtr@base@acrcmd\ACRlongpl\GLSxtrlongpl
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \mfirstucMakeUppercase{\acronymfont{\glsaccesslongpl{#2}}#3}%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\def\@acrfull#1#2[#3]{%
  \@glsxtr@base@acrcmd\acrfull\glsxtrfull
  \acrfullfmt{#1}{#2}{#3}%
}
\def\@Acrfull#1#2[#3]{%
  \@glsxtr@base@acrcmd\Acrfull\Glsxtrfull
  \Acrfullfmt{#1}{#2}{#3}%
}
\def\@ACRfull#1#2[#3]{%
  \@glsxtr@base@acrcmd\ACRfull\GLSxtrfull
  \ACRfullfmt{#1}{#2}{#3}%
}
\def\@acrfullpl#1#2[#3]{%
  \@glsxtr@base@acrcmd\acrfullpl\glsxtrfullpl
  \acrfullplfmt{#1}{#2}{#3}%
}
\def\@Acrfullpl#1#2[#3]{%
  \@glsxtr@base@acrcmd\Acrfullpl\Glsxtrfullpl
  \Acrfullplfmt{#1}{#2}{#3}%
}
\def\@ACRfullpl#1#2[#3]{%
  \@glsxtr@base@acrcmd\ACRfullpl\GLSxtrfullpl
  \ACRfullplfmt{#1}{#2}{#3}%
}
\renewcommand*{\@glsaddkey}[7]{%
  \key@ifundefined{glossentry}{#1}%
  {%
    \define@key{glossentry}{#1}{\csdef{@glo@#1}{##1}}%
    \appto\@gls@keymap{,{#1}{#1}}%
    \appto\@newglossaryentryprehook{\csdef{@glo@#1}{#2}}%
    \appto\@newglossaryentryposthook{%
      \letcs{\@glo@tmp}{@glo@#1}%
      \gls@assign@field{#2}{\@glo@label}{#1}{\@glo@tmp}%
    }%
    \newcommand*{#3}[1]{\@gls@entry@field{##1}{#1}}%
    \newcommand*{#4}[1]{\@Gls@entry@field{##1}{#1}}%
    \ifcsdef{@gls@user@#1@}%
    {%
       \PackageError{glossaries}%
       {Can't define `\string#5' as helper command
        `\expandafter\string\csname @gls@user@#1@\endcsname' already
        exists}%
       {}%
    }%
    {%
      \expandafter\newcommand\expandafter*\expandafter
        {\csname @gls@user@#1\endcsname}[2][]{%
          \new@ifnextchar[%
            {\csuse{@gls@user@#1@}{##1}{##2}}%
            {\csuse{@gls@user@#1@}{##1}{##2}[]}}%
      \csdef{@gls@user@#1@}##1##2[##3]{%
        \@gls@field@link{##1}{##2}{#3{##2}##3}%
      }%
      \newrobustcmd*{#5}{%
        \expandafter\@gls@hyp@opt\csname @gls@user@#1\endcsname}%
    }%
    \ifcsdef{@Gls@user@#1@}%
    {%
       \PackageError{glossaries}%
       {Can't define `\string#6' as helper command
        `\expandafter\string\csname @Gls@user@#1@\endcsname' already
         exists}%
       {}%
    }%
    {%
      \expandafter\newcommand\expandafter*\expandafter
        {\csname @Gls@user@#1\endcsname}[2][]{%
          \new@ifnextchar[%
            {\csuse{@Gls@user@#1@}{##1}{##2}}%
            {\csuse{@Gls@user@#1@}{##1}{##2}[]}}%
      \csdef{@Gls@user@#1@}##1##2[##3]{%
        \@gls@field@link[\let\glscapscase\@secondofthree]%
          {##1}{##2}{#4{##2}##3}%
      }%
      \newrobustcmd*{#6}{%
        \expandafter\@gls@hyp@opt\csname @Gls@user@#1\endcsname}%
    }%
    \ifcsdef{@GLS@user@#1@}%
    {%
       \PackageError{glossaries}%
       {Can't define `\string#7' as helper command
        `\expandafter\string\csname @GLS@user@#1@\endcsname' already
         exists}%
       {}%
    }%
    {%
      \expandafter\newcommand\expandafter*\expandafter
        {\csname @GLS@user@#1\endcsname}[2][]{%
          \new@ifnextchar[%
            {\csuse{@GLS@user@#1@}{##1}{##2}}%
            {\csuse{@GLS@user@#1@}{##1}{##2}[]}}%
      \csdef{@GLS@user@#1@}##1##2[##3]{%
        \@gls@field@link[\let\glscapscase\@thirdofthree]%
           {##1}{##2}{\mfirstucMakeUppercase{#3{##2}##3}}%
      }%
      \newrobustcmd*{#7}{%
        \expandafter\@gls@hyp@opt\csname @GLS@user@#1\endcsname}%
    }%
  }%
  {%
    \PackageError{glossaries-extra}{Key `#1' already exists}{}%
  }%
}
\providecommand*{\@gls@link@nocheckfirsthyper}{}
\let\@glsxtr@org@checkfirsthyper\@gls@link@checkfirsthyper
\renewcommand*{\@gls@link@checkfirsthyper}{%
  \ifglsused{\glslabel}%
   {\let\glsxtrifwasfirstuse\@secondoftwo}
   {\let\glsxtrifwasfirstuse\@firstoftwo}%
  \protected@edef\glscategorylabel{\glscategory{\glslabel}}%
  \ifglsused{\glslabel}%
  {%
    \glsifcategoryattribute{\glscategorylabel}{nohypernext}{true}%
      {\KV@glslink@hyperfalse}{}%
  }%
  {%
    \glsifcategoryattribute{\glscategorylabel}{nohyperfirst}{true}%
      {\KV@glslink@hyperfalse}{}%
  }%
  \glslinkcheckfirsthyperhook
}
\ifdef\do@glsdisablehyperinlist
{%
  \let\@glsxtr@do@glsdisablehyperinlist\do@glsdisablehyperinlist
  \renewcommand*{\do@glsdisablehyperinlist}{%
    \@glsxtr@do@glsdisablehyperinlist
    \glsifattribute{\glslabel}{nohyper}{true}{\KV@glslink@hyperfalse}{}%
  }
}
{}
\define@boolkey{glslink}{noindex}[true]{}
\KV@glslink@noindexfalse
\providecommand*{\@gls@save@glslocal}{%
  \let\if@org@KV@glslink@local\ifKV@glslink@local
}
\providecommand*{\@gls@restore@glslocal}{%
  \ifKV@glslink@local
    \let\@gls@do@glsunset\glslocalunset
  \else
    \let\@gls@do@glsunset\glsunset
  \fi
}
\providecommand*{\@gls@do@glsunset}[1]{\glsunset{#1}}
\ifdef\@gls@setdefault@glslink@opts
{
  \renewcommand*{\@gls@setdefault@glslink@opts}{%
    \KV@glslink@noindexfalse
    \@glsxtrsetaliasnoindex
  }
}
{
  \newcommand*{\@gls@setdefault@glslink@opts}{%
    \KV@glslink@noindexfalse
    \@glsxtrsetaliasnoindex
  }
  \preto\do@glsdisablehyperinlist{\@gls@setdefault@glslink@opts}
}
\providecommand*{\glsxtrsetaliasnoindex}{%
 \KV@glslink@noindextrue
}
\newcommand*{\@glsxtrsetaliasnoindex}{%
 \ifcsvoid{glo@\glsdetoklabel{\glslabel}@alias}%
 {}%
 {%
   \let\glsxtrindexaliased\@glsxtrindexaliased
   \glsxtrsetaliasnoindex
   \let\glsxtrindexaliased\@no@glsxtrindexaliased
 }%
}
\newcommand{\@glsxtrindexaliased}{%
 \ifKV@glslink@noindex
 \else
   \begingroup
   \let\@glsnumberformat\@glsxtr@defaultnumberformat
   \protected@edef\@gls@counter{\csname glo@\glsdetoklabel{\glslabel}@counter\endcsname}%
   \glsxtr@saveentrycounter
   \@@do@wrglossary{\glsxtralias{\glslabel}}%
   \endgroup
 \fi
}
\newcommand{\@no@glsxtrindexaliased}{%
  \PackageError{glossaries-extra}{\string\glsxtrindexaliased\space
  not permitted outside definition of \string\glsxtrsetaliasnoindex}%
  {}%
}
\let\glsxtrindexaliased\@no@glsxtrindexaliased
\newcommand*{\GlsXtrSetDefaultGlsOpts}[1]{%
  \renewcommand*{\@gls@setdefault@glslink@opts}{%
    \setkeys{glslink}{#1}%
    \@glsxtrsetaliasnoindex
  }%
}
\newcommand*{\glsxtrifindexing}[2]{%
  \ifKV@glslink@noindex #2\else #1\fi
}
\renewcommand*{\glswriteentry}[2]{%
  \glsxtrifindexing
  {%
   \ifglsindexonlyfirst
     \GlsXtrIfUnusedOrUndefined{#1}
     {#2}%
     {\glsxtrdoautoindexname{#1}{dualindex}}%
   \else
     \glsifattribute{#1}{indexonlyfirst}{true}%
     {%
       \GlsXtrIfUnusedOrUndefined{#1}%
       {#2}%
       {\glsxtrdoautoindexname{#1}{dualindex}}%
     }%
     {#2}%
   \fi
  }%
  {}%
}
\appto\@@do@@wrglossary{\@glsxtr@do@@wrindex
  \glsxtrdowrglossaryhook{\@gls@label}%
}
\appto\gls@noidxglossary{\@glsxtr@do@@wrindex
  \glsxtrdowrglossaryhook{\@gls@label}%
}
\newcommand*{\@glsxtr@do@@wrindex}{%
  \glsxtrdoautoindexname{\@gls@label}{dualindex}%
}
\newcommand*{\glsxtrdowrglossaryhook}[1]{}
\newcommand*{\@gls@alt@hyp@opt}[1]{%
 \let\glslinkvar\@firstofthree
 \let\@gls@hyp@opt@cs#1\relax
 \@ifstar{\s@gls@hyp@opt}%
 {\@ifnextchar+%
   {\@firstoftwo{\p@gls@hyp@opt}}%
   {%
     \expandafter\@ifnextchar\@gls@alt@hyp@opt@char
     {\@firstoftwo{\@alt@gls@hyp@opt}}%
     {#1}%
   }%
 }%
}
\newcommand*{\@alt@gls@hyp@opt}[1][]{%
 \let\glslinkvar\@firstofthree
 \expandafter\@gls@hyp@opt@cs\expandafter[\@gls@alt@hyp@opt@keys,#1]}
\newcommand*{\@gls@alt@hyp@opt@char}{}
\newcommand*{\@gls@alt@hyp@opt@keys}{}
\newcommand*{\GlsXtrSetAltModifier}[2]{%
  \let\@gls@hyp@opt\@gls@alt@hyp@opt
  \ifstrequal{#1}{+}%
  {\PackageError{glossaries-extra}%
   {Can't use '#1' as modifier (it's already in use)}{}}%
  {%
    \ifstrequal{#1}{*}%
    {\PackageError{glossaries-extra}%
     {Can't use '#1' as modifier (it's already in use)}{}}%
    {}%
  }%
  \def\@gls@alt@hyp@opt@char{#1}%
  \def\@gls@alt@hyp@opt@keys{#2}%
  \ifdefequal\@glsxtr@record@setting\@glsxtr@record@setting@off
  {}%
  {%
    \protected@write\@auxout{}{\string\providecommand{\string\@glsxtr@altmodifier}[1]{}}%
    \protected@write\@auxout{}{\string\@glsxtr@altmodifier{#1}}%
  }%
}
\let\glsxtr@org@dohyperlink\glsdohyperlink
\ifdef\glsnavhyperlink
{
  \renewcommand*{\glsnavhyperlink}[3][\@glo@type]{%
    \protected@edef\gls@grplabel{#2}\protected@edef\@gls@grptitle{#3}%
    {%
      \let\glsxtrdohyperlink\glsxtr@org@dohyperlink
      \@glslink{\glsnavhyperlinkname{#1}{#2}}{#3}%
    }%
  }%
}
{}
\ifdef\@@gls@navhypertarget
{}
{%
 \renewcommand*{\glsnavhypertarget}{\protect\@@gls@navhypertarget}
 \newcommand*{\@@gls@navhypertarget}[3][\@glo@type]{%
   \@glsnavhypertarget{#1}{#2}{#3}%
 }
}%
\ifdef\@glsnavhypertarget
{%
  \renewcommand*{\@glsnavhypertarget}[3]{%
    \protected@write\@auxout{}{\string\@gls@hypergroup{#1}{#2}}%
    \@glsxtr@do@org@target{\glsnavhyperlinkname{#1}{#2}}{#3}%
    \ifcsdef{@gls@hypergrouplist@#1}%
    {%
      \letcs\@gls@list{@gls@hypergrouplist@#1}%
      \protected@edef\@gls@thishypernavlabel{#2}%
      \expandafter\DTLifinlist\expandafter{\@gls@thishypernavlabel}\@gls@list{}%
      {%
        \GlossariesWarningNoLine{Navigation panel
           for glossary type `#1'^^Jmissing group `#2'}%
        \gdef\gls@hypergrouprerun{%
          \GlossariesWarningNoLine{Navigation panel
          has changed. Rerun LaTeX}}%
      }%
    }%
    {%
      \GlossariesWarningNoLine{Navigation panel
         for glossary type `#1'^^Jmissing group `#2'}%
      \gdef\gls@hypergrouprerun{%
        \GlossariesWarningNoLine{Navigation panel
        has changed. Rerun LaTeX}}%
    }%
  }%
}
{}
\newcommand*{\glsxtrdohyperlink}[2]{%
 \glshasattribute{\glslabel}{targeturl}%
 {%
   \glshasattribute{\glslabel}{targetname}%
   {%
     \glshasattribute{\glslabel}{targetcategory}%
     {%
       \hyperref{\glsgetattribute{\glslabel}{targeturl}}%
         {\glsgetattribute{\glslabel}{targetcategory}}%
         {\glsgetattribute{\glslabel}{targetname}}%
         {{\glsxtrprotectlinks#2}}%
     }%
     {%
       \hyperref{\glsgetattribute{\glslabel}{targeturl}}%
         {}%
         {\glsgetattribute{\glslabel}{targetname}}%
         {{\glsxtrprotectlinks#2}}%
     }%
   }%
   {%
     \href{\glsgetattribute{\glslabel}{targeturl}}%
       {{\glsxtrprotectlinks#2}}%
   }%
 }%
 {%
   \glsfieldfetch{\glslabel}{alias}{\gloaliaslabel}%
   \ifdefvoid\gloaliaslabel
   {%
     \glsxtrhyperlink{#1}{{\glsxtrprotectlinks#2}}%
   }%
   {%
     \glsxtrifmulti\gloaliaslabel
     {%
       \letcs\gloaliaslabel{@gls@combined@\gloaliaslabel @main}%
     }%
     {}%
     \glsxtrhyperlink
     {\glolinkprefix\glsdetoklabel{\gloaliaslabel}}%
     {{\glsxtrprotectlinks#2}}%
   }%
 }%
}

\newcommand{\glsxtrhyperlink}[2]{%
  \glsdoshowtarget{#1}{\hyperlink{#1}{#2}}%
}%
\renewrobustcmd*{\glshyperlink}[2][\glsentrytext{\@glo@label}]{%
 \glsdoifexists{#2}%
 {%
   \def\@glo@label{#2}%
   {\protected@edef\glslabel{#2}%
   \@glslink{\glolinkprefix\glslabel}{#1}}%
 }%
}
\renewcommand{\glsdisablehyper}{%
  \KV@glslink@hyperfalse
  \def\@glslink{\glsdonohyperlink}%
  \let\@glstarget\@secondoftwo
}
\renewcommand{\glsenablehyper}{%
 \KV@glslink@hypertrue
 \def\@glslink{\glsxtrdohyperlink}%
 \def\@glstarget{\glsdohypertarget}%
}
\def\glsdonohyperlink#1#2{{\glsxtrprotectlinks #2}}
\ifcsundef{hyperlink}%
{%
  \def\@glslink{\glsdonohyperlink}
}%
{%
  \def\@glslink{\glsxtrdohyperlink}
}
\newcommand*{\glsxtrprotectlinks}{%
  \KV@glslink@hyperfalse
  \KV@glslink@noindextrue
  \let\@gls@\@glsxtr@p@text@
  \let\@Gls@\@Glsxtr@p@text@
  \let\@GLS@\@GLSxtr@p@text@
  \let\@glspl@\@glsxtr@p@plural@
  \let\@Glspl@\@Glsxtr@p@plural@
  \let\@GLSpl@\@GLSxtr@p@plural@
  \let\@glsxtrshort\@glsxtr@p@short@
  \let\@Glsxtrshort\@Glsxtr@p@short@
  \let\@GLSxtrshort\@GLSxtr@p@short@
  \let\@glsxtrlong\@glsxtr@p@long@
  \let\@Glsxtrlong\@Glsxtr@p@long@
  \let\@GLSxtrlong\@GLSxtr@p@long@
  \let\@glsxtrshortpl\@glsxtr@p@shortpl@
  \let\@Glsxtrshortpl\@Glsxtr@p@shortpl@
  \let\@GLSxtrshortpl\@GLSxtr@p@shortpl@
  \let\@glsxtrlongpl\@glsxtr@p@longpl@
  \let\@Glsxtrlongpl\@Glsxtr@p@longpl@
  \let\@GLSxtrlongpl\@GLSxtr@p@longpl@
  \let\@acrshort\@glsxtr@p@acrshort@
  \let\@Acrshort\@Glsxtr@p@acrshort@
  \let\@ACRshort\@GLSxtr@p@acrshort@
  \let\@acrshortpl\@glsxtr@p@acrshortpl@
  \let\@Acrshortpl\@Glsxtr@p@acrshortpl@
  \let\@ACRshortpl\@GLSxtr@p@acrshortpl@
  \let\@acrlong\@glsxtr@p@acrlong@
  \let\@Acrlong\@Glsxtr@p@acrlong@
  \let\@ACRlong\@GLSxtr@p@acrlong@
  \let\@acrlongpl\@glsxtr@p@acrlongpl@
  \let\@Acrlongpl\@Glsxtr@p@acrlongpl@
  \let\@ACRlongpl\@GLSxtr@p@acrlongpl@
}
\def\@glsxtr@p@text@#1#2[#3]{{\@glstext@{#1}{#2}[#3]}}
\def\@Glsxtr@p@text@#1#2[#3]{{\@Glstext@{#1}{#2}[#3]}}
\def\@GLSxtr@p@text@#1#2[#3]{{\@GLStext@{#1}{#2}[#3]}}
\def\@glsxtr@p@plural@#1#2[#3]{{\@glsplural@{#1}{#2}[#3]}}
\def\@Glsxtr@p@plural@#1#2[#3]{{\@Glsplural@{#1}{#2}[#3]}}
\def\@GLSxtr@p@plural@#1#2[#3]{{\@GLSplural@{#1}{#2}[#3]}}
\def\@glsxtr@p@short@#1#2[#3]{%
 {%
  \glssetabbrvfmt{\glscategory{#2}}%
  \glsabbrvfont{\glsentryshort{#2}}#3%
 }%
}
\def\@Glsxtr@p@short@#1#2[#3]{%
 {%
   \glssetabbrvfmt{\glscategory{#2}}%
   \glsabbrvfont{\Glsentryshort{#2}}#3%
 }%
}
\def\@GLSxtr@p@short@#1#2[#3]{%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \mfirstucMakeUppercase{\glsabbrvfont{\glsentryshort{#2}}#3}%
  }%
}
\def\@glsxtr@p@shortpl@#1#2[#3]{%
 {%
   \glssetabbrvfmt{\glscategory{#2}}%
   \glsabbrvfont{\glsentryshortpl{#2}}#3%
 }%
}
\def\@Glsxtr@p@shortpl@#1#2[#3]{%
 {%
   \glssetabbrvfmt{\glscategory{#2}}%
   \glsabbrvfont{\Glsentryshortpl{#2}}#3%
 }%
}
\def\@GLSxtr@p@shortpl@#1#2[#3]{%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \mfirstucMakeUppercase{\glsabbrvfont{\glsentryshortpl{#2}}#3}%
  }%
}
\def\@glsxtr@p@long@#1#2[#3]{{\glsentrylong{#2}#3}}
\def\@Glsxtr@p@long@#1#2[#3]{{\Glsentrylong{#2}#3}}
\def\@GLSxtr@p@long@#1#2[#3]{%
  {\mfirstucMakeUppercase{\glslongfont{\glsentrylong{#2}}#3}}}
\def\@glsxtr@p@longpl@#1#2[#3]{{\glsentrylongpl{#2}#3}}
\def\@Glsxtr@p@longpl@#1#2[#3]{{\glslongfont{\Glsentrylongpl{#2}}#3}}
\def\@GLSxtr@p@longpl@#1#2[#3]{%
  {\mfirstucMakeUppercase{\glslongfont{\glsentrylongpl{#2}}#3}}}
\def\@glsxtr@p@acrshort@#1#2[#3]{{\acronymfont{\glsentryshort{#2}}#3}}
\def\@Glsxtr@p@acrshort@#1#2[#3]{{\acronymfont{\Glsentryshort{#2}}#3}}
\def\@GLSxtr@p@acrshort@#1#2[#3]{%
  {\mfirstucMakeUppercase{\acronymfont{\glsentryshort{#2}}#3}}}
\def\@glsxtr@p@acrshortpl@#1#2[#3]{{\acronymfont{\glsentryshortpl{#2}}#3}}
\def\@Glsxtr@p@acrshortpl@#1#2[#3]{{\acronymfont{\Glsentryshortpl{#2}}#3}}
\def\@GLSxtr@p@acrshortpl@#1#2[#3]{%
  {\mfirstucMakeUppercase{\acronymfont{\glsentryshortpl{#2}}#3}}}
\def\@glsxtr@p@acrlong@#1#2[#3]{{\glsentrylong{#2}#3}}
\def\@Glsxtr@p@acrlong@#1#2[#3]{{\Glsentrylong{#2}#3}}
\def\@GLSxtr@p@acrlong@#1#2[#3]{%
 {\mfirstucMakeUppercase{\glsentrylong{#2}#3}}}
\def\@glsxtr@p@acrlongpl@#1#2[#3]{{\glsentrylongpl{#2}#3}}
\def\@Glsxtr@p@acrlongpl@#1#2[#3]{{\Glsentrylongpl{#2}#3}}
\def\@GLSxtr@p@acrlongpl@#1#2[#3]{%
 {\mfirstucMakeUppercase{\glsentrylongpl{#2}#3}}}
\newcommand*{\@glsxtrp@opt}{hyper=false,noindex}
\newcommand*{\glsxtrsetpopts}[1]{%
  \renewcommand*{\@glsxtrp@opt}{#1}%
}
\newcommand*{\glossxtrsetpopts}{%
  \glsxtrsetpopts{noindex}%
}
\newrobustcmd*{\@@glsxtrp}[2]{%
  {%
    \let\glspostlinkhook\relax
    \csname#1\expandafter\endcsname\expandafter[\@glsxtrp@opt]{#2}[]%
  }%
}
\newrobustcmd*{\@glsxtrp}[2]{%
  \ifcsdef{gls#1}%
  {%
    \@@glsxtrp{gls#1}{#2}%
  }%
  {%
    \ifcsdef{glsxtr#1}%
    {%
      \@@glsxtrp{glsxtr#1}{#2}%
    }%
    {%
      \PackageError{glossaries-extra}{`#1' not recognised by
        \string\glsxtrp}{}%
    }%
  }%
}
\newrobustcmd*{\@Glsxtrp}[2]{%
  \ifcsdef{Gls#1}%
  {%
    \@@glsxtrp{Gls#1}{#2}%
  }%
  {%
    \ifcsdef{Glsxtr#1}%
    {%
      \@@glsxtrp{Glsxtr#1}{#2}%
    }%
    {%
      \PackageError{glossaries-extra}{`#1' not recognised by
        \string\Glsxtrp}{}%
    }%
  }%
}
\newrobustcmd*{\@GLSxtrp}[2]{%
  \ifcsdef{GLS#1}%
  {%
    \@@glsxtrp{GLS#1}{#2}%
  }%
  {%
    \ifcsdef{GLSxtr#1}%
    {%
      \@@glsxtrp{GLSxtr#1}{#2}%
    }%
    {%
      \PackageError{glossaries-extra}{`#1' not recognised by
        \string\GLSxtrp}{}%
    }%
  }%
}
\newrobustcmd*{\glsxtr@headentry@p}[2]{%
 \glsifattribute{#1}{headuc}{true}%
 {%
   \mfirstucMakeUppercase{\@gls@entry@field{#1}{#2}}%
 }%
 {%
   \@gls@entry@field{#1}{#2}%
 }%
}
\ifdef\texorpdfstring
{
  \newcommand{\glsxtrp}[2]{%
    \protect\NoCaseChange
    {%
      \protect\texorpdfstring
      {%
        \protect\glsxtrifinmark
        {%
          \ifcsdef{glsxtrhead#1}%
          {%
            {\protect\csuse{glsxtrhead#1}{#2}}%
          }%
          {%
            \glsxtr@headentry@p{#2}{#1}%
          }%
        }%
        {%
          \@glsxtrp{#1}{#2}%
        }%
      }%
      {%
        \protect\@gls@entry@field{#2}{#1}%
      }%
    }%
  }
}
{
  \newcommand{\glsxtrp}[2]{%
    \protect\NoCaseChange
    {%
      \protect\glsxtrifinmark
      {%
        \ifcsdef{glsxtrhead#1}%
        {%
          {\protect\csuse{glsxtrhead#1}}%
        }%
        {%
          \glsxtr@headentry@p{#2}{#1}%
        }%
      }%
      {%
        \@glsxtrp{#1}{#2}%
      }%
    }%
  }
}
\newcommand*{\glsps}{\glsxtrp{short}}
\newcommand*{\glspt}{\glsxtrp{text}}
\ifdef\texorpdfstring
{
  \newcommand{\Glsxtrp}[2]{%
    \protect\NoCaseChange
    {%
      \protect\texorpdfstring
      {%
        \protect\glsxtrifinmark
        {%
          \ifcsdef{Glsxtrhead#1}%
          {%
            {\protect\csuse{Glsxtrhead#1}{#2}}%
          }%
          {%
            \protect\@Gls@entry@field{#2}{#1}%
          }%
        }%
        {%
          \@Glsxtrp{#1}{#2}%
        }%
      }%
      {%
        \protect\@gls@entry@field{#2}{#1}%
      }%
    }%
  }
}
{
  \newcommand{\Glsxtrp}[2]{%
    \protect\NoCaseChange
    {%
      \protect\glsxtrifinmark
      {%
        \ifcsdef{Glsxtrhead#1}%
        {%
          {\protect\csuse{Glsxtrhead#1}}%
        }%
        {%
          \protect\@Gls@entry@field{#2}{#1}%
        }%
      }%
      {%
        \@Glsxtrp{#1}{#2}%
      }%
    }%
  }
}
\ifdef\texorpdfstring
{
  \newcommand{\GLSxtrp}[2]{%
    \protect\NoCaseChange
    {%
      \protect\texorpdfstring
      {%
        \protect\glsxtrifinmark
        {%
          \ifcsdef{GLSxtr#1}%
          {%
            {\protect\GLSxtrshort[noindex,hyper=false]{#1}[]}%
          }%
          {%
            \protect\mfirstucMakeUppercase
            {%
              \protect\@gls@entry@field{#2}{#1}%
            }%
          }%
        }%
        {%
          \@GLSxtrp{#1}{#2}%
        }%
      }%
      {%
        \protect\@gls@entry@field{#2}{#1}%
      }%
    }%
  }
}
{
  \newcommand{\GLSxtrp}[2]{%
    \protect\NoCaseChange
    {%
      \protect\glsxtrifinmark
      {%
        \ifcsdef{GLSxtr#1}%
        {%
          {\protect\GLSxtrshort[noindex,hyper=false]{#1}[]}%
        }%
        {%
          \protect\mfirstucMakeUppercase
          {%
            \protect\@gls@entry@field{#2}{#1}%
          }%
        }%
      }%
      {%
        \@GLSxtrp{#1}{#2}%
      }%
    }%
  }
}
\newcommand*{\@glsxtr@unset}[1]{%
  \@@glsunset{#1}%
  \glsxtrpostunset{#1}%
}%
\let\@glsunset\@glsxtr@unset
\newcommand*{\glsxtrpostunset}[1]{}
\newcommand*{\GlsXtrStartUnsetBuffering}{%
  \@ifstar\s@GlsXtrStartUnsetBuffering\@GlsXtrStartUnsetBuffering
}
\newcommand*{\@GlsXtrStartUnsetBuffering}{%
  \let\@glsxtr@org@unset@buffer\@glsxtr@unset@buffer
  \def\@glsxtr@unset@buffer{}%
  \let\@glsunset\@glsxtrbuffer@unset
}
\newcommand*{\s@GlsXtrStartUnsetBuffering}{%
  \let\@glsxtr@org@unset@buffer\@glsxtr@unset@buffer
  \def\@glsxtr@unset@buffer{}%
  \let\@glsunset\@glsxtrbuffer@nodup@unset
}
\newcommand*{\@glsxtrbuffer@unset}[1]{%
  \listxadd\@glsxtr@unset@buffer{#1}%
}
\newcommand*{\@glsxtrbuffer@nodup@unset}[1]{%
  \expandafter\ifinlist\expandafter{#1}{\@glsxtr@unset@buffer}{}%
  {\listxadd\@glsxtr@unset@buffer{#1}}%
}
\newcommand*{\GlsXtrStopUnsetBuffering}{%
  \@ifstar\s@GlsXtrStopUnsetBuffering\@GlsXtrStopUnsetBuffering
}
\newcommand*{\@GlsXtrStopUnsetBuffering}{%
  \let\@glsunset\@glsxtr@unset
  \forlistloop\@glsunset\@glsxtr@unset@buffer
  \let\@glsxtr@unset@buffer\@glsxtr@org@unset@buffer
}
\newcommand*{\s@GlsXtrStopUnsetBuffering}{%
  \forlistloop\@glslocalunset\@glsxtr@unset@buffer
  \let\@glsunset\@glsxtr@unset
}
\newcommand*{\GlsXtrDiscardUnsetBuffering}{%
  \let\@glsunset\@glsxtr@unset
  \let\@glsxtr@unset@buffer\@glsxtr@org@unset@buffer
}
\newcommand*{\GlsXtrForUnsetBufferedList}[1]{%
  \forlistloop#1\@glsxtr@unset@buffer
}
\renewcommand*{\@glslocalunset}[1]{%
  \@@glslocalunset{#1}%
  \glsxtrpostlocalunset{#1}%
}%
\newcommand*{\glsxtrpostlocalunset}[1]{}
\renewcommand*{\@glsreset}[1]{%
  \@@glsreset{#1}%
  \glsxtrpostreset{#1}%
}%
\newcommand*{\glsxtrpostreset}[1]{}
\renewcommand*{\@glslocalreset}[1]{%
  \@@glslocalreset{#1}%
  \glsxtrpostlocalreset{#1}%
}%
\newcommand*{\glsxtrpostlocalreset}[1]{}
\newcommand*{\glslocalreseteach}[1]{%
  \gls@ifnotmeasuring
  {%
    \@for\@gls@thislabel:=#1\do{%
      \glsdoifexists{\@gls@thislabel}%
      {%
        \@glslocalreset{\@gls@thislabel}%
      }%
    }%
  }%
}
\newcommand*{\glslocalunseteach}[1]{%
  \gls@ifnotmeasuring
  {%
    \@for\@gls@thislabel:=#1\do{%
      \glsdoifexists{\@gls@thislabel}%
      {%
        \@glslocalunset{\@gls@thislabel}%
      }%
    }%
  }%
}
\newcommand*{\GlsXtrEnableEntryCounting}[2]{%
  \glsenableentrycount
  \renewcommand*{\gls}{\cgls}%
  \renewcommand*{\Gls}{\cGls}%
  \renewcommand*{\glspl}{\cglspl}%
  \renewcommand*{\Glspl}{\cGlspl}%
  \renewcommand*{\GLS}{\cGLS}%
  \renewcommand*{\GLSpl}{\cGLSpl}%
  \@glsxtr@setentrycountunsetattr{#1}{#2}%
  \let\GlsXtrEnableEntryCounting\@glsxtr@setentrycountunsetattr
  \renewcommand*{\GlsXtrEnableEntryUnitCounting}[3]{%
   \PackageError{glossaries-extra}{\string\GlsXtrEnableEntryUnitCounting\space
    can't be used with \string\GlsXtrEnableEntryCounting}%
   {Use one or other but not both commands}}%
}
\newcommand*{\@glsxtr@setentrycountunsetattr}[2]{%
 \@for\@glsxtr@cat:=#1\do
 {%
   \ifdefempty{\@glsxtr@cat}{}%
   {%
     \glssetcategoryattribute{\@glsxtr@cat}{entrycount}{#2}%
   }%
 }%
}
\renewcommand*{\glsenableentrycount}{%
  \appto\@newglossaryentry@defcounters{\@@newglossaryentry@defcounters}%
  \renewcommand*{\gls@defdocnewglossaryentry}{%
    \renewcommand*\newglossaryentry[2]{%
      \PackageError{glossaries}{\string\newglossaryentry\space
      may only be used in the preamble when entry counting has
      been activated}{If you use \string\glsenableentrycount\space
      you must place all entry definitions in the preamble not in
      the document environment}%
    }%
  }%
  \newcommand*{\glsentrycurrcount}[1]{%
   \ifcsundef{glo@\glsdetoklabel{##1}@currcount}%
   {0}{\@gls@entry@field{##1}{currcount}}%
  }%
  \newcommand*{\glsentryprevcount}[1]{%
   \ifcsundef{glo@\glsdetoklabel{##1}@prevcount}%
   {0}{\@gls@entry@field{##1}{prevcount}}%
  }%
  \let\@glsxtr@entrycount@org@unset\glsxtrpostunset
  \renewcommand*{\glsxtrpostunset}[1]{%
    \@glsxtr@entrycount@org@unset{##1}%
    \@gls@increment@currcount{##1}%
  }%
  \let\@glsxtr@entrycount@org@localunset\glsxtrpostlocalunset
  \renewcommand*{\glsxtrpostlocalunset}[1]{%
    \@glsxtr@entrycount@org@localunset{##1}%
    \@gls@local@increment@currcount{##1}%
  }%
  \let\@glsxtr@entrycount@org@reset\glsxtrpostreset
  \renewcommand*{\glsxtrpostreset}[1]{%
    \@glsxtr@entrycount@org@reset{##1}%
    \csgdef{glo@\glsdetoklabel{##1}@currcount}{0}%
  }%
  \let\@glsxtr@entrycount@org@localreset\glsxtrpostlocalreset
  \renewcommand*{\glsxtrpostlocalreset}[1]{%
    \@glsxtr@entrycount@org@localreset{##1}%
    \csdef{glo@\glsdetoklabel{##1}@currcount}{0}%
  }%
  \let\@cgls@\@@cgls@
  \let\@cglspl@\@@cglspl@
  \let\@cGls@\@@cGls@
  \let\@cGlspl@\@@cGlspl@
  \let\@cGLS@\@@cGLS@
  \let\@cGLSpl@\@@cGLSpl@
  \AtEndDocument{\@gls@write@entrycounts}%
  \renewcommand*{\@gls@entry@count}[2]{%
    \csgdef{glo@\glsdetoklabel{##1}@prevcount}{##2}%
  }%
  \let\glsenableentrycount\relax
  \renewcommand*{\glsenableentryunitcount}{%
    \PackageError{glossaries-extra}{\string\glsenableentryunitcount\space
     can't be used with \string\glsenableentrycount}%
    {Use one or other but not both commands}%
  }%
}
\renewcommand*{\@gls@write@entrycounts}{%
  \immediate\write\@auxout
    {\string\providecommand*{\string\@gls@entry@count}[2]{}}%
  \count@=0\relax
  \forallglsentries{\@glsentry}{%
    \glshasattribute{\@glsentry}{entrycount}%
    {%
      \ifglsused{\@glsentry}%
      {%
        \immediate\write\@auxout
         {\string\@gls@entry@count{\@glsentry}{\glsentrycurrcount{\@glsentry}}}%
      }%
      {}%
      \advance\count@ by \@ne
    }%
    {}%
  }%
  \ifnum\count@=0
    \GlossariesExtraWarningNoLine{Entry counting has been enabled
     \MessageBreak with \string\glsenableentrycount\space but the
     \MessageBreak attribute `entrycount' hasn't
     \MessageBreak been assigned to any of the defined
     \MessageBreak entries}%
  \fi
}
\newcommand*{\glsxtrifcounttrigger}[3]{%
 \glshasattribute{#1}{entrycount}%
 {%
   \ifnum\glsentryprevcount{#1}>\glsgetattribute{#1}{entrycount}\relax
    #3%
   \else
    #2%
   \fi
 }%
 {#3}%
}
\def\@@cgls@#1#2[#3]{%
  \glsxtrifcounttrigger{#2}%
  {%
    \cglsformat{#2}{#3}%
    \glsunset{#2}%
  }%
  {%
    \@gls@{#1}{#2}[#3]%
  }%
}%
\def\@@cglspl@#1#2[#3]{%
  \glsxtrifcounttrigger{#2}%
  {%
    \cglsplformat{#2}{#3}%
    \glsunset{#2}%
  }%
  {%
    \@glspl@{#1}{#2}[#3]%
  }%
}%
\def\@@cGls@#1#2[#3]{%
  \glsxtrifcounttrigger{#2}%
  {%
    \cGlsformat{#2}{#3}%
    \glsunset{#2}%
  }%
  {%
    \@Gls@{#1}{#2}[#3]%
  }%
}%
\def\@@cGlspl@#1#2[#3]{%
  \glsxtrifcounttrigger{#2}%
  {%
    \cGlsplformat{#2}{#3}%
    \glsunset{#2}%
  }%
  {%
    \@Glspl@{#1}{#2}[#3]%
  }%
}%
\def\@@cGLS@#1#2[#3]{%
  \glsxtrifcounttrigger{#2}%
  {%
    \cGLSformat{#2}{#3}%
    \glsunset{#2}%
  }%
  {%
    \@GLS@{#1}{#2}[#3]%
  }%
}%
\def\@@cGLSpl@#1#2[#3]{%
  \glsxtrifcounttrigger{#2}%
  {%
    \cGLSplformat{#2}{#3}%
    \glsunset{#2}%
  }%
  {%
    \@GLSpl@{#1}{#2}[#3]%
  }%
}%
\def\@cgls@#1#2[#3]{\@gls@{#1}{#2}[#3]}
\def\@cGls@#1#2[#3]{\@Gls@{#1}{#2}[#3]}
\def\@cglspl@#1#2[#3]{\@glspl@{#1}{#2}[#3]}
\def\@cGlspl@#1#2[#3]{\@Glspl@{#1}{#2}[#3]}
\newrobustcmd*{\cGLS}{\@gls@hyp@opt\@cGLS}
\newcommand*{\@cGLS}[2][]{%
  \new@ifnextchar[{\@cGLS@{#1}{#2}}{\@cGLS@{#1}{#2}[]}%
}
\def\@cGLS@#1#2[#3]{\@GLS@{#1}{#2}[#3]}
\newcommand*{\cGLSformat}[2]{%
 \expandafter\mfirstucMakeUppercase\expandafter{\cglsformat{#1}{#2}}%
}
\newrobustcmd*{\cGLSpl}{\@gls@hyp@opt\@cGLSpl}
\newcommand*{\@cGLSpl}[2][]{%
  \new@ifnextchar[{\@cGLSpl@{#1}{#2}}{\@cGLSpl@{#1}{#2}[]}%
}
\def\@cGLSpl@#1#2[#3]{\@GLSpl@{#1}{#2}[#3]}
\newcommand*{\cGLSplformat}[2]{%
 \expandafter\mfirstucMakeUppercase\expandafter{\cglsplformat{#1}{#2}}%
}
\renewcommand*{\cglsformat}[2]{%
  \glsifregular{#1}
  {\glsentryfirst{#1}}%
  {\ifglshaslong{#1}{\glsentrylong{#1}}{\glsentryfirst{#1}}}#2%
}
\renewcommand*{\cGlsformat}[2]{%
  \glsifregular{#1}
  {\Glsentryfirst{#1}}%
  {\ifglshaslong{#1}{\Glsentrylong{#1}}{\Glsentryfirst{#1}}}#2%
}
\renewcommand*{\cglsplformat}[2]{%
  \glsifregular{#1}
  {\glsentryfirstplural{#1}}%
  {\ifglshaslong{#1}{\glsentrylongpl{#1}}{\glsentryfirstplural{#1}}}#2%
}
\renewcommand*{\cGlsplformat}[2]{%
  \glsifregular{#1}
  {\Glsentryfirstplural{#1}}%
  {\ifglshaslong{#1}{\Glsentrylongpl{#1}}{\Glsentryfirstplural{#1}}}#2%
}
\newcommand*{\@@newglossaryentry@defunitcounters}{%
  \protected@edef\@glo@countunit{\csuse{@glsxtr@categoryattr@@\@glo@category @unitcount}}%
  \ifdefvoid\@glo@countunit
  {}%
  {%
    \@glsxtr@ifunitcounter{\@glo@countunit}%
    {}%
    {\expandafter\@glsxtr@addunitcounter\expandafter{\@glo@countunit}}%
  }%
}
\newcommand*{\@glsxtr@unitcountlist}{}
\newcommand*{\@glsxtr@addunitcounter}[1]{%
 \listadd{\@glsxtr@unitcountlist}{#1}%
 \ifcsundef{glsxtr@theunit@#1}
 {%
   \ifcsdef{theH#1}%
   {\csdef{glsxtr@theunit@#1}{\csuse{theH#1}}}%
   {\csdef{glsxtr@theunit@#1}{\csuse{the#1}}}%
 }%
 {}%
}
\newcommand*{\@glsxtr@ifunitcounter}[3]{%
  \xifinlist{#1}{\@glsxtr@unitcountlist}{#2}{#3}%
}
\newcommand*\@glsxtr@currentunitcount[1]{%
 glo@\glsdetoklabel{#1}@currunit@\glsgetattribute{#1}{unitcount}.%
 \csuse{glsxtr@theunit@\glsgetattribute{#1}{unitcount}}%
}
\newcommand*\@glsxtr@previousunitcount[1]{%
 glo@\glsdetoklabel{#1}@prevunit@\glsgetattribute{#1}{unitcount}.%
 \csuse{glsxtr@theunit@\glsgetattribute{#1}{unitcount}}%
}
\newcommand*{\@gls@increment@currunitcount}[1]{%
  \glshasattribute{#1}{unitcount}%
  {%
    \protected@edef\@glsxtr@csname{\@glsxtr@currentunitcount{#1}}%
    \ifcsundef{\@glsxtr@csname}%
    {%
      \csgdef{\@glsxtr@csname}{1}%
      \listcsxadd
       {glo@\glsdetoklabel{#1}@unitlist}%
       {\glsgetattribute{#1}{unitcount}.%
        \csuse{glsxtr@theunit@\glsgetattribute{#1}{unitcount}}%
       }%
    }%
    {%
      \csxdef{\@glsxtr@csname}%
      {\number\numexpr\csname\@glsxtr@csname\endcsname+1}%
    }%
  }%
  {}%
}
\newcommand*{\@gls@local@increment@currunitcount}[1]{%
  \glshasattribute{#1}{unitcount}%
  {%
    \protected@edef\@glsxtr@csname{\@glsxtr@currentunitcount{#1}}%
    \ifcsundef{\@glsxtr@csname}%
    {%
      \csdef{\@glsxtr@csname}{1}%
      \listcseadd
       {glo@\glsdetoklabel{#1}@unitlist}%
       {\glsgetattribute{#1}{unitcount}.%
        \csuse{glsxtr@theunit@\glsgetattribute{#1}{unitcount}}%
       }%
    }%
    {%
      \csedef{\@glsxtr@csname}%
      {\number\numexpr\csname\@glsxtr@csname\endcsname+1}%
    }%
  }%
  {}%
}
\newcommand*{\@glsxtr@currunitcount}[2]{%
 \ifcsundef
 {glo@\glsdetoklabel{#1}@currunit@#2}%
 {0}%
 {\csuse{glo@\glsdetoklabel{#1}@currunit@#2}}%
}%
\newcommand*{\@glsxtr@prevunitcount}[2]{%
 \ifcsundef
 {glo@\glsdetoklabel{#1}@prevunit@#2}%
 {0}%
 {\csuse{glo@\glsdetoklabel{#1}@prevunit@#2}}%
}%
\newcommand*{\glsenableentryunitcount}{%
  \appto\@newglossaryentry@defcounters{\@@newglossaryentry@defunitcounters}%
  \renewcommand*{\gls@defdocnewglossaryentry}{%
    \renewcommand*\newglossaryentry[2]{%
      \PackageError{glossaries}{\string\newglossaryentry\space
      may only be used in the preamble when entry counting has
      been activated}{If you use \string\glsenableentryunitcount\space
      you must place all entry definitions in the preamble not in
      the document environment}%
    }%
  }%
  \newcommand*{\glsentrycurrcount}[1]{%
    \@glsxtr@currunitcount{##1}{\glsgetattribute{##1}{unitcount}.%
     \csuse{glsxtr@theunit@\glsgetattribute{##1}{unitcount}}}%
  }%
  \newcommand*{\glsentryprevcount}[1]{%
    \@glsxtr@prevunitcount{##1}{\glsgetattribute{##1}{unitcount}.%
     \csuse{glsxtr@theunit@\glsgetattribute{##1}{unitcount}}}%
  }%
  \newcommand*{\glsentryprevtotalcount}[1]{%
    \ifcsundef{glo@\glsdetoklabel{##1}@prevunittotal}%
    {0}%
    {%
      \number\csuse{glo@\glsdetoklabel{##1}@prevunittotal}
    }%
  }%
  \newcommand*{\glsentryprevmaxcount}[1]{%
    \ifcsundef{glo@\glsdetoklabel{##1}@prevunitmax}%
    {0}%
    {%
      \number\csuse{glo@\glsdetoklabel{##1}@prevunitmax}
    }%
  }%
  \let\@glsxtr@entryunitcount@org@unset\glsxtrpostunset
  \renewcommand*{\glsxtrpostunset}[1]{%
    \@glsxtr@entryunitcount@org@unset{##1}%
    \@gls@increment@currunitcount{##1}%
  }%
  \let\@glsxtr@entryunitcount@org@localunset\glsxtrpostlocalunset
  \renewcommand*{\glsxtrpostlocalunset}[1]{%
    \@glsxtr@entryunitcount@org@localunset{##1}%
    \@gls@local@increment@currunitcount{##1}%
  }%
  \let\@glsxtr@entryunitcount@org@reset\glsxtrpostreset
  \renewcommand*{\glsxtrpostreset}[1]{%
    \glshasattribute{##1}{unitcount}%
    {%
      \protected@edef\@glsxtr@csname{\@glsxtr@currentunitcount{##1}}%
      \ifcsundef{\@glsxtr@csname}%
      {}%
      {\csgdef{\@glsxtr@csname}{0}}%
    }%
    {}%
  }%
  \let\@glsxtr@entryunitcount@org@localreset\glsxtrpostlocalreset
  \renewcommand*{\glsxtrpostlocalreset}[1]{%
    \@glsxtr@entryunitcount@org@localreset{##1}%
    \glshasattribute{##1}{unitcount}%
    {%
      \protected@edef\@glsxtr@csname{\@glsxtr@currentunitcount{##1}}%
      \ifcsundef{\@glsxtr@csname}%
      {}%
      {\csdef{\@glsxtr@csname}{0}}%
    }%
    {}%
  }%
  \let\@cgls@\@@cgls@
  \let\@cglspl@\@@cglspl@
  \let\@cGls@\@@cGls@
  \let\@cGlspl@\@@cGlspl@
  \let\@cGLS@\@@cGLS@
  \let\@cGLSpl@\@@cGLSpl@
  \AtEndDocument{\@gls@write@entryunitcounts}%
  \renewcommand*{\@gls@entry@unitcount}[3]{%
    \csgdef{glo@\glsdetoklabel{##1}@prevunit@##3}{##2}%
    \ifcsundef{glo@\glsdetoklabel{##1}@prevunittotal}%
    {\csgdef{glo@\glsdetoklabel{##1}@prevunittotal}{##2}}%
    {%
      \csxdef{glo@\glsdetoklabel{##1}@prevunittotal}{
        \number\numexpr\csuse{glo@\glsdetoklabel{##1}@prevunittotal}+##2}%
    }%
    \ifcsundef{glo@\glsdetoklabel{##1}@prevunitmax}%
    {\csgdef{glo@\glsdetoklabel{##1}@prevunitmax}{##2}}%
    {%
      \ifnum\csuse{glo@\glsdetoklabel{##1}@prevunitmax}<##2
       \csgdef{glo@\glsdetoklabel{##1}@prevunitmax}{##2}%
      \fi
    }%
  }%
  \let\glsenableentryunitcount\relax
  \renewcommand*{\glsenableentrycount}{%
    \PackageError{glossaries-extra}{\string\glsenableentrycount\space
     can't be used with \string\glsenableentryunitcount}%
    {Use one or other but not both commands}%
  }%
}
\@onlypreamble\glsenableentryunitcount
\newcommand*{\@gls@entry@unitcount}[3]{}
\newcommand*{\@gls@write@entryunitcounts@do}[1]{%
  \immediate\write\@auxout
   {\string\@gls@entry@unitcount
     {\@glsentry}%
     {\@glsxtr@currunitcount{\@glsentry}{#1}%
     }%
     {#1}}%
}
\newcommand*{\@gls@write@entryunitcounts}{%
  \immediate\write\@auxout
    {\string\providecommand*{\string\@gls@entry@unitcount}[3]{}}%
  \count@=0\relax
  \forallglsentries{\@glsentry}{%
    \glshasattribute{\@glsentry}{unitcount}%
    {%
      \ifglsused{\@glsentry}%
      {%
        \forlistcsloop
          {\@gls@write@entryunitcounts@do}%
          {glo@\glsdetoklabel{\@glsentry}@unitlist}%
      }%
      {}%
      \advance\count@ by \@ne
    }%
    {}%
  }%
  \ifnum\count@=0
    \GlossariesExtraWarningNoLine{Entry counting has been enabled
     \MessageBreak with \string\glsenableentryunitcount\space but the
     \MessageBreak attribute `unitcount' hasn't
     \MessageBreak been assigned to any of the defined
     \MessageBreak entries}%
  \fi
}
\newcommand*{\GlsXtrEnableEntryUnitCounting}[3]{%
  \glsenableentryunitcount
  \renewcommand*{\gls}{\cgls}%
  \renewcommand*{\Gls}{\cGls}%
  \renewcommand*{\glspl}{\cglspl}%
  \renewcommand*{\Glspl}{\cGlspl}%
  \renewcommand*{\GLS}{\cGLS}%
  \renewcommand*{\GLSpl}{\cGLSpl}%
  \@glsxtr@setentryunitcountunsetattr{#1}{#2}{#3}%
  \let\GlsXtrEnableEntryUnitCounting\@glsxtr@setentryunitcountunsetattr
  \renewcommand*{\GlsXtrEnableEntryCounting}[2]{%
   \PackageError{glossaries-extra}{\string\GlsXtrEnableEntryCounting\space
    can't be used with \string\GlsXtrEnableEntryUnitCounting}%
   {Use one or other but not both commands}}%
}
\newcommand*{\@glsxtr@setentryunitcountunsetattr}[3]{%
 \@for\@glsxtr@cat:=#1\do
 {%
   \ifdefempty{\@glsxtr@cat}{}%
   {%
     \glssetcategoryattribute{\@glsxtr@cat}{entrycount}{#2}%
     \glssetcategoryattribute{\@glsxtr@cat}{unitcount}{#3}%
   }%
 }%
}
\renewcommand*{\SetGenericNewAcronym}{%
  \ifdefequal\@addtoacronymlists\@glsxtr@org@addtoacronynlists
  {}%
  {%
    \GlossariesWarning{\string\SetGenericNewAcronym\space used
    without restoring base acronym functions with
    \string\RestoreAcronyms}%
  }%
  \let\@Gls@entryname\@Gls@acrentryname
  \renewcommand{\newacronym}[4][]{%
    \ifdefempty{\@glsacronymlists}%
    {%
      \def\@glo@type{\acronymtype}%
      \setkeys{glossentry}{##1}%
      \DeclareAcronymList{\@glo@type}%
    }%
    {}%
    \glskeylisttok{##1}%
    \glslabeltok{##2}%
    \glsshorttok{##3}%
    \glslongtok{##4}%
    \newacronymhook
    \protected@edef\@do@newglossaryentry{%
      \noexpand\newglossaryentry{\the\glslabeltok}%
      {%
        type=\acronymtype,%
        name={\expandonce{\acronymentry{##2}}},%
        sort={\acronymsort{\the\glsshorttok}{\the\glslongtok}},%
        text={\the\glsshorttok},%
        short={\the\glsshorttok},%
        shortplural={\the\glsshorttok\noexpand\acrpluralsuffix},%
        long={\the\glslongtok},%
        longplural={\the\glslongtok\noexpand\acrpluralsuffix},%
        category=acronym,
        \GenericAcronymFields,%
        \the\glskeylisttok
      }%
    }%
    \@do@newglossaryentry
  }%
  \renewcommand*{\acrfullfmt}[3]{%
    \glslink[##1]{##2}{\genacrfullformat{##2}{##3}}}%
  \renewcommand*{\Acrfullfmt}[3]{%
    \glslink[##1]{##2}{\Genacrfullformat{##2}{##3}}}%
  \renewcommand*{\ACRfullfmt}[3]{%
    \glslink[##1]{##2}{%
      \mfirstucMakeUppercase{\genacrfullformat{##2}{##3}}}}%
  \renewcommand*{\acrfullplfmt}[3]{%
    \glslink[##1]{##2}{\genplacrfullformat{##2}{##3}}}%
  \renewcommand*{\Acrfullplfmt}[3]{%
    \glslink[##1]{##2}{\Genplacrfullformat{##2}{##3}}}%
  \renewcommand*{\ACRfullplfmt}[3]{%
    \glslink[##1]{##2}{%
      \mfirstucMakeUppercase{\genplacrfullformat{##2}{##3}}}}%
  \renewcommand*{\glsentryfull}[1]{\genacrfullformat{##1}{}}%
  \renewcommand*{\Glsentryfull}[1]{\Genacrfullformat{##1}{}}%
  \renewcommand*{\glsentryfullpl}[1]{\genplacrfullformat{##1}{}}%
  \renewcommand*{\Glsentryfullpl}[1]{\Genplacrfullformat{##1}{}}%
}
\let\@glsxtr@org@setacronymstyle\setacronymstyle
\let\@glsxtr@org@newacronymstyle\newacronymstyle
\let\@glsxtr@acronymlists\@glsacronymlists
\let\@glsxtr@org@addtoacronynlists\@addtoacronymlists
\let\@glsxtr@org@setacronymlists\SetAcronymLists
\newcommand{\@glsxtr@abbrlists}{}
\newcommand*{\forallabbreviationlists}[2]{%
  \@for#1:=\@glsxtr@abbrlists\do{\ifdefempty{#1}{}{#2}}%
}
\newcommand*{\@glsxtr@addabbreviationlist}[1]{%
  \protected@edef\@glo@type{#1}%
  \ifdefempty\@glsxtr@abbrlists
  {\let\@glsxtr@abbrlists\@glo@type}%
  {%
    \ifdefequal\@glsxtr@abbrlists\@glo@type
    {}%
    {%
      \expandafter\DTLifinlist\expandafter{\@glo@type}{\@glsxtr@abbrlists}{}%
      {\protected@eappto\@glsxtr@abbrlists{,\@glo@type}}%
    }%
  }%
}
\renewcommand*{\forallacronyms}[2]{%
  \@glsxtr@base@acrcmd\forallacronyms\forallabbreviationlists
  \@for#1:=\@glsacronymlists\do{\ifx#1\@empty\else#2\fi}%
}
\newcommand*{\MakeAcronymsAbbreviations}{%
   \@for\@gls@type:=\@glsacronymlists\do{%
     \csgdef{gls@\@gls@type @entryfmt}{\glsentryfmt}%
   }%
   \let\@glsxtr@acronymlists\@glsacronymlists
   \let\@glsacronymlists\@empty
   \let\@addtoacronymlists\@gobble
   \let\SetAcronymLists\@gobble
   \let\@glsxtr@base@acrcmd\@@glsxtr@base@acrcmd@warn
   \renewcommand*{\newacronym}[4][]{%
     \glsxtr@newabbreviation{type=\acronymtype,category=acronym,##1}{##2}{##3}{##4}%
   }%
   \renewcommand*{\firstacronymfont}[1]{\glsfirstabbrvfont{##1}}%
   \renewcommand*{\acronymfont}[1]{\glsabbrvfont{##1}}%
   \renewcommand*{\setacronymstyle}[1]{%
      \PackageError{glossaries-extra}{\string\setacronymstyle{##1}
      unavailable.
      Use \string\setabbreviationstyle[acronym]\space instead.
      The original acronym interface can be restored with
      \string\RestoreAcronyms}{}%
   }%
   \renewcommand*{\newacronymstyle}[1]{%
      \GlossariesExtraWarning{New acronym style `##1' won't be
      available unless you restore the original acronym interface with
      \string\RestoreAcronyms}%
      \@glsxtr@org@newacronymstyle{##1}%
   }%
}
\MakeAcronymsAbbreviations
\newcommand*{\RestoreAcronyms}{%
  \let\@glsacronymlists\@glsxtr@acronymlists
  \let\@addtoacronymlists\@glsxtr@org@addtoacronynlists
  \let\SetAcronymLists\@glsxtr@org@setacronymlists
  \let\@glsxtr@base@acrcmd\@gobbletwo
  \@for\@gls@type:=\@glsacronymlists\do{%
    \SetDefaultAcronymDisplayStyle{\@gls@type}%
  }%
  \SetGenericNewAcronym
  \renewcommand{\firstacronymfont}[1]{\acronymfont{##1}}%
  \renewcommand{\acronymfont}[1]{##1}%
  \let\setacronymstyle\@glsxtr@org@setacronymstyle
  \let\newacronymstyle\@glsxtr@org@newacronymstyle
  \renewcommand*\@gls@link@checkfirsthyper{%
    \ifglsused{\glslabel}%
    {\let\glsxtrifwasfirstuse\@secondoftwo}
    {\let\glsxtrifwasfirstuse\@firstoftwo}%
    \@glsxtr@org@checkfirsthyper
  }
  \glssetcategoryattribute{acronym}{regular}{false}%
  \setacronymstyle{long-short}%
}
\renewcommand*{\glsacspace}[1]{%
  \settowidth{\dimen@}{(\firstacronymfont{\glsentryshort{#1}})}%
  \ifdim\dimen@<\glsacspacemax~\else\space\fi
}
\newcommand*{\glsacspacemax}{3em}
\newcommand*{\@glsxtr@reg@glosslist}{}
\let\@glsxtr@org@makeglossaries\makeglossaries
\providecommand\@makeglossaries@warn@noprintglossary{%
  \ifdefstring{\@glo@types}{,}%
  {%
    \GlossariesWarningNoLine{No glossaries have been defined}%
  }%
  {%
    \GlossariesWarningNoLine{No \string\printglossary\space
      or \string\printglossaries\space
      found. ^^J(Remove \string\makeglossaries\space if you
      don't want any glossaries.) ^^JThis document will not
      have a glossary}%
  }%
}%
\providecommand{\@domakeglossaries}[1]{#1}
\renewcommand*{\makeglossaries}[1][]{%
 \@domakeglossaries
 {%
   \@glsxtr@if@record@only
   {%
    \PackageError{glossaries-extra}{\string\makeglossaries\space
     not permitted\MessageBreak with record=\@glsxtr@record@setting\space
     package option}%
    {You may only use \string\makeglossaries\space with
     record=off or record=hybrid options}%
   }%
   {%
     \ifblank{#1}%
     {%
        \@glsxtr@org@makeglossaries
        \ifx\@glsxtr@record@setting\@glsxtr@record@setting@alsoindex
          \let\warn@noprintglossary\@glsxtr@warn@hybrid@noprintgloss
        \fi
     }%
     {%
       \ifx\@glsxtr@record@setting\@glsxtr@record@setting@alsoindex
         \PackageError{glossaries-extra}{\string\makeglossaries[#1]\space
         not permitted\MessageBreak with record=\@glsxtr@record@setting\space package option}%
         {You may only use the hybrid \string\makeglossaries[...]\space with
          record=off option}%
       \else
         \ifdef\@gls@@automake@immediate{\@gls@@automake@immediate}{}%
         \protected@edef\@glsxtr@reg@glosslist{#1}%
         \ifundef{\glswrite}{\newwrite\glswrite}{}%
         \protected@write\@auxout{}{\string\providecommand
           \string\@glsorder[1]{}}
         \protected@write\@auxout{}{\string\providecommand
           \string\@istfilename[1]{}}
         \protected@write\@auxout{}{\string\@istfilename{\istfilename}}%
         \protected@write\@auxout{}{\string\@glsorder{\glsorder}}
         \protected@write\@auxout{}{\string\glsxtr@makeglossaries{#1}}
         \write\@auxout{\string\providecommand\string\@gls@reference[3]{}}%
         \@for\@glo@type:=#1\do{%
          \ifdefempty{\@glo@type}{}{\@makeglossary{\@glo@type}}%
         }%
         \renewcommand*\newglossary[4][]{%
         \PackageError{glossaries}{New glossaries
         must be created before \string\makeglossaries}{You need
         to move \string\makeglossaries\space after all your
         \string\newglossary\space commands}}%
          \let\@makeglossary\@gobble
          \renewcommand\makeglossaries[1][]{}%
          \@disable@onlypremakeg
          \let\gls@checkseeallowed\relax
          \renewcommand*{\@do@seeglossary}[2]{%
            \glsdoifexists{##1}%
            {%
              \protected@edef\@gls@label{\glsdetoklabel{##1}}%
              \protected@edef\@gls@type{\csname glo@\@gls@label @type\endcsname}%
              \expandafter\DTLifinlist\expandafter{\@gls@type}{\@glsxtr@reg@glosslist}%
              {\@glsxtr@org@doseeglossary{##1}{##2}}%
              {%
                \@@glsxtrwrglossmark
                \protected@write\@auxout{}{%
                  \string\@gls@reference
                    {\gls@type}{\@gls@label}{\string\glsseeformat##2{}}%
                }%
              }%
            }%
          }%
          \let\@glsxtr@@do@@wrglossary\@@do@@wrglossary
          \def\@@do@@wrglossary{%
            \protected@edef\@gls@type{\csname glo@\@gls@label @type\endcsname}%
            \expandafter\DTLifinlist\expandafter{\@gls@type}{\@glsxtr@reg@glosslist}%
            {\@glsxtr@@do@@wrglossary}%
            {\gls@noidxglossary}%
          }%
          \let\warn@nomakeglossaries\relax
          \let\warn@noprintglossary\@makeglossaries@warn@noprintglossary
          \renewcommand{\@gls@noref@warn}[1]{%
            \protected@edef\@gls@type{##1}%
            \expandafter\DTLifinlist\expandafter{\@gls@type}{\@glsxtr@reg@glosslist}%
            {%
              \GlossariesExtraWarning{Can't use
                 \string\printnoidxglossary[type={\@gls@type}]
                 when `\@gls@type' is listed in the optional argument of
                 \string\makeglossaries}%
            }%
            {%
              \GlossariesWarning{Empty glossary for
              \string\printnoidxglossary[type={##1}].
              Rerun may be required (or you may have forgotten to use
              commands like \string\gls)}%
            }%
          }%
          \renewcommand*{\glsdisplaynumberlist}[1]{%
            \expandafter\DTLifinlist\expandafter{##1}{\@glsxtr@reg@glosslist}%
            {\@glsxtr@idx@displaynumberlist{##1}}%
            {\@glsxtr@noidx@displaynumberlist{##1}}%
          }%
          \renewcommand*{\glsentrynumberlist}[1]{%
            \expandafter\DTLifinlist\expandafter{##1}{\@glsxtr@reg@glosslist}%
            {\@glsxtr@idx@entrynumberlist{##1}}%
            {\@glsxtr@noidx@entrynumberlist{##1}}%
          }%
          \renewcommand*{\glsnumberlistloop}[2]{%
            \expandafter\DTLifinlist\expandafter{##1}{\@glsxtr@reg@glosslist}%
            {%
               \PackageError{glossaries-extra}{\string\glsnumberlistloop\space
                not available for glossary `##1'}{}%
            }%
            {\@glsxtr@noidx@numberlistloop{##1}{##2}}%
          }%
          \renewcommand*{\glsprestandardsort}[3]{%
            \expandafter\DTLifinlist\expandafter{##2}{\@glsxtr@reg@glosslist}%
            {%
              \glsdosanitizesort
            }%
            {%
              \ifglssanitizesort
               \@gls@noidx@sanitizesort
              \else
               \@gls@noidx@nosanitizesort
              \fi
            }%
          }%
          \renewcommand*\new@glossaryentry[2]{%
            \PackageError{glossaries-extra}{Glossary entries must be defined
             in the preamble\MessageBreak when you use the optional argument
             of \string\makeglossaries}{Either move your definitions to the
             preamble or don't use the optional argument of
             \string\makeglossaries}%
          }%
          \let\@glo@assign@sortkey\@glsxtr@mixed@assign@sortkey
          \renewcommand*{\@printgloss@setsort}{%
            \expandafter\@glsxtr@gettype\expandafter,\@glsxtr@printglossopts,%
              type=\glsdefaulttype,\@end@glsxtr@gettype
            \def\@glo@sorttype{\@glo@default@sorttype}%
          }%
          \ifglsautomake
            \renewcommand*{\@gls@doautomake}{%
              \@for\@gls@type:=\@glsxtr@reg@glosslist\do{%
                \ifdefempty{\@gls@type}{}{\@gls@automake{\@gls@type}}%
              }%
            }%
          \fi
          \ifdef\@glo@check@sortallowed{\@glo@check@sortallowed\makeglossaries}{}%
       \fi
     }%
   }%
 }%
}
\ifdef\@printgloss@checkexists
{\newcommand{\glsxtr@printgloss@checkexists}{\@printgloss@checkexists}}
{\newcommand{\glsxtr@printgloss@checkexists}[2]{#2}}
\newcommand{\@glsxtr@orgprintglossary}[2]{%
  \def\@glo@type{\glsdefaulttype}%
  \def\glossarytitle{%
     \ifcsdef{@glotype@\@glo@type @title}%
     {\csuse{@glotype@\@glo@type @title}}%
     {\glossaryname}}%
  \def\glossarytoctitle{\glossarytitle}%
  \let\org@glossarytitle\glossarytitle
  \def\@glossarystyle{%
    \ifx\@glossary@default@style\relax
      \GlossariesWarning{No default glossary style provided \MessageBreak
        for the glossary `\@glo@type'. \MessageBreak
        Using deprecated fallback. \MessageBreak
        To fix this set the style with \MessageBreak
        \string\setglossarystyle\space or use the \MessageBreak
        style key=value option}%
    \fi
  }%
  \def\gls@dotoctitle{\glssettoctitle{\@glo@type}}%
  \let\@org@glossaryentrynumbers\glossaryentrynumbers
  \bgroup
    \@printgloss@setsort
    \setkeys{printgloss}{#1}%
    \ifx\glossarytitle\org@glossarytitle
    \else
      \cslet{@glotype@\@glo@type @title}{\glossarytitle}%
    \fi
    \let\currentglossary\@glo@type
    \let\org@glossaryentrynumbers\glossaryentrynumbers
    \let\glsnonextpages\@glsnonextpages
    \let\glsnextpages\@glsnextpages
    \glsxtractivatenopost
    \gls@dotoctitle
    \@glossarystyle
    \let\gls@org@glossaryentryfield\glossentry
    \let\gls@org@glossarysubentryfield\subglossentry
    \renewcommand{\glossentry}[1]{%
      \protected@xdef\glscurrententrylabel{\glsdetoklabel{##1}}%
      \gls@org@glossaryentryfield{##1}%
    }%
    \renewcommand{\subglossentry}[2]{%
      \protected@xdef\glscurrententrylabel{\glsdetoklabel{##2}}%
      \gls@org@glossarysubentryfield{##1}{##2}%
    }%
    \@gls@preglossaryhook
    \glsxtr@printgloss@checkexists{\@glo@type}{#2}%
  \egroup
  \global\let\glossaryentrynumbers\@org@glossaryentrynumbers
  \global\let\warn@noprintglossary\relax
}
\newcommand*{\glsxtractivatenopost}{%
  \let\nopostdesc\@nopostdesc
  \let\glsxtrnopostpunc\@glsxtr@nopostpunc
}
\newrobustcmd*{\glsxtrnopostpunc}{}
\newcommand{\@glsxtr@nopostpunc}{%
 \let\@@glsxtr@org@postdescription\glspostdescription
 \ifglsnopostdot
   \renewcommand{\glspostdescription}{%
     \glsnopostdottrue
     \let\glspostdescription\@@glsxtr@org@postdescription
     \let\glsxtrrestorepostpunc\@glsxtr@restore@postpunc
     \glsxtrpostdescription
     \@glsxtr@nopostpunc@postdesc}%
 \else
   \renewcommand{\glspostdescription}{%
     \let\glspostdescription\@@glsxtr@org@postdescription
     \let\glsxtrrestorepostpunc\@glsxtr@restore@postpunc
     \glsxtrpostdescription
     \@glsxtr@nopostpunc@postdesc}%
 \fi
 \glsnopostdotfalse
}
\newcommand*{\@glsxtr@nopostpunc@postdesc}{}
\newcommand*{\@glsxtr@restore@postpunc}{%
 \def\@glsxtr@nopostpunc@postdesc{%
   \@glsxtr@org@postdescription
   \let\@glsxtr@nopostpunc@postdesc\@empty
   \let\glsxtrrestorepostpunc\@empty
 }%
}
\newcommand*{\glsxtrrestorepostpunc}{}
\renewcommand{\@printglossary}[2]{%
  \def\@glsxtr@printglossopts{#1}%
  \@glsxtr@orgprintglossary{#1}{#2}%
}
\define@choicekey{printgloss}{target}
[\@glsxtr@printglossval\@glsxtr@printglossnr]%
{true,false}[true]%
{%
  \ifcase\@glsxtr@printglossnr
    \def\@glstarget{\glsdohypertarget}%
  \else
    \let\@glstarget\@secondoftwo
  \fi
}
\newcommand{\@glsxtrhypernameprefix}{}
\define@key{printgloss}{targetnameprefix}{%
  \renewcommand{\@glsxtrhypernameprefix}{#1}%
}
\define@key{printgloss}{prefix}{%
  \renewcommand{\glolinkprefix}{#1}%
}
\define@key{printgloss}{label}{%
  \glsxtrsetglossarylabel{#1}%
}
\newcommand{\glsxtrsetglossarylabel}[1]{%
  \renewcommand*{\@@glossaryseclabel}{%
    \protected@edef\@currentlabelname{\glossarytoctitle}%
    \label{#1}%
  }%
}
\newcount\@glsxtr@leveloffset
\define@key{printgloss}{leveloffset}{%
  \@glsxtr@assign@leveloffset#1\relax
}
\newcommand*{\@glsxtr@assign@leveloffset}{%
 \@ifnextchar+{\p@glsxtr@assign@leveloffset}{\np@glsxtr@assign@leveloffset}%
}
\newcommand*{\p@glsxtr@assign@leveloffset}[1]{%
 \@ifnextchar+{\pp@glsxtr@assign@leveloffset}{\np@glsxtr@assign@leveloffset}%
}
\def\np@glsxtr@assign@leveloffset#1\relax{\@glsxtr@leveloffset=#1\relax}
\def\pp@glsxtr@assign@leveloffset#1\relax{\advance\@glsxtr@leveloffset by #1\relax}
\define@boolkey{printgloss}[glsxtr@printgloss@]{groups}[true]{}
\glsxtr@printgloss@groupstrue
\let\@glsxtr@org@glsdohypertarget\glsdohypertarget
\renewcommand{\glsdohypertarget}[2]{%
  \@glsxtr@org@glsdohypertarget{\@glsxtrhypernameprefix#1}{#2}%
}
\ifx\@glstarget\@glsxtr@org@glsdohypertarget
 \def\@glstarget{\glsdohypertarget}%
\fi
\newcommand{\@glsxtr@do@org@target}[2]{%
 {%
  \let\glsdohypertarget\@glsxtr@org@glsdohypertarget
  \@glstarget{#1}{#2}%
 }%
}
\newcommand*{\glsxtr@makeglossaries}[1]{}
\def\@glsxtr@gettype#1,type=#2,#3\@end@glsxtr@gettype{%
  \def\@glo@type{#2}%
}
\newcommand\@glsxtr@mixed@assign@sortkey[1]{%
  \protected@edef\@glo@type{\@glo@type}%
  \expandafter\DTLifinlist\expandafter{\@glo@type}{\@glsxtr@reg@glosslist}%
  {%
    \@glo@no@assign@sortkey{#1}%
  }%
  {%
    \@@glo@assign@sortkey{#1}%
  }%
}%
\let\@glsxtr@idx@displaynumberlist\glsdisplaynumberlist
\newcommand*{\@glsxtr@noidx@displaynumberlist}[1]{%
  \letcs{\@gls@loclist}{glo@\glsdetoklabel{#1}@loclist}%
  \ifdef\@gls@loclist
  {%
    \def\@gls@noidxloclist@sep{%
      \def\@gls@noidxloclist@sep{%
        \def\@gls@noidxloclist@sep{%
          \glsnumlistsep
        }%
        \def\@gls@noidxloclist@finalsep{\glsnumlistlastsep}%
      }%
    }%
    \def\@gls@noidxloclist@finalsep{}%
    \def\@gls@noidxloclist@prev{}%
    \forlistloop{\glsnoidxdisplayloclisthandler}{\@gls@loclist}%
    \@gls@noidxloclist@finalsep
    \@gls@noidxloclist@prev
  }%
  {%
    \glsxtrundeftag
    \glsdoifexists{#1}%
    {%
      \GlossariesWarning{Missing location list for `#1'. Either
        a rerun is required or you haven't referenced the entry.}%
    }%
  }%
}%

\newcommand*{\@glsxtr@noidx@numberlistloop}[3]{%
  \letcs{\@gls@loclist}{glo@\glsdetoklabel{#1}@loclist}%
  \let\@gls@org@glsnoidxdisplayloc\glsnoidxdisplayloc
  \let\@gls@org@glsseeformat\glsseeformat
  \let\glsnoidxdisplayloc#2\relax
  \let\glsseeformat#3\relax
  \ifdef\@gls@loclist
  {%
    \forlistloop{\glsnoidxnumberlistloophandler}{\@gls@loclist}%
  }%
  {%
    \glsxtrundeftag
    \glsdoifexists{#1}%
    {%
      \GlossariesWarning{Missing location list for `##1'. Either
        a rerun is required or you haven't referenced the entry.}%
    }%
  }%
  \let\glsnoidxdisplayloc\@gls@org@glsnoidxdisplayloc
  \let\glsseeformat\@gls@org@glsseeformat
}%
\newcommand*{\@glsxtr@noidx@entrynumberlist}[1]{%
  \letcs{\@gls@loclist}{glo@\glsdetoklabel{#1}@loclist}%
  \ifdef\@gls@loclist
  {%
    \glsnoidxloclist{\@gls@loclist}%
  }%
  {%
    \glsxtrundeftag
    \glsdoifexists{#1}%
    {%
      \GlossariesWarning{Missing location list for `#1'. Either
        a rerun is required or you haven't referenced the entry.}%
    }%
  }%
}%
\newcommand*{\@glsxtr@idx@entrynumberlist}[1]{\glsentrynumberlist{#1}}
\renewcommand*{\@gls@noidx@getgrouptitle}[2]{%
  \protected@edef\@glsxtr@titlelabel{#1}%
  \ifdefvoid\@glsxtr@titlelabel
  {}%
  {%
    \protected@edef\@glsxtr@titlelabel{\csuse{glsxtr@grouptitle@#1}}%
  }%
  \ifdefvoid{\@glsxtr@titlelabel}%
  {%
    \DTLifint{#1}%
    {%
      \ifnum#1<256\relax
        \edef#2{\char#1\relax}%
      \else
        \edef#2{#1}%
      \fi
    }%
    {%
      \ifcsundef{#1groupname}%
      {\def#2{#1}}%
      {\letcs#2{#1groupname}}%
    }%
  }%
  {%
    \let#2\@glsxtr@titlelabel
  }%
}
\let\glsxtr@org@getgrouptitle\@gls@getgrouptitle
\newrobustcmd{\glsxtrgetgrouptitle}[2]{%
  \protected@edef\@glsxtr@titlelabel{glsxtr@grouptitle@#1}%
  \@onelevel@sanitize\@glsxtr@titlelabel
  \ifcsdef{\@glsxtr@titlelabel}
  {\letcs{#2}{\@glsxtr@titlelabel}}%
  {\glsxtr@org@getgrouptitle{#1}{#2}}%
}
\let\@gls@getgrouptitle\glsxtrgetgrouptitle
\newcommand{\glsxtrsetgrouptitle}[2]{%
  \protected@edef\@glsxtr@titlelabel{glsxtr@grouptitle@#1}%
  \@onelevel@sanitize\@glsxtr@titlelabel
  \protected@csxdef{\@glsxtr@titlelabel}{#2}%
}
\newcommand{\glsxtrlocalsetgrouptitle}[2]{%
  \protected@edef\@glsxtr@titlelabel{glsxtr@grouptitle@#1}%
  \@onelevel@sanitize\@glsxtr@titlelabel
  \protected@csedef{\@glsxtr@titlelabel}{#2}%
}
\renewcommand*{\glsnavigation}{%
  \def\@gls@between{}%
  \ifcsundef{@gls@hypergrouplist@\@glo@type}%
  {%
    \def\@gls@list{}%
  }%
  {%
    \expandafter\let\expandafter\@gls@list
      \csname @gls@hypergrouplist@\@glo@type\endcsname
  }%
  \@for\@gls@tmp:=\@gls@list\do{%
    \@gls@between
    \glsxtrgetgrouptitle{\@gls@tmp}{\@gls@grptitle}%
    \glsnavhyperlink{\@gls@tmp}{\@gls@grptitle}%
    \let\@gls@between\glshypernavsep
  }%
}
\renewcommand*{\@print@noidx@glossary}{%
  \ifcsdef{@glsref@\@glo@type}%
  {%
    \ifcsdef{@glo@sortmacro@\@glo@sorttype}%
    {%
      \csuse{@glo@sortmacro@\@glo@sorttype}{\@glo@type}%
    }%
    {%
      \PackageError{glossaries}{Unknown sort handler `\@glo@sorttype'}{}%
    }%
    \glossarysection[\glossarytoctitle]{\glossarytitle}%
    \glossarypreamble
    \def\@gls@currentlettergroup{}%
    \begin{theglossary}%
    \glossaryheader
    \glsresetentrylist
    \forlistcsloop{\@gls@noidx@do}{@glsref@\@glo@type}%
    \end{theglossary}%
    \glossarypostamble
  }%
  {%
    \glsxtrifemptyglossary{\@glo@type}%
    {}%
    {\glossarysection[\glossarytoctitle]{\glossarytitle}}%
    \@gls@noref@warn{\@glo@type}%
  }%
}
\renewcommand*{\glsnoidxdisplayloc}[4]{%
  \setentrycounter[#1]{#2}%
  \@glsxtr@display@loc#3\empty\end@glsxtr@display@loc{#4}%
}
\def\@glsxtr@display@loc#1#2\end@glsxtr@display@loc#3{%
  \ifx#1(\relax
    \glsxtrdisplaystartloc{#2}{#3}%
  \else
    \ifx#1)\relax
      \glsxtrdisplayendloc{#2}{#3}%
    \else
      \glsxtrdisplaysingleloc{#1#2}{#3}%
    \fi
  \fi
}
\newcommand*{\glsxtrdisplaysingleloc}[2]{%
  \csuse{#1}{#2}%
}
\newcommand*{\glsxtrdisplaystartloc}[2]{%
  \protected@edef\glsxtrlocrangefmt{#1}%
  \ifx\glsxtrlocrangefmt\empty
    \def\glsxtrlocrangefmt{glsnumberformat}%
  \fi
  \expandafter\glsxtrdisplaysingleloc
    \expandafter{\glsxtrlocrangefmt}{#2}%
}
\newcommand*{\glsxtrdisplayendloc}[2]{%
  \protected@edef\@glsxtr@tmp{#1}%
  \ifdefempty{\@glsxtr@tmp}{\def\@glsxtr@tmp{glsnumberformat}}{}%
  \ifx\glsxtrlocrangefmt\@glsxtr@tmp
  \else
    \GlossariesExtraWarning{Mismatched end location range
      (start=\glsxtrlocrangefmt, end=\@glsxtr@tmp)}%
  \fi
  \expandafter\glsxtrdisplayendlochook\expandafter{\@glsxtr@tmp}{#2}%
  \expandafter\glsxtrdisplaysingleloc
    \expandafter{\glsxtrlocrangefmt}{#2}%
  \def\glsxtrlocrangefmt{}%
}
\newcommand*{\glsxtrdisplayendlochook}[2]{}
\newcommand*{\glsxtrlocrangefmt}{}
\renewcommand*{\setentrycounter}[2][]{%
  \def\glsxtrcounterprefix{#1}%
  \ifx\glsxtrcounterprefix\@empty
    \def\@glo@counterprefix{.}%
  \else
    \def\@glo@counterprefix{.#1.}%
  \fi
  \def\glsentrycounter{#2}%
}
\def\@gls@removespaces#1 #2\@nil{%
 \toks@=\expandafter{\the\toks@#1}%
 \ifx\\#2\\%
   \edef\@glo@tmp{\the\toks@}%
   \ifx\@glo@tmp\empty
   \else
    \expandafter\glsxtrlocationhyperlink\expandafter
     \glsentrycounter\expandafter\@glo@counterprefix\expandafter{\the\toks@}%
   \fi
 \else
   \@gls@ReturnAfterFi{%
     \@gls@removespaces#2\@nil
   }%
 \fi
}
\newcommand*{\glsxtrlocationhyperlink}[3]{%
  \ifdefvoid\glsxtrsupplocationurl
  {%
    \GlsXtrInternalLocationHyperlink{#1}{#2}{#3}%
  }%
  {%
    \hyperref{\glsxtrsupplocationurl}{}{#1#2#3}{#3}%
  }%
}
\newcommand*{\glsxtrsupphypernumber}[1]{%
 {%
   \glshasattribute{\glscurrententrylabel}{externallocation}%
   {%
     \def\glsxtrsupplocationurl{%
       \glsgetattribute{\glscurrententrylabel}{externallocation}}%
   }%
   {%
     \def\glsxtrsupplocationurl{}%
   }%
   \glshypernumber{#1}%
 }%
}
\renewcommand{\@print@glossary}{%
  \makeatletter
  \@input@{\jobname.\csname @glotype@\@glo@type @in\endcsname}%
  \IfFileExists{\jobname.\csname @glotype@\@glo@type @in\endcsname}%
  {}%
  {\glsxtrNoGlossaryWarning{\@glo@type}}%
  \ifglsxindy
    \ifcsundef{@xdy@\@glo@type @language}%
    {%
      \edef\@do@auxoutstuff{%
        \noexpand\AtEndDocument{%
          \noexpand\immediate\noexpand\write\@auxout{%
            \string\providecommand\string\@xdylanguage[2]{}}%
          \noexpand\immediate\noexpand\write\@auxout{%
            \string\@xdylanguage{\@glo@type}{\@xdy@main@language}}%
        }%
      }%
    }%
    {%
      \edef\@do@auxoutstuff{%
        \noexpand\AtEndDocument{%
          \noexpand\immediate\noexpand\write\@auxout{%
            \string\providecommand\string\@xdylanguage[2]{}}%
          \noexpand\immediate\noexpand\write\@auxout{%
            \string\@xdylanguage{\@glo@type}{\csname @xdy@\@glo@type
              @language\endcsname}}%
        }%
      }%
    }%
    \@do@auxoutstuff
    \edef\@do@auxoutstuff{%
      \noexpand\AtEndDocument{%
         \noexpand\immediate\noexpand\write\@auxout{%
          \string\providecommand\string\@gls@codepage[2]{}}%
         \noexpand\immediate\noexpand\write\@auxout{%
          \string\@gls@codepage{\@glo@type}{\gls@codepage}}%
      }%
    }%
    \@do@auxoutstuff
  \fi
  \renewcommand*{\@warn@nomakeglossaries}{%
    \GlossariesWarningNoLine{\string\makeglossaries\space
    hasn't been used,^^Jthe glossaries will not be updated}%
  }%
}
\newcommand{\GlsXtrNoGlsWarningHead}[2]{%
 This document is incomplete. The external file associated with
 the glossary `#1' (which should be called \texttt{#2})
 hasn't been created.%
}
\newcommand{\GlsXtrNoGlsWarningEmptyStart}{%
  This has probably happened because there are no entries defined
  in this glossary.%
}
\newcommand{\GlsXtrNoGlsWarningEmptyMain}{%
 If you don't want this glossary,
 add \texttt{nomain} to your package option list when you load
 \texttt{glossaries-extra.sty}. For example:%
}
\newcommand{\GlsXtrNoGlsWarningEmptyNotMain}[1]{%
 Did you forget to use \texttt{type=#1} when you defined your
 entries? If you tried to load entries into this glossary with
 \texttt{\string\loadglsentries} did you remember to use
 \texttt{[#1]} as the optional argument? If you did, check that
 the definitions in the file you loaded all had the type set
 to \texttt{\string\glsdefaulttype}.%
}
\newcommand{\GlsXtrNoGlsWarningCheckFile}[1]{%
  Check the contents of the file \texttt{#1}. If
  it's empty, that means you haven't indexed any of your entries in this
  glossary (using commands like \texttt{\string\gls} or
  \texttt{\string\glsadd}) so this list can't be generated.
  If the file isn't empty, the document build process hasn't been
  completed.%
}
\newcommand{\GlsXtrNoGlsWarningAutoMake}[1]{%
  You may need to rerun \LaTeX. If you already have, it may be that
  \TeX's shell escape doesn't allow you to run
  \ifglsxindy xindy\else makeindex\fi. Check the
  transcript file \texttt{\jobname.log}. If the shell escape is
  disabled, try one of the following:

  \begin{itemize}
    \item Run the external (Lua) application:

       \texttt{makeglossaries-lite \string"\jobname\string"}

    \item Run the external (Perl) application:

       \texttt{makeglossaries \string"\jobname\string"}
  \end{itemize}

  Then rerun \LaTeX\ on this document.
  \GlossariesExtraWarning{Rerun required to build the
  glossary `#1' or check TeX's shell escape allows
  you to run \ifglsxindy xindy\else makeindex\fi}%
}
\newcommand{\GlsXtrNoGlsWarningMisMatch}{%
  You need to either replace \texttt{\string\makenoidxglossaries}
  with \texttt{\string\makeglossaries} or replace
  \texttt{\string\printglossary} (or \texttt{\string\printglossaries}) with
  \texttt{\string\printnoidxglossary}
  (or \texttt{\string\printnoidxglossaries}) and then rebuild
  this document.%
}
\newcommand{\GlsXtrNoGlsWarningBuildInfo}{%
  Try one of the following:
  \begin{itemize}
    \item Add \texttt{automake} to your package option list when you load
          \texttt{glossaries-extra.sty}. For example:

          \texttt{\string\usepackage[automake]%
              \glsopenbrace glossaries-extra\glsclosebrace}

    \item Run the external (Lua) application:

          \texttt{makeglossaries-lite.lua \string"\jobname\string"}

    \item Run the external (Perl) application:

          \texttt{makeglossaries \string"\jobname\string"}
  \end{itemize}

  Then rerun \LaTeX\ on this document.%
}
\newcommand{\GlsXtrRecordWarning}[1]{%
 \texttt{\string\printglossary} doesn't work
 with the \texttt{record=\@glsxtr@record@setting} package option
 use\par\texttt{\string\printunsrtglossary[type=#1]}\par
 instead (or change the package option).%
}
\newcommand{\GlsXtrNoGlsWarningTail}{%
 This message will be removed once the problem has been fixed.%
}
\newcommand{\GlsXtrNoGlsWarningNoOut}[1]{%
  The file \texttt{#1} doesn't exist. This most likely means you haven't used
  \texttt{\string\makeglossaries} or you have used
  \texttt{\string\nofiles}. If this is just a draft version of the
  document, you can suppress this message using the
  \texttt{nomissingglstext} package option.%
}
\newcommand*{\@glsxtr@defaultnoglossarywarning}[1]{%
 \glossarysection[\glossarytoctitle]{\glossarytitle}
 \GlsXtrNoGlsWarningHead{#1}{\jobname.\csname @glotype@\@glo@type @in\endcsname}
 \par
 \glsxtrifemptyglossary{#1}%
 {%
    \GlsXtrNoGlsWarningEmptyStart\space
    \ifthenelse{\equal{#1}{main}}{\GlsXtrNoGlsWarningEmptyMain\par
    \medskip
    \noindent\texttt{\string\usepackage[nomain\ifglsacronym ,acronym\fi]%
        \glsopenbrace glossaries-extra\glsclosebrace}
    \medskip
    }%
    {\GlsXtrNoGlsWarningEmptyNotMain{#1}}%
 }%
 {%
   \IfFileExists{\jobname.\csname @glotype@\@glo@type @out\endcsname}
   {%
     \GlsXtrNoGlsWarningCheckFile
       {\jobname.\csname @glotype@\@glo@type @out\endcsname}

     \ifglsautomake

      \GlsXtrNoGlsWarningAutoMake{#1}

     \else

        \ifthenelse{\equal{#1}{main}}%
        {%
          \GlsXtrNoGlsWarningEmptyMain\par
          \medskip
          \noindent\texttt{\string\usepackage[nomain]%
            \glsopenbrace glossaries-extra\glsclosebrace}
          \medskip
        }%
        {}%

        \ifdefequal\makeglossaries\@no@makeglossaries
        {%
          \GlsXtrNoGlsWarningMisMatch
        }%
        {%
          \GlsXtrNoGlsWarningBuildInfo
        }%
     \fi
   }%
   {%
     \GlsXtrNoGlsWarningNoOut
       {\jobname.\csname @glotype@\@glo@type @out\endcsname}%
   }%
 }%
 \par
 \GlsXtrNoGlsWarningTail
}
\newcommand*{\@glsxtr@record@noglossarywarning}[1]{%
  \GlossariesExtraWarning{\string\printglossary\space doesn't work\MessageBreak
  with record=\@glsxtr@record@setting\space package option\MessageBreak(use
  \string\printunsrtglossary[type=#1])\MessageBreak
  instead (or change the package option)}%
 \glossarysection[\glossarytoctitle]{\glossarytitle}
 \GlsXtrRecordWarning{#1}
 \GlsXtrNoGlsWarningTail
}
\newcommand*{\GlsXtrDefaultResourceOptions}{}
\newcommand*{\glsxtrresourcefile}[2][]{%
  \disable@keys{glossaries-extra.sty}{record}%
  \glsxtr@writefields
  \ifdefempty\GlsXtrDefaultResourceOptions
  {%
    \protected@write\@auxout{\glsxtrresourceinit}%
    {\string\glsxtr@resource{#1}{#2}}%
  }%
  {%
   \protected@write\@auxout{\glsxtrresourceinit}%
    {\string\glsxtr@resource{\GlsXtrDefaultResourceOptions,#1}{#2}}%
  }%
  \let\@glsxtr@org@see@noindex\@gls@see@noindex
  \let\@gls@see@noindex\relax
  \IfFileExists{#2.glstex}%
  {%
    \edef\@bibgls@restoreat{\noexpand\catcode\noexpand`\noexpand\@=\number\catcode`\@}%
    \makeatletter
    \@input{#2.glstex}%
    \@bibgls@restoreat
    \@glsxtr@check@bibgls@nameref
  }%
  {%
    \GlossariesExtraWarning{No file `#2.glstex'}%
  }%
  \let\@gls@see@noindex\@glsxtr@org@see@noindex
}
\@onlypreamble\glsxtrresourcefile
\newcommand{\@glsxtr@check@bibgls@nameref}{%
  \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
    \ifdef\bibglshrefchar
    {}%
    {%
      \GlossariesExtraWarning{record=nameref requires at least
      version 1.8 of bib2gls}%
    }%
  \fi
  \let\@glsxtr@check@bibgls@nameref\relax
}
\newcommand*{\glsxtrresourceinit}{}
\newcount\glsxtrresourcecount
\newcommand*{\GlsXtrLoadResources}[1][]{%
  \ifnum\glsxtrresourcecount=0\relax
    \glsxtrresourcefile[#1]{\jobname}%
  \else
    \glsxtrresourcefile[#1]{\jobname-\the\glsxtrresourcecount}%
  \fi
  \advance\glsxtrresourcecount by 1\relax
}
\newcommand*{\glsxtr@resource}[2]{}
\newcommand*{\glsxtr@fields}[1]{}
\newcommand*{\glsxtr@texencoding}[1]{}
\newcommand*{\glsxtr@langtag}[1]{}
\newcommand*{\glsxtr@pluralsuffixes}[4]{}
\newcommand*{\glsxtr@shortcutsval}[1]{}
\newcommand*{\glsxtr@linkprefix}[1]{}
\newcommand*{\glsxtr@writefields}{%
  \protected@write\@auxout{}%
   {\string\providecommand*{\string\glsxtr@fields}[1]{}}%
  \protected@write\@auxout{}%
   {\string\providecommand*{\string\glsxtr@resource}[2]{}}%
  \protected@write\@auxout{}%
   {\string\providecommand*{\string\glsxtr@pluralsuffixes}[4]{}}%
  \protected@write\@auxout{}%
   {\string\providecommand*{\string\glsxtr@shortcutsval}[1]{}}%
  \protected@write\@auxout{}%
   {\string\providecommand*{\string\glsxtr@linkprefix}[1]{}}%
  \protected@write\@auxout{}{\string\glsxtr@fields{\@gls@keymap}}%
  \protected@write\@auxout{}%
   {\string\providecommand*{\string\glsxtr@record}[5]{}}%
  \ifx\@glsxtr@record@setting\@glsxtr@record@setting@nameref
    \protected@write\@auxout{}%
     {\string\providecommand*{\string\glsxtr@record@nameref}[8]{}}%
  \fi
  \ifdef\CurrentTrackedLanguageTag
  {%
     \protected@write\@auxout{}{%
       \string\glsxtr@langtag{\CurrentTrackedLanguageTag}}%
  }%
  {}%
  \protected@write\@auxout{}{\string\glsxtr@pluralsuffixes
    {\glspluralsuffix}{\abbrvpluralsuffix}{\acrpluralsuffix}%
    {\glsxtrabbrvpluralsuffix}}%
  \ifdef\inputencodingname
  {%
     \protected@write\@auxout{}{\string\glsxtr@texencoding{\inputencodingname}}%
  }%
  {%
     \@ifpackageloaded{fontspec}%
     {\protected@write\@auxout{}{\string\glsxtr@texencoding{utf8}}}%
     {}%
  }%
  \protected@write\@auxout{}{\string\glsxtr@shortcutsval{\@glsxtr@shortcutsval}}%
  \AtBeginDocument
    {\protected@write\@auxout{}{\string\glsxtr@linkprefix{\glolinkprefix}}}%
  \let\glsxtr@writefields\relax
  \ifglsautomake
    \IfFileExists{\jobname.aux}%
    {\immediate\write18{bib2gls \jobname}}{}%
    \ifx\@gls@doautomake\@gls@doautomake@err
       \let\@gls@doautomake\relax
    \fi
  \fi
  \@glsxtr@if@record@only
  {\ifdefstring{\glsorder}{letter}%
   {\GlossariesExtraWarningNoLine{Package option `order=letter' isn't
    supported with `record=\@glsxtr@record@setting'. Use `break-at=none'
    resource option instead}}%
   {}%
  }%
  {}%
}
\newcommand*{\@gls@doautomake@err}{%
  \PackageError{glossaries}{You must use
  \string\makeglossaries\space with automake=true}
  {%
     Either remove the automake=true setting or
     add \string\makeglossaries\space to your document preamble.%
  }%
}
\newcommand*{\glsxtr@record}[5]{}
\newcommand*{\glsxtr@record@nameref}[8]{}
\newcommand*{\glsxtr@counterrecord}[3]{%
  \glsxtrfieldlistgadd{#1}{record.#2}{#3}%
}
\newcommand*{\@glsxtr@counterrecordhook}{}
\newcommand*{\GlsXtrRecordCounter}[1]{%
  \@@glsxtr@recordcounter{#1}%
}
\@onlypreamble\GlsXtrRecordCounter
\newcommand*{\@glsxtr@docounterrecord}[1]{%
  \protected@write\@auxout{}{\string\glsxtr@counterrecord
    {\@gls@label}{#1}{\csuse{the#1}}}%
}
\newcommand*{\glsxtrglossentry}[1]{%
  \glsxtrtitleorpdforheading
  {\@glsxtrglossentry{#1}}%
  {\glsentryname{#1}}%
  {\glsxtrheadname{#1}}%
}
\newrobustcmd*{\@glsxtrglossentry}[1]{%
  \glsxtrtitleorpdforheading
  {%
    \glsdoifexists{#1}%
    {%
      \begingroup
        \protected@edef\glscurrententrylabel{\glsdetoklabel{#1}}%
        \protected@edef\currentglossary{\GlsXtrStandaloneGlossaryType}%
        \ifglshasparent{#1}%
        {\GlsXtrStandaloneSubEntryItem{#1}}%
        {\glsentryitem{#1}}%
        \GlsXtrStandaloneEntryName{#1}%
      \endgroup
    }%
  }%
  {\glsentryname{#1}}%
  {\glsxtrheadname{#1}}%
}
\newcommand*{\GlsXtrStandaloneEntryName}[1]{%
  \glstarget{#1}{\glossentryname{#1}}%
}
\newcommand{\GlsXtrStandaloneGlossaryType}{\glsentrytype{\glscurrententrylabel}}
\newcommand*{\GlsXtrStandaloneSubEntryItem}[1]{%
  \GlsXtrIfFieldEqNum{level}{#1}{1}{\glssubentryitem{#1}}{}%
}
\newcommand*{\glsxtrglossentryother}[3]{%
  \ifstrempty{#1}%
  {%
    \ifcsdef{glsxtrhead#3}%
    {%
      \glsxtrtitleorpdforheading
      {\@glsxtrglossentryother{#2}{#3}{#1}}%
      {\@gls@entry@field{#2}{#3}}%
      {\csuse{glsxtrhead#3}{#2}}%
    }%
    {%
      \glsxtrtitleorpdforheading
      {\@glsxtrglossentryother{#2}{#3}{#1}}%
      {\@gls@entry@field{#2}{#3}}%
      {\@gls@entry@field{\NoCaseChange{#2}}{#3}}%
    }%
  }%
  {%
    \glsxtrtitleorpdforheading
    {\@glsxtrglossentryother{#2}{#3}{#1}}%
    {\@gls@entry@field{#2}{#3}}%
    {#1}%
  }%
}
\newrobustcmd*{\@glsxtrglossentryother}[3]{%
  \glsxtrtitleorpdforheading
  {%
    \glsdoifexists{#1}%
    {%
      \begingroup
        \protected@edef\glscurrententrylabel{\glsdetoklabel{#1}}%
        \protected@edef\currentglossary{\GlsXtrStandaloneGlossaryType}%
        \ifglshasparent{#1}%
        {\GlsXtrStandaloneSubEntryItem{#1}}%
        {\glsentryitem{#1}}%
        \GlsXtrStandaloneEntryOther{#1}%
      \endgroup
    }%
  }%
  {\@gls@entry@field{#1}{#2}}%
  {#3}%
}
\newcommand*{\GlsXtrStandaloneEntryOther}[2]{%
  \glstarget{#1}{\glossentrynameother{#1}{#2}}%
}
\ifdef\@printgloss@checkexists
{
  \newcommand*{\printunsrtglossary}{%
    \let\@printgloss@checkexists\@printgloss@checkexists@allowignored
    \@ifstar\s@printunsrtglossary\@printunsrtglossary
  }
}
{
  \newcommand*{\printunsrtglossary}{%
    \@ifstar\s@printunsrtglossary\@printunsrtglossary
  }
}
\newcommand*{\@printunsrtglossary}[1][]{%
  \@printglossary{type=\glsdefaulttype,#1}{\@print@unsrt@glossary}%
}
\newcommand*{\s@printunsrtglossary}[2][]{%
  \begingroup
    #2%
    \@printglossary{type=\glsdefaulttype,#1}{\@print@unsrt@glossary}%
  \endgroup
}
\newcommand*{\printunsrtglossaries}{%
  \forallglossaries{\@@glo@type}{\printunsrtglossary[type=\@@glo@type]}%
}

\newcommand*{\@print@unsrt@glossary}{%
  \glossarysection[\glossarytoctitle]{\glossarytitle}%
  \glossarypreamble
  \glsxtrifemptyglossary{\@glo@type}%
  {%
    \GlossariesExtraWarning{No entries defined in glossary `\@glo@type'}%
  }%
  {%
    \key@ifundefined{glossentry}{group}%
    {\let\@gls@getgrouptitle\@gls@noidx@getgrouptitle}%
    {\let\@gls@getgrouptitle\@glsxtr@unsrt@getgrouptitle}%
    \def\@gls@currentlettergroup{}%
    \def\@glsxtr@doglossary{%
      \begin{theglossary}%
      \glossaryheader
      \glsresetentrylist
    }%
    \expandafter\@for\expandafter\glscurrententrylabel\expandafter
      :\expandafter=\csname glolist@\@glo@type\endcsname\do{%
      \ifdefempty{\glscurrententrylabel}
      {}%
      {%
        \let\glsxtr@process\@firstofone
        \let\printunsrtglossaryskipentry
            \@glsxtr@printunsrtglossaryskipentry
        \printunsrtglossaryentryprocesshook{\glscurrententrylabel}%
        \glsxtr@process
        {%
          \ifglsxtr@printgloss@groups
            \ifglshasparent{\glscurrententrylabel}{}%
            {%
              \@glsxtr@checkgroup\glscurrententrylabel
              \expandafter\appto\expandafter\@glsxtr@doglossary\expandafter
                {\@glsxtr@groupheading}%
            }%
          \fi
          \protected@eappto\@glsxtr@doglossary{%
            \noexpand\@printunsrt@glossary@handler{\glscurrententrylabel}}%
        }%
      }%
    }%
    \appto\@glsxtr@doglossary{\end{theglossary}}%
    \printunsrtglossarypredoglossary
    \@glsxtr@doglossary
  }%
  \glossarypostamble
}
\newcommand*{\printunsrtinnerglossary}[3][]{%
  \begingroup
   \def\@glsxtr@printglossopts{#1}%
   \def\@glo@type{\glsdefaulttype}%
   \setkeys{printgloss}[title,toctitle,style,numberedsection,sort,label]{#1}%
   \let\currentglossary\@glo@type
   #2%
   \@print@unsrt@innerglossary
   #3%
  \endgroup
}
\newenvironment{printunsrtglossarywrap}[1][]%
{%
  \def\@glsxtr@printglossopts{#1}%
  \def\@glo@type{\glsdefaulttype}%
  \def\glossarytitle{\csname @glotype@\@glo@type @title\endcsname}%
  \def\glossarytoctitle{\glossarytitle}%
  \let\org@glossarytitle\glossarytitle
  \def\@glossarystyle{%
    \ifx\@glossary@default@style\relax
      \GlossariesWarning{No default glossary style provided \MessageBreak
        for the glossary `\@glo@type'. \MessageBreak
        Using deprecated fallback. \MessageBreak
        To fix this set the style with \MessageBreak
        \string\setglossarystyle\space or use the \MessageBreak
        style key=value option}%
    \fi
  }%
  \def\gls@dotoctitle{\glssettoctitle{\@glo@type}}%
  \let\@org@glossaryentrynumbers\glossaryentrynumbers
  \@printgloss@setsort
  \setkeys{printgloss}{#1}%
  \ifglossaryexists*{\@glo@type}%
  {%
   \ifx\glossarytitle\org@glossarytitle
   \else
     \expandafter\let\csname @glotype@\@glo@type @title\endcsname
                   \glossarytitle
   \fi
   \let\currentglossary\@glo@type
  }%
  {}%
  \let\org@glossaryentrynumbers\glossaryentrynumbers
  \let\glsnonextpages\@glsnonextpages
  \let\glsnextpages\@glsnextpages
  \let\nopostdesc\@nopostdesc
  \gls@dotoctitle
  \@glossarystyle
  \let\gls@org@glossaryentryfield\glossentry
  \let\gls@org@glossarysubentryfield\subglossentry
  \renewcommand{\glossentry}[1]{%
    \protected@xdef\glscurrententrylabel{\glsdetoklabel{##1}}%
    \gls@org@glossaryentryfield{##1}%
  }%
  \renewcommand{\subglossentry}[2]{%
    \protected@xdef\glscurrententrylabel{\glsdetoklabel{##2}}%
    \gls@org@glossarysubentryfield{##1}{##2}%
  }%
  \@gls@preglossaryhook
  \glossarysection[\glossarytoctitle]{\glossarytitle}%
  \glossarypreamble
  \begin{theglossary}%
  \glossaryheader
  \glsresetentrylist
}%
{%
  \end{theglossary}%
  \glossarypostamble
  \global\let\glossaryentrynumbers\@org@glossaryentrynumbers
  \global\let\warn@noprintglossary\relax
}
\newcommand*{\@print@unsrt@innerglossary}{%
  \glsxtrifemptyglossary{\@glo@type}%
  {%
    \GlossariesExtraWarning{No entries defined in glossary `\@glo@type'}%
  }%
  {%
    \key@ifundefined{glossentry}{group}%
    {\let\@gls@getgrouptitle\@gls@noidx@getgrouptitle}%
    {\let\@gls@getgrouptitle\@glsxtr@unsrt@getgrouptitle}%
    \def\@gls@currentlettergroup{}%
    \def\@glsxtr@doglossary{}%
    \expandafter\@for\expandafter\glscurrententrylabel\expandafter
      :\expandafter=\csname glolist@\@glo@type\endcsname\do{%
      \ifdefempty{\glscurrententrylabel}
      {}%
      {%
        \let\glsxtr@process\@firstofone
        \let\printunsrtglossaryskipentry
            \@glsxtr@printunsrtglossaryskipentry
        \printunsrtglossaryentryprocesshook{\glscurrententrylabel}%
        \glsxtr@process
        {%
          \ifglsxtr@printgloss@groups
            \ifglshasparent{\glscurrententrylabel}{}%
            {%
              \@glsxtr@checkgroup\glscurrententrylabel
              \expandafter\appto\expandafter\@glsxtr@doglossary\expandafter
                {\@glsxtr@groupheading}%
            }%
          \fi
          \protected@eappto\@glsxtr@doglossary{%
            \noexpand\@printunsrt@glossary@handler{\glscurrententrylabel}}%
        }%
      }%
    }%
    \printunsrtglossarypredoglossary
    \@glsxtr@doglossary
  }%
}
\newcommand*{\printunsrtglossaryentryprocesshook}[1]{}
\newcommand*{\printunsrtglossaryskipentry}{%
  \PackageError{glossaries-extra}{\string\printunsrtglossaryskipentry\space
can only be used within \string\printunsrtglossaryentryprocesshook}{}%
}
\newcommand*{\@glsxtr@printunsrtglossaryskipentry}{%
  \let\glsxtr@process\@gobble
}
\newcommand*{\printunsrtglossarypredoglossary}{}
\newcommand{\@printunsrt@glossary@handler}[1]{%
  \protected@xdef\glscurrententrylabel{#1}%
  \printunsrtglossaryhandler\glscurrententrylabel
}
\newcommand{\printunsrtglossaryhandler}[1]{%
  \glsxtrunsrtdo{#1}%
}
\newrobustcmd*{\glsxtriflabelinlist}[4]{%
 \protected@edef\@glsxtr@doiflabelinlist{\noexpand\@gls@ifinlist{#1}{#2}}%
 \@glsxtr@doiflabelinlist{#3}{#4}%
}
\newcommand{\print@op@unsrtglossaryunit}[2][]{%
  \s@printunsrtglossary[type=\glsdefaulttype,#1]{%
    \printunsrtglossaryunitsetup{#2}%
  }%
}
\newcommand*{\printunsrtglossaryunitsetup}[1]{%
  \renewcommand{\printunsrtglossaryhandler}[1]{%
    \glsxtrfieldxifinlist{##1}{record.#1}{\csuse{the#1}}
    {\glsxtrunsrtdo{##1}}%
    {}%
  }%
  \ifcsundef{theH#1}%
  {%
    \renewcommand*{\@glsxtrhypernameprefix}{record.#1.\csuse{the#1}.\@gobble}%
  }%
  {%
    \renewcommand*{\@glsxtrhypernameprefix}{record.#1.\csuse{theH#1}.\@gobble}%
  }%
  \renewcommand*{\glossarysection}[2][]{}%
  \appto\glossarypostamble{\glspar\medskip\glspar}%
}
\newcommand{\print@noop@unsrtglossaryunit}[2][]{%
  \PackageError{glossaries-extra}{\string\printunsrtglossaryunit\space
   requires the record=only or record=alsoindex package option}{}%
}
\newrobustcmd*{\@glsxtr@unsrt@getgrouptitle}[2]{%
  \protected@edef\@glsxtr@titlelabel{glsxtr@grouptitle@#1}%
  \@onelevel@sanitize\@glsxtr@titlelabel
  \ifcsdef{\@glsxtr@titlelabel}
  {\letcs{#2}{\@glsxtr@titlelabel}}%
  {\def#2{#1}}%
}
\newcommand{\glsxtrunsrtdo}{\@glsxtr@noidx@do}
\newcommand*{\glsxtrgroupfield}{group}
\newcommand*{\@glsxtr@checkgroup}[1]{%
  \def\@glsxtr@groupheading{}%
  \key@ifundefined{glossentry}{group}%
  {%
    \letcs{\@gls@sort}{glo@\glsdetoklabel{#1}@sort}%
    \expandafter\glo@grabfirst\@gls@sort{}{}\@nil
  }%
  {%
    \protected@edef\@glo@thislettergrp{%
        \csuse{glo@\glsdetoklabel{#1}@\glsxtrgroupfield}}%
  }%
  \ifdefequal{\@glo@thislettergrp}{\@gls@currentlettergroup}%
  {}%
  {%
    \ifdefempty{\@gls@currentlettergroup}{}%
    {\def\@glsxtr@groupheading{\glsgroupskip}}%
    \protected@eappto\@glsxtr@groupheading{%
      \noexpand\glsgroupheading{\expandonce\@glo@thislettergrp}%
    }%
  }%
  \let\@gls@currentlettergroup\@glo@thislettergrp
}
\newcommand*{\GlsXtrLocationField}{location}
\newcommand{\@glsxtr@noidx@do}[1]{%
  \ifglsentryexists{#1}%
  {%
    \global\letcs{\@gls@loclist}{glo@\glsdetoklabel{#1}@loclist}%
    \global\letcs{\@gls@location}{glo@\glsdetoklabel{#1}@\GlsXtrLocationField}%
    \gls@level=\numexpr\csuse{glo@\glsdetoklabel{#1}@level}+\@glsxtr@leveloffset\relax
    \ifnum\gls@level>0
      \let\@glsxtr@ifischild\@firstoftwo
    \else
      \let\@glsxtr@ifischild\@secondoftwo
    \fi
    \@glsxtr@ifischild
    {%
      \ifdefvoid{\@gls@location}%
      {%
        \ifdefvoid{\@gls@loclist}%
        {%
          \expandafter\subglossentry\expandafter{\number\gls@level}{#1}{}%
        }%
        {%
          \expandafter\subglossentry\expandafter{\number\gls@level}{#1}%
          {%
            \glossaryentrynumbers{\glsnoidxloclist{\@gls@loclist}}%
          }%
        }%
      }%
      {%
        \expandafter\subglossentry\expandafter
          {\number\gls@level}{#1}{\glossaryentrynumbers{\@gls@location}}%
      }%
    }%
    {%
      \ifdefvoid{\@gls@location}%
      {%
        \ifdefvoid{\@gls@loclist}
        {%
          \glossentry{#1}{}%
        }%
        {%
          \glossentry{#1}%
          {%
            \glossaryentrynumbers{\glsnoidxloclist{\@gls@loclist}}%
          }%
        }%
      }%
      {%
        \glossentry{#1}%
        {%
          \glossaryentrynumbers{\@gls@location}%
        }%
      }%
    }%
  }%
  {}%
}
\newcount\@glsxtrnewgls@inner
\newcommand*{\@glsxtr@providenewgls}{%
  \protected@write\@auxout{}{\string\providecommand{\string\@glsxtr@newglslike}[2]{}}%
  \let\@glsxtr@providenewgls\relax
}
\newcommand{\glsxtridentifyglslike}[2]{%
 \ifdefequal\@glsxtr@record@setting\@glsxtr@record@setting@off
 {}%
 {%
   \@glsxtr@providenewgls
   \protected@write\@auxout{}{\string\@glsxtr@newglslike{#1}{\string#2}}%
 }%
}
\newcommand*{\@glsxtrnewgls}[4]{%
  \ifdef{#3}%
  {%
    \PackageError{glossaries-extra}{Command \string#3\space already
defined}{}%
  }%
  {%
     \glsxtridentifyglslike{#2}{#3}%
     \ifcsdef{@#4like@#2}%
     {%
       \advance\@glsxtrnewgls@inner by \@ne
       \def\@glsxtrnewgls@innercsname{@#4like\number\@glsxtrnewgls@inner @#2}%
     }%
     {\def\@glsxtrnewgls@innercsname{@#4like@#2}}%
     \expandafter\newrobustcmd\expandafter*\expandafter
      #3\expandafter{\expandafter\@gls@hyp@opt\csname\@glsxtrnewgls@innercsname\endcsname}%
     \ifstrempty{#1}%
     {%
       \expandafter\newcommand\expandafter*\csname\@glsxtrnewgls@innercsname\endcsname[2][]{%
         \new@ifnextchar[%
          {\csname @#4@\endcsname{##1}{#2##2}}%
          {\csname @#4@\endcsname{##1}{#2##2}[]}%
       }%
     }%
     {%
       \expandafter\newcommand\expandafter*\csname\@glsxtrnewgls@innercsname\endcsname[2][]{%
         \new@ifnextchar[%
          {\csname @#4@\endcsname{#1,##1}{#2##2}}%
          {\csname @#4@\endcsname{#1,##1}{#2##2}[]}%
       }%
     }%
  }%
}
\newrobustcmd*{\glsxtrnewgls}[3][]{%
  \@glsxtrnewgls{#1}{#2}{#3}{gls}%
}
\newrobustcmd*{\glsxtrnewglslike}[6][]{%
  \@glsxtrnewgls{#1}{#2}{#3}{gls}%
  \@glsxtrnewgls{#1}{#2}{#4}{glspl}%
  \@glsxtrnewgls{#1}{#2}{#5}{Gls}%
  \@glsxtrnewgls{#1}{#2}{#6}{Glspl}%
}
\newrobustcmd*{\glsxtrnewGLSlike}[4][]{%
  \@glsxtrnewgls{#1}{#2}{#3}{GLS}%
  \@glsxtrnewgls{#1}{#2}{#4}{GLSpl}%
}
\newrobustcmd*{\glsxtrnewrgls}[3][]{%
  \@glsxtrnewgls{#1}{#2}{#3}{rgls}%
}
\newrobustcmd*{\glsxtrnewrglslike}[6][]{%
  \@glsxtrnewgls{#1}{#2}{#3}{rgls}%
  \@glsxtrnewgls{#1}{#2}{#4}{rglspl}%
  \@glsxtrnewgls{#1}{#2}{#5}{rGls}%
  \@glsxtrnewgls{#1}{#2}{#6}{rGlspl}%
}
\newrobustcmd*{\glsxtrnewrGLSlike}[4][]{%
  \@glsxtrnewgls{#1}{#2}{#3}{rGLS}%
  \@glsxtrnewgls{#1}{#2}{#4}{rGLSpl}%
}
\newcommand*{\GlsXtrTotalRecordCount}[1]{%
 \ifcsdef{glo@\glsdetoklabel{#1}@recordcount}%
 {\csname glo@\glsdetoklabel{#1}@recordcount\endcsname}%
 {0}%
}
\newcommand*{\GlsXtrRecordCount}[2]{%
 \ifcsdef{glo@\glsdetoklabel{#1}@recordcount.#2}%
 {\csname glo@\glsdetoklabel{#1}@recordcount.#2\endcsname}%
 {0}%
}
\newcommand*{\GlsXtrLocationRecordCount}[3]{%
 \ifcsdef{glo@\glsdetoklabel{#1}@recordcount.#2.\glsxtrdetoklocation{#3}}%
 {\csname glo@\glsdetoklabel{#1}@recordcount.#2.\glsxtrdetoklocation{#3}\endcsname}%
 {0}%
}
\newcommand*{\glsxtrdetoklocation}[1]{#1}
\newcommand*{\glsxtrenablerecordcount}{%
  \renewcommand*{\gls}{\rgls}%
  \renewcommand*{\Gls}{\rGls}%
  \renewcommand*{\glspl}{\rglspl}%
  \renewcommand*{\Glspl}{\rGlspl}%
  \renewcommand*{\GLS}{\rGLS}%
  \renewcommand*{\GLSpl}{\rGLSpl}%
}
\newcommand*{\glsxtrrecordtriggervalue}[1]{%
 \GlsXtrTotalRecordCount{#1}%
}
\newcommand*{\GlsXtrSetRecordCountAttribute}[2]{%
 \@for\@glsxtr@cat:=#1\do
 {%
   \ifdefempty{\@glsxtr@cat}{}%
   {%
     \glssetcategoryattribute{\@glsxtr@cat}{recordcount}{#2}%
   }%
 }%
}
\newcommand*{\glsxtrifrecordtrigger}[3]{%
 \glshasattribute{#1}{recordcount}%
 {%
   \ifnum\glsxtrrecordtriggervalue{#1}>\glsgetattribute{#1}{recordcount}\relax
    #3%
   \else
    #2%
   \fi
 }%
 {#3}%
}
\newcommand*{\@glsxtr@rglstrigger@record}[3]{%
  \protected@edef\glslabel{\glsdetoklabel{#2}}%
  \let\@gls@link@label\glslabel
  \def\@glsxtr@thevalue{}%
  \def\@glsxtr@theHvalue{\@glsxtr@thevalue}%
  \def\@glsnumberformat{glstriggerrecordformat}%
  \protected@edef\@gls@counter{\csname glo@\glslabel @counter\endcsname}%
  \protected@edef\glstype{\csname glo@\glslabel @type\endcsname}%
  \def\@glsxtr@thevalue{}%
  \def\@glsxtr@theHvalue{\@glsxtr@thevalue}%
  \@gls@save@glslocal
  \glsxtrinitwrgloss
  \glslinkpresetkeys
  \setkeys{glslink}{#1}%
  \glslinkpostsetkeys
  \ifdefempty{\@glsxtr@thevalue}%
  {%
    \@gls@saveentrycounter
  }%
  {%
    \let\theglsentrycounter\@glsxtr@thevalue
    \def\theHglsentrycounter{\@glsxtr@theHvalue}%
  }%
  \glslinkwrcontent
  {%
    \ifglsxtrinitwrglossbefore
      \@do@wrglossary{#2}%
    \fi
    #3%
    \ifglsxtrinitwrglossbefore
    \else
      \@do@wrglossary{#2}%
    \fi
  }%
  \@gls@restore@glslocal
  \@gls@do@glsunset{#2}%
}
\newcommand*{\glstriggerrecordformat}[1]{}
\newrobustcmd*{\rgls}{\@gls@hyp@opt\@rgls}
\newcommand*{\@rgls}[2][]{%
  \new@ifnextchar[{\@rgls@{#1}{#2}}{\@rgls@{#1}{#2}[]}%
}
\def\@rgls@#1#2[#3]{%
  \glsxtrifrecordtrigger{#2}%
  {%
    \@glsxtr@rglstrigger@record{#1}{#2}{\rglsformat{#2}{#3}}%
  }%
  {%
    \@gls@{#1}{#2}[#3]%
  }%
}%
\newrobustcmd*{\rglspl}{\@gls@hyp@opt\@rglspl}
\newcommand*{\@rglspl}[2][]{%
  \new@ifnextchar[{\@rglspl@{#1}{#2}}{\@rglspl@{#1}{#2}[]}%
}
\def\@rglspl@#1#2[#3]{%
  \glsxtrifrecordtrigger{#2}%
  {%
    \@glsxtr@rglstrigger@record{#1}{#2}{\rglsplformat{#2}{#3}}%
  }%
  {%
    \@glspl@{#1}{#2}[#3]%
  }%
}%
\newrobustcmd*{\rGls}{\@gls@hyp@opt\@rGls}
\newcommand*{\@rGls}[2][]{%
  \new@ifnextchar[{\@rGls@{#1}{#2}}{\@rGls@{#1}{#2}[]}%
}
\def\@rGls@#1#2[#3]{%
  \glsxtrifrecordtrigger{#2}%
  {%
    \@glsxtr@rglstrigger@record{#1}{#2}{\rGlsformat{#2}{#3}}%
  }%
  {%
    \@Gls@{#1}{#2}[#3]%
  }%
}%
\newrobustcmd*{\rGlspl}{\@gls@hyp@opt\@rGlspl}
\newcommand*{\@rGlspl}[2][]{%
  \new@ifnextchar[{\@rGlspl@{#1}{#2}}{\@rGlspl@{#1}{#2}[]}%
}
\def\@rGlspl@#1#2[#3]{%
  \glsxtrifrecordtrigger{#2}%
  {%
    \@glsxtr@rglstrigger@record{#1}{#2}{\rGlsplformat{#2}{#3}}%
  }%
  {%
    \@Glspl@{#1}{#2}[#3]%
  }%
}%
\newrobustcmd*{\rGLS}{\@gls@hyp@opt\@rGLS}
\newcommand*{\@rGLS}[2][]{%
  \new@ifnextchar[{\@rGLS@{#1}{#2}}{\@rGLS@{#1}{#2}[]}%
}
\def\@rGLS@#1#2[#3]{%
  \glsxtrifrecordtrigger{#2}%
  {%
    \@glsxtr@rglstrigger@record{#1}{#2}{\rGLSformat{#2}{#3}}%
  }%
  {%
    \@GLS@{#1}{#2}[#3]%
  }%
}%
\newrobustcmd*{\rGLSpl}{\@gls@hyp@opt\@rGLSpl}
\newcommand*{\@rGLSpl}[2][]{%
  \new@ifnextchar[{\@rGLSpl@{#1}{#2}}{\@rGLSpl@{#1}{#2}[]}%
}
\def\@rGLSpl@#1#2[#3]{%
  \glsxtrifrecordtrigger{#2}%
  {%
    \@glsxtr@rglstrigger@record{#1}{#2}{\rGLSplformat{#2}{#3}}%
  }%
  {%
    \@GLSpl@{#1}{#2}[#3]%
  }%
}%
\newcommand*{\rglsformat}[2]{%
  \glsifregular{#1}
  {\glsentryfirst{#1}}%
  {\ifglshaslong{#1}{\glsentrylong{#1}}{\glsentryfirst{#1}}}#2%
}
\newcommand*{\rglsplformat}[2]{%
  \glsifregular{#1}
  {\glsentryfirstplural{#1}}%
  {\ifglshaslong{#1}{\glsentrylongplural{#1}}{\glsentryfirstplural{#1}}}#2%
}
\newcommand*{\rGlsformat}[2]{%
  \glsifregular{#1}
  {\Glsentryfirst{#1}}%
  {\ifglshaslong{#1}{\Glsentrylong{#1}}{\Glsentryfirst{#1}}}#2%
}
\newcommand*{\rGlsplformat}[2]{%
  \glsifregular{#1}
  {\Glsentryfirstplural{#1}}%
  {\ifglshaslong{#1}{\Glsentrylongplural{#1}}{\Glsentryfirstplural{#1}}}#2%
}
\newcommand*{\rGLSformat}[2]{%
 \expandafter\mfirstucMakeUppercase\expandafter{\rglsformat{#1}{#2}}%
}
\newcommand*{\rGLSplformat}[2]{%
 \expandafter\mfirstucMakeUppercase\expandafter{\rglsplformat{#1}{#2}}%
}
\newcommand{\@glsxtr@do@inc@linkcount}{%
 \glsifattribute{\glslabel}{linkcount}{true}%
 {%
   \ifcsdef{c@glsxtr@linkcount@\glslabel}{}%
   {%
     \newcounter{glsxtr@linkcount@\glslabel}%
     \glshasattribute{\glslabel}{linkcountmaster}%
     {%
       \begingroup
        \edef\@glo@tmp{\endgroup\noexpand\@addtoreset{glsxtr@linkcount@\glslabel}%
         {\glsgetattribute{\glslabel}{linkcountmaster}}}%
       \@glo@tmp
     }%
     {}%
   }%
  \glsxtrinclinkcounter{glsxtr@linkcount@\glslabel}%
 }%
 {}%
}
\newcommand*{\glsxtrinclinkcounter}[1]{\stepcounter{#1}}
\newcommand*{\GlsXtrLinkCounterValue}[1]{%
 \ifcsundef{c@glsxtr@linkcount@#1}{0}{\csname c@glsxtr@linkcount@#1\endcsname}%
}
\newcommand*{\GlsXtrTheLinkCounter}[1]{%
 \ifcsundef{theglsxtr@linkcount@#1}{0}%
 {\csname theglsxtr@linkcount@#1\endcsname}%
}
\newcommand*{\GlsXtrIfLinkCounterDef}[3]{%
 \ifcsundef{theglsxtr@linkcount@#1}{#3}{#2}%
}
\newcommand*{\GlsXtrLinkCounterName}[1]{glsxtr@linkcount@#1}
\newcommand*{\GlsXtrEnableLinkCounting}[2][]{%
 \let\glsxtr@inc@linkcount\@glsxtr@do@inc@linkcount
 \@for\@glsxtr@label:=#2\do
 {%
  \glssetcategoryattribute{\@glsxtr@label}{linkcount}{true}%
  \ifstrempty{#1}{}%
  {%
    \ifcsundef{c@#1}%
    {\@nocounterr{#1}}%
    {\glssetcategoryattribute{\@glsxtr@label}{linkcountmaster}{#1}}%
  }%
 }%
}
\@onlypreamble\GlsXtrEnableLinkCounting
\@ifpackageloaded{glossaries-accsupp}
{
  \newcommand*{\glsaccessname}[1]{%
    \glsnameaccessdisplay
    {%
      \glsentryname{#1}%
    }%
    {#1}%
  }
  \newcommand*{\Glsaccessname}[1]{%
    \glsnameaccessdisplay
    {%
      \Glsentryname{#1}%
    }%
    {#1}%
  }
  \newcommand*{\GLSaccessname}[1]{%
    \glsnameaccessdisplay
    {%
      \mfirstucMakeUppercase{\glsentryname{#1}}%
    }%
    {#1}%
  }
  \newcommand*{\glsaccesstext}[1]{%
    \glstextaccessdisplay
    {%
      \glsentrytext{#1}%
    }%
    {#1}%
  }
  \newcommand*{\Glsaccesstext}[1]{%
    \glstextaccessdisplay
    {%
      \Glsentrytext{#1}%
    }%
    {#1}%
  }
  \newcommand*{\GLSaccesstext}[1]{%
    \glstextaccessdisplay
    {%
      \mfirstucMakeUppercase{\glsentrytext{#1}}%
    }%
    {#1}%
  }
  \newcommand*{\glsaccessplural}[1]{%
    \glspluralaccessdisplay
    {%
      \glsentryplural{#1}%
    }%
    {#1}%
  }
  \newcommand*{\Glsaccessplural}[1]{%
    \glspluralaccessdisplay
    {%
      \Glsentryplural{#1}%
    }%
    {#1}%
  }
  \newcommand*{\GLSaccessplural}[1]{%
    \glspluralaccessdisplay
    {%
      \mfirstucMakeUppercase{\glsentryplural{#1}}%
    }%
    {#1}%
  }
  \newcommand*{\glsaccessfirst}[1]{%
    \glsfirstaccessdisplay
    {%
      \glsentryfirst{#1}%
    }%
    {#1}%
  }
  \newcommand*{\Glsaccessfirst}[1]{%
    \glsfirstaccessdisplay
    {%
      \Glsentryfirst{#1}%
    }%
    {#1}%
  }
  \newcommand*{\GLSaccessfirst}[1]{%
    \glsfirstaccessdisplay
    {%
      \mfirstucMakeUppercase{\glsentryfirst{#1}}%
    }%
    {#1}%
  }
  \newcommand*{\glsaccessfirstplural}[1]{%
    \glsfirstpluralaccessdisplay
    {%
      \glsentryfirstplural{#1}%
    }%
    {#1}%
  }
  \newcommand*{\Glsaccessfirstplural}[1]{%
    \glsfirstpluralaccessdisplay
    {%
      \Glsentryfirstplural{#1}%
    }%
    {#1}%
  }
  \newcommand*{\GLSaccessfirstplural}[1]{%
    \glsfirstpluralaccessdisplay
    {%
      \mfirstucMakeUppercase{\glsentryfirstplural{#1}}%
    }%
    {#1}%
  }
  \newcommand*{\glsaccesssymbol}[1]{%
    \glssymbolaccessdisplay
    {%
      \glsentrysymbol{#1}%
    }%
    {#1}%
  }
  \newcommand*{\Glsaccesssymbol}[1]{%
    \glssymbolaccessdisplay
    {%
      \Glsentrysymbol{#1}%
    }%
    {#1}%
  }
  \newcommand*{\GLSaccesssymbol}[1]{%
    \glssymbolaccessdisplay
    {%
      \mfirstucMakeUppercase{\glsentrysymbol{#1}}%
    }%
    {#1}%
  }
  \newcommand*{\glsaccesssymbolplural}[1]{%
    \glssymbolpluralaccessdisplay
    {%
      \glsentrysymbolplural{#1}%
    }%
    {#1}%
  }
  \newcommand*{\Glsaccesssymbolplural}[1]{%
    \glssymbolpluralaccessdisplay
    {%
      \Glsentrysymbolplural{#1}%
    }%
    {#1}%
  }
  \newcommand*{\GLSaccesssymbolplural}[1]{%
    \glssymbolpluralaccessdisplay
    {%
      \mfirstucMakeUppercase{\glsentrysymbolplural{#1}}%
    }%
    {#1}%
  }
  \newcommand*{\glsaccessdesc}[1]{%
    \glsdescriptionaccessdisplay
    {%
      \glsentrydesc{#1}%
    }%
    {#1}%
  }
  \newcommand*{\Glsaccessdesc}[1]{%
    \glsdescriptionaccessdisplay
    {%
      \Glsentrydesc{#1}%
    }%
    {#1}%
  }
  \newcommand*{\GLSaccessdesc}[1]{%
    \glsdescriptionaccessdisplay
    {%
      \mfirstucMakeUppercase{\glsentrydesc{#1}}%
    }%
    {#1}%
  }
  \newcommand*{\glsaccessdescplural}[1]{%
    \glsdescriptionpluralaccessdisplay
    {%
      \glsentrydescplural{#1}%
    }%
    {#1}%
  }
  \newcommand*{\Glsaccessdescplural}[1]{%
    \glsdescriptionpluralaccessdisplay
    {%
      \Glsentrydescplural{#1}%
    }%
    {#1}%
  }
  \newcommand*{\GLSaccessdescplural}[1]{%
    \glsdescriptionpluralaccessdisplay
    {%
      \mfirstucMakeUppercase{\glsentrydescplural{#1}}%
    }%
    {#1}%
  }
  \newcommand*{\glsaccessshort}[1]{%
    \glsshortaccessdisplay
    {%
      \glsentryshort{#1}%
    }%
    {#1}%
  }
  \newcommand*{\Glsaccessshort}[1]{%
    \glsshortaccessdisplay
    {%
      \Glsentryshort{#1}%
    }%
    {#1}%
  }
  \newcommand*{\GLSaccessshort}[1]{%
    \glsshortaccessdisplay
    {%
      \mfirstucMakeUppercase{\glsentryshort{#1}}%
    }%
    {#1}%
  }
  \newcommand*{\glsaccessshortpl}[1]{%
    \glsshortpluralaccessdisplay
    {%
      \glsentryshortpl{#1}%
    }%
    {#1}%
  }
  \newcommand*{\Glsaccessshortpl}[1]{%
    \glsshortpluralaccessdisplay
    {%
      \Glsentryshortpl{#1}%
    }%
    {#1}%
  }
  \newcommand*{\GLSaccessshortpl}[1]{%
    \glsshortpluralaccessdisplay
    {%
      \mfirstucMakeUppercase{\glsentryshortpl{#1}}%
    }%
    {#1}%
  }
  \newcommand*{\glsaccesslong}[1]{%
    \glslongaccessdisplay{\glsentrylong{#1}}{#1}%
  }

  \newcommand*{\Glsaccesslong}[1]{%
    \glslongaccessdisplay{\Glsentrylong{#1}}{#1}%
  }
  \newcommand*{\GLSaccesslong}[1]{%
    \glslongaccessdisplay
    {%
      \mfirstucMakeUppercase{\glsentrylong{#1}}%
    }%
    {#1}%
  }
  \newcommand*{\glsaccesslongpl}[1]{%
    \glslongpluralaccessdisplay{\glsentrylongpl{#1}}{#1}%
  }

  \newcommand*{\Glsaccesslongpl}[1]{%
    \glslongpluralaccessdisplay{\Glsentrylongpl{#1}}{#1}%
  }
  \newcommand*{\GLSaccesslongpl}[1]{%
    \glslongpluralaccessdisplay
    {%
      \mfirstucMakeUppercase{\glsentrylongpl{#1}}%
    }%
    {#1}%
  }
  \define@key{glsxtrabbrv}{access}{%
    \def\@gls@nameaccess{#1}%
  }
  \define@key{glsxtrabbrv}{textaccess}{%
    \def\@gls@textaccess{#1}%
  }
  \define@key{glsxtrabbrv}{pluralaccess}{%
    \def\@gls@pluralaccess{#1}%
  }
  \define@key{glsxtrabbrv}{firstaccess}{%
    \def\@gls@firstaccess{#1}%
  }
  \define@key{glsxtrabbrv}{firstpluralaccess}{%
    \def\@gls@firstpluralaccess{#1}%
  }
  \define@key{glsxtrabbrv}{shortaccess}{%
    \def\@gls@shortaccess{#1}%
  }
  \define@key{glsxtrabbrv}{shortpluralaccess}{%
    \def\@gls@shortaccesspl{#1}%
  }
  \define@key{glsxtrabbrv}{longaccess}{%
    \def\@gls@longaccess{#1}%
  }
  \define@key{glsxtrabbrv}{shortlonglaccess}{%
    \def\@gls@longaccesspl{#1}%
  }
  \newcommand*{\@gls@initaccesskeys}{%
    \def\@gls@nameaccess{}%
    \def\@gls@textaccess{}%
    \def\@gls@pluralaccess{}%
    \def\@gls@firstaccess{}%
    \def\@gls@firstpluralaccess{}%
    \def\@gls@shortaccess{}%
    \def\@gls@shortaccesspl{}%
    \def\@gls@longaccess{}%
    \def\@gls@longaccesspl{}%
  }
\newcommand*{\@gls@ifaccessattribute@set}[3]{%
  \glsifcategoryattribute{\glscategorylabel}{access#1}{true}%
  {#2}%
  {%
    \glsifcategoryattribute{\glscategorylabel}{access#1}{false}%
    {#3}%
    {%
      \glsifcategoryattribute{\glscategorylabel}{#1}{true}%
      {#2}%
      {#3}%
    }%
  }%
}
  \def\glsdefaultshortaccess#1#2{#1 (#2)}
  \newcommand{\glsxtrassignactualsetup}{%
   \let\@\empty
   \let\emph\@firstofone
   \let\textbf\@firstofone
   \let\textmd\@firstofone
   \let\textit\@firstofone
   \let\textsl\@firstofone
   \let\textsc\@firstofone
   \let\textrm\@firstofone
   \let\textsf\@firstofone
   \let\texttt\@firstofone
  }
  \ifdef\pdfstringdef
  {
     \newcommand{\@gls@assign@actual}{%
      \begingroup
       \glsxtrassignactualsetup
       \pdfstringdef\@gls@actualshort{\glsxtrorgshort}%
       \pdfstringdef\@gls@actuallong{\glsxtrorglong}%
       \pdfstringdef\@gls@actualshortpl{\@gls@shortpl}%
       \pdfstringdef\@gls@actuallongpl{\@gls@longpl}%
      \protected@edef\@gls@tmp{\endgroup
         \def\noexpand\@gls@actualshort{\expandonce\@gls@actualshort}%
         \def\noexpand\@gls@actuallong{\expandonce\@gls@actuallong}%
         \def\noexpand\@gls@actualshortpl{\expandonce\@gls@actualshortpl}%
         \def\noexpand\@gls@actuallongpl{\expandonce\@gls@actuallongpl}%
       }%
       \@gls@tmp
     }
  }
  {
     \newcommand{\@gls@assign@actual}{%
      \begingroup
       \glsxtrassignactualsetup
       \protected@edef\@gls@tmp{\endgroup
         \def\noexpand\@gls@actualshort{\glsxtrorgshort}%
         \def\noexpand\@gls@actuallong{\glsxtrorglong}%
         \def\noexpand\@gls@actualshortpl{\@gls@shortpl}%
         \def\noexpand\@gls@actuallongpl{\@gls@longpl}%
       }%
       \@gls@tmp
     }
  }
  \newcommand{\@gls@setup@default@access}{%
    \@gls@assign@actual
    \ifdefempty\@gls@shortaccess
    {%
      \@gls@ifaccessattribute@set{insertdots}%
      {%
        \expandafter\@glsxtr@insertdots\expandafter\@gls@actualshort\expandafter
         {\@gls@actualshort}%
      }%
      {}%
      \ifdefempty\@gls@longaccess
      {%
        \protected@edef\@gls@shortaccess{\glsdefaultshortaccess
          {\expandonce\@gls@actuallong}{\expandonce\@gls@actualshort}}%
      }%
      {%
        \protected@edef\@gls@shortaccess{\glsdefaultshortaccess
          {\expandonce\@gls@longaccess}{\expandonce\@gls@actualshort}}%
      }%
      \eappto\ExtraCustomAbbreviationFields{shortaccess={\@gls@shortaccess},}%
      \ifdefempty\@gls@shortaccesspl
      {%
        \@gls@ifaccessattribute@set{aposplural}%
        {%
          \expandafter\def\expandafter\@gls@shortaccesspl\expandafter{%
            \@gls@actualshort'\glsxtrabbrvpluralsuffix}%
        }%
        {%
          \@gls@ifaccessattribute@set{noshortplural}%
          {%
             \let\@gls@shortaccesspl\@gls@shortaccess
          }%
          {%
            \let\@gls@shortaccesspl\@gls@actualshortpl
          }%
        }%
      \ifdefempty\@gls@longaccesspl
      {%
        \protected@edef\@gls@shortaccesspl{\glsdefaultshortaccess
          {\expandonce\@gls@actuallongpl}{\expandonce\@gls@actualshortpl}}%
      }%
      {%
        \protected@edef\@gls@shortaccesspl{\glsdefaultshortaccess
          {\expandonce\@gls@longaccesspl}{\expandonce\@gls@actualshort}}%
      }%
      \eappto\ExtraCustomAbbreviationFields{shortpluralaccess={\@gls@shortaccesspl},}%
      }%
      {}%
    }%
    {%
      \ifdefempty\@gls@shortaccesspl
      {\let\@gls@shortaccesspl\@gls@shortaccess}%
      {}%
    }%
    \ifdefempty\@gls@nameaccess
    {%
      \glsifcategoryattribute{\glscategorylabel}{nameshortaccess}{true}%
      {%
        \eappto\ExtraCustomAbbreviationFields{access={\@gls@shortaccess},}%
      }%
      {}%
    }%
    {}%
    \ifdefempty\@gls@textaccess
    {%
      \glsifcategoryattribute{\glscategorylabel}{textshortaccess}{true}%
      {%
        \eappto\ExtraCustomAbbreviationFields{textaccess={\@gls@shortaccess},}%
      }%
      {}%
    }%
    {}%
    \ifdefempty\@gls@pluralaccess
    {%
      \glsifcategoryattribute{\glscategorylabel}{textshortaccess}{true}%
      {%
        \eappto\ExtraCustomAbbreviationFields{%
           pluralaccess={\@gls@shortaccesspl},%
        }%
      }%
      {}%
    }%
    {}%
    \ifdefempty\@gls@firstaccess
    {%
      \glsifcategoryattribute{\glscategorylabel}{firstshortaccess}{true}%
      {%
        \eappto\ExtraCustomAbbreviationFields{firstaccess={\@gls@shortaccess},}%
      }%
      {}%
    }%
    {}%
    \ifdefempty\@gls@firstpluralaccess
    {%
      \glsifcategoryattribute{\glscategorylabel}{firstshortaccess}{true}%
      {%
        \eappto\ExtraCustomAbbreviationFields{%
           firstpluralaccess={\@gls@shortaccesspl},%
        }%
      }%
      {}%
    }%
    {}%
  }
  \newcommand*{\glsxtrprovideaccsuppcmd}[2]{%
    \ifcsundef{glsxtr#1#2accsupp}%
    {\csdef{glsxtr#1#2accsupp}{\glsshortaccsupp}}%
    {}%
  }
  \newcommand*{\glsxtrAccSuppAbbrSetNoLongAttrs}[1]{%
   \glssetcategoryattribute{#1}{nameshortaccess}{true}%
   \glssetcategoryattribute{#1}{firstshortaccess}{true}%
   \glssetcategoryattribute{#1}{textshortaccess}{true}%
   \glsxtrprovideaccsuppcmd{#1}{name}%
   \glsxtrprovideaccsuppcmd{#1}{first}%
   \glsxtrprovideaccsuppcmd{#1}{firstpl}%
   \glsxtrprovideaccsuppcmd{#1}{text}%
   \glsxtrprovideaccsuppcmd{#1}{plural}%
  }
  \newcommand*{\glsxtrAccSuppAbbrSetFirstLongAttrs}[1]{%
   \glssetcategoryattribute{#1}{nameshortaccess}{true}%
   \glssetcategoryattribute{#1}{textshortaccess}{true}%
   \glsxtrprovideaccsuppcmd{#1}{name}%
   \glsxtrprovideaccsuppcmd{#1}{text}%
   \glsxtrprovideaccsuppcmd{#1}{plural}%
  }
  \newcommand*{\glsxtrAccSuppAbbrSetTextShortAttrs}[1]{%
   \glssetcategoryattribute{#1}{textshortaccess}{true}%
   \glsxtrprovideaccsuppcmd{#1}{text}%
   \glsxtrprovideaccsuppcmd{#1}{plural}%
  }
  \newcommand*{\glsxtrAccSuppAbbrSetNameShortAttrs}[1]{%
   \glssetcategoryattribute{#1}{nameshortaccess}{true}%
   \glsxtrprovideaccsuppcmd{#1}{name}%
  }
  \newcommand*{\glsxtrAccSuppAbbrSetNameLongAttrs}[1]{%
   \glssetcategoryattribute{#1}{firstshortaccess}{true}%
   \glssetcategoryattribute{#1}{textshortaccess}{true}%
   \glsxtrprovideaccsuppcmd{#1}{first}%
   \glsxtrprovideaccsuppcmd{#1}{firstpl}%
   \glsxtrprovideaccsuppcmd{#1}{text}%
   \glsxtrprovideaccsuppcmd{#1}{plural}%
  }
}
{
  \newcommand*{\glsaccessname}[1]{\glsentryname{#1}}
  \newcommand*{\Glsaccessname}[1]{\Glsentryname{#1}}
  \newcommand*{\GLSaccessname}[1]{%
   \protect\mfirstucMakeUppercase{\glsentryname{#1}}}
  \newcommand*{\glsaccesstext}[1]{\glsentrytext{#1}}
  \newcommand*{\Glsaccesstext}[1]{\Glsentrytext{#1}}
  \newcommand*{\GLSaccesstext}[1]{%
   \protect\mfirstucMakeUppercase{\glsentrytext{#1}}}
  \newcommand*{\glsaccessplural}[1]{\glsentryplural{#1}}
  \newcommand*{\Glsaccessplural}[1]{\Glsentryplural{#1}}
  \newcommand*{\GLSaccessplural}[1]{%
   \protect\mfirstucMakeUppercase{\glsentryplural{#1}}}
  \newcommand*{\glsaccessfirst}[1]{\glsentryfirst{#1}}
  \newcommand*{\Glsaccessfirst}[1]{\Glsentryfirst{#1}}
  \newcommand*{\GLSaccessfirst}[1]{%
   \protect\mfirstucMakeUppercase{\glsentryfirst{#1}}}
  \newcommand*{\glsaccessfirstplural}[1]{\glsentryfirstplural{#1}}
  \newcommand*{\Glsaccessfirstplural}[1]{\Glsentryfirstplural{#1}}
  \newcommand*{\GLSaccessfirstplural}[1]{%
   \protect\mfirstucMakeUppercase{\glsentryfirstplural{#1}}}
  \newcommand*{\glsaccesssymbol}[1]{\glsentrysymbol{#1}}
  \newcommand*{\Glsaccesssymbol}[1]{\Glsentrysymbol{#1}}
  \newcommand*{\GLSaccesssymbol}[1]{%
   \protect\mfirstucMakeUppercase{\glsentrysymbol{#1}}}
  \newcommand*{\glsaccesssymbolplural}[1]{\glsentrysymbolplural{#1}}
  \newcommand*{\Glsaccesssymbolplural}[1]{\Glsentrysymbolplural{#1}}
  \newcommand*{\GLSaccesssymbolplural}[1]{%
   \protect\mfirstucMakeUppercase{\glsentrysymbolplural{#1}}}
  \newcommand*{\glsaccessdesc}[1]{\glsentrydesc{#1}}
  \newcommand*{\Glsaccessdesc}[1]{\Glsentrydesc{#1}}
  \newcommand*{\GLSaccessdesc}[1]{%
   \protect\mfirstucMakeUppercase{\glsentrydesc{#1}}}
  \newcommand*{\glsaccessdescplural}[1]{\glsentrydescplural{#1}}
  \newcommand*{\Glsaccessdescplural}[1]{\Glsentrydescplural{#1}}
  \newcommand*{\GLSaccessdescplural}[1]{%
   \protect\mfirstucMakeUppercase{\glsentrydescplural{#1}}}
  \newcommand*{\glsaccessshort}[1]{\glsentryshort{#1}}
  \newcommand*{\Glsaccessshort}[1]{\Glsentryshort{#1}}
  \newcommand*{\GLSaccessshort}[1]{%
   \protect\mfirstucMakeUppercase{\glsentryshort{#1}}}
  \newcommand*{\glsaccessshortpl}[1]{\glsentryshortpl{#1}}
  \newcommand*{\Glsaccessshortpl}[1]{\Glsentryshortpl{#1}}
  \newcommand*{\GLSaccessshortpl}[1]{%
   \protect\mfirstucMakeUppercase{\glsentryshortpl{#1}}}
  \newcommand*{\glsaccesslong}[1]{\glsentrylong{#1}}
  \newcommand*{\Glsaccesslong}[1]{\Glsentrylong{#1}}
  \newcommand*{\GLSaccesslong}[1]{%
   \protect\mfirstucMakeUppercase{\glsentrylong{#1}}}
  \newcommand*{\glsaccesslongpl}[1]{\glsentrylongpl{#1}}
  \newcommand*{\Glsaccesslongpl}[1]{\Glsentrylongpl{#1}}
  \newcommand*{\GLSaccesslongpl}[1]{%
   \protect\mfirstucMakeUppercase{\glsentrylongpl{#1}}}
  \newcommand*{\@gls@initaccesskeys}{}
  \newcommand{\@gls@setup@default@access}{}
  \newcommand*{\glsxtrAccSuppAbbrSetNoLongAttrs}[1]{}
  \newcommand*{\glsxtrAccSuppAbbrSetFirstLongAttrs}[1]{}
  \newcommand*{\glsxtrAccSuppAbbrSetTextShortAttrs}[1]{}
  \newcommand*{\glsxtrAccSuppAbbrSetNameShortAttrs}[1]{}
  \newcommand*{\glsxtrAccSuppAbbrSetNameLongAttrs}[1]{}
}
\glsaddstoragekey{category}{general}{\glscategory}
\newcommand{\glsifcategory}[4]{%
 \ifglsfieldeq{#1}{category}{#2}{#3}{#4}%
}
\newcommand*{\glssetcategoryattribute}[3]{%
  \csdef{@glsxtr@categoryattr@@#1@#2}{#3}%
}
\newcommand*{\glssetcategoriesattribute}[3]{%
  \@for\@gls@thiscatlabel:=#1\do{%
    \csgdef{@glsxtr@categoryattr@@\@gls@thiscatlabel @#2}{#3}%
  }%
}
\newcommand*{\glssetcategoriesattributes}[3]{%
 {%
   \@for\@gls@thisattrlabel:=#2\do{%
     \glssetcategoriesattribute{#1}{\@gls@thisattrlabel}{#3}%
   }%
 }%
}
\newcommand*{\glsgetcategoryattribute}[2]{%
  \csuse{@glsxtr@categoryattr@@#1@#2}%
}
\newcommand*{\glsunsetcategoryattribute}[2]{%
  \csundef{@glsxtr@categoryattr@@#1@#2}%
}
\newcommand*{\glshascategoryattribute}[4]{%
  \ifcsvoid{@glsxtr@categoryattr@@#1@#2}{#4}{#3}%
}
\newcommand*{\glssetattribute}[3]{%
  \glssetcategoryattribute{\glscategory{#1}}{#2}{#3}%
}
\newcommand*{\glsgetattribute}[2]{%
  \glsgetcategoryattribute{\glscategory{#1}}{#2}%
}
\newcommand*{\glshasattribute}[4]{%
  \ifglsentryexists{#1}%
  {\glshascategoryattribute{\glscategory{#1}}{#2}{#3}{#4}}%
  {#4}%
}
\newcommand{\glsifcategoryattribute}[5]{%
 \ifcsundef{@glsxtr@categoryattr@@#1@#2}%
 {#5}%
 {\ifcsstring{@glsxtr@categoryattr@@#1@#2}{#3}{#4}{#5}}%
}
\newcommand{\glsifattribute}[5]{%
  \ifglsentryexists{#1}%
  {\glsifcategoryattribute{\glscategory{#1}}{#2}{#3}{#4}{#5}}%
  {#5}%
}
\glssetcategoryattribute{general}{regular}{true}
\glssetcategoryattribute{acronym}{regular}{true}
\newcommand*{\glssetregularcategory}[1]{%
 \glssetcategoryattribute{#1}{regular}{true}%
}
\newcommand{\glsifregularcategory}[3]{%
  \glsifcategoryattribute{#1}{regular}{true}{#2}{#3}%
}
\newcommand{\glsifnotregularcategory}[3]{%
  \glsifcategoryattribute{#1}{regular}{false}{#2}{#3}%
}
\newcommand{\glsifregular}[3]{%
  \glsifregularcategory{\glscategory{#1}}{#2}{#3}%
}
\newcommand{\glsifnotregular}[3]{%
  \glsifnotregularcategory{\glscategory{#1}}{#2}{#3}%
}
\newcommand{\glsforeachincategory}[5][\@glo@types]{%
  \forallglossaries[#1]{#3}%
  {%
     \forglsentries[#3]{#4}%
     {%
       \glsifcategory{#4}{#2}{#5}{}%
     }%
  }%
}
\newcommand{\glsforeachwithattribute}[6][\@glo@types]{%
  \forallglossaries[#1]{#4}%
  {%
     \forglsentries[#4]{#5}%
     {%
       \glsifattribute{#5}{#2}{#3}{#6}{}%
     }%
  }%
}
\ifdef\newterm
{%
  \renewcommand*{\newterm}[2][]{%
    \newglossaryentry{#2}%
    {type={index},category=index,name={#2},%
     description={\glsxtrpostdescription\nopostdesc},#1}%
  }
  \glssetcategoryattribute{index}{regular}{true}
  \newcommand*{\glsxtrpostdescindex}{}
}
{}
\ifdef\printsymbols
{%
  \newcommand*{\glsxtrnewsymbol}[3][]{%
    \newglossaryentry{#2}{name={#3},sort={#2},type=symbols,category=symbol,#1}%
  }
  \glssetcategoryattribute{symbol}{regular}{true}
  \newcommand*{\glsxtrpostdescsymbol}{}
}
{}
\ifdef\printnumbers
{%
\ifdef\printnumbers
  \newcommand*{\glsxtrnewnumber}[3][]{%
    \newglossaryentry{#2}{name={#3},sort={#2},type=numbers,category=number,#1}%
  }
  \glssetcategoryattribute{number}{regular}{true}
  \newcommand*{\glsxtrpostdescnumber}{}
}
{}
\newcommand*{\glsxtrsetcategory}[2]{%
  \@for\@glsxtr@label:=#1\do
  {%
    \glsfieldxdef{\@glsxtr@label}{category}{#2}%
  }%
}
\newcommand*{\glsxtrsetcategoryforall}[2]{%
  \forallglossaries[#1]{\@glsxtr@type}{%
    \forglsentries[\@glsxtr@type]{\@glsxtr@label}%
    {%
      \glsfieldxdef{\@glsxtr@label}{category}{#2}%
    }%
  }%
}
\newcommand*{\glsxtrfieldtitlecase}[2]{%
  \expandafter\glsxtrfieldtitlecasecs\expandafter
    {\csname glo@\glsdetoklabel{#1}@#2\endcsname}%
}
\ifdef\glscapitalisewords
{
 \newcommand*{\glsxtrfieldtitlecasecs}[1]{%
  \expandafter\glscapitalisewords\expandafter{#1}}
}
{
 \newcommand*{\glsxtrfieldtitlecasecs}[1]{\xcapitalisewords{#1}}
}
\@ifpackageloaded{glossaries-accsupp}
{
  \renewcommand*{\glossentrydesc}[1]{%
    \glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
      \glshasattribute{#1}{glossdescfont}%
      {%
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossdescfont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossdescfont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name
          `\@glsxtr@attrval' supplied in glossdescfont attribute
          for entry `#1'. Ignoring}%
          \let\@glsxtr@glossdescfont\@firstofone
        }%
      }%
      {\let\@glsxtr@glossdescfont\@firstofone}%
      \glsifattribute{#1}{glossdesc}{firstuc}%
      {%
        \@glsxtr@glossdescfont{\Glsaccessdesc{#1}}%
      }%
      {%
        \glsifattribute{#1}{glossdesc}{title}%
        {%
          \@glsxtr@do@titlecaps@warn
          \glsdescriptionaccessdisplay
          {%
            \@glsxtr@glossdescfont{\glsxtrfieldtitlecase{#1}{desc}}%
          }%
          {#1}%
        }%
        {%
          \@glsxtr@glossdescfont{\glsaccessdesc{#1}}%
        }%
      }%
    }%
  }
}
{
  \renewcommand*{\glossentrydesc}[1]{%
    \glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
      \glshasattribute{#1}{glossdescfont}%
      {%
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossdescfont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossdescfont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name
          `\@glsxtr@attrval' supplied in glossdescfont attribute
          for entry `#1'. Ignoring}%
          \let\@glsxtr@glossdescfont\@firstofone
        }%
      }%
      {\let\@glsxtr@glossdescfont\@firstofone}%
      \glsifattribute{#1}{glossdesc}{firstuc}%
      {%
        \@glsxtr@glossdescfont{\Glsentrydesc{#1}}%
      }%
      {%
        \glsifattribute{#1}{glossdesc}{title}%
        {%
          \@glsxtr@do@titlecaps@warn
          \@glsxtr@glossdescfont{\glsxtrfieldtitlecase{#1}{desc}}%
        }%
        {%
          \@glsxtr@glossdescfont{\glsentrydesc{#1}}%
        }%
      }%
    }%
  }
}
\@ifpackageloaded{glossaries-accsupp}
{
  \renewcommand*{\glossentryname}[1]{%
    \@glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
      \glshasattribute{#1}{glossnamefont}%
      {%
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name
          `\@glsxtr@attrval' supplied in glossnamefont attribute
          for entry `#1'. Reverting to default \string\glsnamefont}%
          \let\@glsxtr@glossnamefont\glsnamefont
        }%
      }%
      {\let\@glsxtr@glossnamefont\glsnamefont}%
      \glsifattribute{#1}{glossname}{firstuc}%
      {%
        \glsnameaccessdisplay
        {%
          \@glsxtr@glossnamefont{\Glsentryname{#1}}%
        }%
        {#1}%
      }%
      {%
        \glsifattribute{#1}{glossname}{title}%
        {%
          \@glsxtr@do@titlecaps@warn
          \glsnameaccessdisplay
          {%
            \@glsxtr@glossnamefont{\glsxtrfieldtitlecase{#1}{name}}%
          }%
          {#1}%
        }%
        {%
          \glsifattribute{#1}{glossname}{uc}%
          {%
            \glsnameaccessdisplay
            {%
               \letcs{\glo@name}{glo@\glsdetoklabel{#1}@name}%
               \@glsxtr@glossnamefont{\mfirstucMakeUppercase{\glo@name}}%
            }%
            {#1}%
          }%
          {%
            \letcs{\glo@name}{glo@\glsdetoklabel{#1}@name}%
            \glsnameaccessdisplay
            {%
              \expandafter\@glsxtr@glossnamefont\expandafter{\glo@name}%
            }%
            {#1}%
          }%
        }%
      }%
      \glsxtrpostnamehook{#1}%
    }%
  }
}
{
  \renewcommand*{\glossentryname}[1]{%
    \@glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
      \glshasattribute{#1}{glossnamefont}%
      {%
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name
          `\@glsxtr@attrval' supplied in glossnamefont attribute
          for entry `#1'. Reverting to default \string\glsnamefont}%
          \let\@glsxtr@glossnamefont\glsnamefont
        }%
      }%
      {\let\@glsxtr@glossnamefont\glsnamefont}%
      \glsifattribute{#1}{glossname}{firstuc}%
      {%
        \@glsxtr@glossnamefont{\Glsentryname{#1}}%
      }%
      {%
        \glsifattribute{#1}{glossname}{title}%
        {%
          \@glsxtr@do@titlecaps@warn
          \@glsxtr@glossnamefont{\glsxtrfieldtitlecase{#1}{name}}%
        }%
        {%
          \glsifattribute{#1}{glossname}{uc}%
          {%
            \letcs{\glo@name}{glo@\glsdetoklabel{#1}@name}%
            \@glsxtr@glossnamefont{\mfirstucMakeUppercase{\glo@name}}%
          }%
          {%
            \letcs{\glo@name}{glo@\glsdetoklabel{#1}@name}%
            \expandafter\@glsxtr@glossnamefont\expandafter{\glo@name}%
          }%
        }%
      }%
      \glsxtrpostnamehook{#1}%
    }%
  }
}
\@ifpackageloaded{glossaries-accsupp}
{
  \renewcommand*{\Glossentryname}[1]{%
    \@glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
      \glshasattribute{#1}{glossnamefont}%
      {%
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name
          `\@glsxtr@attrval' supplied in glossnamefont attribute
          for entry `#1'. Reverting to default \string\glsnamefont}%
          \let\@glsxtr@glossnamefont\glsnamefont
        }%
      }%
      {\let\@glsxtr@glossnamefont\glsnamefont}%
      \glsnameaccessdisplay
      {%
        \@glsxtr@glossnamefont{\Glsentryname{#1}}%
      }%
      {#1}%
      \glsxtrpostnamehook{#1}%
    }%
  }
}
{
  \renewcommand*{\Glossentryname}[1]{%
    \@glsdoifexistsorwarn{#1}%
    {%
      \glssetabbrvfmt{\glscategory{#1}}%
      \glshasattribute{#1}{glossnamefont}%
      {%
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name
          `\@glsxtr@attrval' supplied in glossnamefont attribute
          for entry `#1'. Reverting to default \string\glsnamefont}%
          \let\@glsxtr@glossnamefont\glsnamefont
        }%
      }%
      {\let\@glsxtr@glossnamefont\glsnamefont}%
      \@glsxtr@glossnamefont{\Glsentryname{#1}}%
      \glsxtrpostnamehook{#1}%
    }%
  }
}
\newcommand*{\glsxtrpostnamehook}[1]{%
  \let\@glsnumberformat\@glsxtr@defaultnumberformat
  \glsxtrdoautoindexname{#1}{indexname}%
  \glsextrapostnamehook{#1}%
  \csuse{glsxtrpostname\glscategory{#1}}%
}
\newcommand*{\glsextrapostnamehook}[1]{}%
\newcommand*{\glsdefpostname}[2]{%
  \csdef{glsxtrpostname#1}{#2}%
}
\@ifpackageloaded{glossaries-accsupp}
{
  \newcommand*{\glsxtr@setaccessdisplay}[1]{%
     \ifcsdef{gls#1accessdisplay}%
     {\letcs\@glsxtr@accessdisplay{gls#1accessdisplay}}%
     {%
       \protected@edef\@gls@thisval{#1}%
       \@for\@gls@map:=\@gls@keymap\do{%
        \protected@edef\@this@key{\expandafter\@secondoftwo\@gls@map}%
        \ifdefequal{\@this@key}{\@gls@thisval}%
        {%
          \protected@edef\@gls@thisval{\expandafter\@firstoftwo\@gls@map}%
          \@endfortrue
        }%
        {}%
       }%
       \ifcsdef{gls\@gls@thisval accessdisplay}%
       {\letcs\@glsxtr@accessdisplay{gls\@gls@thisval accessdisplay}}%
       {\let\@glsxtr@accessdisplay\@firstoftwo}%
     }%
  }
}
{%
  \newcommand*{\glsxtr@setaccessdisplay}[1]{%
   \let\@glsxtr@accessdisplay\@firstoftwo}
}
\newrobustcmd*{\glossentrynameother}[2]{%
  \@glsdoifexistsorwarn{#1}%
  {%
    \glsxtr@setaccessdisplay{#2}%
    \glssetabbrvfmt{\glscategory{#1}}%
    \glshasattribute{#1}{glossnamefont}%
    {%
      \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glossnamefont}}%
      \ifcsdef{\@glsxtr@attrval}%
      {%
        \letcs{\@glsxtr@glossnamefont}{\@glsxtr@attrval}%
      }%
      {%
        \GlossariesExtraWarning{Unknown control sequence name
        `\@glsxtr@attrval' supplied in glossnamefont attribute
        for entry `#1'. Reverting to default \string\glsnamefont}%
        \let\@glsxtr@glossnamefont\glsnamefont
      }%
    }%
    {\let\@glsxtr@glossnamefont\glsnamefont}%
    \glsifattribute{#1}{glossname}{firstuc}%
    {%
      \@glsxtr@accessdisplay
      {\@glsxtr@glossnamefont{\@Gls@entry@field{#1}{#2}}}%
      {#1}%
    }%
    {%
      \glsifattribute{#1}{glossname}{title}%
      {%
        \@glsxtr@do@titlecaps@warn
        \@glsxtr@accessdisplay
        {\@glsxtr@glossnamefont{\glsxtrfieldtitlecase{#1}{#2}}}%
        {#1}%
      }%
      {%
        \glsifattribute{#1}{glossname}{uc}%
        {%
          \letcs{\glo@name}{glo@\glsdetoklabel{#1}@#2}%
          \@glsxtr@accessdisplay
          {\@glsxtr@glossnamefont{\mfirstucMakeUppercase{\glo@name}}}%
          {#1}%
        }%
        {%
          \letcs{\glo@name}{glo@\glsdetoklabel{#1}@#2}%
          \@glsxtr@accessdisplay
          {\expandafter\@glsxtr@glossnamefont\expandafter{\glo@name}}%
          {#1}%
        }%
      }%
    }%
      \glsxtrpostnamehook{#1}%
  }%
}
\newif\if@glsxtr@format@override
\@glsxtr@format@overridefalse
\@ifpackageloaded{hyperref}
{
  \ifHy@hyperindex
    \newcommand*{\GlsXtrEnableIndexFormatOverride}{%
      \@glsxtr@format@overridetrue
      \appto\theindex{\let\glshypernumber\@firstofone}%
    }
  \else
    \newcommand*{\GlsXtrEnableIndexFormatOverride}{%
      \@glsxtr@format@overridetrue
      \appto\theindex{\let\glshypernumber\hyperpage}%
    }
  \fi
}
{
  \newcommand*{\GlsXtrEnableIndexFormatOverride}{%
    \@glsxtr@format@overridetrue
  }
}
\@onlypreamble\GlsXtrEnableIndexFormatOverride
\newcommand*{\glsxtrdoautoindexname}[2]{%
  \glshasattribute{#1}{#2}%
  {%
    \@glsxtr@autoindex@setname{#1}%
    \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{#2}}%
    \if@glsxtr@format@override
      \ifx\@glsnumberformat\@glsxtr@defaultnumberformat
      \else
        \let\@glsxtr@attrval\@glsnumberformat
      \fi
    \fi
    \ifdefstring{\@glsxtr@attrval}{true}%
    {}%
    {\protected@eappto\@glo@name{\@glsxtr@autoindex@encap\@glsxtr@attrval}}%
    \expandafter\glsxtrautoindex\expandafter{\@glo@name}%
  }%
  {}%
}
\newcommand*{\glsxtrautoindex}{\index}
\newcommand{\glsxtrautoindexesc}{%
  \@gls@checkmkidxchars\@glo@sort
  \@glsxtr@autoindex@doextra@esc\@glo@sort
}
\newcommand*{\@glsxtr@autoindex@setname}[1]{%
  \protected@edef\@glo@name{\glsxtrautoindexentry{#1}}%
  \glsxtrautoindexassignsort{\@glo@sort}{#1}%
  \glsxtrautoindexesc
  \epreto\@glo@name{\@glo@sort\@glsxtr@autoindex@at}%
}
\newcommand*{\glsxtrautoindexentry}[1]{\string\glsentryname{#1}}
\newcommand*{\glsxtrautoindexassignsort}[2]{%
  \glsletentryfield{#1}{#2}{sort}%
}
\newcommand*{\@glsxtr@autoindex@doextra@esc}[1]{%
  \ifx\@glsxtr@autoindex@esc\@gls@quotechar
  \else
    \def\@gls@checkedmkidx{}%
    \edef\@@glsxtr@checkspch{%
      \noexpand\@glsxtr@autoindex@escquote\expandonce{#1}%
        \noexpand\@empty\@glsxtr@autoindex@esc\noexpand\@nnil
        \@glsxtr@autoindex@esc\noexpand\@empty\noexpand\@glsxtr@endescspch}%
    \@@glsxtr@checkspch
    \let#1\@gls@checkedmkidx\relax
  \fi
  \ifx\@glsxtr@autoindex@at\@gls@actualchar
  \else
    \def\@gls@checkedmkidx{}%
    \edef\@@glsxtr@checkspch{%
      \noexpand\@glsxtr@autoindex@escat\expandonce{#1}%
        \noexpand\@empty\@glsxtr@autoindex@at\noexpand\@nnil
        \@glsxtr@autoindex@at\noexpand\@empty\noexpand\@glsxtr@endescspch}%
    \@@glsxtr@checkspch
    \let#1\@gls@checkedmkidx\relax
  \fi
  \ifx\@glsxtr@autoindex@level\@gls@levelchar
  \else
    \def\@gls@checkedmkidx{}%
    \edef\@@glsxtr@checkspch{%
      \noexpand\@glsxtr@autoindex@esclevel\expandonce{#1}%
        \noexpand\@empty\@glsxtr@autoindex@level\noexpand\@nnil
        \@glsxtr@autoindex@level\noexpand\@empty\noexpand\@glsxtr@endescspch}%
    \@@glsxtr@checkspch
    \let#1\@gls@checkedmkidx\relax
  \fi
  \ifx\@glsxtr@autoindex@encap\@gls@encapchar
  \else
    \def\@gls@checkedmkidx{}%
    \edef\@@glsxtr@checkspch{%
      \noexpand\@glsxtr@autoindex@escencap\expandonce{#1}%
        \noexpand\@empty\@glsxtr@autoindex@encap\noexpand\@nnil
        \@glsxtr@autoindex@encap\noexpand\@empty\noexpand\@glsxtr@endescspch}%
    \@@glsxtr@checkspch
    \let#1\@gls@checkedmkidx\relax
  \fi
}
\newcommand*{\@glsxtr@autoindex@at}{}
\newcommand*{\GlsXtrSetActualChar}[1]{%
  \gdef\@glsxtr@autoindex@at{#1}%
  \def\@glsxtr@autoindex@escat##1#1##2#1##3\@glsxtr@endescspch{%
    \@@glsxtr@autoindex@escspch{#1}{\@glsxtr@autoindex@escat}{##1}{##2}{##3}%
  }%
}
\@onlypreamble\GlsXtrSetActualChar
\makeatother
\GlsXtrSetActualChar{@}
\makeatletter
\newcommand*{\@glsxtr@autoindex@encap}{}
\newcommand*{\GlsXtrSetEncapChar}[1]{%
  \gdef\@glsxtr@autoindex@encap{#1}%
  \def\@glsxtr@autoindex@escencap##1#1##2#1##3\@glsxtr@endescspch{%
    \@@glsxtr@autoindex@escspch{#1}{\@glsxtr@autoindex@escencap}{##1}{##2}{##3}%
  }%
}
\GlsXtrSetEncapChar{|}
\@onlypreamble\GlsXtrSetEncapChar
\newcommand*{\@glsxtr@autoindex@level}{}
\newcommand*{\GlsXtrSetLevelChar}[1]{%
  \gdef\@glsxtr@autoindex@level{#1}%
  \def\@glsxtr@autoindex@esclevel##1#1##2#1##3\@glsxtr@endescspch{%
    \@@glsxtr@autoindex@escspch{#1}{\@glsxtr@autoindex@esclevel}{##1}{##2}{##3}%
  }%
}
\GlsXtrSetLevelChar{!}
\@onlypreamble\GlsXtrSetLevelChar
\newcommand*{\@glsxtr@autoindex@esc}{"}
\newcommand*{\GlsXtrSetEscChar}[1]{%
  \gdef\@glsxtr@autoindex@esc{#1}%
  \def\@glsxtr@autoindex@escquote##1#1##2#1##3\@glsxtr@endescspch{%
    \@@glsxtr@autoindex@escspch{#1}{\@glsxtr@autoindex@escquote}{##1}{##2}{##3}%
  }%
}
\GlsXtrSetEscChar{"}
\@onlypreamble\GlsXtrSetEscChar
\ifdef\actualchar
 {\expandafter\GlsXtrSetActualChar\expandafter{\actualchar}}
 {}
\ifdef\quotechar
 {\expandafter\GlsXtrSetEscChar\expandafter{\quotechar}}
 {}
\ifdef\levelchar
 {\expandafter\GlsXtrSetLevelChar\expandafter{\levelchar}}
 {}
\ifdef\encapchar
 {\expandafter\GlsXtrSetEncapChar\expandafter{\encapchar}}
 {}
\def\@glsxtr@gobbleto@endescspch#1\@glsxtr@endescspch{}
\newcommand*{\@@glsxtr@autoindex@escspch}[5]{%
  \@gls@tmpb=\expandafter{\@gls@checkedmkidx}%
  \toks@={#3}%
  \ifx\@nnil#3\relax
    \def\@@glsxtr@checkspch{\@glsxtr@gobbleto@endescspch#5\@glsxtr@endescspch}%
  \else
    \ifx\@nnil#4\relax
      \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@}%
     \def\@@glsxtr@checkspch{\@glsxtr@gobbleto@endescspch
        #4#5\@glsxtr@endescspch}%
    \else
      \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
       \@glsxtr@autoindex@esc#1}%
      \def\@@glsxtr@checkspch{#2#5#1\@nnil#1\@glsxtr@endescspch}%
    \fi
  \fi
  \@@glsxtr@checkspch
}
\renewcommand*{\Glossentrydesc}[1]{%
  \glsdoifexistsorwarn{#1}%
  {%
    \glssetabbrvfmt{\glscategory{#1}}%
    \Glsaccessdesc{#1}%
  }%
}
\ifdef\texorpdfstring
{
  \renewcommand*{\glossentrysymbol}[1]{%
    \texorpdfstring{\@glossentrysymbol{#1}}{\glsentrypdfsymbol{#1}}%
  }
}
{
  \renewcommand*{\glossentrysymbol}[1]{\@glossentrysymbol{#1}}
}
\newcommand{\glsentrypdfsymbol}[1]{\glsentrysymbol{#1}}
\newrobustcmd*{\@glossentrysymbol}[1]{%
  \glsdoifexistsorwarn{#1}%
  {%
    \begingroup
      \glssetabbrvfmt{\glscategory{#1}}%
      \glshasattribute{#1}{glosssymbolfont}%
      {%
        \protected@edef\@glsxtr@attrval{\glsgetattribute{#1}{glosssymbolfont}}%
        \ifcsdef{\@glsxtr@attrval}%
        {%
          \letcs{\@glsxtr@glosssymbolfont}{\@glsxtr@attrval}%
        }%
        {%
          \GlossariesExtraWarning{Unknown control sequence name
          `\@glsxtr@attrval' supplied in glosssymbolfont attribute
          for entry `#1'. Ignoring}%
          \let\@glsxtr@glosssymbolfont\@firstofone
        }%
      }%
      {\let\@glsxtr@glosssymbolfont\@firstofone}%
      \@glsxtr@glosssymbolfont{\glsaccesssymbol{#1}}%
    \endgroup
  }%
}
\renewcommand*{\Glossentrysymbol}[1]{%
  \glsdoifexistsorwarn{#1}%
  {%
    \glssetabbrvfmt{\glscategory{#1}}%
    \Glsaccesssymbol{#1}%
  }%
}
\newcommand*{\GlsXtrEnableInitialTagging}{%
  \@ifstar\s@glsxtr@enabletagging\@glsxtr@enabletagging
}
\@onlypreamble\GlsXtrEnableInitialTagging
\newcommand*{\s@glsxtr@enabletagging}[2]{%
  \undef#2%
  \@glsxtr@enabletagging{#1}{#2}%
}
\newcommand*{\@glsxtr@enabletagging}[2]{%
  \@for\@glsxtr@cat:=#1\do
  {%
    \ifdefempty\@glsxtr@cat
    {}%
    {\glssetcategoryattribute{\@glsxtr@cat}{tagging}{true}}%
  }%
  \newrobustcmd*#2[1]{##1}%
  \def\@glsxtr@taggingcs{#2}%
  \renewcommand*\@glsxtr@activate@initialtagging{%
    \let#2\@glsxtr@tag
  }%
  \ifundef\@gls@preglossaryhook
  {\GlossariesExtraWarning{Initial tagging requires at least
    glossaries.sty v4.19 to work correctly}}%
  {}%
}
\ifundef\mfu@checkword@do
{
  \newcommand*{\mfu@checkword@do}[1]{%
   \ifdefstring{\mfu@checkword@arg}{#1}%
   {%
     \let\@mfu@domakefirstuc\@firstofone
     \listbreak
   }%
   {}%
  }
  \ifundef\mfu@checkword
  {
    \newcommand{\@glsxtr@do@titlecaps@warn}{%
     \GlossariesExtraWarning{mfirstuc.sty too old. Title Caps
      support not available}%
      \let\@glsxtr@do@titlecaps@warn\relax
    }
  }
  {
    \renewcommand*{\mfu@checkword}[1]{%
      \def\mfu@checkword@arg{#1}%
      \let\@mfu@domakefirstuc\makefirstuc
      \forlistloop\mfu@checkword@do\@mfu@nocaplist
    }
  }
}
{}% no patch required
\newcommand*{\@glsxtr@do@titlecaps@warn}{}
\newcommand*\@glsxtr@activate@initialtagging{}
\newrobustcmd*{\@glsxtr@tag}[1]{%
  \glsifattribute{\glscurrententrylabel}{tagging}{true}%
  {\glsxtrtagfont{#1}}{#1}%
}
\newcommand*{\glsxtrtagfont}[1]{\underline{#1}}
\ifdef\@gls@preglossaryhook
{
  \renewcommand*{\@gls@preglossaryhook}{%
    \@glsxtr@activate@initialtagging
    \ifundef\@glsxtr@org@postdescription
    {%
      \let\@glsxtr@org@postdescription\glspostdescription
      \renewcommand*{\glspostdescription}{%
        \ifglsentryexists{\glscurrententrylabel}%
        {%
          \glsxtrpostdescription
          \@glsxtr@org@postdescription
        }%
        {}%
      }%
    }%
    {}%
    \glossxtrsetpopts
  }%
}
{}
\newcommand*{\glsxtrpostdescription}{%
  \csuse{glsxtrpostdesc\glscategory{\glscurrententrylabel}}%
}
\newcommand*{\glsxtrpostdescgeneral}{}
\newcommand*{\glsxtrpostdescterm}{}
\newcommand*{\glsxtrpostdescacronym}{}
\newcommand*{\glsxtrpostdescabbreviation}{}
\newcommand*{\glsdefpostdesc}[2]{%
  \csdef{glsxtrpostdesc#1}{#2}%
}
\renewcommand*{\glspostlinkhook}{%
 \ifglsentryexists{\glslabel}{\glsxtrpostlinkhook}{}%
}
\newcommand*{\glsxtrpostlinkhook}{%
 \glsxtrdiscardperiod{\glslabel}%
 {\glsxtrpostlinkendsentence}%
 {\glsxtrifcustomdiscardperiod
  {\glsxtrifperiod{\glsxtrpostlinkendsentence}{\glsxtrpostlink}}%
  {\glsxtrpostlink}%
 }%
}
\newcommand*{\glsxtrifcustomdiscardperiod}[2]{#2}
\newcommand*{\glsxtrpostlink}{%
 \csuse{glsxtrpostlink\glscategory{\glslabel}}%
}
\newcommand*{\glsdefpostlink}[2]{%
  \ifthenelse{\equal{#1}{}}%
  {\PackageError{glossaries-extra}
    {Invalid empty category label in \string\glsdefpostlink}{}}%
  {\csdef{glsxtrpostlink#1}{#2}}%
}
\newcommand*{\glsxtrpostlinkendsentence}{%
 \ifcsdef{glsxtrpostlink\glscategory{\glslabel}}
 {%
   \csuse{glsxtrpostlink\glscategory{\glslabel}}%
   .\spacefactor\sfcode`\. \relax
 }%
 {%
   \spacefactor\sfcode`\. \relax
 }%
}
\newcommand*{\glsxtrpostlinkAddDescOnFirstUse}{%
  \glsxtrifwasfirstuse{\space\glsxtrparen{\glsaccessdesc{\glslabel}}}{}%
}
\newcommand*{\glsxtrpostlinkAddSymbolOnFirstUse}{%
  \glsxtrifwasfirstuse
  {%
    \ifglshassymbol{\glslabel}%
    {\space\glsxtrparen{\glsaccesssymbol{\glslabel}}}%
    {}%
  }%
  {}%
}
\newcommand*{\glsxtrpostlinkAddSymbolDescOnFirstUse}{%
  \glsxtrifwasfirstuse
  {%
    \space\glsxtrparen
    {%
      \ifglshassymbol{\glslabel}%
      {\glsaccesssymbol{\glslabel}, }%
      {}%
      \glsaccessdesc{\glslabel}%
    }%
  }%
  {}%
}
\newcommand*{\glsxtrdiscardperiod}[3]{%
 \glsxtrifwasfirstuse
 {%
   \glsifattribute{#1}{retainfirstuseperiod}{true}%
   {#3}%
   {%
     \glsifattribute{#1}{discardperiod}{true}%
     {%
       \glsifplural
       {%
         \glsifattribute{#1}{pluraldiscardperiod}{true}%
         {\glsxtrifperiod{#2}{#3}}%
         {#3}%
       }%
       {%
         \glsxtrifperiod{#2}{#3}%
       }%
     }%
     {#3}%
   }%
 }%
 {%
   \glsifattribute{#1}{discardperiod}{true}%
   {%
     \glsifplural
     {%
       \glsifattribute{#1}{pluraldiscardperiod}{true}%
       {\glsxtrifperiod{#2}{#3}}%
       {#3}%
     }%
     {%
       \glsxtrifperiod{#2}{#3}%
     }%
   }%
   {#3}%
 }%
}
\newcommand*{\glsxtrifperiod}[1]{\new@ifnextchar.{\@firstoftwo{#1}}}
\newcommand*{\glsxtr@punclist}{.,:;?!}
\newcommand*{\glsxtraddpunctuationmark}[1]{\appto\glsxtr@punclist{#1}}
\newcommand*{\glsxtrsetpunctuationmarks}[1]{\def\glsxtr@punclist{#1}}
\newcommand*{\glsxtrifnextpunc}[2]{%
  \def\reserved@a{#1}%
  \def\reserved@b{#2}%
  \futurelet\@glspunc@token\glsxtr@ifnextpunc
}
\newcommand*{\glsxtr@ifnextpunc}{%
 \glsxtr@ifpunctoken{\@glspunc@token}{\let\reserved@b\reserved@a}{}%
 \reserved@b
}
\newcommand*{\glsxtr@ifpunctoken}[1]{%
  \expandafter\@glsxtr@ifpunctoken\expandafter#1\glsxtr@punclist\@nnil
}
\def\@glsxtr@ifpunctoken#1#2{%
  \let\reserved@d=#2%
  \ifx\reserved@d\@nnil
    \let\glsxtr@next\@glsxtr@notfoundinlist
  \else
    \ifx#1\reserved@d
     \let\glsxtr@next\@glsxtr@foundinlist
    \else
     \let\glsxtr@next\@glsxtr@ifpunctoken
    \fi
  \fi
  \glsxtr@next#1%
}
\def\@glsxtr@foundinlist#1\@nnil{\@firstoftwo}
\def\@glsxtr@notfoundinlist#1{\@secondoftwo}
\newcommand{\glsxtrdopostpunc}[1]{%
  \glsxtrifnextpunc{\@glsxtr@swaptwo{#1}}{#1}%
}
\newcommand{\@glsxtr@swaptwo}[2]{#2#1}
\define@key{glsxtrabbrv}{category}{%
 \protected@edef\glscategorylabel{#1}%
}
\define@key{glsxtrabbrv}{shortplural}{%
  \def\@gls@shortpl{#1}%
}
\define@key{glsxtrabbrv}{longplural}{%
  \def\@gls@longpl{#1}%
}
\newtoks\glsshortpltok
\newtoks\glslongpltok
\newcommand*{\@glsxtr@insertdots}[2]{%
  \def#1{}%
  \@glsxtr@insert@dots#1#2\@nnil
}
\newcommand*{\@glsxtr@insert@dots}[2]{%
  \ifx\@nnil#2\relax
   \let\@glsxtr@insert@dots@next\@gobble
  \else
   \ifx\relax#2\relax
   \else
     \appto#1{#2.}%
   \fi
   \let\@glsxtr@insert@dots@next\@glsxtr@insert@dots
  \fi
  \@glsxtr@insert@dots@next#1%
}
\newcommand*{\glsxtrwordsep}{\space}
\newcommand*{\glsxtrword}[1]{#1}
\newcommand*{\@glsxtr@markwordseps}[2]{%
  \def#1{}%
  \@glsxtr@mark@wordseps#1#2 \@nnil
}
\def\@glsxtr@mark@wordseps#1#2 #3{%
  \ifdefempty{#1}%
  {\def#1{\protect\glsxtrword{#2}}}%
  {\appto#1{\protect\glsxtrwordsep\protect\glsxtrword{#2}}}%
  \ifx\@nnil#3\relax
   \let\@glsxtr@mark@wordseps@next\relax
  \else
   \def\@glsxtr@mark@wordseps@next{%
     \@glsxtr@mark@wordseps#1#3}%
  \fi
  \@glsxtr@mark@wordseps@next
}
\newcommand*{\newabbreviation}[4][]{%
  \glsxtr@newabbreviation{#1}{#2}{#3}{#4}%
}
\newcommand*{\glsxtr@newabbreviation}[4]{%
  \glskeylisttok{#1}%
  \glslabeltok{#2}%
  \glsshorttok{#3}%
  \glslongtok{#4}%
  \def\glsxtrorgshort{#3}%
  \def\glsxtrorglong{#4}%
  \def\ExtraCustomAbbreviationFields{}%
  \@gls@initaccesskeys
  \def\glscategorylabel{abbreviation}%
  \setkeys*{glsxtrabbrv}[shortplural,longplural]{#1}%
  \ifcsdef{@glsabbrv@current@\glscategorylabel}%
  {%
    \let\@glsxtr@orgwarndep\GlsXtrWarnDeprecatedAbbrStyle
    \let\GlsXtrWarnDeprecatedAbbrStyle\@gobbletwo
    \glsxtr@applyabbrvstyle{\csname @glsabbrv@current@\glscategorylabel\endcsname}%
    \let\GlsXtrWarnDeprecatedAbbrStyle\@glsxtr@orgwarndep
  }%
  {%
    \glsxtr@applyabbrvstyle{\@glsabbrv@current@abbreviation}%
  }%
  \def\@gls@longpl{#4\glspluralsuffix}%
  \let\@gls@default@longpl\@gls@longpl
  \glsifcategoryattribute{\glscategorylabel}{markwords}{true}%
  {%
    \@glsxtr@markwordseps\@gls@long{#4}%
    \expandafter\def\expandafter\@gls@longpl\expandafter
     {\@gls@long\glspluralsuffix}%
    \let\@gls@default@longpl\@gls@longpl
    \expandafter\glslongtok\expandafter{\@gls@long}%
  }%
  {}%
  \glsifcategoryattribute{\glscategorylabel}{markshortwords}{true}%
  {%
    \@glsxtr@markwordseps\@gls@short{#3}%
  }%
  {%
    \glsifcategoryattribute{\glscategorylabel}{insertdots}{true}%
    {%
      \@glsxtr@insertdots\@gls@short{#3}%
      \appto\@gls@short{\@}%
    }%
    {\def\@gls@short{#3}}%
  }%
  \glsifcategoryattribute{\glscategorylabel}{aposplural}{true}%
  {%
    \expandafter\def\expandafter\@gls@shortpl\expandafter{\@gls@short
      '\abbrvpluralsuffix}%
  }%
  {%
    \glsifcategoryattribute{\glscategorylabel}{noshortplural}{true}%
    {%
      \let\@gls@shortpl\@gls@short
    }%
      {%
      \expandafter\def\expandafter\@gls@shortpl\expandafter{\@gls@short
        \abbrvpluralsuffix}%
    }%
  }%
  \expandafter\glsshorttok\expandafter{\@gls@short}%
  \glsxtrnewabbrevpresetkeyhook{#1}{#2}{#3}%
  \setkeys*{glsxtrabbrv}[category]{#1}%
    \let\@gls@org@longpl\@gls@longpl
    \let\@gls@org@shortpl\@gls@shortpl
  \ifx\@gls@default@longpl\@gls@longpl
  \else
    \glsifcategoryattribute{\glscategorylabel}{markwords}{true}%
    {%
      \expandafter\@glsxtr@markwordseps\expandafter\@gls@longpl\expandafter
       {\@gls@longpl}%
    }%
    {}%
  \fi
  \expandafter\glsshortpltok\expandafter{\@gls@shortpl}%
  \expandafter\glslongpltok\expandafter{\@gls@longpl}%
  \@gls@setup@default@access
  \newabbreviationhook
  \protected@edef\@do@newglossaryentry{%
    \noexpand\newglossaryentry{\the\glslabeltok}%
    {%
      type=\glsxtrabbrvtype,%
      category=abbreviation,%
      short={\the\glsshorttok},%
      shortplural={\the\glsshortpltok},%
      long={\the\glslongtok},%
      longplural={\the\glslongpltok},%
      name={\the\glsshorttok},%
      \CustomAbbreviationFields,%
      \ExtraCustomAbbreviationFields
      \the\glskeylisttok
    }%
  }%
  \@do@newglossaryentry
  \@glsxtr@addabbreviationlist{\glsentrytype{\the\glslabeltok}}%
  \GlsXtrPostNewAbbreviation
}
\newcommand*{\glsxtrnewabbrevpresetkeyhook}[3]{}
\newcommand*{\GlsXtrPostNewAbbreviation}{}
\newcommand*{\newabbreviationhook}{}
\newcommand*{\CustomAbbreviationFields}{}
\newcommand*{\glsxtrparen}[1]{(#1)}
\newcommand*{\glsxtrfullformat}[2]{%
  \glsfirstlongfont{\glsaccesslong{#1}}#2\glsxtrfullsep{#1}%
  \glsxtrparen{\protect\glsfirstabbrvfont{\glsaccessshort{#1}}}%
}
\newcommand*{\Glsxtrfullformat}[2]{%
  \glsfirstlongfont{\Glsaccesslong{#1}}#2\glsxtrfullsep{#1}%
  \glsxtrparen{\protect\glsfirstabbrvfont{\glsaccessshort{#1}}}%
}
\newcommand*{\glsxtrfullplformat}[2]{%
  \glsfirstlongfont{\glsaccesslongpl{#1}}#2\glsxtrfullsep{#1}%
  \glsxtrparen{\protect\glsfirstabbrvfont{\glsaccessshortpl{#1}}}%
}
\newcommand*{\Glsxtrfullplformat}[2]{%
  \glsfirstlongfont{\Glsaccesslongpl{#1}}#2\glsxtrfullsep{#1}%
  \glsxtrparen{\protect\glsfirstabbrvfont{\glsaccessshortpl{#1}}}%
}
\newcommand*{\glsxtrfullsep}[1]{\space}
\newcommand*{\glsxtrinlinefullformat}{\glsxtrfullformat}
\newcommand*{\Glsxtrinlinefullformat}{\Glsxtrfullformat}
\newcommand*{\glsxtrinlinefullplformat}{\glsxtrfullplformat}
\newcommand*{\Glsxtrinlinefullplformat}{\Glsxtrfullplformat}
\renewcommand*{\glsentryfull}[1]{\glsxtrinlinefullformat{#1}{}}
\renewcommand*{\Glsentryfull}[1]{\Glsxtrinlinefullformat{#1}{}}
\renewcommand*{\glsentryfullpl}[1]{\glsxtrinlinefullplformat{#1}{}}
\renewcommand*{\Glsentryfullpl}[1]{\Glsxtrinlinefullplformat{#1}{}}
\newcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{#1}}
\newcommand*{\glsfirstabbrvdefaultfont}[1]{\glsabbrvdefaultfont{#1}}
\newcommand*{\glsabbrvfont}[1]{\glsabbrvdefaultfont{#1}}
\newcommand*{\glsabbrvdefaultfont}[1]{#1}
\newcommand*{\glslongfont}[1]{\glslongdefaultfont{#1}}
\newcommand*{\glslongdefaultfont}[1]{#1}
\newcommand*{\glsfirstlongfont}[1]{\glslongfont{#1}}
\newcommand*{\glsfirstlongdefaultfont}[1]{\glslongdefaultfont{#1}}
\newcommand*{\glsxtrabbrvpluralsuffix}{\glspluralsuffix}
\newcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}
\newrobustcmd*{\glsxtrfull}{\@gls@hyp@opt\ns@glsxtrfull}
\newcommand*\ns@glsxtrfull[2][]{%
  \new@ifnextchar[{\@glsxtr@full{#1}{#2}}%
                  {\@glsxtr@full{#1}{#2}[]}%
}
\def\@glsxtr@full#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{\glsxtrinlinefullformat{#2}{#3}}%
    \glsxtrsetupfulldefs
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newcommand*{\glsxtrsetupfulldefs}{%
  \let\glsxtrifwasfirstuse\@firstoftwo
}
\newrobustcmd*{\Glsxtrfull}{\@gls@hyp@opt\ns@Glsxtrfull}
\newcommand*\ns@Glsxtrfull[2][]{%
  \new@ifnextchar[{\@Glsxtr@full{#1}{#2}}%
                  {\@Glsxtr@full{#1}{#2}[]}%
}
\def\@Glsxtr@full#1#2[#3]{%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{\Glsxtrinlinefullformat{#2}{#3}}%
    \glsxtrsetupfulldefs
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\GLSxtrfull}{\@gls@hyp@opt\ns@GLSxtrfull}
\newcommand*\ns@GLSxtrfull[2][]{%
  \new@ifnextchar[{\@GLSxtr@full{#1}{#2}}%
                  {\@GLSxtr@full{#1}{#2}[]}%
}
\def\@GLSxtr@full#1#2[#3]{%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{\mfirstucMakeUppercase{\glsxtrinlinefullformat{#2}{#3}}}%
    \glsxtrsetupfulldefs
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\glsxtrfullpl}{\@gls@hyp@opt\ns@glsxtrfullpl}
\newcommand*\ns@glsxtrfullpl[2][]{%
  \new@ifnextchar[{\@glsxtr@fullpl{#1}{#2}}%
                  {\@glsxtr@fullpl{#1}{#2}[]}%
}
\def\@glsxtr@fullpl#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{\glsxtrinlinefullplformat{#2}{#3}}%
    \glsxtrsetupfulldefs
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\Glsxtrfullpl}{\@gls@hyp@opt\ns@Glsxtrfullpl}
\newcommand*\ns@Glsxtrfullpl[2][]{%
  \new@ifnextchar[{\@Glsxtr@fullpl{#1}{#2}}%
                  {\@Glsxtr@fullpl{#1}{#2}[]}%
}
\def\@Glsxtr@fullpl#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{\Glsxtrinlinefullplformat{#2}{#3}}%
    \glsxtrsetupfulldefs
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\GLSxtrfullpl}{\@gls@hyp@opt\ns@GLSxtrfullpl}
\newcommand*\ns@GLSxtrfullpl[2][]{%
  \new@ifnextchar[{\@GLSxtr@fullpl{#1}{#2}}%
                  {\@GLSxtr@fullpl{#1}{#2}[]}%
}
\def\@GLSxtr@fullpl#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \mfirstucMakeUppercase{\glsxtrinlinefullplformat{#2}{#3}}}%
    \glsxtrsetupfulldefs
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\glsxtrshort}{\@gls@hyp@opt\ns@glsxtrshort}
\newcommand*{\ns@glsxtrshort}[2][]{%
  \new@ifnextchar[{\@glsxtrshort{#1}{#2}}{\@glsxtrshort{#1}{#2}[]}%
}
\def\@glsxtrshort#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \glsabbrvfont{\glsaccessshort{#2}\ifglsxtrinsertinside#3\fi}%
      \ifglsxtrinsertinside\else#3\fi
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\Glsxtrshort}{\@gls@hyp@opt\ns@Glsxtrshort}
\newcommand*{\ns@Glsxtrshort}[2][]{%
  \new@ifnextchar[{\@Glsxtrshort{#1}{#2}}{\@Glsxtrshort{#1}{#2}[]}%
}
\def\@Glsxtrshort#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \glsabbrvfont{\Glsaccessshort{#2}\ifglsxtrinsertinside#3\fi}%
      \ifglsxtrinsertinside\else#3\fi
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\GLSxtrshort}{\@gls@hyp@opt\ns@GLSxtrshort}
\newcommand*{\ns@GLSxtrshort}[2][]{%
  \new@ifnextchar[{\@GLSxtrshort{#1}{#2}}{\@GLSxtrshort{#1}{#2}[]}%
}
\def\@GLSxtrshort#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \mfirstucMakeUppercase
      {\glsabbrvfont{\glsaccessshort{#2}\ifglsxtrinsertinside#3\fi}%
        \ifglsxtrinsertinside\else#3\fi
      }%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\glsxtrlong}{\@gls@hyp@opt\ns@glsxtrlong}
\newcommand*{\ns@glsxtrlong}[2][]{%
  \new@ifnextchar[{\@glsxtrlong{#1}{#2}}{\@glsxtrlong{#1}{#2}[]}%
}
\def\@glsxtrlong#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \glslongfont{\glsaccesslong{#2}\ifglsxtrinsertinside#3\fi}%
      \ifglsxtrinsertinside\else#3\fi
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\Glsxtrlong}{\@gls@hyp@opt\ns@Glsxtrlong}
\newcommand*{\ns@Glsxtrlong}[2][]{%
  \new@ifnextchar[{\@Glsxtrlong{#1}{#2}}{\@Glsxtrlong{#1}{#2}[]}%
}
\def\@Glsxtrlong#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \glslongfont{\Glsaccesslong{#2}\ifglsxtrinsertinside#3\fi}%
      \ifglsxtrinsertinside\else#3\fi
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\GLSxtrlong}{\@gls@hyp@opt\ns@GLSxtrlong}
\newcommand*{\ns@GLSxtrlong}[2][]{%
  \new@ifnextchar[{\@GLSxtrlong{#1}{#2}}{\@GLSxtrlong{#1}{#2}[]}%
}
\def\@GLSxtrlong#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@secondoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
     \mfirstucMakeUppercase
     {\glslongfont{\glsaccesslong{#2}\ifglsxtrinsertinside#3\fi}%
      \ifglsxtrinsertinside\else#3\fi
     }%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\glsxtrshortpl}{\@gls@hyp@opt\ns@glsxtrshortpl}
\newcommand*{\ns@glsxtrshortpl}[2][]{%
  \new@ifnextchar[{\@glsxtrshortpl{#1}{#2}}{\@glsxtrshortpl{#1}{#2}[]}%
}
\def\@glsxtrshortpl#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \glsabbrvfont{\glsaccessshortpl{#2}\ifglsxtrinsertinside#3\fi}%
      \ifglsxtrinsertinside\else#3\fi
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\Glsxtrshortpl}{\@gls@hyp@opt\ns@Glsxtrshortpl}
\newcommand*{\ns@Glsxtrshortpl}[2][]{%
  \new@ifnextchar[{\@Glsxtrshortpl{#1}{#2}}{\@Glsxtrshortpl{#1}{#2}[]}%
}
\def\@Glsxtrshortpl#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \glsabbrvfont{\Glsaccessshortpl{#2}\ifglsxtrinsertinside#3\fi}%
      \ifglsxtrinsertinside\else#3\fi
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\GLSxtrshortpl}{\@gls@hyp@opt\ns@GLSxtrshortpl}
\newcommand*{\ns@GLSxtrshortpl}[2][]{%
  \new@ifnextchar[{\@GLSxtrshortpl{#1}{#2}}{\@GLSxtrshortpl{#1}{#2}[]}%
}
\def\@GLSxtrshortpl#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \glssetabbrvfmt{\glscategory{#2}}%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \mfirstucMakeUppercase
      {\glsabbrvfont{\glsaccessshortpl{#2}\ifglsxtrinsertinside#3\fi}%
       \ifglsxtrinsertinside\else#3\fi
      }%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\glsxtrlongpl}{\@gls@hyp@opt\ns@glsxtrlongpl}
\newcommand*{\ns@glsxtrlongpl}[2][]{%
  \new@ifnextchar[{\@glsxtrlongpl{#1}{#2}}{\@glsxtrlongpl{#1}{#2}[]}%
}
\def\@glsxtrlongpl#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@firstofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \glslongfont{\glsaccesslongpl{#2}\ifglsxtrinsertinside#3\fi}%
      \ifglsxtrinsertinside\else#3\fi
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\Glsxtrlongpl}{\@gls@hyp@opt\ns@Glsxtrlongpl}
\newcommand*{\ns@Glsxtrlongpl}[2][]{%
  \new@ifnextchar[{\@Glsxtrlongpl{#1}{#2}}{\@Glsxtrlongpl{#1}{#2}[]}%
}
\def\@Glsxtrlongpl#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@secondofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \glslongfont{\Glsaccesslongpl{#2}\ifglsxtrinsertinside#3\fi}%
      \ifglsxtrinsertinside\else#3\fi
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newrobustcmd*{\GLSxtrlongpl}{\@gls@hyp@opt\ns@GLSxtrlongpl}
\newcommand*{\ns@GLSxtrlongpl}[2][]{%
  \new@ifnextchar[{\@GLSxtrlongpl{#1}{#2}}{\@GLSxtrlongpl{#1}{#2}[]}%
}
\def\@GLSxtrlongpl#1#2[#3]{%
  \@glsxtr@record{#1}{#2}{glslink}%
  \glsdoifexists{#2}%
  {%
    \let\do@gls@link@checkfirsthyper\@gls@link@nocheckfirsthyper
    \let\glsxtrifwasfirstuse\@secondoftwo
    \let\glsifplural\@firstoftwo
    \let\glscapscase\@thirdofthree
    \let\glsinsert\@empty
    \def\glscustomtext{%
      \mfirstucMakeUppercase
      {\glslongfont{\glsaccesslongpl{#2}\ifglsxtrinsertinside#3\fi}%
       \ifglsxtrinsertinside\else#3\fi
      }%
    }%
    \@gls@link[#1]{#2}{\csname gls@\glstype @entryfmt\endcsname}%
  }%
  \glspostlinkhook
}
\newcommand*{\glssetabbrvfmt}[1]{%
  \ifcsdef{@glsabbrv@current@#1}%
  {\glsxtr@applyabbrvfmt{\csname @glsabbrv@current@#1\endcsname}}%
  {\glsxtr@applyabbrvfmt{\@glsabbrv@current@abbreviation}}%
}
\newrobustcmd*{\glsuseabbrvfont}[2]{{\glssetabbrvfmt{#2}\glsabbrvfont{#1}}}
\newrobustcmd*{\glsuselongfont}[2]{{\glssetabbrvfmt{#2}\glslongfont{#1}}}
\newcommand*{\glsxtrgenabbrvfmt}{%
  \ifdefempty\glscustomtext
  {%
    \ifglsused\glslabel
    {%
      \glsifplural
      {%
        \glscapscase
        {%
          \glsxtrsubsequentplfmt{\glslabel}{\glsinsert}%
        }%
        {%
          \Glsxtrsubsequentplfmt{\glslabel}{\glsinsert}%
        }%
        {%
          \mfirstucMakeUppercase
            {\glsxtrsubsequentplfmt{\glslabel}{\glsinsert}}%
        }%
      }%
      {%
        \glscapscase
        {%
          \glsxtrsubsequentfmt{\glslabel}{\glsinsert}%
        }%
        {%
          \Glsxtrsubsequentfmt{\glslabel}{\glsinsert}%
        }%
        {%
          \mfirstucMakeUppercase
            {\glsxtrsubsequentfmt{\glslabel}{\glsinsert}}%
        }%
      }%
    }%
    {%
      \glsifplural
      {%
        \glscapscase
        {%
          \glsxtrfullplformat{\glslabel}{\glsinsert}%
        }%
        {%
          \Glsxtrfullplformat{\glslabel}{\glsinsert}%
        }%
        {%
          \mfirstucMakeUppercase
            {\glsxtrfullplformat{\glslabel}{\glsinsert}}%
        }%
      }%
      {%
        \glscapscase
        {%
          \glsxtrfullformat{\glslabel}{\glsinsert}%
        }%
        {%
          \Glsxtrfullformat{\glslabel}{\glsinsert}%
        }%
        {%
          \mfirstucMakeUppercase
           {\glsxtrfullformat{\glslabel}{\glsinsert}}%
        }%
      }%
    }%
  }%
  {%
    \glscustomtext
  }%
}
\newcommand*{\glsxtrsubsequentfmt}[2]{%
  \glsabbrvfont{\glsaccessshort{#1}\ifglsxtrinsertinside #2\fi}%
  \ifglsxtrinsertinside \else#2\fi
}
\let\glsxtrdefaultsubsequentfmt\glsxtrsubsequentfmt
\newcommand*{\glsxtrsubsequentplfmt}[2]{%
  \glsabbrvfont{\glsaccessshortpl{#1}\ifglsxtrinsertinside #2\fi}%
  \ifglsxtrinsertinside \else#2\fi
}
\let\glsxtrdefaultsubsequentplfmt\glsxtrsubsequentplfmt
\newcommand*{\Glsxtrsubsequentfmt}[2]{%
  \glsabbrvfont{\Glsaccessshort{#1}\ifglsxtrinsertinside #2\fi}%
  \ifglsxtrinsertinside \else#2\fi
}
\let\Glsxtrdefaultsubsequentfmt\Glsxtrsubsequentfmt
\newcommand*{\Glsxtrsubsequentplfmt}[2]{%
  \glsabbrvfont{\Glsaccessshortpl{#1}\ifglsxtrinsertinside #2\fi}%
  \ifglsxtrinsertinside \else#2\fi
}
\let\Glsxtrdefaultsubsequentplfmt\Glsxtrsubsequentplfmt
\newcommand*{\setabbreviationstyle}[2][abbreviation]{%
  \ifcsundef{@glsabbrv@dispstyle@setup@#2}
  {%
    \PackageError{glossaries-extra}{Undefined abbreviation style `#2'}{}%
  }%
  {%
     \ifcsstring{@glsabbrv@current@#1}{#2}%
     {%
     }%
     {%
       \def\@glsxtr@dostylewarn{}%
       \glsforeachincategory{#1}{\@gls@type}{\@gls@label}%
       {%
         \def\@glsxtr@dostylewarn{\GlossariesWarning{Abbreviation
           style has been switched \MessageBreak
           for category `#1', \MessageBreak
           but there have already been entries \MessageBreak
           defined for this category. Unwanted \MessageBreak
           side-effects may result}}%
         \@endfortrue
       }%
       \@glsxtr@dostylewarn
       \csdef{@glsabbrv@current@#1}{#2}%
       \protected@edef\glscategorylabel{#1}%
       \glsxtr@applyabbrvstyle{#2}%
     }%
  }%
}
\newcommand*{\glsxtr@applyabbrvstyle}[1]{%
  \csuse{@glsabbrv@dispstyle@setup@#1}%
  \csuse{@glsabbrv@dispstyle@fmts@#1}%
}
\newcommand*{\glsxtr@applyabbrvfmt}[1]{%
  \csuse{@glsabbrv@dispstyle@fmts@#1}%
}
\newcommand*{\newabbreviationstyle}[3]{%
  \ifcsdef{@glsabbrv@dispstyle@setup@#1}
  {%
    \PackageError{glossaries-extra}{Abbreviation style `#1' already
     defined}{}%
  }%
  {%
    \csdef{@glsabbrv@dispstyle@setup@#1}{%
     \renewcommand*{\GlsXtrPostNewAbbreviation}{}%
     #2}%
    \csdef{@glsabbrv@dispstyle@fmts@#1}{%
    \renewcommand*{\glsxtrinlinefullformat}{\glsxtrfullformat}%
    \renewcommand*{\Glsxtrinlinefullformat}{\Glsxtrfullformat}%
    \renewcommand*{\glsxtrinlinefullplformat}{\glsxtrfullplformat}%
    \renewcommand*{\Glsxtrinlinefullplformat}{\Glsxtrfullplformat}%
    \let\glsxtrsubsequentfmt\glsxtrdefaultsubsequentfmt
    \let\glsxtrsubsequentplfmt\glsxtrdefaultsubsequentplfmt
    \let\Glsxtrsubsequentfmt\Glsxtrdefaultsubsequentfmt
    \let\Glsxtrsubsequentplfmt\Glsxtrdefaultsubsequentplfmt
    #3}%
  }%
}
\newcommand*{\renewabbreviationstyle}[3]{%
  \ifcsundef{@glsabbrv@dispstyle@setup@#1}
  {%
    \PackageError{glossaries-extra}{Abbreviation style `#1' not defined}{}%
  }%
  {%
    \csdef{@glsabbrv@dispstyle@setup@#1}{%
     \renewcommand*{\GlsXtrPostNewAbbreviation}{}%
     #2}%
    \csdef{@glsabbrv@dispstyle@fmts@#1}{%
    \renewcommand*{\glsxtrinlinefullformat}{\glsxtrfullformat}%
    \renewcommand*{\Glsxtrinlinefullformat}{\Glsxtrfullformat}%
    \renewcommand*{\glsxtrinlinefullplformat}{\glsxtrfullplformat}%
    \renewcommand*{\Glsxtrinlinefullplformat}{\Glsxtrfullplformat}%
    #3}%
  }%
}
\newcommand*{\letabbreviationstyle}[2]{%
  \csletcs{@glsabbrv@dispstyle@setup@#1}{@glsabbrv@dispstyle@setup@#2}%
  \csletcs{@glsabbrv@dispstyle@fmts@#1}{@glsabbrv@dispstyle@fmts@#2}%
}
\newcommand*{\@glsxtr@deprecated@abbrstyle}[2]{%
  \csdef{@glsabbrv@dispstyle@setup@#1}{%
    \GlsXtrWarnDeprecatedAbbrStyle{#1}{#2}%
    \csuse{@glsabbrv@dispstyle@setup@#2}%
  }%
  \csletcs{@glsabbrv@dispstyle@fmts@#1}{@glsabbrv@dispstyle@fmts@#2}%
}
\newcommand*{\GlsXtrWarnDeprecatedAbbrStyle}[2]{%
  \GlossariesExtraWarning{Deprecated abbreviation style name `#1',
  use `#2' instead}%
}
\newcommand*{\GlsXtrUseAbbrStyleSetup}[1]{%
  \ifcsundef{@glsabbrv@dispstyle@setup@#1}%
  {%
     \PackageError{glossaries-extra}%
     {Unknown abbreviation style definitions `#1'}{}%
  }%
  {%
     \csname @glsabbrv@dispstyle@setup@#1\endcsname
  }%
}
\newcommand*{\GlsXtrUseAbbrStyleFmts}[1]{%
  \ifcsundef{@glsabbrv@dispstyle@fmts@#1}%
  {%
     \PackageError{glossaries-extra}%
     {Unknown abbreviation style formats `#1'}{}%
  }%
  {%
     \csname @glsabbrv@dispstyle@fmts@#1\endcsname
  }%
}
\newif\ifglsxtrinsertinside
\glsxtrinsertinsidefalse
\newcommand*{\glsxtrlongshortname}{%
  \protect\glsabbrvfont{\the\glsshorttok}%
}
\newabbreviationstyle{long-short}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlongfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlongfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvfont{\the\glsshortpltok}}},%
    plural={\protect\glsabbrvfont{\the\glsshortpltok}},%
    text={\protect\glsabbrvfont{\the\glsshorttok}},%
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvfont{\glsaccessshortpl{##1}}}%
  }%
}
\setabbreviationstyle{long-short}
\newcommand*{\glsxtrlongshortdescsort}{%
 \expandonce\glsxtrorglong\space (\expandonce\glsxtrorgshort)%
}
\newcommand*{\glsxtrlongshortdescname}{%
  \protect\glslongfont{\the\glslongtok}
  \glsxtrparen{\protect\glsabbrvfont{\the\glsshorttok}}%
}
\newabbreviationstyle{long-short-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},%
    first={\protect\glsfirstlongfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlongfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvfont{\the\glsshortpltok}}},%
    text={\protect\glsabbrvfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-short}%
}
\newcommand*{\glsxtrshortlongname}{%
  \protect\glsabbrvfont{\the\glsshorttok}%
}
\newabbreviationstyle{short-long}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\protect\glsfirstabbrvfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfont{\glsaccesslongpl{##1}}}%
  }%
}
\newcommand*{\glsxtrshortlongdescsort}{\the\glsshorttok}
\newcommand*{\glsxtrshortlongdescname}{%
  \protect\glsabbrvfont{\the\glsshorttok}
  \glsxtrparen{\protect\glslongfont{\the\glslongtok}}%
}
\newabbreviationstyle{short-long-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},
    sort={\glsxtrshortlongdescsort},
    first={\protect\glsfirstabbrvfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-long}%
}
\newcommand*{\glsfirstlongfootnotefont}[1]{\glslongfootnotefont{#1}}%
\newcommand*{\glslongfootnotefont}[1]{\glslongdefaultfont{#1}}%
\newcommand*{\glsxtrabbrvfootnote}[2]{\footnote{#2}}
\newcommand*{\glsxtrfootnotename}{%
  \protect\glsabbrvfont{\the\glsshorttok}%
}
\newabbreviationstyle{footnote}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\protect\glsfirstabbrvfont{\the\glsshorttok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvfont{\the\glsshortpltok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\protect\glsabbrvfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
}
\letabbreviationstyle{short-footnote}{footnote}
\newcommand*{\glsxtrfootnotedescname}{%
  \protect\glsabbrvfont{\the\glsshorttok}%
  \protect\glsxtrfullsep{\the\glslabeltok}%
  \protect\glsxtrparen{\protect\glslongfont{\the\glslongtok}}%
}
\newcommand*{\glsxtrfootnotedescsort}{\the\glsshorttok}
\newabbreviationstyle{short-footnote-desc}%
{%
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\protect\glsfirstabbrvfont{\the\glsshorttok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvfont{\the\glsshortpltok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\protect\glsabbrvfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{footnote}%
}
\letabbreviationstyle{footnote-desc}{short-footnote-desc}
\newabbreviationstyle{postfootnote}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\protect\glsfirstabbrvfont{\the\glsshorttok}},%
    firstplural={\protect\glsfirstabbrvfont{\the\glsshortpltok}},%
    text={\protect\glsabbrvfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrdopostpunc{\protect\glsxtrabbrvfootnote{\glslabel}%
        {\glsfirstlongfootnotefont{\glsentrylong{\glslabel}}}}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
  \renewcommand*{\glsxtrsetupfulldefs}{%
    \let\glsxtrifwasfirstuse\@secondoftwo
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
}
\letabbreviationstyle{short-postfootnote}{postfootnote}
\newabbreviationstyle{short-postfootnote-desc}%
{%
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\protect\glsfirstabbrvfont{\the\glsshorttok}},%
    firstplural={\protect\glsfirstabbrvfont{\the\glsshortpltok}},%
    text={\protect\glsabbrvfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrdopostpunc{\protect\glsxtrabbrvfootnote{\glslabel}%
        {\glsfirstlongfootnotefont{\glsentrylong{\glslabel}}}}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
  \renewcommand*{\glsxtrsetupfulldefs}{%
    \let\glsxtrifwasfirstuse\@secondoftwo
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{postfootnote}%
}
\letabbreviationstyle{postfootnote-desc}{short-postfootnote-desc}
\newcommand*{\glsxtrshortnolongname}{%
  \protect\glsabbrvfont{\the\glsshorttok}%
}
\newabbreviationstyle{short}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortnolongname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstabbrvfont{\the\glsshorttok}},
    firstplural={\protect\glsfirstabbrvfont{\the\glsshortpltok}},
    text={\protect\glsabbrvfont{\the\glsshorttok}},
    plural={\protect\glsabbrvfont{\the\glsshortpltok}},
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \protect\glsfirstabbrvfont{\glsaccessshort{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstabbrvfont{\glsaccessshortpl{##1}%
     \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \protect\glsfirstabbrvfont{\glsaccessshort{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfont{\Glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstabbrvfont{\glsaccessshortpl{##1}%
       \ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfont{\Glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
}
\setabbreviationstyle[acronym]{short}
\letabbreviationstyle{short-nolong}{short}
\newabbreviationstyle{short-nolong-noreg}%
{%
  \GlsXtrUseAbbrStyleSetup{short-nolong}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-nolong}%
}
\newcommand*{\glsxtrshortdescname}{%
  \protect\glsabbrvfont{\the\glsshorttok}%
  \protect\glsxtrfullsep{\the\glslabeltok}%
  \protect\glsxtrparen{\protect\glslongfont{\the\glslongtok}}%
}
\newabbreviationstyle{short-desc}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortdescname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstabbrvfont{\the\glsshorttok}},
    firstplural={\protect\glsfirstabbrvfont{\the\glsshortpltok}},
    text={\protect\glsabbrvfont{\the\glsshorttok}},
    plural={\protect\glsabbrvfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
}
\letabbreviationstyle{short-nolong-desc}{short-desc}
\newabbreviationstyle{short-nolong-desc-noreg}%
{%
  \GlsXtrUseAbbrStyleSetup{short-nolong-desc}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-nolong-desc}%
}
\newabbreviationstyle{nolong-short}%
{%
  \GlsXtrUseAbbrStyleSetup{short-nolong}%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-nolong}%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \protect\glsfirstlongfont{\glsaccesslong{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstlongfont{\glsaccesslongpl{##1}%
     \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \protect\glsfirstlongfont{\glsaccesslong{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvfont{\Glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstlongfont{\glsaccesslongpl{##1}%
       \ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvfont{\Glsaccessshortpl{##1}}}%
  }%
}
\newabbreviationstyle{nolong-short-noreg}%
{%
  \GlsXtrUseAbbrStyleSetup{nolong-short}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{nolong-short}%
}
\newcommand*{\glsxtrlongnoshortdescname}{%
  \protect\glslongfont{\the\glslongtok}%
}
\newabbreviationstyle{long-desc}%
{%
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortdescname},
    sort={\the\glslongtok},
    first={\protect\glsfirstlongfont{\the\glslongtok}},
    firstplural={\protect\glsfirstlongfont{\the\glslongpltok}},
    text={\glslongfont{\the\glslongtok}},
    plural={\glslongfont{\the\glslongpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glslongfont{\glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glslongfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glslongfont{\Glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glslongfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlongfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlongfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlongfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlongfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
}
\letabbreviationstyle{long-noshort-desc}{long-desc}
\newabbreviationstyle{long-noshort-desc-noreg}%
{%
  \GlsXtrUseAbbrStyleSetup{long-noshort-desc}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-noshort-desc}%
}
\newcommand*{\glsxtrlongnoshortname}{%
  \protect\glsabbrvfont{\the\glsshorttok}%
}
\newabbreviationstyle{long}%
{%
  \glsxtrAccSuppAbbrSetNameShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlongfont{\the\glslongtok}},
    firstplural={\protect\glsfirstlongfont{\the\glslongpltok}},
    text={\glslongfont{\the\glslongtok}},
    plural={\glslongfont{\the\glslongpltok}},%
    description={\the\glslongtok}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-desc}%
}
\letabbreviationstyle{long-noshort}{long}
\newabbreviationstyle{long-noshort-noreg}%
{%
  \GlsXtrUseAbbrStyleSetup{long-noshort}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-noshort}%
}
\newcommand*{\glsxtrscfont}[1]{\textsc{#1}}
\newcommand*{\glsabbrvscfont}{\glsxtrscfont}
\newcommand*{\glsxtrfirstscfont}[1]{\glsabbrvscfont{#1}}
\newcommand*{\glsfirstabbrvscfont}{\glsxtrfirstscfont}
\newcommand*{\glsxtrscsuffix}{\protect\glstextup{\glsxtrabbrvpluralsuffix}}
\newabbreviationstyle{long-short-sc}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlongdefaultfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvscfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlongdefaultfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvscfont{\the\glsshortpltok}}},%
    text={\protect\glsabbrvscfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvscfont{\the\glsshortpltok}},%
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvscfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvscfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvscfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvscfont{\glsaccessshortpl{##1}}}%
  }%
}
\newabbreviationstyle{long-short-sc-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},%
    first={\protect\glsfirstlongdefaultfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvscfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlongdefaultfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvscfont{\the\glsshortpltok}}},%
    text={\protect\glsabbrvscfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvscfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-short-sc}%
}
\newabbreviationstyle{short-sc-long}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\protect\glsfirstabbrvscfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongdefaultfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvscfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongdefaultfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvscfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvscfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvscfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvscfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
}
\newabbreviationstyle{short-sc-long-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},
    sort={\glsxtrshortlongdescsort},
    first={\protect\glsfirstabbrvscfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongdefaultfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvscfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongdefaultfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvscfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvscfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sc-long}%
}
\newabbreviationstyle{short-sc}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortnolongname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstabbrvscfont{\the\glsshorttok}},
    firstplural={\protect\glsfirstabbrvscfont{\the\glsshortpltok}},
    text={\protect\glsabbrvscfont{\the\glsshorttok}},
    plural={\protect\glsabbrvscfont{\the\glsshortpltok}},
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \protect\glsfirstabbrvscfont{\glsaccessshort{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstabbrvscfont{\glsaccessshortpl{##1}%
     \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \protect\glsfirstabbrvscfont{\Glsaccessshort{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstabbrvscfont{\Glsaccessshortpl{##1}%
       \ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
}
\letabbreviationstyle{short-sc-nolong}{short-sc}
\newabbreviationstyle{short-sc-desc}%
{%
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortdescname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstabbrvscfont{\the\glsshorttok}},
    firstplural={\protect\glsfirstabbrvscfont{\the\glsshortpltok}},
    text={\protect\glsabbrvscfont{\the\glsshorttok}},
    plural={\protect\glsabbrvscfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvscfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvscfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
}
\letabbreviationstyle{short-sc-nolong-desc}{short-sc-desc}
\newabbreviationstyle{nolong-short-sc}%
{%
  \GlsXtrUseAbbrStyleSetup{short-sc-nolong}%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sc-nolong}%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \protect\glsfirstlongdefaultfont{\glsaccesslong{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvscfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstlongdefaultfont{\glsaccesslongpl{##1}%
     \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvscfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \protect\glsfirstlongdefaultfont{\Glsaccesslong{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvscfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstlongdefaultfont{\Glsaccesslongpl{##1}%
       \ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvscfont{\glsaccessshortpl{##1}}}%
  }%
}
\newabbreviationstyle{long-noshort-sc}%
{%
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlongdefaultfont{\the\glslongtok}},
    firstplural={\protect\glsfirstlongdefaultfont{\the\glslongpltok}},
    text={\protect\glslongdefaultfont{\the\glslongtok}},
    plural={\protect\glslongdefaultfont{\the\glslongpltok}},%
    description={\the\glslongtok}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glslongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glslongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glslongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glslongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvscfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvscfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvscfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvscfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
}
\@glsxtr@deprecated@abbrstyle{long-sc}{long-noshort-sc}
\newabbreviationstyle{long-noshort-sc-desc}%
{%
  \GlsXtrUseAbbrStyleSetup{long-noshort-desc}%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glslongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glslongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glslongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glslongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvscfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvscfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvscfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvscfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
}
\@glsxtr@deprecated@abbrstyle{long-desc-sc}{long-noshort-sc-desc}
\newabbreviationstyle{short-sc-footnote}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\protect\glsfirstabbrvscfont{\the\glsshorttok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvscfont{\the\glsshortpltok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\protect\glsabbrvscfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvscfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvscfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvscfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvscfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvscfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
}
\@glsxtr@deprecated@abbrstyle{footnote-sc}{short-sc-footnote}
\newabbreviationstyle{short-sc-footnote-desc}%
{%
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\protect\glsfirstabbrvscfont{\the\glsshorttok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvscfont{\the\glsshortpltok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\protect\glsabbrvscfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvscfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sc-footnote}%
}
\newabbreviationstyle{short-sc-postfootnote}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\protect\glsfirstabbrvscfont{\the\glsshorttok}},%
    firstplural={\protect\glsfirstabbrvscfont{\the\glsshortpltok}},%
    text={\protect\glsabbrvscfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvscfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrdopostpunc{\protect\glsxtrabbrvfootnote{\glslabel}%
        {\glsfirstlongfootnotefont{\glsentrylong{\glslabel}}}}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
  \renewcommand*{\glsxtrsetupfulldefs}{%
    \let\glsxtrifwasfirstuse\@secondoftwo
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvscfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvscfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvscfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvscfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvscfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvscfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvscfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
}
\@glsxtr@deprecated@abbrstyle{postfootnote-sc}{short-sc-postfootnote}
\newabbreviationstyle{short-sc-postfootnote-desc}%
{%
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\protect\glsfirstabbrvscfont{\the\glsshorttok}},%
    firstplural={\protect\glsfirstabbrvscfont{\the\glsshortpltok}},%
    text={\protect\glsabbrvscfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvscfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrdopostpunc{\protect\glsxtrabbrvfootnote{\glslabel}%
        {\glsfirstlongfootnotefont{\glsentrylong{\glslabel}}}}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
  \renewcommand*{\glsxtrsetupfulldefs}{%
    \let\glsxtrifwasfirstuse\@secondoftwo
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sc-postfootnote}%
}
\newcommand*{\glsxtrsmfont}[1]{\textsmaller{#1}}
\newcommand*{\glsabbrvsmfont}{\glsxtrsmfont}
\newcommand*{\glsxtrfirstsmfont}[1]{\glsabbrvsmfont{#1}}
\newcommand*{\glsfirstabbrvsmfont}{\glsxtrfirstsmfont}
\newcommand*{\glsxtrsmsuffix}{\glsxtrabbrvpluralsuffix}
\newabbreviationstyle{long-short-sm}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlongdefaultfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvsmfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlongdefaultfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvsmfont{\the\glsshortpltok}}},%
    text={\protect\glsabbrvsmfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvsmfont{\the\glsshortpltok}},%
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvsmfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvsmfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvsmfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvsmfont{\glsaccessshortpl{##1}}}%
  }%
}
\newabbreviationstyle{long-short-sm-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},%
    first={\protect\glsfirstlongdefaultfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvsmfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlongdefaultfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvsmfont{\the\glsshortpltok}}},%
    text={\protect\glsabbrvsmfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvsmfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-short-sm}%
}
\newabbreviationstyle{short-sm-long}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\protect\glsfirstabbrvsmfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongdefaultfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvsmfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongdefaultfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvsmfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvsmfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvsmfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvsmfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
}
\newabbreviationstyle{short-sm-long-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},
    sort={\glsxtrshortlongdescsort},
    first={\protect\glsfirstabbrvsmfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongdefaultfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvsmfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongdefaultfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvsmfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvsmfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sm-long}%
}
\newabbreviationstyle{short-sm}%
{%
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortnolongname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstabbrvsmfont{\the\glsshorttok}},
    firstplural={\protect\glsfirstabbrvsmfont{\the\glsshortpltok}},
    text={\protect\glsabbrvsmfont{\the\glsshorttok}},
    plural={\protect\glsabbrvsmfont{\the\glsshortpltok}},
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \protect\glsfirstabbrvsmfont{\glsaccessshort{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstabbrvsmfont{\glsaccessshortpl{##1}%
     \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \protect\glsfirstabbrvsmfont{\Glsaccessshort{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstabbrvsmfont{\Glsaccessshortpl{##1}%
       \ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
}
\letabbreviationstyle{short-sm-nolong}{short-sm}
\newabbreviationstyle{short-sm-desc}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortdescname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstabbrvsmfont{\the\glsshorttok}},
    firstplural={\protect\glsfirstabbrvsmfont{\the\glsshortpltok}},
    text={\protect\glsabbrvsmfont{\the\glsshorttok}},
    plural={\protect\glsabbrvsmfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvsmfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvsmfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
}
\letabbreviationstyle{short-sm-nolong-desc}{short-sm-desc}
\newabbreviationstyle{nolong-short-sm}%
{%
  \GlsXtrUseAbbrStyleSetup{short-sm-nolong}%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sm-nolong}%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \protect\glsfirstlongdefaultfont{\glsaccesslong{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvsmfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstlongdefaultfont{\glsaccesslongpl{##1}%
     \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvsmfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \protect\glsfirstlongdefaultfont{\Glsaccesslong{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvsmfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstlongdefaultfont{\Glsaccesslongpl{##1}%
       \ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvsmfont{\glsaccessshortpl{##1}}}%
  }%
}
\newabbreviationstyle{long-noshort-sm}%
{%
  \glsxtrAccSuppAbbrSetNameShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlongdefaultfont{\the\glslongtok}},
    firstplural={\protect\glsfirstlongdefaultfont{\the\glslongpltok}},
    text={\protect\glslongdefaultfont{\the\glslongtok}},
    plural={\protect\glslongdefaultfont{\the\glslongpltok}},%
    description={\the\glslongtok}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glslongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glslongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glslongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glslongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvsmfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvsmfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvsmfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvsmfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
}
\@glsxtr@deprecated@abbrstyle{long-sm}{long-noshort-sm}
\newabbreviationstyle{long-noshort-sm-desc}%
{%
  \GlsXtrUseAbbrStyleSetup{long-noshort-desc}%
}%
{%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glslongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glslongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glslongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glslongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvsmfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvsmfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvsmfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvsmfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
}
\@glsxtr@deprecated@abbrstyle{long-desc-sm}{long-noshort-sm-desc}
\newabbreviationstyle{short-sm-footnote}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\protect\glsfirstabbrvsmfont{\the\glsshorttok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvsmfont{\the\glsshortpltok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\protect\glsabbrvsmfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvsmfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvsmfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvsmfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvsmfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvsmfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
}
\@glsxtr@deprecated@abbrstyle{footnote-sm}{short-sm-footnote}
\newabbreviationstyle{short-sm-footnote-desc}%
{%
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\protect\glsfirstabbrvsmfont{\the\glsshorttok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvsmfont{\the\glsshortpltok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\protect\glsabbrvsmfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvsmfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sm-footnote}%
}
\newabbreviationstyle{short-sm-postfootnote}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\protect\glsfirstabbrvsmfont{\the\glsshorttok}},%
    firstplural={\protect\glsfirstabbrvsmfont{\the\glsshortpltok}},%
    text={\protect\glsabbrvsmfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvsmfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrdopostpunc{\protect\glsxtrabbrvfootnote{\glslabel}%
        {\glsfirstlongfootnotefont{\glsentrylong{\glslabel}}}}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
  \renewcommand*{\glsxtrsetupfulldefs}{%
    \let\glsxtrifwasfirstuse\@secondoftwo
  }%
}%
{%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvsmfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvsmfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsmsuffix}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvsmfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvsmfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvsmfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvsmfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvsmfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
}
\@glsxtr@deprecated@abbrstyle{postfootnote-sm}{short-sm-postfootnote}
\newabbreviationstyle{short-sm-postfootnote-desc}%
{%
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\protect\glsfirstabbrvsmfont{\the\glsshorttok}},%
    firstplural={\protect\glsfirstabbrvsmfont{\the\glsshortpltok}},%
    text={\protect\glsabbrvsmfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvsmfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrdopostpunc{\protect\glsxtrabbrvfootnote{\glslabel}%
        {\glsfirstlongfootnotefont{\glsentrylong{\glslabel}}}}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
  \renewcommand*{\glsxtrsetupfulldefs}{%
    \let\glsxtrifwasfirstuse\@secondoftwo
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-sm-postfootnote}%
}
\newcommand*{\glsabbrvemfont}[1]{\emph{#1}}%
\newcommand*{\glsfirstabbrvemfont}[1]{\glsabbrvemfont{#1}}%
\newcommand*{\glsxtremsuffix}{\glsxtrabbrvpluralsuffix}
\newcommand*{\glsfirstlongemfont}[1]{\glslongemfont{#1}}%
\newcommand*{\glslongemfont}[1]{\emph{#1}}%
\newabbreviationstyle{long-short-em}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlongdefaultfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvemfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlongdefaultfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvemfont{\the\glsshortpltok}}},%
    text={\protect\glsabbrvemfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}},%
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
}
\newabbreviationstyle{long-short-em-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},%
    first={\protect\glsfirstlongdefaultfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvemfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlongdefaultfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvemfont{\the\glsshortpltok}}},%
    text={\protect\glsabbrvemfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-short-em}%
}
\newabbreviationstyle{long-em-short-em}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlongemfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvemfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlongemfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvemfont{\the\glsshortpltok}}},%
    text={\protect\glsabbrvemfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}},%
    description={\protect\glslongemfont{\the\glslongtok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongemfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongemfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongemfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongemfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongemfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongemfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
}
\newabbreviationstyle{long-em-short-em-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},%
    first={\protect\glsfirstlongemfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvemfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlongemfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvemfont{\the\glsshortpltok}}},%
    text={\protect\glsabbrvemfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-em-short-em}%
}
\newabbreviationstyle{short-em-long}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\protect\glsfirstabbrvemfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongdefaultfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvemfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongdefaultfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvemfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*\glsfirstabbrvfont[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
}
\newabbreviationstyle{short-em-long-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},
    sort={\glsxtrshortlongdescsort},
    first={\protect\glsfirstabbrvemfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongdefaultfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvemfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongdefaultfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvemfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-em-long}%
}
\newabbreviationstyle{short-em-long-em}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    description={\protect\glslongemfont{\the\glslongtok}},%
    first={\protect\glsfirstabbrvemfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongemfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvemfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongemfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvemfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongemfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongemfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongemfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongemfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongemfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongemfont{\glsaccesslongpl{##1}}}%
  }%
}
\newabbreviationstyle{short-em-long-em-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},%
    sort={\glsxtrshortlongdescsort},%
    first={\protect\glsfirstabbrvemfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongemfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvemfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlongemfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvemfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-em-long-em}%
}
\newabbreviationstyle{short-em}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortnolongname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstabbrvemfont{\the\glsshorttok}},
    firstplural={\protect\glsfirstabbrvemfont{\the\glsshortpltok}},
    text={\protect\glsabbrvemfont{\the\glsshorttok}},
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}},
    description={\the\glslongtok}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \protect\glsfirstabbrvemfont{\glsaccessshort{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstabbrvemfont{\glsaccessshortpl{##1}%
     \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \protect\glsfirstabbrvemfont{\Glsaccessshort{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstabbrvemfont{\Glsaccessshortpl{##1}%
       \ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
}
\letabbreviationstyle{short-em-nolong}{short-em}
\newabbreviationstyle{short-em-desc}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortdescname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstabbrvemfont{\the\glsshorttok}},
    firstplural={\protect\glsfirstabbrvemfont{\the\glsshortpltok}},
    text={\protect\glsabbrvemfont{\the\glsshorttok}},
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongdefaultfont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi
  }%
}
\letabbreviationstyle{short-em-nolong-desc}{short-em-desc}
\newabbreviationstyle{nolong-short-em}%
{%
  \GlsXtrUseAbbrStyleSetup{short-em-nolong}%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-em-nolong}%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \protect\glsfirstlongdefaultfont{\glsaccesslong{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstlongdefaultfont{\glsaccesslongpl{##1}%
     \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \protect\glsfirstlongdefaultfont{\Glsaccesslong{##1}%
      \ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \protect\glsfirstlongdefaultfont{\Glsaccesslongpl{##1}%
       \ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
}
\newabbreviationstyle{long-noshort-em}%
{%
  \glsxtrAccSuppAbbrSetNameShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlongdefaultfont{\the\glslongtok}},
    firstplural={\protect\glsfirstlongdefaultfont{\the\glslongpltok}},
    text={\protect\glslongdefaultfont{\the\glslongtok}},
    plural={\protect\glslongdefaultfont{\the\glslongpltok}},%
    description={\the\glslongtok}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glslongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glslongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glslongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glslongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
}
\@glsxtr@deprecated@abbrstyle{long-em}{long-noshort-em}
\newabbreviationstyle{long-em-noshort-em}%
{%
  \glsxtrAccSuppAbbrSetNameShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlongemfont{\the\glslongtok}},
    firstplural={\protect\glsfirstlongemfont{\the\glslongpltok}},
    text={\protect\glslongemfont{\the\glslongtok}},
    plural={\protect\glslongemfont{\the\glslongpltok}},%
    description={\protect\glslongemfont{\the\glslongtok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongemfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongemfont{##1}}%
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glslongemfont{\glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glslongemfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glslongemfont{\Glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glslongemfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlongemfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlongemfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlongemfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlongemfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongemfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongemfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongemfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongemfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
}
\newabbreviationstyle{long-em-noshort-em-noreg}%
{%
  \glsxtrAccSuppAbbrSetNameShortAttrs\glscategorylabel
  \GlsXtrUseAbbrStyleSetup{long-em-noshort-em}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-em-noshort-em}%
}
\newabbreviationstyle{long-noshort-em-desc}%
{%
  \GlsXtrUseAbbrStyleSetup{long-noshort-desc}%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongdefaultfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongdefaultfont{##1}}%
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glslongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glslongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glslongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glslongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlongdefaultfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongdefaultfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
}
\@glsxtr@deprecated@abbrstyle{long-desc-em}{long-noshort-em-desc}
\newabbreviationstyle{long-em-noshort-em-desc}%
{%
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortdescname},
    sort={\the\glslongtok},
    first={\protect\glsfirstlongemfont{\the\glslongtok}},
    firstplural={\protect\glsfirstlongemfont{\the\glslongpltok}},
    text={\glslongemfont{\the\glslongtok}},
    plural={\glslongemfont{\the\glslongpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{regular}{true}}%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongemfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongemfont{##1}}%
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glslongemfont{\glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glslongemfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glslongemfont{\Glsaccesslong{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glslongemfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside ##2\fi}%
    \ifglsxtrinsertinside \else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlongemfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlongemfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlongemfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlongemfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvemfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongemfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongemfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongemfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongemfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
}
\newabbreviationstyle{long-em-noshort-em-desc-noreg}%
{%
  \GlsXtrUseAbbrStyleSetup{long-em-noshort-em-desc}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-em-noshort-em-desc}%
}
\newabbreviationstyle{short-em-footnote}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\protect\glsfirstabbrvemfont{\the\glsshorttok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvemfont{\the\glsshortpltok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\protect\glsabbrvemfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \protect\glsxtrabbrvfootnote{##1}%
      {\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
}
\@glsxtr@deprecated@abbrstyle{footnote-em}{short-em-footnote}
\newabbreviationstyle{short-em-footnote-desc}%
{%
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\protect\glsfirstabbrvemfont{\the\glsshorttok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvemfont{\the\glsshortpltok}%
     \protect\glsxtrabbrvfootnote{\the\glslabeltok}%
       {\protect\glsfirstlongfootnotefont{\the\glslongpltok}}},%
    text={\protect\glsabbrvemfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glssetattribute{\the\glslabeltok}{nohyperfirst}{true}%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-em-footnote}%
}
\newabbreviationstyle{short-em-postfootnote}%
{%
  \glsxtrAccSuppAbbrSetNoLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotename},
    sort={\the\glsshorttok},
    description={\the\glslongtok},%
    first={\protect\glsfirstabbrvemfont{\the\glsshorttok}},%
    firstplural={\protect\glsfirstabbrvemfont{\the\glsshortpltok}},%
    text={\protect\glsabbrvemfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrdopostpunc{\protect\glsxtrabbrvfootnote{\glslabel}%
        {\glsfirstlongfootnotefont{\glsentrylong{\glslabel}}}}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
  \renewcommand*{\glsxtrsetupfulldefs}{%
    \let\glsxtrifwasfirstuse\@secondoftwo
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtremsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvemfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvemfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongfootnotefont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongfootnotefont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvemfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslong{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvemfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
     \ifglsxtrinsertinside\else##2\fi\glsxtrfullsep{##1}%
    \glsxtrparen{\glsfirstlongfootnotefont{\glsaccesslongpl{##1}}}%
  }%
}
\@glsxtr@deprecated@abbrstyle{postfootnote-em}{short-em-postfootnote}
\newabbreviationstyle{short-em-postfootnote-desc}%
{%
  \glsxtrAccSuppAbbrSetNameLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrfootnotedescname},
    sort={\glsxtrfootnotedescsort},
    first={\protect\glsfirstabbrvemfont{\the\glsshorttok}},%
    firstplural={\protect\glsfirstabbrvemfont{\the\glsshortpltok}},%
    text={\protect\glsabbrvemfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvemfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrdopostpunc{\protect\glsxtrabbrvfootnote{\glslabel}%
        {\glsfirstlongfootnotefont{\glsentrylong{\glslabel}}}}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
  \renewcommand*{\glsxtrsetupfulldefs}{%
    \let\glsxtrifwasfirstuse\@secondoftwo
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-em-postfootnote}%
}
\newcommand*{\glsxtruserfield}{useri}
\ifdef\glscurrentfieldvalue
{
  \newcommand*{\glsxtruserparen}[2]{%
    \glsxtrfullsep{#2}%
    \glsxtrparen
     {#1\ifglshasfield{\glsxtruserfield}{#2}{, \glscurrentfieldvalue}{}}%
  }
}
{
  \newcommand*{\glsxtruserparen}[2]{%
    \glsxtrfullsep{#2}%
    \glsxtrparen
      {#1\ifglshasfield{\glsxtruserfield}{#2}{, \@glo@thisvalue}{}}%
  }
}
\newcommand*{\glsabbrvuserfont}[1]{\glsabbrvdefaultfont{#1}}
\newcommand*{\glsfirstabbrvuserfont}[1]{\glsabbrvuserfont{#1}}
\newcommand*{\glslonguserfont}[1]{\glslongdefaultfont{#1}}
\newcommand*{\glsfirstlonguserfont}[1]{\glslonguserfont{#1}}
\newcommand*{\glsxtrusersuffix}{\glsxtrabbrvpluralsuffix}
\newcommand*{\glsuserdescription}[2]{\glslonguserfont{#1}}
\newabbreviationstyle{long-short-user}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}%
     \protect\glsxtruserparen{\protect\glsfirstabbrvuserfont{\the\glsshorttok}}%
      {\the\glslabeltok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}%
     \protect\glsxtruserparen
      {\protect\glsfirstabbrvuserfont{\the\glsshortpltok}}{\the\glslabeltok}},%
    text={\protect\glsabbrvuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvuserfont{\the\glsshortpltok}},%
    description={\protect\glsuserdescription{\the\glslongtok}%
     {\the\glslabeltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrusersuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonguserfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonguserfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlonguserfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstabbrvuserfont{\glsaccessshort{##1}}}{##1}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlonguserfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstabbrvuserfont{\glsaccessshortpl{##1}}}{##1}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlonguserfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstabbrvuserfont{\glsaccessshort{##1}}}{##1}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlonguserfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstabbrvuserfont{\glsaccessshortpl{##1}}}{##1}%
  }%
}
\newabbreviationstyle{long-postshort-user}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}},%
    text={\protect\glsabbrvuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvuserfont{\the\glsshortpltok}},%
    description={\protect\glsuserdescription{\the\glslongtok}%
     {\the\glslabeltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtruserparen
          {\glsfirstabbrvuserfont{\glsentryshort{\glslabel}}}%
          {\glslabel}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrusersuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonguserfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonguserfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlonguserfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlonguserfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlonguserfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlonguserfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlonguserfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstabbrvuserfont{\glsaccessshort{##1}}}{##1}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlonguserfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstabbrvuserfont{\glsaccessshortpl{##1}}}{##1}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlonguserfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstabbrvuserfont{\glsaccessshort{##1}}}{##1}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlonguserfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstabbrvuserfont{\glsaccessshortpl{##1}}}{##1}%
  }%
}
\newcommand*{\glsabbrvscuserfont}{\glsabbrvscfont}%
\newcommand*{\glsfirstabbrvscuserfont}{\glsabbrvscuserfont}%
\newcommand*{\glsxtrscusersuffix}{\glsxtrscsuffix}
\newcommand*{\glsxtrlongshortscusername}{%
  \protect\glsabbrvscuserfont{\the\glsshorttok}%
}
\newabbreviationstyle{long-postshort-sc-user}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortscusername},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}},%
    text={\protect\glsabbrvscuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvscuserfont{\the\glsshortpltok}},%
    description={\protect\glsuserdescription{\the\glslongtok}%
     {\the\glslabeltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtruserparen
          {\glsfirstabbrvscuserfont{\glsentryshort{\glslabel}}}%
          {\glslabel}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrscusersuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvscuserfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvscuserfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonguserfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonguserfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlonguserfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlonguserfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlonguserfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlonguserfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlonguserfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstabbrvscuserfont{\glsaccessshort{##1}}}{##1}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlonguserfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstabbrvscuserfont{\glsaccessshortpl{##1}}}{##1}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlonguserfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstabbrvscuserfont{\glsaccessshort{##1}}}{##1}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlonguserfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstabbrvscuserfont{\glsaccessshortpl{##1}}}{##1}%
  }%
}
\newcommand*{\glsxtrlongshortuserdescname}{%
  \protect\glslonguserfont{\the\glslongtok}%
  \protect\glsxtruserparen
   {\protect\glsabbrvuserfont{\the\glsshorttok}}{\the\glslabeltok}%
}
\newabbreviationstyle{long-postshort-user-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortuserdescname},
    sort={\the\glslongtok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}},%
    text={\protect\glsabbrvuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvuserfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtruserparen
          {\glsfirstabbrvuserfont{\glsentryshort{\glslabel}}}%
          {\glslabel}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-postshort-user}%
}
\newcommand*{\glsxtrlongshortscuserdescname}{%
  \protect\glslonguserfont{\the\glslongtok}%
  \protect\glsxtruserparen
   {\protect\glsabbrvscuserfont{\the\glsshorttok}}{\the\glslabeltok}%
}
\newabbreviationstyle{long-postshort-sc-user-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortscuserdescname},
    sort={\the\glslongtok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}},%
    text={\protect\glsabbrvscuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvscuserfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtruserparen
          {\glsfirstabbrvscuserfont{\glsentryshort{\glslabel}}}%
          {\glslabel}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-postshort-sc-user}%
}
\newabbreviationstyle{short-postlong-user}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}},%
    text={\protect\glsabbrvuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvuserfont{\the\glsshortpltok}},%
    description={\protect\glsuserdescription{\the\glslongtok}%
     {\the\glslabeltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtruserparen
          {\glsfirstlonguserfont{\glsentrylong{\glslabel}}}%
          {\glslabel}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrusersuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonguserfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonguserfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvuserfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvuserfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvuserfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvuserfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvuserfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstlonguserfont{\glsaccesslong{##1}}}{##1}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvuserfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstlonguserfont{\glsaccesslongpl{##1}}}{##1}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvuserfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstlonguserfont{\glsaccesslong{##1}}}{##1}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvuserfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstlonguserfont{\glsaccesslongpl{##1}}}{##1}%
  }%
}
\newcommand*{\glsxtrshortlonguserdescname}{%
 \protect\glsabbrvuserfont{\the\glsshorttok}%
 \protect\glsxtruserparen
   {\protect\glslonguserfont{\the\glslongpltok}}%
   {\the\glslabeltok}%
}
\newabbreviationstyle{short-postlong-user-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlonguserdescname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlonguserfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}},%
    text={\protect\glsabbrvuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvuserfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtruserparen
          {\glsfirstlonguserfont{\glsentrylong{\glslabel}}}%
          {\glslabel}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-postlong-user}%
}
\newabbreviationstyle{long-short-user-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortuserdescname},
    sort={\glsxtrlongshortdescsort},%
    first={\protect\glsfirstlonguserfont{\the\glslongtok}%
     \protect\glsxtruserparen{\protect\glsfirstabbrvuserfont{\the\glsshorttok}}%
      {\the\glslabeltok}},%
    firstplural={\protect\glsfirstlonguserfont{\the\glslongpltok}%
     \protect\glsxtruserparen
      {\protect\glsfirstabbrvuserfont{\the\glsshortpltok}}{\the\glslabeltok}},%
    text={\protect\glsabbrvfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-short-user}%
}
\newabbreviationstyle{short-long-user}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    description={\protect\glsuserdescription{\the\glslongtok}%
      {\the\glslabeltok}},%
    first={\protect\glsfirstabbrvuserfont{\the\glsshorttok}%
     \protect\glsxtruserparen{\protect\glsfirstlonguserfont{\the\glslongtok}}%
       {\the\glslabeltok}},%
    firstplural={\protect\glsfirstabbrvuserfont{\the\glsshortpltok}%
     \protect\glsxtruserparen{\protect\glsfirstlonguserfont{\the\glslongpltok}}%
       {\the\glslabeltok}},%
    text={\protect\glsabbrvuserfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvuserfont{\the\glsshortpltok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrusersuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvuserfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonguserfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonguserfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstabbrvuserfont{\glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstlonguserfont{\glsaccesslong{##1}}}{##1}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstabbrvuserfont{\glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstlonguserfont{\glsaccesslongpl{##1}}}{##1}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstabbrvuserfont{\Glsaccessshort{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstlonguserfont{\glsaccesslong{##1}}}{##1}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstabbrvuserfont{\Glsaccessshortpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtruserparen{\glsfirstlonguserfont{\glsaccesslongpl{##1}}}{##1}%
  }%
}
\newabbreviationstyle{short-long-user-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlonguserdescname},
    sort={\glsxtrshortlongdescsort},%
    first={\protect\glsfirstabbrvuserfont{\the\glsshorttok}%
     \protect\glsxtruserparen{\protect\glsfirstlonguserfont{\the\glslongtok}}%
       {\the\glslabeltok}},%
    firstplural={\protect\glsfirstabbrvuserfont{\the\glsshortpltok}%
     \protect\glsxtruserparen{\protect\glsfirstlonguserfont{\the\glslongpltok}}%
       {\the\glslabeltok}},%
    text={\protect\glsabbrvfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-long-user}%
}
\newrobustcmd*{\glsxtrifhyphenstart}[3]{%
  \ifx\glsinsert#1\relax
   \expandafter\@glsxtrifhyphenstart#1\relax\relax
     \@end@glsxtrifhyphenstart{#2}{#3}%
  \else
   \@glsxtrifhyphenstart#1\relax\relax\@end@glsxtrifhyphenstart{#2}{#3}%
  \fi
}
\def\@glsxtrifhyphenstart#1#2\@end@glsxtrifhyphenstart#3#4{%
  \ifx-#1\relax#3\else #4\fi
}
\newcommand*{\glsxtrlonghyphenshort}[4]{%
 {%
   \glsxtrifhyphenstart{#4}{\def\glsxtrwordsep{-}}{}%
   \glsfirstlonghyphenfont{#2\ifglsxtrinsertinside{#4}\fi}%
   \ifglsxtrinsertinside\else{#4}\fi
   \glsxtrfullsep{#1}%
   \glsxtrparen{\glsfirstabbrvhyphenfont{#3\ifglsxtrinsertinside{#4}\fi}%
    \ifglsxtrinsertinside\else{#4}\fi}%
 }%
}
\newcommand*{\glsabbrvhyphenfont}{\glsabbrvdefaultfont}%
\newcommand*{\glsfirstabbrvhyphenfont}{\glsabbrvhyphenfont}%
\newcommand*{\glslonghyphenfont}{\glslongdefaultfont}%
\newcommand*{\glsfirstlonghyphenfont}{\glslonghyphenfont}%
\newcommand*{\glsxtrhyphensuffix}{\glsxtrabbrvpluralsuffix}
\newabbreviationstyle{long-hyphen-short-hyphen}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlonghyphenfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvhyphenfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlonghyphenfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvhyphenfont{\the\glsshortpltok}}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}},%
    description={\protect\glslonghyphenfont{\the\glslongtok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrhyphensuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonghyphenfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonghyphenfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlonghyphenshort{##1}{\glsaccesslong{##1}}{\glsaccessshort{##1}}{##2}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlonghyphenshort{##1}{\glsaccesslongpl{##1}}%
     {\glsaccessshortpl{##1}}{##2}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsxtrlonghyphenshort{##1}{\Glsaccesslong{##1}}{\glsaccessshort{##1}}{##2}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsxtrlonghyphenshort{##1}{\Glsaccesslongpl{##1}}%
     {\glsaccessshortpl{##1}}{##2}%
  }%
}
\newabbreviationstyle{long-hyphen-short-hyphen-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},
    first={\protect\glsfirstlonghyphenfont{\the\glslongtok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvhyphenfont{\the\glsshorttok}}},%
    firstplural={\protect\glsfirstlonghyphenfont{\the\glslongpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstabbrvhyphenfont{\the\glsshortpltok}}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-hyphen-short-hyphen}%
}
\newcommand*{\glsxtrlonghyphennoshort}[3]{%
 {%
   \glsxtrifhyphenstart{#3}{\def\glsxtrwordsep{-}}{}%
   \glsfirstlonghyphenfont{#2\ifglsxtrinsertinside{#3}\fi}%
   \ifglsxtrinsertinside\else{#3}\fi
 }%
}
\newabbreviationstyle{long-hyphen-noshort-desc-noreg}%
{%
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortdescname},
    sort={\expandonce\glsxtrorglong},
    first={\protect\glsfirstlonghyphenfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonghyphenfont{\the\glslongpltok}},%
    text={\protect\glslonghyphenfont{\the\glslongtok}},%
    plural={\protect\glslonghyphenfont{\the\glslongpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-hyphen-short-hyphen}%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*\glsabbrvfont[1]{\glsabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvdefaultfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonghyphenfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonghyphenfont{##1}}%
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsxtrlonghyphennoshort{##1}{\glsaccesslong{##1}}{##2}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsxtrlonghyphennoshort{##1}{\glsaccesslongpl{##1}}{##2}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glsxtrlonghyphennoshort{##1}{\Glsaccesslong{##1}}{##2}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glsxtrlonghyphennoshort{##1}{\Glsaccesslongpl{##1}}{##2}%
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsxtrlonghyphennoshort{##1}{\glsaccesslong{##1}}{##2}%
    \glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsxtrlonghyphennoshort{##1}{\glsaccesslongpl{##1}}{##2}%
    \glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsxtrlonghyphennoshort{##1}{\Glsaccesslong{##1}}{##2}%
    \glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsxtrlonghyphennoshort{##1}{\Glsaccesslongpl{##1}}{##2}%
    \glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlonghyphennoshort{##1}{\glsaccesslong{##1}}{##2}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlonghyphennoshort{##1}{\glsaccesslongpl{##1}}{##2}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsxtrlonghyphennoshort{##1}{\Glsaccesslong{##1}}{##2}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsxtrlonghyphennoshort{##1}{\Glsaccesslongpl{##1}}{##2}%
  }%
}
\newabbreviationstyle{long-hyphen-noshort-noreg}%
{%
  \glsxtrAccSuppAbbrSetNameShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongnoshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlonghyphenfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonghyphenfont{\the\glslongpltok}},%
    text={\protect\glslonghyphenfont{\the\glslongtok}},%
    plural={\protect\glslonghyphenfont{\the\glslongpltok}},%
    description={\the\glslongtok}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-hyphen-noshort-desc-noreg}%
}
\newcommand*{\glsxtrlonghyphen}[3]{%
 {%
   \glsxtrifhyphenstart{#3}{\def\glsxtrwordsep{-}}{}%
   \glsfirstlonghyphenfont{#1}%
 }%
}
\newcommand*{\glsxtrposthyphenshort}[2]{%
 {%
   \glsxtrifhyphenstart{#2}{\def\glsxtrwordsep{-}}{}%
   \ifglsxtrinsertinside{\glsfirstlonghyphenfont{#2}}\else{#2}\fi
   \glsxtrfullsep{#1}%
   \glsxtrparen
   {\glsfirstabbrvhyphenfont{\glsentryshort{#1}\ifglsxtrinsertinside{#2}\fi}%
    \ifglsxtrinsertinside\else{#2}\fi
   }%
 }%
}
\newcommand*{\glsxtrposthyphensubsequent}[2]{%
  \glsabbrvfont{\ifglsxtrinsertinside {#2}\fi}%
  \ifglsxtrinsertinside \else{#2}\fi
}
\newabbreviationstyle{long-hyphen-postshort-hyphen}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlonghyphenfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonghyphenfont{\the\glslongpltok}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}},%
    description={\protect\glslonghyphenfont{\the\glslongtok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrposthyphenshort{\glslabel}{\glsinsert}%
      }%
      {%
        \glsxtrposthyphensubsequent{\glslabel}{\glsinsert}%
      }%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonghyphenfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonghyphenfont{##1}}%
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsabbrvfont{\glsaccessshort{##1}}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsabbrvfont{\glsaccessshortpl{##1}}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glsabbrvfont{\Glsaccessshort{##1}}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glsabbrvfont{\Glsaccessshortpl{##1}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrlonghyphen{\glsaccesslong{##1}}{##1}{##2}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrlonghyphen{\glsaccesslongpl{##1}}{##1}{##2}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsxtrlonghyphen{\Glsaccesslong{##1}}{##1}{##2}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsxtrlonghyphen{\Glsaccesslongpl{##1}}{##1}{##2}%
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlonghyphenfont{\glsaccesslong{##1}%
      \ifglsxtrinsertinside{##2}\fi}%
    \ifglsxtrinsertinside \else{##2}\fi
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlonghyphenfont{\glsaccesslongpl{##1}%
      \ifglsxtrinsertinside{##2}\fi}%
    \ifglsxtrinsertinside \else{##2}\fi
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlonghyphenfont{\Glsaccesslong{##1}%
      \ifglsxtrinsertinside{##2}\fi}%
    \ifglsxtrinsertinside \else{##2}\fi
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlonghyphenfont{\Glsaccesslongpl{##1}%
      \ifglsxtrinsertinside{##2}\fi}%
    \ifglsxtrinsertinside \else{##2}\fi
  }%
}
\newabbreviationstyle{long-hyphen-postshort-hyphen-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrlongshortdescname},
    sort={\glsxtrlongshortdescsort},%
    first={\protect\glsfirstlonghyphenfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlonghyphenfont{\the\glslongpltok}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrposthyphenshort{\glslabel}{\glsinsert}%
      }%
      {%
        \glsxtrposthyphensubsequent{\glslabel}{\glsinsert}%
      }%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-hyphen-postshort-hyphen}%
}
\newcommand*{\glsxtrshorthyphenlong}[4]{%
 {%
   \glsxtrifhyphenstart{#4}{\def\glsxtrwordsep{-}}{}%
   \glsfirstabbrvhyphenfont{#2\ifglsxtrinsertinside{#4}\fi}%
   \ifglsxtrinsertinside\else{#4}\fi
   \glsxtrfullsep{#1}%
   \glsxtrparen{\glsfirstlonghyphenfont{#3\ifglsxtrinsertinside{#4}\fi}%
    \ifglsxtrinsertinside\else{#4}\fi}%
 }%
}
\newabbreviationstyle{short-hyphen-long-hyphen}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstabbrvhyphenfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlonghyphenfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvhyphenfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlonghyphenfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}},%
    description={\protect\glslonghyphenfont{\the\glslongtok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrhyphensuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonghyphenfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonghyphenfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshorthyphenlong{##1}{\glsaccessshort{##1}}{\glsaccesslong{##1}}{##2}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshorthyphenlong{##1}%
     {\glsaccessshortpl{##1}}{\glsaccesslongpl{##1}}{##2}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsxtrshorthyphenlong{##1}{\glsaccessshort{##1}}{\Glsaccesslong{##1}}{##2}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsxtrshorthyphenlong{##1}%
     {\glsaccessshortpl{##1}}{\Glsaccesslongpl{##1}}{##2}%
  }%
}
\newabbreviationstyle{short-hyphen-long-hyphen-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},
    sort={\glsxtrshortlongdescsort},
    first={\protect\glsfirstabbrvhyphenfont{\the\glsshorttok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlonghyphenfont{\the\glslongtok}}},%
    firstplural={\protect\glsfirstabbrvhyphenfont{\the\glsshortpltok}%
     \protect\glsxtrfullsep{\the\glslabeltok}%
     \glsxtrparen{\protect\glsfirstlonghyphenfont{\the\glslongpltok}}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-hyphen-long-hyphen}%
}
\newcommand*{\glsxtrshorthyphen}[3]{%
 {%
   \glsxtrifhyphenstart{#3}{\def\glsxtrwordsep{-}}{}%
   \glsfirstabbrvhyphenfont{#1}%
 }%
}
\newcommand*{\glsxtrposthyphenlong}[2]{%
 {%
   \glsxtrifhyphenstart{#2}{\def\glsxtrwordsep{-}}{}%
   \ifglsxtrinsertinside{\glsfirstabbrvhyphenfont{#2}}\else{#2}\fi
   \glsxtrfullsep{#1}%
   \glsxtrparen
   {\glsfirstlonghyphenfont{\glsentrylong{#1}\ifglsxtrinsertinside{#2}\fi}%
    \ifglsxtrinsertinside\else{#2}\fi
   }%
 }%
}
\newabbreviationstyle{short-hyphen-postlong-hyphen}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstabbrvhyphenfont{\the\glsshorttok}},%
    firstplural={\protect\glsfirstabbrvhyphenfont{\the\glsshortpltok}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}},%
    description={\protect\glslonghyphenfont{\the\glslongtok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrposthyphenlong{\glslabel}{\glsinsert}%
      }%
      {%
        \glsxtrposthyphensubsequent{\glslabel}{\glsinsert}%
      }%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrabbrvpluralsuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvhyphenfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlonghyphenfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslonghyphenfont{##1}}%
  \renewcommand*{\glsxtrsubsequentfmt}[2]{%
    \glsabbrvfont{\glsaccessshort{##1}}%
  }%
  \renewcommand*{\glsxtrsubsequentplfmt}[2]{%
    \glsabbrvfont{\glsaccessshortpl{##1}}%
  }%
  \renewcommand*{\Glsxtrsubsequentfmt}[2]{%
    \glsabbrvfont{\Glsaccessshort{##1}}%
  }%
  \renewcommand*{\Glsxtrsubsequentplfmt}[2]{%
    \glsabbrvfont{\Glsaccessshortpl{##1}}%
  }%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsxtrshorthyphen{\glsaccessshort{##1}}{##1}{##2}%
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsxtrshorthyphen{\glsaccessshortpl{##1}}{##1}{##2}%
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsxtrshorthyphen{\Glsaccessshort{##1}}{##1}{##2}%
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsxtrshorthyphen{\Glsaccessshortpl{##1}}{##1}{##2}%
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvhyphenfont{\glsaccessshort{##1}%
      \ifglsxtrinsertinside{##2}\fi}%
    \ifglsxtrinsertinside \else{##2}\fi
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvhyphenfont{\glsaccessshortpl{##1}%
      \ifglsxtrinsertinside{##2}\fi}%
    \ifglsxtrinsertinside \else{##2}\fi
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstabbrvhyphenfont{\Glsaccessshort{##1}%
      \ifglsxtrinsertinside{##2}\fi}%
    \ifglsxtrinsertinside \else{##2}\fi
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstabbrvhyphenfont{\Glsaccessshortpl{##1}%
      \ifglsxtrinsertinside{##2}\fi}%
    \ifglsxtrinsertinside \else{##2}\fi
  }%
}
\newabbreviationstyle{short-hyphen-postlong-hyphen-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrshortlongdescname},
    sort={\glsxtrshortlongdescsort},%
    first={\protect\glsfirstabbrvhyphenfont{\the\glsshorttok}},%
    firstplural={\protect\glsfirstabbrvhyphenfont{\the\glsshortpltok}},%
    text={\protect\glsabbrvhyphenfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvhyphenfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \glsxtrposthyphenlong{\glslabel}{\glsinsert}%
      }%
      {%
        \glsxtrposthyphensubsequent{\glslabel}{\glsinsert}%
      }%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{short-hyphen-postlong-hyphen}%
}
\newcommand*{\glsabbrvonlyfont}{\glsabbrvdefaultfont}%
\newcommand*{\glsfirstabbrvonlyfont}{\glsabbrvonlyfont}%
\newcommand*{\glslongonlyfont}{\glslongdefaultfont}%
\newcommand*{\glsfirstlongonlyfont}{\glslongonlyfont}%
\newcommand*{\glsxtronlysuffix}{\glsxtrabbrvpluralsuffix}
\newcommand*{\glsxtronlyname}{%
  \protect\glsabbrvonlyfont{\the\glsshorttok}%
}
\newabbreviationstyle{long-only-short-only}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtronlyname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlongonlyfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlongonlyfont{\the\glslongpltok}},%
    text={\protect\glsabbrvonlyfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvonlyfont{\the\glsshortpltok}},%
    description={\protect\glslongonlyfont{\the\glslongtok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtronlysuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvonlyfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvonlyfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongonlyfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongonlyfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongonlyfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongonlyfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongonlyfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongonlyfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlongonlyfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvonlyfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlongonlyfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvonlyfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlongonlyfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvonlyfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlongonlyfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvonlyfont{\Glsaccessshortpl{##1}}}%
  }%
}
\newcommand*{\glsxtronlydescsort}{\the\glslongtok}
\newcommand*{\glsxtronlydescname}{%
  \protect\glslongfont{\the\glslongtok}%
}
\newabbreviationstyle{long-only-short-only-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtronlydescname},
    sort={\glsxtronlydescsort},%
    first={\protect\glsfirstlongonlyfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlongonlyfont{\the\glslongpltok}},%
    text={\protect\glsabbrvonlyfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvonlyfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-only-short-only}%
}
\newcommand*{\glsabbrvsconlyfont}{\glsabbrvscfont}%
\newcommand*{\glsfirstabbrvsconlyfont}{\glsabbrvsconlyfont}%
\newcommand*{\glsxtrsconlysuffix}{\glsxtrscsuffix}
\newcommand*{\glsxtrsconlyname}{%
  \protect\glsabbrvsconlyfont{\the\glsshorttok}%
}
\newabbreviationstyle{long-only-short-sc-only}%
{%
  \glsxtrAccSuppAbbrSetFirstLongAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrsconlyname},
    sort={\the\glsshorttok},
    first={\protect\glsfirstlongonlyfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlongonlyfont{\the\glslongpltok}},%
    text={\protect\glsabbrvsconlyfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvsconlyfont{\the\glsshortpltok}},%
    description={\protect\glslongonlyfont{\the\glslongtok}}}%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \renewcommand*{\abbrvpluralsuffix}{\glsxtrsconlysuffix}%
  \renewcommand*{\glsabbrvfont}[1]{\glsabbrvsconlyfont{##1}}%
  \renewcommand*{\glsfirstabbrvfont}[1]{\glsfirstabbrvsconlyfont{##1}}%
  \renewcommand*{\glsfirstlongfont}[1]{\glsfirstlongonlyfont{##1}}%
  \renewcommand*{\glslongfont}[1]{\glslongonlyfont{##1}}%
  \renewcommand*{\glsxtrfullformat}[2]{%
    \glsfirstlongonlyfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrfullplformat}[2]{%
    \glsfirstlongonlyfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullformat}[2]{%
    \glsfirstlongonlyfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\Glsxtrfullplformat}[2]{%
    \glsfirstlongonlyfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
  }%
  \renewcommand*{\glsxtrinlinefullformat}[2]{%
    \glsfirstlongonlyfont{\glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvsconlyfont{\glsaccessshort{##1}}}%
  }%
  \renewcommand*{\glsxtrinlinefullplformat}[2]{%
    \glsfirstlongonlyfont{\glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvsconlyfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullformat}[2]{%
    \glsfirstlongonlyfont{\Glsaccesslong{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvsconlyfont{\glsaccessshortpl{##1}}}%
  }%
  \renewcommand*{\Glsxtrinlinefullplformat}[2]{%
    \glsfirstlongonlyfont{\Glsaccesslongpl{##1}\ifglsxtrinsertinside##2\fi}%
    \ifglsxtrinsertinside\else##2\fi
    \glsxtrfullsep{##1}%
    \glsxtrparen{\protect\glsfirstabbrvsconlyfont{\Glsaccessshortpl{##1}}}%
  }%
}
\newcommand*{\glsxtrsconlydescsort}{\glsxtronlydescsort}
\newcommand*{\glsxtrsconlydescname}{\glsxtronlydescname}
\newabbreviationstyle{long-only-short-sc-only-desc}%
{%
  \glsxtrAccSuppAbbrSetTextShortAttrs\glscategorylabel
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\glsxtrsconlydescname},
    sort={\glsxtrsconlydescsort},%
    first={\protect\glsfirstlongonlyfont{\the\glslongtok}},%
    firstplural={\protect\glsfirstlongonlyfont{\the\glslongpltok}},%
    text={\protect\glsabbrvsconlyfont{\the\glsshorttok}},%
    plural={\protect\glsabbrvsconlyfont{\the\glsshortpltok}}%
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}%
{%
  \GlsXtrUseAbbrStyleFmts{long-only-short-sc-only}%
}
\let\@glsxtr@org@markright\markright
\renewcommand*{\markright}[1]{%
 \glsxtrmarkhook
 \@glsxtr@org@markright{\@glsxtrinmark#1\@glsxtrnotinmark}%
 \glsxtrrestoremarkhook
}
\let\@glsxtr@org@markboth\markboth
\renewcommand*{\markboth}[2]{%
 \glsxtrmarkhook
 \@glsxtr@org@markboth
   {\@glsxtrinmark#1\@glsxtrnotinmark}%
   {\@glsxtrinmark#2\@glsxtrnotinmark}%
 \glsxtrrestoremarkhook
}
\let\@glsxtr@org@@starttoc\@starttoc
\renewcommand*{\@starttoc}[1]{%
 \glsxtrmarkhook
 \@glsxtrinmark
 \@glsxtr@org@@starttoc{#1}%
 \@glsxtrnotinmark
 \glsxtrrestoremarkhook
}
\newcommand*{\glsxtrRevertMarks}{%
  \let\markright\@glsxtr@org@markright
  \let\markboth\@glsxtr@org@markboth
  \let\@starttoc\@glsxtr@org@@starttoc
}
\newcommand*{\glsxtrRevertTocMarks}{%
  \let\@starttoc\@glsxtr@org@@starttoc
}
\newcommand*{\glsxtrifinmark}[2]{#2}
\newrobustcmd*{\@glsxtrinmark}{%
  \let\glsxtrifinmark\@firstoftwo
}
\newrobustcmd*{\@glsxtrnotinmark}{%
  \let\glsxtrifinmark\@secondoftwo
}
\ifdef\texorpdfstring
{
  \newcommand*{\glsxtrtitleorpdforheading}[3]{\texorpdfstring{#1}{#2}}
}
{
  \newcommand*{\glsxtrtitleorpdforheading}[3]{#1}
}
\newcommand*{\glsxtrmarkhook}{%
  \let\@glsxtr@org@MakeUppercase\MakeUppercase
  \let\@glsxtr@org@glsxtrtitleorpdforheading\glsxtrtitleorpdforheading
  \let\@glsxtr@org@glsxtrtitleshort\glsxtrtitleshort
  \let\@glsxtr@org@glsxtrtitleshortpl\glsxtrtitleshortpl
  \let\@glsxtr@org@Glsxtrtitleshort\Glsxtrtitleshort
  \let\@glsxtr@org@Glsxtrtitleshortpl\Glsxtrtitleshortpl
  \let\@glsxtr@org@glsxtrtitlename\glsxtrtitlename
  \let\@glsxtr@org@Glsxtrtitlename\Glsxtrtitlename
  \let\@glsxtr@org@glsxtrtitletext\glsxtrtitletext
  \let\@glsxtr@org@Glsxtrtitletext\Glsxtrtitletext
  \let\@glsxtr@org@glsxtrtitleplural\glsxtrtitleplural
  \let\@glsxtr@org@Glsxtrtitleplural\Glsxtrtitleplural
  \let\@glsxtr@org@glsxtrtitlefirst\glsxtrtitlefirst
  \let\@glsxtr@org@Glsxtrtitlefirst\Glsxtrtitlefirst
  \let\@glsxtr@org@glsxtrtitlefirstplural\glsxtrtitlefirstplural
  \let\@glsxtr@org@Glsxtrtitlefirstplural\Glsxtrtitlefirstplural
  \let\@glsxtr@org@glsxtrtitlelong\glsxtrtitlelong
  \let\@glsxtr@org@glsxtrtitlelongpl\glsxtrtitlelongpl
  \let\@glsxtr@org@Glsxtrtitlelong\Glsxtrtitlelong
  \let\@glsxtr@org@Glsxtrtitlelongpl\Glsxtrtitlelongpl
  \let\@glsxtr@org@glsxtrtitlefull\glsxtrtitlefull
  \let\@glsxtr@org@glsxtrtitlefullpl\glsxtrtitlefullpl
  \let\@glsxtr@org@Glsxtrtitlefull\Glsxtrtitlefull
  \let\@glsxtr@org@Glsxtrtitlefullpl\Glsxtrtitlefullpl
  \let\glsxtrifinmark\@firstoftwo
  \let\MakeUppercase\MakeTextUppercase
  \let\glsxtrtitleorpdforheading\@thirdofthree
  \let\glsxtrtitleshort\glsxtrheadshort
  \let\glsxtrtitleshortpl\glsxtrheadshortpl
  \let\Glsxtrtitleshort\Glsxtrheadshort
  \let\Glsxtrtitleshortpl\Glsxtrheadshortpl
  \let\glsxtrtitlename\glsxtrheadname
  \let\Glsxtrtitlename\Glsxtrheadname
  \let\glsxtrtitletext\glsxtrheadtext
  \let\Glsxtrtitletext\Glsxtrheadtext
  \let\glsxtrtitleplural\glsxtrheadplural
  \let\Glsxtrtitleplural\Glsxtrheadplural
  \let\glsxtrtitlefirst\glsxtrheadfirst
  \let\Glsxtrtitlefirst\Glsxtrheadfirst
  \let\glsxtrtitlefirstplural\glsxtrheadfirstplural
  \let\Glsxtrtitlefirstplural\Glsxtrheadfirstplural
  \let\glsxtrtitlelong\glsxtrheadlong
  \let\glsxtrtitlelongpl\glsxtrheadlongpl
  \let\Glsxtrtitlelong\Glsxtrheadlong
  \let\Glsxtrtitlelongpl\Glsxtrheadlongpl
  \let\glsxtrtitlefull\glsxtrheadfull
  \let\glsxtrtitlefullpl\glsxtrheadfullpl
  \let\Glsxtrtitlefull\Glsxtrheadfull
  \let\Glsxtrtitlefullpl\Glsxtrheadfullpl
}
\newcommand*{\glsxtrrestoremarkhook}{%
  \let\glsxtrifinmark\@secondoftwo
  \let\MakeUppercase\@glsxtr@org@MakeUppercase
  \let\glsxtrtitleorpdforheading\@glsxtr@org@glsxtrtitleorpdforheading
  \let\glsxtrtitleshort\@glsxtr@org@glsxtrtitleshort
  \let\glsxtrtitleshortpl\@glsxtr@org@glsxtrtitleshortpl
  \let\Glsxtrtitleshort\@glsxtr@org@Glsxtrtitleshort
  \let\Glsxtrtitleshortpl\@glsxtr@org@Glsxtrtitleshortpl
  \let\glsxtrtitlename\@glsxtr@org@glsxtrtitlename
  \let\Glsxtrtitlename\@glsxtr@org@Glsxtrtitlename
  \let\glsxtrtitletext\@glsxtr@org@glsxtrtitletext
  \let\Glsxtrtitletext\@glsxtr@org@Glsxtrtitletext
  \let\glsxtrtitleplural\@glsxtr@org@glsxtrtitleplural
  \let\Glsxtrtitleplural\@glsxtr@org@Glsxtrtitleplural
  \let\glsxtrtitlefirst\@glsxtr@org@glsxtrtitlefirst
  \let\Glsxtrtitlefirst\@glsxtr@org@Glsxtrtitlefirst
  \let\glsxtrtitlefirstplural\@glsxtr@org@glsxtrtitlefirstplural
  \let\Glsxtrtitlefirstplural\@glsxtr@org@Glsxtrtitlefirstplural
  \let\glsxtrtitlelong\@glsxtr@org@glsxtrtitlelong
  \let\glsxtrtitlelongpl\@glsxtr@org@glsxtrtitlelongpl
  \let\Glsxtrtitlelong\@glsxtr@org@Glsxtrtitlelong
  \let\Glsxtrtitlelongpl\@glsxtr@org@Glsxtrtitlelongpl
  \let\glsxtrtitlefull\@glsxtr@org@glsxtrtitlefull
  \let\glsxtrtitlefullpl\@glsxtr@org@glsxtrtitlefullpl
  \let\Glsxtrtitlefull\@glsxtr@org@Glsxtrtitlefull
  \let\Glsxtrtitlefullpl\@glsxtr@org@Glsxtrtitlefullpl
}
\newcommand*{\glsxtrheadshort}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSxtrshort[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsxtrshort[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\glsxtrtitleshort}[1]{%
  \glsxtrshort[noindex,hyper=false]{#1}[]%
}
\newcommand*{\glsxtrheadshortpl}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
      \GLSxtrshortpl[noindex,hyper=false]{#1}[]%
   }%
   {%
      \glsxtrshortpl[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\glsxtrtitleshortpl}[1]{%
  \glsxtrshortpl[noindex,hyper=false]{#1}[]%
}
\newcommand*{\Glsxtrheadshort}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSxtrshort[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsxtrshort[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\Glsxtrtitleshort}[1]{%
  \Glsxtrshort[noindex,hyper=false]{#1}[]%
}
\newrobustcmd*{\GLSxtrtitleshort}[1]{%
  \GLSxtrshort[noindex,hyper=false]{#1}[]%
}
\newcommand*{\Glsxtrheadshortpl}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSxtrshortpl[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsxtrshortpl[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\Glsxtrtitleshortpl}[1]{%
  \Glsxtrshortpl[noindex,hyper=false]{#1}[]%
}
\newrobustcmd*{\GLSxtrtitleshortpl}[1]{%
  \GLSxtrshortpl[noindex,hyper=false]{#1}[]%
}
\newcommand*{\glsxtrheadname}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSname[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsname[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\glsxtrtitlename}[1]{%
  \glsname[noindex,hyper=false]{#1}[]%
}
\newcommand*{\Glsxtrheadname}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSname[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsname[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\Glsxtrtitlename}[1]{%
  \Glsname[noindex,hyper=false]{#1}[]%
}
\newrobustcmd*{\GLSxtrtitlename}[1]{%
  \GLSname[noindex,hyper=false]{#1}[]%
}
\newcommand*{\glsxtrheadtext}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLStext[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glstext[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\glsxtrtitletext}[1]{%
  \glstext[noindex,hyper=false]{#1}[]%
}
\newcommand*{\Glsxtrheadtext}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLStext[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glstext[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\Glsxtrtitletext}[1]{%
  \Glstext[noindex,hyper=false]{#1}[]%
}
\newrobustcmd*{\GLSxtrtitletext}[1]{%
  \GLStext[noindex,hyper=false]{#1}[]%
}
\newcommand*{\glsxtrheadplural}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSplural[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsplural[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\glsxtrtitleplural}[1]{%
  \glsplural[noindex,hyper=false]{#1}[]%
}
\newcommand*{\Glsxtrheadplural}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSplural[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsplural[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\Glsxtrtitleplural}[1]{%
  \Glsplural[noindex,hyper=false]{#1}[]%
}
\newrobustcmd*{\GLSxtrtitleplural}[1]{%
  \GLSplural[noindex,hyper=false]{#1}[]%
}
\newcommand*{\glsxtrheadfirst}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSfirst[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsfirst[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\glsxtrtitlefirst}[1]{%
  \glsfirst[noindex,hyper=false]{#1}[]%
}
\newcommand*{\Glsxtrheadfirst}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSfirst[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsfirst[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\Glsxtrtitlefirst}[1]{%
  \Glsfirst[noindex,hyper=false]{#1}[]%
}
\newrobustcmd*{\GLSxtrtitlefirst}[1]{%
  \GLSfirst[noindex,hyper=false]{#1}[]%
}
\newcommand*{\glsxtrheadfirstplural}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSfirstplural[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsfirstplural[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\glsxtrtitlefirstplural}[1]{%
  \glsfirstplural[noindex,hyper=false]{#1}[]%
}
\newcommand*{\Glsxtrheadfirstplural}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSfirstplural[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsfirstplural[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\Glsxtrtitlefirstplural}[1]{%
  \Glsfirstplural[noindex,hyper=false]{#1}[]%
}
\newrobustcmd*{\GLSxtrtitlefirstplural}[1]{%
  \GLSfirstplural[noindex,hyper=false]{#1}[]%
}
\newcommand*{\glsxtrheadlong}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSxtrlong[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsxtrlong[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\glsxtrtitlelong}[1]{%
  \glsxtrlong[noindex,hyper=false]{#1}[]%
}
\newcommand*{\glsxtrheadlongpl}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
      \GLSxtrlongpl[noindex,hyper=false]{#1}[]%
   }%
   {%
      \glsxtrlongpl[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\glsxtrtitlelongpl}[1]{%
  \glsxtrlongpl[noindex,hyper=false]{#1}[]%
}
\newcommand*{\Glsxtrheadlong}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSxtrlong[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsxtrlong[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\Glsxtrtitlelong}[1]{%
  \Glsxtrlong[noindex,hyper=false]{#1}[]%
}
\newrobustcmd*{\GLSxtrtitlelong}[1]{%
  \GLSxtrlong[noindex,hyper=false]{#1}[]%
}
\newcommand*{\Glsxtrheadlongpl}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSxtrlongpl[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsxtrlongpl[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\Glsxtrtitlelongpl}[1]{%
  \Glsxtrlongpl[noindex,hyper=false]{#1}[]%
}
\newrobustcmd*{\GLSxtrtitlelongpl}[1]{%
  \GLSxtrlongpl[noindex,hyper=false]{#1}[]%
}
\newcommand*{\glsxtrheadfull}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSxtrfull[noindex,hyper=false]{#1}[]%
   }%
   {%
     \glsxtrfull[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\glsxtrtitlefull}[1]{%
  \glsxtrfull[noindex,hyper=false]{#1}[]%
}
\newcommand*{\glsxtrheadfullpl}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
      \GLSxtrfullpl[noindex,hyper=false]{#1}[]%
   }%
   {%
      \glsxtrfullpl[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\glsxtrtitlefullpl}[1]{%
  \glsxtrfullpl[noindex,hyper=false]{#1}[]%
}
\newcommand*{\Glsxtrheadfull}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSxtrfull[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsxtrfull[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\Glsxtrtitlefull}[1]{%
  \Glsxtrfull[noindex,hyper=false]{#1}[]%
}
\newrobustcmd*{\GLSxtrtitlefull}[1]{%
  \GLSxtrfull[noindex,hyper=false]{#1}[]%
}
\newcommand*{\Glsxtrheadfullpl}[1]{%
 \protect\NoCaseChange
 {%
   \glsifattribute{#1}{headuc}{true}%
   {%
     \GLSxtrfullpl[noindex,hyper=false]{#1}[]%
   }%
   {%
     \Glsxtrfullpl[noindex,hyper=false]{#1}[]%
   }%
 }%
}
\newrobustcmd*{\Glsxtrtitlefullpl}[1]{%
  \Glsxtrfullpl[noindex,hyper=false]{#1}[]%
}
\newrobustcmd*{\GLSxtrtitlefullpl}[1]{%
  \GLSxtrfullpl[noindex,hyper=false]{#1}[]%
}
\ifdef\texorpdfstring
{
  \newcommand*{\glsfmtshort}[1]{%
    \texorpdfstring
      {\glsxtrtitleshort{#1}}%
      {\glsentryshort{#1}}%
  }
}
{
  \newcommand*{\glsfmtshort}[1]{%
   \glsxtrtitleshort{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\glsfmtshortpl}[1]{%
    \texorpdfstring
      {\glsxtrtitleshortpl{#1}}%
      {\glsentryshortpl{#1}}%
  }
}
{
  \newcommand*{\glsfmtshortpl}[1]{%
   \glsxtrtitleshortpl{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\Glsfmtshort}[1]{%
    \texorpdfstring
      {\Glsxtrtitleshort{#1}}%
      {\glsentryshort{#1}}%
  }
}
{
  \newcommand*{\Glsfmtshort}[1]{%
   \Glsxtrtitleshort{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\Glsfmtshortpl}[1]{%
    \texorpdfstring
    {\Glsxtrtitleshortpl{#1}}%
    {\glsentryshortpl{#1}}%
  }
}
{
  \newcommand*{\Glsfmtshortpl}[1]{%
   \Glsxtrtitleshortpl{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\glsfmtname}[1]{%
    \texorpdfstring
    {\glsxtrtitlename{#1}}%
    {\glsentryname{#1}}%
  }
}
{
  \newcommand*{\glsfmtname}[1]{%
   \glsxtrtitlename{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\Glsfmtname}[1]{%
    \texorpdfstring
    {\Glsxtrtitlename{#1}}%
    {\glsentryname{#1}}%
  }
}
{
  \newcommand*{\Glsfmtname}[1]{%
   \Glsxtrtitlename{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\GLSfmtname}[1]{%
    \texorpdfstring
    {\GLSxtrtitlename{#1}}%
    {\glsentryname{#1}}%
  }
}
{
  \newcommand*{\GLSfmtname}[1]{%
   \GLSxtrtitlename{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\glsfmttext}[1]{%
    \texorpdfstring
    {\glsxtrtitletext{#1}}%
    {\glsentrytext{#1}}%
  }
}
{
  \newcommand*{\glsfmttext}[1]{%
   \glsxtrtitletext{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\Glsfmttext}[1]{%
    \texorpdfstring
    {\Glsxtrtitletext{#1}}%
    {\glsentrytext{#1}}%
  }
}
{
  \newcommand*{\Glsfmttext}[1]{%
   \Glsxtrtitletext{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\GLSfmttext}[1]{%
    \texorpdfstring
    {\GLSxtrtitletext{#1}}%
    {\glsentrytext{#1}}%
  }
}
{
  \newcommand*{\GLSfmttext}[1]{%
   \GLSxtrtitletext{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\glsfmtplural}[1]{%
    \texorpdfstring
    {\glsxtrtitleplural{#1}}%
    {\glsentryplural{#1}}%
  }
}
{
  \newcommand*{\glsfmtplural}[1]{%
   \glsxtrtitleplural{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\Glsfmtplural}[1]{%
    \texorpdfstring
    {\Glsxtrtitleplural{#1}}%
    {\glsentryplural{#1}}%
  }
}
{
  \newcommand*{\Glsfmtplural}[1]{%
   \Glsxtrtitleplural{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\GLSfmtplural}[1]{%
    \texorpdfstring
    {\GLSxtrtitleplural{#1}}%
    {\glsentryplural{#1}}%
  }
}
{
  \newcommand*{\GLSfmtplural}[1]{%
   \GLSxtrtitleplural{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\glsfmtfirst}[1]{%
    \texorpdfstring
    {\glsxtrtitlefirst{#1}}%
    {\glsentryfirst{#1}}%
  }
}
{
  \newcommand*{\glsfmtfirst}[1]{%
   \glsxtrtitlefirst{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\Glsfmtfirst}[1]{%
    \texorpdfstring
    {\Glsxtrtitlefirst{#1}}%
    {\glsentryfirst{#1}}%
  }
}
{
  \newcommand*{\Glsfmtfirst}[1]{%
   \Glsxtrtitlefirst{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\GLSfmtfirst}[1]{%
    \texorpdfstring
    {\GLSxtrtitlefirst{#1}}%
    {\glsentryfirst{#1}}%
  }
}
{
  \newcommand*{\GLSfmtfirst}[1]{%
   \Glsxtrtitlefirst{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\glsfmtfirstpl}[1]{%
    \texorpdfstring
    {\glsxtrtitlefirstplural{#1}}%
    {\glsentryfirstplural{#1}}%
  }
}
{
  \newcommand*{\glsfmtfirstpl}[1]{%
   \glsxtrtitlefirstplural{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\Glsfmtfirstpl}[1]{%
    \texorpdfstring
    {\Glsxtrtitlefirstplural{#1}}%
    {\glsentryfirstplural{#1}}%
  }
}
{
  \newcommand*{\Glsfmtfirstpl}[1]{%
   \Glsxtrtitlefirstplural{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\GLSfmtfirstpl}[1]{%
    \texorpdfstring
    {\GLSxtrtitlefirstplural{#1}}%
    {\glsentryfirstplural{#1}}%
  }
}
{
  \newcommand*{\GLSfmtfirstpl}[1]{%
   \GLSxtrtitlefirstplural{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\glsfmtlong}[1]{%
    \texorpdfstring
    {\glsxtrtitlelong{#1}}%
    {\glsentrylong{#1}}%
  }
}
{
  \newcommand*{\glsfmtlong}[1]{%
   \glsxtrtitlelong{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\Glsfmtlong}[1]{%
    \texorpdfstring
    {\Glsxtrtitlelong{#1}}%
    {\glsentrylong{#1}}%
  }
}
{
  \newcommand*{\Glsfmtlong}[1]{%
   \Glsxtrtitlelong{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\GLSfmtlong}[1]{%
    \texorpdfstring
    {\GLSxtrtitlelong{#1}}%
    {\glsentrylong{#1}}%
  }
}
{
  \newcommand*{\GLSfmtlong}[1]{%
   \GLSxtrtitlelong{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\glsfmtlongpl}[1]{%
    \texorpdfstring
    {\glsxtrtitlelongpl{#1}}%
    {\glsentrylongpl{#1}}%
  }
}
{
  \newcommand*{\glsfmtlongpl}[1]{%
   \glsxtrtitlelongpl{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\Glsfmtlongpl}[1]{%
    \texorpdfstring
    {\Glsxtrtitlelongpl{#1}}%
    {\glsentrylongpl{#1}}%
  }
}
{
  \newcommand*{\Glsfmtlongpl}[1]{%
   \Glsxtrtitlelongpl{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\GLSfmtlongpl}[1]{%
    \texorpdfstring
    {\GLSxtrtitlelongpl{#1}}%
    {\glsentrylongpl{#1}}%
  }
}
{
  \newcommand*{\GLSfmtlongpl}[1]{%
   \GLSxtrtitlelongpl{#1}}
}
\newcommand*{\glspdffmtfull}[1]{\glsentrylong{#1} (\glsentryshort{#1})}%
\newcommand*{\glspdffmtfullpl}[1]{\glsentrylongpl{#1} (\glsentryshortpl{#1})}%
\ifdef\texorpdfstring
{
  \newcommand*{\glsfmtfull}[1]{%
    \texorpdfstring
    {\glsxtrtitlefull{#1}}%
    {\glspdffmtfull{#1}}%
  }
}
{
  \newcommand*{\glsfmtfull}[1]{%
   \glsxtrtitlefull{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\Glsfmtfull}[1]{%
    \texorpdfstring
    {\Glsxtrtitlefull{#1}}%
    {\glspdffmtfull{#1}{}}%
  }
}
{
  \newcommand*{\Glsfmtfull}[1]{%
   \Glsxtrtitlefull{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\GLSfmtfull}[1]{%
    \texorpdfstring
    {\GLSxtrtitlefull{#1}}%
    {\glspdffmtfull{#1}}%
  }
}
{
  \newcommand*{\GLSfmtfull}[1]{%
   \GLSxtrtitlefull{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\glsfmtfullpl}[1]{%
    \texorpdfstring
    {\glsxtrtitlefullpl{#1}}%
    {\glspdffmtfullpl{#1}}%
  }
}
{
  \newcommand*{\glsfmtfullpl}[1]{%
   \glsxtrtitlefullpl{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\Glsfmtfullpl}[1]{%
    \texorpdfstring
    {\Glsxtrtitlefullpl{#1}}%
    {\glspdffmtfullpl{#1}{}}%
  }
}
{
  \newcommand*{\Glsfmtfullpl}[1]{%
   \Glsxtrtitlefullpl{#1}}
}
\ifdef\texorpdfstring
{
  \newcommand*{\GLSfmtfullpl}[1]{%
    \texorpdfstring
    {\GLSxtrtitlefullpl{#1}}%
    {\glspdffmtfullpl{#1}{}}%
  }
}
{
  \newcommand*{\GLSfmtfullpl}[1]{%
   \GLSxtrtitlefullpl{#1}}
}
\newcommand*{\multiglossaryentrysetup}[1]{\setkeys{glsxtrcombined}{#1}}
\newcommand*{\@gls@combined@indexmain}{1}
\define@choicekey{glsxtrcombined}{indexmain}%
 [\@gls@combined@indexmain@val\@gls@combined@indexmain]
 {false,true,first}[true]{}
\newcommand*{\@gls@combined@indexothers}{2}
\define@choicekey{glsxtrcombined}{indexothers}%
 [\@gls@combined@indexothers@val\@gls@combined@indexothers]
 {false,true,first}[true]{}
\newcommand*{\@gls@combined@hyper}{3}
\define@choicekey{glsxtrcombined}{hyper}%
 [\@gls@combined@hyper@val\@gls@combined@hyper]
 {none,allmain,mainonly,individual,otheronly,notmainfirst,nototherfirst,notfirst}{}
\newcommand*{\@gls@combined@encapmain}{glsnumberformat}
\define@key{glsxtrcombined}{encapmain}{%
 \renewcommand*{\@gls@combined@encapmain}{#1}%
}
\newcommand*{\@gls@combined@encapothers}{glsnumberformat}
\define@key{glsxtrcombined}{encapothers}{%
 \renewcommand*{\@gls@combined@encapothers}{#1}%
}
\newcommand*{\@gls@combined@textformat}{@firstofone}
\define@key{glsxtrcombined}{textformat}{%
 \renewcommand*{\@gls@combined@textformat}{#1}%
}
\newcommand*{\@gls@combined@category}{}
\define@key{glsxtrcombined}{category}{%
 \renewcommand*{\@gls@combined@category}{#1}%
}
\define@key{glsxtrcombinedpreopts}{category}{%
 \renewcommand*{\@gls@combined@category}{#1}%
}
\newcommand*{\@gls@combined@mglsopts}{}
\define@key{glsxtrcombined}{mglsopts}{%
 \renewcommand*{\@gls@combined@mglsopts}{#1}%
}
\define@key{glsxtrcombinedpreopts}{mglsopts}{%
 \@gls@combined@mglsopts@do
 {%
   \renewcommand*{\@gls@combined@mglsopts}{#1}%
 }%
}
\newcommand*{\@gls@combined@mglsopts@do}[1]{#1}
\newcommand*{\mgls@disable@mglsopts}{%
 \let\@gls@combined@mglsopts@do\@gls@combined@mglsopts@do@not
}
\newcommand*{\mgls@enable@mglsopts}{%
 \let\@gls@combined@mglsopts@do\@firstofone
}
\newcommand*{\@gls@combined@mglsopts@do@not}[1]{%
  \PackageError{glossaries-extra}{`mglsopts' key not permitted inside
   `setup' value}{}%
}
\newcommand*{\@gls@combined@firstprefix}{}
\define@key{glsxtrcombined}{firstprefix}{%
 \renewcommand*{\@gls@combined@firstprefix}{#1}%
}
\newcommand*{\@gls@combined@usedprefix}{}
\define@key{glsxtrcombined}{usedprefix}{%
 \renewcommand*{\@gls@combined@usedprefix}{#1}%
}
\newcommand*{\@gls@combined@firstsuffix}{}
\define@key{glsxtrcombined}{firstsuffix}{%
 \renewcommand*{\@gls@combined@firstsuffix}{#1}%
}
\newcommand*{\@gls@combined@usedsuffix}{}
\define@key{glsxtrcombined}{usedsuffix}{%
 \renewcommand*{\@gls@combined@usedsuffix}{#1}%
}
\define@boolkey{glsxtrcombined}{firstskipmain}[true]{}
\KV@glsxtrcombined@firstskipmainfalse
\define@boolkey{glsxtrcombined}{firstskipothers}[true]{}
\KV@glsxtrcombined@firstskipothersfalse
\define@boolkey{glsxtrcombined}{usedskipmain}[true]{}
\KV@glsxtrcombined@usedskipmainfalse
\define@boolkey{glsxtrcombined}{usedskipothers}[true]{}
\KV@glsxtrcombined@usedskipothersfalse
\newcommand*{\@gls@combined@postlinks@nr}{0}
\define@choicekey{glsxtrcombined}{postlinks}%
 [\@gls@combined@postlinks@val\@gls@combined@postlinks@nr]
 {none,all,notlast,mainnotlast,mainonly,othernotlast,otheronly}{}
\newcommand*{\@gls@combined@mpostlink@nr}{1}
\define@choicekey{glsxtrcombined}{mpostlink}%
 [\@gls@combined@mpostlink@val\@gls@combined@mpostlink@nr]
 {false,true,firstonly,usedonly}[true]{}
\newcommand*{\@gls@combined@mpostlinkelement@nr}{0}
\define@choicekey{glsxtrcombined}{mpostlinkelement}%
 [\@gls@combined@mpostlinkelement@val\@gls@combined@mpostlinkelement@nr]
 {last,main,custom}{}
\newcommand*{\glsxtrifmulti}[3]{\ifcsdef{@gls@combined@#1@main}{#2}{#3}}
\newcommand*{\glsxtrmultimain}[1]{\csuse{@gls@combined@#1@main}}
\newcommand*{\glsxtrmultilist}[1]{\csuse{@gls@combined@#1@list}}
\newcommand*{\glsxtrmultitotalelements}[1]{\csuse{@gls@combined@#1@total}}
\newcommand*{\glsxtrmultimainindex}[1]{\csuse{@gls@combined@#1@mainindex}}
\newcommand*{\glsxtrmultilastotherindex}[1]{\csuse{@gls@combined@#1@lastotherindex}}
\newif\ifmultiglossaryentryglobal
\multiglossaryentryglobalfalse
\newcount\mglselementindex
\newrobustcmd{\multiglossaryentry}[1][]{%
 \def\@gls@combined@current@opts{#1}%
 \ifnum\@glsxtr@docdefval=1\relax
  \let\@multi@glossentry@donext\@defmultiglossaryentry
 \else
  \let\@multi@glossentry@donext\@multiglossaryentry
 \fi
 \@multi@glossentry@donext
}
\newcommand*{\@multiglossaryentry}[1]{%
  \def\@gls@combined@current@label{#1}%
  \@multi@glossaryentry
}
\newcommand*{\@multi@glossaryentry}[2][]{%
  \ifcsdef{@gls@combined@\@gls@combined@current@label @main}%
  {\PackageError{glossaries-extra}%
    {Multi-entry label `\@gls@combined@current@label' already defined}%
    {}%
  }%
  {%
    \@multi@glossary@entry{#1}{#2}%
  }%
}
\newcommand*{\@defmultiglossaryentry}[1]{%
  \def\@gls@combined@current@label{#1}%
  \@def@multi@glossaryentry
}
\newcommand*{\@def@multi@glossaryentry}[2][]{%
  \let\@def@multi@glossaryentry@do\@multi@glossary@entry
  \ifundef\@glsxtr@docdefs@multilist
  {%
    \gdef\@glsxtr@docdefs@multilist{}%
    \listxadd
     {\@glsxtr@docdefs@multilist}{\expandonce\@gls@combined@current@label}%
  }%
  {%
    \xifinlist{\@gls@combined@current@label}{\@glsxtr@docdefs@multilist}%
    {%
      \PackageError{glossaries-extra}%
      {Multi-entry label `\@gls@combined@current@label' already defined}%
      {}%
      \let\@def@multi@glossaryentry@do\@gobbletwo
    }%
    {%
      \listxadd
       {\@glsxtr@docdefs@multilist}{\expandonce\@gls@combined@current@label}%
    }%
  }%
  \@def@multi@glossaryentry@do{#1}{#2}%
}
\newcommand*{\@multi@glossary@doifexists}{\glsdoifexists}
\newrobustcmd{\providemultiglossaryentry}[2][]{%
 \def\@gls@combined@current@opts{#1}%
 \def\@gls@combined@current@label{#2}%
 \ifcsdef{@gls@combined@\@gls@combined@current@label @main}%
 {\def\@multi@glossentry@donext{\@provide@multi@glossaryentry@noop}}%
 {%
   \ifnum\@glsxtr@docdefval=1\relax
    \def\@multi@glossentry@donext{\@def@multi@glossaryentry}%
   \else
    \def\@multi@glossentry@donext{\@multi@glossaryentry}%
   \fi
 }%
 \@multi@glossentry@donext
}
\newcommand*{\@provide@multi@glossaryentry@noop}[2][]{}
\newcommand*{\@multi@glossaryentry@list}{}
\newcommand*{\@multi@glossary@entry}[2]{%
  \protected@edef\@gls@combined@current@main{#1}%
  \protected@edef\@gls@combined@currentlist{#2}%
  \mglselementindex=0\relax
  \@for\@gls@tmp:=\@gls@combined@currentlist\do{%
    \advance\mglselementindex by 1\relax
    \@multi@glossary@doifexists{\@gls@tmp}{}%
    \let\@gls@combined@finalitem\@gls@tmp
    \ifdefvoid\@gls@combined@current@main
    {}%
    {%
      \ifx\@gls@combined@current@main\@gls@tmp
        \ifmultiglossaryentryglobal
          \global\cslet{@gls@combined@\@gls@combined@current@label @main}%
                \@gls@combined@current@main
          \csxdef{@gls@combined@\@gls@combined@current@label @mainindex}%
                 {\the\mglselementindex}%
        \else
          \cslet{@gls@combined@\@gls@combined@current@label @main}%
                \@gls@combined@current@main
          \csedef{@gls@combined@\@gls@combined@current@label @mainindex}%
                 {\the\mglselementindex}%
        \fi
      \else
        \ifmultiglossaryentryglobal
          \csxdef{@gls@combined@\@gls@combined@current@label @lastotherindex}%
                 {\the\mglselementindex}%
        \else
          \csedef{@gls@combined@\@gls@combined@current@label @lastotherindex}%
                 {\the\mglselementindex}%
        \fi
      \fi
    }%
  }%
  \ifmultiglossaryentryglobal
    \csxdef{@gls@combined@\@gls@combined@current@label @total}%
           {\the\mglselementindex}%
  \else
    \csedef{@gls@combined@\@gls@combined@current@label @total}%
           {\the\mglselementindex}%
  \fi
  \ifnum\mglselementindex<2\relax
     \PackageError{glossaries-extra}{At least 2 labels required in
       multi-entry element list (\number\mglselementindex\space found)}{}%
  \else
    \ifdefvoid\@gls@combined@current@main
    {}%
    {%
      \ifcsundef{@gls@combined@\@gls@combined@current@label @main}%
      {\PackageError{glossaries-extra}%
       {Main element `\@gls@combined@current@main' not found in list}%
       {The final element `\@gls@combined@finalitem' will be used instead}
       \let\@gls@combined@current@main\@empty
      }%
      {}%
    }%
    \ifdefvoid\@gls@combined@current@main
    {%
      \ifmultiglossaryentryglobal
        \global\cslet{@gls@combined@\@gls@combined@current@label @main}%
              \@gls@combined@finalitem
        \global\csletcs{@gls@combined@\@gls@combined@current@label @mainindex}%
          {@gls@combined@\@gls@combined@current@label @total}%
        \csxdef{@gls@combined@\@gls@combined@current@label @lastotherindex}%
               {\the\numexpr\mglselementindex-1 }%
      \else
        \cslet{@gls@combined@\@gls@combined@current@label @main}%
              \@gls@combined@finalitem
        \csletcs{@gls@combined@\@gls@combined@current@label @mainindex}%
          {@gls@combined@\@gls@combined@current@label @total}%
        \csedef{@gls@combined@\@gls@combined@current@label @lastotherindex}%
               {\the\numexpr\mglselementindex-1 }%
      \fi
    }%
    {}%
    \ifmultiglossaryentryglobal
      \global\cslet{@gls@combined@\@gls@combined@current@label @list}%
             \@gls@combined@currentlist
      \protected@csxdef{@gls@combined@\@gls@combined@current@label @options}%
       {\@gls@combined@current@opts}%
      \expandafter\@ifdefinable
       \csname if@gls@combined@\@gls@combined@current@label @flag\endcsname
       {\expandafter\global\expandafter
        \newif\csname if@gls@combined@\@gls@combined@current@label @flag\endcsname}%
      \expandafter\global
       \csname @gls@combined@\@gls@combined@current@label @flagfalse\endcsname
    \else
      \cslet{@gls@combined@\@gls@combined@current@label @list}%
             \@gls@combined@currentlist
      \protected@csedef{@gls@combined@\@gls@combined@current@label @options}%
       {\@gls@combined@current@opts}%
      \newboolean{@gls@combined@\@gls@combined@current@label @flag}%
      \csname @gls@combined@\@gls@combined@current@label @flagfalse\endcsname
    \fi
  \fi
  \writemultiglossentry
   {\@gls@combined@current@opts}{\@gls@combined@current@label}%
   {\csuse{@gls@combined@\@gls@combined@current@label @main}}{#2}%
  \ifmultiglossaryentryglobal
    \ifdefempty\@multi@glossaryentry@list
    {\let\@multi@glossaryentry@list\@gls@combined@current@label}%
    {%
      \eappto\@multi@glossaryentry@list{,\expandonce\@gls@combined@current@label}%
    }%
  \else
    \ifdefempty\@multi@glossaryentry@list
    {\global\let\@multi@glossaryentry@list\@gls@combined@current@label}%
    {%
      \xappto\@multi@glossaryentry@list{,\expandonce\@gls@combined@current@label}%
    }%
  \fi
}
\newcommand*{\@glsxtr@multientry}[4]{%
 \ifnum\@glsxtr@docdefval=1\relax
  \bgroup
    \def\@gls@combined@current@opts{#1}%
    \def\@gls@combined@current@label{#2}%
    \let\@multi@glossary@doifexists\@secondoftwo
    \let\writemultiglossentry\@gobblefour
    \multiglossaryentryglobaltrue
    \@multi@glossary@entry{#3}{#4}%
  \egroup
 \fi
}
\newcommand*{\writemultiglossentry}[4]{%
  \protected@write\@auxout{}{\string\@glsxtr@multientry{#1}{#2}{#3}{#4}}%
}
\newcommand*{\ifmglsused}[3]{%
 \ifbool{@gls@combined@#1@flag}{#2}{#3}%
}
\newcommand*{\mglsunset}[1]{%
 \gls@ifnotmeasuring
 {%
    \glsxtrifmulti{#1}{\@mglsunset{#1}}%
    {%
      \glsxtrundefaction{Multi entry `#1' hasn't been defined}%
      {You need to define `#1' with \string\multiglossaryentry}%
    }%
 }%
}
\newcommand*{\@mglsunset}[1]{%
 \expandafter\global\csname @gls@combined@#1@flagtrue\endcsname
}
\newcommand*{\mglsreset}[1]{%
 \gls@ifnotmeasuring
 {%
    \glsxtrifmulti{#1}{\@mglsreset{#1}}%
    {%
      \glsxtrundefaction{Multi entry `#1' hasn't been defined}%
      {You need to define `#1' with \string\multiglossaryentry}%
    }%
 }%
}
\newcommand*{\@mglsreset}[1]{%
 \expandafter\global\csname @gls@combined@#1@flagfalse\endcsname
}
\newcommand*{\mglslocalunset}[1]{%
 \gls@ifnotmeasuring
 {%
    \glsxtrifmulti{#1}{\@mglslocalunset{#1}}%
    {%
      \glsxtrundefaction{Multi entry `#1' hasn't been defined}%
      {You need to define `#1' with \string\multiglossaryentry}%
    }%
 }%
}
\newcommand*{\@mglslocalunset}[1]{%
 \csname @gls@combined@#1@flagtrue\endcsname
}
\newcommand*{\mglslocalreset}[1]{%
 \gls@ifnotmeasuring
 {%
    \glsxtrifmulti{#1}{\@mglslocalreset{#1}}%
    {%
      \glsxtrundefaction{Multi entry `#1' hasn't been defined}%
      {You need to define `#1' with \string\multiglossaryentry}%
    }%
 }%
}
\newcommand*{\@mglslocalreset}[1]{%
 \csname @gls@combined@#1@flagfalse\endcsname
}
\newcommand*{\mglsunsetall}{%
  \@for\@mgls@thislabel:=\@multi@glossaryentry@list\do{\mglsunset\@mgls@thislabel}%
}%
\newcommand*{\mglsresetall}{%
  \@for\@mgls@thislabel:=\@multi@glossaryentry@list\do{\mglsreset\@mgls@thislabel}%
}%
\newrobustcmd{\mglsSetMain}[2]{%
  \ifcsundef{@gls@combined@#1@main}%
  {\PackageError{glossaries-extra}{Multi-entry label `#1' not defined}{}}%
  {%
    \protected@edef\@gls@combined@current@main{#2}%
    \letcs\@gls@combined@currentlist{@gls@combined@#1@list}%
    \mglselementindex=0\relax
    \count@=0\relax
    \@for\@gls@tmp:=\@gls@combined@currentlist\do{%
      \advance\mglselementindex by 1\relax
      \ifx\@gls@combined@current@main\@gls@tmp
        \count@=\mglselementindex\relax
        \let\@gls@combined@finalitem\@gls@tmp
        \ifmultiglossaryentryglobal
          \global\cslet{@gls@combined@#1@main}\@gls@combined@current@main
          \csxdef{@gls@combined@#1@mainindex}{\the\mglselementindex}%
        \else
          \cslet{@gls@combined@#1@main}\@gls@combined@current@main
          \csedef{@gls@combined@#1@mainindex}{\the\mglselementindex}%
        \fi
      \else
        \ifmultiglossaryentryglobal
          \csxdef{@gls@combined@#1@lastotherindex}{\the\mglselementindex}%
        \else
          \csedef{@gls@combined@#1@lastotherindex}{\the\mglselementindex}%
        \fi
      \fi
    }%
    \ifnum\count@=0\relax
      \PackageError{glossaries-extra}{Label `#2' is not in `#1' set
       (\@gls@combined@currentlist)}{}%
      \ifmultiglossaryentryglobal
        \global\cslet{@gls@combined@#1@main}\@gls@combined@finalitem
        \csxdef{@gls@combined@#1@mainindex}{\the\mglselementindex}%
        \csxdef{@gls@combined@#1@lastotherindex}{%
          \number\numexpr\mglselementindex-1 }%
      \else
        \cslet{@gls@combined@#1@main}\@gls@combined@finalitem
        \csedef{@gls@combined@#1@mainindex}{\the\mglselementindex}%
        \csedef{@gls@combined@#1@lastotherindex}{%
          \number\numexpr\mglselementindex-1 }%
      \fi
    \fi
  }%
}
\newrobustcmd{\mglsSetOptions}[2]{%
  \ifcsundef{@gls@combined@#1@main}%
  {\PackageError{glossaries-extra}{Multi-entry label `#1' not defined}{}}%
  {%
    \csdef{@gls@combined@#1@options}{#2}%
  }%
}
\newrobustcmd{\mglsAddOptions}[2]{%
  \ifcsundef{@gls@combined@#1@main}%
  {\PackageError{glossaries-extra}{Multi-entry label `#1' not defined}{}}%
  {%
    \ifcsempty{@gls@combined@#1@options}%
    {\csdef{@gls@combined@#1@options}{#2}}%
    {\csappto{@gls@combined@#1@options}{,#2}}%
  }%
}
\newcommand*{\@mgls@all}{}
\define@key{mgls}{all}{\renewcommand*{\@mgls@all}{#1}}
\newcommand*{\@mgls@main}{}
\define@key{mgls}{main}{\renewcommand*{\@mgls@main}{#1}}
\newcommand*{\@mgls@others}{}
\define@key{mgls}{others}{\renewcommand*{\@mgls@others}{#1}}
\newcommand*{\@mgls@setup}{}
\define@key{mgls}{setup}{%
 \@mgls@setup@do{\renewcommand*{\@mgls@setup}{#1}}%
}
\newcommand*{\@mgls@setup@do}[1]{#1}
\newcommand*{\@mgls@setup@do@not}[1]{%
  \PackageError{glossaries-extra}{`setup' key not permitted inside
   `mglsopts' value}{}%
}
\newcommand*{\mgls@disable@setup}{%
  \let\@mgls@setup@do\@mgls@setup@do@not
}
\newcommand*{\mgls@enable@setup}{%
  \let\@mgls@setup@do\@firstofone
}
\newcommand\@mgls@unsetaction{0}
\define@choicekey{mgls}{multiunset}[\@mgls@unsetaction@val\@mgls@unsetaction]%
 {global,local,none}{}
\define@boolkey{mgls}{presetlocal}[true]{}
\KV@mgls@presetlocalfalse
\newcommand*{\@mgls@hyper}{}
\define@choicekey{mgls}{hyper}[\@mgls@hyper@val\@mgls@hyper@nr]{true,false}[true]%
{%
  \renewcommand*{\@mgls@hyper}{hyper=#1}%
  \ifnum\@mgls@hyper@nr=1\relax
   \let\@mgls@hyperlink\@secondoftwo
  \else
   \let\@mgls@hyperlink\@@mgls@hyperlink
  \fi
}
\newcommand*{\@@mgls@hyperlink}[2]{%
  \ifx\@glslink\glsdonohyperlink
   #2%
  \else
   \glsxtr@org@dohyperlink{\glolinkprefix#1}{#2}%
  \fi
}
\let\@mgls@hyperlink\@@mgls@hyperlink
\newcommand*{\mglsforelements}[3]{%
  \expandafter\@for\expandafter#2\expandafter:\expandafter
    =\csname @gls@combined@#1@list\endcsname\do{#3}%
}
\newcommand*{\mglsforotherelements}[3]{%
  \expandafter\@for\expandafter#2\expandafter:\expandafter
    =\csname @gls@combined@#1@list\endcsname\do
  {\expandafter\ifdefequal\csname @gls@combined@#1@main\endcsname{#2}{}{#3}}%
}
\newcommand*{\mglsunsetothers}[1]{%
  \mglsforotherelements{#1}{\@gls@tmp}{\glsunset{\@gls@tmp}}%
}
\newcommand*{\mglslocalunsetothers}[1]{%
  \mglsforotherelements{#1}{\@gls@tmp}{\glslocalunset{\@gls@tmp}}%
}
\newcommand*{\mglselementreset}[1]{%
 \ifKV@mgls@presetlocal
  \glslocalreset{#1}%
 \else
  \glsreset{#1}%
 \fi
}
\newcommand*{\mglselementunset}[1]{%
 \ifKV@mgls@presetlocal
  \glslocalunset{#1}%
 \else
  \glsunset{#1}%
 \fi
}
\newcommand*{\@mgls@resetall}{}
\define@choicekey{mgls}{resetall}%
[\@mgls@resetall@val\@mgls@resetall@nr]{false,true}[true]%
{%
 \ifcase\@mgls@resetall@nr\relax
   \renewcommand*{\@mgls@resetall}{}%
 \or
   \renewcommand*{\@mgls@resetall}{%
     \@for\@gls@resetlabel:=\mglscurrentlist\do{\mglselementreset\@gls@resetlabel}}%
   \renewcommand*{\@mgls@unsetall}{}%
 \fi
}
\newcommand*{\@mgls@resetmain}{}
\define@choicekey{mgls}{resetmain}
[\@mgls@resetmain@val\@mgls@resetmain@nr]{false,true}[true]%
{%
 \ifcase\@mgls@resetmain@nr\relax
   \renewcommand*{\@mgls@resetmain}{}%
 \or
   \renewcommand*{\@mgls@resetmain}{\mglselementreset\mglscurrentmainlabel}%
   \renewcommand*{\@mgls@unsetmain}{}%
 \fi
}
\newcommand*{\@mgls@resetothers}{}
\define@choicekey{mgls}{resetothers}
[\@mgls@resetothers@val\@mgls@resetothers@nr]{false,true}[true]%
{%
 \ifcase\@mgls@resetothers@nr\relax
   \renewcommand*{\@mgls@resetothers}{}%
 \or
   \renewcommand*{\@mgls@resetothers}{%
     \@for\@gls@resetlabel:=\mglscurrentlist\do{%
       \ifx\@gls@resetlabel\mglscurrentmainlabel
       \else
         \mglselementreset\@gls@resetlabel
       \fi
     }%
   }%
   \renewcommand*{\@mgls@unsetothers}{}%
 \fi
}
\newcommand*{\@mgls@unsetall}{}
\define@choicekey{mgls}{unsetall}%
[\@mgls@unsetall@val\@mgls@unsetall@nr]{false,true}[true]%
{%
 \ifcase\@mgls@unsetall@nr\relax
   \renewcommand*{\@mgls@unsetall}{}%
 \or
   \renewcommand*{\@mgls@unsetall}{%
     \@for\@gls@unsetlabel:=\mglscurrentlist\do{\mglselementunset\@gls@unsetlabel}}%
   \renewcommand*{\@mgls@resetall}{}%
 \fi
}
\newcommand*{\@mgls@unsetmain}{}
\define@choicekey{mgls}{unsetmain}
[\@mgls@unsetmain@val\@mgls@unsetmain@nr]{false,true}[true]%
{%
 \ifcase\@mgls@unsetmain@nr\relax
   \renewcommand*{\@mgls@unsetmain}{}%
 \or
   \renewcommand*{\@mgls@unsetmain}{\mglselementunset\mglscurrentmainlabel}%
   \renewcommand*{\@mgls@resetmain}{}%
 \fi
}
\newcommand*{\@mgls@unsetothers}{}
\define@choicekey{mgls}{unsetothers}
[\@mgls@unsetothers@val\@mgls@unsetothers@nr]{false,true}[true]%
{%
 \ifcase\@mgls@unsetothers@nr\relax
   \renewcommand*{\@mgls@unsetothers}{}%
 \or
   \renewcommand*{\@mgls@unsetothers}{%
     \@for\@gls@unsetlabel:=\mglscurrentlist\do{%
       \ifx\@gls@unsetlabel\mglscurrentmainlabel
       \else
         \mglselementunset\@gls@unsetlabel
       \fi
     }%
   }%
   \renewcommand*{\@mgls@resetothers}{}%
 \fi
}
\newcommand{\glsxtr@setup@docurrent}{%
 \ifx\mglscurrentlabel\mglscurrentmainlabel
   \mglsisfirstuse
   {%
     \ifKV@glsxtrcombined@firstskipmain
       \let\@mgls@do@current@element\@gobble
     \else
       \let\@mgls@do@current@element\@firstofone
     \fi
   }%
   {%
     \ifKV@glsxtrcombined@usedskipmain
       \let\@mgls@do@current@element\@gobble
     \else
       \let\@mgls@do@current@element\@firstofone
     \fi
   }%
 \else
   \mglsisfirstuse
   {%
     \ifKV@glsxtrcombined@firstskipothers
       \let\@mgls@do@current@element\@gobble
     \else
       \let\@mgls@do@current@element\@firstofone
     \fi
   }%
   {%
     \ifKV@glsxtrcombined@usedskipothers
       \let\@mgls@do@current@element\@gobble
     \else
       \let\@mgls@do@current@element\@firstofone
     \fi
   }%
 \fi
}
\newcommand*{\glsxtr@mgls@checklastelement}[2]{%
  \ifbool{KV@glsxtrcombined@#1skipmain}%
  {%
    \ifbool{KV@glsxtrcombined@#1skipothers}%
    {%
    }%
    {%
      \ifnum\mglselementindex=\glsxtrmultilastotherindex{#2}\relax
        \let\mglsiflast\@firstoftwo
      \else
        \let\mglsiflast\@secondoftwo
      \fi
    }%
  }%
  {%
     \ifbool{KV@glsxtrcombined@#1skipothers}%
     {%
       \ifnum\mglselementindex=\glsxtrmultimainindex{#2}\relax
         \let\mglsiflast\@firstoftwo
       \else
         \let\mglsiflast\@secondoftwo
       \fi
     }%
     {%
       \let\mglsiflast\@secondoftwo
     }%
  }%
}
\newcommand{\glsxtrmglsWarnAllSkipped}[3]{%
  \GlossariesExtraWarning{#1}%
  #3{#2}%
}
\newcommand*{\glsxtr@mgls@applyopts}[1]{%
  \edef\@mgls@dooptions{\noexpand\setkeys*{mgls}{\expandonce#1}}%
  \@mgls@dooptions
  \ifdefvoid\XKV@rm{}{\eappto\@mgls@all{,\expandonce\XKV@rm}}%
  \ifdefvoid\@mgls@setup
  {}%
  {%
    \edef\@mgls@dooptions{%
       \noexpand\setkeys*{glsxtrcombinedpreopts}{\expandonce\@mgls@setup}}%
    \mgls@disable@mglsopts
    \@mgls@dooptions
    \mgls@enable@mglsopts
    \ifx\@mgls@setupoptions\@empty
      \let\@mgls@setupoptions\XKV@rm
    \else
      \eappto\@mgls@setupoptions{,\expandonce\XKV@rm}%
    \fi
  }%
  \@mgls@resetall
  \@mgls@unsetall
  \@mgls@resetmain
  \@mgls@unsetmain
  \@mgls@resetothers
  \@mgls@unsetothers
  \let\@mgls@resetall\@empty
  \let\@mgls@resetmain\@empty
  \let\@mgls@resetothers\@empty
  \let\@mgls@unsetall\@empty
  \let\@mgls@unsetmain\@empty
  \let\@mgls@unsetothers\@empty
  \ifmglsused\mglscurrentmultilabel
  {\let\mglsisfirstuse\@secondoftwo}%
  {\let\mglsisfirstuse\@firstoftwo}%
}
\providecommand{\@firstofthree}[3]{#1}
\providecommand{\@secondofthree}[3]{#2}
\providecommand{\@thirdofthree}[3]{#3}
\newcommand*{\glsxtr@mgls@inner}[7]{%
 \let\mglslastmainlabel\@empty
 \let\mglsiflastmainwasfirstuse\@firstoftwo
 \let\mglsiflastmainwasplural\@secondoftwo
 \let\mglsiflastmaincapscase\@firstofthree
 \let\mglsiflastmainskipped\@firstoftwo
 \bgroup
 \ifcsundef{@gls@combined@#2@main}%
 {%
   \glsxtrundefaction{Multi entry `#2' hasn't been defined}%
   {You need to define `#2' with \string\multiglossaryentry}%
   \gdef\@mgls@post@hookdefs{%
     \protected@edef\mglslastmultilabel{#2}%
     \let\mglswasfirstuse\@firstoftwo
     \let\mglslastcategory\@empty
     \let\mglsiflastelementskipped\@firstoftwo
     \let\mglsiflastelementwasfirstuse\@firstoftwo
     \let\mglsiflastelementwasplural\@secondoftwo
     \let\mglsiflastelementcapscase\@firstofthree
     \let\mglslastelementlabel\@empty
     \let\mgls@do@postlinkhook\relax
   }%
 }%
 {%
   \protected@edef\mglscurrentmultilabel{#2}%
   \letcs\mglscurrentmainlabel{@gls@combined@#2@main}%
   \letcs\mglscurrentlist{@gls@combined@#2@list}%
   \letcs\mglscurrentoptions{@gls@combined@#2@options}%
   \ifmglsused\mglscurrentmultilabel
   {\let\mglsisfirstuse\@secondoftwo}%
   {\let\mglsisfirstuse\@firstoftwo}%
   \edef\@mgls@dooptions{%
      \noexpand\setkeys*{glsxtrcombinedpreopts}{\expandonce\mglscurrentoptions}}%
   \@mgls@dooptions
   \let\@mgls@setupoptions\XKV@rm
   \mgls@disable@setup
   \ifdefvoid\@gls@combined@mglsopts
   {}%
   {\glsxtr@mgls@applyopts\@gls@combined@mglsopts}%
   \mgls@enable@setup
   \ifstrempty{#1}{}{\def\@mgls@options{#1}\glsxtr@mgls@applyopts\@mgls@options}%
   \ifx\@gls@combined@category\empty
   \else
     \glshascategoryattribute{\@gls@combined@category}{multioptions}%
     {%
       \letcs\@mgls@attroptions{@glsxtr@categoryattr@@\@gls@combined@category
           @multioptions}%
       \let\@gls@combined@mglsopts\@empty
       \edef\@mgls@dooptions{%
         \noexpand\setkeys*{glsxtrcombinedpreopts}{\expandonce\@mgls@attroptions}}%
       \@mgls@dooptions
       \eappto\@mgls@setupoptions{,\expandonce\XKV@rm}%
       \ifx\@gls@combined@mglsopts\@empty
       \else
         \let\@mgls@setup\@empty
         \mgls@disable@setup
         \glsxtr@mgls@applyopts\@gls@combined@mglsopts
         \mgls@enable@setup
       \fi
     }%
     {}%
   \fi
   \edef\@mgls@dooptions{%
      \noexpand\setkeys{glsxtrcombined}{\expandonce\@mgls@setupoptions}}%
   \@mgls@dooptions
   \let\mglscurrentcategory\@gls@combined@category
   \ifnum\@gls@combined@hyper=1\relax
     \def\@mgls@combinedlink{\@mgls@hyperlink{\mglscurrentmainlabel}}%
   \else
     \def\@mgls@combinedlink{\@firstofone}%
   \fi
   \def\@gls@combined@encapsulator##1{%
       \@mgls@combinedlink{\csuse{\@gls@combined@textformat}{##1}}}%
   \let\@mgls@do@current@element\@firstofone
   \mglsisfirstuse
   {%
     \ifKV@glsxtrcombined@firstskipmain
       \ifKV@glsxtrcombined@firstskipothers
         \let\@gls@org@combined@encapsulator\@gls@combined@encapsulator
         \def\@gls@combined@encapsulator##1{%
           \glsxtrmglsWarnAllSkipped{All elements skipped for
             first use of multi-entry `#2'}{#3}%
             {\@gls@org@combined@encapsulator}%
         }%
         \let\@mgls@do@current@element\@gobble
       \fi
     \fi
   }%
   {%
     \ifKV@glsxtrcombined@usedskipmain
       \ifKV@glsxtrcombined@usedskipothers
         \let\@gls@org@combined@encapsulator\@gls@combined@encapsulator
         \def\@gls@combined@encapsulator##1{%
           \glsxtrmglsWarnAllSkipped{All elements skipped for
             subsequent use of multi-entry `#2'}{#3}%
             {\@gls@org@combined@encapsulator}%
         }%
         \let\@mgls@do@current@element\@gobble
       \fi
     \fi
   }%
   \mglsisfirstuse
   {%
     \let\mglscurrentprefix\@gls@combined@firstprefix
     \let\mglscurrentsuffix\@gls@combined@firstsuffix
   }%
   {%
     \let\mglscurrentprefix\@gls@combined@usedprefix
     \let\mglscurrentsuffix\@gls@combined@usedsuffix
   }%
   \xdef\@mgls@post@hookdefs{%
    \noexpand\def\noexpand\mglslastmultilabel{\expandonce\mglscurrentmultilabel}%
    \noexpand\def\noexpand\mglslastcategory{\mglscurrentcategory}%
   }%
   \ifx\@mgls@do@current@element\@gobble
     \gappto\@mgls@post@hookdefs{%
       \let\mglsiflastelementskipped\@firstoftwo
       \let\mglslastelementlabel\@empty
       \let\mglsiflastelementwasfirstuse\@firstoftwo
       \let\mglsiflastelementwasplural\@secondoftwo
       \let\mglsiflastelementcapscase\@firstofthree
     }%
   \fi
   \mglsisfirstuse
   {%
     \gappto\@mgls@post@hookdefs{\let\mglswasfirstuse\@firstoftwo}%
     \ifcase\@gls@combined@mpostlink@nr\relax
       \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\relax}%
     \or
       \ifcase\@gls@combined@mpostlinkelement@nr\relax
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastelementpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastmainpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglscustompostlinkhook}%
       \fi
     \or
       \ifcase\@gls@combined@mpostlinkelement@nr\relax
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastelementpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastmainpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglscustompostlinkhook}%
       \fi
     \or
       \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\relax}%
     \fi
   }%
   {%
     \gappto\@mgls@post@hookdefs{\let\mglswasfirstuse\@secondoftwo}%
     \ifcase\@gls@combined@mpostlink@nr\relax
       \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\relax}%
     \or
       \ifcase\@gls@combined@mpostlinkelement@nr\relax
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastelementpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastmainpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglscustompostlinkhook}%
       \fi
     \or
       \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\relax}%
     \or
       \ifcase\@gls@combined@mpostlinkelement@nr\relax
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastelementpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglslastmainpostlinkhook}%
       \or
         \gappto\@mgls@post@hookdefs{\let\mgls@do@postlinkhook\mglscustompostlinkhook}%
       \fi
     \fi
   }%
   \let\mgls@org@postlinkhook\glspostlinkhook
   \mglsprefix
   \let\mglslastelementlabel\@empty
   \@gls@combined@encapsulator
   {%
    \def\@mgls@previouslabel{}%
    \mglselementindex=0\relax
    \@for\mglscurrentlabel:=\mglscurrentlist\do{%
     \advance\mglselementindex by 1\relax
     \glsxtr@setup@docurrent
     \ifx\@xfor@nextelement\@nnil
       \let\mglsiflast\@firstoftwo
     \else
       \let\mglsiflast\@secondoftwo
       \mglsisfirstuse
       {%
        \glsxtr@mgls@checklastelement{first}{#2}%
       }%
       {%
        \glsxtr@mgls@checklastelement{used}{#2}%
       }%
     \fi
     \ifcase\@gls@combined@postlinks@nr\relax
       \let\glspostlinkhook\relax
     \or
       \let\glspostlinkhook\mgls@org@postlinkhook
     \or
       \mglsiflast
       {%
         \let\glspostlinkhook\relax
       }%
       {%
         \let\glspostlinkhook\mgls@org@postlinkhook
       }%
     \or
       \ifx\mglscurrentlabel\mglscurrentmainlabel
         \mglsiflast
         {%
           \let\glspostlinkhook\relax
         }%
         {%
           \let\glspostlinkhook\mgls@org@postlinkhook
         }%
       \else
         \let\glspostlinkhook\relax
       \fi
     \or
       \ifx\mglscurrentlabel\mglscurrentmainlabel
         \let\glspostlinkhook\mgls@org@postlinkhook
       \else
         \let\glspostlinkhook\relax
       \fi
     \or
       \ifx\mglscurrentlabel\mglscurrentmainlabel
         \let\glspostlinkhook\relax
       \else
         \mglsiflast
         {%
           \let\glspostlinkhook\relax
         }%
         {%
           \let\glspostlinkhook\mgls@org@postlinkhook
         }%
       \fi
     \or
       \ifx\mglscurrentlabel\mglscurrentmainlabel
         \let\glspostlinkhook\relax
       \else
         \let\glspostlinkhook\mgls@org@postlinkhook
       \fi
     \fi
     \mglsiflast
     {%
       \xappto\@mgls@post@hookdefs{%
         \noexpand\def\noexpand\mglslastelementlabel
           {\expandonce\mglscurrentlabel}}%
     }%
     {}%
     \@mgls@do@current@element
     {%
       \mglselementprehook
       \GlsXtrIfUnusedOrUndefined{\mglscurrentlabel}%
       {\let\@mgls@current@iffirstuse\@firstoftwo}%
       {\let\@mgls@current@iffirstuse\@secondoftwo}%
       \ifx\mglscurrentlabel\mglscurrentmainlabel
         \edef\@mgls@current@options{format=\@gls@combined@encapmain}%
         \ifcase\@gls@combined@indexmain
          \appto\@mgls@current@options{,noindex}%
         \or
          \appto\@mgls@current@options{,noindex=false}%
         \or
          \@mgls@current@iffirstuse
          {\appto\@mgls@current@options{,noindex=false}}%
          {\appto\@mgls@current@options{,noindex}}%
         \fi
         \ifcase\@gls@combined@hyper\relax
           \appto\@mgls@current@options{,hyper=false}% none
         \or
           \appto\@mgls@current@options{,hyper=false}% allmain
         \or
           \eappto\@mgls@current@options{,\@mgls@hyper}% mainonly
         \or
           \eappto\@mgls@current@options{,\@mgls@hyper}% individual
         \or
           \appto\@mgls@current@options{,hyper=false}% otheronly
         \or
          \mglsisfirstuse
          {%
           \appto\@mgls@current@options{,hyper=false}% notmainfirst
          }%
          {%
           \eappto\@mgls@current@options{,\@mgls@hyper}% notmainfirst
          }%
         \or
           \eappto\@mgls@current@options{,\@mgls@hyper}% nototherfirst
         \or
          \mglsisfirstuse
          {%
           \appto\@mgls@current@options{,hyper=false}% notfirst
          }%
          {%
           \eappto\@mgls@current@options{,\@mgls@hyper}% notfirst
          }%
         \fi
         \eappto\@mgls@current@options{,\@mgls@all,\@mgls@main}%
       \else
         \edef\@mgls@current@options{format=\@gls@combined@encapothers}%
         \ifcase\@gls@combined@indexothers\relax
          \appto\@mgls@current@options{,noindex}%
         \or
          \appto\@mgls@current@options{,noindex=false}%
         \or
          \@mgls@current@iffirstuse
          {\appto\@mgls@current@options{,noindex=false}}%
          {\appto\@mgls@current@options{,noindex}}%
         \fi
         \ifcase\@gls@combined@hyper\relax
           \appto\@mgls@current@options{,hyper=false}% none
         \or
           \appto\@mgls@current@options{,hyper=false}% allmain
         \or
           \appto\@mgls@current@options{,hyper=false}% mainonly
         \or
           \eappto\@mgls@current@options{,\@mgls@hyper}% individual
         \or
           \eappto\@mgls@current@options{,\@mgls@hyper}% otheronly
         \or
           \eappto\@mgls@current@options{,\@mgls@hyper}% notmainfirst
         \or
          \mglsisfirstuse
          {%
           \appto\@mgls@current@options{,hyper=false}% nototherfirst
          }%
          {%
           \eappto\@mgls@current@options{,\@mgls@hyper}% nototherfirst
          }%
         \or
          \mglsisfirstuse
          {%
           \appto\@mgls@current@options{,hyper=false}% notfirst
          }%
          {%
           \eappto\@mgls@current@options{,\@mgls@hyper}% notfirst
          }%
         \fi
         \eappto\@mgls@current@options{,\@mgls@all,\@mgls@others}%
       \fi
       \ifx\@mgls@previouslabel\empty
        \ifx\mglscurrentlabel\mglscurrentmainlabel
          \let\@mgls@cs#6\relax
        \else
          \let\@mgls@cs#4\relax
        \fi
       \else
         \@mgls@previous@iffirstuse
         {%
           \@mgls@current@iffirstuse
           {\glscombinedfirstsepfirst{\@mgls@previouslabel}{\mglscurrentlabel}}%
           {\glscombinedfirstsep{\@mgls@previouslabel}{\mglscurrentlabel}}%
         }%
         {%
           \@mgls@current@iffirstuse
           {\glscombinedsepfirst{\@mgls@previouslabel}{\mglscurrentlabel}}%
           {\glscombinedsep{\@mgls@previouslabel}{\mglscurrentlabel}}%
         }%
        \ifx\mglscurrentlabel\mglscurrentmainlabel
          \let\@mgls@cs#7\relax
        \else
          \let\@mgls@cs#5\relax
        \fi
       \fi
       \mglsiflast
        {\expandafter\@mgls@cs\expandafter{\@mgls@current@options}{\mglscurrentlabel}[#3]}%
        {\expandafter\@mgls@cs\expandafter{\@mgls@current@options}{\mglscurrentlabel}[]}%
       \ifx\mglscurrentlabel\mglscurrentmainlabel
        \xappto\@mgls@post@hookdefs{%
          \noexpand\def\noexpand\mglslastmainlabel
            {\expandonce\mglscurrentmainlabel}%
        }%
        \glsxtrifwasfirstuse
        {%
         \gappto\@mgls@post@hookdefs{\let\mglsiflastmainwasfirstuse\@firstoftwo}%
        }%
        {%
         \gappto\@mgls@post@hookdefs{\let\mglsiflastmainwasfirstuse\@secondoftwo}%
        }%
        \glsifplural
        {%
         \gappto\@mgls@post@hookdefs{\let\mglsiflastmainwasplural\@firstoftwo}%
        }%
        {%
         \gappto\@mgls@post@hookdefs{\let\mglsiflastmainwasplural\@secondoftwo}%
        }%
        \glscapscase
        {%
          \gappto\@mgls@post@hookdefs{%
            \let\mglsiflastmaincapscase\@firstofthree
          }%
        }%
        {%
          \gappto\@mgls@post@hookdefs{%
            \let\mglsiflastmaincapscase\@secondofthree
          }%
        }%
        {%
          \gappto\@mgls@post@hookdefs{%
            \let\mglsiflastmaincapscase\@thirdofthree
          }%
        }%
       \fi
       \let\@mgls@previouslabel\mglscurrentlabel
       \let\@mgls@previous@iffirstuse\@mgls@current@iffirstuse
      }%
       \mglselementposthook
    }%
    \ifx\mglslastmainlabel\@empty
     \gappto\@mgls@post@hookdefs{\let\mglsiflastmainskipped\@firstoftwo}%
    \else
     \gappto\@mgls@post@hookdefs{\let\mglsiflastmainskipped\@secondoftwo}%
    \fi
    \ifx\@mgls@do@current@element\@gobble
     \gappto\@mgls@post@hookdefs{\let\mglsiflastelementskipped\@firstoftwo}%
    \else
     \gappto\@mgls@post@hookdefs{\let\mglsiflastelementskipped\@secondoftwo}%
    \fi
    \glsxtrifwasfirstuse
    {%
     \gappto\@mgls@post@hookdefs{\let\mglsiflastelementwasfirstuse\@firstoftwo}%
    }%
    {%
     \gappto\@mgls@post@hookdefs{\let\mglsiflastelementwasfirstuse\@secondoftwo}%
    }%
    \glsifplural
    {%
     \gappto\@mgls@post@hookdefs{\let\mglsiflastelementwasplural\@firstoftwo}%
    }%
    {%
     \gappto\@mgls@post@hookdefs{\let\mglsiflastelementwasplural\@secondoftwo}%
    }%
    \glscapscase
    {%
      \gappto\@mgls@post@hookdefs{%
        \let\mglsiflastelementcapscase\@firstofthree
      }%
    }%
    {%
      \gappto\@mgls@post@hookdefs{%
        \let\mglsiflastelementcapscase\@secondofthree
      }%
    }%
    {%
      \gappto\@mgls@post@hookdefs{%
        \let\mglsiflastelementcapscase\@thirdofthree
      }%
    }%
   }%
   \@mgls@post@hookdefs
   \mglssuffix
   \ifcase\@mgls@unsetaction\relax
     \xappto\@mgls@post@hookdefs{%
       \noexpand\mglsunset{\expandonce\mglscurrentmultilabel}}%
   \or
     \xappto\@mgls@post@hookdefs{%
       \noexpand\mglslocalunset{\expandonce\mglscurrentmultilabel}}%
   \fi
 }%
 \glsxtrmglswrite{#2}%
 \egroup
 \@mgls@post@hookdefs
 \mgls@do@postlinkhook
}
\newcommand*{\mglscustompostlinkhook}{}
\newcommand*{\mglslastelementpostlinkhook}{%
 \let\glsxtrifwasfirstuse\mglsiflastelementwasfirstuse
 \let\glsifplural\mglsiflastelementwasplural
 \let\glscapscase\mglsiflastelementcapscase
 \let\glslabel\mglslastelementlabel
 \glspostlinkhook
}
\newcommand*{\mglslastmainpostlinkhook}{%
 \let\glsxtrifwasfirstuse\mglsiflastmainwasfirstuse
 \let\glsifplural\mglsiflastmainwasplural
 \let\glscapscase\mglsiflastmaincapscase
 \let\glslabel\mglslastmainlabel
 \glspostlinkhook
}
\newcommand*{\mglsdefcategoryprefix}[2]{%
 \csdef{mglsprefix@#1}{#2}%
}
\newcommand*{\mglshascategoryprefix}[3]{%
 \ifcsdef{mglsprefix@#1}{#2}{#3}%
}
\newcommand*{\mglsusecategoryprefix}[1]{%
 \csuse{mglsprefix@#1}%
}
\newcommand*{\mglsprefix}{%
 \ifdefempty\mglscurrentcategory
 {\mglscurrentprefix}%
 {%
   \mglshascategoryprefix{\mglscurrentcategory}%
   {\mglsusecategoryprefix{\mglscurrentcategory}}%
   {\mglscurrentprefix}%
 }%
}
\newcommand*{\mglsdefcategorysuffix}[2]{%
 \csdef{mglssuffix@#1}{#2}%
}
\newcommand*{\mglshascategorysuffix}[3]{%
 \ifcsdef{mglssuffix@#1}{#2}{#3}%
}
\newcommand*{\mglsusecategorysuffix}[1]{%
 \csuse{mglssuffix@#1}%
}
\newcommand*{\mglssuffix}{%
 \ifdefempty\mglscurrentcategory
 {\ifdefempty{\mglscurrentsuffix}{}{\space(\mglscurrentsuffix)}}%
 {%
   \mglshascategorysuffix{\mglscurrentcategory}%
   {\mglsusecategorysuffix{\mglscurrentcategory}}%
   {\ifdefempty{\mglscurrentsuffix}{}{\space(\mglscurrentsuffix)}}%
 }%
}
\newcommand*{\mglselementprehook}{}
\newcommand*{\mglselementposthook}{}
\newcommand*{\glscombinedsep}[2]{%
  \glshasattribute{#1}{combinedsep}%
  {\glsgetattribute{#1}{combinedsep}}%
  { }%
}
\newcommand*{\glscombinedfirstsepfirst}[2]{%
  \glshasattribute{#1}{combinedfirstsepfirst}%
  {\glsgetattribute{#1}{combinedfirstsepfirst}}%
  {\glscombinedsep{#1}{#2}}%
}
\newcommand*{\glscombinedfirstsep}[2]{%
  \glshasattribute{#1}{combinedfirstsep}%
  {\glsgetattribute{#1}{combinedfirstsep}}%
  {\glscombinedsep{#1}{#2}}%
}
\newcommand*{\glscombinedsepfirst}[2]{%
  \glshasattribute{#1}{combinedsepfirst}%
  {\glsgetattribute{#1}{combinedsepfirst}}%
  {\glscombinedsep{#1}{#2}}%
}
\newcommand*{\glssetcombinedsepabbrvnbsp}{%
 \renewcommand*{\glscombinedsep}[2]{%
  \glshasattribute{##1}{combinedsep}%
  {\glsgetattribute{##1}{combinedsep}}%
  {\ifhasshort{##1}{~}{ }}%
 }%
 \renewcommand*{\glscombinedsepfirst}[2]{%
  \glshasattribute{##1}{combinedsepfirst}%
  {\glsgetattribute{##1}{combinedsepfirst}}%
  {\ifhasshort{##1}{~}{ }}%
 }%
 \renewcommand*{\glscombinedfirstsep}[2]{%
  \glshasattribute{##1}{combinedfirstsep}%
  {\glsgetattribute{##1}{combinedfirstsep}}%
  { }%
 }%
 \renewcommand*{\glscombinedfirstsepfirst}[2]{%
  \glshasattribute{##1}{combinedfirstsepfirst}%
  {\glsgetattribute{##1}{combinedfirstsepfirst}}%
  { }%
 }%
}
\newcommand*{\glssetcombinedsepabbrvnone}{%
 \renewcommand*{\glscombinedsep}[2]{%
   \glshasattribute{##1}{combinedsep}%
   {\glsgetattribute{##1}{combinedsep}}%
   {\ifhasshort{##1}{}{\ifhasshort{##2}{}{ }}}%
 }%
 \renewcommand*{\glscombinedsepfirst}[2]{%
   \glshasattribute{##1}{combinedsepfirst}%
   {\glsgetattribute{##1}{combinedsepfirst}}%
   {\ifhasshort{##1}{}{ }}%
 }%
 \renewcommand*{\glscombinedfirstsep}[2]{%
  \glshasattribute{##1}{combinedfirstsep}%
  {\glsgetattribute{##1}{combinedfirstsep}}%
  {\ifhasshort{##2}{}{ }}%
 }%
 \renewcommand*{\glscombinedfirstsepfirst}[2]{%
  \glshasattribute{##1}{combinedfirstsepfirst}%
  {\glsgetattribute{##1}{combinedfirstsepfirst}}%
  { }%
 }%
}
\newcommand*{\glssetcombinedsepnarrow}[2]{%
 \renewcommand*{\glscombinedsep}[2]{%
  \glshasattribute{##1}{combinedsep}%
  {\glsgetattribute{##1}{combinedsep}}%
  {%
   \ifhasshort{##1}%
   {\settowidth{\dimen@}{\glsentryshort{##1}}}%
   {\settowidth{\dimen@}{\glsentrytext{##1}}}%
   \ifdim\dimen@<#1\relax
    #2%
   \else
     \ifhasshort{##2}%
     {\settowidth{\dimen@}{\glsentryshort{##2}}}%
     {\settowidth{\dimen@}{\glsentrytext{##2}}}%
     \ifdim\dimen@<#1\relax
      #2%
     \else
      \space
     \fi
   \fi
  }%
 }%
 \renewcommand*{\glscombinedsepfirst}[2]{%
  \glshasattribute{##1}{combinedsepfirst}%
  {\glsgetattribute{##1}{combinedsepfirst}}%
  {%
   \ifhasshort{##1}%
   {\settowidth{\dimen@}{\glsentryshort{##1}}}%
   {\settowidth{\dimen@}{\glsentrytext{##1}}}%
   \ifdim\dimen@<#1\relax
    #2%
   \else
     \ifhaslong{##2}%
     {\settowidth{\dimen@}{\glsentrylong{##2}}}%
     {\settowidth{\dimen@}{\glsentryfirst{##2}}}%
     \ifdim\dimen@<#1\relax
      #2%
     \else
      \space
     \fi
   \fi
  }%
 }%
 \renewcommand*{\glscombinedfirstsep}[2]{%
  \glshasattribute{##1}{combinedfirstsep}%
  {\glsgetattribute{##1}{combinedfirstsep}}%
  {%
    \ifhaslong{##1}%
    {\settowidth{\dimen@}{\glsentrylong{##1}}}%
    {\settowidth{\dimen@}{\glsentryfirst{##1}}}%
    \ifdim\dimen@<#1\relax
     #2%
    \else
      \ifhasshort{##2}%
      {\settowidth{\dimen@}{\glsentryshort{##2}}}%
      {\settowidth{\dimen@}{\glsentrytext{##2}}}%
      \ifdim\dimen@<#1\relax
       #2%
      \else
       \space
      \fi
    \fi
  }%
 }%
 \renewcommand*{\glscombinedfirstsepfirst}[2]{%
  \glshasattribute{##1}{combinedfirstsepfirst}%
  {\glsgetattribute{##1}{combinedfirstsepfirst}}%
  {%
    \ifhaslong{##1}%
    {\settowidth{\dimen@}{\glsentrylong{##1}}}%
    {\settowidth{\dimen@}{\glsentryfirst{##1}}}%
    \ifdim\dimen@<#1\relax
     #2%
    \else
      \ifhaslong{##2}%
      {\settowidth{\dimen@}{\glsentrylong{##2}}}%
      {\settowidth{\dimen@}{\glsentryfirst{##2}}}%
      \ifdim\dimen@<#1\relax
       #2%
      \else
       \space
      \fi
    \fi
  }%
 }%
}
\newcommand{\glsxtrmglswrite}[1]{%
 \ifx\@glsxtr@record@setting\@glsxtr@record@setting@off
 \else
  \protected@edef\@glsxtr@mglslabel{#1}%
  \ifdef\@glsxtr@mglsreflist
  {%
    \expandafter\DTLifinlist\expandafter{\@glsxtr@mglslabel}%
    {\@glsxtr@mglsreflist}{}%
    {%
      \xappto\@glsxtr@mglsreflist{,\expandonce\@glsxtr@mglslabel}%
      \if@mgls@writeseparaterefs
        \protected@write\@auxout{}{\string\@glsxtr@mglsrefs{#1}}%
      \fi
    }%
  }%
  {%
    \global\let\@glsxtr@mglsreflist\@glsxtr@mglslabel
    \if@mgls@writeseparaterefs
      \protected@write\@auxout{}{\string\@glsxtr@mglsrefs{#1}}%
    \else
      \AtEndDocument{\immediate\protected@write\@auxout{}%
        {\string\@glsxtr@mglsrefs{\@glsxtr@mglsreflist}}}%
    \fi
    \@mgls@disable@writeseparateref@cond
  }%
 \fi
}
\newcommand{\@glsxtr@mglsrefs}[1]{}
\newif\if@mgls@writeseparaterefs \@mgls@writeseparaterefsfalse
\newcommand{\mglsWriteSeparateRefsTrue}{\global\@mgls@writeseparaterefstrue}
\newcommand{\mglsWriteSeparateRefsFalse}{\global\@mgls@writeseparaterefsfalse}
\newcommand*{\@mgls@disable@writeseparateref@cond}{%
  \gdef\mglsWriteSeparateRefsTrue{\PackageError{glossaries-extra}%
   {Too late to use \string\mglsWriteSeparateRefsTrue}%
   {\string\mglsWriteSeparateRefsTrue\space can only be used before
   the first instance of any \string\mgls-like command}}%
  \gdef\mglsWriteSeparateRefsFalse{\PackageError{glossaries-extra}%
   {Too late to use \string\mglsWriteSeparateRefsFalse}%
   {\string\mglsWriteSeparateRefsFalse\space can only be used before
   the first instance of any \string\mgls-like command}}%
}
\newcommand{\glsxtr@newmgls}[5]{%
  \edef\@glsxr@newmgls@do{%
   \noexpand\newrobustcmd*{\expandonce{\csname #1\endcsname}}%
    {\noexpand\@gls@hyp@opt\expandonce{\csname ns@glsxtr@#1\endcsname}}%
   \noexpand\newcommand*{\expandonce{\csname ns@glsxtr@#1\endcsname}}[2][]{%
    \noexpand\new@ifnextchar[%
     {\expandonce{\csname glsxtr@#1\endcsname}{####1}{####2}}%
     {\expandonce{\csname glsxtr@#1\endcsname}{####1}{####2}[]}%
   }%
   \noexpand\def\expandonce{\csname glsxtr@#1\endcsname}####1####2[####3]{%
     \noexpand\def\noexpand\glsxtrcurrentmglscsname{#1}%
     \noexpand\glsxtr@mgls@inner{####1}{####2}{####3}%
      {\noexpand#2}{\noexpand#3}{\noexpand#4}{\noexpand#5}%
    }%
  }%
  \@glsxr@newmgls@do
  \ifx\@glsxtr@record@setting\@glsxtr@record@setting@off
  \else
    \ifdef\@glsxtr@mglslikelist
    {\xappto\@glsxtr@mglslikelist{,#1}}%
    {%
      \gdef\@glsxtr@mglslikelist{#1}%
      \AtEndDocument{\immediate\protected@write\@auxout{}%
        {\string\@glsxtr@mglslike{\@glsxtr@mglslikelist}}}%
    }%
  \fi
}
\newcommand*{\@glsxtr@mglslike}[1]{}
\newcommand*{\GlsXtrMglsOrGls}[2]{%
  \def\@glsxtr@mgls@or@gls@mcs{#1}%
  \def\@glsxtr@mgls@or@gls@gcs{#2}%
  \@ifstar{\s@GlsXtrMglsOrGls}%
  {%
   \@ifnextchar+{\PLUS\@firstoftwo{\p@GlsXtrMglsOrGls}}%
   {%
     \ifdefempty\@gls@alt@hyp@opt@char\@GlsXtrMglsOrGls\alt@GlsXtrMglsOrGls
   }%
  }%
}
\newcommand*{\alt@GlsXtrMglsOrGls}{
 \expandafter\@ifnextchar\@gls@alt@hyp@opt@char
 {\@firstoftwo{\@alt@GlsXtrMglsOrGls}}{\@GlsXtrMglsOrGls}%
}
\newcommand*{\@GlsXtrMglsOrGls}[2][]{%
  \glsxtrifmulti{#2}%
  {\@glsxtr@mgls@or@gls@mcs[#1]{#2}}%
  {\@glsxtr@mgls@or@gls@gcs[#1]{#2}}%
}
\newcommand*{\s@GlsXtrMglsOrGls}[2][]{%
  \glsxtrifmulti{#2}%
  {\@glsxtr@mgls@or@gls@mcs*[#1]{#2}}%
  {\@glsxtr@mgls@or@gls@gcs*[#1]{#2}}%
}
\newcommand*{\p@GlsXtrMglsOrGls}[2][]{%
  \glsxtrifmulti{#2}%
  {\@glsxtr@mgls@or@gls@mcs+[#1]{#2}}%
  {\@glsxtr@mgls@or@gls@gcs+[#1]{#2}}%
}
\newcommand*{\@alt@GlsXtrMglsOrGls}[2][]{%
  \glsxtrifmulti{#2}%
  {\expandafter\@glsxtr@mgls@or@gls@mcs\@gls@alt@hyp@opt@char[#1]{#2}}%
  {\expandafter\@glsxtr@mgls@or@gls@gcs\@gls@alt@hyp@opt@char[#1]{#2}}%
}
\glsxtr@newmgls{mgls}{\@gls@}{\@gls@}{\@gls@}{\@gls@}%
\glsxtr@newmgls{mglspl}{\@glspl@}{\@glspl@}{\@glspl@}{\@glspl@}%
\glsxtr@newmgls{mglsmainpl}{\@gls@}{\@gls@}{\@glspl@}{\@glspl@}%
\glsxtr@newmgls{Mgls}{\@Gls@}{\@gls@}{\@Gls@}{\@gls@}%
\glsxtr@newmgls{Mglspl}{\@Glspl@}{\@glspl@}{\@Glspl@}{\@glspl@}%
\glsxtr@newmgls{Mglsmainpl}{\@Gls@}{\@gls@}{\@Glspl@}{\@glspl@}%
\glsxtr@newmgls{MGls}{\@Gls@}{\@Gls@}{\@Gls@}{\@Gls@}%
\glsxtr@newmgls{MGlspl}{\@Glspl@}{\@Glspl@}{\@Glspl@}{\@Glspl@}%
\glsxtr@newmgls{MGlsmainpl}{\@Gls@}{\@Gls@}{\@Glspl@}{\@Glspl@}%
\glsxtr@newmgls{MGLS}{\@GLS@}{\@GLS@}{\@GLS@}{\@GLS@}%
\glsxtr@newmgls{MGLSpl}{\@GLSpl@}{\@GLSpl@}{\@GLSpl@}{\@GLSpl@}%
\glsxtr@newmgls{MGLSmainpl}{\@GLS@}{\@GLS@}{\@GLSpl@}{\@GLSpl@}%
\def\@glslongortext#1#2[#3]{%
  \ifglshaslong{#2}{\@glsxtrlong{#1}{#2}[#3]}{\@glstext@{#1}{#2}[#3]}%
}
\def\@glsshortortext#1#2[#3]{%
  \ifglshasshort{#2}{\@glsxtrshort{#1}{#2}[#3]}{\@glstext@{#1}{#2}[#3]}%
}
\def\@glsfullorfirst#1#2[#3]{%
  \ifglshasshort{#2}{\@glsxtr@full{#1}{#2}[#3]}{\@glsfirst@{#1}{#2}[#3]}%
}
\def\@Glslongortext#1#2[#3]{%
  \ifglshaslong{#2}{\@Glsxtrlong{#1}{#2}[#3]}{\@Glstext@{#1}{#2}[#3]}%
}
\def\@Glsshortortext#1#2[#3]{%
  \ifglshasshort{#2}{\@Glsxtrshort{#1}{#2}[#3]}{\@Glstext@{#1}{#2}[#3]}%
}
\def\@Glsfullorfirst#1#2[#3]{%
  \ifglshasshort{#2}{\@Glsxtr@full{#1}{#2}[#3]}{\@Glsfirst@{#1}{#2}[#3]}%
}
\glsxtr@newmgls{mglsshort}%
{\@glsshortortext}{\@glsshortortext}{\@glsshortortext}{\@glsshortortext}%
\glsxtr@newmgls{mglslong}%
{\@glslongortext}{\@glslongortext}{\@glslongortext}{\@glslongortext}%
\glsxtr@newmgls{mglsfull}%
{\@glsfullorfirst}{\@glsfullorfirst}{\@glsfullorfirst}{\@glsfullorfirst}%
\glsxtr@newmgls{Mglsshort}%
{\@Glsshortortext}{\@glsshortortext}{\@Glsshortortext}{\@glsshortortext}%
\glsxtr@newmgls{Mglslong}%
{\@Glslongortext}{\@glslongortext}{\@Glslongortext}{\@glslongortext}%
\glsxtr@newmgls{Mglsfull}%
{\@Glsfullorfirst}{\@glsfullorfirst}{\@Glsfullorfirst}{\@glsfullorfirst}%
\glsxtr@newmgls{mglsname}%
 {\@glsname@}{\@glsname@}{\@glsname@}{\@glsname@}%
\glsxtr@newmgls{Mglsname}%
 {\@Glsname@}{\@glsname@}{\@Glsname@}{\@glsname@}%
\glsxtr@newmgls{MGlsname}%
 {\@Glsname@}{\@Glsname@}{\@Glsname@}{\@Glsname@}%
\def\@glssymbolorgls#1#2[#3]{%
  \ifglshassymbol{#2}{\@glssymbol@{#1}{#2}[#3]}{\@gls@{#1}{#2}[#3]}%
}
\def\@glssymbolorGls#1#2[#3]{%
  \ifglshassymbol{#2}{\@glssymbol@{#1}{#2}[#3]}{\@Gls@{#1}{#2}[#3]}%
}
\glsxtr@newmgls{mglssymbol}%
 {\@glssymbolorgls}{\@glssymbolorgls}{\@glssymbolorgls}{\@glssymbolorgls}%
\glsxtr@newmgls{Mglssymbol}%
 {\@glssymbolorGls}{\@glssymbolorgls}{\@glssymbolorGls}{\@glssymbolorgls}%
\glsxtr@newmgls{MGlssymbol}%
 {\@glssymbolorGls}{\@glssymbolorGls}{\@glssymbolorGls}{\@glssymbolorGls}%
\newcommand{\mglsfield}{useri}
\def\@glsfieldorgls#1#2[#3]{%
  \glsxtrifhasfield{\mglsfield}{#2}%
  {\@glsdisp[#1]{#2}{\glscurrentfieldvalue#3}}%
  {\@gls@{#1}{#2}[#3]}%
}
\def\@Glsfieldorgls#1#2[#3]{%
  \glsxtrifhasfield{\mglsfield}{#2}%
  {\@glsdisp[#1]{#2}{\xmakefirstuc\glscurrentfieldvalue#3}}%
  {\@Gls@{#1}{#2}[#3]}%
}
\glsxtr@newmgls{mglsusefield}%
 {\@glsfieldorgls}{\@glsfieldorgls}{\@glsfieldorgls}{\@glsfieldorgls}%
\glsxtr@newmgls{Mglsusefield}%
 {\@Glsfieldorgls}{\@glsfieldorgls}{\@Glsfieldorgls}{\@glsfieldorgls}%
\glsxtr@newmgls{MGlsusefield}%
 {\@Glsfieldorgls}{\@Glsfieldorgls}{\@Glsfieldorgls}{\@Glsfieldorgls}%
\newcommand*{\mpglsWarning}{%
  \GlossariesExtraWarning{glossaries-prefix.sty is required for
   \string\mpgls\space family of commands (either load after
   glossaries-extra.sty or use the `prefix' package option)}%
}
\def\@pglsorgls#1#2[#3]{%
  \ifdef\@pgls@{\@pgls@{#1}{#2}[#3]}{\mpglsWarning\@gls@{#1}{#2}[#3]}%
}
\def\@pglsorglspl#1#2[#3]{%
  \ifdef\@pglspl@{\@pglspl@{#1}{#2}[#3]}{\mpglsWarning\@glspl@{#1}{#2}[#3]}%
}
\def\@Pglsorgls#1#2[#3]{%
  \ifdef\@Pgls@{\@Pgls@{#1}{#2}[#3]}{\mpglsWarning\@Gls@{#1}{#2}[#3]}%
}
\def\@pglsorglspl#1#2[#3]{%
  \ifdef\@pglspl@{\@pglspl@{#1}{#2}[#3]}{\mpglsWarning\@glspl@{#1}{#2}[#3]}%
}
\def\@Pglsorglspl#1#2[#3]{%
  \ifdef\@Pglspl@{\@Pglspl@{#1}{#2}[#3]}{\mpglsWarning\@Glspl@{#1}{#2}[#3]}%
}
\def\@PGLSorgls#1#2[#3]{%
  \ifdef\@PGLS@{\@PGLS@{#1}{#2}[#3]}{\mpglsWarning\@GLS@{#1}{#2}[#3]}%
}
\def\@PGLSorglspl#1#2[#3]{%
  \ifdef\@PGLSpl@{\@PGLSpl@{#1}{#2}[#3]}{\mpglsWarning\@GLSpl@{#1}{#2}[#3]}%
}
\glsxtr@newmgls{mpgls}{\@pglsorgls@}{\@gls@}{\@pglsorgls@}{\@gls@}%
\glsxtr@newmgls{mpglspl}{\@pglsorglspl@}{\@glspl@}{\@pglsorglspl@}{\@glspl@}%
\glsxtr@newmgls{mpglsmainpl}{\@pglsorgls@}{\@gls@}{\@pglsorglspl@}{\@glspl@}%
\glsxtr@newmgls{Mpgls}{\@Pglsorgls@}{\@gls@}{\@Pglsorgls@}{\@gls@}%
\glsxtr@newmgls{Mpglspl}{\@Pglsorglspl@}{\@glspl@}{\@Pglsorglspl@}{\@glspl@}%
\glsxtr@newmgls{Mpglsmainpl}{\@Pglsorgls@}{\@gls@}{\@Pglsorglspl@}{\@glspl@}%
\glsxtr@newmgls{MPGls}{\@Pglsorgls@}{\@Gls@}{\@Pglsorgls@}{\@Gls@}%
\glsxtr@newmgls{MPGlspl}{\@Pglsorglspl@}{\@Glspl@}{\@Pglsorglspl@}{\@Glspl@}%
\glsxtr@newmgls{MPGlsmainpl}{\@Pglsorgls@}{\@Gls@}{\@Pglsorglspl@}{\@Glspl@}%
\glsxtr@newmgls{MPGLS}{\@PGLSorgls@}{\@GLS@}{\@PGLSorgls@}{\@GLS@}%
\glsxtr@newmgls{MPGLSpl}{\@PGLSorglspl@}{\@GLSpl@}{\@PGLSorglspl@}{\@GLSpl@}%
\glsxtr@newmgls{MPGLSmainpl}{\@PGLSorgls@}{\@GLS@}{\@PGLSorglspl@}{\@GLSpl@}%
\newcommand*{\RequireGlossariesExtraLang}[1]{%
  \@ifundefined{ver@glossariesxtr-#1.ldf}{\input{glossariesxtr-#1.ldf}}{}%
}
\newcommand*{\ProvidesGlossariesExtraLang}[1]{%
  \ProvidesFile{glossariesxtr-#1.ldf}%
}
\newcommand{\glsxtr@loaddialect}{%
  \IfTrackedLanguageFileExists{\this@dialect}%
  {glossariesxtr-}% prefix
  {.ldf}%
  {%
    \RequireGlossariesExtraLang{\CurrentTrackedTag}%
  }%
  {}% not found
  \@glsxtrdialecthook
}
\@ifpackageloaded{tracklang} {%
  \AnyTrackedLanguages
  {%
    \ForEachTrackedDialect{\this@dialect}{\glsxtr@loaddialect}%
  }%
  {}%
} {}
\@glsxtr@redefstyles
\@glsxtr@do@style
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossaries-extra-2021-11-22.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossaries-extra-bib2gls-2021-11-22.sty>
%    \end{macrocode}
%\fi
%\subsection{Rollback v1.48 (glossaries-extra-bib2gls-2021-11-22.sty)}
% Version 1.48 preserved for rollback.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{glossaries-extra-bib2gls}[2021/11/22 v1.48 (NLCT)]
\ifglsacronym
  \providecommand*{\printunsrtacronyms}[1][]{%
   \printunsrtglossary[type=\acronymtype,#1]}%
\fi
\ifglossaryexists{index}
{
  \providecommand*{\printunsrtindex}[1][]{%
   \printunsrtglossary[type=index,#1]}%
}{}
\ifglossaryexists{symbols}
{
  \providecommand*{\printunsrtsymbols}[1][]{%
   \printunsrtglossary[type=symbols,#1]}%
}{}
\ifglossaryexists{numbers}
{
  \providecommand*{\printunsrtnumbers}[1][]{%
   \printunsrtglossary[type=numbers,#1]}%
}{}
\ifglossaryexists{abbreviations}
{
  \providecommand*{\printunsrtabbreviations}[1][]{%
   \printunsrtglossary[type=abbreviations,#1]}%
}{}
\renewcommand*{\glsdisplaynumberlist}[1]{%
  \glsdoifexists{#1}%
  {%
    {\let\bibglsdelimN\glsnumlistsep
     \let\bibglslastDelimN\glsnumlistlastsep
     \glsxtrusefield{#1}{location}%
    }%
  }%
}
\robustify\glsdisplaynumberlist
\renewcommand*{\glsentrynumberlist}[1]{\glsxtrusefield{#1}{location}}
\newcommand*{\glshex}{\string\u}
\newcommand*{\glscapturedgroup}{\string\$}
\newcommand*{\GlsXtrIfHasNonZeroChildCount}{%
  \@ifstar\s@GlsXtrIfHasNonZeroChildCount\@GlsXtrIfHasNonZeroChildCount
}
\newcommand*{\@GlsXtrIfHasNonZeroChildCount}[3]{%
  \@GlsXtrIfFieldNonZero{childcount}{#1}{#2}{#3}%
}
\newcommand*{\s@GlsXtrIfHasNonZeroChildCount}[3]{%
  \s@GlsXtrIfFieldNonZero{childcount}{#1}{#2}{#3}%
}
\newcommand*{\glsxtrprovidecommand}{\providecommand}
\newcommand*{\glsrenewcommand}{\@star@or@long\glsxtr@renewcommand}
\newcommand*{\glsxtr@renewcommand}[1]{%
 \begingroup \escapechar\m@ne\xdef\@gtempa{{\string#1}}\endgroup
 \expandafter\@ifundefined\@gtempa
   {%
     \GlossariesExtraWarning{can't redefine \noexpand#1(not already defined)}%
   }%
   \relax
  \relax
 \let\@ifdefinable\@rc@ifdefinable
 \new@command#1%
}
\newcommand*{\glsxtr@wrglossarylocation}[2]{#1}
\ifdef\hyperref
{%
  \newcommand*{\GlsXtrIndexCounterLink}[2]{%
    \glsxtrifhasfield{indexcounter}{#2}%
    {\hyperref[wrglossary.\glscurrentfieldvalue]{#1}}%
    {#1}%
  }
}
{
  \newcommand*{\GlsXtrIndexCounterLink}[2]{#1}
}
\newcommand*{\GlsXtrDualField}{dual}
\newcommand*{\GlsXtrDualBackLink}[2]{%
  \glsxtrifhasfield{\GlsXtrDualField}{#2}%
  {\glshyperlink[#1]{\glscurrentfieldvalue}}%
  {#2}%
}
\newcommand*{\GlsXtrBibTeXEntryAliases}{%
  article=bibtexentry,
  book=bibtexentry,
  booklet=bibtexentry,
  conference=bibtexentry,
  inbook=bibtexentry,
  incollection=bibtexentry,
  inproceedings=bibtexentry,
  manual=bibtexentry,
  mastersthesis=bibtexentry,
  misc=bibtexentry,
  phdthesis=bibtexentry,
  proceedings=bibtexentry,
  techreport=bibtexentry,
  unpublished=bibtexentry
}
\newcommand*{\GlsXtrProvideBibTeXFields}{%
  \glsaddstoragekey{address}{}{\glsxtrbibaddress}%
  \glsaddstoragekey{author}{}{\glsxtrbibauthor}%
  \glsaddstoragekey{booktitle}{}{\glsxtrbibbooktitle}%
  \glsaddstoragekey{chapter}{}{\glsxtrbibchapter}%
  \glsaddstoragekey{edition}{}{\glsxtrbibedition}%
  \glsaddstoragekey{howpublished}{}{\glsxtrbibhowpublished}%
  \glsaddstoragekey{institution}{}{\glsxtrbibinstitution}%
  \glsaddstoragekey{journal}{}{\glsxtrbibjournal}%
  \glsaddstoragekey{month}{}{\glsxtrbibmonth}%
  \glsaddstoragekey{note}{}{\glsxtrbibnote}%
  \glsaddstoragekey{number}{}{\glsxtrbibnumber}%
  \glsaddstoragekey{organization}{}{\glsxtrbiborganization}%
  \glsaddstoragekey{pages}{}{\glsxtrbibpages}%
  \glsaddstoragekey{publisher}{}{\glsxtrbibpublisher}%
  \glsaddstoragekey{school}{}{\glsxtrbibschool}%
  \glsaddstoragekey{series}{}{\glsxtrbibseries}%
  \glsaddstoragekey{title}{}{\glsxtrbibtitle}%
  \glsaddstoragekey{bibtextype}{}{\glsxtrbibtype}%
  \glsaddstoragekey{volume}{}{\glsxtrbibvolume}%
}
\newcommand*{\glsxtrmultisupplocation}[3]{%
 {%
   \def\glsxtrsupplocationurl{#2}%
   \glshypernumber{#1}%
 }%
}
\newcommand*\glsxtrdisplaysupploc[5]{%
  \setentrycounter[#1]{#2}%
  \glsxtrmultisupplocation{#5}{#4}{#3}%
}
\ifundef\hyperlink
{
  \newcommand*{\glsxtrdisplaylocnameref}[8]{%
    \glsnoidxdisplayloc{#1}{#2}{#3}{#4}%
  }
}
{
  \newcommand*{\glsxtrdisplaylocnameref}[8]{%
    \ifcsdef{glsxtr#2locfmt}%
    {\glsxtrnamereflink{#3}{\csuse{glsxtr#2locfmt}{#4}{#5}}{#2.#7}{#8}}%
    {%
      \ifstrempty{#5}%
      {%
        \glsxtrnamereflink{#3}{#4}{#2.#7}{#8}%
      }%
      {%
        \ifstrequal{#2}{page}%
        {\glsxtrnamereflink{#3}{#4}{#2.#7}{#8}}%
        {\glsxtrnamereflink{#3}{#5}{#2.#7}{#8}}%
      }%
    }%
  }
}
\newcommand*{\glsxtrequationlocfmt}[2]{(#1)}
\newcommand*{\glsxtrnamereflink}[4]{%
  \begingroup
    \let\glshypernumber\@firstofone
    \ifstrempty{#4}%
    {\glsxtrfmtinternalnameref{#3}{#1}{#2}}%
    {\glsxtrfmtexternalnameref{#3}{#1}{#2}{#4}}%
  \endgroup
}
\newcommand{\glsxtrnameloclink}[6]{%
 \begingroup
  \setentrycounter[#1]{#2}%
  \def\glsxtr@locationhypertext{#5}%
  \let\glshypernumber\@firstofone
  \def\@glsnumberformat{#3}%
  \def\glsxtrsupplocationurl{#6}%
  \toks@={}%
  \@glsxtr@bibgls@removespaces#4 \@nil
 \endgroup
}
\def\@glsxtr@bibgls@removespaces#1 #2\@nil{%
 \toks@=\expandafter{\the\toks@#1}%
 \ifx\\#2\\%
   \edef\@glo@tmp{\the\toks@}%
   \ifx\@glo@tmp\empty
   \else
     \protected@edef\@glo@tmp{\glsentrycounter\@glo@counterprefix\the\toks@}%
     \ifdefvoid\glsxtrsupplocationurl
     {%
       \expandafter\glsxtrfmtinternalnameref\expandafter{\@glo@tmp}%
       {\@glsnumberformat}{\glsxtr@locationhypertext}%
     }%
     {%
       \expandafter\glsxtrfmtexternalnameref\expandafter{\@glo@tmp}%
       {\@glsnumberformat}{\glsxtr@locationhypertext}{\glsxtrsupplocationurl}%
     }%
   \fi
 \else
   \@gls@ReturnAfterFi{%
     \@glsxtr@bibgls@removespaces#2\@nil
   }%
 \fi
}
\newcommand*{\glsxtrfmtinternalnameref}[3]{%
  \csuse{#2}{\glsdohyperlink{#1}{#3}}%
}
\newcommand*{\glsxtrfmtexternalnameref}[4]{%
  \csuse{#2}{\hyperref{#4}{}{#1}{#3}}%
}
\newcommand*{\glsxtrSetWidest}[3]{%
  \ifdef\glsupdatewidest
  {%
    \ifdef\glslongextraUpdateWidest
    {%
      \ifstrempty{#1}
      {%
        \glsupdatewidest[#2]{#3}%
        \ifnum#2=0\relax
          \glslongextraUpdateWidest{#3}%
        \else
          \glslongextraUpdateWidestChild{#2}{#3}%
        \fi
      }%
      {%
        \apptoglossarypreamble[#1]{\glsupdatewidest[#2]{#3}}%
        \ifnum#2=0\relax
          \apptoglossarypreamble[#1]{\glslongextraUpdateWidest{#3}}%
        \else
          \apptoglossarypreamble[#1]{\glslongextraUpdateWidestChild{#2}{#3}}%
        \fi
      }%
    }%
    {%
      \ifstrempty{#1}
      {%
        \glsupdatewidest[#2]{#3}%
      }%
      {%
        \apptoglossarypreamble[#1]{\glsupdatewidest[#2]{#3}}%
      }%
    }%
  }%
  {%
    \ifdef\glssetwidest
    {%
      \ifdef\glslongextraUpdateWidest
      {%
        \ifstrempty{#1}
        {%
          \glssetwidest[#2]{#3}%
          \ifnum#2=0\relax
            \glslongextraUpdateWidest{#3}%
          \else
            \glslongextraUpdateWidestChild{#2}{#3}%
          \fi
        }%
        {%
          \apptoglossarypreamble[#1]{\glssetwidest[#2]{#3}}%
          \ifnum#2=0\relax
            \apptoglossarypreamble[#1]{\glslongextraUpdateWidest{#3}}%
          \else
            \apptoglossarypreamble[#1]{\glslongextraUpdateWidestChild{#2}{#3}}%
          \fi
        }%
      }%
      {%
        \ifstrempty{#1}
        {%
          \glssetwidest[#2]{#3}%
        }%
        {%
          \apptoglossarypreamble[#1]{\glssetwidest[#2]{#3}}%
        }%
      }%
    }%
    {%
      \ifdef\glslongextraUpdateWidest
      {%
        \ifstrempty{#1}
        {%
          \ifnum#2=0\relax
            \glslongextraUpdateWidest{#3}%
          \else
            \glslongextraUpdateWidestChild{#2}{#3}%
          \fi
        }%
        {%
          \ifnum#2=0\relax
            \apptoglossarypreamble[#1]{\glslongextraUpdateWidest{#3}}%
          \else
            \apptoglossarypreamble[#1]{\glslongextraUpdateWidestChild{#2}{#3}}%
          \fi
        }%
      }%
      {}%
    }%
  }%
}
\newcommand*{\glsxtrSetWidestFallback}[2]{%
  \ifnum#1=0\relax
   \ifdef\glsFindWidestTopLevelName
   {%
     \glsFindWidestTopLevelName[#2]%
   }%
   {%
     \GlossariesExtraWarning{You need stylemods={tree} to
       provide a fallback for set-widest}%
   }%
  \else
   \ifdef\glsFindWidestLevelTwo
   {%
     \glsFindWidestLevelTwo[#2]%
     \ifdef\glslongextraUpdateWidestChild
     {%
      \glslongextraUpdateWidestChild{#1}{\csuse{@glswidestnamei}}%
      \glslongextraUpdateWidestChild{#1}{\csuse{@glswidestnameii}}%
     }%
     {}%
   }%
   {%
     \GlossariesExtraWarning{You need stylemods={tree} to
       provide a fallback for set-widest}%
   }%
  \fi
}
\newcommand*{\@glsxtr@labelprefixes}{}
\newcommand*{\glsxtrclearlabelprefixes}{%
  \renewcommand*{\@glsxtr@labelprefixes}{}%
}
\newcommand*{\glsxtraddlabelprefix}[1]{%
  \ifstrempty{#1}%
  {\glsxtraddlabelprefix{\empty}}%
  {%
    \ifdefempty\@glsxtr@labelprefixes
    {\def\@glsxtr@labelprefixes{#1}}%
    {\appto\@glsxtr@labelprefixes{,#1}}%
  }%
}
\newcommand*{\glsxtrprependlabelprefix}[1]{%
  \ifstrempty{#1}%
  {\glsxtrprependlabelprefix{\empty}}%
  {%
    \ifdefempty\@glsxtr@labelprefixes
    {\def\@glsxtr@labelprefixes{#1}}%
    {\preto\@glsxtr@labelprefixes{#1,}}%
  }%
}
\newcommand*{\glsxtrifinlabelprefixlist}[3]{%
  \ifstrempty{#1}%
  {\glsxtrifinlabelprefixlist{\empty}{#2}{#3}}%
  {%
    \DTLifinlist{#1}{\@glsxtr@labelprefixes}{#2}{#3}%
  }%
}
\AtBeginDocument{%
 \protected@write\@auxout{}{\string\providecommand{\string\@glsxtr@prefixlabellist}[1]{}}%
 \protected@write\@auxout{}{\string\@glsxtr@prefixlabellist{\@glsxtr@labelprefixes}}%
}
\newcommand*{\@glsxtr@get@prefixedlabel}[1]{%
 \begingroup
 \protected@edef\@gls@thislabel{#1}%
 \@for\@glsxtr@prefix:=\@glsxtr@labelprefixes\do
 {%
   \protected@edef\@gls@thislabel{\@glsxtr@prefix#1}%
   \ifglsentryexists{\@gls@thislabel}{\@endfortrue}{}%
 }%
 \edef\@glo@tmp{\endgroup\noexpand\def\noexpand\@gls@thislabel{\@gls@thislabel}}\@glo@tmp
}
\newrobustcmd*{\dgls}{\@gls@hyp@opt\@dgls}
\newcommand*{\@dgls}[2][]{%
  \@glsxtr@get@prefixedlabel{#2}%
  \new@ifnextchar[{\@gls@{#1}{\@gls@thislabel}}{\@gls@{#1}{\@gls@thislabel}[]}%
}
\newrobustcmd*{\dglspl}{\@gls@hyp@opt\@dglspl}
\newcommand*{\@dglspl}[2][]{%
  \@glsxtr@get@prefixedlabel{#2}%
  \new@ifnextchar[{\@glspl@{#1}{\@gls@thislabel}}{\@glspl@{#1}{\@gls@thislabel}[]}%
}
\newrobustcmd*{\dGls}{\@gls@hyp@opt\@dGls}
\newcommand*{\@dGls}[2][]{%
  \@glsxtr@get@prefixedlabel{#2}%
  \new@ifnextchar[{\@Gls@{#1}{\@gls@thislabel}}{\@Gls@{#1}{\@gls@thislabel}[]}%
}
\newrobustcmd*{\dGlspl}{\@gls@hyp@opt\@dGlspl}
\newcommand*{\@dGlspl}[2][]{%
  \@glsxtr@get@prefixedlabel{#2}%
  \new@ifnextchar[{\@Glspl@{#1}{\@gls@thislabel}}{\@Glspl@{#1}{\@gls@thislabel}[]}%
}
\newrobustcmd*{\dGLS}{\@gls@hyp@opt\@dGLS}
\newcommand*{\@dGLS}[2][]{%
  \@glsxtr@get@prefixedlabel{#2}%
  \new@ifnextchar[{\@GLS@{#1}{\@gls@thislabel}}{\@GLS@{#1}{\@gls@thislabel}[]}%
}
\newrobustcmd*{\dGLSpl}{\@gls@hyp@opt\@dGLSpl}
\newcommand*{\@dGLSpl}[2][]{%
  \@glsxtr@get@prefixedlabel{#2}%
  \new@ifnextchar[{\@GLSpl@{#1}{\@gls@thislabel}}{\@GLSpl@{#1}{\@gls@thislabel}[]}%
}
\newrobustcmd*{\dglslink}[3][]{%
  \@glsxtr@get@prefixedlabel{#2}%
  \glslink[#1]{\@gls@thislabel}{#3}%
}
\newrobustcmd*{\dglsdisp}[3][]{%
  \@glsxtr@get@prefixedlabel{#2}%
  \glsdisp[#1]{\@gls@thislabel}{#3}%
}
\newrobustcmd*{\glsxtrmultientryadjustedname}[4]{%
  \bgroup
    \let\@glsxtrmultientryadjustednamesep\glsxtrmultientryadjustednamesep
    \let\@glsxtrmultientryadjustednamepresep\glsxtrmultientryadjustednamepresep
    \let\@glsxtrmultientryadjustednamepostsep\glsxtrmultientryadjustednamepostsep
    \let\@glsxtrmultientryadjustednameother\glsxtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefmt\glsxtrmultientryadjustednamefmt
    \let\@glsxtrmultientryadjustednamefirstother\glsxtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefirstfmt\glsxtrmultientryadjustednamefmt
    \@glsxtrmultientryadjustedname{#1}{#2}{#3}{#4}%
  \egroup
}
\newrobustcmd*{\Glsxtrmultientryadjustedname}[4]{%
  \bgroup
    \let\@glsxtrmultientryadjustednamesep\glsxtrmultientryadjustednamesep
    \let\@glsxtrmultientryadjustednamepresep\glsxtrmultientryadjustednamepresep
    \let\@glsxtrmultientryadjustednamepostsep\glsxtrmultientryadjustednamepostsep
    \let\@glsxtrmultientryadjustednameother\glsxtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefmt\glsxtrmultientryadjustednamefmt
    \let\@glsxtrmultientryadjustednamefirstother\Glsxtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefirstfmt\Glsxtrmultientryadjustednamefmt
    \@glsxtrmultientryadjustedname{#1}{#2}{#3}{#4}%
  \egroup
}
\newrobustcmd*{\GlsXtrmultientryadjustedname}[4]{%
  \bgroup
    \let\@glsxtrmultientryadjustednamesep\glsxtrmultientryadjustednamesep
    \let\@glsxtrmultientryadjustednamepresep\glsxtrmultientryadjustednamepresep
    \let\@glsxtrmultientryadjustednamepostsep\glsxtrmultientryadjustednamepostsep
    \let\@glsxtrmultientryadjustednameother\GlsXtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefmt\GlsXtrmultientryadjustednamefmt
    \let\@glsxtrmultientryadjustednamefirstother\GlsXtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefirstfmt\GlsXtrmultientryadjustednamefmt
    \@glsxtrmultientryadjustedname{#1}{#2}{#3}{#4}%
  \egroup
}
\newrobustcmd*{\GLSxtrmultientryadjustedname}[4]{%
  \bgroup
    \let\@glsxtrmultientryadjustednamesep\glsxtrmultientryadjustednamesep
    \let\@glsxtrmultientryadjustednamepresep\glsxtrmultientryadjustednamepresep
    \let\@glsxtrmultientryadjustednamepostsep\glsxtrmultientryadjustednamepostsep
    \let\@glsxtrmultientryadjustednameother\GLSxtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefmt\GLSxtrmultientryadjustednamefmt
    \let\@glsxtrmultientryadjustednamefirstother\GLSxtrmultientryadjustednameother
    \let\@glsxtrmultientryadjustednamefirstfmt\GLSxtrmultientryadjustednamefmt
    \@glsxtrmultientryadjustedname{#1}{#2}{#3}{#4}%
  \egroup
}
\newcommand*{\@glsxtrmultientryadjustedname}[4]{%
  \letcs\mglscurrentmainlabel{@gls@combined@#4@main}%
  \letcs\mglscurrentmainlist{@gls@combined@#4@list}%
  \letcs\mglscurrentmainoptions{@gls@combined@#4@options}%
  \ifblank{#1}%
  {%
    \@glsxtrmultientryadjustednamefirstfmt{#2}%
  }%
  {%
    \def\@mgls@previouslabel{}%
    \let\@gls@xtradjustedother\@glsxtrmultientryadjustednamefirstother
    \@for\mglscurrentlabel:=#1\do{%
       \ifx\@mgls@previouslabel\empty
       \else
         \@glsxtrmultientryadjustednamesep{\@mgls@previouslabel}{\mglscurrentlabel}%
       \fi
       \@gls@xtradjustedother{\mglscurrentlabel}%
       \let\@mgls@previouslabel\mglscurrentlabel
       \let\@gls@xtradjustedother\@glsxtrmultientryadjustednameother
    }%
    \@glsxtrmultientryadjustednamepresep{\@mgls@previouslabel}{\mglscurrentmainlabel}%
    \@glsxtrmultientryadjustednamefmt{#2}%
  }%
  \ifblank{#3}%
  {}%
  {%
    \let\@mgls@previouslabel\mglscurrentmainlabel
    \let\@gls@xtrmultientryadjustednamesep\@glsxtrmultientryadjustednamepostsep
    \@for\mglscurrentlabel:=#3\do{%
       \@gls@xtrmultientryadjustednamesep{\@mgls@previouslabel}{\mglscurrentlabel}%
       \@glsxtrmultientryadjustednameother{\mglscurrentlabel}%
       \let\@mgls@previouslabel\mglscurrentlabel
       \let\@gls@xtrmultientryadjustednamesep\@glsxtrmultientryadjustednamesep
    }%
  }%
}
\newcommand*{\glsxtrmultientryadjustednamesep}{\glscombinedfirstsepfirst}
\newcommand*{\glsxtrmultientryadjustednamepresep}{\glsxtrmultientryadjustednamesep}
\newcommand*{\glsxtrmultientryadjustednamepostsep}{\glsxtrmultientryadjustednamesep}
\newcommand*{\glsxtrmultientryadjustednamefmt}[1]{#1}
\newcommand*{\glsxtrmultientryadjustednameother}[1]{\glsentryname{#1}}
\newcommand*{\Glsxtrmultientryadjustednamefmt}[1]{\makefirstuc{#1}}
\newcommand*{\Glsxtrmultientryadjustednameother}[1]{\Glsentryname{#1}}
\newcommand*{\GlsXtrmultientryadjustednameother}[1]{%
 \glsentrytitlecase{#1}{name}}
\ifdef\glscapitalisewords
{%
  \newcommand*{\GlsXtrmultientryadjustednamefmt}[1]{\glscapitalisewords{#1}}
}
{
  \newcommand*{\GlsXtrmultientryadjustednamefmt}[1]{\capitalisewords{#1}}
}
\newcommand*{\GLSxtrmultientryadjustednameother}[1]{%
 \mfirstucMakeUppercase{\glsentryname{#1}}}
\newcommand*{\GLSxtrmultientryadjustednamefmt}[1]{\mfirstucMakeUppercase{#1}}
\providecommand*{\Alpha}{\mathrm{A}}
\providecommand*{\Beta}{\mathrm{B}}
\providecommand*{\Epsilon}{\mathrm{E}}
\providecommand*{\Zeta}{\mathrm{Z}}
\providecommand*{\Eta}{\mathrm{H}}
\providecommand*{\Iota}{\mathrm{I}}
\providecommand*{\Kappa}{\mathrm{K}}
\providecommand*{\Mu}{\mathrm{M}}
\providecommand*{\Nu}{\mathrm{N}}
\providecommand*{\Omicron}{\mathrm{O}}
\providecommand*{\Rho}{\mathrm{P}}
\providecommand*{\Tau}{\mathrm{T}}
\providecommand*{\Chi}{\mathrm{X}}
\providecommand*{\Digamma}{\mathrm{F}}
\providecommand*{\omicron}{\mathit{o}}
\@ifpackageloaded{upgreek}%
{
  \providecommand*{\Upalpha}{\mathrm{A}}
  \providecommand*{\Upbeta}{\mathrm{B}}
  \providecommand*{\Upepsilon}{\mathrm{E}}
  \providecommand*{\Upzeta}{\mathrm{Z}}
  \providecommand*{\Upeta}{\mathrm{H}}
  \providecommand*{\Upiota}{\mathrm{I}}
  \providecommand*{\Upkappa}{\mathrm{K}}
  \providecommand*{\Upmu}{\mathrm{M}}
  \providecommand*{\Upnu}{\mathrm{N}}
  \providecommand*{\Upomicron}{\mathrm{O}}
  \providecommand*{\Uprho}{\mathrm{P}}
  \providecommand*{\Uptau}{\mathrm{T}}
  \providecommand*{\Upchi}{\mathrm{X}}
  \providecommand*{\upomicron}{\mathrm{o}}
}%
{}% upgreek.sty not loaded
\newcommand*{\glsxtrcontrolrules}{%
 \string'\glshex 200B\string'\string=\glshex 200C\string=\glshex 200D
 \string=\glshex 200E\string=\glshex 200F\string=\glshex 0000\string=\glshex 0001
 \string=\glshex 0002\string=\glshex 0003\string=\glshex 0004\string=\glshex 0005
 \string=\glshex 0006\string=\glshex 0007\string=\glshex 0008
 \string=\string'\glshex 0009\string'\string=\string'\glshex 000B\string'
 \string=\glshex 000E\string=\glshex 000F\string=\string'\glshex
0010\string'\string=\glshex 0011
 \string=\glshex 0012\string=\glshex 0013\string=\glshex 0014\string=\glshex 0015
 \string=\glshex 0016\string=\glshex 0017\string=\glshex 0018\string=\glshex 0019
 \string=\glshex 001A\string=\glshex 001B\string=\glshex 001C\string=\glshex 001D
 \string=\glshex 001E\string=\glshex 001F\string=\glshex 007F\string=\glshex 0080
 \string=\glshex 0081\string=\glshex 0082\string=\glshex 0083\string=\glshex 0084
 \string=\glshex 0085\string=\glshex 0086\string=\glshex 0087\string=\glshex 0088
 \string=\glshex 0089\string=\glshex 008A\string=\glshex 008B\string=\glshex 008C
 \string=\glshex 008D\string=\glshex 008E\string=\glshex 008F\string=\glshex 0090
 \string=\glshex 0091\string=\glshex 0092\string=\glshex 0093\string=\glshex 0094
 \string=\glshex 0095\string=\glshex 0096\string=\glshex 0097\string=\glshex 0098
 \string=\glshex 0099\string=\glshex 009A\string=\glshex 009B\string=\glshex 009C
 \string=\glshex 009D\string=\glshex 009E\string=\glshex 009F
}
\newcommand*{\glsxtrspacerules}{%
 \string' \string'\string;
 \string'\glshex 00A0\string'\string;
 \string'\glshex 2000\string'\string;
 \string'\glshex 2001\string'\string;
 \string'\glshex 2002\string'\string;
 \string'\glshex 2003\string'\string;
 \string'\glshex 2004\string'\string;
 \string'\glshex 2005\string'\string;
 \string'\glshex 2006\string'\string;
 \string'\glshex 2007\string'\string;
 \string'\glshex 2008\string'\string;
 \string'\glshex 2009\string'\string;
 \string'\glshex 200A\string'\string;
 \string'\glshex 3000\string'
}
\newcommand*{\glsxtrnonprintablerules}{%
 \string'\glshex FEFF\string'\string;
 \string'\glshex 000A\string'\string;
 \string'\glshex 0009\string'\string;
 \string'\glshex 000C\string'\string;
 \string'\glshex 000B\string'
}

\newcommand*{\glsxtrcombiningdiacriticrules}{%
 \glsxtrcombiningdiacriticIrules\string;
 \glsxtrcombiningdiacriticIIrules\string;
 \glsxtrcombiningdiacriticIIIrules\string;
 \glsxtrcombiningdiacriticIVrules
}
\newcommand*{\glsxtrcombiningdiacriticIrules}{%
 \glshex 0301\string;% combining acute
 \glshex 0300\string;% combining grave
 \glshex 0306\string;% combining breve
 \glshex 0302\string;% combining circumflex
 \glshex 030C\string;% combining caron
 \glshex 030A\string;% combining ring
 \glshex 030D\string;% combining vertical line above
 \glshex 0308\string;% combining diaeresis
 \glshex 030B\string;% combining double acute
 \glshex 0303\string;% combining tilde
 \glshex 0307\string;% combining dot above
 \glshex 0304% combining macron
}
\newcommand*{\glsxtrcombiningdiacriticIIrules}{%
 \glshex 0337\string;% combining short solidus overlay
 \glshex 0327\string;% combining cedilla
 \glshex 0328\string;% combining ogonek
 \glshex 0323\string;% combining dot below
 \glshex 0332\string;% combining low line
 \glshex 0305\string;% combining overline
 \glshex 0309\string;% combining hook above
 \glshex 030E\string;% combining double vertical line above
 \glshex 030F\string;% combining double grave accent
 \glshex 0310\string;% combining candrabindu
 \glshex 0311\string;% combining inverted breve
 \glshex 0312\string;% combining turned comma above
 \glshex 0313\string;% combining comma above
 \glshex 0314\string;% combining reversed comma above
 \glshex 0315\string;% combining comma above right
 \glshex 0316\string;% combining grave accent below
 \glshex 0317% combining acute accent below
}
\newcommand*{\glsxtrcombiningdiacriticIIIrules}{%
 \glshex 0318\string;% combining left tack below
 \glshex 0319\string;% combining right tack below
 \glshex 031A\string;% combining left angle above
 \glshex 031B\string;% combining horn
 \glshex 031C\string;% combining left half ring below
 \glshex 031D\string;% combining up tack below
 \glshex 031E\string;% combining down tack below
 \glshex 031F\string;% combining plus sign below
 \glshex 0320\string;% combining minus sign below
 \glshex 0321\string;% combining palatalized hook below
 \glshex 0322\string;% combining retroflex hook below
 \glshex 0324\string;% combining diaresis below
 \glshex 0325\string;% combining ring below
 \glshex 0326\string;% combining comma below
 \glshex 0329\string;% combining vertical line below
 \glshex 032A\string;% combining bridge below
 \glshex 032B\string;% combining inverted double arch below
 \glshex 032C\string;% combining caron below
 \glshex 032D\string;% combining circumflex accent below
 \glshex 032E\string;% combining breve below
 \glshex 032F\string;% combining inverted breve below
 \glshex 0330\string;% combining tilde below
 \glshex 0331\string;% combining macron below
 \glshex 0333\string;% combining double low line
 \glshex 0334\string;% combining tilde overlay
 \glshex 0335\string;% combining short stroke overlay
 \glshex 0336\string;% combining long stroke overlay
 \glshex 0338\string;% combining long solidus overlay
 \glshex 0339\string;% combining combining right half ring below
 \glshex 033A\string;% combining inverted bridge below
 \glshex 033B\string;% combining square below
 \glshex 033C\string;% combining seagull below
 \glshex 033D\string;% combining x above
 \glshex 033E\string;% combining vertical tilde
 \glshex 033F\string;% combining double overline
 \glshex 0342\string;% combining Greek perispomeni
 \glshex 0344\string;% combining Greek dialytika tonos
 \glshex 0345\string;% combining Greek ypogegrammeni
 \glshex 0360\string;% combining double tilde
 \glshex 0361\string;% combining double inverted breve
 \glshex 0483\string;% combining Cyrillic titlo
 \glshex 0484\string;% combining Cyrillic palatalization
 \glshex 0485\string;% combining Cyrillic dasia pneumata
 \glshex 0486% combining Cyrillic psili pneumata
}
\newcommand*{\glsxtrcombiningdiacriticIVrules}{%
 \glshex 20D0\string;% combining left harpoon above
 \glshex 20D1\string;% combining right harpoon above
 \glshex 20D2\string;% combining long vertical line overlay
 \glshex 20D3\string;% combining short vertical line overlay
 \glshex 20D4\string;% combining anticlockwise arrow above
 \glshex 20D5\string;% combining clockwise arrow above
 \glshex 20D6\string;% combining left arrow above
 \glshex 20D7\string;% combining right arrow above
 \glshex 20D8\string;% combining ring overlay
 \glshex 20D9\string;% combining clockwise ring overlay
 \glshex 20DA\string;% combining anticlockwise ring overlay
 \glshex 20DB\string;% combining three dots above
 \glshex 20DC\string;% combining four dots above
 \glshex 20DD\string;% combining enclosing circle
 \glshex 20DE\string;% combining enclosing square
 \glshex 20DF\string;% combining enclosing diamond
 \glshex 20E0\string;% combining enclosing circle backslash
 \glshex 20E1%  combining left right arrow above
}
\newcommand*{\glsxtrhyphenrules}{%
 \string'\string-\string'\string;% ASCII hyphen
 \glshex 00AD\string;% soft hyphen
 \glshex 2010\string;% hyphen
 \glshex 2011\string;% non-breaking hyphen
 \glshex 2012\string;% figure dash
 \glshex 2013\string;% en dash
 \glshex 2014\string;% em dash
 \glshex 2015\string;% horizontal bar
 \glshex 2212\string=\glshex 207B\string=\glshex 208B% minus sign
}
\newcommand*{\glsxtrgeneralpuncrules}{%
  \glsxtrgeneralpuncIrules
  \string<\glsxtrcurrencyrules
  \string<\glsxtrgeneralpuncIIrules
}
\newcommand*{\glsxtrgeneralpuncIrules}{%
 \string'\glshex 005F\string'% underscore
 \string<\glshex 00AF% macron
 \string<\string'\glshex 002C\string'% comma
 \string<\string'\glshex 003B\string'% semi-colon
 \string<\string'\glshex 003A\string'% colon
 \string<\string'\glshex 0021\string'% exclamation mark
 \string<\glshex 00A1% inverted exclamation mark
 \string<\string'\glshex 003F\string'% question mark
 \string<\glshex 00BF% inverted question mark
 \string<\string'\glshex 002F\string'% solidus
 \string<\string'\glshex 002E\string'% full stop
 \string<\glshex 00B4% acute accent
 \string<\string'\glshex 0060\string'% grave accent
 \string<\string'\glshex 005E\string'% circumflex accent
 \string<\glshex 00A8% diaersis
 \string<\string'\glshex 007E\string'% tilde
 \string<\glshex 00B7% middle dot
 \string<\glshex 00B8% cedilla
 \string<\string'\glshex 0027\string'% straight apostrophe
 \string<\string'\glshex 0022\string'% straight double quote
 \string<\glshex 00AB% left guillemet
 \string<\glshex 00BB% right guillemet
 \string<\string'\glshex 0028\string'% left parenthesis
  \string=\glshex 207D\string=\glshex 208D% super/subscript left parenthesis
 \string<\string'\glshex 0029\string'% right parenthesis
  \string=\glshex 207E\string=\glshex 208E% super/subscript right parenthesis
 \string<\string'\glshex 005B\string'% left square bracket
 \string<\string'\glshex 005D\string'% right square bracket
 \string<\string'\glshex 007B\string'% left curly bracket
 \string<\string'\glshex 007D\string'% right curly bracket
 \string<\glshex 00A7% section sign
 \string<\glshex 00B6% pilcrow sign
 \string<\glshex 00A9% copyright sign
 \string<\glshex 00AE% registered sign
 \string<\string'\glshex 0040\string'% at sign
}
\newcommand*{\glsxtrcurrencyrules}{%
 \glshex 00A4% currency sign
 \string<\glshex 0E3F% Thai currency symbol baht
 \string<\glshex 00A2% cent sign
 \string<\glshex 20A1% colon sign
 \string<\glshex 20A2% cruzeiro sign
 \string<\string'\glshex 0024\string'% dollar sign
 \string<\glshex 20AB% dong sign
 \string<\glshex 20AC% euro sign
 \string<\glshex 20A3% French franc sign
 \string<\glshex 20A4% lira sign
 \string<\glshex 20A5% mill sign
 \string<\glshex 20A6% naira sign
 \string<\glshex 20A7% peseta sign
 \string<\glshex 00A3% pound sign
 \string<\glshex 20A8% rupee sign
 \string<\glshex 20AA% new sheqel sign
 \string<\glshex 20A9% won sign
 \string<\glshex 00A5% yen sign
}
\newcommand*{\glsxtrgeneralpuncIIrules}{%
 \string'\glshex 002A\string'% asterisk
 \string<\string'\glshex 005C\string'% backslash
 \string<\string'\glshex 0026\string'% ampersand
 \string<\string'\glshex 0023\string'% hash sign
 \string<\string'\glshex 0025\string'% percent sign
 \string<\string'\glshex 002B\string'% plus sign
  \string=\glshex 207A\string=\glshex 208A% super/subscript plus sign
 \string<\glshex 00B1% plus-minus sign
 \string<\glshex 00F7% division sign
 \string<\glshex 00D7% multiplication sign
 \string<\string'\glshex 003C\string'% less-than sign
 \string<\string'\glshex 003D\string'% equals sign
 \string<\string'\glshex 003E\string'% greater-than sign
 \string<\glshex 00AC% not sign
 \string<\string'\glshex 007C\string'% vertical bar (pipe)
 \string<\glshex 00A6% broken bar
 \string<\glshex 00B0% degree sign
 \string<\glshex 00B5% micron sign
}
\newcommand*{\glsxtrGeneralLatinIrules}{%
 \glsxtrLatinA
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS
 \string<\glsxtrLatinT
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z
}
\newcommand*{\glsxtrGeneralLatinIIrules}{%
 \glsxtrLatinA
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinEth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS
 \string& SS \string, \glsxtrLatinEszettSs
 \string<\glsxtrLatinT
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
\newcommand*{\glsxtrGeneralLatinIIIrules}{%
 \glsxtrLatinA
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinEth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS
 \string& SZ, \glsxtrLatinEszettSz
 \string<\glsxtrLatinT
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
\newcommand*{\glsxtrGeneralLatinIVrules}{%
 \glsxtrLatinA
 \string& AE , \glsxtrLatinAELigature
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinEth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string& OE , \glsxtrLatinOELigature
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS
 \string& SS , \glsxtrLatinEszettSs
 \string<\glsxtrLatinT
 \string& th =\glshex 00DE
 \string& TH =\glshex 00FE
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
\newcommand*{\glsxtrGeneralLatinVrules}{%
 \glsxtrLatinA
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinEth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS
 \string& SS , \glsxtrLatinEszettSs
 \string<\glsxtrLatinT
 \string& th =\glshex 00DE
 \string& TH =\glshex 00FE
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
\newcommand*{\glsxtrGeneralLatinVIrules}{%
 \glsxtrLatinA
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinEth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS
 \string& SZ , \glsxtrLatinEszettSz
 \string<\glsxtrLatinT
 \string& th =\glshex 00DE
 \string& TH =\glshex 00FE
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
\newcommand*{\glsxtrGeneralLatinVIIrules}{%
 \glsxtrLatinA
 \string<\glsxtrLatinAELigature
 \string<b,B%
 \string<c,C%
 \string<d,D%
 \string<\glsxtrLatinEth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<\glsxtrLatinInsularG
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glsxtrLatinL
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glsxtrLatinO
 \string<\glsxtrLatinOELigature
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glshex 017F=\glsxtrLatinS % s and long s
 \string<\glsxtrLatinT
 \string<\glsxtrLatinThorn
 \string<u,U%
 \string<v,V%
 \string< w\string=\glshex 01BF, W\string=\glshex 01F7
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
\newcommand*{\glsxtrGeneralLatinVIIIrules}{%
 \glsxtrLatinA
 \string& AE , \glsxtrLatinAELigature
 \string<b,B%
 \string<c,C%
 \string<\glshex 00F0\string;d,\glshex 00D0\string;D% D and eth
 \string<\glsxtrLatinE
 \string<f,F%
 \string<g,G%
 \string<\glsxtrLatinH
 \string<\glsxtrLatinI
 \string<j,J%
 \string<\glsxtrLatinK
 \string<\glshex 0142\string=\glsxtrLatinL\string=\glshex 0141% L and \L
 \string<\glsxtrLatinM
 \string<\glsxtrLatinN
 \string<\glshex 00F8\string=\glsxtrLatinO\string=\glshex 00D8% O and \O
 \string& OE , \glsxtrLatinOELigature
 \string<\glsxtrLatinP
 \string<q,Q%
 \string<r,R%
 \string<\glsxtrLatinS
 \string& SS , \glsxtrLatinEszettSs
 \string<\glsxtrLatinT
 \string& th =\glshex 00DE
 \string& TH =\glshex 00FE
 \string<u,U%
 \string<v,V%
 \string<w,W%
 \string<\glsxtrLatinX
 \string<y,Y%
 \string<z,Z%
}
\newcommand*{\glsxtrLatinA}{%
  a\string=\glshex 00AA\string=\glshex 2090,A
}
\newcommand*{\glsxtrLatinE}{%
  e\string=\glshex 2091,E
}
\newcommand*{\glsxtrLatinH}{%
  h\string=\glshex 2095,H
}
\newcommand*{\glsxtrLatinI}{%
  i\string=\glshex 2071,I
}
\newcommand*{\glsxtrLatinK}{%
  k\string=\glshex 2096,K
}
\newcommand*{\glsxtrLatinL}{%
  l\string=\glshex 2097,L
}
\newcommand*{\glsxtrLatinM}{%
  m\string=\glshex 2098,M
}
\newcommand*{\glsxtrLatinN}{%
  n\string=\glshex 207F\string=\glshex 2099,N
}
\newcommand*{\glsxtrLatinO}{%
  o\string=\glshex 00BA\string=\glshex 2092,O
}
\newcommand*{\glsxtrLatinP}{%
  p\string=\glshex 209A,P
}
\newcommand*{\glsxtrLatinS}{%
  s\string=\glshex 209B,S
}
\newcommand*{\glsxtrLatinT}{%
  t\string=\glshex 209C,T
}
\newcommand*{\glsxtrLatinX}{%
  x\string=\glshex 2093,X
}
\newcommand*{\glsxtrLatinSchwa}{%
  \glshex 0259\string=\glshex 2094,\glshex 018F
}
\newcommand*{\glsxtrLatinEszettSs}{%
 \glshex 00DF% eszett
 \string=\glshex 017Fs % long S s
}
\newcommand*{\glsxtrLatinEszettSz}{%
 \glshex 00DF% eszett
 \string= \glshex 017Fz % long S z
}
\newcommand*{\glsxtrLatinEth}{%
 \glshex 00F0,\glshex 00D0% eth
}
\newcommand*{\glsxtrLatinThorn}{%
 \glshex 00FE,\glshex 00DE% thorn
}
\newcommand*{\glsxtrLatinAELigature}{%
 \glshex 00E6,\glshex 00C6% AE-ligature
}
\newcommand*{\glsxtrLatinOELigature}{%
 \glshex 0153,\glshex 0152% OE-ligature
}
\newcommand*{\glsxtrLatinAA}{%
 \glshex 00E5=a\glshex 030A,% \aa
 \glshex 00C5=A\glshex 030A% \AA
}
\newcommand*{\glsxtrLatinWynn}{%
 \glshex 01BF,\glshex 01F7% wynn
}
\newcommand*{\glsxtrLatinInsularG}{%
 \glshex 1D79,\glshex A77D% insular G
 \string; g, G
}
\newcommand*{\glsxtrLatinOslash}{%
 \glshex 00F8,\glshex 00D8% \o, \O
}
\newcommand*{\glsxtrLatinLslash}{%
 \glshex 0142,\glshex 0141% \l, \L
}
\newcommand*{\glsxtrMathUpGreekIrules}{%
 \glsxtrUpAlpha
 \string<\glsxtrUpBeta
 \string<\glsxtrUpGamma
 \string<\glsxtrUpDelta
 \string<\glsxtrUpEpsilon
 \string<\glsxtrUpDigamma
 \string<\glsxtrUpZeta
 \string<\glsxtrUpEta
 \string<\glsxtrUpTheta
 \string<\glsxtrUpIota
 \string<\glsxtrUpKappa
 \string<\glsxtrUpLambda
 \string<\glsxtrUpMu
 \string<\glsxtrUpNu
 \string<\glsxtrUpXi
 \string<\glsxtrUpOmicron
 \string<\glsxtrUpPi
 \string<\glsxtrUpRho
 \string<\glsxtrUpSigma
 \string<\glsxtrUpTau
 \string<\glsxtrUpUpsilon
 \string<\glsxtrUpPhi
 \string<\glsxtrUpChi
 \string<\glsxtrUpPsi
 \string<\glsxtrUpOmega
}
\newcommand*{\glsxtrMathUpGreekIIrules}{%
 \glsxtrUpAlpha
 \string<\glsxtrUpBeta
 \string<\glsxtrUpGamma
 \string<\glsxtrUpDelta
 \string<\glsxtrUpEpsilon
 \string<\glsxtrUpZeta
 \string<\glsxtrUpEta
 \string<\glsxtrUpTheta
 \string<\glsxtrUpIota
 \string<\glsxtrUpKappa
 \string<\glsxtrUpLambda
 \string<\glsxtrUpMu
 \string<\glsxtrUpNu
 \string<\glsxtrUpXi
 \string<\glsxtrUpOmicron
 \string<\glsxtrUpPi
 \string<\glsxtrUpRho
 \string<\glsxtrUpSigma
 \string<\glsxtrUpTau
 \string<\glsxtrUpUpsilon
 \string<\glsxtrUpPhi
 \string<\glsxtrUpChi
 \string<\glsxtrUpPsi
 \string<\glsxtrUpOmega
}
\newcommand*{\glsxtrMathItalicGreekIrules}{%
 \glsxtrMathItalicAlpha
 \string<\glsxtrMathItalicBeta
 \string<\glsxtrMathItalicGamma
 \string<\glsxtrMathItalicDelta
 \string<\glsxtrMathItalicEpsilon
 \string<\glsxtrUpDigamma
 \string<\glsxtrMathItalicZeta
 \string<\glsxtrMathItalicEta
 \string<\glsxtrMathItalicTheta
 \string<\glsxtrMathItalicIota
 \string<\glsxtrMathItalicKappa
 \string<\glsxtrMathItalicLambda
 \string<\glsxtrMathItalicMu
 \string<\glsxtrMathItalicNu
 \string<\glsxtrMathItalicXi
 \string<\glsxtrMathItalicOmicron
 \string<\glsxtrMathItalicPi
 \string<\glsxtrMathItalicRho
 \string<\glsxtrMathItalicSigma
 \string<\glsxtrMathItalicTau
 \string<\glsxtrMathItalicUpsilon
 \string<\glsxtrMathItalicPhi
 \string<\glsxtrMathItalicChi
 \string<\glsxtrMathItalicPsi
 \string<\glsxtrMathItalicOmega
}
\newcommand*{\glsxtrMathItalicGreekIIrules}{%
 \glsxtrMathItalicAlpha
 \string<\glsxtrMathItalicBeta
 \string<\glsxtrMathItalicGamma
 \string<\glsxtrMathItalicDelta
 \string<\glsxtrMathItalicEpsilon
 \string<\glsxtrMathItalicZeta
 \string<\glsxtrMathItalicEta
 \string<\glsxtrMathItalicTheta
 \string<\glsxtrMathItalicIota
 \string<\glsxtrMathItalicKappa
 \string<\glsxtrMathItalicLambda
 \string<\glsxtrMathItalicMu
 \string<\glsxtrMathItalicNu
 \string<\glsxtrMathItalicXi
 \string<\glsxtrMathItalicOmicron
 \string<\glsxtrMathItalicPi
 \string<\glsxtrMathItalicRho
 \string<\glsxtrMathItalicSigma
 \string<\glsxtrMathItalicTau
 \string<\glsxtrMathItalicUpsilon
 \string<\glsxtrMathItalicPhi
 \string<\glsxtrMathItalicChi
 \string<\glsxtrMathItalicPsi
 \string<\glsxtrMathItalicOmega
}
\newcommand*{\glsxtrMathItalicUpperGreekIrules}{%
 \glshex 1D6E2% upper case alpha (maths italic)
 \string<\glshex 1D6E3% upper case beta (maths italic)
 \string<\glshex 1D6E4% upper case gamma (maths italic)
 \string<\glshex 1D6E5% upper case delta (maths italic)
 \string<\glshex 1D6E6% upper case epsilon (maths italic)
 \string<\glshex 03DC% upper case digamma
 \string<\glshex 1D6E7% upper case zeta (maths italic)
 \string<\glshex 1D6E8% upper case eta (maths italic)
 \string<\glshex 1D6E9% upper case theta (maths italic)
 \string=\glshex 1D6F3% upper case theta variant (maths italic)
 \string<\glshex 1D6EA% upper case iota (maths italic)
 \string<\glshex 1D6EB% upper case kappa (maths italic)
 \string<\glshex 1D6EC% upper case lambda (maths italic)
 \string<\glshex 1D6ED% upper case mu (maths italic)
 \string<\glshex 1D6EE% upper case nu (maths italic)
 \string<\glshex 1D6EF% upper case xi (maths italic)
 \string<\glshex 1D6F0% upper case omicron (maths italic)
 \string<\glshex 1D6F1% upper case pi (maths italic)
 \string<\glshex 1D6F2% upper case rho (maths italic)
 \string<\glshex 1D6F4% upper case sigma (maths italic)
 \string<\glshex 1D6F5% upper case tau (maths italic)
 \string<\glshex 1D6F6% upper case upsilon (maths italic)
 \string<\glshex 1D6F7% upper case phi (maths italic)
 \string<\glshex 1D6F8% upper case chi (maths italic)
 \string<\glshex 1D6F9% upper case psi (maths italic)
 \string<\glshex 1D6FA% upper case omega (maths italic)
}
\newcommand*{\glsxtrMathItalicUpperGreekIIrules}{%
 \glshex 1D6E2% upper case alpha (maths italic)
 \string<\glshex 1D6E3% upper case beta (maths italic)
 \string<\glshex 1D6E4% upper case gamma (maths italic)
 \string<\glshex 1D6E5% upper case delta (maths italic)
 \string<\glshex 1D6E6% upper case epsilon (maths italic)
 \string<\glshex 1D6E7% upper case zeta (maths italic)
 \string<\glshex 1D6E8% upper case eta (maths italic)
 \string<\glshex 1D6E9% upper case theta (maths italic)
 \string=\glshex 1D6F3% upper case theta variant (maths italic)
 \string<\glshex 1D6EA% upper case iota (maths italic)
 \string<\glshex 1D6EB% upper case kappa (maths italic)
 \string<\glshex 1D6EC% upper case lambda (maths italic)
 \string<\glshex 1D6ED% upper case mu (maths italic)
 \string<\glshex 1D6EE% upper case nu (maths italic)
 \string<\glshex 1D6EF% upper case xi (maths italic)
 \string<\glshex 1D6F0% upper case omicron (maths italic)
 \string<\glshex 1D6F1% upper case pi (maths italic)
 \string<\glshex 1D6F2% upper case rho (maths italic)
 \string<\glshex 1D6F4% upper case sigma (maths italic)
 \string<\glshex 1D6F5% upper case tau (maths italic)
 \string<\glshex 1D6F6% upper case upsilon (maths italic)
 \string<\glshex 1D6F7% upper case phi (maths italic)
 \string<\glshex 1D6F8% upper case chi (maths italic)
 \string<\glshex 1D6F9% upper case psi (maths italic)
 \string<\glshex 1D6FA% upper case omega (maths italic)
}
\newcommand*{\glsxtrMathItalicLowerGreekIrules}{%
 \glshex 1D6FC% lower case alpha (maths italic)
 \string<\glshex 1D6FD% lower case beta (maths italic)
 \string<\glshex 1D6FE% lower case gamma (maths italic)
 \string<\glshex 1D6FF% lower case delta (maths italic)
 \string<\glshex 1D700% lower case epsilon (maths italic)
 \string=\glshex 1D716% lower case epsilon variant (maths italic)
 \string<\glshex 03DD% lower case digamma
 \string<\glshex 1D701% lower case zeta (maths italic)
 \string<\glshex 1D702% lower case eta (maths italic)
 \string<\glshex 1D703% lower case theta (maths italic)
 \string=\glshex 1D717% lower case theta variant (maths italic)
 \string<\glshex 1D704% lower case iota (maths italic)
 \string<\glshex 1D705% lower case kappa (maths italic)
 \string=\glshex 1D718% lower case kappa variant (maths italic)
 \string<\glshex 1D706% lower case lambda (maths italic)
 \string<\glshex 1D707% lower case mu (maths italic)
 \string<\glshex 1D708% lower case nu (maths italic)
 \string<\glshex 1D709% lower case xi (maths italic)
 \string<\glshex 1D70A% lower case omicron (maths italic)
 \string<\glshex 1D70B% lower case pi (maths italic)
 \string=\glshex 1D71B% lower case pi variant (maths italic)
 \string<\glshex 1D70C% lower case rho (maths italic)
 \string=\glshex 1D71A% lower case rho variant (maths italic)
 \string<\glshex 1D70D% lower case final sigma (maths italic)
 \string=\glshex 1D70E% lower case sigma (maths italic)
 \string<\glshex 1D70F% lower case tau (maths italic)
 \string<\glshex 1D710% lower case upsilon (maths italic)
 \string<\glshex 1D711% lower case phi (maths italic)
 \string=\glshex 1D719% lower case phi variant (maths italic)
 \string<\glshex 1D712% lower case chi (maths italic)
 \string<\glshex 1D713% lower case psi (maths italic)
 \string<\glshex 1D714% lower case omega (maths italic)
}
\newcommand*{\glsxtrMathItalicLowerGreekIIrules}{%
 \glshex 1D6FC% lower case alpha (maths italic)
 \string<\glshex 1D6FD% lower case beta (maths italic)
 \string<\glshex 1D6FE% lower case gamma (maths italic)
 \string<\glshex 1D6FF% lower case delta (maths italic)
 \string<\glshex 1D700% lower case epsilon (maths italic)
 \string=\glshex 1D716% lower case epsilon variant (maths italic)
 \string<\glshex 1D701% lower case zeta (maths italic)
 \string<\glshex 1D702% lower case eta (maths italic)
 \string<\glshex 1D703% lower case theta (maths italic)
 \string=\glshex 1D717% lower case theta variant (maths italic)
 \string<\glshex 1D704% lower case iota (maths italic)
 \string<\glshex 1D705% lower case kappa (maths italic)
 \string=\glshex 1D718% lower case kappa variant (maths italic)
 \string<\glshex 1D706% lower case lambda (maths italic)
 \string<\glshex 1D707% lower case mu (maths italic)
 \string<\glshex 1D708% lower case nu (maths italic)
 \string<\glshex 1D709% lower case xi (maths italic)
 \string<\glshex 1D70A% lower case omicron (maths italic)
 \string<\glshex 1D70B% lower case pi (maths italic)
 \string=\glshex 1D71B% lower case pi variant (maths italic)
 \string<\glshex 1D70C% lower case rho (maths italic)
 \string=\glshex 1D71A% lower case rho variant (maths italic)
 \string<\glshex 1D70D% lower case final sigma (maths italic)
 \string=\glshex 1D70E% lower case sigma (maths italic)
 \string<\glshex 1D70F% lower case tau (maths italic)
 \string<\glshex 1D710% lower case upsilon (maths italic)
 \string<\glshex 1D711% lower case phi (maths italic)
 \string=\glshex 1D719% lower case phi variant (maths italic)
 \string<\glshex 1D712% lower case chi (maths italic)
 \string<\glshex 1D713% lower case psi (maths italic)
 \string<\glshex 1D714% lower case omega (maths italic)
}
\newcommand*{\glsxtrMathGreekIrules}{%
 \glsxtrMathItalicAlpha
 \string;\glsxtrUpAlpha
 \string<\glsxtrMathItalicBeta
 \string;\glsxtrUpBeta
 \string<\glsxtrMathItalicGamma
 \string;\glsxtrUpGamma
 \string<\glsxtrMathItalicDelta
 \string;\glsxtrUpDelta
 \string<\glsxtrMathItalicEpsilon
 \string;\glsxtrUpEpsilon
 \string<\glsxtrUpDigamma
 \string<\glsxtrMathItalicZeta
 \string;\glsxtrUpZeta
 \string<\glsxtrMathItalicEta
 \string;\glsxtrUpEta
 \string<\glsxtrMathItalicTheta
 \string;\glsxtrUpTheta
 \string<\glsxtrMathItalicIota
 \string;\glsxtrUpIota
 \string<\glsxtrMathItalicKappa
 \string;\glsxtrUpKappa
 \string<\glsxtrMathItalicLambda
 \string;\glsxtrUpLambda
 \string<\glsxtrMathItalicMu
 \string;\glsxtrUpMu
 \string<\glsxtrMathItalicNu
 \string;\glsxtrUpNu
 \string<\glsxtrMathItalicXi
 \string;\glsxtrUpXi
 \string<\glsxtrMathItalicOmicron
 \string;\glsxtrUpOmicron
 \string<\glsxtrMathItalicPi
 \string;\glsxtrUpPi
 \string<\glsxtrMathItalicRho
 \string;\glsxtrUpRho
 \string<\glsxtrMathItalicSigma
 \string;\glsxtrUpSigma
 \string<\glsxtrMathItalicTau
 \string;\glsxtrUpTau
 \string<\glsxtrMathItalicUpsilon
 \string;\glsxtrUpUpsilon
 \string<\glsxtrMathItalicPhi
 \string;\glsxtrUpPhi
 \string<\glsxtrMathItalicChi
 \string;\glsxtrUpChi
 \string<\glsxtrMathItalicPsi
 \string;\glsxtrUpPsi
 \string<\glsxtrMathItalicOmega
 \string;\glsxtrUpOmega
}
\newcommand*{\glsxtrMathGreekIIrules}{%
 \glsxtrMathItalicAlpha
 \string;\glsxtrUpAlpha
 \string<\glsxtrMathItalicBeta
 \string;\glsxtrUpBeta
 \string<\glsxtrMathItalicGamma
 \string;\glsxtrUpGamma
 \string<\glsxtrMathItalicDelta
 \string;\glsxtrUpDelta
 \string<\glsxtrMathItalicEpsilon
 \string;\glsxtrUpEpsilon
 \string<\glsxtrMathItalicZeta
 \string;\glsxtrUpZeta
 \string<\glsxtrMathItalicEta
 \string;\glsxtrUpEta
 \string<\glsxtrMathItalicTheta
 \string;\glsxtrUpTheta
 \string<\glsxtrMathItalicIota
 \string;\glsxtrUpIota
 \string<\glsxtrMathItalicKappa
 \string;\glsxtrUpKappa
 \string<\glsxtrMathItalicLambda
 \string;\glsxtrUpLambda
 \string<\glsxtrMathItalicMu
 \string;\glsxtrUpMu
 \string<\glsxtrMathItalicNu
 \string;\glsxtrUpNu
 \string<\glsxtrMathItalicXi
 \string;\glsxtrUpXi
 \string<\glsxtrMathItalicOmicron
 \string;\glsxtrUpOmicron
 \string<\glsxtrMathItalicPi
 \string;\glsxtrUpPi
 \string<\glsxtrMathItalicRho
 \string;\glsxtrUpRho
 \string<\glsxtrMathItalicSigma
 \string;\glsxtrUpSigma
 \string<\glsxtrMathItalicTau
 \string;\glsxtrUpTau
 \string<\glsxtrMathItalicUpsilon
 \string;\glsxtrUpUpsilon
 \string<\glsxtrMathItalicPhi
 \string;\glsxtrUpPhi
 \string<\glsxtrMathItalicChi
 \string;\glsxtrUpChi
 \string<\glsxtrMathItalicPsi
 \string;\glsxtrUpPsi
 \string<\glsxtrMathItalicOmega
 \string;\glsxtrUpOmega
}
\newcommand*{\glsxtrUpAlpha}{%
 \glshex 03B1,% lower case alpha
 \glshex 0391% upper case alpha
}
\newcommand*{\glsxtrUpBeta}{%
 \glshex 03B2,% lower case beta
 \glshex 0392% upper case beta
}
\newcommand*{\glsxtrUpGamma}{%
 \glshex 03B3,% lower case gamma
 \glshex 0393% upper case gamma
}
\newcommand*{\glsxtrUpDelta}{%
 \glshex 03B4,% lower case delta
 \glshex 0394% upper case delta
}
\newcommand*{\glsxtrUpEpsilon}{%
 \glshex 03B5% lower case epsilon
 \string=\glshex 03F5,% lower case epsilon variant
 \glshex 0395% upper case epsilon
}
\newcommand*{\glsxtrUpDigamma}{%
 \glshex 03DD,% lower case digamma
 \glshex 03DC% upper case digamma
}
\newcommand*{\glsxtrUpZeta}{%
 \glshex 03B6,% lower case zeta
 \glshex 0396% upper case zeta
}
\newcommand*{\glsxtrUpEta}{%
 \glshex 03B7,% lower case eta
 \glshex 0397% upper case eta
}
\newcommand*{\glsxtrUpTheta}{%
 \glshex 03B8% lower case theta
 \string=\glshex 03D1,% lower case theta variant
 \glshex 0398% upper case theta
}
\newcommand*{\glsxtrUpIota}{%
 \glshex 03B9,% lower case iota
 \glshex 0399% upper case iota
}
\newcommand*{\glsxtrUpKappa}{%
 \glshex 03BA% lower case kappa
 \string=\glshex 03F0,% lower case kappa variant
 \glshex 039A% upper case kappa
}
\newcommand*{\glsxtrUpLambda}{%
 \glshex 03BB,% lower lambda
 \glshex 039B% upper case lambda
}
\newcommand*{\glsxtrUpMu}{%
 \glshex 03BC,% lower case mu
 \glshex 039C% upper case mu
}
\newcommand*{\glsxtrUpNu}{%
 \glshex 03BD,% lower case nu
 \glshex 039D% upper case nu
}
\newcommand*{\glsxtrUpXi}{%
 \glshex 03BE,% lower case xi
 \glshex 039E% upper case xi
}
\newcommand*{\glsxtrUpOmicron}{%
 \glshex 03BF,% lower case omicron
 \glshex 039F% upper case omicron
}
\newcommand*{\glsxtrUpPi}{%
 \glshex 03C0% lower case pi
 \string=\glshex 03D6,% lower case pi variant
 \glshex 03A0% upper case pi
}
\newcommand*{\glsxtrUpRho}{%
 \glshex 03C1% lower case rho
 \string=\glshex 03F1,% lower case rho variant
 \glshex 03A1% upper case rho
}
\newcommand*{\glsxtrUpSigma}{%
 \glshex 03C2% lower case sigma
 \string=\glshex 03C3,% lower case sigma
 \glshex 03A3% upper case sigma
}
\newcommand*{\glsxtrUpTau}{%
 \glshex 03C4,% lower case tau
 \glshex 03A4% upper case tau
}
\newcommand*{\glsxtrUpUpsilon}{%
 \glshex 03C5,% lower case upsilon
 \glshex 03A5% upper case upsilon
}
\newcommand*{\glsxtrUpPhi}{%
 \glshex 03C6% lower case phi
 \string=\glshex 03D5,% lower case phi variant
 \glshex 03A6% upper case phi
}
\newcommand*{\glsxtrUpChi}{%
 \glshex 03C7,% lower case chi
 \glshex 03A7% upper case chi
}
\newcommand*{\glsxtrUpPsi}{%
 \glshex 03C8,% lower case psi
 \glshex 03A8% upper case psi
}
\newcommand*{\glsxtrUpOmega}{%
 \glshex 03C9,% lower case omega
 \glshex 03A9% upper case omega
}
\newcommand*{\glsxtrMathItalicAlpha}{%
 \glshex 1D6FC,% lower case alpha (maths italic)
 \glshex 1D6E2% upper case alpha (maths italic)
}
\newcommand*{\glsxtrMathItalicBeta}{%
 \glshex 1D6FD,% lower case beta (maths italic)
 \glshex 1D6E3% upper case beta (maths italic)
}
\newcommand*{\glsxtrMathItalicGamma}{%
 \glshex 1D6FE,% lower case gamma (maths italic)
 \glshex 1D6E4% upper case gamma (maths italic)
}
\newcommand*{\glsxtrMathItalicDelta}{%
 \glshex 1D6FF,% lower case delta (maths italic)
 \glshex 1D6E5% upper case delta (maths italic)
}
\newcommand*{\glsxtrMathItalicEpsilon}{%
 \glshex 1D700% lower case epsilon (maths italic)
 \string=\glshex 1D716,% lower case epsilon variant (maths italic)
 \glshex 1D6E6% upper case epsilon (maths italic)
}
\newcommand*{\glsxtrMathItalicZeta}{%
 \glshex 1D701,% lower case zeta (maths italic)
 \glshex 1D6E7% upper case zeta (maths italic)
}
\newcommand*{\glsxtrMathItalicEta}{%
 \glshex 1D702,% lower case eta (maths italic)
 \glshex 1D6E8% upper case eta (maths italic)
}
\newcommand*{\glsxtrMathItalicTheta}{%
 \glshex 1D703% lower case theta (maths italic)
 \string=\glshex 1D717,% lower case theta variant (maths italic)
 \glshex 1D6E9% upper case theta (maths italic)
 \string=\glshex 1D6F3% upper case theta variant (maths italic)
}
\newcommand*{\glsxtrMathItalicIota}{%
 \glshex 1D704,% lower case iota (maths italic)
 \glshex 1D6EA% upper case iota (maths italic)
}
\newcommand*{\glsxtrMathItalicKappa}{%
 \glshex 1D705% lower case kappa (maths italic)
 \string=\glshex 1D718,% lower case kappa variant (maths italic)
 \glshex 1D6EB% upper case kappa (maths italic)
}
\newcommand*{\glsxtrMathItalicLambda}{%
 \glshex 1D706,% lower case lambda (maths italic)
 \glshex 1D6EC% upper case lambda (maths italic)
}
\newcommand*{\glsxtrMathItalicMu}{%
 \glshex 1D707,% lower case mu (maths italic)
 \glshex 1D6ED% upper case mu (maths italic)
}
\newcommand*{\glsxtrMathItalicNu}{%
 \glshex 1D708,% lower case nu (maths italic)
 \glshex 1D6EE% upper case nu (maths italic)
}
\newcommand*{\glsxtrMathItalicXi}{%
 \glshex 1D709,% lower case xi (maths italic)
 \glshex 1D6EF% upper case xi (maths italic)
}
\newcommand*{\glsxtrMathItalicOmicron}{%
 \glshex 1D70A,% lower case omicron (maths italic)
 \glshex 1D6F0% upper case omicron (maths italic)
}
\newcommand*{\glsxtrMathItalicPi}{%
 \glshex 1D70B% lower case pi (maths italic)
 \string=\glshex 1D71B,% lower case pi variant (maths italic)
 \glshex 1D6F1% upper case pi (maths italic)
}
\newcommand*{\glsxtrMathItalicRho}{%
 \glshex 1D70C% lower case rho (maths italic)
 \string=\glshex 1D71A,% lower case rho variant (maths italic)
 \glshex 1D6F2% upper case rho (maths italic)
}
\newcommand*{\glsxtrMathItalicSigma}{%
 \glshex 1D70D% lower case final sigma (maths italic)
 \string=\glshex 1D70E,% lower case sigma (maths italic)
 \glshex 1D6F4% upper case sigma (maths italic)
}
\newcommand*{\glsxtrMathItalicTau}{%
 \glshex 1D70F,% lower case tau (maths italic)
 \glshex 1D6F5% upper case tau (maths italic)
}
\newcommand*{\glsxtrMathItalicUpsilon}{%
 \glshex 1D710,% lower case upsilon (maths italic)
 \glshex 1D6F6% upper case upsilon (maths italic)
}
\newcommand*{\glsxtrMathItalicPhi}{%
 \glshex 1D711% lower case phi (maths italic)
 \string=\glshex 1D719,% lower case phi variant (maths italic)
 \glshex 1D6F7% upper case phi (maths italic)
}
\newcommand*{\glsxtrMathItalicChi}{%
 \glshex 1D712,% lower case chi (maths italic)
 \glshex 1D6F8% upper case chi (maths italic)
}
\newcommand*{\glsxtrMathItalicPsi}{%
 \glshex 1D713,% lower case psi (maths italic)
 \glshex 1D6F9% upper case psi (maths italic)
}
\newcommand*{\glsxtrMathItalicOmega}{%
 \glshex 1D714,% lower case omega (maths italic)
 \glshex 1D6FA% upper case omega (maths italic)
}
\newcommand*{\glsxtrMathItalicPartial}{%
 \glshex 1D715% partial differential (maths italic)
}
\newcommand*{\glsxtrMathItalicNabla}{%
 \glshex 1D6FB% nabla (maths italic)
}
\newcommand*{\glsxtrdigitrules}{%
 0\string=\glshex 2080\string=\glshex 2070
 \string<1\string=\glshex 2081\string=\glshex 00B9
 \string<2\string=\glshex 2082\string=\glshex 00B2
 \string<3\string=\glshex 2083\string=\glshex 00B3
 \string<4\string=\glshex 2084\string=\glshex 2074
 \string<5\string=\glshex 2085\string=\glshex 2075
 \string<6\string=\glshex 2086\string=\glshex 2076
 \string<7\string=\glshex 2087\string=\glshex 2077
 \string<8\string=\glshex 2088\string=\glshex 2078
 \string<9\string=\glshex 2089\string=\glshex 2079
}
\newcommand*{\glsxtrBasicDigitrules}{%
 0\string<1\string<2\string<3\string<4%
 \string<5\string<6\string<7\string<8\string<9%
}
\newcommand*{\glsxtrSubScriptDigitrules}{%
 \glshex 2080% subscript 0
 \string<\glshex 2081% subscript 1
 \string<\glshex 2082% subscript 2
 \string<\glshex 2083% subscript 3
 \string<\glshex 2084% subscript 4
 \string<\glshex 2085% subscript 5
 \string<\glshex 2086% subscript 6
 \string<\glshex 2087% subscript 7
 \string<\glshex 2088% subscript 8
 \string<\glshex 2089% subscript 9
}
\newcommand*{\glsxtrSuperScriptDigitrules}{%
 \glshex 2070% superscript 0
 \string<\glshex 00B9% superscript 1
 \string<\glshex 00B2% superscript 2
 \string<\glshex 00B3% superscript 3
 \string<\glshex 2074% superscript 4
 \string<\glshex 2075% superscript 5
 \string<\glshex 2076% superscript 6
 \string<\glshex 2077% superscript 7
 \string<\glshex 2078% superscript 8
 \string<\glshex 2079% superscript 9
}
\newcommand*{\glsxtrfractionrules}{%
 \glshex 215F% fraction numerator one (1/)
 \string<\glshex 2189% zero thirds (0/3 = 0)
 \string<\glshex 2152% one tenth (1/10 = 0.1)
 \string<\glshex 2151% one ninth (1/9 ~ 0.111)
 \string<\glshex 215B% one eighth (1/8 = 0.125)
 \string<\glshex 2150% one seventh (1/7 ~ 0.143)
 \string<\glshex 2159% one sixth (1/6 ~ 0.167)
 \string<\glshex 2155% one fifth (1/5 = 0.2)
 \string<\glshex 00BC% one quarter (1/4 = 0.25)
 \string<\glshex 2153% one third (1/3 ~ 0.333)
 \string<\glshex 215C% three eighths (3/8 = 0.375)
 \string<\glshex 2156% two fifths (2/5 = 0.4)
 \string<\glshex 00BD% one half (1/2 = 0.5)
 \string<\glshex 2157% three fifths (3/5 = 0.6)
 \string<\glshex 215D% five eighths (5/8 = 0.625)
 \string<\glshex 2154% two thirds (2/3 ~ 0.667)
 \string<\glshex 00BE% three quarters (3/4 = 0.75)
 \string<\glshex 2158% four fifths (4/5 = 0.8)
 \string<\glshex 215A% five sixths (5/6 ~ 0.833)
 \string<\glshex 215E% seven eighths (7/8 = 0.875)
}
\renewcommand{\@glsxtrdialecthook}{%
  \ifundef\CurrentTrackedScript
  {%
    \TrackLangIfHasDefaultScript{\CurrentTrackedLanguage}%
    {%
     \edef\CurrentTrackedScript{%
       \TrackLangGetDefaultScript\CurrentTrackedLanguage}%
    }%
    {}%
  }%
  {}%
  \ifdef\CurrentTrackedScript
  {%
    \let\gls@orgTrackLangRequireDialectPrefix\TrackLangRequireDialectPrefix
    \def\TrackLangRequireDialectPrefix{glossariesxtr-}%
    \let\CurrentTrackedTag\CurrentTrackedScript
    \IfFileExists{\TrackLangRequireDialectPrefix\CurrentTrackedTag.ldf}
    {\RequireGlossariesExtraLang{\CurrentTrackedTag}}%
    {}%
    \let\TrackLangRequireDialectPrefix\gls@orgTrackLangRequireDialectPrefix
  }%
  {}%
}
\ifdef\glsxtr@loaddialect
{%
  \@ifpackageloaded{tracklang}
  {%
    \AnyTrackedLanguages
    {%
      \ForEachTrackedDialect{\this@dialect}{\glsxtr@loaddialect}%
    }%
    {}%
  }
  {}
}
{}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossaries-extra-bib2gls-2021-11-22.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossaries-extra-stylemods-2021-11-22.sty>
%    \end{macrocode}
%\fi
%\subsection{Rollback v1.48 (glossaries-extra-stylemods-2021-11-22.sty)}
% Version 1.48 preserved for rollback.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{glossaries-extra-stylemods}[2021/11/22 v1.48 (NLCT)]
\newcommand*{\@glsxtr@loadstyles}{}
\DeclareOption{all}{%
  \appto\@glsxtr@loadstyles{%
    \RequirePackage{glossary-inline}%
    \RequirePackage{glossary-list}%
    \RequirePackage{glossary-tree}%
    \RequirePackage{glossary-mcols}%
    \RequirePackage{glossary-long}%
    \RequirePackage{glossary-longragged}%
    \RequirePackage{glossary-longbooktabs}%
    \RequirePackage{glossary-super}%
    \RequirePackage{glossary-superragged}%
    \RequirePackage{glossary-bookindex}[=v1.48]%
    \RequirePackage{glossary-longextra}[=v1.48]%
    \RequirePackage{glossary-topic}[=v1.48]%
  }
}
\DeclareOption*{%
  \IfFileExists{glossary-\CurrentOption.sty}
   {\eappto\@glsxtr@loadstyles{%
      \noexpand\RequirePackage{glossary-\CurrentOption}}%
   }%
   {%
     \PackageError{glossaries-extra-styles}%
     {Unknown option `\CurrentOption'}{}%
   }%
}
\ProcessOptions
\@glsxtr@loadstyles
\providecommand*{\glsxtrprelocation}{\space}
\providecommand{\renewglossarystyle}[2]{%
  \ifcsundef{@glsstyle@#1}%
  {%
    \PackageError{glossaries-extra}{Glossary style `#1' isn't already defined}{}%
  }%
  {%
    \csdef{@glsstyle@#1}{#2}%
  }%
}
\ifdef{\@glsstyle@listdotted}
{%
 \renewglossarystyle{listdotted}{%
   \setglossarystyle{list}%
   \renewcommand*{\glossentry}[2]{%
    \item[]\makebox[\glslistdottedwidth][l]{%
      \glsentryitem{##1}%
      \glstarget{##1}{\glossentryname{##1}}%
      \unskip\leaders\hbox to 2.9mm{\hss.}\hfill\strut}%
      \glossentrydesc{##1}\glspostdescription}%
   \renewcommand*{\subglossentry}[3]{%
    \item[]\makebox[\glslistdottedwidth][l]{%
    \glssubentryitem{##2}%
    \glstarget{##2}{\glossentryname{##2}}%
    \unskip\leaders\hbox to 2.9mm{\hss.}\hfill\strut}%
    \glossentrydesc{##2}\glspostdescription}%
 }
}
{%
}
\ifdef{\@glsstyle@list}
{%
  \newcommand{\glslistprelocation}{\glsxtrprelocation}
  \newcommand{\glslistchildprelocation}{\glslistprelocation}
  \newcommand{\glslistchildpostlocation}{.}
  \newcommand{\glslistdesc}[1]{\glossentrydesc{#1}\glspostdescription}
  \newcommand{\glslistgroupskip}{\nobreak\indexspace\nobreak}
  \newcommand{\glslistitem}[1]{%
    \item[\glsentryitem{#1}%
          \glstarget{#1}{\glossentryname{#1}}]%
  }
  \providecommand{\glslistinit}{%
    \ifdef\GetTitleStringDisableCommands
    {%
      \GetTitleStringSetup{expand}%
      \GetTitleStringDisableCommands{%
        \let\glsentryitem\@gobble
        \let\glstarget\@secondoftwo
        \let\glossentryname\glslistexpandedname
        \let\glslistgroupheaderfmt\@firstofone
        \let\glsgetgrouptitle\@firstofone
        \let\glsnavhypertarget\@secondoftwo
        \let\glsnavigation\relax
      }%
    }%
    {}%
  }
  \providecommand{\glslistexpandedname}[1]{%
    \ifcsname glo@\glsdetoklabel{#1}@name\endcsname
     \expandafter\expandonce\csname glo@\glsdetoklabel{#1}@name\expandafter\endcsname
    \fi
  }
  \renewglossarystyle{list}{%
    \renewenvironment{theglossary}%
      {\glslistinit\begin{description}}{\end{description}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand*{\glossentry}[2]{%
      \glslistitem{##1}\glslistdesc{##1}\glslistprelocation ##2}%
    \renewcommand*{\subglossentry}[3]{%
      \glssubentryitem{##2}%
      \glstarget{##2}{\strut}\space
      \glslistdesc{##2}%
      \glslistchildprelocation ##3\glslistchildpostlocation}%
    \renewcommand*{\glsgroupskip}{\ifglsnogroupskip\else\glslistgroupskip\fi}%
  }
}
{}
\ifdef{\@glsstyle@altlist}
{%
  \newcommand{\glsaltlistitem}[1]{%
    \glslistitem{#1}%
    \mbox{}\par\nobreak\@afterheading
  }
  \renewglossarystyle{altlist}{%
    \setglossarystyle{list}%
    \renewcommand*{\glossentry}[2]{%
      \glsaltlistitem{##1}%
      \glslistdesc{##1}\glslistprelocation ##2}%
    \renewcommand{\subglossentry}[3]{%
      \par
      \glssubentryitem{##2}%
      \glstarget{##2}{\strut}\glslistdesc{##2}%
      \glslistchildprelocation ##3}%
  }
}
{}
\ifdef{\@glsstyle@listgroup}
{%
  \newcommand{\glslistgroupheaderitem}[2]{\item[{#2}]}
  \newcommand{\glslistgroupafterheader}{%
      \mbox{}\par\nobreak\@afterheading
  }
  \renewglossarystyle{listgroup}{%
    \setglossarystyle{list}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glslistgroupheaderitem{##1}{\glslistgroupheaderfmt{\glsgetgrouptitle{##1}}}%
      \glslistgroupafterheader
    }%
  }
}
{}
\ifdef{\@glsstyle@listhypergroup}
{%
  \renewglossarystyle{listhypergroup}{%
    \setglossarystyle{list}%
    \renewcommand*{\glossaryheader}{%
      \glslistnavigationitem{\glsnavigation}}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glslistgroupheaderitem{##1}{\glslistgroupheaderfmt
         {\glsnavhypertarget{##1}{\glsgetgrouptitle{##1}}}}%
      \glslistgroupafterheader
    }%
  }
}
{}
\ifdef{\@glsstyle@altlistgroup}
{%
  \renewglossarystyle{altlistgroup}{%
    \setglossarystyle{altlist}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glslistgroupheaderitem{##1}%
        {\glslistgroupheaderfmt{\glsgetgrouptitle{##1}}}%
      \glslistgroupafterheader
    }%
  }
}
{}
\ifdef{\@glsstyle@altlisthypergroup}
{%
  \renewglossarystyle{altlisthypergroup}{%
    \setglossarystyle{altlist}%
    \renewcommand*{\glossaryheader}{%
      \glslistnavigationitem{\glsnavigation}}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glslistgroupheaderitem{##1}{\glslistgroupheaderfmt
        {\glsnavhypertarget{##1}{\glsgetgrouptitle{##1}}}}%
      \glslistgroupafterheader
    }%
  }
}
{}
\ifcsdef{@glsstyle@long}
{%
  \renewglossarystyle{long}{%
    \renewenvironment{theglossary}%
       {\begin{longtable}{lp{\glsdescwidth}}}%
       {\end{longtable}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription
      \glsxtrprelocation ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription
       \glsxtrprelocation ##3\tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{ & \tabularnewline}%
    \fi
  }
}
{}
\ifcsdef{@glsstyle@long3col}
{%
  \renewglossarystyle{long3col}{%
    \renewenvironment{theglossary}%
      {\begin{longtable}{lp{\glsdescwidth}p{\glspagelistwidth}}}%
      {\end{longtable}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription & ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       ##3\tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{& &\tabularnewline}%
    \fi
  }
}
{}
\ifcsdef{@glsstyle@long4col}
{%
  \renewglossarystyle{long4col}{%
    \renewenvironment{theglossary}%
      {\begin{longtable}{llll}}%
      {\end{longtable}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription &
      \glossentrysymbol{##1} &
      ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       \glossentrysymbol{##2} & ##3\tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{& & &\tabularnewline}%
    \fi
  }
}
{}
\ifcsdef{@glsstyle@longragged}
{%
  \renewglossarystyle{longragged}{%
    \renewenvironment{theglossary}%
       {\begin{longtable}{l>{\raggedright}p{\glsdescwidth}}}%
       {\end{longtable}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription\glsxtrprelocation ##2%
      \tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}%
       \glspostdescription\glsxtrprelocation ##3%
       \tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{ & \tabularnewline}%
    \fi
  }
}
{}
\ifcsdef{@glsstyle@longragged3col}
{%
  \renewglossarystyle{longragged3col}{%
    \renewenvironment{theglossary}%
      {\begin{longtable}{l>{\raggedright}p{\glsdescwidth}%
         >{\raggedright}p{\glspagelistwidth}}}%
      {\end{longtable}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription & ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       ##3\tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{& &\tabularnewline}%
    \fi
  }
}
{}
\ifcsdef{@glsstyle@altlongragged4col}
{%
  \renewglossarystyle{altlongragged4col}{%
    \renewenvironment{theglossary}%
      {\begin{longtable}{l>{\raggedright}p{\glsdescwidth}l%
         >{\raggedright}p{\glspagelistwidth}}}%
      {\end{longtable}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription & \glossentrysymbol{##1} &
      ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       \glossentrysymbol{##2} & ##3\tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{& & &\tabularnewline}%
    \fi
  }
}
{}
\ifcsdef{@glsstyle@super}
{%
  \renewglossarystyle{super}{%
    \renewenvironment{theglossary}%
      {\tablehead{}\tabletail{}%
       \begin{supertabular}{lp{\glsdescwidth}}}%
      {\end{supertabular}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription
      \glsxtrprelocation ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription
       \glsxtrprelocation ##3\tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{& \tabularnewline}%
    \fi
  }
}
{}
\ifcsdef{@glsstyle@super3col}
{%
  \renewglossarystyle{super3col}{%
    \renewenvironment{theglossary}%
      {\tablehead{}\tabletail{}%
       \begin{supertabular}{lp{\glsdescwidth}p{\glspagelistwidth}}}%
      {\end{supertabular}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription & ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       ##3\tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{ & &\tabularnewline}%
    \fi
  }
}
{}
\ifcsdef{@glsstyle@super4col}
{%
  \renewglossarystyle{super4col}{%
    \renewenvironment{theglossary}%
      {\tablehead{}\tabletail{}%
       \begin{supertabular}{llll}}{%
       \end{supertabular}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription &
      \glossentrysymbol{##1} & ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       \glossentrysymbol{##2} & ##3\tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{& & &\tabularnewline}%
    \fi
  }
}
{}
\ifcsdef{@glsstyle@superragged}
{%
  \renewglossarystyle{superragged}{%
    \renewenvironment{theglossary}%
      {\tablehead{}\tabletail{}%
       \begin{supertabular}{l>{\raggedright}p{\glsdescwidth}}}%
      {\end{supertabular}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription\glsxtrprelocation ##2%
      \tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription
       \glsxtrprelocation ##3%
       \tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{& \tabularnewline}%
    \fi
  }
}
{}
\ifcsdef{@glsstyle@superragged3col}
{%
  \renewglossarystyle{superragged3col}{%
    \renewenvironment{theglossary}%
      {\tablehead{}\tabletail{}%
       \begin{supertabular}{l>{\raggedright}p{\glsdescwidth}%
          >{\raggedright}p{\glspagelistwidth}}}%
      {\end{supertabular}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription &
      ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       ##3\tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{ & &\tabularnewline}%
    \fi
  }
}
{}
\ifcsdef{@glsstyle@altsuperragged4col}
{%
  \renewglossarystyle{altsuperragged4col}{%
    \renewenvironment{theglossary}%
      {\tablehead{}\tabletail{}%
       \begin{supertabular}{l>{\raggedright}p{\glsdescwidth}l%
         >{\raggedright}p{\glspagelistwidth}}}%
      {\end{supertabular}}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand{\glossentry}[2]{%
      \glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}} &
      \glossentrydesc{##1}\glspostdescription &
      \glossentrysymbol{##1} & ##2\tabularnewline
    }%
    \renewcommand{\subglossentry}[3]{%
       &
       \glssubentryitem{##2}%
       \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription &
       \glossentrysymbol{##2} & ##3\tabularnewline
    }%
    \ifglsnogroupskip
      \renewcommand*{\glsgroupskip}{}%
    \else
      \renewcommand*{\glsgroupskip}{& & &\tabularnewline}%
    \fi
  }
}
{}
\ifdef{\@glsstyle@inline}
{%
   \renewcommand*{\glspostinline}{.\spacefactor\sfcode`\.}
   \renewcommand*{\glsinlinedescformat}[3]{%
     \space#1\glsxtrpostdescription}
   \renewcommand*{\glsinlinesubdescformat}[3]{%
     #1\glsxtrpostdescription}
}
{}
\ifdef\glstreenamefmt
{
  \newcommand{\glstreedefaultnamefmt}[1]{\textbf{#1}}
  \renewcommand{\glstreenamefmt}[1]{\glstreedefaultnamefmt{#1}}
  \def\glstreegroupheaderfmt#1{\glstreedefaultnamefmt{#1}}
  \def\glstreenavigationfmt#1{\glstreedefaultnamefmt{#1}}
  \newcommand{\glstreePreHeader}[2]{}
}
{}
\ifdef{\@glsstyle@index}
{
  \newcommand*{\glstreeprelocation}{\glsxtrprelocation}
  \newcommand*{\glstreechildprelocation}{\glstreeprelocation}
  \newcommand{\glstreegroupskip}{\indexspace}
  \newcommand{\glstreegroupheaderskip}{\nopagebreak\glstreegroupskip\nobreak}
  \renewglossarystyle{index}{%
    \renewenvironment{theglossary}%
      {\setlength{\parindent}{0pt}%
       \setlength{\parskip}{0pt plus 0.3pt}%
       \let\item\glstreeitem
       \let\subitem\glstreesubitem
       \let\subsubitem\glstreesubsubitem
      }%
    {\par}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand*{\glossentry}[2]{%
       \item\glsentryitem{##1}%
       \glstreenamefmt{\glstarget{##1}{\glossentryname{##1}}}%
       \glstreesymbol{##1}%
       \glstreeDescLoc{##1}{##2}%
    }%
    \renewcommand{\subglossentry}[3]{%
      \ifcase##1\relax
        \item
      \or
        \subitem
        \glssubentryitem{##2}%
      \else
        \subsubitem
      \fi
      \glstreenamefmt{\glstarget{##2}{\glossentryname{##2}}}%
      \glstreechildsymbol{##2}%
      \glstreeChildDescLoc{##2}{##3}%
    }%
    \renewcommand*{\glsgroupskip}{\ifglsnogroupskip\else\glstreegroupskip\fi}%
  }
}
{}
\ifdef{\@glsstyle@indexgroup}
{%
  \renewglossarystyle{indexgroup}{%
    \setglossarystyle{index}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \item\glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip\@afterheading
    }%
  }
}
{}
\ifdef{\@glsstyle@indexhypergroup}
{%
  \renewglossarystyle{indexhypergroup}{%
    \setglossarystyle{index}%
    \renewcommand*{\glossaryheader}{%
      \item\glstreenavigationfmt{\glsnavigation}%
       \glstreegroupheaderskip\@afterheading}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \item\glstreegroupheaderfmt
        {\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading}%
  }%
}
{}
\ifdef{\@glsstyle@tree}
{%
\newcommand{\glsxtrtreepredesc}{\glstreepredesc}
\newcommand{\glsxtrtreechildpredesc}{\glstreechildpredesc}
  \newcommand{\glstreedesc}[1]{%
    \glsxtrtreepredesc\glossentrydesc{#1}\glspostdescription
  }
  \newcommand{\glstreeDescLoc}[2]{%
    \ifglshasdesc{#1}%
    {\glstreedesc{#1}\glstreeprelocation}%
    {\ifglshassymbol{#1}{\glstreeprelocation}{\glstreeNoDescSymbolPreLocation}}%
    #2%
  }
  \newcommand{\glstreeNoDescSymbolPreLocation}{\space}
  \newcommand{\glstreesymbol}[1]{%
    \ifglshassymbol{#1}{\space(\glossentrysymbol{#1})}{}%
  }%
  \newcommand{\glstreechilddesc}[1]{%
    \glsxtrtreechildpredesc\glossentrydesc{#1}\glspostdescription
  }%
  \newcommand{\glstreeChildDescLoc}[2]{%
    \ifglshasdesc{#1}%
    {\glstreechilddesc{#1}\glstreechildprelocation}%
    {\ifglshassymbol{#1}{\glstreechildprelocation}%
      {\glstreeNoDescSymbolPreLocation}%
    }%
    #2%
  }%
  \newcommand{\glstreechildsymbol}[1]{%
    \glstreesymbol{#1}%
  }%
  \renewglossarystyle{tree}{%
    \renewenvironment{theglossary}%
      {\setlength{\parindent}{0pt}%
       \setlength{\parskip}{0pt plus 0.3pt}}%
      {}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glsentryitem{##1}\glstreenamefmt{\glstarget{##1}{\glossentryname{##1}}}%
      \glstreesymbol{##1}%
      \glstreeDescLoc{##1}{##2}\par
    }%
    \renewcommand{\subglossentry}[3]{%
      \hangindent##1\glstreeindent\relax
      \parindent##1\glstreeindent\relax
      \ifnum##1=1\relax
        \glssubentryitem{##2}%
      \fi
      \glstreenamefmt{\glstarget{##2}{\glossentryname{##2}}}%
      \glstreechildsymbol{##2}%
      \glstreeChildDescLoc{##2}{##3}\par
    }%
    \renewcommand*{\glsgroupskip}{\ifglsnogroupskip\else\glstreegroupskip\fi}%
  }%
}
{}
\ifdef{\@glsstyle@treegroup}
{%
  \renewglossarystyle{treegroup}{%
    \setglossarystyle{tree}%
    \renewcommand{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent\glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip\@afterheading}%
  }
}
{}
\ifdef{\@glsstyle@treehypergroup}
{%
  \renewglossarystyle{treehypergroup}{%
    \setglossarystyle{tree}%
    \renewcommand*{\glossaryheader}{%
      \par\noindent\glstreenavigationfmt{\glsnavigation}%
      \glstreegroupheaderskip\@afterheading}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent
      \glstreegroupheaderfmt
        {\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading}%
  }
}
{}
\ifdef{\@glsstyle@treenoname}
{%
  \newcommand{\glstreenonamedesc}[1]{%
    \glstreepredesc\glossentrydesc{#1}\glspostdescription
  }%
  \newcommand{\glstreenonamesymbol}[1]{%
    \ifglshassymbol{#1}{\space(\glossentrysymbol{#1})}{}%
  }%
  \newcommand{\glstreenonameDescLoc}[2]{%
    \glstreenonamedesc{#1}\glstreeprelocation#2%
  }
  \newcommand{\glstreenonamechilddesc}[1]{%
    \glossentrydesc{#1}\glspostdescription
  }%
  \newcommand{\glstreenonameChildDescLoc}[2]{%
    \glstreenonamechilddesc{#1}\glstreechildprelocation#2%
  }
  \renewglossarystyle{treenoname}{%
    \renewenvironment{theglossary}%
      {\setlength{\parindent}{0pt}%
       \setlength{\parskip}{0pt plus 0.3pt}}%
      {}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glsentryitem{##1}\glstreenamefmt{\glstarget{##1}{\glossentryname{##1}}}%
      \glstreenonamesymbol{##1}%
      \glstreenonameDescLoc{##1}{##2}\par
    }%
    \renewcommand{\subglossentry}[3]{%
      \hangindent##1\glstreeindent\relax
      \parindent##1\glstreeindent\relax
      \ifnum##1=1\relax
        \glssubentryitem{##2}%
      \fi
      \glstarget{##2}{\strut}%
      \glstreenonameChildDescLoc{##2}{##3}\par
    }%
    \renewcommand*{\glsgroupskip}{\ifglsnogroupskip\else\glstreegroupskip\fi}%
  }
}
{}
\ifdef{\@glsstyle@treenonamegroup}
{%
  \renewglossarystyle{treenonamegroup}{%
    \setglossarystyle{treenoname}%
    \renewcommand{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent\glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip\@afterheading
    }%
  }
}
{}
\ifdef{\@glsstyle@treenonamehypergroup}
{%
  \renewglossarystyle{treenonamehypergroup}{%
    \setglossarystyle{treenoname}%
    \renewcommand*{\glossaryheader}{%
      \par\noindent\glstreenavigationfmt{\glsnavigation}%
      \glstreegroupheaderskip\@afterheading}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading}%
  }
}
{}
\ifdef{\@glsstyle@alttree}
{%
\newcommand{\glsalttreepredesc}{}
\newcommand{\glsalttreechildpredesc}{\glsalttreepredesc}
  \newcommand{\glsxtralttreeSymbolDescLocation}[2]{%
    {%
      \let\par\glsxtrAltTreePar
      \let\glsxtrtreepredesc\glsalttreepredesc
      \let\glsxtrtreechildpredesc\glsalttreechildpredesc
      \ifglshassymbol{#1}{(\glossentrysymbol{#1})\space}{}%
      \glstreeDescLoc{#1}{#2}\par
    }%
  }
  \newlength\glsxtrAltTreeIndent
  \newcommand{\glsxtrAltTreePar}{%
    \@@par
    \glsxtrAltTreeSetHangIndent
    \setlength{\parindent}{\dimexpr\hangindent+\glsxtrAltTreeIndent}%
  }
  \newcommand{\glsxtralttreeSubSymbolDescLocation}[3]{%
    \glsxtralttreeSymbolDescLocation{#2}{#3}%
  }
  \newlength\glsxtrtreetopindent
  \newcommand*{\glsxtralttreeInit}{%
    \settowidth{\glsxtrtreetopindent}{\glstreenamefmt{\glsgetwidestname\space}}%
    \glsxtrAltTreeIndent=\parindent
  }
  \newcommand*{\gglssetwidest}[2][0]{%
    \csgdef{@glswidestname\romannumeral#1}{#2}%
  }
  \newcommand*{\eglssetwidest}[2][0]{%
    \protected@csedef{@glswidestname\romannumeral#1}{#2}%
  }
  \newcommand*{\xglssetwidest}[2][0]{%
    \protected@csxdef{@glswidestname\romannumeral#1}{#2}%
  }
  \newcommand*{\glsupdatewidest}[2][0]{%
    \ifcsundef{@glswidestname\romannumeral#1}%
    {\csdef{@glswidestname\romannumeral#1}{#2}}%
    {%
      \settowidth{\dimen@}{\csuse{@glswidestname\romannumeral#1}}%
      \settowidth{\dimen@ii}{#2}%
      \ifdim\dimen@ii>\dimen@
       \csdef{@glswidestname\romannumeral#1}{#2}%
      \fi
    }%
  }
  \newcommand*{\gglsupdatewidest}[2][0]{%
    \ifcsundef{@glswidestname\romannumeral#1}%
    {\csgdef{@glswidestname\romannumeral#1}{#2}}%
    {%
      \settowidth{\dimen@}{\csuse{@glswidestname\romannumeral#1}}%
      \settowidth{\dimen@ii}{#2}%
      \ifdim\dimen@ii>\dimen@
       \csgdef{@glswidestname\romannumeral#1}{#2}%
      \fi
    }%
  }
  \newcommand*{\eglsupdatewidest}[2][0]{%
    \ifcsundef{@glswidestname\romannumeral#1}%
    {\protected@csedef{@glswidestname\romannumeral#1}{#2}}%
    {%
      \settowidth{\dimen@}{\csuse{@glswidestname\romannumeral#1}}%
      \settowidth{\dimen@ii}{#2}%
      \ifdim\dimen@ii>\dimen@
       \protected@csedef{@glswidestname\romannumeral#1}{#2}%
      \fi
    }%
  }
  \newcommand*{\xglsupdatewidest}[2][0]{%
    \ifcsundef{@glswidestname\romannumeral#1}%
    {\protected@csxdef{@glswidestname\romannumeral#1}{#2}}%
    {%
      \settowidth{\dimen@}{\csuse{@glswidestname\romannumeral#1}}%
      \settowidth{\dimen@ii}{#2}%
      \ifdim\dimen@ii>\dimen@
       \protected@csxdef{@glswidestname\romannumeral#1}{#2}%
      \fi
    }%
  }
  \newcommand*{\glsgetwidestname}{\@glswidestname}
  \newcommand*{\glsgetwidestsubname}[1]{%
    \ifcsundef{@glswidestname\romannumeral#1}%
    {\@glswidestname}%
    {\csuse{@glswidestname\romannumeral#1}}%
  }
  \let\glsFindWidestTopLevelName\glsfindwidesttoplevelname
  \newrobustcmd*{\glsFindWidestUsedTopLevelName}[1][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglsused{\@glo@label}%
        {%
          \ifglshasparent{\@glo@label}%
          {}%
          {%
            \settowidth{\dimen@}%
             {\glstreenamefmt{\glsentryname{\@glo@label}}}%
            \ifdim\dimen@>\gls@tmplen
              \gls@tmplen=\dimen@
              \eglssetwidest{\glsentryname{\@glo@label}}%
            \fi
          }%
        }%
        {}%
      }%
    }%
  }
  \newrobustcmd*{\glsFindWidestUsedAnyName}[1][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglsused{\@glo@label}%
        {%
          \settowidth{\dimen@}%
           {\glstreenamefmt{\glsentryname{\@glo@label}}}%
          \ifdim\dimen@>\gls@tmplen
            \gls@tmplen=\dimen@
            \eglssetwidest{\glsentryname{\@glo@label}}%
          \fi
        }%
        {}%
      }%
    }%
  }
  \newrobustcmd*{\glsFindWidestAnyName}[1][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \settowidth{\dimen@}%
         {\glstreenamefmt{\glsentryname{\@glo@label}}}%
        \ifdim\dimen@>\gls@tmplen
          \gls@tmplen=\dimen@
          \eglssetwidest{\glsentryname{\@glo@label}}%
        \fi
      }%
    }%
  }
  \newrobustcmd*{\glsFindWidestUsedLevelTwo}[1][\@glo@types]{%
    \dimen@=0pt\relax
    \dimen@i=0pt\relax
    \dimen@ii=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglsused{\@glo@label}%
        {%
          \ifglshasparent{\@glo@label}%
          {%
            \protected@edef\@glo@parent{\csuse{glo@\glsdetoklabel{\@glo@label}@parent}}%
            \ifglshasparent{\@glo@parent}%
            {%
              \protected@edef\@glo@parent{\csuse{glo@\glsdetoklabel{\@glo@parent}@parent}}%
              \ifglshasparent{\@glo@parent}%
              {}%
              {%
                \settowidth{\gls@tmplen}%
                   {\glstreenamefmt{\glsentryname{\@glo@label}}}%
                \ifdim\gls@tmplen>\dimen@ii
                  \dimen@ii=\gls@tmplen
                  \eglssetwidest[2]{\glsentryname{\@glo@label}}%
                \fi
              }%
            }%
            {%
              \settowidth{\gls@tmplen}%
                 {\glstreenamefmt{\glsentryname{\@glo@label}}}%
              \ifdim\gls@tmplen>\dimen@i
                \dimen@i=\gls@tmplen
                \eglssetwidest[1]{\glsentryname{\@glo@label}}%
              \fi
            }%
          }%
          {%
            \settowidth{\gls@tmplen}%
               {\glstreenamefmt{\glsentryname{\@glo@label}}}%
            \ifdim\gls@tmplen>\dimen@
              \dimen@=\gls@tmplen
              \eglssetwidest{\glsentryname{\@glo@label}}%
            \fi
          }%
        }%
        {}%
      }%
    }%
  }
  \newrobustcmd*{\glsFindWidestLevelTwo}[1][\@glo@types]{%
    \dimen@=0pt\relax
    \dimen@i=0pt\relax
    \dimen@ii=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglshasparent{\@glo@label}%
        {%
          \protected@edef\@glo@parent{\csuse{glo@\glsdetoklabel{\@glo@label}@parent}}%
          \ifglshasparent{\@glo@parent}%
          {%
            \protected@edef\@glo@parent{\csuse{glo@\glsdetoklabel{\@glo@parent}@parent}}%
            \ifglshasparent{\@glo@parent}%
            {}%
            {%
              \settowidth{\gls@tmplen}%
                 {\glstreenamefmt{\glsentryname{\@glo@label}}}%
              \ifdim\gls@tmplen>\dimen@ii
                \dimen@ii=\gls@tmplen
                \eglssetwidest[2]{\glsentryname{\@glo@label}}%
              \fi
            }%
          }%
          {%
            \settowidth{\gls@tmplen}%
               {\glstreenamefmt{\glsentryname{\@glo@label}}}%
            \ifdim\gls@tmplen>\dimen@i
              \dimen@i=\gls@tmplen
              \eglssetwidest[1]{\glsentryname{\@glo@label}}%
            \fi
          }%
        }%
        {%
          \settowidth{\gls@tmplen}%
             {\glstreenamefmt{\glsentryname{\@glo@label}}}%
          \ifdim\gls@tmplen>\dimen@
            \dimen@=\gls@tmplen
            \eglssetwidest{\glsentryname{\@glo@label}}%
          \fi
        }%
      }%
    }%
  }
  \newrobustcmd*{\glsFindWidestUsedAnyNameSymbol}[2][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    #2=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglsused{\@glo@label}%
        {%
          \settowidth{\dimen@}%
           {\glstreenamefmt{\glsentryname{\@glo@label}}}%
          \ifdim\dimen@>\gls@tmplen
            \gls@tmplen=\dimen@
            \eglssetwidest{\glsentryname{\@glo@label}}%
          \fi
          \settowidth{\dimen@}%
           {\glsentrysymbol{\@glo@label}}%
          \ifdim\dimen@>#2\relax
            #2=\dimen@
          \fi
        }%
        {}%
      }%
    }%
  }
  \newrobustcmd*{\glsFindWidestAnyNameSymbol}[2][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    #2=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \settowidth{\dimen@}%
         {\glstreenamefmt{\glsentryname{\@glo@label}}}%
        \ifdim\dimen@>\gls@tmplen
          \gls@tmplen=\dimen@
          \eglssetwidest{\glsentryname{\@glo@label}}%
        \fi
        \settowidth{\dimen@}%
         {\glsentrysymbol{\@glo@label}}%
        \ifdim\dimen@>#2\relax
          #2=\dimen@
        \fi
      }%
    }%
  }
  \newrobustcmd*{\glsFindWidestUsedAnyNameSymbolLocation}[3][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    #2=0pt\relax
    #3=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglsused{\@glo@label}%
        {%
          \settowidth{\dimen@}%
           {\glstreenamefmt{\glsentryname{\@glo@label}}}%
          \ifdim\dimen@>\gls@tmplen
            \gls@tmplen=\dimen@
            \eglssetwidest{\glsentryname{\@glo@label}}%
          \fi
          \settowidth{\dimen@}%
           {\glsentrysymbol{\@glo@label}}%
          \ifdim\dimen@>#2\relax
            #2=\dimen@
          \fi
          \settowidth{\dimen@}%
           {\GlsXtrFormatLocationList{\glsentrynumberlist{\@glo@label}}}%
          \ifdim\dimen@>#3\relax
            #3=\dimen@
          \fi
        }%
        {}%
      }%
    }%
  }
  \newrobustcmd*{\glsFindWidestAnyNameSymbolLocation}[3][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    #2=0pt\relax
    #3=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \settowidth{\dimen@}%
         {\glstreenamefmt{\glsentryname{\@glo@label}}}%
        \ifdim\dimen@>\gls@tmplen
          \gls@tmplen=\dimen@
          \eglssetwidest{\glsentryname{\@glo@label}}%
        \fi
        \settowidth{\dimen@}%
         {\glsentrysymbol{\@glo@label}}%
        \ifdim\dimen@>#2\relax
          #2=\dimen@
        \fi
        \settowidth{\dimen@}%
          {\GlsXtrFormatLocationList{\glsentrynumberlist{\@glo@label}}}%
        \ifdim\dimen@>#3\relax
          #3=\dimen@
        \fi
      }%
    }%
  }
  \newrobustcmd*{\glsFindWidestUsedAnyNameLocation}[2][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    #2=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \ifglsused{\@glo@label}%
        {%
          \settowidth{\dimen@}%
           {\glstreenamefmt{\glsentryname{\@glo@label}}}%
          \ifdim\dimen@>\gls@tmplen
            \gls@tmplen=\dimen@
            \eglssetwidest{\glsentryname{\@glo@label}}%
          \fi
          \settowidth{\dimen@}%
           {\GlsXtrFormatLocationList{\glsentrynumberlist{\@glo@label}}}%
          \ifdim\dimen@>#2\relax
            #2=\dimen@
          \fi
        }%
        {}%
      }%
    }%
  }
  \newrobustcmd*{\glsFindWidestAnyNameLocation}[2][\@glo@types]{%
    \dimen@=0pt\relax
    \gls@tmplen=0pt\relax
    #2=0pt\relax
    \forallglossaries[#1]{\@gls@type}%
    {%
      \forglsentries[\@gls@type]{\@glo@label}%
      {%
        \settowidth{\dimen@}%
         {\glstreenamefmt{\glsentryname{\@glo@label}}}%
        \ifdim\dimen@>\gls@tmplen
          \gls@tmplen=\dimen@
          \eglssetwidest{\glsentryname{\@glo@label}}%
        \fi
        \settowidth{\dimen@}%
         {\GlsXtrFormatLocationList{\glsentrynumberlist{\@glo@label}}}%
        \ifdim\dimen@>#2\relax
          #2=\dimen@
        \fi
      }%
    }%
  }
  \newcommand*{\glsxtrComputeTreeIndent}[1]{%
    \glstreeindent=\glsxtrtreetopindent\relax
  }
  \newcommand*{\glsxtrComputeTreeSubIndent}[3]{%
    \ifcsundef{@glswidestname\romannumeral#1}%
    {%
      \settowidth{#3}{\glstreenamefmt{\@glswidestname\space}}%
    }%
    {%
      \settowidth{#3}{\glstreenamefmt{%
             \csname @glswidestname\romannumeral#1\endcsname\space}}%
    }%
  }
  \newcommand*{\glsxtrAltTreeSetHangIndent}{\hangindent\glstreeindent}
  \newcommand*{\glsxtrAltTreeSetSubHangIndent}[1]{\hangindent\glstreeindent}
  \renewglossarystyle{alttree}{%
    \renewenvironment{theglossary}%
      {%
       \glsxtralttreeInit
       \def\@gls@prevlevel{-1}%
       \mbox{}\par}%
      {\par}%
    \renewcommand*{\glossaryheader}{}%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand{\glossentry}[2]{%
      \ifnum\@gls@prevlevel=0\relax
      \else
        \glsxtrComputeTreeIndent{##1}%
      \fi
      \parindent\glstreeindent
      \glsxtrAltTreeSetHangIndent
      \makebox[0pt][r]%
      {%
        \glstreenamebox{\glstreeindent}%
        {%
           \glsentryitem{##1}%
           \glstreenamefmt{\glstarget{##1}{\glossentryname{##1}}}%
        }%
      }%
      \glsxtralttreeSymbolDescLocation{##1}{##2}%
      \def\@gls@prevlevel{0}%
    }
    \renewcommand{\subglossentry}[3]{%
      \ifnum##1=1\relax
        \glssubentryitem{##2}%
      \fi
      \ifnum\@gls@prevlevel=##1\relax
      \else
        \glsxtrComputeTreeSubIndent{##1}{##2}{\gls@tmplen}%
        \ifnum\@gls@prevlevel<##1\relax
          \setlength\glstreeindent\gls@tmplen
          \addtolength\glstreeindent\parindent
          \parindent\glstreeindent
        \else
          \ifnum\@gls@prevlevel=0\relax
            \glsxtrComputeTreeIndent{##2}%
          \else
            \glsxtrComputeTreeSubIndent{\@gls@prevlevel}{##2}{\glstreeindent}%
          \fi
          \addtolength\parindent{-\glstreeindent}%
          \setlength\glstreeindent\parindent
        \fi
      \fi
      \glsxtrAltTreeSetSubHangIndent{##1}%
      \makebox[0pt][r]{\glstreenamebox{\gls@tmplen}{%
        \glstreenamefmt{\glstarget{##2}{\glossentryname{##2}}}}}%
      \glsxtralttreeSubSymbolDescLocation{##1}{##2}{##3}%
      \def\@gls@prevlevel{##1}%
    }%
    \renewcommand*{\glsgroupskip}{\ifglsnogroupskip\else\glstreegroupskip\fi}%
  }
}%
{%
}
\ifdef{\@glsstyle@alttreegroup}
{%
  \renewglossarystyle{alttreegroup}{%
    \setglossarystyle{alttree}%
    \renewcommand{\glsgroupheading}[1]{\par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip
    }%
  }%
}%
{%
}
\ifdef{\@glsstyle@alttreehypergroup}
{%
  \renewglossarystyle{alttreehypergroup}{%
    \setglossarystyle{alttree}%
    \renewcommand*{\glossaryheader}{%
      \par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glstreenavigationfmt{\glsnavigation}%
      \glstreegroupheaderskip
    }%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip
    }%
  }
}%
{%
}
\ifdef{\@glsstyle@mcolindexgroup}
{%
  \renewglossarystyle{mcolindexgroup}{%
    \setglossarystyle{mcolindex}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \item\glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip\@afterheading
    }%
  }
}%
{%
}
\ifdef{\@glsstyle@mcolindexhypergroup}
{%
  \renewglossarystyle{mcolindexhypergroup}{%
    \setglossarystyle{mcolindex}%
    \renewcommand*{\glossaryheader}{%
      \item\glstreenavigationfmt{\glsnavigation}%
      \glstreegroupheaderskip\@afterheading
    }%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \item\glstreegroupheaderfmt
        {\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading
    }%
  }
}%
{%
}
\ifdef{\@glsstyle@mcolindexspannav}
{%
  \renewglossarystyle{mcolindexspannav}{%
    \setglossarystyle{index}%
    \renewenvironment{theglossary}%
    {%
     \begin{multicols}{\glsmcols}[\noindent\glstreenavigationfmt{\glsnavigation}]%
     \setlength{\parindent}{0pt}%
     \setlength{\parskip}{0pt plus 0.3pt}%
     \let\item\glstreeitem}%
    {\end{multicols}}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \item\glstreegroupheaderfmt
        {\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading
    }%
  }
}%
{%
}
\ifdef{\@glsstyle@mcoltreegroup}
{%
  \renewglossarystyle{mcoltreegroup}{%
    \setglossarystyle{mcoltree}%
    \renewcommand{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent\glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip\@afterheading
    }%
  }
}%
{%
}
\ifdef{\@glsstyle@mcoltreehypergroup}
{%
  \renewglossarystyle{mcoltreehypergroup}{%
    \setglossarystyle{mcoltree}%
    \renewcommand*{\glossaryheader}{%
      \par\noindent\glstreenavigationfmt{\glsnavigation}%
      \glstreegroupheaderskip
    }%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading
    }%
  }
}%
{%
}
\ifdef{\@glsstyle@mcoltreespannav}
{%
  \renewglossarystyle{mcoltreespannav}{%
    \setglossarystyle{tree}%
    \renewenvironment{theglossary}%
    {%
       \begin{multicols}{\glsmcols}%
         [\noindent\glstreenavigationfmt{\glsnavigation}]%
       \setlength{\parindent}{0pt}%
       \setlength{\parskip}{0pt plus 0.3pt}%
    }%
    {\end{multicols}}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading
    }%
  }
}%
{%
}
\ifdef{\@glsstyle@mcoltreenonamegroup}
{%
  \renewglossarystyle{mcoltreenonamegroup}{%
    \setglossarystyle{mcoltreenoname}%
    \renewcommand{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent\glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip\@afterheading
    }%
  }
}%
{%
}
\ifdef{\@glsstyle@mcoltreenonamehypergroup}
{%
  \renewglossarystyle{mcoltreenonamehypergroup}{%
    \setglossarystyle{mcoltreenoname}%
    \renewcommand*{\glossaryheader}{%
      \par\noindent\glstreenavigationfmt{\glsnavigation}%
      \glstreegroupheaderskip
    }%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading}%
  }
}%
{%
}
\ifdef{\@glsstyle@mcoltreenonamespannav}
{%
  \renewglossarystyle{mcoltreenonamespannav}{%
    \setglossarystyle{treenoname}%
    \renewenvironment{theglossary}%
    {%
       \begin{multicols}{\glsmcols}%
         [\noindent\glstreenavigationfmt{\glsnavigation}]%
       \setlength{\parindent}{0pt}%
       \setlength{\parskip}{0pt plus 0.3pt}%
    }%
    {\end{multicols}}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par\noindent
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip\@afterheading}%
  }
}%
{%
}
\ifdef{\@glsstyle@mcolalttree}
{%
  \renewglossarystyle{mcolalttree}{%
    \setglossarystyle{alttree}%
    \renewenvironment{theglossary}%
    {%
       \glsxtralttreeInit
       \def\@gls@prevlevel{-1}%
       \begin{multicols}{\glsmcols}%
    }%
    {\par\end{multicols}}%
  }
}%
{%
}
\ifdef{\@glsstyle@mcolalttreegroup}
{%
  \renewglossarystyle{mcolalttreegroup}{%
    \setglossarystyle{mcolalttree}%
    \renewcommand{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glstreegroupheaderfmt{\glsxtr@grptitle}%
      \glstreegroupheaderskip
    }%
  }
}%
{%
}
\ifdef{\@glsstyle@mcolalttreehypergroup}
{%
  \renewglossarystyle{mcolalttreehypergroup}{%
    \setglossarystyle{mcolalttree}%
    \renewcommand*{\glossaryheader}{%
      \par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glstreenavigationfmt{\glsnavigation}%
      \glstreegroupheaderskip
    }%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip
    }%
  }
}%
{%
}
\ifdef{\@glsstyle@mcolalttreespannav}
{%
  \renewglossarystyle{mcolalttreespannav}{%
    \setglossarystyle{alttree}%
    \renewenvironment{theglossary}%
    {%
       \glsxtralttreeInit
       \def\@gls@prevlevel{-1}%
       \begin{multicols}{\glsmcols}%
          [\noindent\glstreenavigationfmt{\glsnavigation}]%
    }%
    {\par\end{multicols}}%
    \renewcommand*{\glsgroupheading}[1]{%
      \glsxtrgetgrouptitle{##1}{\glsxtr@grptitle}%
      \glstreePreHeader{##1}{\glsxtr@grptitle}%
      \par
      \def\@gls@prevlevel{-1}%
      \hangindent0pt\relax
      \parindent0pt\relax
      \glstreegroupheaderfmt{\glsnavhypertarget{##1}{\glsxtr@grptitle}}%
      \glstreegroupheaderskip
    }%
  }
}%
{%
}
\ifx\@glossary@default@style\relax
\else
  \setglossarystyle{\@glsxtr@current@style}
\fi
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossaries-extra-stylemods-2021-11-22.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossary-bookindex-2021-11-22.sty>
%    \end{macrocode}
%\fi
%\subsection{Rollback v1.48 (glossary-bookindex-2021-11-22.sty)}
% Version 1.48 preserved for rollback.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{glossary-bookindex}[2021/11/22 v1.48 (NLCT)]
\RequirePackage{multicol}
\RequirePackage{glossary-tree}
\newcommand{\glsxtrbookindexcols}{2}
\newcommand*{\glsxtrbookindexname}[1]{\glossentryname{#1}}
\newcommand*{\glsxtrbookindexsubname}[1]{\glsxtrbookindexname{#1}}
\providecommand*{\glsxtrprelocation}{\space}

\newcommand*{\glsxtrbookindexprelocation}[1]{%
  \glsxtrifhasfield{location}{#1}%
  {,\glsxtrprelocation}%
  {\glsxtrprelocation}%
}
\newcommand*{\glsxtrbookindexsubprelocation}[1]{%
 \glsxtrbookindexprelocation{#1}%
}
\newcommand*{\glsxtrbookindexlocation}[2]{#2}
\newcommand*{\glsxtrbookindexsublocation}{\glsxtrbookindexlocation}
\newcommand{\glsxtrbookindexparentchildsep}{\nopagebreak}
\newcommand{\glsxtrbookindexparentsubchildsep}{\glsxtrbookindexparentchildsep}
\newcommand{\glsxtrbookindexbetween}[2]{}
\newcommand{\glsxtrbookindexsubbetween}[2]{}
\newcommand{\glsxtrbookindexsubsubbetween}[2]{}
\newcommand{\glsxtrbookindexatendgroup}[1]{}
\newcommand{\glsxtrbookindexsubatendgroup}[1]{}
\newcommand{\glsxtrbookindexsubsubatendgroup}[1]{}
\newcommand{\glsxtrbookindexgroupskip}{\ifglsnogroupskip\else\indexspace\fi}
\newcommand*{\glsxtrbookindexformatheader}[1]{%
  \par{\centering\glstreegroupheaderfmt{#1}\par}%
}
\ifdef\pdfbookmark
{%
  \newcommand*{\glsxtrbookindexbookmark}[2]{%
    \ifdefstring{\@@glossarysec}{chapter}%
    {\pdfbookmark[1]{#1}{#2}}%
    {\pdfbookmark[2]{#1}{#2}}%
  }
}
{%
  \newcommand*{\glsxtrbookindexbookmark}[2]{}
}
\newcommand*{\glsxtrbookindexbookmarkprefix}{\currentglossary.}
\newcommand*{\glsxtrbookindexcolspread}{}
\newcommand*{\glsxtrbookindexmulticolsenv}{multicols}
\newglossarystyle{bookindex}{%
  \setglossarystyle{index}%
  \renewenvironment{theglossary}%
  {%
    \ifnum\glsxtrbookindexcols>1\relax
      \ifdefempty\glsxtrbookindexcolspread
      {%
        \edef\glsxtr@beginbookindex{%
          \noexpand\begin{\glsxtrbookindexmulticolsenv}
            {\glsxtrbookindexcols}%
        }%
      }%
      {%
        \edef\glsxtr@beginbookindex{%
          \noexpand\begin{\glsxtrbookindexmulticolsenv}%
            {\glsxtrbookindexcols}[\glsxtrbookindexcolspread]%
        }%
      }%
    \else
      \def\glsxtr@beginbookindex{}%
    \fi
    \glsxtr@beginbookindex
    \setlength{\parindent}{0pt}%
    \setlength{\parskip}{0pt plus 0.3pt}%
    \let\@glsxtr@bookindex@sep\glsxtrbookindexparentchildsep
    \let\@glsxtr@bookindex@subsep\glsxtrbookindexparentsubchildsep
    \let\@glsxtr@bookindex@between\@gobble
    \let\@glsxtr@bookindex@subbetween\@gobble
    \let\@glsxtr@bookindex@subsubbetween\@gobble
    \let\@glsxtr@bookindex@atendgroup\relax
    \let\@glsxtr@bookindex@subatendgroup\relax
    \let\@glsxtr@bookindex@subsubatendgroup\relax
    \let\@glsxtr@bookindexgroupskip\relax
  }%
  {%
     \@glsxtr@bookindex@subsubatendgroup
     \@glsxtr@bookindex@subatendgroup
     \@glsxtr@bookindex@atendgroup
    \ifnum\glsxtrbookindexcols>1\relax
      \edef\glsxtr@endbookindex{%
        \noexpand\end{\glsxtrbookindexmulticolsenv}%
      }%
    \else
      \def\glsxtr@endbookindex{}%
    \fi
    \glsxtr@endbookindex
  }%
  \renewcommand*{\glossaryheader}{\raggedright}%
  \renewcommand*{\glossentry}[2]{%
    \@glsxtr@bookindex@between{##1}%
    \let\@glsxtr@bookindex@sep\glsxtrbookindexparentchildsep
    \let\@glsxtr@bookindex@subsep\glsxtrbookindexparentsubchildsep
    \let\@glsxtr@bookindex@subbetween\@gobble
    \let\@glsxtr@bookindex@subsubbetween\@gobble
    \edef\@glsxtr@bookindex@between{%
       \noexpand\glsxtrbookindexbetween{##1}%
    }%
    \edef\@glsxtr@bookindex@atendgroup{%
      \noexpand\glsxtrbookindexatendgroup{##1}%
    }%
    \let\@glsxtr@bookindex@subatendgroup\relax
    \let\@glsxtr@bookindex@subsubatendgroup\relax
    \glstreeitem
      \glsentryitem{##1}%
      \glstarget{##1}{\glsxtrbookindexname{##1}}%
    \glsxtrbookindexprelocation{##1}%
    \glsxtrbookindexlocation{##1}{##2}%
  }%
  \renewcommand{\subglossentry}[3]{%
    \ifcase##1\relax
      \glstreeitem
    \or
      \@glsxtr@bookindex@sep
      \@glsxtr@bookindex@subbetween{##2}%
      \let\@glsxtr@bookindex@sep\relax
      \let\@glsxtr@bookindex@subsubbetween\@gobble
      \let\@glsxtr@bookindex@subsep\glsxtrbookindexparentsubchildsep
      \edef\@glsxtr@bookindex@subbetween{%
         \noexpand\glsxtrbookindexsubbetween{##2}%
      }%
      \edef\@glsxtr@bookindex@atsubendgroup{%
        \noexpand\glsxtrbookindexatsubendgroup{##1}%
      }%
      \glstreesubitem
      \glssubentryitem{##2}%
    \else
      \@glsxtr@bookindex@subsep
      \@glsxtr@bookindex@subsubbetween{##2}%
      \let\@glsxtr@bookindex@subsep\relax
      \edef\@glsxtr@bookindex@subsubbetween{%
         \noexpand\glsxtrbookindexsubsubbetween{##2}%
      }%
      \edef\@glsxtr@bookindex@atsubsubendgroup{%
        \noexpand\glsxtrbookindexatsubsubendgroup{##1}%
      }%
      \glstreesubsubitem
    \fi
    \glstarget{##2}{\glsxtrbookindexsubname{##2}}%
    \glsxtrbookindexsubprelocation{##2}%
    \glsxtrbookindexsublocation{##2}{##3}%
  }%
  \renewcommand*{\glsgroupskip}{}%
  \renewcommand*{\glsgroupheading}[1]{%
    \@glsxtr@bookindex@subsubatendgroup
    \@glsxtr@bookindex@subatendgroup
    \@glsxtr@bookindex@atendgroup
    \@glsxtr@bookindexgroupskip
    \let\@glsxtr@bookindexgroupskip\glsxtrbookindexgroupskip
    \let\@glsxtr@bookindex@between\@gobble
    \let\@glsxtr@bookindex@atendgroup\relax
    \let\@glsxtr@bookindex@subatendgroup\relax
    \let\@glsxtr@bookindex@subsubatendgroup\relax
    \glsxtrgetgrouptitle{##1}{\glsxtrcurrentgrptitle}%
    \glsxtrbookindexbookmark{\glsxtrcurrentgrptitle}{\glsxtrbookindexbookmarkprefix##1}%
    \glsxtrbookindexformatheader{\glsxtrcurrentgrptitle}%
    \nopagebreak\indexspace\nopagebreak\@afterheading
  }%
}
\newcommand{\glsxtrbookindexthepage}{%
 \ifdef\currentglossary{\currentglossary.\arabic{page}}{\arabic{page}}%
}
\newcommand*{\glsxtrbookindexmarkentry}[1]{%
  \protected@write\@auxout
  {\let\glsxtrbookindexthepage\relax}%
  {\string\glsxtr@setbookindexmark{\glsxtrbookindexthepage}{#1}}%
}
\newcommand*{\glsxtr@setbookindexmark}[2]{%
 \ifcsundef{glsxtr@idxfirstmark@#1}%
 {\csgdef{glsxtr@idxfirstmark@#1}{#2}}%
 {}%
 \csgdef{glsxtr@idxlastmark@#1}{#2}%
}
\newcommand*{\glsxtrbookindexfirstmarkfmt}[1]{%
  \glsentryname{#1}%
}
\newcommand*{\glsxtrbookindexfirstmark}{%
  \letcs{\glsxtr@label}{glsxtr@idxfirstmark@\glsxtrbookindexthepage}%
  \ifdef\glsxtr@label
  {\glsxtrbookindexfirstmarkfmt{\glsxtr@label}}%
  {}%
}
\newcommand*{\glsxtrbookindexlastmarkfmt}[1]{%
  \glsentryname{#1}%
}
\newcommand*{\glsxtrbookindexlastmark}{%
  \letcs{\glsxtr@label}{glsxtr@idxlastmark@\glsxtrbookindexthepage}%
  \ifdef\glsxtr@label
  {\glsxtrbookindexlastmarkfmt{\glsxtr@label}}%
  {}%
}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossary-bookindex-2021-11-22.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossary-longextra-2021-11-22.sty>
%    \end{macrocode}
%\fi
%\subsection{Rollback v1.48 (glossary-longextra-2021-11-22.sty)}
% Version 1.48 preserved for rollback.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{glossary-longextra}[2021/11/22 v1.48 (NLCT)]
\RequirePackage{glossary-longbooktabs}
\newcommand{\glslongextraNameFmt}[1]{%
 \glsentryitem{#1}\glstarget{#1}{\glossentryname{#1}}%
}
\newcommand{\glslongextraDescFmt}[1]{%
  \glossentrydesc{#1}\glspostdescription
}
\newcommand{\glslongextraSymbolFmt}[1]{\glossentrysymbol{#1}}
\newcommand{\glslongextraLocationFmt}[2]{#2}
\newcommand{\glslongextraSubNameFmt}[2]{%
 \glssubentryitem{#2}\glstarget{#2}{\strut}%
}
\newcommand{\glslongextraSubDescFmt}[2]{%
  \glslongextraDescFmt{#2}%
}
\newcommand{\glslongextraSubSymbolFmt}[2]{%
  \glslongextraSymbolFmt{#2}%
}
\newcommand{\glslongextraSubLocationFmt}[3]{#3}
\newcommand{\glslongextraNameAlign}{l}
\newcommand{\glslongextraDescAlign}{>{\raggedright}p{\glsdescwidth}}
\newcommand{\glslongextraSymbolAlign}{c}
\newcommand{\glslongextraLocationAlign}{>{\raggedright}p{\glspagelistwidth}}
\newcommand{\glslongextraGroupHeading}[2]{}
\newcommand{\glslongextraHeaderFmt}[1]{\textbf{#1}}
\newcommand{\glslongextraNameDescHeader}{%
 \glslongextraNameDescTabularHeader\endhead
 \glslongextraNameDescTabularFooter\endfoot
}
\newcommand{\glslongextraNameDescTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname &
 \glslongextraHeaderFmt\descriptionname\tabularnewline
 \midrule
}
\newcommand{\glslongextraNameDescTabularFooter}{%
 \bottomrule
}
\newcommand*{\glslongextraSetWidest}[1]{%
 \def\@glslongextrawidestname{#1}%
}
\newcommand*{\@glslongextrawidestname}{\csuse{@glswidestname}}
\newcommand*{\glslongextraUpdateWidest}[1]{%
  \ifundef\@glslongextrawidestname
  {\def\@glslongextrawidestname{#1}}%
  {%
    \settowidth{\dimen@}{\@glslongextrawidestname}%
    \settowidth{\dimen@ii}{#1}%
    \ifdim\dimen@ii>\dimen@
     \def\@glslongextrawidestname{#1}%
    \fi
  }%
}
\newcommand*{\glslongextraUpdateWidestChild}[2]{}
\newcommand{\glslongextraSetDescWidth}{%
  \settowidth{\gls@tmplen}{\glslongextraHeaderFmt\entryname}%
  \settowidth{\dimen@}{\glsnamefont{\@glslongextrawidestname}}%
  \ifdim\dimen@>\gls@tmplen
   \gls@tmplen=\dimen@
  \fi
  \setlength{\glsdescwidth}{\dimexpr\linewidth-4\tabcolsep-\gls@tmplen}%
}
\newcommand{\glslongextraSymSetDescWidth}{%
  \glslongextraSetDescWidth
  \settowidth{\gls@tmplen}{\glslongextraHeaderFmt\symbolname}%
  \setlength{\glsdescwidth}{\dimexpr\glsdescwidth-2\tabcolsep-\gls@tmplen}%
}
\newcommand{\glslongextraLocSetDescWidth}{%
  \glslongextraSetDescWidth
  \setlength{\glsdescwidth}{\dimexpr\glsdescwidth-2\tabcolsep-\glspagelistwidth}%
}
\newcommand{\glslongextraSymLocSetDescWidth}{%
  \glslongextraSymSetDescWidth
  \setlength{\glsdescwidth}{\dimexpr\glsdescwidth-2\tabcolsep-\glspagelistwidth}%
}
\newif\ifGlsLongExtraUseTabular
\GlsLongExtraUseTabularfalse
\newcommand*{\glslongextraTabularVAlign}{c}
\newglossarystyle{long-name-desc}%
{%
  \ifGlsLongExtraUseTabular
   \renewenvironment{theglossary}%
    {%
      \glslongextraSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign}}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraNameDescTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign}}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{2}{##1}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraDescFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2}
     &
     \glslongextraSubDescFmt{##1}{##2}%
     \tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
\newcommand{\glslongextraNameDescLocationHeader}{%
 \glslongextraNameDescLocationTabularHeader\endhead
 \glslongextraNameDescLocationTabularFooter\endfoot
}
\newcommand{\glslongextraNameDescLocationTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname &
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\pagelistname\tabularnewline
 \midrule
}
\newcommand{\glslongextraNameDescLocationTabularFooter}{%
 \bottomrule
}
\newglossarystyle{long-name-desc-loc}%
{%
  \ifGlsLongExtraUseTabular
   \renewenvironment{theglossary}%
    {%
      \glslongextraLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraLocationAlign
      }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraNameDescLocationTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescLocationTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraLocationAlign
      }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescLocationHeader}%
   \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraDescFmt{##1} &
    \glslongextraLocationFmt{##1}{##2}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2}&
     \glslongextraSubDescFmt{##1}{##2}&
     \glslongextraSubLocationFmt{##1}{##2}{##3}%
     \tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
\newcommand{\glslongextraDescNameHeader}{%
 \glslongextraDescNameTabularHeader\endhead
 \glslongextraDescNameTabularFooter\endfoot
}
\newcommand{\glslongextraDescNameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\descriptionname&
 \glslongextraHeaderFmt\entryname \tabularnewline
 \midrule
}
\newcommand{\glslongextraDescNameTabularFooter}{%
 \bottomrule
}
\newglossarystyle{long-desc-name}%
{%
  \ifGlsLongExtraUseTabular
   \renewenvironment{theglossary}%
    {%
      \glslongextraSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign}}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraDescNameTabularFooter
      \end{tabular}%
    }%
    \renewcommand*{\glossaryheader}{\glslongextraDescNameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign}}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
    \renewcommand*{\glossaryheader}{\glslongextraDescNameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{2}{##1}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraDescFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
\newcommand{\glslongextraLocationDescNameHeader}{%
 \glslongextraLocationDescNameTabularHeader\endhead
 \glslongextraLocationDescNameTabularFooter\endfoot
}
\newcommand{\glslongextraLocationDescNameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\pagelistname&
 \glslongextraHeaderFmt\descriptionname&
 \glslongextraHeaderFmt\entryname \tabularnewline
 \midrule
}
\newcommand{\glslongextraLocationDescNameTabularFooter}{%
 \bottomrule
}
\newglossarystyle{long-loc-desc-name}%
{%
  \ifGlsLongExtraUseTabular
   {%
     \glslongextraLocSetDescWidth
     \edef\@glslongextra@begintab{%
       \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
         \expandonce\glslongextraLocationAlign
         \expandonce\glslongextraDescAlign
         \expandonce\glslongextraNameAlign}}%
     \@glslongextra@begintab
   }%
   {%
     \glslongextraLocationDescNameTabularFooter
     \end{tabular}%
   }%
   \renewcommand*{\glossaryheader}{\glslongextraLocationDescNameTabularHeader}%
  \else
  \renewenvironment{theglossary}%
   {%
     \glspatchLToutput
     \glslongextraLocSetDescWidth
     \edef\@glslongextra@begintab{%
       \noexpand\begin{longtable}{%
         \expandonce\glslongextraLocationAlign
         \expandonce\glslongextraDescAlign
         \expandonce\glslongextraNameAlign}}%
     \@glslongextra@begintab
   }%
   {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraLocationDescNameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraLocationFmt{##1}{##2} &
    \glslongextraDescFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubLocationFmt{##1}{##2}{##3} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
\newcommand{\glslongextraNameDescSymHeader}{%
 \glslongextraNameDescSymTabularHeader\endhead
 \glslongextraNameDescSymTabularFooter\endfoot
}
\newcommand{\glslongextraNameDescSymTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname &
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\symbolname\tabularnewline
 \midrule
}
\newcommand{\glslongextraNameDescSymTabularFooter}{%
 \bottomrule
}
\newglossarystyle{long-name-desc-sym}%
{%
  \ifGlsLongExtraUseTabular
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraNameDescSymTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescSymTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescSymHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraDescFmt{##1} &
    \glslongextraSymbolFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubSymbolFmt{##1}{##2}%
     \tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
\newcommand{\glslongextraNameDescSymLocationHeader}{%
 \glslongextraNameDescSymLocationTabularHeader\endhead
 \glslongextraNameDescSymLocationTabularFooter\endfoot
}
\newcommand{\glslongextraNameDescSymLocationTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname &
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\pagelistname\tabularnewline
 \midrule
}
\newcommand{\glslongextraNameDescSymLocationTabularFooter}{%
 \bottomrule
}
\newglossarystyle{long-name-desc-sym-loc}%
{%
  \ifGlsLongExtraUseTabular
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraLocationAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraNameDescSymLocationTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescSymLocationTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraLocationAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameDescSymLocationHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{4}{##1}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraDescFmt{##1} &
    \glslongextraSymbolFmt{##1}&
    \glslongextraLocationFmt{##1}{##2}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubSymbolFmt{##1}{##2}&
     \glslongextraSubLocationFmt{##1}{##2}{##3}%
     \tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
\newcommand{\glslongextraNameSymDescHeader}{%
 \glslongextraNameSymDescTabularHeader\endhead
 \glslongextraNameSymDescTabularFooter\endfoot
}
\newcommand{\glslongextraNameSymDescTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname &
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\descriptionname\tabularnewline
 \midrule
}
\newcommand{\glslongextraNameSymDescTabularFooter}{%
 \bottomrule
}
\newglossarystyle{long-name-sym-desc}%
{%
  \ifGlsLongExtraUseTabular
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraNameSymDescTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraNameSymDescTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraNameAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraDescAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraNameSymDescHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraSymbolFmt{##1} &
    \glslongextraDescFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubSymbolFmt{##1}{##2} &
     \glslongextraSubDescFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
\newcommand{\glslongextraNameSymDescLocationHeader}{%
 \glslongextraNameSymDescLocationTabularHeader\endhead
 \glslongextraNameSymDescLocationTabularFooter\endfoot
}
\newcommand{\glslongextraNameSymDescLocationTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\entryname &
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\pagelistname\tabularnewline
 \midrule
}
\newcommand{\glslongextraNameSymDescLocationTabularFooter}{%
 \bottomrule
}
\newglossarystyle{long-name-sym-desc-loc}%
{%
  \ifGlsLongExtraUseTabular
    \renewenvironment{theglossary}%
     {%
       \glslongextraSymLocSetDescWidth
       \edef\@glslongextra@begintab{%
         \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
           \expandonce\glslongextraNameAlign
           \expandonce\glslongextraSymbolAlign
           \expandonce\glslongextraDescAlign
           \expandonce\glslongextraLocationAlign
         }}%
       \@glslongextra@begintab
     }%
     {%
       \glslongextraNameSymDescLocationTabularFooter
       \end{tabular}%
     }%
    \renewcommand*{\glossaryheader}{\glslongextraNameSymDescLocationTabularHeader}%
  \else
    \renewenvironment{theglossary}%
     {%
       \glspatchLToutput
       \glslongextraSymLocSetDescWidth
       \edef\@glslongextra@begintab{%
         \noexpand\begin{longtable}{%
           \expandonce\glslongextraNameAlign
           \expandonce\glslongextraSymbolAlign
           \expandonce\glslongextraDescAlign
           \expandonce\glslongextraLocationAlign
         }}%
       \@glslongextra@begintab
     }%
     {\end{longtable}}%
    \renewcommand*{\glossaryheader}{\glslongextraNameSymDescLocationHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{4}{##1}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraNameFmt{##1} &
    \glslongextraSymbolFmt{##1} &
    \glslongextraDescFmt{##1} &
    \glslongextraLocationFmt{##1}{##2}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubNameFmt{##1}{##2} &
     \glslongextraSubSymbolFmt{##1}{##2} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubLocationFmt{##1}{##2}{##3}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
\newcommand{\glslongextraSymDescNameHeader}{%
 \glslongextraSymDescNameTabularHeader\endhead
 \glslongextraSymDescNameTabularFooter\endfoot
}
\newcommand{\glslongextraSymDescNameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\entryname\tabularnewline
 \midrule
}
\newcommand{\glslongextraSymDescNameTabularFooter}{%
 \bottomrule
}
\newglossarystyle{long-sym-desc-name}%
{%
  \ifGlsLongExtraUseTabular
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraSymDescNameTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraSymDescNameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraSymDescNameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraSymbolFmt{##1} &
    \glslongextraDescFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubSymbolFmt{##1}{##2} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
\newcommand{\glslongextraLocationSymDescNameHeader}{%
 \glslongextraLocationSymDescNameTabularHeader\endhead
 \glslongextraLocationSymDescNameTabularFooter\endfoot
}
\newcommand{\glslongextraLocationSymDescNameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\pagelistname &
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\entryname\tabularnewline
 \midrule
}
\newcommand{\glslongextraLocationSymDescNameTabularFooter}{%
 \bottomrule
}
\newglossarystyle{long-loc-sym-desc-name}%
{%
  \ifGlsLongExtraUseTabular
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraLocationAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraLocationSymDescNameTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraLocationSymDescNameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraLocationAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraLocationSymDescNameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{4}{##1}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraLocationFmt{##1}{##2} &
    \glslongextraSymbolFmt{##1} &
    \glslongextraDescFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubLocationFmt{##1}{##2}{##3} &
     \glslongextraSubSymbolFmt{##1}{##2} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
\newcommand{\glslongextraDescSymNameHeader}{%
 \glslongextraDescSymNameTabularHeader\endhead
 \glslongextraDescSymNameTabularFooter\endfoot
}
\newcommand{\glslongextraDescSymNameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\entryname\tabularnewline
 \midrule
}
\newcommand{\glslongextraDescSymNameTabularFooter}{%
 \bottomrule
}
\newglossarystyle{long-desc-sym-name}%
{%
  \ifGlsLongExtraUseTabular
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraDescSymNameTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraDescSymNameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraDescSymNameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{3}{##1}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraDescFmt{##1} &
    \glslongextraSymbolFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubSymbolFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
\newcommand{\glslongextraLocationDescSymNameHeader}{%
 \glslongextraLocationDescSymNameTabularHeader\endhead
 \glslongextraLocationDescSymNameTabularFooter\endfoot
}
\newcommand{\glslongextraLocationDescSymNameTabularHeader}{%
 \toprule
 \glslongextraHeaderFmt\pagelistname &
 \glslongextraHeaderFmt\descriptionname &
 \glslongextraHeaderFmt\symbolname &
 \glslongextraHeaderFmt\entryname\tabularnewline
 \midrule
}
\newcommand{\glslongextraLocationDescSymNameTabularFooter}{%
 \bottomrule
}
\newglossarystyle{long-loc-desc-sym-name}%
{%
  \ifGlsLongExtraUseTabular
   \renewenvironment{theglossary}%
    {%
      \glslongextraSymLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{tabular}[\glslongextraTabularVAlign]{%
          \expandonce\glslongextraLocationAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {%
      \glslongextraLocationDescSymNameTabularFooter
      \end{tabular}%
    }%
   \renewcommand*{\glossaryheader}{\glslongextraLocationDescSymNameTabularHeader}%
  \else
   \renewenvironment{theglossary}%
    {%
      \glspatchLToutput
      \glslongextraSymLocSetDescWidth
      \edef\@glslongextra@begintab{%
        \noexpand\begin{longtable}{%
          \expandonce\glslongextraLocationAlign
          \expandonce\glslongextraDescAlign
          \expandonce\glslongextraSymbolAlign
          \expandonce\glslongextraNameAlign
        }}%
      \@glslongextra@begintab
    }%
    {\end{longtable}}%
   \renewcommand*{\glossaryheader}{\glslongextraLocationDescSymNameHeader}%
  \fi
  \renewcommand*{\glsgroupheading}[1]{\glslongextraGroupHeading{4}{##1}}%
  \renewcommand{\glossentry}[2]{%
    \glslongextraLocationFmt{##1}{##2} &
    \glslongextraDescFmt{##1} &
    \glslongextraSymbolFmt{##1} &
    \glslongextraNameFmt{##1}\tabularnewline
  }%
  \renewcommand{\subglossentry}[3]{%
     \glslongextraSubLocationFmt{##1}{##2}{##3} &
     \glslongextraSubDescFmt{##1}{##2} &
     \glslongextraSubSymbolFmt{##1}{##2} &
     \glslongextraSubNameFmt{##1}{##2}\tabularnewline
  }%
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{\glspenaltygroupskip}%
  \fi
}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossary-longextra-2021-11-22.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossary-topic-2021-11-22.sty>
%    \end{macrocode}
%\fi
%\subsection{Rollback v1.48 (glossary-topic-2021-11-22.sty)}
% Version 1.48 preserved for rollback.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{glossary-topic}[2021/11/22 v1.48 (NLCT)]
\RequirePackage{multicol}
\newglossarystyle{topic}{%
  \renewenvironment{theglossary}%
  {%
    \glstopicInit
    \def\glstopic@prechildren{}%
    \def\glstopic@prevlevel{-1}%
  }%
  {\par}%
  \renewcommand*{\glossaryheader}{}%
  \renewcommand*{\glsgroupheading}[1]{%
    \def\glstopic@prevlevel{-1}%
    \glstopicGroupHeading{##1}%
  }%
  \renewcommand{\glossentry}[2]{%
    \hangindent0pt\relax
    \parindent\glstopicParIndent\relax
    \glstopicItem{##1}{##2}%
     \ifglshasdesc{##1}%
     {%
       \def\glstopic@prechildren{}%
     }%
     {%
       \def\glstopic@prechildren{\nopagebreak}%
     }%
  }%
  \renewcommand{\subglossentry}[3]{%
    \ifnum\glstopic@prevlevel=0\relax\glstopic@prechildren\fi
    \def\glstopic@prevlevel{##1}%
    \begingroup
    \glstopicAssignSubIndent{##1}%
    \glstopicSubItem{##1}{##2}{##3}%
    \par
    \endgroup
  }%
  \renewcommand*{\glsgroupskip}{}%
}
\newcommand*{\glstopicGroupHeading}[1]{}
\newcommand*{\glstopicItem}[2]{%
  \glspar\glstopicPreSkip\glspar\noindent
  \glstopicMarker{#1}%
  \glstopicTitleFont
  {%
    \glsentryitem{#1}\glstarget{#1}{\glstopicTitle{#1}}%
  }%
  \ifglshasdesc{#1}%
  {\glspar\nobreak\glstopicMidSkip\glspar\nobreak
   \@afterheading\glstopicDesc{#1}\glspar\glstopicPostSkip}%
  {\glspar\nobreak\glstopicPostSkip}%
  \glstopicLoc{#1}{#2}%
}
\newcommand*{\glstopicMarker}[1]{}
\newcommand*{\glstopicTitle}[1]{\Glossentryname{#1}%
  \ifglshassymbol{#1}{\space(\glossentrysymbol{#1})}{}%
}
\newcommand*{\glstopicTitleFont}[1]{\textbf{\large #1}}
\newcommand*{\glstopicDesc}[1]{\Glossentrydesc{#1}\glspostdescription}
\newcommand*{\glstopicLoc}[2]{}
\newlength\glstopicParIndent
\setlength\glstopicParIndent{20pt}
\newlength\glstopicSubIndent
\setlength\glstopicSubIndent{20pt}
\newcommand{\glstopicInit}{}
\newcommand*{\glstopicAssignSubIndent}[1]{%
  \par
  \parindent\dimexpr#1\glstopicSubIndent-\glstopicSubIndent\relax
  \glstopicAssignWidest{#1}%
  \glstopicsubitemhangindent=\dimexpr\parindent+\glstopicwidest\relax
  \hangindent\glstopicsubitemhangindent\relax
  \everypar{\hangindent\glstopicsubitemhangindent\relax
    \parindent\dimexpr\glstopicSubItemParIndent+\glstopicsubitemhangindent\relax}%
}
\newlength\glstopicsubitemhangindent
\newlength\glstopicSubItemParIndent
\glstopicSubItemParIndent\parindent
\newlength\glstopicwidest
\newcommand*{\glstopicAssignWidest}[1]{%
  \ifcsundef{@glswidestlength\romannumeral#1}%
  {%
    \ifcsdef{@glswidestname\romannumeral#1}%
    {%
      \settowidth{\glstopicwidest}{%
       \glstopicSubNameFont{\csuse{@glswidestname\romannumeral#1}}%
       \glstopicSubItemSep
      }%
    }%
    {\setlength{\glstopicwidest}{0pt}}%
    \csedef{@glswidestlength\romannumeral#1}{\the\glstopicwidest}%
  }%
  {\setlength{\glstopicwidest}{\csuse{@glswidestlength\romannumeral#1}}}%
}
\newcommand*{\glstopicPreSkip}{\medskip}
\newcommand*{\glstopicMidSkip}{\smallskip}
\newcommand*{\glstopicPostSkip}{\smallskip}
\newcommand*{\glstopicSubItem}[3]{%
  \glstopicSubItemBox{#1}{\glstopicSubNameFont{\glsentryitem{#2}%
    \glstarget{#2}{\glossentryname{#2}}}%
    \glstopicSubItemSep
  }%
  \ifglshassymbol{#2}{(\glossentrysymbol{#2})\space}{}%
  \ifglshasdesc{#2}%
   {\glossentrydesc{#2}\glspostdescription\glstopicSubPreLocSep}{}%
  \glstopicSubLoc{#2}{#3}%
}
\newcommand*{\glstopicSubItemSep}{\quad}
\newcommand*{\glstopicSubItemBox}[2]{%
  \ifdim\glstopicwidest>0pt\relax\makebox[\glstopicwidest][l]{#2}\else#2\fi
}
\newcommand*{\glstopicSubNameFont}[1]{\textbf{#1}}
\newcommand*{\glstopicSubPreLocSep}{\space}
\newcommand*{\glstopicSubLoc}[2]{#2}
\newcommand*{\glstopicCols}{2}
\newcommand*{\glstopicColsEnv}{multicols}
\newglossarystyle{topicmcols}{%
  \renewenvironment{theglossary}%
  {%
    \glstopicInit
    \def\glstopic@prechildren{}%
    \def\glstopic@postchildren{}%
    \def\glstopic@prevlevel{-1}%
  }%
  {%
    \ifnum\glstopic@prevlevel>0\relax\glstopic@postchildren\fi
    \par
  }%
  \renewcommand*{\glossaryheader}{}%
  \renewcommand*{\glsgroupheading}[1]{%
    \ifnum\glstopic@prevlevel>0\relax\glstopic@postchildren\fi
    \def\glstopic@prevlevel{-1}%
    \glstopicGroupHeading{##1}%
  }%
  \renewcommand{\glossentry}[2]{%
    \ifnum\glstopic@prevlevel>0\relax\glstopic@postchildren\fi
    \def\glstopic@prevlevel{0}%
    \hangindent0pt\relax
    \parindent\glstopicParIndent\relax
    \glstopicItem{##1}{##2}%
    \ifnum\glstopicCols>1\relax
      \ifglshasdesc{##1}%
      {%
        \edef\glstopic@prechildren{%
          \noexpand\begin{\glstopicColsEnv}{\glstopicCols}%
        }%
      }%
      {%
        \edef\glstopic@prechildren{%
          \noexpand\nopagebreak
          \noexpand\begin{\glstopicColsEnv}{\glstopicCols}%
         }%
      }%
      \edef\glstopic@postchildren{\noexpand\end{\glstopicColsEnv}}%
    \fi
  }%
  \renewcommand{\subglossentry}[3]{%
    \ifnum\glstopic@prevlevel=0\relax\glstopic@prechildren\fi
    \def\glstopic@prevlevel{##1}%
    \glstopicAssignSubIndent{##1}%
    \glstopicSubItem{##1}{##2}{##3}%
  }%
  \renewcommand*{\glsgroupskip}{}%
}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossary-topic-2021-11-22.sty>
%    \end{macrocode}
%\fi
%\Finale
\endinput
