Your second example uses the long
glossary style (set with style=long
in the optional argument of \printunsrtglossary
). This only shows the term (e.g. \ensuremath{x}
) and the description (e.g. position
) but it doesn't show any other information (except the location list, which isn't present in that example). You not only need to add the units but also provide a style which will show them.
Some of the predefined styles show the symbol
field as well, so if you use this field to store the unit, then you can just use a style that shows the symbol. Table 15.1 in the glossaries
user manual indciates which styles show the symbol.
For example,
\documentclass{report}
\usepackage{siunitx}
\usepackage[colorlinks]{hyperref}
\usepackage[symbols,nogroupskip,sort=none]{glossaries-extra}
\glsxtrnewsymbol[description={position},symbol={\si{m}}]{x}{\ensuremath{x}}
\glsxtrnewsymbol[description={velocity},symbol={\si{\metre\per\second}}]{v}{\ensuremath{v}}
\glsxtrnewsymbol[description={acceleration},symbol={\si{\metre\per\second\squared}}]{a}{\ensuremath{a}}
\glsxtrnewsymbol[description={time},symbol={\si{s}}]{t}{\ensuremath{t}}
\glsxtrnewsymbol[description={force},symbol={\si{N}}]{F}{\ensuremath{F}}
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=long4col]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$. Reference unit: $\glssymbol{v}$.
\end{document}
This produces:

