summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/fitbox
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/fitbox
Initial commit
Diffstat (limited to 'macros/latex/contrib/fitbox')
-rw-r--r--macros/latex/contrib/fitbox/Makefile61
-rw-r--r--macros/latex/contrib/fitbox/README18
-rw-r--r--macros/latex/contrib/fitbox/fitbox.bib14
-rw-r--r--macros/latex/contrib/fitbox/fitbox.dtx529
-rw-r--r--macros/latex/contrib/fitbox/fitbox.ins25
-rw-r--r--macros/latex/contrib/fitbox/fitbox.pdfbin0 -> 295166 bytes
-rw-r--r--macros/latex/contrib/fitbox/napoleon.pngbin0 -> 31195 bytes
-rw-r--r--macros/latex/contrib/fitbox/sample-subfigure.pdfbin0 -> 88777 bytes
-rw-r--r--macros/latex/contrib/fitbox/sample-subfigure.tex73
-rw-r--r--macros/latex/contrib/fitbox/sample.pdfbin0 -> 83215 bytes
-rw-r--r--macros/latex/contrib/fitbox/sample.tex40
-rw-r--r--macros/latex/contrib/fitbox/vitruvian.jpgbin0 -> 63756 bytes
12 files changed, 760 insertions, 0 deletions
diff --git a/macros/latex/contrib/fitbox/Makefile b/macros/latex/contrib/fitbox/Makefile
new file mode 100644
index 0000000000..d363063c17
--- /dev/null
+++ b/macros/latex/contrib/fitbox/Makefile
@@ -0,0 +1,61 @@
+#
+#
+# This file is in public domain
+#
+# $Id$
+#
+
+PACKAGE=fitbox
+SAMPLES = sample.tex sample-subfigure.tex
+
+all: $(PACKAGE).pdf ${SAMPLES:%.tex=%.pdf}
+
+%.pdf: %.dtx $(PACKAGE).sty
+ pdflatex $<
+ - bibtex $*
+ pdflatex $<
+ - makeindex -s gind.ist -o $*.ind $*.idx
+ - makeindex -s gglo.ist -o $*.gls $*.glo
+ pdflatex $<
+ while ( grep -q '^LaTeX Warning: Label(s) may have changed' $*.log) \
+ do pdflatex $<; done
+
+
+
+
+%.sty: %.ins %.dtx
+ pdflatex $<
+
+%.pdf: %.tex $(PACKAGE).sty
+ pdflatex $*
+ -bibtex $*
+ pdflatex $*
+ while ( grep -q '^LaTeX Warning: Label(s) may have changed' $*.log) \
+ do pdflatex $*; done
+
+
+.PRECIOUS: $(PACKAGE).cfg $(PACKAGE).sty
+
+
+clean:
+ $(RM) $(PACKAGE).sty *.log *.aux \
+ *.cfg *.glo *.idx *.toc \
+ *.ilg *.ind *.out *.lof \
+ *.lot *.bbl *.blg *.gls *.hd \
+ *.dvi *.ps *.tgz *.zip *.brf
+
+veryclean: clean
+ $(RM) $(PACKAGE).pdf ${SAMPLES:%.tex=%.pdf}
+
+distclean: veryclean
+
+#
+# Archive for the distribution. Includes typeset documentation
+#
+archive: all clean
+ COPYFILE_DISABLE=1 tar -C .. -czvf ../$(PACKAGE).tgz --exclude '*~' --exclude '*.tgz' --exclude '*.zip' --exclude CVS --exclude '.git*' $(PACKAGE); mv ../$(PACKAGE).tgz .
+
+zip: all clean
+ ${MAKE} $(PACKAGE).sty
+ $(RM) *.log
+ zip -r $(PACKAGE).zip * -x '*~' -x '*.tgz' -x '*.zip' -x CVS -x 'CVS/*'
diff --git a/macros/latex/contrib/fitbox/README b/macros/latex/contrib/fitbox/README
new file mode 100644
index 0000000000..bdd64eb941
--- /dev/null
+++ b/macros/latex/contrib/fitbox/README
@@ -0,0 +1,18 @@
+ Fit graphics on a page
+ Boris Veytsman
+
+The 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.
+
+
+version 1.02 2019/02/20 Bug fixes
+ New command \fitbox* for boxes inside floats
+ New command \SetFitboxLayout for emulation of figsize
+ package functionality
+
+version 1.01 2019/02/10 Use the width of the box around the graphics for
+ default max width.
+ Do not adjust user provided values even if they
+ seem nonsensical (but warn the user)
diff --git a/macros/latex/contrib/fitbox/fitbox.bib b/macros/latex/contrib/fitbox/fitbox.bib
new file mode 100644
index 0000000000..e7fbc0b6bb
--- /dev/null
+++ b/macros/latex/contrib/fitbox/fitbox.bib
@@ -0,0 +1,14 @@
+@misc{TeXFAQ,
+ author = {{UK \TeX{} Users Group}},
+ howpublished = {\url{http://www.tex.ac.uk/cgi-bin/texfaq2html}},
+ title = {{UK} List of {\TeX} Frequently Asked Questions},
+ year = {2015},
+}
+
+@Manual{FigSize,
+ title = {The \textsl{FigSize} Package},
+ author = {Anthony A. Tanbakuchi},
+ month = {March},
+ year = 2002,
+ note = {\url{https://ctan.org/pkg/figsize}}}
+
diff --git a/macros/latex/contrib/fitbox/fitbox.dtx b/macros/latex/contrib/fitbox/fitbox.dtx
new file mode 100644
index 0000000000..c445c03d87
--- /dev/null
+++ b/macros/latex/contrib/fitbox/fitbox.dtx
@@ -0,0 +1,529 @@
+% \iffalse
+%
+%% Copyright 2015-2019, Boris Veytsman <borisv@lk.net
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3 of this license or (at your option) any
+%% later version.
+%% The latest version of the license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3 or later is part of all distributions of
+%% LaTeX version 2003/06/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Boris Veytsman
+%%
+% \begin{macrocode}
+%<style>\NeedsTeXFormat{LaTeX2e}
+%<*gobble>
+\ProvidesFile{fitbox.dtx}
+%</gobble>
+%<style>\ProvidesPackage{fitbox}
+%<*style>
+[2019/02/20 v1.02 Fitting boxes on a page]
+% \end{macrocode}
+%</style>
+%<*gobble>
+% \fi
+%
+%
+%% \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}
+%</gobble>
+% \fi
+% \MakeShortVerb{|}
+% \GetFileInfo{fitbox.dtx}
+%
+%
+% \title{Fit graphics on a page\thanks{\copyright 2015--2019 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{\fitbox*}%
+% The starred version \cs{fitbox*} is intended to be used inside
+% floats, where page length is not well defined. This command uses
+% only the first two steps of the alogithm above, scaling the box up
+% to the maximal dimensions provided by the user.
+%
+% \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}
+% \fitboxset{minheight=0.5\fitboxnatheight}
+% \end{verbatim}
+% means that the box cannot be scaled down more than 50\%.
+%
+% The following options are recognized by the \cs{fitbox} command:
+% \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
+% the size of the current box to be constructed.
+% \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}
+%
+% \DescribeMacro{\SetFitboxLayout}%
+% Since version 1.02 the package added the functionality of
+% \textsl{FigSize} package~\cite{FigSize}. The latter has a handy
+% command \cs{SetFigLayout}, which can be used to scale all figures on
+% a page. This package uses the command \cs{SetFitboxLayout} that
+% somewhat mimics \cs{SetFigLayout}. The macro has the arguments
+% \cs{SetFitboxLayout}\oarg{keys}\marg{rows}\marg{columns}, and helps
+% to scale the boxes into a grid. However, unlike \textsl{FigSize}
+% package, we do not redefine \cs{includegraphics} command: you should
+% use \cs{fitbox} for your graphics. The command \cs{SetFitboxLayout}
+% is just \cs{fitboxset} with special values of the parameters. These
+% commands can be mixed, with the latest command overriding the
+% previous ones.
+%
+% The following keys are recognized by the \cs{SetFitboxLayout} command:
+% \begin{description}
+% \item[colsep:] the distance between the columns; by default the size
+% of \cs{quad}.
+% \item[colsepexpr:] if set, the width of the expression becomes
+% \texttt{colsep}. For example, \path{colsepexpr=\quad} makes
+% separation between the columns the size of \cs{quad}.
+% \item[maincapheight:] The height of the main caption. By default,
+% $\cs{abovecaptionskip}+\cs{belowcaptionskip}+
+% n\cs{baselineskip})$
+% where $n$ is the expected number of lines in the main caption (by
+% default 1).
+% \item[maincaplines:] The number of lines in the main caption. By
+% default 1.
+% \item[subcapheight:] The height of the subcaption. By default,
+% $\cs{abovecaptionskip}+\cs{belowcaptionskip}+m\cs{baselineskip}$
+% where $m$ is the expected number of lines in the subcaptions (by
+% default 0).
+% \item[subcaplines:] The number of lines in the subcaptions. By
+% default 0.
+% \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}
+%
+%
+% \changes{v1.01}{2019/02/20}{New keys for \cs{SetFitboxLayout}}
+% We use |xkeyval| interface:
+% \begin{macrocode}
+\RequirePackage{xkeyval}
+\define@cmdkeys{FTBX}{maxheight, minheight, maxwidth, minwidth,
+ belowboxspace, maxenlargepage, colsep, maincapheight,
+ subcapheight}
+% \end{macrocode}
+%
+% Setting some keys changes other keys
+% \begin{macrocode}
+\define@key{FTBX}{colsepexpr}{%
+ \setbox\@tempboxa=\hbox{#1}%
+ \edef\cmdKV@FTBX@colsep{\wd\@tempboxa}}
+\define@key{FTBX}{maincaplines}{%
+ \@tempdima=\z@
+ \advance\@tempdima by #1\baselineskip\relax
+ \ifnum#1>0\relax
+ \advance\@tempdima by \parskip
+ \fi
+ \advance\@tempdima by \abovecaptionskip
+ \advance\@tempdima by \belowcaptionskip
+ \edef\cmdKV@FTBX@maincapheight{\the\@tempdima}}
+\define@key{FTBX}{subcaplines}{%
+ \@tempdima=\z@
+ \advance\@tempdima by #1\baselineskip\relax
+ \ifnum#1>0\relax
+ \advance\@tempdima by \parskip
+ \fi
+ \advance\@tempdima by \abovecaptionskip
+ \advance\@tempdima by \belowcaptionskip
+ \edef\cmdKV@FTBX@subcapheight{\the\@tempdima}}
+% \end{macrocode}
+%
+%
+% \begin{macro}{\fitboxset}
+% Setting everything
+% \begin{macrocode}
+\def\fitboxset#1{\setkeys{FTBX}{#1}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+%\changes{v1.01}{2019/02/10}{Changed maximal width}
+% The defaults
+% \begin{macrocode}
+\fitboxset{maxheight=\textheight, minheight=\fitboxnatheight,
+ maxwidth=\hsize, minwidth=\fitboxnatwidth,
+ belowboxspace=0pt, maxenlargepage=0pt, colsepexpr={aaa},
+ maincaplines=1, subcaplines=0}
+% \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
+% \begin{macrocode}
+\newdimen\FTBX@desired@maxheight
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\FTBX@desired@minheight}
+% The desired minimal height
+% \begin{macrocode}
+\newdimen\FTBX@desired@minheight
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FTBX@available@height}
+% The desired available height
+% \begin{macrocode}
+\newdimen\FTBX@available@height
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fitbox}
+% \changes{v1.02}{2019/02/18}{Split into normal and starred version}
+% The main command
+% \begin{macrocode}
+\def\fitbox{\@ifstar\@@fitbox\@fitbox}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\@fitbox}
+% \changes{v1.01}{2019/02/10}{Do not force width adjustment}
+% \changes{v1.02}{2019/02/17}{\cs{noident} instead of \cs{leavevmode}
+% (suggested by Frank Mittelbach)}
+% \changes{v1.02}{2019/02/18}{Split into normal and starred version}
+% The main command---``normal'' version
+% \begin{macrocode}
+\newcommand\@fitbox[2][]{\noindent
+ \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 too large. Consider
+ changing it to \the\hsize}%
+ \fi
+ \expandafter\ifdim\cmdKV@FTBX@maxwidth>\hsize\relax
+ \PackageWarning{fitbox}{Desired width is too large. Consider
+ changing it to \the\hsize}%
+ \fi
+ \expandafter\ifdim\cmdKV@FTBX@minheight>\textheight\relax
+ \PackageWarning{fitbox}{Minimal height is too large.
+ Consider changing it to \the\textheight}%
+ \fi
+ \expandafter\ifdim\cmdKV@FTBX@maxheight>\textheight\relax
+ \PackageWarning{fitbox}{Desired height is too large.
+ Consider changing it to \the\textheight}%
+ \fi
+ % Calculating the minimal and maximal height
+ \Gscale@div{\@FTBX@tempa}{\cmdKV@FTBX@maxwidth}{\fitboxnatwidth}%
+ \FTBX@desired@maxheight=\@FTBX@tempa\fitboxnatheight\relax
+ \expandafter\ifdim\cmdKV@FTBX@maxheight<\FTBX@desired@maxheight\relax
+ \expandafter\FTBX@desired@maxheight=\cmdKV@FTBX@maxheight\relax
+ \fi
+ \Gscale@div{\@FTBX@tempa}{\cmdKV@FTBX@minwidth}{\fitboxnatwidth}%
+ \FTBX@desired@minheight=\@FTBX@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 max
+ scale.}%
+ \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{macro}{\@@fitbox}
+% \changes{v1.01}{2019/02/10}{Do not force width adjustment}
+% \changes{v1.02}{2019/02/17}{\cs{noident} instead of \cs{leavevmode}
+% (suggested by Frank Mittelbach)}
+% \changes{v1.02}{2019/02/18}{Split into normal and starred version}
+% The main command---``starred'' version. Simplified computations.
+% \begin{macrocode}
+\newcommand\@@fitbox[2][]{\noindent
+ \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 too large. Consider
+ changing it to \the\hsize}%
+ \fi
+ \expandafter\ifdim\cmdKV@FTBX@maxwidth>\hsize\relax
+ \PackageWarning{fitbox}{Desired width is too large. Consider
+ changing it to \the\hsize}%
+ \fi
+ \expandafter\ifdim\cmdKV@FTBX@minheight>\textheight\relax
+ \PackageWarning{fitbox}{Minimal height is too large.
+ Consider changing it to \the\textheight}%
+ \fi
+ \expandafter\ifdim\cmdKV@FTBX@maxheight>\textheight\relax
+ \PackageWarning{fitbox}{Desired height is too large.
+ Consider changing it to \the\textheight}%
+ \fi
+ % Calculating the minimal and maximal height
+ \Gscale@div{\@FTBX@tempa}{\cmdKV@FTBX@maxwidth}{\fitboxnatwidth}%
+ \FTBX@desired@maxheight=\@FTBX@tempa\fitboxnatheight\relax
+ \expandafter\ifdim\cmdKV@FTBX@maxheight<\FTBX@desired@maxheight\relax
+ \expandafter\FTBX@desired@maxheight=\cmdKV@FTBX@maxheight\relax
+ \fi
+ \Gscale@div{\@FTBX@tempa}{\cmdKV@FTBX@minwidth}{\fitboxnatwidth}%
+ \FTBX@desired@minheight=\@FTBX@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 max
+ scale.}%
+ \fi
+ \resizebox*{!}{\FTBX@desired@maxheight}{\box\FTBX@box}%
+}
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+%\subsection{Multi-figure layout}
+%\label{sec:layout}
+%
+%
+%
+% \begin{macro}{\SetFitboxLayout}
+% \changes{v1.02}{2019/02/17}{New macro}
+% \changes{v1.02}{2019/02/20}{Key-value interface}
+% A macro styles after \cs{SetFigsizeLayout} of \textsl{FigSize}
+% package.
+% \begin{macrocode}
+\newcommand\SetFitboxLayout[3][]{%
+ \fitboxset{#1}%
+ \@tempdima=\textheight
+ \advance\@tempdima by -\cmdKV@FTBX@maincapheight\relax
+ \divide\@tempdima by #2\relax
+ \advance\@tempdima by -\cmdKV@FTBX@subcapheight\relax
+ \edef\cmdKV@FTBX@maxheight{\the\@tempdima}%
+ \@tempdima=\columnwidth
+ \@tempdimb=\cmdKV@FTBX@colsep\relax
+ \advance\@tempdima by -#3\@tempdimb\relax
+ \advance\@tempdima by \@tempdimb\relax
+ \divide\@tempdima by #3\relax
+ \edef\cmdKV@FTBX@maxwidth{\the\@tempdima}%
+}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macrocode}
+%</style>
+% \end{macrocode}
+%\Finale
+%\clearpage
+%
+%\PrintChanges
+%\clearpage
+%\PrintIndex
+%
+\endinput
diff --git a/macros/latex/contrib/fitbox/fitbox.ins b/macros/latex/contrib/fitbox/fitbox.ins
new file mode 100644
index 0000000000..68df1a0901
--- /dev/null
+++ b/macros/latex/contrib/fitbox/fitbox.ins
@@ -0,0 +1,25 @@
+%
+% Doctrip file for fitbox
+% This file is in public domain
+%
+\def\batchfile{fitbox.ins}
+\input docstrip
+\keepsilent
+\showprogress
+
+
+\askforoverwritefalse
+
+\generate{%
+ \file{fitbox.sty}{\from{fitbox.dtx}{style}}}
+
+\obeyspaces
+\Msg{*****************************************************}%
+\Msg{* Congratulations! You successfully generated the *}%
+\Msg{* fitbox package. *}%
+\Msg{* *}%
+\Msg{* Please move the file fitbox.sty to the place *}%
+\Msg{* where LaTeX files are kept in your system *}%
+\Msg{* *}%
+\Msg{* Happy TeXing! *}%
+\Msg{*****************************************************}% \ No newline at end of file
diff --git a/macros/latex/contrib/fitbox/fitbox.pdf b/macros/latex/contrib/fitbox/fitbox.pdf
new file mode 100644
index 0000000000..3fc9228d46
--- /dev/null
+++ b/macros/latex/contrib/fitbox/fitbox.pdf
Binary files differ
diff --git a/macros/latex/contrib/fitbox/napoleon.png b/macros/latex/contrib/fitbox/napoleon.png
new file mode 100644
index 0000000000..994fcd9cc6
--- /dev/null
+++ b/macros/latex/contrib/fitbox/napoleon.png
Binary files differ
diff --git a/macros/latex/contrib/fitbox/sample-subfigure.pdf b/macros/latex/contrib/fitbox/sample-subfigure.pdf
new file mode 100644
index 0000000000..ba8f3147b7
--- /dev/null
+++ b/macros/latex/contrib/fitbox/sample-subfigure.pdf
Binary files differ
diff --git a/macros/latex/contrib/fitbox/sample-subfigure.tex b/macros/latex/contrib/fitbox/sample-subfigure.tex
new file mode 100644
index 0000000000..cd8fd196b7
--- /dev/null
+++ b/macros/latex/contrib/fitbox/sample-subfigure.tex
@@ -0,0 +1,73 @@
+\documentclass{article}
+\usepackage{graphicx}
+\usepackage{fitbox}
+\usepackage{subfig}
+\begin{document}
+
+The use of fitbox with a subfigure. Note that the optional argument
+for the command counts the lines for the subcaptions.
+
+\SetFitboxLayout[subcaplines=1]{3}{2}
+
+
+
+
+\begin{figure}
+ \centering
+ \subfloat[First
+ Napoleon]{\fitbox*{\includegraphics{napoleon}}}\quad
+ \subfloat[Second
+ Napoleon]{\fitbox*{\includegraphics{napoleon}}}\\
+ \subfloat[Third
+ Napoleon]{\fitbox*{\includegraphics{napoleon}}}\quad
+ \subfloat[Fourth
+ Napoleon]{\fitbox*{\includegraphics{napoleon}}}\\
+ \subfloat[Fifth
+ Napoleon]{\fitbox*{\includegraphics{napoleon}}}\quad
+ \subfloat[Sixth
+ Napoleon]{\fitbox*{\includegraphics{napoleon}}}
+ \caption{Six Napoleons, \texttt{\textbackslash SetFitboxLayout[subcaplines=1]\{3\}\{2\}}}
+ \label{fig:napoleons}
+\end{figure}
+
+\SetFitboxLayout{3}{2}
+
+\begin{figure}
+ \centering
+ \subfloat{\fitbox*{\includegraphics{napoleon}}}\quad
+ \subfloat{\fitbox*{\includegraphics{napoleon}}}\\
+ \subfloat{\fitbox*{\includegraphics{napoleon}}}\quad
+ \subfloat{\fitbox*{\includegraphics{napoleon}}}\\
+ \subfloat{\fitbox*{\includegraphics{napoleon}}}\quad
+ \subfloat{\fitbox*{\includegraphics{napoleon}}}
+ \caption{Six Napoleons, no subcaptions, \texttt{\textbackslash SetFitboxLayout\{3\}\{2\}}}
+ \label{fig:napoleons1}
+\end{figure}
+
+\SetFitboxLayout[subcaplines=1, maincaplines=2]{2}{3}
+
+
+
+
+\begin{figure}
+ \centering
+ \subfloat[First
+ Napoleon]{\fitbox*{\includegraphics{napoleon}}}\quad
+ \subfloat[Second
+ Napoleon]{\fitbox*{\includegraphics{napoleon}}}\quad
+ \subfloat[Third
+ Napoleon]{\fitbox*{\includegraphics{napoleon}}}\\
+ \subfloat[Fourth
+ Napoleon]{\fitbox*{\includegraphics{napoleon}}}\quad
+ \subfloat[Fifth
+ Napoleon]{\fitbox*{\includegraphics{napoleon}}}\quad
+ \subfloat[Sixth
+ Napoleon]{\fitbox*{\includegraphics{napoleon}}}
+ \caption{Six Napoleons, another arrangement\\
+ \texttt{\textbackslash SetFitboxLayout[subcaplines=1,
+ maincaplines=2]\{2\}\{3\}}}
+ \label{fig:napoleons3}
+\end{figure}
+
+
+\end{document}
diff --git a/macros/latex/contrib/fitbox/sample.pdf b/macros/latex/contrib/fitbox/sample.pdf
new file mode 100644
index 0000000000..f1e26175b5
--- /dev/null
+++ b/macros/latex/contrib/fitbox/sample.pdf
Binary files differ
diff --git a/macros/latex/contrib/fitbox/sample.tex b/macros/latex/contrib/fitbox/sample.tex
new file mode 100644
index 0000000000..ea8c2b60ad
--- /dev/null
+++ b/macros/latex/contrib/fitbox/sample.tex
@@ -0,0 +1,40 @@
+\documentclass{article}
+\usepackage{graphicx}
+\usepackage{fitbox}
+\begin{document}
+
+We start from an image at maximal size:
+
+{\centering\fitbox{\includegraphics{vitruvian}}\par}
+
+Now it is resized. Here we allow down to 50\% of scale:
+
+{\centering\fitbox[minheight=0.5\fitboxnatheight,
+ minwidth=0.5\fitboxnatwidth]{\includegraphics{vitruvian}}\par}
+
+
+
+
+Now we make the figure smaller:
+
+{\centering\fitbox[maxwidth=\fitboxnatwidth,
+ maxheight=\fitboxnatwidth]{\includegraphics{vitruvian}}\par}
+
+{\centering\fitbox[maxwidth=\fitboxnatwidth,
+ maxheight=\fitboxnatwidth]{\includegraphics{vitruvian}}\par}
+
+
+
+We leave some space, so the full size figure would not fit anymore:
+
+{\centering\fitbox{\includegraphics{vitruvian}}\par}
+
+The figure is now on the next page. Let us leave some space under the
+next figure:
+
+{\centering\fitbox[minheight=0.5\fitboxnatheight,
+ minwidth=0.5\fitboxnatwidth,
+ belowboxspace=\baselineskip]{\includegraphics{vitruvian}}\par}
+We left some space for a caption.
+
+\end{document}
diff --git a/macros/latex/contrib/fitbox/vitruvian.jpg b/macros/latex/contrib/fitbox/vitruvian.jpg
new file mode 100644
index 0000000000..406573b7d0
--- /dev/null
+++ b/macros/latex/contrib/fitbox/vitruvian.jpg
Binary files differ