43

I have a script which automatically creates a beamer presentation with several .ps images, each one inserted in a distinct frame. Those images consist on graphs built using GraphViz. The script is basically iterating on this code snippet:

\begin{frame}{Image 1}

    \begin{figure}
        \includegraphics[width=1\textwidth]{image-1.ps}
    \end{figure}

\end{frame}

I have some images with large widths, like this one (reduced the size and quality for best viewing):

An image with large width

So the above code works like a charm. But I do have small images as well, like this one:

A small image

If I leave the \includegraphics command with no adjustments, my images will become way bigger than the frame itself. If I put width=1\textwidth, it will work fine with large width images, but not with small ones.

Is there a way to find the best figure size adjustment when using \includegraphics, so my images will be displayed correctly? I usually do that manually, but in this case it's a script which simply adds the image to the .tex body and compile it. I'm pretty sure I'm missing something obvious here, but couldn't figure out what it is.

Paulo Cereda
  • 44,220

1 Answers1

71

graphicx provides the boolean value keepaspectratio. It's explained in the documentation as follow:

If set to true then specifying both width and height (or totalheight) does not distort the figure but scales such that neither of the specified dimensions is exceeded.

\includegraphics[width=\linewidth,height=\textheight,keepaspectratio]{picture}
Marco Daniel
  • 95,681
  • keepaspectratio is a new one for me. Exactly what I need, too. – Matthew Leingang May 04 '11 at 17:12
  • 7
    Just in case someone needs the same for text: The adjustbox package allows to use \adjustbox[width=\linewidth,height=\textheight,keepaspectratio]{<text>}. You might want to use totalheight instead of height. Alternatievly you can use \resizebox{<width>}{<height>}{<text>} (or \resizebox* to use totalheight instead) but this requires \Gin@isotrue locally to enable the keepaspectratio feature. You could write is as \csname Gin@isotrue\endcsname to avoid issues with the @. – Martin Scharrer May 25 '11 at 11:21
  • @Martin: Thanks for the update! I'd probably ask the very same thing for text, you read my mind. Living and learning. =) – Paulo Cereda May 25 '11 at 11:43
  • 1
    @Marco @Martin Is there something similar for floats? If I use \begin{figure}[p] \includegraphics[width=\linewidth,height=\textheight,keepaspectratio]{picture} \caption{somecaption} \end{figure} then the graphic will be scaled to fit the page, but the float might still produce an overfull hbox because of the caption. – Janek Jun 20 '13 at 11:27
  • 1
    @Janek: This shouldn't happen except the caption contains some strange content which can't be broken or hyphenated correctly. Also, try loading the caption package to get smarter captions. – Martin Scharrer Jun 20 '13 at 12:59
  • @Martin It seems I alwas get the warning even when I make a MWE with just one figure in it: \documentclass[a4paper,10pt]{scrartcl} \usepackage{graphicx} \begin{document} \begin{figure} \centering \includegraphics[width=\textwidth,height=\textheight]{AnyGraphic} \caption{Some random caption.} \end{figure} \end{document} will result in a Float too large for page warning. – Janek Jun 20 '13 at 14:08
  • 2
    @Janek: The height=\textheight is the problem. It doesn't leave any space for the caption. Try height=\dimexpr\textheight-2\baselineskip-\abovecaptionskip-\belowcaptionskip\relax instead. – Martin Scharrer Jun 21 '13 at 11:59
  • @Martin This indeed works for the very short caption. A longer (multiple lines) caption though, will still result in the warning. – Janek Jun 25 '13 at 10:53
  • 1
    @Janek: You need to adjust the height according to the height of the caption. You can get the height of the caption by storing it into a box first. If you post a follow-up question I will post a full answer. – Martin Scharrer Jun 25 '13 at 13:18