summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/scalerel/scalerel.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/scalerel/scalerel.sty')
-rw-r--r--macros/latex/contrib/scalerel/scalerel.sty211
1 files changed, 211 insertions, 0 deletions
diff --git a/macros/latex/contrib/scalerel/scalerel.sty b/macros/latex/contrib/scalerel/scalerel.sty
new file mode 100644
index 0000000000..5c25e8fa0f
--- /dev/null
+++ b/macros/latex/contrib/scalerel/scalerel.sty
@@ -0,0 +1,211 @@
+\ProvidesPackage{scalerel}
+[2016/12/29 v1.8
+ Routines for constrained scaling and stretching of objects,
+ relative to a reference object or in absolute terms]
+%
+% 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 this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c 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 Steven B. Segletes.
+
+% V1.01-Correct typos in documentation
+% V1.1 -Corrected usepackage dependencies; Significant doc rewrite.
+% V1.2 -Added \scaleleftright and \stretchleftright; revised docs.
+% V1.3 -Corrected missing % in stretch routines, added \hstretch and
+% \vstretch commands; fixed version number in .sty file
+% V1.4 -Auto-detect mathmode and style; use the proper math display
+% style; Allow \ignoremathstyle and \discernmathstyle to
+% revert to former approach in rare cases and return to new
+% approach.
+% -Added \Isnextbyte as a supplemental routine
+% -Added \scaleobj (like \scalebox, but defaults to math mode
+% using current display style).
+% V1.5 -Eliminated mathstyle package because of incompatibilites with
+% many other packages. Implemented \mathchoice approach instead.
+% V1.6 -Made available \LMex and \LMpt lengths (Local Math ex and
+% Local Math pt), usable inside \ThisStyle arguments (1ex/pt in
+% \textstyle and \displaystyle, 0.7ex/pt in \scriptstyle, and
+% 0.5ex/pt in \scriptscriptstyle).
+% -Revised/shortened/improved \Isnextbyte.
+% -Replaced ifthen package calls with etoolbox calls.
+% V1.7 -Note that the V1.5 implementation with \mathchoice seemed to
+% have made the use of \ignoremathstyle and \discernmathstyle
+% vestigial. Thus, \ignoremathstyle was revised to be used
+% for the purpose of streamlining package efficiency when
+% only textstyle (or displaystyle with \ignoremathstyle[D])
+% processing is required.
+% -Fixed use of dot {.} as null argument in \scaleleftright{}{}{}
+% and \stretchleftright{}{}{}, which had been causing overflow.
+% -Made \hstretch and \vstretch routines more efficient, using
+% optional arguments of \scalebox, instead of \scalerel.
+% V1.8 -Fixed divide by 0 bugs that would arise when object to be
+% scaled fell completely below the baseline (zero height).
+% Required revisions to \scalerelplain, \stretchrelplain,
+% \scaleto, and \stretchto.
+% -Fixed aspect-ratio bug, that calculated aspect for stretched object
+% based only upon portion above baseline
+
+\usepackage{calc}
+\usepackage{graphicx}
+\usepackage{etoolbox}
+\global\newlength\thesrwidth
+\global\newlength\thesrheight
+\global\newlength\srblobheight
+\global\newlength\srblobdepth
+\global\newlength\mnxsrwidth
+\newlength\LMex
+\newlength\LMpt
+\def\scriptstyleScaleFactor{.7}
+\def\scriptscriptstyleScaleFactor{.5}
+
+\newcommand\scalerel{\@ifstar{\scalerelplain}{\scalerelplus}}
+
+\newcommand\scalerelplain[3][99in]{\ThisStyle{%
+ \setbox0\hbox{\@obj{#3}}%
+ \setlength\srblobheight{\ht0+\dp0}%
+ \setlength\srblobdepth{\dp0}%
+ \setbox2\hbox{\@obj{#2}}%
+ \setbox0\hbox{\raisebox{\dp2}{\@obj{#2}}}%
+ \setlength\thesrwidth{\wd0*\ratio{\srblobheight}{\ht0}}%
+ \setlength\thesrheight{\ht0*\ratio{\srblobheight}{\ht0}}%
+ \setlength\mnxsrwidth{#1}%
+ \ifdim\thesrwidth>\mnxsrwidth\setlength\thesrwidth{\mnxsrwidth}\fi%
+ \raisebox{-\srblobdepth}{\resizebox{\thesrwidth}{\thesrheight}{\copy0}}%
+ }%
+}
+
+\newcommand\scalerelplus[3][99in]{\scalerelplain[#1]{#2}{#3}#3}
+
+\newcommand\stretchrel{\@ifstar{\stretchrelplain}{\stretchrelplus}}
+
+\newcommand\stretchrelplain[3][10000]{\ThisStyle{%
+ \setbox0\hbox{\@obj{#3}}%
+ \setlength\srblobheight{\ht0+\dp0}%
+ \setlength\srblobdepth{\dp0}%
+ \setbox2\hbox{\@obj{#2}}%
+ \setbox0\hbox{\raisebox{\dp2}{\@obj{#2}}}%
+ \setlength\thesrwidth{\wd0}%
+ \setlength\thesrheight{\ht0*\ratio{\srblobheight}{\ht0}}%
+ \setlength\mnxsrwidth{\thesrheight*100/#1}%
+ \ifdim\thesrwidth<\mnxsrwidth\setlength\thesrwidth{\mnxsrwidth}\fi%
+ \raisebox{-\srblobdepth}{\resizebox{\thesrwidth}{\thesrheight}{\copy0}}%
+ }%
+}
+
+\newcommand\stretchrelplus[3][10000]{\stretchrelplain[#1]{#2}{#3}#3}
+
+\newcommand\scaleto[3][99in]{\ThisStyle{%
+ \setlength\srblobheight{#3}%
+ \setbox2\hbox{\@obj{#2}}%
+ \setbox0\hbox{\raisebox{\dp2}{\@obj{#2}}}%
+ \setlength\thesrwidth{\wd0*\ratio{\srblobheight}{\ht0}}%
+ \setlength\thesrheight{\ht0*\ratio{\srblobheight}{\ht0}}%
+ \setlength\mnxsrwidth{#1}%
+ \ifdim\thesrwidth>\mnxsrwidth\setlength\thesrwidth{\mnxsrwidth}\fi%
+ \setlength\srblobdepth{\dp2*\ratio{\srblobheight}{\ht0}}%
+ \raisebox{-\srblobdepth}{\resizebox{\thesrwidth}{\thesrheight}{\copy0}}%
+ }%
+}
+
+\newcommand\stretchto[3][10000]{\ThisStyle{%
+ \setlength\srblobheight{#3}%
+ \setbox2\hbox{\@obj{#2}}%
+ \setbox0\hbox{\raisebox{\dp2}{\@obj{#2}}}%
+ \setlength\thesrwidth{\wd0}%
+ \setlength\thesrheight{\ht0*\ratio{\srblobheight}{\ht0}}%
+ \setlength\mnxsrwidth{\thesrheight*100/#1}%
+ \ifdim\thesrwidth<\mnxsrwidth\setlength\thesrwidth{\mnxsrwidth}\fi%
+ \setlength\srblobdepth{\dp2*\ratio{\srblobheight}{\ht0}}%
+ \raisebox{-\srblobdepth}{\resizebox{\thesrwidth}{\thesrheight}{\copy0}}%
+ }%
+}
+
+\newcommand\scaleleftright[4][99in]{%
+ \ifx.#2#3\else\scalerel[#1]{#2}{#3}\fi%
+ \ifx.#4\else\scalerel*[#1]{#4}{#3}\fi%
+}
+\newcommand\stretchleftright[4][10000]{%
+ \ifx.#2#3\else\stretchrel[#1]{#2}{#3}\fi%
+ \ifx.#4\else\stretchrel*[#1]{#4}{#3}\fi%
+}
+
+\newcommand\hstretch[2]{%
+ \ThisStyle{\scalebox{#1}[1]{\@obj{#2}}}}
+
+\newcommand\vstretch[2]{%
+ \ThisStyle{\scalebox{1}[#1]{\@obj{#2}}}}
+
+\newcommand\scaleobj[2]{%
+ \ThisStyle{\scalebox{#1}{\@obj{#2}}}}
+
+% DETERMINE IF THE SCALEREL ROUTINE WAS CALLED IN MATH MODE.
+% IF SO, USE THE PROPER MATH DISPLAY STYLE FOR THE CALL,
+% *UNLESS* THE FIRST CHARACTER OF THE ARGUMENT IS A $ SIGN,
+% SIGNIFYING A DESIRED ESCAPE FROM MATH MODE FOR THE ARGUMENT.
+\newcommand\@obj[1]{%
+ \if T\@mmode%
+ \Isnextbyte[q]{$}{#1}%
+ \if F\theresult%
+ $\SavedStyle#1$%
+ \else%
+ $#1$%
+ \fi%
+ \else%
+ $#1$%
+ \fi%
+}
+
+\def\@mstyleD{\displaystyle}
+\def\@mstyleT{\textstyle}
+\def\@mstyleS{\scriptstyle}
+\def\@mstyles{\scriptscriptstyle}
+%
+\def\SavedStyle{\csname @mstyle\m@switch\endcsname}
+%
+\newcommand\ThisStyle[1]{%
+ \ifmmode%
+ \def\@mmode{T}\mathchoice%
+ {\edef\m@switch{D}\LMex=1ex\relax\LMpt=1pt\relax#1}%
+ {\edef\m@switch{T}\LMex=1ex\relax\LMpt=1pt\relax#1}%
+ {\edef\m@switch{S}\LMex=\scriptstyleScaleFactor ex\relax%
+ \LMpt=\scriptstyleScaleFactor pt\relax#1}%
+ {\edef\m@switch{s}\LMex=\scriptscriptstyleScaleFactor ex\relax%
+ \LMpt=\scriptscriptstyleScaleFactor pt\relax#1}%
+ \else%
+ \def\@mmode{F}%
+ \edef\m@switch{T}\LMex=1ex\relax\LMpt=1pt\relax#1%
+ \fi%
+}
+%
+
+\let\sv@ThisStyle\ThisStyle
+
+\newcommand\discernmathstyle{\let\ThisStyle\sv@ThisStyle}
+
+% \ignoremathstyle WOULD BE USED TO SPEED UP DEEPLY NESTED
+% ROUTINES OF scalerel PACKAGE, WHEN LIMITED TO textstyle MATH
+\newcommand\ignoremathstyle[1][T]{%
+ \renewcommand\ThisStyle[1]{%
+ \edef\m@switch{#1}\LMex=1ex\relax\LMpt=1pt\relax%
+ \ifmmode\def\@mmode{T}\else\def\@mmode{F}\fi##1}%
+}
+
+% THIS CAN REPLACE \isnextbyte IN STRINGSTRINGS PACKAGE
+% BECAUSE IT WORKS ON CHARS THAT CAN'T BE \edef'ED (\dag, ETC.)
+\newcommand\Isnextbyte[3][v]{%
+ \def\SR@Letter@A{#2}%
+ \SR@nextbyte{\SR@Letter@B}#3\relax\relax\relax%
+ \ifdefstrequal{\SR@Letter@A}{\SR@Letter@B}%
+ {\edef\theresult{T}}{\edef\theresult{F}}%
+ \if q#1\else\theresult\fi%
+}
+\def\SR@nextbyte#1#2#3\relax{\def#1{#2}}
+
+\endinput