This actually has four columns, but the fourth is empty as there's no location list. The \glssymbol
command works like \gls
but displays the symbol value (unit, in this case).
If you'd rather have a custom unit
key, instead of using the provided symbol
key, you can add one as in your first example. There are two commands that can add a new key: \glsaddkey
and \glsaddstoragekey
. It depends whether you want to use a command like \glssymbol
in the above example. If you do, then you need:
\glsaddkey{unit}{}{\glsentryunit}{\Glsentryunit}{\glsunit}{\Glsunit}{\GLSunit}
(The case-changing commands don't make much sense for units, but the syntax requires them.) If you only need the unit to show in the list of symbols then you can do:
\glsaddstoragekey{unit}{}{\glsentryunit}
You also need to use \glsnoexpandfields
to avoid problems caused by expansion.
You can use the glossary style in your first example, but it ought to use \glsentryunit
instead of \glsunit
:
\newglossarystyle{symbunitlong}{%
\setglossarystyle{long3col}% base this style on the list style
\renewenvironment{theglossary}{% Change the table type --> 3 columns
\begin{longtable}{lp{\glsdescwidth}>{\centering\arraybackslash}p{2cm}}}%
{\end{longtable}}%
\renewcommand*{\glossaryheader}{% Change the table header
\bfseries Symbol & \bfseries Description & \bfseries Unit\\\hline
\endhead}%
\renewcommand*{\glossentry}[2]{% Change the displayed items
\glstarget{##1}{\glossentryname{##1}} %
& \glossentrydesc{##1}% Description
& \glsentryunit{##1} \tabularnewline
}%
}
The width of the description column is given by \glsdescwidth
. You can change this if it's the wrong size. For example:
\setlength{\glsdescwidth}{.5\textwidth}
which makes it half the available text width or you can use an absolute value:
\setlength{\glsdescwidth}{3in}
Alternatively, you can just change all the columns to l
if you have short descriptions:
\renewenvironment{theglossary}%
{\begin{longtable}{lll}}%
{\end{longtable}}%
Complete example:
\documentclass{report}
\usepackage{siunitx}
\usepackage[colorlinks]{hyperref}
\usepackage[symbols,nogroupskip,sort=none]{glossaries-extra}
% new keys must be defined before use
\glsaddstoragekey{unit}{}{\glsentryunit}
\glsnoexpandfields
\glsxtrnewsymbol[description={position},unit={\si{m}}]{x}{\ensuremath{x}}
\glsxtrnewsymbol[description={velocity},unit={\si{\metre\per\second}}]{v}{\ensuremath{v}}
\glsxtrnewsymbol[description={acceleration},unit={\si{\metre\per\second\squared}}]{a}{\ensuremath{a}}
\glsxtrnewsymbol[description={time},unit={\si{s}}]{t}{\ensuremath{t}}
\glsxtrnewsymbol[description={force},unit={\si{N}}]{F}{\ensuremath{F}}
\newglossarystyle{symbunitlong}{%
\setglossarystyle{long3col}% base this style on the list style
\renewenvironment{theglossary}{% Change the table type --> 3 columns
\begin{longtable}{lp{\glsdescwidth}>{\centering\arraybackslash}p{2cm}}}%
{\end{longtable}}%
%
\renewcommand*{\glossaryheader}{% Change the table header
\bfseries Symbol & \bfseries Description & \bfseries Unit\\\hline
\endhead}%
\renewcommand*{\glossentry}[2]{% Change the displayed items
\glstarget{##1}{\glossentryname{##1}} %
& \glossentrydesc{##1}% Description
& \glsentryunit{##1} \tabularnewline
}%
}
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=symbunitlong]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$.
\end{document}
The list of symbols looks like:

This deals with how to display the units in the list of symbols, but the ordering is performed manually by defining each symbol in the desired order. If you want to automatically order first by Latin and then by Greek, you need to use an extra tool. The best one for this task is bib2gls
because it recognises Greek commands such as \alpha
, but for this you need to define all your symbols in a .bib
file.
For example, symbols.bib
:
% Encoding: UTF-8
@symbol{alpha,
unit= {\si{\radian\per\second\squared}},
name = {\ensuremath{\alpha}},
description = {angular acceleration}
}
@symbol{x,
unit = {\si{m}},
name = {\ensuremath{x}},
description = {position}
}
@symbol{v,
unit = {\si{\metre\per\second}},
name = {\ensuremath{v}},
description = {velocity}
}
@symbol{a,
unit = {\si{\metre\per\second\squared}},
name = {\ensuremath{a}},
description = {acceleration}
}
@symbol{t,
unit = {\si{s}},
name = {\ensuremath{t}},
description = {time}
}
@symbol{F,
unit = {\si{N}},
name = {\ensuremath{F}},
description = {force}
}
The document:
\documentclass{report}
\usepackage{siunitx}
\usepackage[colorlinks]{hyperref}
\usepackage[record,% using bib2gls
symbols % create list of symbols
]{glossaries-extra}
% new keys must be defined before \GlsXtrLoadResources
\glsaddstoragekey{unit}{}{\glsentryunit}
\GlsXtrLoadResources[
src={symbols}, % data in symbols.bib
sort-field={name}, % sort by name field
sort={letter-nocase}, % case-insensitive letter sort
type=symbols % put these terms in the symbols list
]
% Define new glossary style
\newglossarystyle{symbunitlong}{%
\setglossarystyle{long3col}% base this style on the list style
\renewenvironment{theglossary}{% Change the table type --> 3 columns
\begin{longtable}{lp{\glsdescwidth}>{\centering\arraybackslash}p{2cm}}}%
{\end{longtable}}%
%
\renewcommand*{\glossaryheader}{% Change the table header
\bfseries Symbol & \bfseries Description & \bfseries Unit\\\hline
\endhead}%
\renewcommand*{\glossentry}[2]{% Change the displayed items
\glstarget{##1}{\glossentryname{##1}} %
& \glossentrydesc{##1}% Description
& \glsentryunit{##1} \tabularnewline
}%
}
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=symbunitlong]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$ and $\gls{alpha}$.
\end{document}
If the document is called test.tex
then the document build is:
pdflatex test
bib2gls test
pdflatex test
(If you need help integrating this with your text editor, see Incorporating makeglossaries or makeglossaries-lite or bib2gls into the document build.)
The sort=letter-nocase
option performs a case-insensitive character sort, so the Latin characters will naturally end up before the Greek characters. The result is:

If you prefer to just use the long4col
style, then the fourth column will now contain the location lists (where the term was used in the document). For example:
\documentclass{report}
\usepackage{siunitx}
\usepackage[colorlinks]{hyperref}
\usepackage[record,% using bib2gls
symbols % create list of symbols
]{glossaries-extra}
\GlsXtrLoadResources[
src={symbols}, % data in symbols.bib
sort-field={name}, % sort by name field
sort={letter-nocase}, % case-insensitive letter sort
type=symbols, % put these terms in the symbols list
field-aliases={unit=symbol}% convert unit key to symbol
]
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=long4col]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$ and $\gls{alpha}$. Unit for $\gls{v}$: $\glssymbol{v}$.
\end{document}
The option field-aliases={unit=symbol}
makes bib2gls
treat the custom unit
field as though it was actually the symbol
field, so there's no need to change the symbols.bib
file. (Without this alias, bib2gls
will ignore the unit
field, since the unit
key is no longer defined in the document.)

You can omit the location list with either the nonumberlist
option. For example:
\usepackage[record,symbols,nonumberlist]{glossaries-extra}
or
\printunsrtglossary[type=symbols,style=long4col,nonnumberlist]
Alternatively, you can use save-locations=false
in the resource options:
\GlsXtrLoadResources[
src={symbols}, % data in symbols.bib
sort-field={name}, % sort by name field
sort={letter-nocase}, % case-insensitive letter sort
type=symbols, % put these terms in the symbols list
field-aliases={unit=symbol},% convert unit key to symbol
save-locations=false % don't save location lists
]
The glossaries-extra
package now comes with a supplementary package glossary-longextra
that provides additional glossary styles that use the longtable
environment. These are more flexible than the long
styles provided with the base glossaries
package, and so are easier to adjust. There are samples of each of the longextra
styles in the glossaries
gallery. (If glossary-longextra.sty
isn't found, try upgrading your glossaries-extra
installation.)
For example:
\documentclass{report}
\usepackage{siunitx}
\usepackage[colorlinks]{hyperref}
\usepackage[record,% using bib2gls
symbols, % create list of symbols
stylemods={longextra} % load glossary-longextra.sty
]{glossaries-extra}
\GlsXtrLoadResources[
src={symbols}, % data in symbols.bib
sort-field={name}, % sort by name field
sort={letter-nocase}, % case-insensitive letter sort
type=symbols, % put these terms in the symbols list
field-aliases={unit=symbol},% convert unit key to symbol
save-locations=false % don't save location lists
]
% change column headers:
\renewcommand{\entryname}{Symbol}
\renewcommand{\symbolname}{Unit}
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=long-name-desc-sym]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$ and $\gls{alpha}$. Unit for $\gls{v}$: $\glssymbol{v}$.
\end{document}
This uses the long-name-desc-sym
style that has the name in the first column, the description in the second column and the symbol in the third column. The header text for the name and symbol columns are given by the language-sensitive commands \entryname
and \symbolname
. These are redefined in the above example. This style doesn't show the location list, so I've instructed bib2gls
to not bother saving the locations (with save-locations=false
).

The column alignments can be changed by redefining \glslongextraNameAlign
, for the name column, and \glslongextraSymbolAlign
, for the symbol column. For example:
\renewcommand{\glslongextraNameAlign}{c}
\renewcommand{\glslongextraSymbolAlign}{r}
If you want a different column ordering, you can just use one of the other styles. For example, the long-name-sym-desc
has the name in the first column, the symbol in the second column and the description in the third column.
\glsxtrnewsymbol[description={time},symbol={\si{s}}]{t}{\ensuremath{t}}
or (with theunit
key defined as per the first example)\glsxtrnewsymbol[description={time},unit={\si{s}}]{t}{\ensuremath{t}}
.