# Thomas Fischer's Weblog

Life, Linux, LaTeX

## More on LaTeX Beamer: Linking images to an enlarged version

If you have read my previous posting on LaTeX Beamer, you may remember that there were two example slides taken from a lecture of mine. Most slides for this lecture have a similar layout, consisting of a three-column table with fixed column widths. For photos to be shown in the right column, details become beyond recognition if the image or photo has a landscape-like aspect ratio or is scaled down by a large factor.

To circumvent this problem I came up with the idea of showing the small photo in full-screen size once clicked on; another click brings the viewer back to the original view. In terms of LaTeX, Beamer and PDF this means adding a new slide containing only the up-scaled photo and creating click-sensitive hyper-references (a.k.a. links) in both directions between the small image on the regular slide and the big-photo-only slide. As the big-photo-only slide should not interfere with the presentation if you do not click on the small photo, those special slides have to be appended at the very end of your presentation.

Thus, to solve the problem stated above, three subproblems have to be solved:

1. Automatically creating a new slide at the end of your presentation
2. Showing the photo in full-screen size
3. Adding clickable links to jump between the regular slide and the big-photo-only slide

Of course, it should be as flexible and simple for the user as possible, so that it can be included in existing slide sets if necessary.

## More Details

The process of creating slides for photos requires to scan through the document and memorize which photos to link to. This “memorization” is implemented in a LaTeX-like way by writing to a special .aux file using \newwrite and related commands. At the beginning, the file is opened for writing:

\newcounter{linkimagecounter}

\AtBeginDocument{%
% open file linkimage.aux for writing images' filenames to it
}

The .aux file only stores image filenames. The links are later generated using the linkimagecounter counter, so that the first link always points to the first file etc.

Whenever there is an image to link, the user uses the \linkimage command:

% use this command to link some content to a large picture at the end of your slides
% create link pointing forward to link source in frames at document's end
#1%
}} % close both hypertarget and hyperlink
% step counter
}

This command takes two arguments: First, the object which is the link source. This can be for example an \includegraphics, a \copyrightbox, or a \beamerbutton command. The second argument is the image’s filename; no includegraphics statement should be used here, as this will be called automatically when generating the big-photo-only slides.
Example:

Finally, at the end of your slide set after the slide with “questions now, please”, you have to call \flushlinkimages which will insert all big-photo-only slides.

% call this command at the very end of your presentation (even after "Now questions, please" slide)
% internal counter for loop over all linked images

% loop over all linked images ...
% read one line (one image filename) at a time (and strip new line character at end)
% create a new frame per image, center content
\begin{frame}\begin{center}
}% hypertarget
\end{center}\end{frame}
% step counter
} % whiledo
% close file
}

In above code, first some counters are initialized. As you remember, we use counters to match images and hyper-references. Next we close our .aux file (still open for writing) and open it for reading. This makes a single LaTeX run sufficient to generate the extra slides, as the .aux file is written and read in one pass.

The interesting part is the loop, going through all photos. In each iteration, one filename is read from the .aux file and a simple frame environment is created holding an \includegraphics command maximizing the photo while keeping its aspect ratio. You may have to adjust the height parameter for your personal Beamer theme. Hyper-references (\hyperlink and \hypertarget) are generated as well, corresponding the commands created in the original \linkimage call.

As a clarification: All the LaTeX code above should be placed in a class or style file to be included in your presentation. Within your presentation, you should only use \linkimage and \flushlinkimages, everything else happens automatically.

I would be interested in hearing from you if you see ways to make it more efficient, simpler, or more flexible.

Written by Thomas Fischer

September 7, 2010 at 16:05

Posted in LaTeX

### 10 Responses

1. I changed \begin{frame} \begin{center}, widths and heights, and it worked great in pdfscreen also.

M Bursik

October 14, 2010 at 14:41

2. I tried many times, I always get this error message:

! Undefined control sequence.

Do you know how I could solve this??? That would help me a lot…

Giuseppe

