% \iffalse % $Id: fitbox.dtx,v 1.6 2015/08/16 18:11:50 boris Exp $ % %% Copyright 2015, Boris Veytsman \NeedsTeXFormat{LaTeX2e} %<*gobble> \ProvidesFile{fitbox.dtx} % % %<*gobble> % \fi % \CheckSum{188} % % %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} % %\iffalse % \begin{macrocode} \documentclass{ltxdoc} \usepackage{hypdoc} \PageIndex \CodelineIndex \RecordChanges \EnableCrossrefs \begin{document} \DocInput{fitbox.dtx} \end{document} % \end{macrocode} % % \fi % \MakeShortVerb{|} % \GetFileInfo{fitbox.dtx} % % % \title{Fit graphics on a page\thanks{\copyright 2015 Boris Veytsman} % \thanks{This package was commissined by Neadwerx, \url{http://www.neadwerx.com/}}} % \author{Boris Veytsman \thanks{borisv@lk.net}} % \date{\filedate, \fileversion} % \maketitle % % \begin{abstract} % The \textsl{fitbox} package allows a box (usually an % |\includegraphics| box) to fit on the page. It scales the box % to the maximal allowed size within the user-set limits. If there % there is not enough space on the page, the box is moved to the % next one. % \end{abstract} % % \tableofcontents % % \clearpage % %\section{Introduction} %\label{sec:intro} % % How often one puts a picture on a page only to see that \LaTeX\ % decides to move it to the next one because there is not enough % space---while shaving a millimeter off the height would make the % difference? This package is intended to alleviate this difference. % It uses several strategies to fit a picture on the page, and only if % they fail, the picture is moved to the next one. % %\section{User Guide} %\label{sec:ug} % % %\subsection{Installation} %\label{sec:ug_install} % % The installation of the class follows the usual % practice~\cite{TeXFAQ} for \LaTeX{} packages: % \begin{enumerate} % \item Run \textsf{latex} on |fitbox.ins|. This will produce the file % |fitbox.sty|. % \item Put the file |fitbox.sty| to % the place where \LaTeX{} can find it (see % \cite{TeXFAQ} or the documentation for your \TeX{} % system).\label{item:install} % \item Update the database of file names. Again, see \cite{TeXFAQ} % or the documentation for your \TeX{} system for the system-specific % details.\label{item:update} % \item The file |fitbox.pdf| provides the documentation for the % package % \end{enumerate} % As an alternative to items~\ref{item:install} and~\ref{item:update} % you can just put the files in the working directory where your % |.tex| file is. % % % %\subsection{Usage} %\label{sec:usage} % % To use the package, add to the preamble of your document % \begin{verbatim} % \usepackage{fitbox} % \end{verbatim} % % \DescribeMacro{\fitbox}% % The main command of the package is % \cs{fitbox}\oarg{options}\marg{stuff}. The \marg{stuff} will be % typeset in a box according to the \oarg{options}. In most cases % \marg{stuff} is an \cs{includegraphics} command, but anything that % fits into an LR-box can be typeset in this way. % % The \marg{stuff} is typeset in a box, and then the box is put on the % page according to the following algorithm: % \begin{enumerate} % \item \TeX\ starts a new paragraph. % \item The box is scaled up to the maximal dimensions specified by % the user (while keeping the aspect ratio). % \item If there is not enough space on the page to fit the box, the % latter is scaled down as neccessary, but no smaller than the % minimal dimensions specified by the user. % \item If there is still not enough space, \TeX\ tries to enlarge the % page up to the specified limit. % \item If this also fails, \TeX\ starts a new page and fits the box % there. % \end{enumerate} % % % \DescribeMacro{\fitboxset}% % The options can be set individually for each \cs{fitbox} command, or % globally using the command \cs{fitboxset}, for example, % \begin{verbatim} % \fitboxset{maxwidth=\textwidth, minwidth=\fitboxnatwidth} % \end{verbatim} % % % \DescribeMacro{\fitboxnatwidth}% % \DescribeMacro{\fitboxnatheight}% % The options of the package use key-value interface. Often % the values are dimensions; in these cases the special dimensions % \cs{fitboxnatwidth} and \cs{fitboxnatheight} can be used; they are % equal to natural dimensions of the box. Note that |height| and % \cs{fitboxnatheight} are actually \emph{total heights}, including % both height and depth of the corresponding boxes. For example, % \begin{verbatim} % \fitboxeset{minheight=0.5\fitboxnatheight} % \end{verbatim} % means that the box cannot be scaled down more than 50\%. % % The following options are recognized: % \begin{description} % \item[maxheight:] The maximal total height of the box. By default % \cs{textheight}. % \item[maxwidth:] The maximal width of the box. By default % \cs{textwidth}. % \item[minheight:] The minimal height of the box. By default % \cs{fitboxnatheight}. % \item[minwidth:] The minimal width of the box. By default % \cs{fitboxnatwidth}. % \item[belowboxspace:] The height of the space that must be left % below the box (e.g. for a caption). By default zero. % \item[maxenlargepage:] The maximal amount to add to the current % page. By default zero. % \end{description} % % %\StopEventually{\clearpage % \bibliography{fitbox} % \bibliographystyle{unsrt}} % % \clearpage % % \section{Implementation} % \label{sec:implementation} % % \begin{macrocode} %<*style> % \end{macrocode} % % %\subsection{Setting up parameters} %\label{sec:params} % % % % % \begin{macro}{\fitboxnatheight} % The total height of the box % \begin{macrocode} \newdimen\fitboxnatheight % \end{macrocode} % % \end{macro} % % \begin{macro}{\fitboxnatwidth} % The total width of the box % \begin{macrocode} \newdimen\fitboxnatwidth % \end{macrocode} % % \end{macro} % % % % We use |xkeyval| interface: % \begin{macrocode} \RequirePackage{xkeyval} \define@cmdkeys{FTBX}{maxheight, minheight, maxwidth, minwidth, belowboxspace, maxenlargepage} % \end{macrocode} % % \begin{macro}{\fitboxset} % Setting everything % \begin{macrocode} \def\fitboxset#1{\setkeys{FTBX}{#1}} % \end{macrocode} % % \end{macro} % % The defaults % \begin{macrocode} \fitboxset{maxheight=\textheight, minheight=\fitboxnatheight, maxwidth=\textwidth, minwidth=\fitboxnatwidth, belowboxspace=0pt, maxenlargepage=0pt} % \end{macrocode} % % %\subsection{Main command} %\label{sec:main_command} % % \begin{macro}{\FTBX@box} % The box which will held the stuff to be typeset % \begin{macrocode} \newbox\FTBX@box % \end{macrocode} % % \end{macro} % % \begin{macro}{\FTBX@desired@maxheight} % The desired maximal height \newdimen\FTBX@desired@maxheight % \end{macro} % % % \begin{macro}{\FTBX@desired@minheight} % The desired minimal height \newdimen\FTBX@desired@minheight % \end{macro} % % \begin{macro}{\FTBX@available@height} % The desired available height \newdimen\FTBX@available@height % \end{macro} % % \begin{macro}{\fitbox} % The main command % \begin{macrocode} \newcommand\fitbox[2][]{\leavevmode \fitboxset{#1}% \setbox\FTBX@box=\hbox{#2}% \fitboxnatwidth=\wd\FTBX@box\relax \fitboxnatheight=\ht\FTBX@box\relax \advance\fitboxnatheight by \dp\FTBX@box\relax % Checking the sizes \expandafter\ifdim\cmdKV@FTBX@minwidth>\columnwidth\relax \PackageWarning{fitbox}{Minimal width is larger than page width. Adjusting...}% \def\cmd@KV@FTBX@minwidth{\columnwidth}% \fi \expandafter\ifdim\cmdKV@FTBX@maxwidth>\columnwidth\relax \PackageWarning{fitbox}{Desired width is larger than page width. Adjusting...}% \def\cmd@KV@FTBX@maxwidth{\columnwidth}% \fi \expandafter\ifdim\cmdKV@FTBX@minheight>\textheight\relax \PackageWarning{fitbox}{Minimal height is larger than page height. Adjusting...}% \def\cmd@KV@FTBX@minheight{\textheight}% \fi \expandafter\ifdim\cmdKV@FTBX@maxheight>\textheight\relax \PackageWarning{fitbox}{Desired height is larger than page height. Adjusting...}% \def\cmd@KV@FTBX@maxheight{\textheight}% \fi % Calculating the minimal and maximal height \Gscale@div{\@tempa}{\cmdKV@FTBX@maxwidth}{\fitboxnatwidth}% \FTBX@desired@maxheight=\@tempa\fitboxnatheight\relax \expandafter\ifdim\cmdKV@FTBX@maxheight<\FTBX@desired@maxheight\relax \expandafter\FTBX@desired@maxheight=\cmdKV@FTBX@maxheight\relax \fi \Gscale@div{\@tempa}{\cmdKV@FTBX@minwidth}{\fitboxnatwidth}% \FTBX@desired@minheight=\@tempa\fitboxnatheight\relax \expandafter\ifdim\cmdKV@FTBX@minheight>\FTBX@desired@minheight\relax \expandafter\FTBX@desired@minheight=\cmdKV@FTBX@minheight\relax \fi \ifdim\FTBX@desired@minheight>\FTBX@desired@maxheight\relax \PackageWarning{fitbox}{Desired min scale exceeds desired min scale. Adjusting...}% \FTBX@desired@minheight=\FTBX@desired@maxheight\relax \fi \FTBX@available@height=\pagegoal\relax \ifdim\FTBX@available@height>\vsize\relax \FTBX@available@height=\vsize \fi \advance\FTBX@available@height by -\pagetotal\relax \advance\FTBX@available@height by -\cmdKV@FTBX@belowboxspace\relax \advance\FTBX@available@height by -\baselineskip\relax \ifdim\FTBX@desired@maxheight>\FTBX@available@height\relax \ifdim\FTBX@available@height<\FTBX@desired@minheight\relax \@tempdima=\FTBX@desired@minheight\relax \advance\@tempdima by -\FTBX@available@height\relax \expandafter\ifdim\cmdKV@FTBX@maxenlargepage<\@tempdima\relax \newpage \resizebox*{!}{\FTBX@desired@maxheight}{\box\FTBX@box}% \else \enlargethispage{\@tempdima}% \resizebox*{!}{\FTBX@desired@minheight}{\box\FTBX@box}% \fi \else \resizebox*{!}{\FTBX@available@height}{\box\FTBX@box}% \fi \else \resizebox*{!}{\FTBX@desired@maxheight}{\box\FTBX@box}% \fi } % \end{macrocode} % % \end{macro} % % \begin{macrocode} % % \end{macrocode} %\Finale %\clearpage % %\PrintChanges %\clearpage %\PrintIndex % \endinput