%\iffalse
% glossaries.dtx generated using makedtx version 0.91b (c) Nicola Talbot
% Command line args:
%   -src "glossaries.sty=>glossaries.sty"
%   -src "(glossary-.+)\.(sty)\Z=>\1.\2"
%   -doc "manual.tex"
%   -author "Nicola Talbot"
%   -dir "source"
%   glossaries
% Created on 2007/5/25 16:12
%\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) 2007 Nicola Talbot, all rights reserved.
% \fi
% \iffalse
%<*driver>
\documentclass[a4paper]{ltxdoc}
\usepackage{ifthen}
\usepackage{alltt}
\usepackage[colorlinks,
            bookmarks,
            hyperindex=false,
            pdfauthor={N.L.C. Talbot},
            pdftitle={glossaries.sty: LaTeX2e Package to Assist Generating Glossaries},
            pdfkeywords={LaTeX,package,glossary,acronyms}]{hyperref}

 %hyperindex conflicts with doc
 %(end up with |usage|hyperpage in indexentry)
 %This unfortunately means that the changes section doesn't
 %have active links, but at least it will keep makeindex happy.


\renewcommand{\usage}[1]{\textit{\hyperpage{#1}}}
\renewcommand{\main}[1]{\hyperpage{#1}}
\newcommand{\see}[2]{\emph{see} #1}
\makeatletter
\def\index@prologue{\section*{Index}}
\makeatother
\RecordChanges
\PageIndex
\CheckSum{2807}
\CodelineNumbered


\newcommand{\cmdname}[1]{\texttt{\char`\\#1}}

\newcommand*{\istkey}[1]{\texttt{#1}\index{makeindex=\texttt{makeindex}>#1=\texttt{#1}|hyperpage}}
\newcommand*{\icmdname}[1]{\texttt{\char`\\#1}\SpecialMainIndex{#1}}
\newcommand*{\appname}[1]{\texttt{#1}\index{#1=\texttt{#1}|hyperpage}}
\newcommand*{\mkidxspch}{\index{makeindex=\texttt{makeindex}>special characters|hyperpage}}
\newcommand*{\igloskey}[2][newglossaryentry]{\index{#1 options=\cmdname{#1} options>#2=\textsf{#2}|hyperpage}}
\newcommand*{\gloskey}[2][newglossaryentry]{\textsf{#2}\igloskey[#1]{#2}}
\newcommand*{\pkgopt}[2][]{%
\ifthenelse{\equal{#1}{}}{%
\textsf{#2}\index{package options>#2=\textsf{#2}|hyperpage}}{%
\textsf{#2=#1}\index{package options>#2=\textsf{#2}>#1=\textsf{#1}|hyperpage}}}
\newcommand*{\pkgoptval}[2]{\textsf{#1}\index{package options>#2>#1|hyperpage}}
\newcommand*{\glostyle}[1]{\textsf{#1}\index{glossary styles>#1|hyperpage}}
\newcommand*{\filetype}[1]{\texttt{#1}\index{file types>#1|hyperpage}}
\newcommand*{\styname}[1]{\textsf{#1}\index{#1 package=\textsf{#1} package|hyperpage}}
\newcommand*{\envname}[1]{\textsf{#1}}


\begin{document}
\DocInput{glossaries.dtx}
\end{document}
%</driver>
%\fi
%\MakeShortVerb{"}
%\DeleteShortVerb{\|}
%
% \title{glossaries.sty v 1.02: \LaTeXe\ Package to Assist Generating Glossaries}
% \author{Nicola L.C. Talbot\\[10pt]
%School of Computing Sciences\\
%University of East Anglia\\
%Norwich. Norfolk\\
%NR4 7TJ. United Kingdom.\\
%\url{http://theoval.cmp.uea.ac.uk/~nlct/}}
%
% \date{25th May 2007}
% \maketitle
%\tableofcontents
%
% \section{Introduction}
%
% \changes{1.0}{2007 May 16}{Initial version}
%The \styname{glossaries} package is provided to assist 
%generating glossaries.  It has a certain amount of flexibility, 
%allowing the user to customize the format of the glossary,
%define new glossary styles, and multiple glossaries. It
%also supports acronyms, and glossary styles which 
%include symbols in addition to a name and description for a
%given glossary entry. There is provision for loading a database
%of glossary terms, where only those terms used in the
%text are added to the glossary.  This
%package replaces the \styname{glossary} package which is now
%obsolete.
%
%The \styname{glossaries} package comes with the Perl script
%\appname{makeglossaries} which will run \appname{makeindex} on
%all the glossary files using a customized \appname{makeindex}
%style file (which is created by \icmdname{makeglossaries}). 
%The relevant extensions are obtained from the
%auxiliary file, so you only need to pass the basename as the
%argument. For example, if your document is called 
%\texttt{myfile.tex}, do:
%\begin{verbatim}
%latex myfile
%makeglossaries myfile
%latex myfile
%\end{verbatim}
%You may need to explicitly load \appname{makeglossaries} into
%Perl:
%\begin{verbatim}
%perl makeglossaries myfile
%\end{verbatim}
%There is a batch file called \texttt{makeglossaries.bat} which
%does this for Windows users.
%
%This documentation is structured as follows: \autoref{sec:quick}
%is for people who want a few quick pointers of how to get started,
%without having to read through lengthy descriptions, 
%\autoref{sec:overview} gives an overview of available commands
%and their syntax, \autoref{sec:code} contains the documented
%source code for those who want to know more about how the
%package works, and how to do more complicated things, such as
%changing the way glossary entries appear.
%
%\section{A Quick Guide For The Impatient}
%\label{sec:quick}
%
%This section is for people who want a few quick pointers
%of how to get started, without having to read through
%lengthy descriptions.
%
%\begin{enumerate}
%\item Load \styname{glossaries} \emph{after} \styname{hyperref}:
%\begin{verbatim}
%\usepackage{hyperref}
%\usepackage{glossaries}
%\end{verbatim}
%Similarly for the \styname{html} package:
%\begin{verbatim}
%\usepackage{html}
%\usepackage{glossaries}
%\end{verbatim}
%
%\item Always use \icmdname{makeglossaries} if you want the glossary
%entries to be written to the glossary file:
%\begin{verbatim}
%\documentclass{article}
%\usepackage{glossaries}
%\makeglossaries
%\end{verbatim}
%If you don't use \icmdname{makeglossaries}, your glossaries will
%not appear in the document!
%
%\item Use \icmdname{printglossaries} to make your glossaries appear 
%in the document at that point. For example:
%\begin{verbatim}
%\maketitle
%\printglossaries
%\section{Introduction}
%\end{verbatim}
%Note that only the glossary entries that have been used in the
%document text will appear in the glossary.
%
%\item When you have created your document, run \LaTeX\ on it,
%then the Perl script \appname{makeglossaries}, then run \LaTeX\
%on it again:
%\begin{verbatim}
%latex myfile
%makeglossaries myfile
%latex myfile
%\end{verbatim}
%If you use Windows, there is a batch file called 
%\texttt{makeglossaries.bat} which you can use, but you will
%still need Perl installed.
%
%\item New glossaries can be defined using:\par
%\icmdname{newglossary}%
%\marg{label}\marg{in-ext}\marg{out-ext}%
%\marg{title}\par where \meta{label} is an identifying label,
%\meta{in-ext} is the extension of the file to be created
%by \appname{makeindex} (called by \appname{makeglossaries}),
%\meta{out-ext} is the extension of the file to be read by
%\appname{makeindex} and \meta{title} is the title for this
%new glossary. Example:
%\begin{verbatim}
%\newglossary{notation}{not}{ntn}{Notation}
%\end{verbatim}
%This glossary's label is \texttt{notation} and its title
%will be Notation.
%
%\item Any new glossaries must be defined before 
%\cmdname{makeglossaries}
%\begin{verbatim}
%\documentclass{article}
%\usepackage{glossaries}
%\newglossary{notation}{not}{ntn}{Notation}
%\makeglossaries
%\end{verbatim}
%
%\item If you use the \pkgopt{acronym} package option, the 
%\styname{glossaries} package
%will automatically create a new glossary type labelled
%\texttt{acronym}:
%\begin{verbatim}
%\usepackage[acronym]{glossaries}
%\end{verbatim}
%
%\item If your pages have a hyphen compositor (i.e.\ your page
%numbers appear in the form 2-1), redefine \icmdname{glscompositor}
%\emph{before} \icmdname{makeglossaries}:
%\begin{verbatim}
%\documentclass{article}
%\usepackage{glossaries}
%\renewcommand{\glscompositor}{-}
%\makeglossaries
%\end{verbatim}
%
%\item To add the glossaries to the table of contents use the
%\pkgopt{toc} package option:
%\begin{verbatim}
%\usepackage[toc]{glossaries}
%\end{verbatim}
%
%\item Define a new entry with:\par
%\icmdname{newglossaryentry}\marg{label}\marg{key-val list}\par
%The \meta{key-val list} must at least contain a \gloskey{name}
%key and a \gloskey{description} key.
%For example:
%\begin{verbatim}
%\newglossaryentry{perl}{name=Perl,
%description=A scripting language}
%\end{verbatim}
%In this example, I have given the entry the label \texttt{perl}.
%Whenever I want to use this entry, that is the label I need
%to use to identify it.
%
%\item If the entry name starts with an accented letter, you will
%need to group the first letter (otherwise it will cause a
%problem for \icmdname{Gls} and \icmdname{Glspl}):
%\begin{verbatim}
%\newglossaryentry{elite}{name={{\'e}lite},
%description={select group or class}}
%\end{verbatim}
%
%\item If you have multiple glossaries, use the \gloskey{type}
%key to specify in which glossary the entry belongs. For example:
%\begin{verbatim}
%\newglossary{languages}{lan}{lng}{Index of Languages}
%
%\makeglossaries
%
%\newglossaryentry{perl}{name=Perl,
%description=A scripting language,
%type=languages}
%\end{verbatim}
%If \gloskey{type} is omitted, the default glossary is used.
%
%\item Remember to group values that have a comma or equal sign.
%For example:
%\begin{verbatim}
%\newglossaryentry{pagelist}{name=page list,
%description={A list of individual pages or page ranges
%(e.g.\ 1,2,4,7--9)}}
%\end{verbatim}
%
%\item Plural forms are assumed to be the singular form with an
%``s'' appended, unless otherwise specified. To specify an
%irregular plural, use the \gloskey{plural} key. For example:
%\begin{verbatim}
%\newglossaryentry{matrix}{name=matrix,
%description=rectangular array of quantities,
%plural=matrices}
%\end{verbatim}
%
%\item The way the term appears in the main text can be different
%from the way the term appears in the glossary:
%\begin{verbatim}
%\newglossaryentry{matrix}{name=Matrix,
%description=rectangular array of quantities,
%text=matrix,
%plural=matrices}
%\end{verbatim}
%In this example, the entry name appears as Matrix in the 
%glossary, and either matrix or matrices in the text.
%
%\item The way the term appears on first use can be different
%to the way it appears subsequently:
%\begin{verbatim}
%\newglossaryentry{singmtx}{name=Singular Matrix,
%description=A matrix with a zero determinant,
%first=singular matrix (SM),
%text=SM,
%firstplural=singular matrices (SMs)}
%\end{verbatim}
%In this example, the entry name appears as Singular Matrix in
%the glossary, and in the text it appears as singular matrix (SM)
%or singular matrices (SMs) the first time the entry is used,
%and subsequently appears as SM or SMs.
%
%\item The quick and easy way to define an acronym is to use:\par
%\icmdname{newacronym}\oarg{key-val list}\marg{label}\marg{abbrev}%
%\marg{long}\par
%For example:
%\begin{verbatim}
%\newacronym{svm}{SVM}{support vector machine}
%\end{verbatim}
%This is equivalent to:
%\begin{verbatim}
%\newglossaryentry{svm}{type=\acronymtype,
%name={SVM},
%description={support vector machine},
%text={SVM},
%first={support vector machine (SVM)},
%plural={SVMs},
%firstplural={support vector machines (SVMs)}}
%\end{verbatim}
%(The value of \icmdname{acronymtype} varies depending on whether
%the glossary package option \pkgopt{acronym} is used or not.
%The optional argument \meta{key-val list} can be used to
%override any of the \icmdname{newglossaryentry} keys, for
%example, if the acronym has an irregular plural.)
%
%\item The font used to display the entry name in the glossary
%is governed by \icmdname{glsnamefont}. This can be redefined
%as required. For example, to make the entry names appear
%in a medium sans-serif font do:
%\begin{verbatim}
%\renewcommand{\glsnamefont}[1]{\textsf{\mdseries #1}}
%\end{verbatim}
%Note that the list-like glossary styles defined in the
%\styname{glossary-list} package place the entry name in
%the optional argument to \icmdname{item}, so they will
%appear in bold, unless you redefine \icmdname{glsnamefont}.
%
%\item In the document use \icmdname{gls}\marg{label}
%to use a predefined term (this will also enter the term into 
%the associated glossary output file.) For example:
%\begin{verbatim}
%A \gls{singmtx} is a matrix with a zero determinant.
%\end{verbatim}
%
%\item Other variations:
%\begin{itemize}
%\item \icmdname{Gls}\marg{label} : like \cmdname{gls},
%but with first letter in upper case
%\item \icmdname{GLS}\marg{label} : like \cmdname{gls},
%but all upper case.
%\item \icmdname{glspl}\marg{label} : use plural
%\item \icmdname{Glspl}\marg{label} : use plural with
%first letter in upper case
%\item \icmdname{GLSpl}\marg{label} : use plural but
%all upper case
%\item \icmdname{glslink}\marg{label}\marg{link text} :
%use \meta{link text} to link to the given entry in the glossary.
%\end{itemize}
%For example, the following will produce the plural form with
%the first letter in uppercase:
%\begin{verbatim}
%\Glspl{singmtx} are matrices with a zero determinant.
%\end{verbatim}
%
%\item Additional text can be appended to the link using the
%end optional argument. For example, to form the possessive:
%\begin{verbatim}
%The \gls{singmtx}['s] dimensions are not necessarily equal.
%\end{verbatim}
%
%\item The format of the associated entry number can be
%changed using the \gloskey[glslink]{format} key in the optional argument.
%Note that the value of the \gloskey[glslink]{format} key should be the
%name of a command \emph{without} the initial backslash. For
%example:
%\begin{verbatim}
%The primary definition of \glspl[format=textbf]{singmtx}.
%\end{verbatim}
%In this example the relevant glossary entry will have the
%page number in bold (since it uses \cmdname{textbf}) but
%it will no longer have a hyperlink (if hyperlinks are enabled.)
%
%\item The \styname{glossaries} package provides commands to
%change the font whilst ensuring that the number remains a
%hyperlink. These are of the form \cmdname{hyper}\meta{xx} and
%are equivalent to the standard font changing commands of the
%form \cmdname{text}\meta{xx}, as well as \icmdname{hyperemph}
%(which uses \icmdname{emph}.) For example:
%\begin{verbatim}
%The primary definition of \glspl[format=hyperbf]{singmtx}.
%\end{verbatim}
%
%\item Entries can be added to the glossary without producing
%any text using \icmdname{glsadd}\marg{label} or
%\icmdname{glsaddall}. These commands also taken an optional
%argument where you can specify the format. For example
%\begin{verbatim}
%\glsadd[format=hyperbf]{singmtx}
%\end{verbatim}
%will add a line to the
%glossary file for the specified term, but will not produce
%any text where the command occurs.
%
%\item A number range can be entered using "format=(" and "format=)"
%to mark the beginning and ending of the range\footnote{This is new
%to version 1.01}. For example:
%\begin{verbatim}
%\glsadd[format=(]{singmtx}
%This is a very long section all about \glspl{singmtx}.
%
%% lots of text omitted
%
%\glsadd[format=)]{singmtx}
%\end{verbatim}
%This is equivalent to \appname{makeindex}'s "|(" and "|)" formats.
%
%\item You can combine the range markers with a formatting command
%(again without the preceding backslash.) For example:
%\begin{verbatim}
%This is the start of a very long section all 
%about \glspl[format=(hyperbf]{singmtx}.
%
%% lots of text omitted
%
%This is the end a very long section all about 
%\glspl[format=)hyperbf]{singmtx}.
%\end{verbatim}
%
%\item Only those terms that have actually been used in the
%document will be placed in the glossary. If you have defined
%a term that doesn't appear in the document, then it means
%you haven't used it in the text (either via \icmdname{glslink}
%or \icmdname{gls} and related commands, or via \icmdname{glsadd}
%or \icmdname{glsaddall}.)
%
%\item To change the sorting order, use the \gloskey{sort} key.
%For example:
%\begin{verbatim}
%\newglossaryentry{universal}{name={\ensuremath{\mathcal{U}}},
%description=The universal set,
%sort=U}
%\end{verbatim}
%
%\item You don't need to escape \appname{makeindex}'s special characters:
%\begin{verbatim}
%\newglossaryentry{quote}{name={"},
%description={Double quote character}}
%
%\newglossaryentry{exclam}{name={!},
%description={Exclamation mark}}
%
%\newacronym{rna}{RNA}{ribonukleins\"aure}
%\end{verbatim}
%
%\item Associated symbols can also be specified, but whether the
%symbol appears in the glossary depends on the glossary style.
%For example:
%\begin{verbatim}
%\newglossaryentry{metre}{name={metre},
%description={A metric measurement of length},
%symbol={m}}
%\end{verbatim}
%The predefined glossary styles that display the entry symbol
%are: \glostyle{long4col}, \glostyle{long4colheader},
%\glostyle{long4colborder}, \glostyle{long4colheaderborder},
%\glostyle{super4col}, \glostyle{super4colheader}, 
%\glostyle{super4colborder} and \glostyle{super4colheaderborder}.
%All the other styles supplied by this package ignore the associated 
%symbol.
%
%\item Glossary styles can be set using the \pkgopt{style} 
%package option. For example:
%\begin{verbatim}
%\usepackage[style=long3col]{glossary}
%\end{verbatim}
%or using \icmdname{glossarystyle}\marg{style}. For example:
%\begin{verbatim}
%\glossarystyle{altlist}
%\end{verbatim}
%The predefined glossary styles provided by the \styname{glossaries}
%bundle are detailed in \autoref{sec:styles}.
%
%\item The list of numbers associated with each glossary entry
%can be suppressed using the package option \pkgopt{nonumberlist}:
%\begin{verbatim}
%\usepackage[nonumberlist]{glossaries}
%\end{verbatim}
%
%\item By default, the glossaries will appear in an unnumbered 
%chapter if chapters are defined, otherwise in an unnumbered
%section. This can be changed using the \pkgopt{section} package
%option. For example, to make the glossaries appear in an unnumbered
%section, even if chapters are defined, do:
%\begin{verbatim}
%\usepackage[section]{glossaries}
%\end{verbatim}
%Other sectional units can also be specified as 
%\pkgopt{section}=\meta{value}. For example, to make the glossaries
%appear in unnumbered subsections:
%\begin{verbatim}
%\usepackage[section=subsection]{glossaries}
%\end{verbatim}
%
%\end{enumerate}
%
%\section{Overview}\label{sec:overview}
% \changes{1.02}{2007 May 25}{added overview section}
%
%\subsection{Package Options}
%
%The \styname{glossaries} package options are as follows:
%\begin{description}
%\item[\pkgopt{toc}] Add the glossaries to the table of contents
%\item[\pkgopt{section}] This is a key=value option. Its value should
%be the name of a sectional unit (e.g.\ "chapter"). This will make
%the glossaries appear in the named sectional unit, otherwise the
%each glossary will appear in an unnumber chapter, if chapters 
%exists, otherwise in an unnumbered section. Example:
%\begin{verbatim}
%\usepackage[section=subsection]{glossaries}
%\end{verbatim}
%You can omit the value if you want to use sections, i.e.\
%\begin{verbatim}
%\usepackage[section]{glossaries}
%\end{verbatim}
%is equivalent to
%\begin{verbatim}
%\usepackage[section=section]{glossaries}
%\end{verbatim}
%
%\item[\pkgopt{style}] This is a key=value option. Its value should
%be the name of the glossary style to use.
%
%\item[\pkgopt{nonumberlist}] This option will suppress the 
%associated number lists in the glossaries (see also 
%\autoref{sec:numberlists}.)
%
%\item[\pkgopt{acronym}] Make a separate glossary for acronyms.
%
%\item[\pkgopt{counter}] This is a key=value option. The value should
%be the name of the default counter to use in the number lists.
%
%\item[\pkgopt{sanitize}] This is a key=value option whose value
%is a key=value list. By default, the \styname{glossaries} package
%sanitizes the values of the \gloskey{name}, \gloskey{description}
%and \gloskey{symbol} keys used when defining a new glossary
%entry. This means that you don't need to worry about using fragile
%commands when defining new glossary entries, but this may lead
%to unexpected results if you try to display these values within
%the document text. This sanitization can be switched off using
%the \pkgopt{sanitize} package option. (See \autoref{sec:pkgopt}
%and \autoref{sec:newentry} for further details.)
%
%\end{description}
%
%\subsection{Defining Glossary Entries}
%\label{sec:newglosentry}
%
%All glossary entries that are used in a document must be defined in
%the preamble. Only those entries that occur in the document
%(using any of the commands described in \autoref{sec:glslink} and
%\autoref{sec:glsadd}) will appear in the glossary. Each time an entry
%is used in this way, a line is added to an associated glossary (.glo)
%file, which then needs to be converted into a corresponding .gls file
%which contains the typeset glossary. The Perl script
%\appname{makeglossaries} can be used to call \appname{makeindex}
%using a customised style file for each of the glossaries that are
%defined in the document.
%
%\DescribeMacro{\makeglossaries}
%The command \cmdname{makeglossaries} must be placed in the preamble,
%in order to create the customised \appname{makeindex} style file,
%and to ensure that glossary entries are written to the appropriate
%output file.
%
%\DescribeMacro{\newglossaryentry}
%New glossary entries are defined using the command:\\[10pt]
%\cmdname{newglossaryentry}\marg{label}\marg{key-val list}\\[10pt]
%The first argument, \meta{label}, must be a unique label with which to
%identify this entry. The second argument, \meta{key-val list},
%is a key=value list that supplies the relevant information about this
%entry. There are two required fields: \gloskey{name} and
%\gloskey{description}. Available fields are listed below:
%
%\begin{description}
%\item[{\gloskey{name}}] The name of the entry (as it will appear in the
%glossary.)
%\item[{\gloskey{description}}] A brief description of this term (to
%appear in the glossary.)
%\item[{\gloskey{text}}] How this entry will appear in the document text
%when using \icmdname{gls} (or one of its
%uppercase variants.) If this field is omitted, the value of the
%\gloskey{name} key is used.
%\item[{\gloskey{first}}] How the entry will appear in the document text
%the first time it is used with \icmdname{gls}
%(or one of its uppercase variants.) If this field is omitted,
%the value of the \gloskey{text} key is used.
%\item[{\gloskey{plural}}] How the entry will appear in the document text
%when using \icmdname{glspl} (or one of its uppercase variants.)
%If this field is omitted, the value is obtained by appending an
%``s'' to the value of the \gloskey{text} field.
%\item[{\gloskey{firstplural}}] How the entry will appear in the document
%text the first time it is used with \icmdname{glspl} (or one of
%its uppercase variants.) If this field is omitted, the value is
%obtained by appending an ``s'' to the value of the \gloskey{first}
%field.
%\item[{\gloskey{symbol}}] This field is provided to allow the user to
%specify an associated symbol, but most glossary styles ignore
%this value. If omitted, the value is set to \cmdname{relax}.
%\item[{\gloskey{sort}}] This value indicates how \appname{makeindex} should
%sort this entry. If omitted, the value of the \gloskey{name} field
%is used. This value is equivalent to \appname{makeindex}'s ``actual''
%character (which is usually the at-sign @.)
%\item[{\gloskey{type}}] This is the glossary type to which this entry
%belongs. If omitted, the default glossary is assumed.
%\end{description}
%
%\DescribeMacro{\loadglsentries}
%You can store all your glossary entry definitions in another
%file, and use:\\[10pt]
%\cmdname{loadglsentries}\oarg{type}\marg{filename}\\[10pt]
%where \meta{filename} is the name of the file containing all the
%\cmdname{newglossaryentry} commands. The optional argument
%\meta{type} is the name of the glossary to which those entries
%should belong, for those entries where the \gloskey{type} key has 
%been omitted. Note that only those entries that have been used
%in the text will appear in the relevant glossaries.
%
%\subsection{Number lists}
%\label{sec:numberlists}
%
%Each entry in the glossary has an associated number list. By default,
%these numbers refer to the pages on which that entry has been used
%(using any of the commands described in \autoref{sec:glslink}
%and \autoref{sec:glsadd}.) The number list can be suppressed using
%the \pkgopt{nonumberlist} package option, or an alternative counter
%can be set as the default using the \pkgopt{counter} package option.
%
%\subsection{Links to Glossary Entries}
%\label{sec:glslink}
%
%Once you have defined a glossary entry using 
%\icmdname{newglossaryentry}, you can refer to that entry in the
%document using one of the commands listed in this section.
%
%\DescribeMacro{\glslink}
%The command:\\[10pt]
%\cmdname{glslink}\oarg{options}\marg{label}\marg{text}\\[10pt]
%will place \meta{text} in the document at that point, and add
%a line into the associated glossary file for the glossary entry
%given by \meta{label}. If hyperlinks are supported, \meta{text}
%will be a hyperlink to the relevant line in the glossary. The
%optional argument \meta{options} must be a key=value list which
%can take any of the following keys:
%
%\begin{description}
%\item[{\gloskey[glslink]{format}}] This specifies how to format
%the associated number for this entry in the glossary. This value
%is equivalent to the \appname{makeindex} encap value, and (as with
%\cmdname{index}) the value needs to be the name of a 
%command \emph{without} the initial backslash. As with
%\cmdname{index}, the characters "(" and ")" can also be used to 
%specify the beginning and ending of a number range.
%
%The \styname{glossaries} package provides the following number 
%formats:
%\begin{center}
%\begin{tabular}{@{\sffamily}lp{0.8\linewidth}}
%hyperrm & The number is a serif hyperlink to the relevant part of the 
%document\\
%hypersf & The number is a sans-serif hyperlink to the relevant part 
%of the document\\
%hypertt & The number is a monospaced hyperlink to the relevant part 
%of the document\\
%hyperbf & The number is a bold hyperlink to the relevant part of the 
%document\\
%hypermd & The number is a medium weight hyperlink to the relevant 
%part of the document\\
%hyperit & The number is an italic hyperlink to the relevant 
%part of the document\\
%hypersl & The number is a slanted hyperlink to the relevant 
%part of the document\\
%hyperup & The number is an upright hyperlink to the relevant 
%part of the document\\
%hypersc & The number is a small caps hyperlink to the relevant 
%part of the document\\
%hyperemph & The number is an emphasized hyperlink to the relevant 
%part of the document\\
%\end{tabular}
%\end{center}
%Note that if the \cmdname{hyperlink} command hasn't been defined,
%the "hyper"\meta{xx} formats are equivalent to the
%analogous \cmdname{text}\meta{xx} font commands. If you want to
%make a new format, you will need to define a command which takes
%one argument, for example, if you want the associated number in
%the glossary to be in a bold sans-serif font, you can define a
%command called, say, \cmdname{hyperbsf}:
%\begin{verbatim}
%\newcommand{\hyperbsf}[1]{\textbf{\hypersf{#1}}}
%\end{verbatim}
%and then use "hyperbsf" as the value for the \gloskey{format} key.
%(See also \autoref{sec:printglos}.)
%
%\item[{\gloskey[glslink]{counter}}] This specifies which counter
%to use for the associated number for this glossary entry. (See also
%\autoref{sec:numberlists}.)
%
%\item[{\gloskey[glslink]{hyper}}] This is a boolean key which can
%be used to enable/disable the hyperlink to the relevant entry
%in the glossary. (Note that setting "hyper=true" will have no
%effect if \cmdname{hyperlink} has not been defined.) The default
%value is "hyper=true".
%
%\end{description}
%\DescribeMacro{\glslink*}
%There is also a starred version:\\[10pt]
%\cmdname{glslink*}\oarg{options}\marg{label}\marg{text}\\[10pt]
%which is equivalent to \cmdname{glslink}, except it sets
%"hyper=false".
%
%\DescribeMacro{\gls}
%The command:\\[10pt]
%\cmdname{gls}\oarg{options}\marg{label}\oarg{insert}\\[10pt]
%is the same as \cmdname{glslink}, except that the link text
%is determined from the values of the \gloskey{text} and 
%\gloskey{first} keys supplied when the entry was defined using
%\icmdname{newglossaryentry}. There are two uppercase variants:\\[10pt]
%\DescribeMacro{\Gls}
%\cmdname{Gls}\oarg{options}\marg{label}\oarg{insert}\\[10pt]
%and
%\DescribeMacro{\GLS}
%\cmdname{GLS}\oarg{options}\marg{label}\oarg{insert}\\[10pt]
%which make the first letter of the link, or all the link text,
%uppercase, respectively.
%
%The final optional argument \meta{insert}, allows you to insert
%some additional text into the link text. By default, this will
%append \meta{insert} at the end of the link text. The first optional
%argument, \meta{options}, is the same as the optional argument to
%\icmdname{glslink}.
%
%There are also analogous plural forms:\\[10pt]
%\DescribeMacro{\glspl}
%\cmdname{glspl}\oarg{options}\marg{label}\oarg{insert}\\[10pt]
%\DescribeMacro{\Glspl}
%\cmdname{Glspl}\oarg{options}\marg{label}\oarg{insert}\\[10pt]
%\DescribeMacro{\GLSpl}
%\cmdname{GLSpl}\oarg{options}\marg{label}\oarg{insert}\\[10pt]
%These determine the link text from the \gloskey{plural} and
%\gloskey{firstplural} keys supplied when the entry was first
%defined.
%
%\subsection{Adding an entry to the glossary without generating text}
%\label{sec:glsadd}
%
%\DescribeMacro{\glsadd}
%It is also possible to add a line in the glossary file without
%generating any text at that point in the document.\\[10pt]
%\cmdname{glsadd}\oarg{options}\marg{label}\\[10pt]
%This is similar to \icmdname{glslink}, only it doesn't produce
%any text (so therefore, there is no \gloskey[glslink]{hyper} key
%available in \meta{options}.)
%
%\DescribeMacro{\glsaddall}
%To add a line for all entries that have been defined, use:\\[10pt]
%\cmdname{glsaddall}\oarg{glossary list}\\[10pt]
%If there are multiple glossaries, you can specify to add only
%those entries which belong to the glossaries listed in
%\meta{glossary list} (which must be a comma separated list of
%glossary names.)
%
%\subsection{Displaying a glossary}
%
%\DescribeMacro{\printglossaries}
%The command \cmdname{printglossaries} will display all the
%defined glossaries. Note that no glossaries will appear until
%you have either used the Perl script \appname{makeglossaries}
%or have directly used \appname{makeindex}. If the glossary still
%does not appear, after you re-\LaTeX\ your document, then check
%the \appname{makeindex} log files to see if there is a problem.
%
%\DescribeMacro{\printglossary}
%An individual glossary is displayed using:\\[10pt]
%\cmdname{printglossary}\oarg{options}\\[10pt]
%where \meta{options} is a key-val list of options. The following
%keys are available:
%\begin{description}
%\item[{\gloskey[printglossary]{type}}] The value of this key
%specifies which glossary to print. If omitted, the default
%glossary is assumed.
%
%\item[{\gloskey[printglossary]{title}}] This is the glossary's
%title (overriding the title specified when the glossary was 
%defined.)
%
%\item[{\gloskey[printglossary]{toctitle}}] This is the title
%to use for the table of contents (if the \pkgopt{toc} package
%option has been used.)
%
%\item[{\gloskey[printglossary]{style}}] This specifies which
%glossary style to use for this glossary.
%\end{description}
%
%\subsection{Defining New Glossaries}
%
%\DescribeMacro{\newglossary}
%A new glossary can be defined using:\\[10pt]
%\cmdname{newglossary}\oarg{log-ext}\marg{name}\marg{in-ext}\marg{out-ext}\marg{title}\oarg{counter}\\[10pt]
%where \meta{name} is label to assign to this glossary. (Note that
%the default glossary is labelled "main" and if you use the
%\pkgopt{acronym} package option, there will also be a glossary
%called "acronym".) The arguments \meta{in-ext} and \meta{out-ext}
%specify the extensions to give to the input and output files
%for that glossary, \meta{title} is the default title for this
%new glossary and the final optional argument \meta{counter} specifies
%which counter to use for the associated number lists (see also
%\autoref{sec:numberlists}.) The first optional argument specifies
%the extension for the \appname{makeindex} transcript file (this 
%information is only used by \appname{makeglossaries} which picks
%up the information from the auxiliary file.)
%
%\subsection{Acronyms}
%
%\DescribeMacro{\newacronym}
%As you may have noticed in \autoref{sec:newglosentry}, when you
%specify a new entry, you can specify alternate text to use when
%the term is first used in the document, this provides a useful
%means to define acronyms. The \styname{glossaries} package defines
%the command:\\[10pt]
%\cmdname{newacronym}\oarg{key-val list}\marg{label}\marg{abbrv}\marg{long}\\[10pt]
%This is equivalent to:\vskip5pt
%\begin{ttfamily}\obeylines
%\cmdname{newglossaryentry}\textrm{\marg{label}}\{type=\cmdname{acronymtype},
%name=\textrm{\marg{abbrv}},
%description=\textrm{\marg{long}},
%text=\textrm{\marg{abbrv}},
%first=\{\textrm{\meta{long}} (\textrm{\meta{abbrv}})\},
%plural=\{\textrm{\meta{abbrv}}s\},
%firstplural=\{\textrm{\meta{long}}s (\textrm{\meta{abbrv}}s)\},
%\textrm{\meta{key-val list}}\}
%\end{ttfamily}
%\vskip5pt
%The command \cmdname{acronymtype} is the name of the glossary
%in which the acronyms should appear. If the \pkgopt{acronym}
%package option has been used, this will be "acronym", otherwise
%it will be "main". The acronyms can then be used in exactly
%the same way as any other glossary entry.
%
%\subsection{Glossary Styles}
%The \styname{glossaries} package comes with some pre-defined
%glossary styles. These are as follows:
%\begin{description}
%\item[list] The \glostyle{list} style uses the \envname{description}
%environment. The entry name is placed in the optional argument
%of the \cmdname{item} command (so it will appear in bold by
%default). The description follows, and then the associated number
%list for that entry.
%
%\item[listgroup] The \glostyle{listgroup} style is like 
%\glostyle{list}, but the glossary groups have headings.
%
%\item[listhypergroup] The \glostyle{listhypergroup} style is like 
%\glostyle{listgroup}, but has a set of links to the glossary 
%groups.
%
%\item[altlist] The \glostyle{altlist} style is like \glostyle{list}
%but the description is placed on the following line.
%
%\item[altlistgroup] The \glostyle{altlistgroup} style is like 
%\glostyle{altlist}, but the glossary groups have headings.
%
%\item[altlisthypergroup] The \glostyle{altlisthypergroup} style is like 
%\glostyle{altlistgroup}, but has a set of links to the glossary 
%groups.
%
%\item[long] The \glostyle{long} style uses the \envname{longtable}
%environment. It has two columns, the first column contains the
%entry's name, the second column contains the description followed
%by the number list.
%
%\item[longborder] The \glostyle{longborder} style is like
%\glostyle{long}, but has horizontal and vertical lines around it.
%
%\item[longheader] The \glostyle{longheader} style is like
%\glostyle{long}, but has a header row.
%
%\item[longheaderborder] The \glostyle{longheaderborder} style is
%like \glostyle{longheader}, but has horizontal and vertical lines
%around it.
%
%\item[long3col] The \glostyle{long3col} style is like
%\glostyle{long} but has three columns. The first column contains
%the entry's name, the second column contains the description
%and the third column contains the number list.
%
%\item[long3colborder] The \glostyle{long3colborder} style is like
%the \glostyle{long3col} style but has horizontal and vertical
%lines around it.
%
%\item[long3colheader] The \glostyle{long3colheader} style is like
%\glostyle{long3col}, but has a header row.
%
%\item[long3colheaderborder] The \glostyle{long3colheaderborder} style is
%like \glostyle{long3colheader}, but has horizontal and vertical lines
%around it.
%
%\item[long4col] The \glostyle{long4col} style is like 
%\glostyle{long3col} but has an additional column in which the
%entry's associated symbol appears.
%
%\item[long4colborder] The \glostyle{long4colborder} style is like
%the \glostyle{long4col} style but has horizontal and vertical
%lines around it.
%
%\item[long4colheader] The \glostyle{long4colheader} style is like
%\glostyle{long4col}, but has a header row.
%
%\item[long4colheaderborder] The \glostyle{long4colheaderborder} style is
%like \glostyle{long4colheader}, but has horizontal and vertical lines
%around it.
%
%\item[super] The \glostyle{super} style uses the \envname{supertabular}
%environment. It has two columns, the first column contains the
%entry's name, the second column contains the description followed
%by the number list.
%
%\item[superborder] The \glostyle{superborder} style is like
%\glostyle{super}, but has horizontal and vertical lines around it.
%
%\item[superheader] The \glostyle{superheader} style is like
%\glostyle{super}, but has a header row.
%
%\item[superheaderborder] The \glostyle{superheaderborder} style is
%like \glostyle{superheader}, but has horizontal and vertical lines
%around it.
%
%\item[super3col] The \glostyle{super3col} style is like
%\glostyle{super} but has three columns. The first column contains
%the entry's name, the second column contains the description
%and the third column contains the number list.
%
%\item[super3colborder] The \glostyle{super3colborder} style is like
%the \glostyle{super3col} style but has horizontal and vertical
%lines around it.
%
%\item[super3colheader] The \glostyle{super3colheader} style is like
%\glostyle{super3col}, but has a header row.
%
%\item[super3colheaderborder] The \glostyle{super3colheaderborder} style is
%like \glostyle{super3colheader}, but has horizontal and vertical lines
%around it.
%
%\item[super4col] The \glostyle{super4col} style is like 
%\glostyle{super3col} but has an additional column in which the
%entry's associated symbol appears.
%
%\item[super4colborder] The \glostyle{super4colborder} style is like
%the \glostyle{super4col} style but has horizontal and vertical
%lines around it.
%
%\item[super4colheader] The \glostyle{super4colheader} style is like
%\glostyle{super4col}, but has a header row.
%
%\item[super4colheaderborder] The \glostyle{super4colheaderborder} style is
%like \glostyle{super4colheader}, but has horizontal and vertical lines
%around it.
%
%\end{description}
%
%The glossary style can be set using the \pkgopt{style} package option,
%or using the \gloskey[printglossary]{style} key in the optional
%argument to \icmdname{printglossary}, or using the command:\\[10pt]
%\cmdname{glossarystyle}\marg{style-name}\\[10pt]
%For further details on creating or modifying glossary styles see 
%\autoref{sec:printglos} and \autoref{sec:styles}.
%
% \StopEventually{\phantomsection\addcontentsline{toc}{section}{Index}\PrintIndex}
%
%
%
%
%\section{The Code}
%\iffalse
%    \begin{macrocode}
%<*glossaries.sty>
%    \end{macrocode}
%\fi
%\label{sec:code}
% \subsection{Package Definition}
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{glossaries}[2007/05/25 v1.02 (NLCT)]
%    \end{macrocode}
% Required packages:
%    \begin{macrocode}
\RequirePackage{ifthen}
\RequirePackage{xkeyval}[2006/11/18]
\RequirePackage{xspace}
%    \end{macrocode}
%
% \subsection{Package Options}\label{sec:pkgopt}
% The \pkgopt{toc} package option will add the glossaries 
% to the table of contents. This is a boolean key, if the
% value is omitted it is taken to be true.
%    \begin{macrocode}
\define@boolkey{glossaries.sty}[gls]{toc}[true]{}
%    \end{macrocode}
%
%\DescribeMacro{\@@glossarysec}
% The sectional unit used to start the glossary is stored in
% \cmdname{@@glossarysec}. If chapters are defined, this
% is initialised to \texttt{chapter}, otherwise it is
% initialised to \texttt{section}.
%    \begin{macrocode}
\@ifundefined{chapter}{\newcommand*{\@@glossarysec}{section}}{%
\newcommand*{\@@glossarysec}{chapter}}
%    \end{macrocode}
% The \pkgopt{section} key can be used to set the sectional unit.
% If no unit is specified, use \texttt{section} as the default.
% The starred form of the named sectional unit will be used.
% If you want some other way to start the glossary section (e.g.\ 
% a numbered section) you will have to redefined 
% \icmdname{glossarysection}.
%    \begin{macrocode}
\define@choicekey{glossaries.sty}{section}{part,chapter,section,%
subsection,subsubsection,paragraph,subparagraph}[section]{%
\renewcommand*{\@@glossarysec}{#1}}
%    \end{macrocode}
%
%\DescribeMacro{\@glossary@default@style}
% The default glossary style is stored in 
% \cmdname{@glossary@default@style}. This is initialised to
% \texttt{list}. (The \glostyle{list} style is
% defined in the accompanying \styname{glossary-list} package
% described in \autoref{sec:styles}.)
%    \begin{macrocode}
\newcommand*{\@glossary@default@style}{list}
%    \end{macrocode}
% The default glossary style can be changed using the \pkgopt{style}
% package option. The value can be the name of any
% defined glossary style. The glossary style is set at the beginning
% of the document, so you can still use the \pkgopt{style} key to
% set a style that is defined in another package. This package comes
% with some predefined styles that are defined in 
% \autoref{sec:styles}.
%    \begin{macrocode}
\define@key{glossaries.sty}{style}{%
\renewcommand*{\@glossary@default@style}{#1}}
%    \end{macrocode}
%
% Each entry within a given glossary will have an associated
% number list. By default, this refers to the page numbers on
% which that entry has been used, but it can also refer to any counter
% used in the document (such as the section or equation counters).
% The default number list format displays the number list ``as is'':
%\DescribeMacro{\glossaryentrynumbers}
%    \begin{macrocode}
\newcommand*{\glossaryentrynumbers}[1]{#1}
%    \end{macrocode}
% Note that the entire number list for a given entry will be
% passed to \cmdname{glossaryentrynumbers} so any font changes
% will also be applied to the delimiters.
% The \pkgopt{nonumberlist} package option suppresses the 
% number lists (this simply redefines 
% \cmdname{glossaryentrynumbers} to ignores its argument.)
%    \begin{macrocode}
\DeclareOptionX{nonumberlist}{%
\renewcommand*{\glossaryentrynumbers}[1]{}}
%    \end{macrocode}
%
%\DescribeMacro{\glsdefaulttype}
% Keep track of the default glossary. This is initialised to
% the main glossary, but can be changed if for some reason
% you want to make a secondary glossary the main glossary. This
% affects any commands that can optionally take a glossary name
% as an argument (or as the value of the 
% \gloskey{type}\igloskey[printglossary]{type} key in 
%a key-value list.) This was mainly done so that 
% \icmdname{loadglsentries} can temporarily change 
% \cmdname{glsdefaulttype} while it loads a file containing
% new glossary entries (see \autoref{sec:load}).
%    \begin{macrocode}
\newcommand{\glsdefaulttype}{main}
%    \end{macrocode}
%\DescribeMacro{\acronymtype}
% Keep track of which glossary the acronyms are in. This is 
% initialised to \cmdname{glsdefaulttype}, but is changed by
% the \pkgopt{acronym} package option.
%    \begin{macrocode}
\newcommand{\acronymtype}{\glsdefaulttype}
%    \end{macrocode}
% The \pkgopt{acronym} option sets an associated conditional 
% which is used in \autoref{sec:acronym} to determine whether
% or not to define a separate glossary for acronyms.
%    \begin{macrocode}
\define@boolkey{glossaries.sty}[gls]{acronym}[true]{}
%    \end{macrocode}
%
%\DescribeMacro{\glscounter}
% The default counter associated with the numbers in the glossary
% is stored in \cmdname{glscounter}. This is initialised to the 
% page counter. This is used as the default counter when a
% new glossary is defined, unless a different counter is specified
% in the optional argument to \icmdname{newglossary} (see
% \autoref{sec:newglos}).
%    \begin{macrocode}
\newcommand{\glscounter}{page}
%    \end{macrocode}
% The \pkgopt{counter} option changes the default counter. (This
% just redefines \cmdname{glscounter}.)
%    \begin{macrocode}
\define@key{glossaries.sty}{counter}{%
\renewcommand*{\glscounter}{#1}}
%    \end{macrocode}
%
% The glossary keys whose values are written to another file (i.e.\
% \gloskey{sort}, \gloskey{name}, \gloskey{description} and
% \gloskey{symbol}) need to be sanitized, otherwise fragile
% commands would not be able to be used in 
% \icmdname{newglossaryentry}. However, strange results will occur
% if you then use those fields in the document. As these fields
% are not normally used in the document, but are by default only
% used in the glossary, the default is to sanitize them. If however
% you want to use these values in the document (either by redefining
% commands like \icmdname{glsdisplay} or by using commands like
% \icmdname{glsentrydesc}) you will have to switch off the 
% sanitization using the \pkgopt{sanitize} package option, but
% you will then have to use \icmdname{protect} to protect fragile 
% commands when defining new glossary entries. 
% The \pkgopt{sanitize} option
% takes a key-value list as its value, which can be used to 
% switch individual values on and off. For example:
%\begin{verbatim}
%\usepackage[sanitize={description,name,symbol=false}]{glossaries}
%\end{verbatim}
%will switch off the sanitization for the \gloskey{symbol} key, but
% switch it on for the \gloskey{description} and \gloskey{name} keys.
% This would mean that you can use fragile commands in the
%description and name when defining a new glossary entry, but not
% for the symbol.
%
% The default values are defined as:
%    \begin{macrocode}
\newcommand*{\@gls@sanitizedesc}{\@onelevel@sanitize\@glo@desc}
\newcommand*{\@gls@sanitizename}{\@onelevel@sanitize\@glo@name}
\newcommand*{\@gls@sanitizesymbol}{\@onelevel@sanitize\@glo@symbol}
%    \end{macrocode}
% (There is no equivalent for the \gloskey{sort} key, since that
% is only provided for the benefit of \appname{makeindex}, and
% so will always be sanitized.)
%
% Before defining the \pkgopt{sanitize} package option, The 
% key-value list for the \pkgopt{sanitize} value needs to be defined.
% These are all boolean keys. If they are not given a value, assume
% \texttt{true}.
%
% Firstly the \gloskey{description}. If set, it will redefine
% \cmdname{@gls@sanitizedesc} to use \cmdname{@onelevel@sanitize},
% otherwise \cmdname{@gls@sanitizedesc} will do nothing.
%    \begin{macrocode}
\define@boolkey[gls]{sanitize}{description}[true]{%
\ifgls@sanitize@description
  \renewcommand*{\@gls@sanitizedesc}{\@onelevel@sanitize\@glo@desc}%
\else
  \renewcommand*{\@gls@sanitizedesc}{}%
\fi
}
%    \end{macrocode}
% Similarly for the \gloskey{name} key:
%    \begin{macrocode}
\define@boolkey[gls]{sanitize}{name}[true]{%
\ifgls@sanitize@name
  \renewcommand*{\@gls@sanitizename}{\@onelevel@sanitize\@glo@name}%
\else
  \renewcommand*{\@gls@sanitizename}{}%
\fi}
%    \end{macrocode}
% and for the \gloskey{symbol} key:
%    \begin{macrocode}
\define@boolkey[gls]{sanitize}{symbol}[true]{%
\ifgls@sanitize@symbol
  \renewcommand*{\@gls@sanitizesymbol}{%
\@onelevel@sanitize\@glo@symbol}%
\else
  \renewcommand*{\@gls@sanitizesymbol}{}%
\fi}
%    \end{macrocode}
% Now define the \pkgopt{sanitize} option. It can either take
% a key-val list as its value, or it can take the keyword
% \texttt{none}, which is equivalent to \texttt{description=false,
% symbol=false, name=false}:
%    \begin{macrocode}
\define@key{glossaries.sty}{sanitize}[description=true,symbol=true,
name=true]{%
\ifthenelse{\equal{#1}{none}}{%
\renewcommand*{\@gls@sanitizedesc}{}%
\renewcommand*{\@gls@sanitizename}{}%
\renewcommand*{\@gls@sanitizesymbol}{}%
}{\setkeys[gls]{sanitize}{#1}}%
}
%    \end{macrocode}
% Process package options:
%    \begin{macrocode}
\ProcessOptionsX
%    \end{macrocode}
%
% If chapters are defined and the user has requested the
% section counter as a package option, \cmdname{@chapter} will
% be modified so 
% that it adds a \texttt{section.}\meta{n}\texttt{.0} target, 
% otherwise entries placed before the first section of a chapter
% will have undefined links.
%
% The same problem will also occur if a lower sectional unit is
% used, but this is less likely to happen. If it does, or if
% you change \cmdname{glscounter} to "section" later, you
% will have to specify a different counter for the entries
% that give rise to a \texttt{name}"{"\meta{section-level}"."\meta{n}".0}"
% non-existent warning (e.g. "\gls[counter=chapter]{label}").
%    \begin{macrocode}
\ifthenelse{\equal{\glscounter}{section}}{%
\@ifundefined{chapter}{}{%
\let\@gls@old@chapter\@chapter
\def\@chapter[#1]#2{\@gls@old@chapter[{#1}]{#2}%
\@ifundefined{hyperdef}{}{\hyperdef{section}{\thesection}{}}}}}{}
%    \end{macrocode}
%
%\subsection{Default values}
% This section sets up default values that are used by this
% package. Some of the names may already be defined (e.g.\ by
% \styname{babel}) so \cmdname{providecommand} is used.
%
% Main glossary title:
%\DescribeMacro{\glossaryname}
%    \begin{macrocode}
\providecommand*{\glossaryname}{Glossary}
%    \end{macrocode}
%\DescribeMacro{\acronymname}
% The title for the "acronym" glossary type (which is defined if 
% \pkgopt{acronym} package option is used) is given by
% \cmdname{acronymname}. If the \pkgopt{acronym}
% package option is not used, \cmdname{acronymname} won't be used.
%    \begin{macrocode}
\providecommand*{\acronymname}{Acronyms}
%    \end{macrocode}
%
% The following commands provide text for the headers used by 
% some of the tabular-like glossary 
% styles. Whether or not they get used in the glossary depends on
% the glossary style.
%\DescribeMacro{\entryname}
%\DescribeMacro{\descriptionname}
%\DescribeMacro{\symbolname}
%\DescribeMacro{\pagelistname}
%    \begin{macrocode}
\providecommand*{\entryname}{Notation}
\providecommand*{\descriptionname}{Description}
\providecommand*{\symbolname}{Symbol}
\providecommand*{\pagelistname}{Page List}
%    \end{macrocode}
% Labels for \appname{makeindex}'s symbol and number groups:
%\DescribeMacro{\glssymbolsgroupname}\DescribeMacro{\glsnumbersgroupname}
%    \begin{macrocode}
\providecommand*{\glssymbolsgroupname}{Symbols}
\providecommand*{\glsnumbersgroupname}{Numbers}
%    \end{macrocode}
%
%\DescribeMacro{\istfilename}
% The name of the \appname{makeindex} style file is given by
% \cmdname{istfilename}. This file is 
% created by \icmdname{writeist} (which is used by 
% \icmdname{makeglossaries}) so
% redefining this command will only have an effect if it is 
% done \emph{before} the \filetype{ist} file is created.
%    \begin{macrocode}
\providecommand*{\istfilename}{\jobname.ist}
%    \end{macrocode}
% The \appname{makeglossaries} Perl script picks up this name
% from the auxiliary file and passes it to \appname{makeindex}
% using the \texttt{-s} option. Since its not required by
% \LaTeX, \cmdname{@istfilename} ignores its argument.
%\DescribeMacro{\@istfilename}
%    \begin{macrocode}
\newcommand*{\@istfilename}[1]{}
%    \end{macrocode}
%
%\DescribeMacro{\glscompositor}
% This command is the value of the \istkey{page\_compositor}
% \appname{makeindex} key. Again, any redefinition of this command 
% must take place \emph{before} \cmdname{writeist} otherwise it 
% will have no effect.
%    \begin{macrocode}
\newcommand{\glscompositor}{.}
%    \end{macrocode}
% (The page compositor is usually defined as a dash when using
% \appname{makeindex}, but most of the standard counters used
% by \LaTeX\ use a full stop as the compositor, which is why I
% have used it as the default.)
%
%\DescribeMacro{\glsnumberformat}
% The command \cmdname{glsnumberformat} indicates the default
% format for the page numbers in the glossary. (Note that this
% is not the same as \icmdname{glossaryentrynumbers}, but applies
% to individual numbers or groups of numbers within an entry's
% associated number list.) If hyperlinks are defined, it will use
% \icmdname{glshypernumber}, otherwise it will simply display its 
% argument ``as is''.
%    \begin{macrocode}
\@ifundefined{hyperlink}{%
\newcommand*{\glsnumberformat}[1]{#1}}{%
\newcommand*{\glsnumberformat}[1]{\glshypernumber{#1}}}
%    \end{macrocode}
%\DescribeMacro{\delimN}
% Individual numbers in an entry's associated number list are
% delimited using \cmdname{delimN} (which corresponds to the 
% \istkey{delim\_n} \appname{makeindex} keyword.) The default value
% is a comma followed by a space.
%    \begin{macrocode}
\newcommand{\delimN}{, }
%    \end{macrocode}
%\DescribeMacro{\delimR}
% A range of numbers within an entry's associated number list is
% delimited using \cmdname{delimR} (which corresponds to the
% \istkey{delim\_r} \appname{makeindex} keyword.) The default is
% an en-dash.
%    \begin{macrocode}
\newcommand{\delimR}{--}
%    \end{macrocode}
%
%\DescribeMacro{\glossarypreamble}
% The glossary preamble is given by \cmdname{glossarypreamble}. This
% will appear after the glossary sectioning command, and before the
% \envname{theglossary} environment. It is designed to allow the
% user to add information pertaining to the glossary (e.g.\ ``page
% numbers in italic indicate the primary definition'') therefore 
% \cmdname{glossarypremable} shouldn't be affected by the glossary
% style. (So if you define your own glossary style, don't have it 
% change \cmdname{glossarypreamble}.) The preamble is empty by
% default. If you have multiple glossaries, and you want a 
% different preamble for each glossary, you will need to use
% \icmdname{printglossary} for each glossary type, instead of 
% \icmdname{printglossaries}, and redefine \cmdname{glossarypreamble}
% before each \icmdname{printglossary}.
%    \begin{macrocode}
\newcommand*{\glossarypreamble}{}
%    \end{macrocode}
%
%\DescribeMacro{\glossarypostamble}
% The glossary postamble is given by \cmdname{glossarypostamble}.
% This is provided to allow the user to
% add something after the end of the \envname{theglossary}
% environment (again, this shouldn't be affected by the
% glossary style.) It is, of course, possible to simply add the
% text after \icmdname{printglossary}, but if you only want the
% postamble to appear after the first glossary, but not after 
% subsequent glossaries, you can do something like:
%\begin{verbatim}
%\renewcommand{\glossarypostamble}{For a complete list of terms
%see \cite{blah}\gdef\glossarypreamble{}}
%\end{verbatim}
%    \begin{macrocode}
\newcommand*{\glossarypostamble}{}
%    \end{macrocode}
%
%\DescribeMacro{\glossarysection}
% The sectioning command that starts a glossary is given by
% \cmdname{glossarysection}. (This does not form part of the
% glossary style, and so should not be changed by a glossary
% style.) If \icmdname{phantomsection}
% is defined, it uses \cmdname{\@p@glossarysection}, otherwise it
% uses \cmdname{@glossarysection}.
%    \begin{macrocode}
\newcommand*{\glossarysection}[2][\@gls@title]{%
\def\@gls@title{#2}%
\@ifundefined{phantomsection}{%
\@glossarysection{#1}{#2}}{\@p@glossarysection{#1}{#2}}%
}
%    \end{macrocode}
%
% The required sectional unit is given by \cmdname{@@glossarysec}
% which was defined by the \pkgopt{section} package option. The
% starred form of the command is chosen. If you want a numbered 
% section for the glossary or if you don't want any sectional
% command, you will need to redefine \cmdname{glossarysection}.
%
%\DescribeMacro{\@glossarysection}
%The command \cmdname{@glossarysection} indicates how to start
% the glossary section if \icmdname{phantomsection} is not defined.
%    \begin{macrocode}
\newcommand*{\@glossarysection}[2]{%
\csname\@@glossarysec\endcsname*{#2}
\@gls@toc{#1}{\@@glossarysec}}
%    \end{macrocode}
%
%\DescribeMacro{\@p@glossarysection}
% As \cmdname{@glossarysection}, but put in 
% \icmdname{phantomsection}, and swap where \cmdname{@gls@toc} goes. 
% If using chapters do a \cmdname{clearpage}. This ensures that
% the hyper link from the table of contents leads to the line above
% the heading, rather than the line below it.
%    \begin{macrocode}
\newcommand*{\@p@glossarysection}[2]{%
\gls@doclearpage
\phantomsection\@gls@toc{#1}{\@@glossarysec}%
\csname\@@glossarysec\endcsname*{#2}}
%    \end{macrocode}
%
%\DescribeMacro{\gls@doclearpage}
%The \cmdname{gls@doclearpage} command is used to issue a
% \cmdname{clearpage} (or \cmdname{cleardoublepage}) depending
% on whether the glossary sectional unit is a chapter. If the
% sectional unit is something else, do nothing.
%    \begin{macrocode}
\newcommand{\gls@doclearpage}{%
\ifthenelse{\equal{\@@glossarysec}{chapter}}{%
\@ifundefined{cleardoublepage}{\clearpage}{\cleardoublepage}}{}%
}
%    \end{macrocode}
%
%\DescribeMacro{\@gls@toc}
% The glossary is added to the table of contents if glstoc flag set.
% If it is set, \cmdname{@gls@toc} will add a line to the 
% \filetype{toc} file, otherwise it will do nothing.
% (The first argument to \cmdname{@gls@toc} is the title for the
% table of contents, the second argument is the sectioning type.) 
%    \begin{macrocode}
\newcommand*{\@gls@toc}[2]{%
\ifglstoc \addcontentsline{toc}{#2}{#1}\fi}
%    \end{macrocode}
%
%\subsection{Loops and conditionals}
%\DescribeMacro{\forallglossaries}
% To iterate through all glossaries (or comma-separated list of
% glossary names given in optional argument) use:\\[10pt]
% \cmdname{forallglossaries}\oarg{glossary list}\marg{cmd}\marg{code}\\[10pt]
% where \meta{cmd} is
% a control sequence which will be set to the name of the
% glossary in the current iteration.
%    \begin{macrocode}
\newcommand*{\forallglossaries}[3][\@glo@types]{%
\@for#2:=#1\do{\ifthenelse{\equal{#2}{}}{}{#3}}}
%    \end{macrocode}
%
%\DescribeMacro{\forglsentries}
% To iterate through all entries in a given glossary use:\\[10pt]
%\cmdname{forglsentries}\oarg{type}\marg{cmd}\marg{code}\\[10pt]
%where \meta{type} is the glossary label and \meta{cmd} is a
% control sequence which will be set to the entry label in the
% current iteration.
%    \begin{macrocode}
\newcommand*{\forglsentries}[3][\glsdefaulttype]{%
\edef\@@glo@list{\csname glolist@#1\endcsname}%
\@for#2:=\@@glo@list\do{%
\ifthenelse{\equal{#2}{}}{}{#3}}}
%    \end{macrocode}
%
%\DescribeMacro{\forallglsentries}
% To iterate through all glossary entries over all glossaries listed
% in the optional argument (the default is all glossaries) use:\\[10pt] 
% \cmdname{forallglsentries}\oarg{glossary list}\marg{cmd}\marg{code}\\[10pt]
% Within \cmdname{forallglsentries}, the current glossary type
% is given by \cmdname{@@this@glo@}.
%    \begin{macrocode}
\newcommand*{\forallglsentries}[3][\@glo@types]{%
\expandafter\forallglossaries\expandafter[#1]{\@@this@glo@}{%
\forglsentries[\@@this@glo@]{#2}{#3}}}
%    \end{macrocode}
%
%\DescribeMacro{\ifglossaryexists}
% To check to see if a glossary exists use:\\[10pt]
%\cmdname{ifglossaryexists}\marg{type}\marg{true-text}\marg{false-text}\\[10pt]
%where \meta{type} is the glossary's label.
%    \begin{macrocode}
\newcommand{\ifglossaryexists}[3]{%
\@ifundefined{@glotype@#1@out}{#3}{#2}}
%    \end{macrocode}
%
%\DescribeMacro{\ifglsentryexists}
% To check to see if a glossary entry has been defined use:\\[10pt]
% \cmdname{ifglsentryexists}\marg{label}\marg{true text}\marg{false text}\\[10pt]
%where \meta{label} is the entry's label.
%    \begin{macrocode}
\newcommand{\ifglsentryexists}[3]{%
\@ifundefined{glo@#1@name}{#3}{#2}}
%    \end{macrocode}
%
%\DescribeMacro{\ifglsused}
% To determine if given glossary entry has been 
% used in the document text yet use:\\[10pt]
% \cmdname{ifglsused}\marg{label}\marg{true text}\marg{false text}\\[10pt]
% where \meta{label} is the entry's label.
% If true it will do \meta{true text}
% otherwise it will do \meta{false text}.
%    \begin{macrocode}
\newcommand*{\ifglsused}[3]{\ifthenelse{\boolean{glo@#1@flag}}{#2}{#3}}
%    \end{macrocode}
%The following two commands will cause an error if the given
% condition fails:
%
%\DescribeMacro{\glsdoifexists}
%\cmdname{glsdoifexists}\marg{label}\marg{code}\par
% Generate an error if entry specified by \meta{label} doesn't 
% exists, otherwise do \meta{code}.
%    \begin{macrocode}
\newcommand{\glsdoifexists}[2]{\ifglsentryexists{#1}{#2}{%
\PackageError{glossaries}{Glossary entry `#1' has not been
defined.}{You need to define a glossary entry before you
can use it.}}}
%    \end{macrocode}
%
%\DescribeMacro{\glsdoifnoexists}
%\cmdname{glsdoifnoexists}\marg{label}\marg{code}\par
% The opposite: only do second argument if the entry doesn't
% exists. Generate an error message if it exists.
%    \begin{macrocode}
\newcommand{\glsdoifnoexists}[2]{\ifglsentryexists{#1}{%
\PackageError{glossaries}{Glossary entry `#1' has already
been defined.}{}}{#2}}
%    \end{macrocode}
%
%\subsection{Defining new glossaries}\label{sec:newglos}
%\DescribeMacro{\@glo@types}
% A comma-separated list of glossary names is stored
% in \cmdname{@glo@types}. When a new glossary type
% is created, its identifying name is added to this list.
% This is used by commands that iterate through all glossaries
% (such as \icmdname{makeglossaries} and \icmdname{printglossaries}.)
%    \begin{macrocode}
\newcommand*{\@glo@types}{,}
%    \end{macrocode}
%
%\DescribeMacro{\newglossary}
% A new glossary type is defined using \cmdname{newglossary}.
% Syntax:\\[10pt]\cmdname{newglossary}\oarg{log-ext}\marg{name}\marg{in-ext}\marg{out-ext}%
%\marg{title}\oarg{counter}\\[10pt]%
% where \meta{log-ext} is the extension of the \appname{makeindex}
% transcript file, \meta{in-ext} is the extension of the glossary 
% input file (read in by \icmdname{printglossary} and created by
% \appname{makeindex}), \meta{out-ext} is the extension of the
% glossary output file which is read in by \appname{makeindex} 
% (lines are written to this file by the \icmdname{glossary} command),
% \meta{title} is the title of the glossary that is used in
% \icmdname{glossarysection} and
% \meta{counter} is the default counter to be used by entries
% belonging to this glossary. The \appname{makeglossaries} Perl
% script reads in the relevant extensions from the auxiliary file,
% and passes the appropriate file names and switches to 
% \appname{makeindex}.)
%    \begin{macrocode}
\newcommand*{\newglossary}[5][glg]{%
\ifglossaryexists{#2}{%
\PackageError{glossaries}{Glossary type `#2' already exists}{%
You can't define a new glossary called `#2' because it already
exists}%
}{%
%    \end{macrocode}
% Add this to the list of glossary types:
%    \begin{macrocode}
\toks@{#2}\edef\@glo@types{\@glo@types\the\toks@,}%
%    \end{macrocode}
% Define a comma-separated list of labels for this glossary type, 
% so that all the entries for this glossary can be reset with a 
% single command. When a new entry is created, its label is added
% to this list.
%    \begin{macrocode}
\expandafter\gdef\csname glolist@#2\endcsname{,}%
%    \end{macrocode}
% Store details of this new glossary type:
%    \begin{macrocode}
\expandafter\def\csname @glotype@#2@in\endcsname{#3}%
\expandafter\def\csname @glotype@#2@out\endcsname{#4}%
\expandafter\def\csname @glotype@#2@title\endcsname{#5}%
\protected@write\@auxout{}{\string\@newglossary{#2}{#1}{#3}{#4}}%
%    \end{macrocode}
% How to display this entry in the document text (uses
% \cmdname{glsdisplay} and \cmdname{glsdisplayfirst} by
% default). These can be redefined by the user later if required
% (see \icmdname{defglsdisplay} and \icmdname{defglsdisplayfirst})
%    \begin{macrocode}
\expandafter\gdef\csname gls@#2@display\endcsname{%
\glsdisplay}%
\expandafter\gdef\csname gls@#2@displayfirst\endcsname{%
\glsdisplayfirst}%
%    \end{macrocode}
% Find out if the final optional argument has been specified, and
% use it to set the counter associated with this glossary. (Uses
% \icmdname{glscounter} if no optional argument is present.)
%    \begin{macrocode}
\@ifnextchar[{\@gls@setcounter{#2}}{\@gls@setcounter{#2}[\glscounter]}}}
%    \end{macrocode}
% Only defined new glossaries in the preamble:
%    \begin{macrocode}
\@onlypreamble{\newglossary}
%    \end{macrocode}
%\DescribeMacro{\@newglossary}
%\cmdname{@newglossary} is used to specify the file extensions
% for the \appname{makeindex} input, output and transcript files.
% It is written to the auxiliary file by \icmdname{newglossary}.
% Since it is not used by \LaTeX, \cmdname{@newglossary} simply
% ignores its arguments.
%    \begin{macrocode}
\newcommand*{\@newglossary}[4]{}
%    \end{macrocode}
%\DescribeMacro{\@gls@setcounter}
% Store counter to be used for given glossary type (the first
% argument is the glossary label, the second argument is the name 
% of the counter):
%    \begin{macrocode}
\def\@gls@setcounter#1[#2]{%
\expandafter\def\csname @glotype@#1@counter\endcsname{#2}%
}
%    \end{macrocode}
%\DescribeMacro{\@gls@getcounter}
% Get counter associated with given glossary (the argument is
% the glossary label):
%    \begin{macrocode}
\newcommand*{\@gls@getcounter}[1]{%
\csname @glotype@#1@counter\endcsname}
%    \end{macrocode}
%
% Define the main glossary. This will be the first glossary to
% be displayed when using \icmdname{printglossaries}.
%    \begin{macrocode}
\newglossary{main}{gls}{glo}{\glossaryname}
%    \end{macrocode}
%
%\subsection{Defining new entries}\label{sec:newentry}
% New glossary entries are defined using \cmdname{newglossaryentry}.
% This command requires a label and a key-value list that defines
% the relevant information for that entry. The definition for these
% keys follows. Note that the \gloskey{name},
% \gloskey{description} and \gloskey{symbol} keys will be
% sanitized later, depending on the value of the package option
% \pkgopt{sanitize} (this means that if some of the keys haven't
% been defined, they can be constructed from the \gloskey{name}
% and \gloskey{description} key before they are sanitized).
%
%The \gloskey{name} key indicates the name
% of the term being defined. This is how the term will appear in
% the glossary. The \gloskey{name} key is required when defining
% a new glossary entry.
%    \begin{macrocode}
\define@key{glossentry}{name}{%
\def\@glo@name{#1}%
}
%    \end{macrocode}
%
% The \gloskey{description} key is usually only used in
% the glossary, but can be made to appear in the text by redefining
% \icmdname{glsdisplay} and \icmdname{glsdisplayfirst} (or
% using \icmdname{defglsdisplay} and \icmdname{defglsdisplayfirst}), however,
% you will have to disable the sanitize option (using the 
% \pkgopt{sanitize} package option, 
% "sanitize={description=false}", and protect fragile
% commands.) The \gloskey{description} key is required when
% defining a new glossary entry. (Be careful not to make the
% description too long, because \appname{makeindex} has a limited
% buffer. \cmdname{@glo@desc} is defined to be a short command 
% to discourage lengthy descriptions
% for this reason. If you do have a very long description, or if
% you require paragraph breaks, define a separate command that 
% contains the description, and use it as the value to the 
% \gloskey{description} key.)
%    \begin{macrocode}
\define@key{glossentry}{description}{%
\def\@glo@desc{#1}%
}
%    \end{macrocode}
%
% The \gloskey{sort} key needs to be sanitized here 
% (the sort key is provided for \appname{makeindex}'s benefit, 
% not for use in the document.) The \gloskey{sort} key is optional
% when defining a new glossary entry. If omitted, the value 
% is given by \meta{name} \meta{description}.
%    \begin{macrocode}
\define@key{glossentry}{sort}{%
\def\@glo@sort{#1}%
\@onelevel@sanitize\@glo@sort}
%    \end{macrocode}
%
% The \gloskey{text} key determines how the term should appear when
% used in the document (i.e.\ outside of the glossary). If omitted, 
% the value of the \gloskey{name} key is used instead.
%    \begin{macrocode}
\define@key{glossentry}{text}{%
\def\@glo@text{#1}%
}
%    \end{macrocode}
%
% The \gloskey{plural} key determines how the plural form of the term
% should be displayed in the document. If omitted, the plural is
% constructed by appending an ``s'' to the value of the \gloskey{text}
% key.
%    \begin{macrocode}
\define@key{glossentry}{plural}{%
\def\@glo@plural{#1}%
}
%    \end{macrocode}
%
% The \gloskey{first} key determines how the entry should be displayed
% in the document when it is first used. If omitted, it is taken
% to be the same as the value of the \gloskey{text} key.
%    \begin{macrocode}
\define@key{glossentry}{first}{%
\def\@glo@first{#1}%
}
%    \end{macrocode}
%
% The \gloskey{firstplural} key is used to set the plural form for
% first use, in the event that the plural is required the first 
% time the term is used. If omitted, it is constructed by 
% appending an ``s'' to the value of the \gloskey{first} key.
%    \begin{macrocode}
\define@key{glossentry}{firstplural}{%
\def\@glo@firstplural{#1}%
}
%    \end{macrocode}
%
% The \gloskey{symbol} key is ignored by most of the predefined
% glossary styles, and defaults to \cmdname{relax} if omitted. 
% It is provided for glossary styles that require an associated 
% symbol, as well as a name and description. To make this value 
% appear in the glossary, you need to redefine 
% \icmdname{glossaryentryfield} so that it uses its fourth parameter.
% If you want this value to appear in the text when the term is used 
% by commands like \icmdname{gls}, you will need to change
% \icmdname{glsdisplay} and \icmdname{glsdisplayfirst} (either 
% explicitly for all glossaries or via \icmdname{defglsdisplay}
% and \icmdname{defglsdisplayfirst} for individual glossaries.)
%    \begin{macrocode}
\define@key{glossentry}{symbol}{%
\def\@glo@symbol{#1}%
}
%    \end{macrocode}
%
% The \gloskey{type} key specifies to which glossary this
% entry belongs. If omitted, the default glossary is used.
%    \begin{macrocode}
\define@key{glossentry}{type}{%
\def\@glo@type{#1}}
%    \end{macrocode}
%
% The \gloskey{counter} key specifies the name of the counter 
% associated with this glossary entry:
%    \begin{macrocode}
\define@key{glossentry}{counter}{%
\@ifundefined{c@#1}{\PackageError{glossaries}{There is no counter
called `#1'}{The counter key should have the name of a valid 
counter as its value}}{%
\def\@glo@counter{#1}}}
%    \end{macrocode}
%
%\DescribeMacro{\newglossaryentry}
% Define \cmdname{newglossaryentry}%
% \marg{label} \marg{key-val list}. 
% There are two required fields in \meta{key-val list}: 
% \gloskey{name} and 
% \gloskey{description}. (See above.)
%    \begin{macrocode}
\DeclareRobustCommand{\newglossaryentry}[2]{%
%    \end{macrocode}
% Check to see if this glossary entry has already been defined:
%    \begin{macrocode}
\glsdoifnoexists{#1}{%
%    \end{macrocode}
% Set up defaults. If the \gloskey{name} or \gloskey{description}
% keys are omitted, an error will be generated.
%    \begin{macrocode}
\def\@glo@name{\PackageError{glossaries}{name key required in 
\string\newglossaryentry}{You haven't specified the entry name}}%
\def\@glo@desc{\PackageError{glossaries}{desc key required in 
\string\newglossaryentry}{You haven't specified the entry description}}%
\def\@glo@type{\glsdefaulttype}%
\def\@glo@symbol{\relax}%
\def\@glo@text{\@glo@name}%
\def\@glo@plural{\@glo@text s}%
\def\@glo@first{\@glo@text}%
\def\@glo@firstplural{\@glo@plural}%
\def\@glo@sort{\@glo@name\space\@glo@desc}%
\def\@glo@counter{\@gls@getcounter{\@glo@type}}%
%    \end{macrocode}
% Extract key-val information from third parameter:
%    \begin{macrocode}
\setkeys{glossentry}{#2}%
%    \end{macrocode}
% Check to see if this glossary type has been defined, if it has,
% add this label to the relevant list, otherwise generate an error.
%    \begin{macrocode}
\@ifundefined{glolist@\@glo@type}{\PackageError{glossaries}{%
Glossary type '\@glo@type' has not been defined}{%
You need to define a new glossary type, before making entries
in it}}{%
\protected@edef\@glolist@{\csname glolist@\@glo@type\endcsname}%
\expandafter\xdef\csname glolist@\@glo@type\endcsname{\@glolist@{#1},}%
}%
%    \end{macrocode}
% Define commands associated with this entry:
%    \begin{macrocode}
\expandafter\protected@xdef\csname glo@#1@text\endcsname{\@glo@text}%
\expandafter\protected@xdef\csname glo@#1@plural\endcsname{\@glo@plural}%
\expandafter\protected@xdef\csname glo@#1@first\endcsname{\@glo@first}%
\expandafter\protected@xdef\csname glo@#1@firstpl\endcsname{\@glo@firstplural}%
\expandafter\protected@xdef\csname glo@#1@type\endcsname{\@glo@type}%
\expandafter\protected@xdef\csname glo@#1@counter\endcsname{\@glo@counter}%
\@gls@sanitizename
\expandafter\protected@xdef\csname glo@#1@name\endcsname{\@glo@name}%
\@gls@sanitizedesc
\expandafter\protected@xdef\csname glo@#1@desc\endcsname{\@glo@desc}%
\expandafter\protected@xdef\csname glo@#1@sort\endcsname{\@glo@sort}%
\@gls@sanitizesymbol
\expandafter\protected@xdef\csname glo@#1@symbol\endcsname{\@glo@symbol}%
%    \end{macrocode}
% Define an associated boolean variable to determine whether this
% entry has been used yet (needs to be defined globally):
%    \begin{macrocode}
\expandafter\gdef\csname glo@#1@flagfalse\endcsname{%
\expandafter\global\expandafter
\let\csname ifglo@#1@flag\endcsname\iffalse}
\expandafter\gdef\csname glo@#1@flagtrue\endcsname{%
\expandafter\global\expandafter
\let\csname ifglo@#1@flag\endcsname\iftrue}
\csname glo@#1@flagfalse\endcsname
}}
%    \end{macrocode}
% Only defined new glossary entries in the preamble:
%    \begin{macrocode}
\@onlypreamble{\newglossaryentry}
%    \end{macrocode}
%
%\subsection{Resetting and unsetting entry flags}
% Each glossary entry is assigned a conditional of the form
%\cmdname{ifglo@}\meta{label}\texttt{@flag} which determines
% whether or not the entry has been used (see also 
% \icmdname{ifglsused} defined below.) These flags can
% be set and unset using the following macros:
%
%\DescribeMacro{\glsreset}
% The command \cmdname{glsreset}\marg{label} can be used
% to set the entry flag to indicate that it hasn't been used yet. The
% required argument is the entry label.
%    \begin{macrocode}
\newcommand*{\glsreset}[1]{%
\glsdoifexists{#1}{%
\expandafter\global\csname glo@#1@flagfalse\endcsname}}
%    \end{macrocode}
%\DescribeMacro{\glslocalreset}
% As above, but with only a local effect:
%    \begin{macrocode}
\newcommand*{\glslocalreset}[1]{%
\glsdoifexists{#1}{%
\expandafter\let\csname ifglo@#1@flag\endcsname\iffalse}}
%    \end{macrocode}
%\DescribeMacro{\glsunset}
% The command \cmdname{glsunset}\marg{label} can be used to
% set the entry flag to indicate that it has been used. The required
% argument is the entry label.
%    \begin{macrocode}
\newcommand*{\glsunset}[1]{%
\glsdoifexists{#1}{%
\expandafter\global\csname glo@#1@flagtrue\endcsname}}
%    \end{macrocode}
%\DescribeMacro{\glslocalunset}
% As above, but with only a local effect:
%    \begin{macrocode}
\newcommand*{\glslocalunset}[1]{%
\glsdoifexists{#1}{%
\expandafter\let\csname ifglo@#1@flag\endcsname\iftrue}}
%    \end{macrocode}
%\DescribeMacro{\glsresetall}
% Reset all entries for the named glossaries (supplied in a 
% comma-separated list). 
% Syntax: \cmdname{glsresetall}\oarg{glossary-list}
%    \begin{macrocode}
\newcommand*{\glsresetall}[1][\@glo@types]{%
\forallglsentries[#1]{\@glsentry}{%
\glsreset{\@glsentry}}}
%    \end{macrocode}
%\DescribeMacro{\glslocalresetall}
% As above, but with only a local effect:
%    \begin{macrocode}
\newcommand*{\glslocalresetall}[1][\@glo@types]{%
\forallglsentries[#1]{\@glsentry}{%
\glslocalreset{\@glsentry}}}
%    \end{macrocode}
%\DescribeMacro{\glsunsetall}
% Unset all entries for the named glossaries (supplied in a 
% comma-separated list). 
% Syntax: \cmdname{glsunsetall}\oarg{glossary-list}
%    \begin{macrocode}
\newcommand*{\glsunsetall}[1][\@glo@types]{%
\forallglsentries[#1]{\@glsentry}{%
\glsunset{\@glsentry}}}
%    \end{macrocode}
%\DescribeMacro{\glslocalunsetall}
% As above, but with only a local effect:
%    \begin{macrocode}
\newcommand*{\glslocalunsetall}[1][\@glo@types]{%
\forallglsentries[#1]{\@glsentry}{%
\glslocalunset{\@glsentry}}}
%    \end{macrocode}
%
% \subsection{Loading files containing glossary entries}
%\label{sec:load}
% Glossary entries can be defined in an external file.
% These external files can contain \icmdname{newglossaryentry}
% and \icmdname{newacronym} commands.\footnote{and any other valid 
%\LaTeX\ code that can be used in the preamble.}\\[10pt]
%\DescribeMacro{\loadglsentries}
% \cmdname{loadglsentries}\oarg{type}\marg{filename}\\[10pt]
% This command will input the file using \cmdname{input}.
% The optional argument specifies to which glossary the
% entries should be assigned if they haven't used the \gloskey{type}
% key. If the optional argument is not specified, the default
% glossary is used. Only those entries used in the document (via
% \icmdname{glslink}, \icmdname{gls}, \icmdname{glspl} and uppercase
% variants or \icmdname{glsadd} and \icmdname{glsaddall} 
% will appear in the glossary.) The mandatory argument is 
% the filename (with or without .tex extension.)
%    \begin{macrocode}
\newcommand*{\loadglsentries}[2][\@gls@default]{%
\let\@gls@default\glsdefaulttype
\def\glsdefaulttype{#1}\input{#2}%
\let\glsdefaulttype\@gls@default}
%    \end{macrocode}
% \cmdname{loadglsentries} can only be used in the preamble:
%    \begin{macrocode}
\@onlypreamble{\loadglsentries}
%    \end{macrocode}
%
%\subsection{Using glossary entries in the text}
%
% Any term that has been defined using \icmdname{newglossaryentry}
% (or \icmdname{newacronym}) can be displayed in the text 
% (i.e.\ outside of the glossary) using
% one of the commands defined in this section. Unless you use
% \icmdname{glslink}, the way the term appears in the text is
% determined by \icmdname{glsdisplayfirst} (if it is the first
% time the term has been used) or \icmdname{glsdisplay} (for
% subsequent use.)
%
%\DescribeMacro{\glsdisplayfirst}
% The first time an entry is used, the way in which it is
% displayed is governed by \cmdname{glsdisplayfirst}. This
% takes four parameters: \verb|#1| will be the value
% of the entry's \gloskey{first} or \gloskey{firstplural} key, 
% \verb|#2| will be the value of the entry's \gloskey{description}
% key, \verb|#3| will be the value of the entry's \gloskey{symbol}
% key and \verb|#4| is additional text supplied by the final optional
% argument to commands like \icmdname{gls} and \icmdname{glspl}.
% The default is to display the first parameter followed by the
% additional text.
%    \begin{macrocode}
\newcommand*{\glsdisplayfirst}[4]{#1#4}
%    \end{macrocode}
%
%\DescribeMacro{\glsdisplay}
% After the first use, the entry is displayed according to
% the format of \cmdname{glsdisplay}. Again, it takes four
% parameters: \verb|#1| will be the value of the
% entry's \gloskey{text} or \gloskey{plural} key, 
% \verb|#2| will be the value of the entry's \gloskey{description} 
% key, \verb|#3| will be the value of the entry's \gloskey{symbol}
% key and \verb|#4| is additional text supplied by the final optional
% argument to commands like \icmdname{gls} and \icmdname{glspl}.
%    \begin{macrocode}
\newcommand*{\glsdisplay}[4]{#1#4}
%    \end{macrocode}
%
% When a new glossary is created it uses \cmdname{glsdisplayfirst}
% and \cmdname{glsdisplay} as the default way of displaying its
% entry in the text. This can be changed for the entries belonging 
% to an individual glossary using 
% \icmdname{defglsdisplay} and \icmdname{defglsdisplayfirst}.
%\\[10pt]
%\DescribeMacro{\defglsdisplay}
% \cmdname{defglsdisplay}\oarg{type}\marg{definition}\\[10pt]%
% The glossary type is given by \meta{type} (the default glossary
% if omitted) and
% \meta{definition} should have at most \verb|#1|, \verb|#2|,
% \verb|#3| and \verb|#4|. These represent the same arguments
% as those described for \icmdname{glsdisplay}.
%    \begin{macrocode}
\newcommand*{\defglsdisplay}[2][\glsdefaulttype]{%
\expandafter\def\csname gls@#1@display\endcsname##1##2##3##4{#2}}
%    \end{macrocode}
%\vskip5pt
%\DescribeMacro{\defglsdisplayfirst}
% \cmdname{defglsdisplayfirst}\oarg{type}\marg{definition}\\[10pt]%
% The glossary type is given by \meta{type} (the default glossary
% if omitted) and
% \meta{definition} should have at most \verb|#1|, \verb|#2|,
% \verb|#3| and \verb|#4|. These represent the same arguments
% as those described for \icmdname{glsdisplayfirst}.
%    \begin{macrocode}
\newcommand*{\defglsdisplayfirst}[2][\glsdefaulttype]{%
\expandafter\def\csname gls@#1@displayfirst\endcsname##1##2##3##4{#2}}
%    \end{macrocode}
%
%\subsubsection{Links to glossary entries}
% The links to glossary entries all have a first optional 
% argument that can be used to change the format and counter
% of the associated entry number. Except for \cmdname{glslink},
% the commands like \cmdname{gls} have a final optional
% argument that can be used to insert additional text in the
% link (this will usually be appended, but can be redefined using
% \icmdname{defglsdisplay} and \icmdname{defglsdisplayfirst}). 
% It goes against the \LaTeX\ norm to have an optional
% argument after the mandatory arguments, but it makes more
% sense to write, say, \verb|\gls{label}['s]| rather than, say,
% \verb|\gls[append='s]{label}|. Since these control sequences
% are defined to include the final square bracket, spaces
% will be ignored after them. This is likely to lead to
% confusion as most users would not expect, say, "\gls{"\meta{label}"}"
% to ignore following spaces, so \icmdname{xspace} is used.
%
% The following keys can be used in the first optional 
% argument. The \gloskey[glslink]{counter} key checks that the 
% value is the name of a valid counter.
%    \begin{macrocode}
\define@key{glslink}{counter}{%
\@ifundefined{c@#1}{\PackageError{glossaries}{There is no counter
called `#1'}{The counter key should have the name of a valid 
counter as its value}}{%
\def\@gls@counter{#1}}}
%    \end{macrocode}
% The value of the \gloskey[glslink]{format} key should be the name of a 
% command (without the initial backslash) that has a single mandatory 
% argument which can be used to format the associated entry
% number.
%    \begin{macrocode}
\define@key{glslink}{format}{%
\def\@glsnumberformat{#1}}
%    \end{macrocode}
% The \gloskey[glslink]{hyper} key is a boolean key, it can either have the 
% value true or false, and indicates whether or not to make a 
% hyperlink to the relevant glossary entry. If hyper is false, an 
% entry will still be made in the glossary, but the given text 
% won't be a hyperlink.
%    \begin{macrocode}
\define@boolkey{glslink}{hyper}[true]{}
%    \end{macrocode}
%
%\DescribeMacro{\glslink}
%Syntax:\\[10pt]
% \cmdname{glslink}\oarg{options}\marg{label}\marg{text}
%\\[10pt]
% Display \meta{text} in the document, and add the entry information
% for \meta{label} into the relevant glossary. The optional
% argument should be a key value list using the \texttt{glslink}
% keys defined above.
%
% There is also a starred version:\DescribeMacro{\glslink*}\\[10pt]
% \cmdname{glslink*}\oarg{options}\marg{label}\marg{text}\\[10pt]
% which is equivalent to 
% \cmdname{glslink}"[hyper=false,"\meta{options}"]"\marg{label}\marg{text}
%
% First determine whether or not we are using the starred version:
%    \begin{macrocode}
\newcommand{\glslink}{%
\@ifstar\@sgls@link\@gls@link}
%    \end{macrocode}
% Define the starred version:
%    \begin{macrocode}
\newcommand*{\@sgls@link}[1][]{\@gls@link[hyper=false,#1]}
%    \end{macrocode}
% Define the un-starred version:
%    \begin{macrocode}
\newcommand*{\@gls@link}[3][]{%
\glsdoifexists{#2}{%
\def\@glsnumberformat{glsnumberformat}%
\edef\@gls@counter{\csname glo@#2@counter\endcsname}%
\KV@glslink@hypertrue
\setkeys{glslink}{#1}%
\edef\theglsentrycounter{\csname the\@gls@counter\endcsname}%
\ifKV@glslink@hyper
\@glslink{glo:#2}{#3}%
\else
#3\relax
\fi
\protected@edef\@glo@sort{\csname glo@#2@sort\endcsname}%
\@gls@checkmkidxchars\@glo@sort
\protected@edef\@@glo@name{\csname glo@#2@name\endcsname}%
\@gls@checkmkidxchars\@@glo@name
\protected@edef\@glo@name{\string\glsnamefont{\@@glo@name}}%
\protected@edef\@glo@desc{\csname glo@#2@desc\endcsname}%
\@gls@checkmkidxchars\@glo@desc
\protected@edef\@glo@symbol{\csname glo@#2@symbol\endcsname}%
\@gls@checkmkidxchars\@glo@symbol
\@set@glo@numformat\@glo@numfmt\@gls@counter\@glsnumberformat
\glossary[\csname glo@#2@type\endcsname]{%
\@glo@sort\@gls@actualchar
\string\glossaryentryfield{#2}{\@glo@name}{\@glo@desc
}{\@glo@symbol}\@gls@encapchar\@glo@numfmt}%
}}
%    \end{macrocode}
%\changes{1.01}{2007 May 17}{Added range facility in format key}%
% Set the formatting information in the format required by 
% \appname{makeindex}:
%    \begin{macrocode}
\def\@set@glo@numformat#1#2#3{%
\expandafter\@glo@check@mkidxrangechar#3\@nil
\protected@edef#1{\@glo@prefix setentrycounter{#2}%
\expandafter\string\csname\@glo@suffix\endcsname}%
\@gls@checkmkidxchars#1}
%    \end{macrocode}
% Check to see if the given string starts with a ( or ). If it
% does set \cmdname{@glo@prefix} to the starting character,
% and \cmdname{@glo@suffix} to the rest (or "glsnumberformat"
% if there is nothing else),
% otherwise set \cmdname{@glo@prefix} to nothing and
% \cmdname{@glo@suffix} to all of it.
%    \begin{macrocode}
\def\@glo@check@mkidxrangechar#1#2\@nil{%
\if#1(\relax
  \def\@glo@prefix{(}%
  \if\relax#2\relax
    \def\@glo@suffix{glsnumberformat}%
  \else
    \def\@glo@suffix{#2}%
  \fi
\else
  \if#1)\relax
    \def\@glo@prefix{)}%
    \if\relax#2\relax
      \def\@glo@suffix{glsnumberformat}%
    \else
      \def\@glo@suffix{#2}%
  \fi
  \else
    \def\@glo@prefix{}\def\@glo@suffix{#1#2}%
  \fi
\fi}
%    \end{macrocode}
% Catch \appname{makeindex} special characters\mkidxspch:
%    \begin{macrocode}
\newcommand{\@gls@checkmkidxchars}[1]{%
\def\@gls@checkedmkidx{}%
\expandafter\@gls@checkquote#1\@nil""\null%
\expandafter\@gls@updatechecked\@gls@checkedmkidx{#1}%
\def\@gls@checkedmkidx{}%
\expandafter\@gls@checkescquote#1\@nil\"\"\null%
\expandafter\@gls@updatechecked\@gls@checkedmkidx{#1}%
\def\@gls@checkedmkidx{}%
\expandafter\@gls@checkescactual#1\@nil\?\?\null%
\expandafter\@gls@updatechecked\@gls@checkedmkidx{#1}%
\def\@gls@checkedmkidx{}%
\expandafter\@gls@checkactual#1\@nil??\null%
\expandafter\@gls@updatechecked\@gls@checkedmkidx{#1}%
\def\@gls@checkedmkidx{}%
\expandafter\@gls@checkbar#1\@nil||\null%
\expandafter\@gls@updatechecked\@gls@checkedmkidx{#1}%
\def\@gls@checkedmkidx{}%
\expandafter\@gls@checkescbar#1\@nil\|\|\null%
\expandafter\@gls@updatechecked\@gls@checkedmkidx{#1}%
\def\@gls@checkedmkidx{}%
\expandafter\@gls@checklevel#1\@nil!!\null%
\expandafter\@gls@updatechecked\@gls@checkedmkidx{#1}%
}
%    \end{macrocode}
% Update the control sequence and strip trailing \cmdname{@nil}:
%    \begin{macrocode}
\def\@gls@updatechecked#1\@nil#2{\def#2{#1}}
%    \end{macrocode}
% Replace \verb|"| with \verb|""| since \verb|"| is a makeindex
% special character\mkidxspch.
%    \begin{macrocode}
\toksdef\@gls@tmpb=2
\def\@gls@checkquote#1"#2"#3\null{%
\@gls@tmpb=\expandafter{\@gls@checkedmkidx}%
\toks@={#1}%
\ifx\null#2\null%
 \ifx\null#3\null
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@}%
  \def\@@gls@checkquote{\relax}%
 \else
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
    \@gls@quotechar\@gls@quotechar\@gls@quotechar\@gls@quotechar}%
  \def\@@gls@checkquote{\@gls@checkquote#3\null}%
 \fi
\else
 \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
   \@gls@quotechar\@gls@quotechar}%
 \ifx\null#3\null
   \def\@@gls@checkquote{\@gls@checkquote#2""\null}%
 \else
   \def\@@gls@checkquote{\@gls@checkquote#2"#3\null}%
 \fi
\fi
\@@gls@checkquote}
%    \end{macrocode}
% Do the same for \verb|\"|:
%    \begin{macrocode}
\def\@gls@checkescquote#1\"#2\"#3\null{%
\@gls@tmpb=\expandafter{\@gls@checkedmkidx}%
\toks@={#1}%
\ifx\null#2\null%
 \ifx\null#3\null
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@}%
  \def\@@gls@checkescquote{\relax}%
 \else
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
    \@gls@quotechar\string\"\@gls@quotechar
    \@gls@quotechar\string\"\@gls@quotechar}%
  \def\@@gls@checkescquote{\@gls@checkescquote#3\null}%
 \fi
\else
 \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
   \@gls@quotechar\string\"\@gls@quotechar}%
 \ifx\null#3\null
   \def\@@gls@checkescquote{\@gls@checkescquote#2\"\"\null}%
 \else
   \def\@@gls@checkescquote{\@gls@checkescquote#2\"#3\null}%
 \fi
\fi
\@@gls@checkescquote}
%    \end{macrocode}
% Similarly for \verb|\?| (which is replaces @ as 
% \appname{makeindex}'s special character):
%    \begin{macrocode}
\def\@gls@checkescactual#1\?#2\?#3\null{%
\@gls@tmpb=\expandafter{\@gls@checkedmkidx}%
\toks@={#1}%
\ifx\null#2\null%
 \ifx\null#3\null
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@}%
  \def\@@gls@checkescactual{\relax}%
 \else
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
    \@gls@quotechar\string\"\@gls@actualchar
    \@gls@quotechar\string\"\@gls@actualchar}%
  \def\@@gls@checkescactual{\@gls@checkescactual#3\null}%
 \fi
\else
 \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
   \@gls@quotechar\string\"\@gls@actualchar}%
 \ifx\null#3\null
  \def\@@gls@checkescactual{\@gls@checkescactual#2\?\?\null}%
 \else
  \def\@@gls@checkescactual{\@gls@checkescactual#2\?#3\null}%
 \fi
\fi
\@@gls@checkescactual}
%    \end{macrocode}
% Similarly for \verb"\|":
%    \begin{macrocode}
\def\@gls@checkescbar#1\|#2\|#3\null{%
\@gls@tmpb=\expandafter{\@gls@checkedmkidx}%
\toks@={#1}%
\ifx\null#2\null%
 \ifx\null#3\null
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@}%
  \def\@@gls@checkescbar{\relax}%
 \else
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
    \@gls@quotechar\string\"\@gls@encapchar
    \@gls@quotechar\string\"\@gls@encapchar}%
  \def\@@gls@checkescbar{\@gls@checkescbar#3\null}%
 \fi
\else
 \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
   \@gls@quotechar\string\"\@gls@encapchar}%
 \ifx\null#3\null
  \def\@@gls@checkescbar{\@gls@checkescbar#2\|\|\null}%
 \else
  \def\@@gls@checkescbar{\@gls@checkescbar#2\|#3\null}%
 \fi
\fi
\@@gls@checkescbar}
%    \end{macrocode}
% Similarly for \verb"\!":
%    \begin{macrocode}
\def\@gls@checkesclevel#1\!#2\!#3\null{%
\@gls@tmpb=\expandafter{\@gls@checkedmkidx}%
\toks@={#1}%
\ifx\null#2\null%
 \ifx\null#3\null
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@}%
  \def\@@gls@checkesclevel{\relax}%
 \else
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
    \@gls@quotechar\string\"\@gls@levelchar
    \@gls@quotechar\string\"\@gls@levelchar}%
  \def\@@gls@checkesclevel{\@gls@checkesclevel#3\null}%
 \fi
\else
 \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
   \@gls@quotechar\string\"\@gls@levelchar}%
 \ifx\null#3\null
  \def\@@gls@checkesclevel{\@gls@checkesclevel#2\!\!\null}%
 \else
  \def\@@gls@checkesclevel{\@gls@checkesclevel#2\!#3\null}%
 \fi
\fi
\@@gls@checkesclevel}
%    \end{macrocode}
% and for \verb"|":
%    \begin{macrocode}
\def\@gls@checkbar#1|#2|#3\null{%
\@gls@tmpb=\expandafter{\@gls@checkedmkidx}%
\toks@={#1}%
\ifx\null#2\null%
 \ifx\null#3\null
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@}%
  \def\@@gls@checkbar{\relax}%
 \else
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
    \@gls@quotechar\@gls@encapchar\@gls@quotechar\@gls@encapchar}%
  \def\@@gls@checkbar{\@gls@checkbar#3\null}%
 \fi
\else
 \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
   \@gls@quotechar\@gls@encapchar}%
 \ifx\null#3\null
   \def\@@gls@checkbar{\@gls@checkbar#2||\null}%
 \else
   \def\@@gls@checkbar{\@gls@checkbar#2|#3\null}%
 \fi
\fi
\@@gls@checkbar}
%    \end{macrocode}
% and for \verb"!":
%    \begin{macrocode}
\def\@gls@checklevel#1!#2!#3\null{%
\@gls@tmpb=\expandafter{\@gls@checkedmkidx}%
\toks@={#1}%
\ifx\null#2\null%
 \ifx\null#3\null
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@}%
  \def\@@gls@checklevel{\relax}%
 \else
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
    \@gls@quotechar\@gls@levelchar\@gls@quotechar\@gls@levelchar}%
  \def\@@gls@checklevel{\@gls@checklevel#3\null}%
 \fi
\else
 \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
   \@gls@quotechar\@gls@levelchar}%
 \ifx\null#3\null
   \def\@@gls@checklevel{\@gls@checklevel#2!!\null}%
 \else
   \def\@@gls@checklevel{\@gls@checklevel#2!#3\null}%
 \fi
\fi
\@@gls@checklevel}
%    \end{macrocode}
% and for \verb"?":
%    \begin{macrocode}
\def\@gls@checkactual#1?#2?#3\null{%
\@gls@tmpb=\expandafter{\@gls@checkedmkidx}%
\toks@={#1}%
\ifx\null#2\null%
 \ifx\null#3\null
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@}%
  \def\@@gls@checkactual{\relax}%
 \else
  \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
    \@gls@quotechar\@gls@actualchar\@gls@quotechar\@gls@actualchar}%
  \def\@@gls@checkactual{\@gls@checkactual#3\null}%
 \fi
\else
 \edef\@gls@checkedmkidx{\the\@gls@tmpb\the\toks@
   \@gls@quotechar\@gls@actualchar}%
 \ifx\null#3\null
   \def\@@gls@checkactual{\@gls@checkactual#2??\null}%
 \else
   \def\@@gls@checkactual{\@gls@checkactual#2?#3\null}%
 \fi
\fi
\@@gls@checkactual}
%    \end{macrocode}
%
%\DescribeMacro{\@glslink}\DescribeMacro{\@glstarget}
% If \icmdname{hyperlink}
% is not defined, \cmdname{@glslink} and \cmdname{@glstarget}
% ignore their first argument, and just do the second argument,
% otherwise they are equivalent to \icmdname{hyperlink} and
%\icmdname{hypertarget}.
%    \begin{macrocode}
\@ifundefined{hyperlink}{%
\gdef\@glslink#1#2{#2}\gdef\@glstarget#1#2{#2}%
}{\gdef\@glslink#1#2{\hyperlink{#1}{#2}}%
\gdef\@glstarget#1#2{\hypertarget{#1}{#2}}}
%    \end{macrocode}
%
%\DescribeMacro{\glsdisablehyper}
% Glossary hyperlinks can be disabled using \cmdname{glsdisablehyper}
% (effect can be localised):
%    \begin{macrocode}
\newcommand{\glsdisablehyper}{%
\renewcommand*\@glslink[2]{##2}%
\renewcommand*\@glstarget[2]{##2}}
%    \end{macrocode}
%\DescribeMacro{\glsenablehyper}
% Glossary hyperlinks can be enabled using \cmdname{glsenablehyper}
% (effect can be localised):
%    \begin{macrocode}
\newcommand{\glsenablehyper}{%
\renewcommand*\@glslink[2]{\hyperlink{##1}{##2}}%
\renewcommand*\@glstarget[2]{\hypertarget{##1}{##2}}}
%    \end{macrocode}
%
%\DescribeMacro{\gls}
%Syntax:\\[10pt]
% \cmdname{gls}\oarg{options}\marg{label}\oarg{insert text}\\[10pt]
% Link to glossary entry using singular form. The link text
% is taken from the value of the \gloskey{text} or \gloskey{first}
% keys used when the entry was defined.
%
%  The first optional argument is a key-value list, the same as
% \icmdname{glslink}\igloskey[glslink]{hyper}\igloskey[glslink]{format}\igloskey[glslink]{counter}, 
% the mandatory argument is the entry label. 
% After the mandatory argument, there is another optional argument 
% to insert extra text in the link text (the location of the inserted
% text is governed by \icmdname{glsdisplay} and 
% \icmdname{glsdisplayfirst}). As with \cmdname{glslink}
% there is a starred version which is the same as the unstarred 
% version but with the \gloskey[glslink]{hyper} key set to \texttt{false}.
% (Additional options can also be specified 
% in the first optional argument.)
%
% First determine if we are using the starred form:
%    \begin{macrocode}
\newcommand*{\gls}{\@ifstar\@sgls\@gls}
%    \end{macrocode}
% Define the starred form:
%    \begin{macrocode}
\newcommand*{\@sgls}[1][]{\@gls[hyper=false,#1]}
%    \end{macrocode}
% Defined the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\@gls}[2][]{%
\@ifnextchar[{\@gls@{#1}{#2}}{\@gls@{#1}{#2}[]}}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@gls@#1#2[#3]{%
\glsdoifexists{#2}{\edef\@glo@type{\glsentrytype{#2}}%
%    \end{macrocode}
% Determine what the link text should be (this is stored in 
% \cmdname{@glo@text})
%    \begin{macrocode}
\ifglsused{#2}{\protected@edef\@glo@text{%
\csname gls@\@glo@type @display\endcsname
{\glsentrytext{#2}}{\glsentrydesc{#2}}{\glsentrysymbol{#2}}{#3}}}{%
\protected@edef\@glo@text{%
\csname gls@\@glo@type @displayfirst\endcsname
{\glsentryfirst{#2}}{\glsentrydesc{#2}}{\glsentrysymbol{#2}}{#3}}}%
%    \end{macrocode}
% Call \cmdname{@gls@link}
%    \begin{macrocode}
\@gls@link[#1]{#2}{\@glo@text}%
%    \end{macrocode}
% Indicate that this entry has now been used, and add a space if
% appropriate
%    \begin{macrocode}
\glsunset{#2}}%
\xspace}
%    \end{macrocode}
%
%\DescribeMacro{\Gls}
% \cmdname{Gls} behaves like \cmdname{gls}, but the first letter
% of the link text is converted to uppercase (note that if the
% first letter has an accent, the accented letter will need to
% be grouped when you define the entry.) It is mainly intended
% for terms that start a sentence:
%    \begin{macrocode}
\newcommand*{\Gls}{\@ifstar\@sGls\@Gls}
%    \end{macrocode}
% Define the starred form:
%    \begin{macrocode}
\newcommand*{\@sGls}[1][]{\@Gls[hyper=false,#1]}
%    \end{macrocode}
% Defined the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\@Gls}[2][]{%
\@ifnextchar[{\@Gls@{#1}{#2}}{\@Gls@{#1}{#2}[]}}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@Gls@#1#2[#3]{%
\glsdoifexists{#2}{\edef\@glo@type{\glsentrytype{#2}}%
%    \end{macrocode}
% Determine what the link text should be (this is stored in 
% \cmdname{@glo@text})
%    \begin{macrocode}
\ifglsused{#2}{\protected@edef\@glo@text{%
\csname gls@\@glo@type @display\endcsname
{\glsentrytext{#2}}{\glsentrydesc{#2}}{\glsentrysymbol{#2}}{#3}}}{%
\protected@edef\@glo@text{%
\csname gls@\@glo@type @displayfirst\endcsname
{\glsentryfirst{#2}}{\glsentrydesc{#2}}{\glsentrysymbol{#2}}{#3}}}%
%    \end{macrocode}
% Call \cmdname{@gls@link}
%    \begin{macrocode}
\@gls@link[#1]{#2}{\expandafter\MakeUppercase\@glo@text}%
%    \end{macrocode}
% Indicate that this entry has now been used, and add a space if
% appropriate
%    \begin{macrocode}
\glsunset{#2}}%
\xspace}
%    \end{macrocode}
%
%\DescribeMacro{\GLS}
% \cmdname{GLS} behaves like \icmdname{gls}, but the link
% text is converted to uppercase:
%    \begin{macrocode}
\newcommand*{\GLS}{\@ifstar\@sGLS\@GLS}
%    \end{macrocode}
% Define the starred form:
%    \begin{macrocode}
\newcommand*{\@sGLS}[1][]{\@GLS[hyper=false,#1]}
%    \end{macrocode}
% Defined the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\@GLS}[2][]{%
\@ifnextchar[{\@GLS@{#1}{#2}}{\@GLS@{#1}{#2}[]}}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@GLS@#1#2[#3]{%
\glsdoifexists{#2}{\edef\@glo@type{\glsentrytype{#2}}%
%    \end{macrocode}
% Determine what the link text should be (this is stored in 
% \cmdname{@glo@text})
%    \begin{macrocode}
\ifglsused{#2}{\protected@edef\@glo@text{%
\csname gls@\@glo@type @display\endcsname
{\glsentrytext{#2}}{\glsentrydesc{#2}}{\glsentrysymbol{#2}}{#3}}}{%
\protected@edef\@glo@text{%
\csname gls@\@glo@type @displayfirst\endcsname
{\glsentryfirst{#2}}{\glsentrydesc{#2}}{\glsentrysymbol{#2}}{#3}}}%
%    \end{macrocode}
% Call \cmdname{@gls@link}
%    \begin{macrocode}
\@gls@link[#1]{#2}{\MakeUppercase{\@glo@text}}%
%    \end{macrocode}
% Indicate that this entry has now been used, and add a space if
% appropriate
%    \begin{macrocode}
\glsunset{#2}}%
\xspace}
%    \end{macrocode}
%
%\DescribeMacro{\glspl}
% \cmdname{glspl} behaves in the same way as \icmdname{gls} except
% it uses the plural form.
%    \begin{macrocode}
\newcommand*{\glspl}{\@ifstar\@sglspl\@glspl}
%    \end{macrocode}
% Define the starred form:
%    \begin{macrocode}
\newcommand*{\@sglspl}[1][]{\@glspl[hyper=false,#1]}
%    \end{macrocode}
% Defined the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\@glspl}[2][]{%
\@ifnextchar[{\@glspl@{#1}{#2}}{\@glspl@{#1}{#2}[]}}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@glspl@#1#2[#3]{%
\glsdoifexists{#2}{\edef\@glo@type{\glsentrytype{#2}}%
%    \end{macrocode}
% Determine what the link text should be (this is stored in 
% \cmdname{@glo@text})
%    \begin{macrocode}
\ifglsused{#2}{\protected@edef\@glo@text{%
\csname gls@\@glo@type @display\endcsname
{\glsentryplural{#2}}{\glsentrydesc{#2}}{\glsentrysymbol{#2}}{#3}}}{%
\protected@edef\@glo@text{%
\csname gls@\@glo@type @displayfirst\endcsname
{\glsentryfirstplural{#2}}{\glsentrydesc{#2}}{\glsentrysymbol{#2}}{#3}}}%
%    \end{macrocode}
% Call \cmdname{@gls@link}
%    \begin{macrocode}
\@gls@link[#1]{#2}{\@glo@text}%
%    \end{macrocode}
% Indicate that this entry has now been used, and add a space if
% appropriate
%    \begin{macrocode}
\glsunset{#2}}%
\xspace}
%    \end{macrocode}
%
%\DescribeMacro{\Glspl}
% \cmdname{Glspl} behaves in the same way as \icmdname{glspl}, except
% that the first letter of the link text is converted to uppercase
% (as with \icmdname{Gls}, if the first letter has an accent, it
% will need to be grouped.)
%    \begin{macrocode}
\newcommand*{\Glspl}{\@ifstar\@sGlspl\@Glspl}
%    \end{macrocode}
% Define the starred form:
%    \begin{macrocode}
\newcommand*{\@sGlspl}[1][]{\@Glspl[hyper=false,#1]}
%    \end{macrocode}
% Defined the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\@Glspl}[2][]{%
\@ifnextchar[{\@Glspl@{#1}{#2}}{\@Glspl@{#1}{#2}[]}}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@Glspl@#1#2[#3]{%
\glsdoifexists{#2}{\edef\@glo@type{\glsentrytype{#2}}%
%    \end{macrocode}
% Determine what the link text should be (this is stored in 
% \cmdname{@glo@text})
%    \begin{macrocode}
\ifglsused{#2}{\protected@edef\@glo@text{%
\csname gls@\@glo@type @display\endcsname
{\glsentryplural{#2}}{\glsentrydesc{#2}}{\glsentrysymbol{#2}}{#3}}}{%
\protected@edef\@glo@text{%
\csname gls@\@glo@type @displayfirst\endcsname
{\glsentryfirstplural{#2}}{\glsentrydesc{#2}}{\glsentrysymbol{#2}}{#3}}}%
%    \end{macrocode}
% Call \cmdname{@gls@link}
%    \begin{macrocode}
\@gls@link[#1]{#2}{\expandafter\MakeUppercase\@glo@text}%
%    \end{macrocode}
% Indicate that this entry has now been used, and add a space if
% appropriate
%    \begin{macrocode}
\glsunset{#2}}%
\xspace}
%    \end{macrocode}
%
%\DescribeMacro{\GLSpl}
% \cmdname{GLSpl} behaves like \icmdname{glspl} except that all the
% link text is converted to uppercase.
%    \begin{macrocode}
\newcommand*{\GLSpl}{\@ifstar\@sGLSpl\@GLSpl}
%    \end{macrocode}
% Define the starred form:
%    \begin{macrocode}
\newcommand*{\@sGLSpl}[1][]{\@GLSpl[hyper=false,#1]}
%    \end{macrocode}
% Defined the un-starred form. Need to determine if there is
% a final optional argument
%    \begin{macrocode}
\newcommand*{\@GLSpl}[2][]{%
\@ifnextchar[{\@GLSpl@{#1}{#2}}{\@GLSpl@{#1}{#2}[]}}
%    \end{macrocode}
% Read in the final optional argument:
%    \begin{macrocode}
\def\@GLSpl@#1#2[#3]{%
\glsdoifexists{#2}{\edef\@glo@type{\glsentrytype{#2}}%
%    \end{macrocode}
% Determine what the link text should be (this is stored in 
% \cmdname{@glo@text})
%    \begin{macrocode}
\ifglsused{#2}{\protected@edef\@glo@text{%
\csname gls@\@glo@type @display\endcsname
{\glsentryplural{#2}}{\glsentrydesc{#2}}{\glsentrysymbol{#2}}{#3}}}{%
\protected@edef\@glo@text{%
\csname gls@\@glo@type @displayfirst\endcsname
{\glsentryfirstplural{#2}}{\glsentrydesc{#2}}{\glsentrysymbol{#2}}{#3}}}%
%    \end{macrocode}
% Call \cmdname{@gls@link}
%    \begin{macrocode}
\@gls@link[#1]{#2}{\MakeUppercase{\@glo@text}}%
%    \end{macrocode}
% Indicate that this entry has now been used, and add a space if
% appropriate
%    \begin{macrocode}
\glsunset{#2}}%
\xspace}
%    \end{macrocode}
%
% \subsubsection{Displaying entry details without adding
% information to the glossary}
% 
% These commands merely display entry information without adding
% entries in the associated file or having hyperlinks.
%
%\DescribeMacro{\glsentryname}\DescribeMacro{\Glsentryname}
% Get the entry name (as specified by the \gloskey{name} key
% when the entry was defined.) The argument
% is the label associated with the entry. Note that unless you
% used \texttt{name=false} in the \pkgopt{sanitize} package option 
% you may get unexpected results if the \gloskey{name} key contained 
% any commands.
%    \begin{macrocode}
\newcommand*{\glsentryname}[1]{\csname glo@#1@name\endcsname}
\newcommand*{\Glsentryname}[1]{\expandafter
\MakeUppercase\csname glo@#1@name\endcsname}
%    \end{macrocode}
%
%\DescribeMacro{\glsentrydesc}\DescribeMacro{\Glsentrydesc}
% Get the entry description (as specified by the 
% \gloskey{description} when the entry was defined.) The argument
% is the label associated with the entry. Note that unless you
% used \texttt{description=false} in the \pkgopt{sanitize} package 
% option you may get unexpected results if the \gloskey{description} 
% key contained any commands.
%    \begin{macrocode}
\newcommand*{\glsentrydesc}[1]{\csname glo@#1@desc\endcsname}
\newcommand*{\Glsentrydesc}[1]{\expandafter
\MakeUppercase\csname glo@#1@desc\endcsname}
%    \end{macrocode}
%
%\DescribeMacro{\glsentrytext}\DescribeMacro{\Glsentrytext}
% Get the entry text, as specified by the \gloskey{text} key when
% the entry was defined. The argument
% is the label associated with the entry:
%    \begin{macrocode}
\newcommand*{\glsentrytext}[1]{\csname glo@#1@text\endcsname}
\newcommand*{\Glsentrytext}[1]{\expandafter
\MakeUppercase\csname glo@#1@text\endcsname}
%    \end{macrocode}
%
%\DescribeMacro{\glsentryplural}\DescribeMacro{\Glsentryplural}
% Get the plural form:
%    \begin{macrocode}
\newcommand*{\glsentryplural}[1]{\csname glo@#1@plural\endcsname}
\newcommand*{\Glsentryplural}[1]{\expandafter
\MakeUppercase\csname glo@#1@plural\endcsname}
%    \end{macrocode}
%
%\DescribeMacro{\glsentrysymbol}\DescribeMacro{\Glsentrysymbol}
% Get the symbol associated with this entry. The argument
% is the label associated with the entry. Note that unless you
% used \texttt{symbol=false} in the \pkgopt{sanitize} package 
% option you may get unexpected results if the \gloskey{symbol} 
% key contained any commands.
%    \begin{macrocode}
\newcommand*{\glsentrysymbol}[1]{\csname glo@#1@symbol\endcsname}
\newcommand*{\Glsentrysymbol}[1]{\expandafter
\MakeUppercase\csname glo@#1@symbol\endcsname}
%    \end{macrocode}
%
%\DescribeMacro{\glsentryfirst}\DescribeMacro{\Glsentryfirst}
% Get the entry text to be used when the entry is first used in
% the document (as specified by the \gloskey{first} key when
% the entry was defined.)
%    \begin{macrocode}
\newcommand*{\glsentryfirst}[1]{\csname glo@#1@first\endcsname}
\newcommand*{\Glsentryfirst}[1]{\expandafter
\MakeUppercase\csname glo@#1@first\endcsname}
%    \end{macrocode}
%
%\DescribeMacro{\glsentryfirstplural}\DescribeMacro{\Glsentryfirstplural}
% Get the plural form (as specified by the \gloskey{firstplural}
% key when the entry was defined.)
%    \begin{macrocode}
\newcommand*{\glsentryfirstplural}[1]{%
\csname glo@#1@firstpl\endcsname}
\newcommand*{\Glsentryfirstplural}[1]{%
\expandafter\MakeUppercase\csname glo@#1@firstpl\endcsname}
%    \end{macrocode}
%
%\DescribeMacro{\glsentrytype}
% Display the glossary type with which this entry is associated
% (as specified by the \gloskey{type} key used when the entry was 
% defined)
%    \begin{macrocode}
\newcommand*{\glsentrytype}[1]{\csname glo@#1@type\endcsname}
%    \end{macrocode}
%
%\DescribeMacro{\glsentrysort}
% Display the sort text used for this entry. Note that the 
% \gloskey{sort} key is sanitize, so unexpected results may 
% occur if the \gloskey{sort} key contained commands.
%    \begin{macrocode}
\newcommand*{\glsentrysort}[1]{\csname glo@#1@sort\endcsname}
%    \end{macrocode}
%
%\subsection{Adding an entry to the glossary without generating
% text}
% The following keys are provided for \cmdname{glsadd} and 
% \cmdname{glsaddall}:
%    \begin{macrocode}
\define@key{glossadd}{counter}{\def\@glo@counter{#1}}
\define@key{glossadd}{format}{\def\@glo@format{#1}}
%    \end{macrocode}
% This key is only used by \cmdname{glsaddall}:
%    \begin{macrocode}
\define@key{glossadd}{types}{\def\@glo@type{#1}}
%    \end{macrocode}
%\vskip5pt
%\DescribeMacro{\glsadd}
%\cmdname{glsadd}\oarg{options}\marg{label}\\[10pt]
% Add a term to the glossary without generating any link text. 
% The optional argument indicates which counter to use, 
% and how to format it (using a key-value list)
% the second argument is the entry label. Note that \meta{options}
% only has two keys: \gloskey[glsadd]{counter} and \gloskey[glsadd]{format} (the \gloskey[glsaddall]{types} key will be ignored).
%    \begin{macrocode}
\newcommand*{\glsadd}[2][]{%
\glsdoifexists{#2}{%
\def\@glo@format{glsnumberformat}%
\edef\@glo@counter{\csname glo@#2@counter\endcsname}%
\setkeys{glossadd}{#1}%
\edef\theglsentrycounter{\csname the\@glo@counter\endcsname}%
\protected@edef\@glo@sort{\csname glo@#2@sort\endcsname}%
\@gls@checkmkidxchars\@glo@sort
\protected@edef\@@glo@name{\csname glo@#2@name\endcsname}%
\@gls@checkmkidxchars\@@glo@name
\protected@edef\@glo@name{\string\glsnamefont{\@@glo@name}}%
\protected@edef\@glo@desc{\csname glo@#2@desc\endcsname}%
\@gls@checkmkidxchars\@glo@desc
\protected@edef\@glo@symbol{\csname glo@#2@symbol\endcsname}%
\@gls@checkmkidxchars\@glo@symbol
\@set@glo@numformat\@glo@numfmt\@glo@counter\@glo@format
\glossary[\csname glo@#2@type\endcsname]{%
\@glo@sort\@gls@actualchar\string\glossaryentryfield
{#2}{\@glo@name}{\@glo@desc}{\@glo@symbol}\@gls@encapchar
\@glo@numfmt}%
}}
%    \end{macrocode}
%\vskip5pt
%\DescribeMacro{\glsaddall}
%\cmdname{glsaddall}\oarg{glossary list}\\[10pt]
% Add all terms defined for the listed glossaries (without displaying
% any text.) If \gloskey[glsaddall]{types} key is omitted, apply to all
% glossary types.
%    \begin{macrocode}
\newcommand*{\glsaddall}[1][]{%
\def\@glo@type{\@glo@types}%
\setkeys{glossadd}{#1}%
\forallglsentries[\@glo@type]{\@glo@entry}{%
\glsadd[#1]{\@glo@entry}}%
}
%    \end{macrocode}
%
%\subsection{Creating associated files}
%\DescribeMacro{\writeist}
% The \cmdname{writeist} command creates the associated 
% customized \filetype{ist} \appname{makeindex} style file.
% While defining this command, some characters have their 
% catcodes temporarily changed to ensure they get written to 
% the \filetype{ist} file correctly. The \appname{makeindex} 
% actual character (usually "@") is redefined to be a "?", to allow 
% internal commands to be written to the glossary file output file.
%
% The special characters\mkidxspch\ are stored in \cmdname{@gls@actualchar},
% \cmdname{@gls@encapchar}, \cmdname{@glsl@levelchar} and
% \cmdname{@gls@quotechar} to make them easier to use later,
% but don't change these values, because the characters are
% encoded in the command definitions that are used to escape
% the special characters (which means that the user no longer
% needs to worry about \appname{makeindex} special characters.)
%
% The symbols and numbers label for group headings are hardwired into
% the \filetype{ist} file as \texttt{glssymbols} and 
% \texttt{glsnumbers}, the group titles can be translated 
% (so that \icmdname{glssymbolsgroupname} replaces \texttt{glssymbols}
% and \icmdname{glsnumbersgroupname} replaces \texttt{glsnumbers})
% using the command \icmdname{glsgetgrouptitle} which is
% defined in \styname{glossary-hypernav}. This is done to prevent
% any problem characters in \icmdname{glssymbolsgroupname}
% and \icmdname{glsnumbersgroupname} from breaking hyperlinks.
%
% Some of these lines are too long to fit on the page, but as I 
% have temporarily disabled the comment character, I can't split
% the lines. If you want to see the code in full, have a look at
% \texttt{glossaries.sty}.
%\changes{1.01}{2007 May 17}{Added spaces after 'delimN and 'delimR in ist file}%
%    \begin{macrocode}
\newwrite\istfile
\bgroup
\catcode`\%12\relax
\catcode`\"12\relax
\catcode`\|12\relax
\catcode`\!12\relax
\catcode`\?12\relax
\gdef\@gls@actualchar{?}
\gdef\@gls@encapchar{|}
\gdef\@gls@levelchar{!}
\gdef\@gls@quotechar{"}
\gdef\writeist{\relax
\protected@write\@auxout{}{\string\@istfilename{\istfilename}}
\openout\istfile=\istfilename
\write\istfile{% makeindex style file created by the glossaries package}
\write\istfile{% for document '\jobname' on \the\year-\the\month-\the\day}
\write\istfile{actual '\@gls@actualchar'}
\write\istfile{encap '\@gls@encapchar'}
\write\istfile{level '\@gls@levelchar'}
\write\istfile{quote '\@gls@quotechar'}
\write\istfile{keyword "\string\\glossaryentry"}
\write\istfile{preamble "\string\\glossarysection[\string\\glossarytoctitle]{\string\\glossarytitle}\string\\glossarypreamble\string\n\string\\begin{theglossary}\string\\glossaryheader\string\n"}
\write\istfile{postamble "\string\n\string\\end{theglossary}\string\n\string\\glossarypostamble\string\n"}
\write\istfile{group_skip "\string\\glsgroupskip\string\n"}
\write\istfile{item_0 "\string\n"}
\write\istfile{delim_0 "\{\string\\glossaryentrynumbers\{\string\\relax "}
\write\istfile{delim_t "\}\}"}
\write\istfile{delim_n "\string\\delimN "}
\write\istfile{delim_r "\string\\delimR "}
\write\istfile{headings_flag 1}
\write\istfile{heading_prefix "\string\\glsgroupheading\{"}
\write\istfile{heading_suffix "\}"}
\write\istfile{symhead_positive "glssymbols"}
\write\istfile{numhead_positive "glsnumbers"}
\write\istfile{page_compositor "\glscompositor"}
\noist}
\egroup
%    \end{macrocode}
%
%\DescribeMacro{\noist}
%The command \cmdname{noist} will suppress the creation of
% the \filetype{ist} file (it simply redefines 
% \cmdname{writeist} to do nothing.) Obviously you need to use this
% command before \cmdname{writeist} to have any effect. Since
% the \filetype{ist} file should only be created once, \cmdname{noist}
% is called at the end of \cmdname{writeist}.
%    \begin{macrocode}
\newcommand{\noist}{\let\writeist\relax}
%    \end{macrocode}
%
%\DescribeMacro{\@makeglossary}
% \cmdname{@makeglossary} is an internal command that takes an 
% argument indicating the glossary type. This command will 
% create the glossary file required by \appname{makeindex} for the
% given glossary type, using the extension supplied by the
% \meta{out-ext} parameter used in \icmdname{newglossary} 
% (and it will also activate the \icmdname{glossary} command, 
% and create the customized \filetype{ist} \appname{makeindex} 
% style file.) 
%
% Note that you can't use \cmdname{@makeglossary} for only some of the
% defined glossaries. You either need to have a \cmdname{makeglossary}
% for all glossaries or none (otherwise you will end up with a
% situation where \TeX\ is trying to write to a non-existant
% file.) The relevant glossary must be
% defined prior to using \cmdname{@makeglossary}.
%    \begin{macrocode}
\newcommand*{\@makeglossary}[1]{%
\ifglossaryexists{#1}{%
\edef\glo@out{\csname @glotype@#1@out\endcsname}%
\expandafter\newwrite\csname glo@#1@file\endcsname
\edef\@glo@file{\csname glo@#1@file\endcsname}%
\immediate\openout\@glo@file=\jobname.\glo@out
\@gls@renewglossary
\PackageInfo{glossaries}{Writing glossary file \jobname.\glo@out}
\writeist
}{\PackageError{glossaries}{%
Glossary type `#1' not defined}{New glossaries must be defined before
using \string\makeglossary}}}
%    \end{macrocode}
%
%\DescribeMacro{\makeglossaries}
% \cmdname{makeglossaries} will use \cmdname{@makeglossary}
% for each glossary type that has been defined.  New glossaries
% need to be defined before using \cmdname{makeglossary}, so
% have \cmdname{makeglossaries} redefine \cmdname{newglossary}
% to prevent it being used afterwards.
%    \begin{macrocode}
\newcommand*{\makeglossaries}{%
\@for\@glo@type:=\@glo@types\do{%
\ifthenelse{\equal{\@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\empty
\let\makeglossary\empty}
%    \end{macrocode}
%
%\DescribeMacro{\makeglossary}
% The \cmdname{makeglossary} command is redefined to be
% identical to \cmdname{makeglossaries}. (This is done to 
% reinforce the message that you must either use 
% \cmdname{@makeglossary} for all the glossaries or for none 
% of them.)
%    \begin{macrocode}
\let\makeglossary\makeglossaries
%    \end{macrocode}
%
%\subsection{Writing information to associated files}
%\DescribeMacro{\glossary}
% The \cmdname{glossary} command is redefined so that it takes an 
% optional argument \meta{type} to specify the glossary type (use 
% \cmdname{glsdefaulttype} glossary by default). 
% This shouldn't be used at user level
% as \cmdname{glslink} sets the correct format. The associated 
% number should be stored in \cmdname{theglsentrycounter}
% before using \cmdname{glossary}.
%    \begin{macrocode}
\renewcommand*{\glossary}[1][\glsdefaulttype]{%
\@glossary[#1]}
%    \end{macrocode}
%
%\DescribeMacro{\@glossary}
% Define internal \cmdname{@glossary} to ignore its argument.
% This gets redefined in \cmdname{@makeglossary}.
%    \begin{macrocode}
\def\@glossary[#1]{\@bsphack\begingroup\@sanitize\@index}
%    \end{macrocode}
%\DescribeMacro{@gls@renewglossary}
% This is a convenience command to set \cmdname{@glossary}.
% It is used by \cmdname{@makeglossary} and then redefined to
% do nothing, as it only needs to be done once.
%    \begin{macrocode}
\newcommand{\@gls@renewglossary}{%
\gdef\@glossary[##1]{\@bsphack\begingroup\@wrglossary{##1}}%
\let\@gls@renewglossary\@empty
}
%    \end{macrocode}
%\DescribeMacro{\@wrglossary}
% The \cmdname{@wrglossary} command is redefined to have
% two arguments. The first argument is the glossary type, 
% the second argument is the glossary entry 
% (the format of which is set in \cmdname{glslink}.)
%    \begin{macrocode}
\renewcommand*{\@wrglossary}[2]{%
\expandafter\protected@write\csname glo@#1@file\endcsname{}{%
\string\glossaryentry{#2}{\theglsentrycounter}}\endgroup\@esphack}
%    \end{macrocode}
%
% \subsection{Displaying the glossary}\label{sec:printglos}
%\DescribeMacro{\printglossary}
% An individual glossary is displayed in the text using
% \cmdname{printglossary}\oarg{key-val list}. If the 
% \gloskey[printglossary]{type} key is omitted, the default glossary is displayed.
% The optional argument can be used to specify an alternative
% glossary, and can also be used to set the style, title and
% entry in the table of contents. Available keys are defined below.
%    \begin{macrocode}
\newcommand*{\printglossary}[1][type=\glsdefaulttype]{%
\def\@glo@type{\glsdefaulttype}%
\def\glossarytitle{\csname @glotype@\@glo@type @title\endcsname}%
\def\glossarytoctitle{\glossarytitle}%
\def\@glossarystyle{}%
\setkeys{printgloss}{#1}%
\bgroup
\@glossarystyle
\makeatletter
\@input@{\jobname.\csname @glotype@\@glo@type @in\endcsname}%
\egroup
}
%    \end{macrocode}
%
%\DescribeMacro{\printglossaries}
% This command will do \cmdname{printglossary}
% for each glossary type that has been defined. It is better
% to use \cmdname{printglossaries} rather than individual
% \cmdname{printglossary} commands to ensure that you don't forget
% any new glossaries you may have created. It also makes it easier to
% chop and change the value of the \pkgopt{acronym} package option.
% However, if you want to list the glossaries in a different order,
% or if you want to set the title or table of contents entry, or
% if you want to use different glossary styles for each glossary, you
% will need to use \cmdname{printglossary} explicitly for each
% glossary type.
%    \begin{macrocode}
\newcommand*{\printglossaries}{%
\forallglossaries{\@@glo@type}{\printglossary[type=\@@glo@type]}}
%    \end{macrocode}
% The keys that can be used in the optional argument to
% \icmdname{printglossary} are as follows:
% The \gloskey[printglossary]{type} key sets the glossary type.
%    \begin{macrocode}
\define@key{printgloss}{type}{\def\@glo@type{#1}}
%    \end{macrocode}
% The \gloskey[printglossary]{title} key sets the title used in the glossary section
% header. This overrides the title used in \icmdname{newglossary}.
%    \begin{macrocode}
\define@key{printgloss}{title}{\def\glossarytitle{#1}}
%    \end{macrocode}
% The \gloskey[printglossary]{toctitle} sets the text used for the relevant entry 
% in the table of contents.
%    \begin{macrocode}
\define@key{printgloss}{toctitle}{\def\glossarytoctitle{#1}}
%    \end{macrocode}
% The \gloskey[printglossary]{style} key sets the glossary style (but only for
% the given glossary.)
%    \begin{macrocode}
\define@key{printgloss}{style}{%
\@ifundefined{@glsstyle@#1}{\PackageError{glossaries}{Glossary 
style `#1' undefined}{}}{%
\def\@glossarystyle{\csname @glsstyle@#1\endcsname}}}
%    \end{macrocode}
%
%\DescribeEnv{theglossary}
% If the \envname{theglossary} environment has 
% already been defined, a warning will be issued. 
% This environment should be redefined by glossary styles.
%    \begin{macrocode}
\@ifundefined{theglossary}{%
\newenvironment{theglossary}{}{}}{%
\PackageWarning{glossaries}{overriding `theglossary' environment}%
\renewenvironment{theglossary}{}{}}
%    \end{macrocode}
%
%\DescribeMacro{\glossaryheader}
% The glossary header is given by \cmdname{glossaryheader}. 
% This forms part of the glossary style, and
% must indicate what should appear immediately after the start of the
% \envname{theglossary} environment. (For example, if the glossary
% uses a tabular-like environment, it may be used to set the
% header row.) Note that if you don't want a header row, the glossary
% style must redefine \cmdname{glossaryheader} to do nothing.
%    \begin{macrocode}
\newcommand*{\glossaryheader}{}
%    \end{macrocode}
%\vskip5pt
%\DescribeMacro{\glossaryentryfield}
% \cmdname{glossaryentryfield}\marg{label}\marg{name}\marg{description}\marg{symbol}\marg{page-list}\\[10pt]
% This command governs how each entry row should be formatted 
% in the glossary. Glossary styles need to redefine this command.
% Most of the predefined styles ignore \meta{symbol}.
%    \begin{macrocode}
\newcommand*{\glossaryentryfield}[5]{%
\@glstarget{glo:#1}{#2} #4 #3. #5\par}
%    \end{macrocode}
%
%\DescribeMacro{\glsgroupskip}
% Within each glossary, the entries form 28 distinct groups
% which are determined by the first character of the \gloskey{sort} 
% key. There will be a maximum of 28 groups: symbols, numbers,
% and the 26 alphabetical groups A, \ldots, Z\@. 
% The command \cmdname{glsgroupskip} 
% specifies what to do between glossary groups. Glossary styles
% must redefine this command. (Note that \cmdname{glsgroupskip}
% only occurs between groups, not at the start or end of the
% glossary.)
%    \begin{macrocode}
\newcommand*{\glsgroupskip}{}
%    \end{macrocode}
%
%\DescribeMacro{\glsgroupheading}
% Each of the 28 glossary groups described above is preceded by a 
% group heading.
% This is formatted by the command \cmdname{glsgroupheading}
% which takes one argument which is the \emph{label} assigned to that
% group (not the title). The corresponding labels are: \texttt{glssymbols},
% \texttt{glsnumbers}, \texttt{A}, \ldots, \texttt{Z}. 
% Glossary styles must redefined this command. (In between groups,
% \cmdname{glsgroupheading} comes immediately after \cmdname{glsgroupskip}.)
%    \begin{macrocode}
\newcommand*{\glsgroupheading}[1]{}
%    \end{macrocode}
% It is therefore possible to ``trick'' \appname{makeindex} into
% treating entries as though they belong to the same group, 
% even if the terms don't start with the same letter, by
% modifying the \gloskey{sort} key. For example, all entries 
% belonging to one
% group could be defined so that the \gloskey{sort} key starts with an
% "a", while entries belonging to another group could be defined
% so that the \gloskey{sort} key starts with a "b", and so on. If
% you want each group to have a heading, you would then need to
% modify the translation control sequences \cmdname{glsgetgrouptitle}
% and \cmdname{glsgetgrouplabel} so that the label is translated
% into the required title (and vice-versa.)
%\\[10pt]
%\DescribeMacro{\glsgetgrouptitle}
%\cmdname{glsgetgrouptitle}\marg{label}\\[10pt]
% This command produces the title for the glossary group
% whose label is given by \meta{label}. By default, the group
% labelled \texttt{glssymbols} produces 
% \icmdname{glssymbolsgroupname}, the group labelled 
% \texttt{glsnumbers} produces \icmdname{glsnumbersgroupname}
% and all the other groups simply produce their label.
% As mentioned above, the group labels are: \texttt{glssymbols}, \texttt{glsnumbers},
% \texttt{A}, \ldots, \texttt{Z}\@. If you want to redefine
% the group titles, you will need to redefine this command.
%    \begin{macrocode}
\newcommand*{\glsgetgrouptitle}[1]{%
\@ifundefined{#1groupname}{#1}{\csname #1groupname\endcsname}}
%    \end{macrocode}
%\vskip5pt
%\DescribeMacro{\glsgetgrouplabel}
%\cmdname{glsgetgrouplabel}\marg{title}\\[10pt]
%This command does the reverse to the previous command. The
% argument is the group title, and it produces the group label.
% Note that if you redefine \cmdname{glsgetgrouptitle}, you
% will also need to redefine \cmdname{glsgetgrouplabel}.
%    \begin{macrocode}
\newcommand*{\glsgetgrouplabel}[1]{%
\ifthenelse{\equals{#1}{\glssymbolsgroupname}}{glssymbols}{%
\ifthenelse{\equals{#1}{\glsnumbersgroupname}}{glsnumbers}{#1}}}
%    \end{macrocode}
%
%\DescribeMacro{\setentrycounter}
% The command \cmdname{setentrycounter} sets the entry's 
% associated counter (required by 
% \cmdname{glshypernumber} etc.) \icmdname{glslink} and
% \icmdname{glsadd} encode the
% \icmdname{glossary} argument so that the relevant counter is
% set prior to the formatting command.
%    \begin{macrocode}
\newcommand*{\setentrycounter}[1]{\def\glsentrycounter{#1}}
%    \end{macrocode}
%
%\DescribeMacro{\glossarystyle}
% The current glossary style can be set using
% \cmdname{glossarystyle}\marg{style}.
%    \begin{macrocode}
\newcommand*{\glossarystyle}[1]{%
\@ifundefined{@glsstyle@#1}{\PackageError{glossaries}{Glossary 
style `#1' undefined}{}}{%
\csname @glsstyle@#1\endcsname}}
%    \end{macrocode}
%
%\DescribeMacro{\newglossarystyle}
% New glossary styles can be defined using:\\[10pt]
% \cmdname{newglossarystyle}\marg{name}\marg{definition}\\[10pt]
% The \meta{definition} argument should redefine 
% \envname{theglossary}, \icmdname{glossaryheader}, 
% \icmdname{glsgroupheading}, \icmdname{glossaryentryfield} and
% \icmdname{glsgroupskip} (see \autoref{sec:styles} for the
% definitions of predefined styles.) Glossary styles should not 
% redefine \icmdname{glossarypreamble} and 
% \icmdname{glossarypostamble}, as
% the user should be able to switch between styles without affecting
% the pre- and postambles.
%    \begin{macrocode}
\newcommand*{\newglossarystyle}[2]{%
\@ifundefined{@glsstyle@#1}{%
\expandafter\def\csname @glsstyle@#1\endcsname{#2}}{%
\PackageError{glossaries}{Glossary style `#1' is already defined}{}}}
%    \end{macrocode}
%
%\DescribeMacro{\glsnamefont}
% Glossary entries are encoded so that the second argument
% to \icmdname{glossaryentryfield} is always specified as
% \cmdname{glsnamefont}\marg{name}. This allows the
% user to change the font used to display the name term
% without having to redefine \icmdname{glossaryentryfield}.
% The default uses the surrounding font, so in the list type
% styles (which place the name in the optional argument to
% \icmdname{item}) the name will appear in bold.
%    \begin{macrocode}
\newcommand*{\glsnamefont}[1]{#1}
%    \end{macrocode}
%
%\DescribeMacro{\glshypernumber}
% Each glossary entry has an associated number list (usually page
% numbers) that indicate where in the document the entry has been
% used. The format for these number lists can be changed using the
% \gloskey[glslink]{format}\igloskey[glsadd]{format} key in commands like \icmdname{glslink}.
% The default format is given by \cmdname{glshypernumber}. This takes
% a single argument which may be a single number, a number range
% or a number list. The number ranges are delimited with 
% \icmdname{delimR}, the number lists are delimited with 
% \icmdname{delimN}.
%
% If the document doesn't have hyperlinks, the numbers can be
% displayed just as they are, but if the document supports 
% hyperlinks, the numbers should link to the relevant location.
% This means extracting the individual numbers from the list or
% ranges. The \styname{hyperref} package does this with the
% \icmdname{hyperpage} command, but this is encoded for comma and
% dash delimiters and only for the page counter, but this code needs
% to be more general. So I have adapted the code used in the
% \styname{hyperref} package.
%    \begin{macrocode}
\@ifundefined{hyperlink}{%
\def\glshypernumber#1{#1}}{%
\def\glshypernumber#1{%
\@delimR#1\delimR\delimR\\}}
%    \end{macrocode}
%\DescribeMacro{@delimR}
% \cmdname{@delimR} displays a range of numbers for the counter 
% whose name is given by 
% \cmdname{@gls@counter} (which must be set prior to using
% \cmdname{glshypernumber}.)
%    \begin{macrocode}
\def\@delimR#1\delimR #2\delimR #3\\{%
\ifx\\#2\\%
  \@delimN{#1}%
\else
  \@gls@numberlink{#1}\delimR\@gls@numberlink{#2}%
\fi}
%    \end{macrocode}
%\DescribeMacro{\@delimN}
% \cmdname{@delimN} displays a list of individual numbers, 
% instead of a range:
%    \begin{macrocode}
\def\@delimN#1{\@@delimN#1\delimN \delimN\\}
\def\@@delimN#1\delimN #2\delimN#3\\{%
\ifx\\#3\\%
  \@gls@numberlink{#1}%
\else
  \@gls@numberlink{#1}\delimN\@gls@numberlink{#2}%
\fi
}
%    \end{macrocode}
% The following code is modified from hyperref's 
% \cmdname{HyInd@pagelink} where
% the name of the counter being used is given by 
% \cmdname{@gls@counter}.
%    \begin{macrocode}
\def\@gls@numberlink#1{%
\begingroup
 \toks@={}%
 \@gls@removespaces#1 \@nil
\endgroup}
%    \end{macrocode}
%    \begin{macrocode}
\def\@gls@removespaces#1 #2\@nil{%
 \toks@=\expandafter{\the\toks@#1}%
 \ifx\\#2\\%
   \edef\x{\the\toks@}%
   \ifx\x\empty
   \else
     \hyperlink{\glsentrycounter.\the\toks@}{\the\toks@}%
   \fi
 \else
   \@gls@ReturnAfterFi{%
     \@gls@removespaces#2\@nil
   }%
 \fi
}
\long\def\@gls@ReturnAfterFi#1\fi{\fi#1}
%    \end{macrocode}
%
% The following commands will switch to the
% appropriate font, and create a hyperlink, if hyperlinks are
% supported. If hyperlinks are not supported, they will just
% display their argument in the appropriate font.
%\DescribeMacro{\hyperrm}
%    \begin{macrocode}
\newcommand*{\hyperrm}[1]{\textrm{\glshypernumber{#1}}}
%    \end{macrocode}
%\DescribeMacro{\hypersf}
%    \begin{macrocode}
\newcommand*{\hypersf}[1]{\textsf{\glshypernumber{#1}}}
%    \end{macrocode}
%\DescribeMacro{\hypertt}
%    \begin{macrocode}
\newcommand*{\hypertt}[1]{\texttt{\glshypernumber{#1}}}
%    \end{macrocode}
%\DescribeMacro{\hyperbf}
%    \begin{macrocode}
\newcommand*{\hyperbf}[1]{\textbf{\glshypernumber{#1}}}
%    \end{macrocode}
%\DescribeMacro{\hypermd}
%    \begin{macrocode}
\newcommand*{\hypermd}[1]{\textmd{\glshypernumber{#1}}}
%    \end{macrocode}
%\DescribeMacro{\hyperit}
%    \begin{macrocode}
\newcommand*{\hyperit}[1]{\textit{\glshypernumber{#1}}}
%    \end{macrocode}
%\DescribeMacro{\hypersl}
%    \begin{macrocode}
\newcommand*{\hypersl}[1]{\textsl{\glshypernumber{#1}}}
%    \end{macrocode}
%\DescribeMacro{\hyperup}
%    \begin{macrocode}
\newcommand*{\hyperup}[1]{\textup{\glshypernumber{#1}}}
%    \end{macrocode}
%\DescribeMacro{\hypersc}
%    \begin{macrocode}
\newcommand*{\hypersc}[1]{\textsc{\glshypernumber{#1}}}
%    \end{macrocode}
%\DescribeMacro{\hyperemph}
%    \begin{macrocode}
\newcommand*{\hyperemph}[1]{\emph{\glshypernumber{#1}}}
%    \end{macrocode}
%
%\subsection{Acronyms}\label{sec:acronym}
%If the \pkgopt{acronym} package option is used, a 
% new glossary called "acronym" is created
%    \begin{macrocode}
\ifglsacronym
\newglossary[alg]{acronym}{acr}{acn}{\acronymname}
%    \end{macrocode}
%and \icmdname{acronymtype} is set to the name of this new glossary.
%    \begin{macrocode}
\renewcommand{\acronymtype}{acronym}
%    \end{macrocode}
% In the event that the user redefines \icmdname{glsdisplay}
% and \icmdname{glsdisplayfirst}, the relevant commands for
% the new acronym glossary are set to match the format
% given by \icmdname{newacronym}. If you redefine 
% \icmdname{newacronym} you may need to set these to something
% else.
%    \begin{macrocode}
\defglsdisplay[acronym]{#1#4}\defglsdisplayfirst[acronym]{#1#4}
\fi
%    \end{macrocode}
%\vskip5pt
%\DescribeMacro{\newacronym}
% \cmdname{newacronym}\oarg{key-val list}\marg{label}\marg{abbrev}\marg{long}\\[10pt]
% This is a quick way of defining acronyms, all it does
% is call \icmdname{newglossaryentry} with the appropriate
% values. It sets the
% glossary type to \icmdname{acronymtype} which will be
% "acronym" if the package option \pkgopt{acronym} has
% been used, otherwise it will be the default glossary.
% Since \cmdname{newacronym} merely calls \icmdname{newglossaryentry},
% the acronym is treated like any other glossary entry.
%
% If you prefer a different format, you
% can redefine \cmdname{newacronym} as required. The optional 
% argument can be used to override any of the settings.
%    \begin{macrocode}
\newcommand{\newacronym}[4][]{%
\newglossaryentry{#2}{type=\acronymtype,
name={#3},description={#4},text={#3},
first={#4 (#3)},plural={#3s},firstplural={#4s (#3s)},#1}}
%    \end{macrocode}
% New acronyms can only be defined in the preamble:
%    \begin{macrocode}
\@onlypreamble{\newacronym}
%    \end{macrocode}
%
% \subsection{Predefined Styles}\label{sec:styles}
% The \styname{glossaries} bundle comes with some predefined glossary styles which
% are defined in the following packages:
%    \begin{macrocode}
\RequirePackage{glossary-hypernav}
\RequirePackage{glossary-list}
\RequirePackage{glossary-long}
\RequirePackage{glossary-super}
%    \end{macrocode}
% The default glossary style is set according to the \pkgopt{style} package
% option, but can be overridden by \icmdname{glossarystyle}.
%    \begin{macrocode}
\glossarystyle{\@glossary@default@style}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossaries.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossary-hypernav.sty>
%    \end{macrocode}
%\fi
% \subsubsection{Glossary hyper-navigation definitions (glossary-hypernav package)}
% Package Definition:
%    \begin{macrocode}
\ProvidesPackage{glossary-hypernav}[2007/05/16 v1.0 (NLCT)]
%    \end{macrocode}
%
% The commands defined in this package are provided to 
% help navigate around the groups within a glossary 
% (see \autoref{sec:printglos}.)
% \icmdname{printglossary} (and \icmdname{printglossaries})
% set \cmdname{@glo@type} to the label of the current
% glossary. This is used to create a unique hypertarget in
% the event of multiple glossaries.
%\\[10pt]
%\DescribeMacro{\glsnavhyperlink}
% \cmdname{glsnavhyperlink}\oarg{type}\marg{label}\marg{text}\\[10pt]
% This command makes \meta{text} a hyperlink to the glossary group
% whose label is given by \meta{label} for the glossary given
% by \meta{type}.
%    \begin{macrocode}
\@ifundefined{hyperlink}{%
\newcommand*{\glsnavhyperlink}[3][]{#3}}{%
\newcommand*{\glsnavhyperlink}[3][\@glo@type]{%
\edef\gls@grplabel{#2}\edef\@gls@grptitle{#3}%
\hyperlink{glsn:#1@#2}{#3}}}
%    \end{macrocode}
%\vskip5pt
%\DescribeMacro{\glsnavhypertarget}
% \cmdname{glsnavhypertarget}\oarg{type}\marg{label}\marg{text}\\[10pt]
% This command makes \meta{text} a hypertarget for the glossary group
% whose label is given by \meta{label} in the glossary given
% by \meta{type}.
%    \begin{macrocode}
\@ifundefined{hypertarget}{%
\newcommand*{\glsnavhypertarget}[3][]{#3}}{%
\newcommand*{\glsnavhypertarget}[3][\@glo@type]{%
\hypertarget{glsn:#1@#2}{#3}}}
%    \end{macrocode}
%
%\DescribeMacro{\glsnavigation}
% The \cmdname{glsnavigation} command displays a simple glossary 
% group navigation. 
% The symbol and number elements are defined separately, 
% so that they can be suppressed if need be. Note that this 
% command will produce a link to all 28 groups, but some groups
% may not be defined if there are groups that do not contain any
% terms, in which case you will get an undefined hyperlink warning.
% Now for the whole navigation bit:
%    \begin{macrocode}
\newcommand*{\glsnavigation}{%
\glssymbolnav
\glsnavhyperlink{A}{\glsgetgrouptitle{A}} \textbar\
\glsnavhyperlink{B}{\glsgetgrouptitle{B}} \textbar\ 
\glsnavhyperlink{C}{\glsgetgrouptitle{C}} \textbar\
\glsnavhyperlink{D}{\glsgetgrouptitle{D}} \textbar\
\glsnavhyperlink{E}{\glsgetgrouptitle{E}} \textbar\
\glsnavhyperlink{F}{\glsgetgrouptitle{F}} \textbar\
\glsnavhyperlink{G}{\glsgetgrouptitle{G}} \textbar\
\glsnavhyperlink{H}{\glsgetgrouptitle{H}} \textbar\
\glsnavhyperlink{I}{\glsgetgrouptitle{I}} \textbar\
\glsnavhyperlink{J}{\glsgetgrouptitle{J}} \textbar\
\glsnavhyperlink{K}{\glsgetgrouptitle{K}} \textbar\
\glsnavhyperlink{L}{\glsgetgrouptitle{L}} \textbar\
\glsnavhyperlink{M}{\glsgetgrouptitle{M}} \textbar\
\glsnavhyperlink{N}{\glsgetgrouptitle{N}} \textbar\
\glsnavhyperlink{O}{\glsgetgrouptitle{O}} \textbar\
\glsnavhyperlink{P}{\glsgetgrouptitle{P}} \textbar\
\glsnavhyperlink{Q}{\glsgetgrouptitle{Q}} \textbar\
\glsnavhyperlink{R}{\glsgetgrouptitle{R}} \textbar\
\glsnavhyperlink{S}{\glsgetgrouptitle{S}} \textbar\
\glsnavhyperlink{T}{\glsgetgrouptitle{T}} \textbar\
\glsnavhyperlink{U}{\glsgetgrouptitle{U}} \textbar\
\glsnavhyperlink{V}{\glsgetgrouptitle{V}} \textbar\
\glsnavhyperlink{W}{\glsgetgrouptitle{W}} \textbar\
\glsnavhyperlink{X}{\glsgetgrouptitle{X}} \textbar\
\glsnavhyperlink{Y}{\glsgetgrouptitle{Y}} \textbar\
\glsnavhyperlink{Z}{\glsgetgrouptitle{Z}}}
%    \end{macrocode}
%\DescribeMacro{\glssymbolnav}
% The \cmdname{glssymbolnav} produces a simple navigation set of
% links for just the symbol and number groups. This is used at
% the start of \cmdname{glsnavigation}. If your glossary doesn't
% contain any symbol or navigation groups, you can redefine this
% command to do nothing.
%    \begin{macrocode}
\newcommand*{\glssymbolnav}{%
\glsnavhyperlink{glssymbols}{\glsgetgrouptitle{glssymbols}} \textbar\
\glsnavhyperlink{glsnumbers}{\glsgetgrouptitle{glsnumbers}} \textbar\ 
}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossary-hypernav.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossary-list.sty>
%    \end{macrocode}
%\fi
% \subsubsection{List Style (glossary-list package)}
% The \styname{glossary-list} package defines glossary styles
% that use the \envname{description} environment. Note that since
% the entry name is placed in the optional argument to the
% \icmdname{item} command, it will appear in a bold font by
% default.
%    \begin{macrocode}
\ProvidesPackage{glossary-list}[2007/05/16 v1.0 (NLCT)]
%    \end{macrocode}
% The \glostyle{list} glossary style 
% uses the \envname{description} environment. The group separator
% \icmdname{glsgroupskip} is redefined as \cmdname{indexspace}
% which produces a gap between groups. The glossary heading
% and the group headings do nothing. This is used as the default
% style for the \styname{glossaries} package.
%    \begin{macrocode}
\newglossarystyle{list}{%
\renewenvironment{theglossary}{\begin{description}}{\end{description}}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glossaryentryfield}[5]{%
\item[\@glstarget{glo:##1}{##2}] ##3. ##5}%
\renewcommand*{\glsgroupskip}{\indexspace}}
%    \end{macrocode}
% The \glostyle{listgroup} style is like the \glostyle{list}
% style, but the glossary groups have headings.
%    \begin{macrocode}
\newglossarystyle{listgroup}{%
\glossarystyle{list}%
\renewcommand*{\glsgroupheading}[1]{\item[##1]}}
%    \end{macrocode}
% The \glostyle{listhypergroup} style is like the \glostyle{listgroup}
% style, but has a set of links to the groups at the
% start of the glossary.
%    \begin{macrocode}
\newglossarystyle{listhypergroup}{%
\glossarystyle{list}%
\renewcommand*{\glossaryheader}{%
\item[]\glsnavigation}%
\renewcommand*{\glsgroupheading}[1]{%
\item[\glsnavhypertarget{##1}{\glsgetgrouptitle{##1}}]}}
%    \end{macrocode}
% The \glostyle{altlist} glossary style is like the \glostyle{list}
% style, but places the description on a new line.
%    \begin{macrocode}
\newglossarystyle{altlist}{%
\glossarystyle{list}%
\renewcommand*{\glossaryentryfield}[5]{%
\item[\@glstarget{glo:##1}{##2}]\mbox{}\newline ##3. ##5}%
}
%    \end{macrocode}
% The \glostyle{altlistgroup} glossary style is like the
% \glostyle{altlist} style, but the glossary groups have headings.
%    \begin{macrocode}
\newglossarystyle{altlistgroup}{%
\glossarystyle{altlist}%
\renewcommand*{\glsgroupheading}[1]{\item[##1]}}
%    \end{macrocode}
% The \glostyle{altlisthypergroup} glossary style is like the
% \glostyle{altlisthypergroup} style, but has a 
% set of links to the groups at the start of the glossary.
%    \begin{macrocode}
\newglossarystyle{altlisthypergroup}{%
\glossarystyle{altlist}%
\renewcommand*{\glossaryheader}{%
\item[]\glsnavigation}%
\renewcommand*{\glsgroupheading}[1]{%
\item[\glsnavhypertarget{##1}{\glsgetgrouptitle{##1}}]}}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossary-list.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossary-long.sty>
%    \end{macrocode}
%\fi
% \subsubsection{Glossary Styles using longtable (the glossary-long
% package)}
% The glossary styles defined in the \styname{glossary-long} package
% used the \envname{longtable} environment in the glossary.
%    \begin{macrocode}
\ProvidesPackage{glossary-long}[2007/05/16 v1.0 (NLCT)]
%    \end{macrocode}
% Requires the \styname{longtable} package:
%    \begin{macrocode}
\RequirePackage{longtable}
%    \end{macrocode}
%\DescribeMacro{\glsdescwidth}
% This is a length that governs the width of the description column.
%    \begin{macrocode}
\newlength\glsdescwidth
%    \end{macrocode}
%\DescribeMacro{\glspagelistwidth}
% This is a length that governs the width of the page list column.
%    \begin{macrocode}
\newlength\glspagelistwidth
%    \end{macrocode}
% Default values:
%    \begin{macrocode}
\setlength{\glsdescwidth}{0.6\linewidth}
\setlength{\glspagelistwidth}{0.1\linewidth}
%    \end{macrocode}
% 
% The \glostyle{long} glossary style command which 
% uses the \envname{longtable} environment:
%    \begin{macrocode}
\newglossarystyle{long}{%
\renewenvironment{theglossary}{\begin{longtable}{lp{\glsdescwidth}}}{%
\end{longtable}}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glossaryentryfield}[5]{%
\@glstarget{glo:##1}{##2} & ##3. ##5\\}%
\renewcommand*{\glsgroupskip}{ & \\}}
%    \end{macrocode}
% The \glostyle{longborder} style is like the above, but with horizontal and
% vertical lines:
%    \begin{macrocode}
\newglossarystyle{longborder}{%
\glossarystyle{long}%
\renewenvironment{theglossary}{%
\begin{longtable}{|l|p{\glsdescwidth}|}}{\end{longtable}}%
\renewcommand*{\glossaryheader}{\hline\endhead\hline\endfoot}%
}
%    \end{macrocode}
% The \glostyle{longheader} style is like the
% \glostyle{long} style but with a header:
%    \begin{macrocode}
\newglossarystyle{longheader}{%
\glossarystyle{long}%
\renewcommand*{\glossaryheader}{%
\bfseries \entryname & \bfseries \descriptionname\\
\endhead}}
%    \end{macrocode}
% The \glostyle{longheaderborder} style is
% like the \glostyle{long} style but with a header and border:
%    \begin{macrocode}
\newglossarystyle{longheaderborder}{%
\glossarystyle{longborder}%
\renewcommand*{\glossaryheader}{%
\hline\bfseries \entryname & \bfseries \descriptionname\\\hline
\endhead
\hline\endfoot}}
%    \end{macrocode}
% The \glostyle{long3col} style is like \glostyle{long} but with 3 columns
%    \begin{macrocode}
\newglossarystyle{long3col}{%
\renewenvironment{theglossary}{\begin{longtable}{lp{\glsdescwidth}p{\glspagelistwidth}}}{%
\end{longtable}}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glossaryentryfield}[5]{%
\@glstarget{glo:##1}{##2} & ##3 & ##5\\}%
\renewcommand*{\glsgroupskip}{ & &\\}}
%    \end{macrocode}
% The \glostyle{long3colborder} style is like the
% \glostyle{long3col} style but with a border:
%    \begin{macrocode}
\newglossarystyle{long3colborder}{%
\glossarystyle{long3col}%
\renewenvironment{theglossary}{%
\begin{longtable}{|l|p{\glsdescwidth}|p{\glspagelistwidth}|}}{%
\end{longtable}}%
\renewcommand*{\glossaryheader}{\hline\endhead\hline\endfoot}%
}
%    \end{macrocode}
% The \glostyle{long3colheader} style is like \glostyle{long3col} but with a header row:
%    \begin{macrocode}
\newglossarystyle{long3colheader}{%
\glossarystyle{long3col}%
\renewcommand*{\glossaryheader}{%
\bfseries\entryname&\bfseries\descriptionname&
\bfseries\pagelistname\\\endhead}%
}
%    \end{macrocode}
% The \glostyle{long3colheaderborder} style is like the above but with a border
%    \begin{macrocode}
\newglossarystyle{long3colheaderborder}{%
\glossarystyle{long3colborder}%
\renewcommand*{\glossaryheader}{%
\hline
\bfseries\entryname&\bfseries\descriptionname&
\bfseries\pagelistname\\\hline\endhead
\hline\endfoot}%
}
%    \end{macrocode}
% The \glostyle{long4col} style has four columns where the third column contains the value of the associated \gloskey{symbol} key.
%    \begin{macrocode}
\newglossarystyle{long4col}{%
\renewenvironment{theglossary}{%
\begin{longtable}{llll}}{%
\end{longtable}}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glossaryentryfield}[5]{%
\@glstarget{glo:##1}{##2} & ##3 & ##4 & ##5\\}%
\renewcommand*{\glsgroupskip}{ & & &\\}}
%    \end{macrocode}
% The \glostyle{long4colheader} style is like \glostyle{long4col} but with a header row.
%    \begin{macrocode}
\newglossarystyle{long4colheader}{%
\glossarystyle{long4col}%
\renewcommand*{\glossaryheader}{%
\bfseries\entryname&\bfseries\descriptionname&
\bfseries \symbolname&
\bfseries\pagelistname\\\endhead}%
}
%    \end{macrocode}
% The \glostyle{long4colborder} style is like \glostyle{long4col} but with a border.
%    \begin{macrocode}
\newglossarystyle{long4colborder}{%
\glossarystyle{long4col}%
\renewenvironment{theglossary}{%
\begin{longtable}{|l|l|l|l|}}{%
\end{longtable}}%
\renewcommand*{\glossaryheader}{\hline\endhead\hline\endfoot}%
}
%    \end{macrocode}
% The \glostyle{long4colheaderborder} style is like the above but with a border.
%    \begin{macrocode}
\newglossarystyle{long4colheaderborder}{%
\glossarystyle{long4col}%
\renewenvironment{theglossary}{%
\begin{longtable}{|l|l|l|l|}}{%
\end{longtable}}%
\renewcommand*{\glossaryheader}{%
\hline\bfseries\entryname&\bfseries\descriptionname&
\bfseries \symbolname&
\bfseries\pagelistname\\\hline\endhead\hline\\\endfoot}%
}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossary-long.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*glossary-super.sty>
%    \end{macrocode}
%\fi
% \subsubsection{Glossary Styles using supertabular environment (glossary-super package)}
% The glossary styles defined in the \styname{glossary-super} package
% use the \envname{supertabular} environment.
%    \begin{macrocode}
\ProvidesPackage{glossary-super}[2007/05/16 v1.0 (NLCT)]
%    \end{macrocode}
% Requires the \styname{supertabular} package:
%    \begin{macrocode}
\RequirePackage{supertabular}
%    \end{macrocode}
% The \glostyle{super} glossary style uses the
% \envname{supertabular} environment
% (it uses lengths defined in the \styname{glossary-long} package.)
%    \begin{macrocode}
\newglossarystyle{super}{%
\renewenvironment{theglossary}{%
\tablehead{}\tabletail{}%
\begin{supertabular}{lp{\glsdescwidth}}}{%
\end{supertabular}}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glossaryentryfield}[5]{%
\@glstarget{glo:##1}{##2} & ##3. ##5\\}%
\renewcommand*{\glsgroupskip}{ & \\}}
%    \end{macrocode}
% The \glostyle{superborder} style is like the above, but with horizontal and
% vertical lines:
%    \begin{macrocode}
\newglossarystyle{superborder}{%
\glossarystyle{super}%
\renewenvironment{theglossary}{%
\tablehead{\hline}\tabletail{\hline}%
\begin{supertabular}{|l|p{\glsdescwidth}|}}{\end{supertabular}}%
}
%    \end{macrocode}
% The \glostyle{superheader} style is like the
% \glostyle{super} style, but with a header:
%    \begin{macrocode}
\newglossarystyle{superheader}{%
\glossarystyle{super}%
\renewenvironment{theglossary}{%
\tablehead{\bfseries \entryname & \bfseries \descriptionname\\}%
\tabletail{}%
\begin{supertabular}{lp{\glsdescwidth}}}{\end{supertabular}}%
}
%    \end{macrocode}
% The \glostyle{superheaderborder} style is like
% the \glostyle{super} style but with a header and border:
%    \begin{macrocode}
\newglossarystyle{superheaderborder}{%
\glossarystyle{super}%
\renewenvironment{theglossary}{%
\tablehead{\hline\bfseries \entryname & \bfseries \descriptionname\\\hline}%
\tabletail{\hline}
\begin{supertabular}{|l|p{\glsdescwidth}|}}{\end{supertabular}}%
}
%    \end{macrocode}
% The \glostyle{super3col} style is like the \glostyle{super} style, but with 3 columns:
%    \begin{macrocode}
\newglossarystyle{super3col}{%
\renewenvironment{theglossary}{%
\tablehead{}\tabletail{}%
\begin{supertabular}{lp{\glsdescwidth}p{\glspagelistwidth}}}{%
\end{supertabular}}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glossaryentryfield}[5]{%
\@glstarget{glo:##1}{##2} & ##3 & ##5\\}%
\renewcommand*{\glsgroupskip}{ & &\\}}
%    \end{macrocode}
% The \glostyle{super3colborder} style is like the
% \glostyle{super3col} style, but with a border:
%    \begin{macrocode}
\newglossarystyle{super3colborder}{%
\glossarystyle{super3col}%
\renewenvironment{theglossary}{%
\tablehead{\hline}\tabletail{\hline}%
\begin{supertabular}{|l|p{\glsdescwidth}|p{\glspagelistwidth}|}}{%
\end{supertabular}}%
}
%    \end{macrocode}
% The \glostyle{super3colheader} style is like 
% the \glostyle{super3col} style but with a header row:
%    \begin{macrocode}
\newglossarystyle{super3colheader}{%
\glossarystyle{super3col}%
\renewenvironment{theglossary}{%
\tablehead{\bfseries\entryname&\bfseries\descriptionname&
\bfseries\pagelistname\\}\tabletail{}%
\begin{supertabular}{lp{\glsdescwidth}p{\glspagelistwidth}}}{%
\end{supertabular}}%
}
%    \end{macrocode}
% The \glostyle{super3colheaderborder} style is like
% the \glostyle{super3col} style but with a header and border:
%    \begin{macrocode}
\newglossarystyle{super3colheaderborder}{%
\glossarystyle{super3colborder}%
\renewenvironment{theglossary}{%
\tablehead{\hline
\bfseries\entryname&\bfseries\descriptionname&
\bfseries\pagelistname\\\hline}%
\tabletail{\hline}%
\begin{supertabular}{|l|p{\glsdescwidth}|p{\glspagelistwidth}|}}{%
\end{supertabular}}%
}
%    \end{macrocode}
% The \glostyle{super4col} glossary style has four columns,
% where the third column contains the value of the
% corresponding \gloskey{symbol} key used when that entry
% was defined.
%    \begin{macrocode}
\newglossarystyle{super4col}{%
\renewenvironment{theglossary}{%
\tablehead{}\tabletail{}%
\begin{supertabular}{llll}}{%
\end{supertabular}}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glossaryentryfield}[5]{%
\@glstarget{glo:##1}{##2} & ##3 & ##4 & ##5\\}%
\renewcommand*{\glsgroupskip}{ & & &\\}}
%    \end{macrocode}
% The \glostyle{super4colheader} style is like
% the \glostyle{super4col} but with a header row.
%    \begin{macrocode}
\newglossarystyle{super4colheader}{%
\glossarystyle{super4col}%
\renewenvironment{theglossary}{%
\tablehead{\bfseries\entryname&\bfseries\descriptionname&
\bfseries\symbolname &
\bfseries\pagelistname\\}\tabletail{}%
\begin{supertabular}{llll}}{%
\end{supertabular}}%
}
%    \end{macrocode}
% The \glostyle{super4colborder} style is like
% the \glostyle{super4col} but with a border.
%    \begin{macrocode}
\newglossarystyle{super4colborder}{%
\glossarystyle{super4col}%
\renewenvironment{theglossary}{%
\tablehead{\hline}\tabletail{\hline}%
\begin{supertabular}{|l|l|l|l|}}{%
\end{supertabular}}%
}
%    \end{macrocode}
% The \glostyle{super4colheaderborder} style is like
% the \glostyle{super4col} but with a header and border.
%    \begin{macrocode}
\newglossarystyle{super4colheaderborder}{%
\glossarystyle{super4col}%
\renewenvironment{theglossary}{%
\tablehead{\hline\bfseries\entryname&\bfseries\descriptionname&
\bfseries\symbolname &
\bfseries\pagelistname\\}\tabletail{\hline}%
\begin{supertabular}{|l|l|l|l|}}{%
\end{supertabular}}%
}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</glossary-super.sty>
%    \end{macrocode}
%\fi
%\Finale
\endinput