November 21, 2011 at 17:35

3. Hm, I would guess that you missed to correctly load and integrate the \flushlinkimages command somehow. Can you provide a minimum example where it is not working for you?

Thomas Fischer

November 27, 2011 at 18:05

4. I had the same issue as Giuseppe, including the ‘ifthen’ package solved it.
Thanks for the awesome set of commands though, exactly what I’d been looking for! A small enhancement request: would be useful in my case to be able to copy the image’s caption to the large scale image as well.

Ben

January 26, 2012 at 1:54

5. I’ve added the ability to specify a caption that will be used as the frametitle for the large images. It just adds a 3 parameter to the \linkimage command and stores it as a second line for each image in the aux file which contains the caption text. I’ve pasted the changes below in case anyone ever finds them useful. Thanks once again Thomas!

% use this command to link some content to a large picture at the end of your slides
….
}} % close both hypertarget and hyperlink

}

% call this command at the very end of your presentation (even after “Now questions, please” slide)
….
% read one line (one image filename) at a time (and strip new line character at end)
% create a new frame per image, center content
\begin{frame}\begin{center}
….
}

Ben

January 26, 2012 at 2:16

6. I have added \RequiredPackage{ifthen} to my .sty file.

Thomas Fischer

January 26, 2012 at 12:54

7. Good idea. I changed my .sty file accordingly, but made the caption argument optional. Thus the command will stay compatible and you would set the caption by calling it like \linkimage[The Caption]{\includegraphics{imagefile}}{imagefile}.
I’ll have to look if I put the .sty file online so that everyone can fetch the most recent verison, or put it on CTAN …

Thomas Fischer

January 26, 2012 at 12:57

8. A very very useful package! I only tried to eliminate some aspects that I had found disturbing:

1) For frames containing more slides, one new frame is created for each
SLIDE (including the slides where the smal picture is hidden). This
creates too many useless pages (annoying especialy when printing).
2) The optional caption does not allow formatting, math mode etc.
3) The area of the small image is active as hyperlink even on slides
where the image itself is hidden. This may be undesirable.

The modified version below, as far as I tried, eliminates these problems.

1) The modified version creates only one new frame for each “linkimaged”
image file, except if the user wants to use the same image with and
without the caption or with different captions. In this case, one new
frame is created for each combination.
2) It allows using macros and math mode in the caption.
aware of overlay specifications. So the command can be used like
doesn’t influence the appearance of the (one never knows what the
user puts in it), so you have to use for instance \onslide for this. The
\linkimage overlay specification determines only on which slides the
area is clickable as the hyperlink.
4) Two typos corrected: linkimage.sty (the “t” missing) and optional
caption (the second “p” missing)

To achieve this:
— The forward links are named after the combination
instead of using the counter. (The part is there to
distinguish different uses of the same image file, like with different
captions.)
— At the same time, a macro \ is linked (using \let)
to a “reference macro”. The \linkimage command always checks whether the
\ macro is defined and writes the new item to the
.aux file (and steps the counter) only if the check fails. The reference
macro is defined as an error message, since it should be never executed.
— The backward links (and targets) are suspended. Instead, I used the
\Acrobatmenu{GoBack} command (defined in the hyperref package) jumping
simply back to the page we came from (without any target needed in it).
— The eTeX primitive \detokenize is used to enable the
parameter to be used in the link names, macro names and .aux file items.
— \linkimage is defined using the Beamer version of \newcommand.

I have found the .sty file months (or years?) ago somewhere, don’t know any more where. My attempts to re-find it failed. So I include the complete then-found linkimage.sty with my modifications marked and the original version commented out (where it differs).

Regards
Tomáš Kučera, Prague

%
% linkimage is a LaTeX package to link small images within a Beamer
% presentation to a full-screen variant of the same image at the
% slide set’s end.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status maintained’.
%
% The Current Maintainer of this work is
% Thomas Fischer
%
%
%%

\NeedsTeXFormat{LaTeX2e}

