![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
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:
- Automatically creating a new slide at the end of your presentation
- Showing the photo in full-screen size
- 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} \setcounter{linkimagecounter}{0} \AtBeginDocument{% % open file linkimage.aux for writing images' filenames to it \newwrite\linkimageoutputstream \immediate\openout\linkimageoutputstream=linkimage.aux }
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 \newcommand{\linkimage}[2]{% % create link anchor where link from document's end points to \hypertarget{linkimagerefbackward\arabic{linkimagecounter}}{% % create link pointing forward to link source in frames at document's end \hyperlink{linkimagerefforward\arabic{linkimagecounter}}{% #1% }} % close both hypertarget and hyperlink \immediate\write\linkimageoutputstream{#2} % step counter \addtocounter{linkimagecounter}{1} }
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:
\linkimage{\copyrightbox{\includegraphics[height=3em]{photo2}}{Thomas Fischer}}{photo2}
\linkimage{\beamerbutton{Show Photo}}{photo2}
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) \newcommand{\flushlinkimages}{% % internal counter for loop over all linked images \newcounter{linkimagetotal} \setcounter{linkimagetotal}{\value{linkimagecounter}} \setcounter{linkimagecounter}{0} % close auxiliary file linkimage.aux and re-open it again for reading \immediate\closeout\linkimageoutputstream \newread\linkimageinputstream \immediate\openin\linkimageinputstream=linkimage.aux % loop over all linked images ... \whiledo{\value{linkimagecounter}<\value{linkimagetotal}}{% % read one line (one image filename) at a time (and strip new line character at end) \endlinechar=-1\immediate\read\linkimageinputstream to \linkimagefilename % create a new frame per image, center content \begin{frame}\begin{center} % create link pointing backward to link source in main document \hyperlink{linkimagerefbackward\arabic{linkimagecounter}}{% % create link anchor where link from main document points to \hypertarget{linkimagerefforward\arabic{linkimagecounter}}{% \includegraphics[width=\linewidth,height=0.75\paperheight,keepaspectratio]{\linkimagefilename}% }% hypertarget }% hyperlink \end{center}\end{frame} % step counter \addtocounter{linkimagecounter}{1} } % whiledo % close file \immediate\closein\linkimageinputstream }
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.