Gallery: Mixing Styles

image of 3-column glossary with name (in various colours) optionally followed by symbol in first column
This example uses the glossaries-extra package, which extends the glossaries package and provides better abbreviation handling. You’ll need at least version 1.04 of glossaries-extra.sty (you’ll also need a fairly up-to-date version of glossaries.sty as well).

This example is quite complicated as there are a lot of different styles in use. Each entry is assigned a category. The label may be any label you choose, but take care that it doesn’t contain any special characters. Be careful not to confuse the category key with the parent or type key (see Logical Glossary Divisions (type vs group vs parent)). The parent key allows you to have a hierarchical structure in your glossary and the type key allows you to have multiple glossaries.

A single glossary may contain entries with different categories and entries with the same category can be spread across different glossaries. The categories and their attributes allow fine tuning of the way entries are displayed both in the document text and in the glossary.

Semantic commands, such as \animalfont, are defined for each category. This allows the control sequence name (the command name without the leading backslash) to be used as a value for the (custom) font attribute and (supported) glossnamefont attribute. The \glsxtrregularfont command that encapsulates regular entries is modified to pick up the value of the custom font attribute.

The abbreviation and bacteria categories aren’t considered regular entries. (They use one of the abbreviation styles that sets the regular attribute to false.) This means that they won’t pick up the font attribute. Instead the font change must be handled by the abbreviation style or by redefining \glsxtrabbreviationfont. In this case, the abbreviation style is handling it. The glossdescfont attribute can be set to apply a font change to the description in the glossary.

Another attribute that’s used is glossname, which automates case-changing for the name field when it’s displayed in the glossary (where supported by the glossary style).

The “post-link” hook, which occurs after the link-text produced by commands like \gls is altered for the entries with the unit category:

\newcommand*{\glsxtrpostlinkunit}{%
 \ifdefempty\glscustomtext{\glsxtrpostlinkAddSymbolOnFirstUse}{}}

The entries with the category set to constant also have their post-link hook adjusted so that the description and user1 values are inserted after commands like \gls but only on first use:

\newcommand*{\glsxtrpostlinkconstant}{%
 \ifdefempty\glscustomtext
 {\glsxtrifwasfirstuse{ (\glsentryuseri{\glslabel},
  \glsentrydesc{\glslabel})}{}}%
 {}}

This category also adjusts the post-description hook so that the value of the user1 is also automatically inserted after the description in the glossary:

\newcommand*{\glsxtrpostdescconstant}{\space
 (\glsentryuseri{\glscurrententrylabel})}

As with Abbreviations With Translations, this example also has abbreviations with translations where again the translation is stored in the user1 field. The short-long-user abbreviation style can be used to automatically insert the translation in the parenthetical material on first use of commands like \gls. The post-description hook is adjusted to automatically insert the translation after the description in the glossary (for the abbreviations with the category set to foreign):

\newcommand*{\glsxtrpostdescforeign}{\space
 (Translation: \glsentryuseri{\glscurrententrylabel})}

There’s one awkward case where the short and long forms end with a full stop (period). This has the category set to foreignenddot so that it can be dealt with separately. If the abbreviation is referenced at the end of the sentence, this can cause a duplicate full stop, so the end of sentence period has to be discarded:

\glssetcategoryattribute{foreignenddot}{discardperiod}{true}

but not on first use (because the user1 text doesn’t end with a period):

\glssetcategoryattribute{foreignenddot}{retainfirstuseperiod}{true}

This foreignenddot category also needs to have the post-description hook set to match the foreign post-description hook:

\newcommand*{\glsxtrpostdescforeignenddot}{\space
 (Translation: \glsentryuseri{\glscurrententrylabel})}

The page list is prefixed with “Page: ” or “Pages: ” using:

\GlsXtrEnablePreLocationTag{Page: }{Pages: }

The initial comment lines below are arara directives. You can remove them if you don’t use arara.

% arara: pdflatex
% arara: makeglossaries
% arara: pdflatex
% arara: pdflatex
\documentclass[fontsize=10pt,open=any]{scrbook}

\usepackage[T1]{fontenc}
\usepackage{tgtermes}
\usepackage{xcolor}
\usepackage{siunitx}
\usepackage[hidelinks]{hyperref}
\usepackage[nopostdot=false,% don't suppress the post-description dot
 stylemods=longragged,% load glossary-longragged.sty and glossaries-extra-stylemods.sty
 style=longragged3col,% set the glossary style
 nogroupskip% don't have a gap between groups
]{glossaries-extra}