\RequirePackage{graphicx}
\RequirePackage{hyperref}
\RequirePackage{ifthen}

% counter to build references between linked images

% variable for image height (used when “flushing” images)
\newlength{\imageheight}

\AtBeginDocument{%
% open file linkimage.aux for writing images’ filenames to it
}

% use this command to link some content to a large picture at the end of your slides
% example:
%%%——– modified —— To make \linkimage aware of overlay specification. ——
%%%——– end of modified ——————————————————————
%%%——– added —— The reference macro defined as an error message (it should be never executed). ——-
\ifx\lnkmgmakro\undefined\gdef\lnkmgmakro{\errmessage{linkimage package: Something is wrong — the \string\lnkmgmakro \space is not intended to be executed!}}\fi
%%%——– cancelled —— Not needed, there is no hypertarget in the modified version. —
%%%——– end of cancelled ——————————————————————
% create link pointing forward to link source in frames at document’s end
%%%——– modified —— Hyperlink named after the instead of the counter. The #4 is for overlay-specification awareness.
%%%——– end of modified ——————————————————————
#2%
%%%——– modified —— No hypertarget closure as there is no hypertarget in the modified version.
%}} % close both hypertarget and hyperlink
%%%——– end of modified ——————————————————————
%%%——– added —— Write new item to the .aux file and step the counter only if the combination is used for the first time.
\expandafter\expandafter\expandafter\ifx\expandafter\expandafter\csname\detokenize{#1}#3\endcsname\relax
\global\expandafter\expandafter\expandafter\let\expandafter\expandafter\csname\detokenize{#1}#3\endcsname=\lnkmgmakro
% write caption for target’s beamer frame
%%%——– modified —— The tokens receive the catergory 12.
%%%——– end of modified ——————————————————————
% step counter
%%%——– added —— The end of the \ifx conditional
\fi%
}

% call this command at the very end of your presentation (even after “Now questions, please” slide)
% remove decorations to make more space on slides
% internal counter for loop over all linked images

% loop over all linked images …
% read one line (one image filename) at a time (and strip new line character at end)
% read ocaption for target's beamer frame
% create a new frame per image, center content
\begin{frame}%
\centering
%%%——– cancelled —— No hyperlink needed, since no target has been created on the referring page.
%%%——– end of cancelled ——————————————————————
%%%——– modified —— Hypertarget named after the instead of the counter.
%%%——– end of modified ——————————————————————
% base height for image shall be text body’s height
\setlength{\imageheight}{\textheight}
% if page has to have a title, substract estimated title height from max image height
}% hypertarget

\end{frame}
% step counter
} % whiledo
% close file
}

Tomáš

December 4, 2015 at 12:30

9. Oh, sorry, all the angle brackets have disappeared from my post! Is there a way to delete the message? And to let the angle brackets appear (maybe prefixing them with a backslash)?

Tomáš

December 4, 2015 at 12:35

10. Hopefully the version unmodified by the CMS:

A very very useful package! I only tried to eliminate some aspects that I had found disturbing:

1) For frames containing more slides, one new frame is created for each
SLIDE (including the slides where the smal picture is hidden). This
creates too many useless pages (annoying especialy when printing).
2) The optional caption does not allow formatting, math mode etc.
3) The area of the small image is active as hyperlink even on slides
where the image itself is hidden. This may be undesirable.

The modified version below, as far as I tried, eliminates these problems.

1) The modified version creates only one new frame for each “linkimaged”
image file, except if the user wants to use the same image with and
without the caption or with different captions. In this case, one new
frame is created for each <caption><filename> combination.
2) It allows using macros and math mode in the caption.
aware of overlay specifications. So the command can be used like
doesn’t influence the appearance of the <text> (one never knows what the
user puts in it), so you have to use for instance \onslide for this. The
\linkimage overlay specification determines only on which slides the
area is clickable as the hyperlink.
4) Two typos corrected: linkimage.sty (the “t” missing) and optional
caption (the second “p” missing)

