Gallery: Images in Glossary
This example has an image associated with each entry. For simplicity I’ve just used the sample images that are provided by the mwe package (which needs to be installed but not loaded for this document). The graphicx package is needed to include in the image in the document.The image file name is stored in the user1
field
(one of the custom fields). Since none of the predefined glossary
styles are suitable, this example defines and uses
its own custom style (called images
).
This new custom style is based on the tree
style
(\setglossarystyle{tree}
) but it’s modified to check if the
useri
field is set (useri
is the internal field
name corresponding to the user1
key). If it’s set, the
image file (provided by that key) is scaled so that it’s
approximately the height of four lines and is stored in a box called
\glsimagebox
. (This box is defined using
\newsavebox
before the glossary style.) The width of
this box (which is the width of the scaled image) is stored in the
register called \glswidth
. (This register is defined
using \newlength
before the glossary style.) The first
paragraph of the description has a “cutout” section in which the
image will be placed. This is created using TeX’s \parshape
primitive. The first four lines of the description are computed as
\linewidth-\glswidth-1em
. The extra 1em
provides a
little padding between the text and the image.
If there’s no image
for the given entry, the paragraph shape isn’t changed, but in
either case the paragraph indentation is suppressed using
\noindent
. The image is inserted using a little bit of
trickery by placing it inside a box whose width is given by
\linewidth
and is right-aligned. Some vertical
adjustment is required and the whole thing is then placed inside a
zero-width box so it doesn’t interfere with the text.
One thing you need to be careful about is the situation where an
entry starts close to the end of the page, in which case the image
will poke out into the bottom margin. This hasn’t been taken
into account here, and you can see the problem with the “nulla non
mauris” entry. (See Adjusting the alttree
Style for a way of measuring available space.)
The initial comment lines below are arara directives. You can remove them if you don’t use arara.
% arara: pdflatex % arara: makeglossaries % arara: pdflatex \documentclass{report} \usepackage{graphicx} \usepackage[colorlinks]{hyperref} \usepackage[nopostdot,toc]{glossaries} \makeglossaries \loadglsentries{example-glossaries-images} % Define a style for the "images" glossary. The image names are % stored in the user1 key. % (It's possible that the image insertion can done more neatly using an % appropriate package.) \newsavebox\glsimagebox \newlength\glswidth \newglossarystyle{images}% {% \setglossarystyle{tree}% \renewenvironment{theglossary}{}{}% \renewcommand{\glossentry}[2]{% \ifglshasfield{useri}{##1}% {\savebox {\glsimagebox}% {\includegraphics[height=4\baselineskip]{\glsentryuseri{##1}}}% \settowidth{\glswidth}{\usebox\glsimagebox}% \glswidth=\dimexpr\linewidth-\glswidth-1em\relax \parshape=5 0pt \glswidth 0pt \glswidth 0pt \glswidth 0pt \glswidth 0pt \linewidth\relax \noindent \makebox[0pt][l]{% \smash{\makebox[\linewidth][r]{\raisebox{-3\baselineskip}{\usebox\glsimagebox}}}}% }% {% \noindent }% \glsentryitem{##1}\textbf{\glstarget{##1}{\glossentryname{##1}}}% \space\glossentrydesc{##1}\par \indexspace }% \renewcommand*{\glsgroupskip}{}% } \begin{document} \chapter{Sample} \forglsentries{\thislabel}{\gls{\thislabel}. } \printglossary[style=images] \end{document}
This document loads the hyperref package, which
creates hyperlinks from the entries in the document (referenced
using commands like \gls
) to their definition in the
glossary. These hyperlinks are displayed in red text. I’ve used
\forglsentries
just to iterate over all the defined
entries for this example. In practice, you would typically use commands like
\gls{label}
. For example:
Here is a reference to the term \gls{sedfeugiat}.
I can also reuse the image in the document:
\glsuseri{sedfeugiat}.
(which will hyperlink to the glossary) or just
\glsentryuseri{sedfeugiat}.
The entries have all been defined in the file example-glossaries-images.tex, which you should find installed in the same location as the glossaries package (or in a sub-directory called test-entries). The entry definitions look like this:
\longnewglossaryentry{sedfeugiat}{name={sed feugiat},user1={example-image}}% {% Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut pellentesque augue sed urna. Vestibulum diam eros, fringilla et, consectetuer eu, nonummy id, sapien. Nullam at lectus. In sagittis ultrices mauris. Curabitur malesuada erat sit amet massa. Fusce blandit. Aliquam erat volutpat. Aliquam euismod. Aenean vel lectus. Nunc imperdiet justo nec dolor. Etiam euismod. Fusce facilisis lacinia dui. Suspendisse potenti. In mi erat, cursus id, nonummy sed, ullamcorper eget, sapien. Praesent pretium, magna in eleifend egestas, pede pede pretium lorem, quis consectetuer tortor sapien facilisis magna. Mauris quis magna varius nulla scelerisque imperdiet. Aliquam non quam. Aliquam porttitor quam a lacus. Praesent vel arcu ut tortor cursus volutpat. In vitae pede quis diam bibendum placerat. Fusce elementum convallis neque. Sed dolor orci, scelerisque ac, dapibus nec, ultricies ut, mi. Duis nec dui quis leo sagittis commodo. }
If you don’t use arara, you need to run the following commands:
pdflatex images-glossary makeglossaries images-glossary pdflatex images-glossary
(See Incorporating makeglossaries or makeglossaries-lite or bib2gls into the document build.)
I’ve used the nopostdot
option
to remove the terminating full stop that is placed by default after
the description. The entries all have a “1” after the description.
This is the page number on which the entry was referenced. In this
sample document all the entries were referenced on page 1. If you don’t want these numbers you can use the nonumberlist
option.
Download: PDF (132.42K), source code (1.42K), sample glossary definitions (14.11K).