% KOMA class alterations (the default sans-serif clashes
% with the smallcaps font in the headings examples)
\setkomafont{disposition}{\normalcolor\bfseries}

\pagestyle{headings}

% Need a wider column for the location list:
\setlength{\glspagelistwidth}{0.12\textwidth}

% Adjust the description column width if necessary:
%\setlength{\glsdescwidth}{0.5\textwidth}

% Default font for name field in the glossary. This may be
% overridden by the category attributes:
\renewcommand*{\glsnamefont}[1]{\textbf{#1}}

\makeglossaries

% Define some semantic commands:
\newcommand*{\animalfont}[1]{\textcolor{brown}{#1}}
\newcommand*{\vegetablefont}[1]{\textcolor{teal}{#1}}
\newcommand*{\mineralfont}[1]{\textcolor{violet}{#1}}
\newcommand*{\myacronymfont}[1]{\textcolor{orange}{#1}}
\newcommand*{\bacteriafont}[1]{\textcolor{green}{#1}}
\newcommand*{\unitfont}[1]{\textcolor{blue}{#1}}
\newcommand*{\constantfont}[1]{\textcolor{magenta}{#1}}

% Make the first letter of the name field uppercase in the glossary
% for the given categories:

\glssetcategoryattribute{animal}{glossname}{firstuc}
\glssetcategoryattribute{mineral}{glossname}{firstuc}
\glssetcategoryattribute{vegetable}{glossname}{firstuc}

% Make the name field in the glossary use a font changing command
% (overrides \glsnamefont). In this example, I'm using the semantic
% commands I defined above. The backslash is omitted.

\glssetcategoryattribute{animal}{glossnamefont}{animalfont}
\glssetcategoryattribute{mineral}{glossnamefont}{mineralfont}
\glssetcategoryattribute{vegetable}{glossnamefont}{vegetablefont}
\glssetcategoryattribute{acronym}{glossnamefont}{myacronymfont}
\glssetcategoryattribute{bacteria}{glossnamefont}{bacteriafont}
\glssetcategoryattribute{unit}{glossnamefont}{unitfont}
\glssetcategoryattribute{constant}{glossnamefont}{constantfont}

% Modify the font used for the description in the glossary:
%\glssetcategoryattribute{bacteria}{glossdescfont}{textsf}

% Modify the way commands like \gls display regular terms according
% to attribute.

\glssetcategoryattribute{general}{font}{textsf}
\glssetcategoryattribute{mineral}{font}{mineralfont}
\glssetcategoryattribute{animal}{font}{animalfont}
\glssetcategoryattribute{vegetable}{font}{vegetablefont}
\glssetcategoryattribute{acronym}{font}{myacronymfont}
\glssetcategoryattribute{unit}{font}{unitfont}
\glssetcategoryattribute{constant}{font}{constantfont}

% I can't add one of the above for the "abbreviation" or "bacteria"
% category as they aren't considered regular entries. (They use
% one of the abbreviation styles that sets the "regular" attribute
% to "false".)
\glssetcategoryattribute{bacteria}{font}{bacteriafont}% ignored!
% If the abbreviation style for "bacteria" is changed to, say,
% "short-em", the attribute won't be ignored.

% Adjust \glsxtrregularfont so that it picks up the appropriate
% command from the "font" attribute (set above).
\renewcommand*{\glsxtrregularfont}[1]{%
  \glshasattribute{\glslabel}{font}%
  {\csuse{\glsgetattribute{\glslabel}{font}}{#1}}%
  {#1}%
}

\newglossaryentry{duck}{name=duck,
  category={animal},
  description={a waterbird with webbed feet}}

\newglossaryentry{parrot}{name=parrot,
  category={animal},
  description={mainly tropical bird with bright plumage}}

\newglossaryentry{cabbage}{name=cabbage,
  category={vegetable},
  description={vegetable with thick green or purple leaves}}

\newglossaryentry{brocolli}{name=brocolli,
  category={vegetable},
  description={vegetable with heads of small green or purple flower
buds}}

\newglossaryentry{quartz}{name=quartz,
 category=mineral,
 description={hard mineral consisting of silica}}

\newglossaryentry{corundum}{name=corundum,
 category=mineral,
 description={crystalline form of aluminium oxide}}

% The following doesn't have the category explicitly set, so it
% defaults to "general":

\newglossaryentry{loremipsum}{name={lorem ipsum},
 description={dummy text}}

% The following set the category to "unit":

\newglossaryentry{ohm}{name=ohm,symbol={\si{\ohm}},
category=unit,
description=unit of electrical resistance}

\newglossaryentry{angstrom}{name={\aa}ngstr\"om,
category=unit,
symbol={\si{\angstrom}},sort=angstrom,
description={non-SI unit of length}}

% The selected style doesn't display the symbol
% so add it to the post-name hook:
\newcommand*{\glsxtrpostnameunit}{ (\glsentrysymbol{\glscurrententrylabel})}

% Insert the symbol after commands like \gls but only on first use
% (and only for the "unit" category):

\newcommand*{\glsxtrpostlinkunit}{%
 \ifdefempty\glscustomtext{\glsxtrpostlinkAddSymbolOnFirstUse}{}}
% The above "post-link" hook occurs after the link-text produced by 
% \gls so it's place outside the \unitfont argument.

% Mathematic constants need the "sort" key set because the "name"
% field contains commands:
\newglossaryentry{pi}{name={\ensuremath{\pi}},
sort=pi,
category=constant,
user1=pi,
description={ratio of a circle's circumference to its diameter}}

% Insert the description and "user1" text after commands like \gls but only on first use
% (and only for the "constant" category):

\newcommand*{\glsxtrpostlinkconstant}{%
 \ifdefempty\glscustomtext
 {\glsxtrifwasfirstuse{ (\glsentryuseri{\glslabel},
  \glsentrydesc{\glslabel})}{}}%
 {}}

% Insert the "user1" text after the description in the glossary
% but only for the "constant" category:
\newcommand*{\glsxtrpostdescconstant}{\space
 (\glsentryuseri{\glscurrententrylabel})}

% \newacronym sets the category to "acronym" by default. The
% "short-em" style makes it a regular entry.
\setabbreviationstyle[acronym]{short-em}

\newacronym{laser}{laser}{light amplification by
stimulated emission of radiation}

\newacronym{scuba}{scuba}{self-contained underwater breathing
apparatus}

% \newabbreviation sets the category to "abbreviation" by default.
% The "long-short-sc" style sets the regular attribute to false.
\setabbreviationstyle{long-short-sc}

\newabbreviation{html}{html}{hypertext markup language}

\newabbreviation{svg}{svg}{scalable vector graphics}

% The optional argument can be used to set a different category:
\setabbreviationstyle[bacteria]{long-em-short-em}
%\setabbreviationstyle[bacteria]{short-em}

% An alternative approach that uses \bacteriafont in the document
% and in the glossary is to provide a custom style:
%\newabbreviationstyle{bacteria}%
%{%
%  \GlsXtrUseAbbrStyleSetup{long-short}%
%}%
%{%
%  \GlsXtrUseAbbrStyleFmts{long-short}%
%  \renewcommand*{\glsabbrvfont}[1]{\bacteriafont{##1}}%
%  \renewcommand*{\glsfirstlongfont}[1]{\bacteriafont{##1}}%
%  \renewcommand*{\glslongfont}[1]{\bacteriafont{##1}}%
%}
% (the definition of \bacteriafont would need to be adjusted to
% include \emph)
%\setabbreviationstyle[bacteria]{bacteria}

\newabbreviation[category=bacteria]%
 {cbot}% label
 {C.~botulinum}% short
 {Clostridium botulinum}% long

\newabbreviation[category=bacteria]%
 {putida}% label
 {P.~putida}% short
 {Pseudomonas putida}% long

% Abbreviations that have translations. These put the translated
% text in the "user1" field. The "-user" abbreviation styles
% insert this field (if present) into the parenthetical material
% when used with \gls.

\setabbreviationstyle[foreign]{short-long-user}

% The fonts used by this style can be adjusted:
\renewcommand*{\glsabbrvuserfont}[1]{\textsf{\color{red}#1}}% short-form font
\renewcommand*{\glslonguserfont}[1]{\textsf{#1}}% long-form font

\newabbreviation[category=foreign,user1={French \TeX\ user group}]
 {gutenberg}{GUTenburg}{Groupe francophone des utilisateurs de \TeX}

% Insert the translation (user1) text after the description 
% in the glossary but only for the "foreign" category:
\newcommand*{\glsxtrpostdescforeign}{\space
 (Translation: \glsentryuseri{\glscurrententrylabel})}

% Now we have an awkward one that ends with a period:
\setabbreviationstyle[foreignenddot]{short-long-user}

% Need to discard the end of sentence period for the
% entries in this category.

\glssetcategoryattribute{foreignenddot}{discardperiod}{true}

% But not on first use (the user1 text doesn't end with a
% period):
\glssetcategoryattribute{foreignenddot}{retainfirstuseperiod}{true}

\newabbreviation
 [user1={German Speaking \TeX\ User Group},category=foreignenddot]
 {dante}{DANTE e.V.}{Deutschsprachige Anwendervereinigung \TeX\ e.V.}

% Insert the translation (user1) text after the description 
% in the glossary but only for the "foreignenddot" category:
\newcommand*{\glsxtrpostdescforeignenddot}{\space
 (Translation: \glsentryuseri{\glscurrententrylabel})}

% Insert page/pages tag before location list:
\GlsXtrEnablePreLocationTag{Page: }{Pages: }

\begin{document}
\tableofcontents

\chapter{Samples in the Main Document Text}

\section{All Entries}

First use (\verb|\gls|): \forglsentries{\thislabel}{\gls{\thislabel}. }

Next use (\verb|\gls|): \forglsentries{\thislabel}{\gls{\thislabel}. }

Using \verb|\glsfirst|: \forglsentries{\thislabel}{\glsfirst{\thislabel}. }

Using \verb|\glstext|: \forglsentries{\thislabel}{\glstext{\thislabel}. }

\section{Abbreviations only}
Abbreviations that have the \verb|regular| attribute set are
hybrids and can have odd results. In this example, the hybrid
entries are: 
\forglsentries{\thislabel}{%
 \ifglshasshort{\thislabel}%
 {% is an abbreviation
   \glsifregular{\thislabel}%
   {% is regular
     \texttt{\thislabel}.
   }%
   {}%
 }
 {}%
}

Using \verb|\glsxtrfull|: 
\forglsentries{\thislabel}{%
 \ifglshasshort{\thislabel}{\glsxtrfull{\thislabel}.  }{}}

Using \verb|\glsxtrshort|: 
\forglsentries{\thislabel}{%
 \ifglshasshort{\thislabel}{\glsxtrshort{\thislabel}.  }{}}

Using \verb|\glsxtrlong|: 
\forglsentries{\thislabel}{%
 \ifglshaslong{\thislabel}{\glsxtrlong{\thislabel}.  }{}}

\section{Symbols}

Using \verb|\glssymbol|:
\forglsentries{\thislabel}{%
 \ifglshassymbol{\thislabel}{\glssymbol{\thislabel}.  }{}}

\section{User Field}

Using \verb|\glsuseri|:
\forglsentries{\thislabel}{%
 \ifglshasfield{useri}{\thislabel}{\glsuseri{\thislabel}[.]  }{}}

(The full stop in the above is placed inside square brackets
to prevent the \verb|discardperiod| attribute from discarding it
since the \verb|useri| field doesn't end with a dot.)

\chapter{Math Mode}
Inline: $\gls{pi} = \frac{C}{d}$, display:

\[
 \gls{pi} = \frac{C}{d}
\]

\chapter{Samples in Headings}

Don't use commands like \verb|\gls| in section headings, but you can
use commands like \verb|\glsfmttext| or \verb|\glsfmtshort|.

\forglsentries{\thislabel}{%
 \ifglshasshort{\thislabel}%
 {\section{\glsfmtshort{\thislabel}}}%
 {%
% the constant entry "pi" can't be used in the PDF bookmarks,
% so use the user1 text for the bookmark
   \glsifcategory{\thislabel}{constant}
   {%
     \section{\texorpdfstring{\glsfmttext{\thislabel}}{\glsentryuseri{\thislabel}}}%
   }%
   {%
     \section{\glsfmttext{\thislabel}}%
   }%
 }%
 \Glsdesc[noindex]{\thislabel}.
}


\renewcommand{\glossarypreamble}{\emph{This glossary uses the style 
`\csuse{@glossary@default@style}' with modifications made
through categories and their attributes.}\par\medskip}
\printglossaries

\end{document}

If you don’t use arara, you need to run the following commands:

pdflatex sample-name-font
makeglossaries sample-name-font
pdflatex sample-name-font

(See Incorporating makeglossaries or makeglossaries-lite or bib2gls into the document build.)

Download: PDF (197.37K), source code (11.32K).