To achieve this:
— The forward links are named after the <caption><filename> combination
instead of using the counter. (The <caption> part is there to
distinguish different uses of the same image file, like with different
captions.)
— At the same time, a macro \<caption><filename> is linked (using \let)
to a “reference macro”. The \linkimage command always checks whether the
\<caption><filename> macro is defined and writes the new item to the
.aux file (and steps the counter) only if the check fails. The reference
macro is defined as an error message, since it should be never executed.
— The backward links (and targets) are suspended. Instead, I used the
\Acrobatmenu{GoBack} command (defined in the hyperref package) jumping
simply back to the page we came from (without any target needed in it).
— The eTeX primitive \detokenize is used to enable the <caption>
parameter to be used in the link names, macro names and .aux file items.
— \linkimage is defined using the Beamer version of \newcommand.

I have found the .sty file months (or years?) ago somewhere, don’t know any more where. My attempts to re-find it failed. So I include the complete linkimage.sty with my modifications marked and the original version commented out.

Regards
Tomáš Kučera, Prague

%
% linkimage is a LaTeX package to link small images within a Beamer
% presentation to a full-screen variant of the same image at the
% slide set’s end.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status maintained’.
%
% The Current Maintainer of this work is
% Thomas Fischer <fischer@unix-ag.uni-kl.de>
%
%
%%

\NeedsTeXFormat{LaTeX2e}

\RequirePackage{graphicx}
\RequirePackage{hyperref}
\RequirePackage{ifthen}

% counter to build references between linked images

% variable for image height (used when “flushing” images)
\newlength{\imageheight}

\AtBeginDocument{%
% open file linkimage.aux for writing images’ filenames to it
}

% use this command to link some content to a large picture at the end of your slides
% example:
%%%——– modified —— To make \linkimage aware of overlay specification. ——
%%%——– end of modified ——————————————————————
%%%——– added —— The reference macro defined as an error message (it should be never executed). ——-
\ifx\lnkmgmakro\undefined\gdef\lnkmgmakro{\errmessage{linkimage package: Something is wrong — the \string\lnkmgmakro \space is not intended to be executed!}}\fi
%%%——– cancelled —— Not needed, there is no hypertarget in the modified version. —
%%%——– end of cancelled ——————————————————————
% create link pointing forward to link source in frames at document’s end
%%%——– modified —— Hyperlink named after the <caption><filename> instead of the counter. The #4 is for overlay-specification awareness.
%%%——– end of modified ——————————————————————
#2%
%%%——– modified —— No hypertarget closure as there is no hypertarget in the modified version.
%}} % close both hypertarget and hyperlink
%%%——– end of modified ——————————————————————
%%%——– added —— Write new item to the .aux file and step the counter only if the <capture><filename> combination is used for the first time.
\expandafter\expandafter\expandafter\ifx\expandafter\expandafter\csname\detokenize{#1}#3\endcsname\relax
\global\expandafter\expandafter\expandafter\let\expandafter\expandafter\csname\detokenize{#1}#3\endcsname=\lnkmgmakro
% write caption for target’s beamer frame
%%%——– modified —— The <caption> tokens receive the catergory 12.
%%%——– end of modified ——————————————————————
% step counter
%%%——– added —— The end of the \ifx conditional
\fi%
}

% call this command at the very end of your presentation (even after “Now questions, please” slide)
% remove decorations to make more space on slides
% internal counter for loop over all linked images

% loop over all linked images …
% read one line (one image filename) at a time (and strip new line character at end)
% read ocaption for target’s beamer frame
% create a new frame per image, center content
\begin{frame}%
\centering
%%%——– cancelled —— No hyperlink needed, since no target has been created on the referring page.
%%%——– end of cancelled ——————————————————————
%%%——– modified —— Hypertarget named after the <caption><filename> instead of the counter.
%%%——– end of modified ——————————————————————
% base height for image shall be text body’s height
\setlength{\imageheight}{\textheight}
% if page has to have a title, substract estimated title height from max image height
}% hypertarget