summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/scalerel
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/scalerel
Initial commit
Diffstat (limited to 'macros/latex/contrib/scalerel')
-rw-r--r--macros/latex/contrib/scalerel/README13
-rw-r--r--macros/latex/contrib/scalerel/scalerel.pdfbin0 -> 345230 bytes
-rw-r--r--macros/latex/contrib/scalerel/scalerel.sty211
-rw-r--r--macros/latex/contrib/scalerel/scalerel.tex706
4 files changed, 930 insertions, 0 deletions
diff --git a/macros/latex/contrib/scalerel/README b/macros/latex/contrib/scalerel/README
new file mode 100644
index 0000000000..a66e87fae6
--- /dev/null
+++ b/macros/latex/contrib/scalerel/README
@@ -0,0 +1,13 @@
+The package provides four primary commands for vertically scaling and
+stretching objects, and a number of derivative commands. Its primary
+function is the ability to scale/stretch and shift one object to conform
+to the vertical size of a specified second object. This feature can be
+useful in both equations and schematic diagrams.
+
+Additionally, the scaling and stretching commands offer constraints on
+maximum width and/or minimum aspect ratio, which are often used to
+preserve legibility or for the sake of general appearance.
+
+The package will, by default, preserve the current math style in the
+arguments to its macros. For the sake of compilation efficiency,
+however, this feature may be turned off and on at will by the user.
diff --git a/macros/latex/contrib/scalerel/scalerel.pdf b/macros/latex/contrib/scalerel/scalerel.pdf
new file mode 100644
index 0000000000..66e2db18b3
--- /dev/null
+++ b/macros/latex/contrib/scalerel/scalerel.pdf
Binary files differ
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
diff --git a/macros/latex/contrib/scalerel/scalerel.tex b/macros/latex/contrib/scalerel/scalerel.tex
new file mode 100644
index 0000000000..961a914700
--- /dev/null
+++ b/macros/latex/contrib/scalerel/scalerel.tex
@@ -0,0 +1,706 @@
+\documentclass{article}
+\def\version{1.8}
+%
+% 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.11 Corrected typo in documentation
+% 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
+\parskip 1em
+\parindent 0em
+\newcommand\rl{\rule{2em}{0in}}
+\usepackage{scalerel}
+\usepackage{verbatim}
+\usepackage[only,llbracket,rrbracket,llparenthesis,rrparenthesis]{stmaryrd}
+\usepackage{stackengine}
+\usepackage{accsupp} % for ensuring the right Unicode codepoint upon pasting
+\def\sr{\textsf{scalerel}}
+\let\vb\verb
+\reversemarginpar
+\marginparwidth 1.6in
+\newcommand\margtt[1]{\marginpar{\hfill\ttfamily#1}}
+\newcommand\margcmd[1]{\marginpar{\hfill\ttfamily\char'134#1}}
+\newcommand\cmd[1]{\texttt{\char'134#1}}
+\begin{document}
+\begin{center}
+\LARGE The \textsf{scalerel} Package\\
+\rule{0em}{.7em}\small Routines for constrained scaling and stretching
+of objects,\\relative to a reference object or in absolute terms\\
+\rule{0em}{2.7em}\large Steven B. Segletes\\
+steven.b.segletes.civ@mail.mil\\
+\rule{0em}{1.7em}\today\\
+v\version
+\end{center}
+
+\section{Commands and Description}
+
+The \textsf{scalerel} package is used to scale and vertically stretch
+ objects, either relative to other objects, or in absolute terms.
+Its commands may be invoked in either math mode or text mode (if there
+ is no math in the objects to manipulate);
+however, the objects it manipulates will, by default, be processed in
+ math mode.
+Nonetheless, one may process the objects in text mode (assuming they
+ do not contain math-specific characters or commands) by
+ [non-intuitively] specifying arguments as \vb|{$object$}|, instead
+ of the usual \vb|{object}|.
+
+There are four basic commands with the \textsf{scalerel} package, two
+of which have star variants:
+\begin{verbatim}
+ \scalerel[*][max_width]{object}{reference}
+ \stretchrel[*][narrowest_aspect]{object}{reference}
+ \scaleto[max_width]{object}{height}
+ \stretchto[narrowest_aspect]{object}{height}
+\end{verbatim}
+In addition, there are a number of added commands that have been
+implemented as composites of the four basic commands, they are
+\begin{verbatim}
+ \scaleleftright[max_width]{left-obj.}{reference}{right-obj.}
+ \stretchleftright[narrowest_aspect]{left-obj.}{reference}{right-obj.}
+ \hstretch{scale}{object}
+ \vstretch{scale}{object}
+ \scaleobj{scale}{object}
+\end{verbatim}
+Unless delimited for text mode, \texttt{object} is assumed to be a math
+ object and will be processed in the \textit{current} math style.%
+\footnote{By \LaTeX{} math styles, we mean \cmd{displaystyle}, \cmd{textstyle},
+ \cmd{scriptstyle}, and \cmd{scriptscriptstyle}.}
+On the other hand, \texttt{reference} will take on the current mode (text
+ or math).
+If in math mode, \texttt{reference} will likewise be taken in the current
+ math style.
+
+There are also several auxiliary commands, useful in their own
+right:
+\begin{verbatim}
+ \ThisStyle{...\SavedStyle...}
+ \LMex
+ \LMpt
+ \def\scriptstyleScaleFactor{0.7}
+ \def\scriptscriptstyleScaleFactor{0.5}
+ \Isnextbyte[[v] OR q]{test byte}{string}
+ \ignoremathstyle[D]
+ \discernmathstyle
+\end{verbatim}
+
+In the case of all \sr{} macros, \vb|object| is the object to be scaled or
+stretched. It can be as simple as a symbol, like a summation sign
+($\sum$), or it can be an object of complex description. Likewise, in
+cases of \textit{relative} scaling and stretching, \vb|reference| is
+the reference object in relation to which the manipulated
+\vb|object| is scaled or vertically stretched. The \vb|reference|
+may likewise be of complex description (such as a mathematical
+expression). When an \vb|object| is scaled or stretched
+\textit{relative} to a \vb|reference| object, it is also vertically
+shifted, if necessary, so that its vertical extent conforms to that of
+the \vb|reference| object.
+
+In cases of scaling or stretching \textit{to} a specified size,
+ \vb|height| will be the \textit{total} vertical height${}+{}$depth of
+ the \vb|object| following a scale or stretch manipulation.
+Since scaling or stretching to an
+ absolute size provides no \vb|reference| object, the baseline of
+ the manipulated \vb|object| remains unchanged.
+
+In cases of scaling (relative or absolute), the constraint
+ \vb|max_width| is optionally specified as the maximum width allowable
+ for the manipulated object.
+If the manipulated width would otherwise exceed this limit, the
+ \vb|object| width is reduced to meet this limit.
+If the \vb|object| width is reduced, its aspect ratio will change with
+ respect to its original shape.
+
+By definition, vertical stretching will increase the (height-to-width)
+ aspect ratio
+ of an object.
+In the case of stretching (relative or absolute), the constraint
+ \vb|narrowest_aspect| is the narrowest aspect ratio allowed by the
+ stretch.%
+\footnote{Prior to V1.8 of the package, the limiting aspect ratio was
+ erroneously based on that portion of the stretched object
+ \textit{above} the baseline, rather than the object's full vertical extent.}
+Its value is given in \%, such that a parameter value of \texttt{100}
+ indicates 100\% or an aspect ratio of 1.
+If the stretch would otherwise cause the manipulated \vb|object|'s
+ aspect ratio to become more narrow than (\textit{i.e.}, larger
+ than) this value, the width of the manipulated \vb|object| is
+ increased to meet this threshold.
+The value of \vb|narrowest_aspect| must be an integer.
+
+Because \textit{relative} scaling or stretching is done
+\textit{relative} to a reference object, the \vb|\scalerel| and
+\margcmd{scalerel}\margcmd{stretchrel}%
+\vb|\stretchrel| commands will, by default, print out the
+manipulated \vb|object| followed immediately by the \vb|reference|
+object. Because this may not always be desired, the star (*) version of
+these commands suppresses the output of the \vb|reference| object, so
+that only the \vb|object| that was manipulated is output.
+
+The \vb|\scaleleftright| and \vb|\stretchleftright| commands
+\margcmd{scaleleftright}\margcmd{stretchleftright}%
+are intended to provide the functional capability of the \vb|\left| and
+\vb|\right| commands in math mode, for delimiting symbols not
+otherwise supported by those commands.
+
+The \vb|\hstretch| and \vb|\vstretch commands| merely take the
+\margcmd{hstretch}\margcmd{vstretch}%
+second argument and either horizontally or vertically stretch it by a
+scale factor given by the first argument. The scale is not given in
+percent, like some aforementioned commands. Remember also, that these
+commands are, by default processed in math mode. In a like manner,
+\margcmd{scaleobj}%
+\vb|\scaleobj| performs a scale of the object. It is like the
+\vb|\scalebox| command of the \textsf{graphicx} package, except that
+its argument (like others in this package) defaults to math mode, and is
+displayed in the current math display style.
+
+A useful auxiliary command \vb|\ThisStyle{}| has been introduced for
+\margcmd{ThisStyle}%
+remembering the current math style. When invoked, this command will
+remember the math style present at the time of its invocation and then
+execute its argument. Within the extent of its argument, an invocation
+\margcmd{SavedStyle}%
+of the macro \vb|\SavedStyle| will reinstate the math style that was
+active upon invocation. This command is very useful when \LaTeX{} boxes
+are being set within the math environment, since the prevailing math
+style does not carry into the box, without the use of
+\vb|\SavedStyle|.
+
+The lengths \verb|\LMex| and \verb|\LMpt| work in conjunction with
+\verb|\ThisStyle|
+\margcmd{LMex}%
+\margcmd{LMpt}%
+and are what I am calling the ``local-mathstyle `ex'\,''
+and ``local-mathstyle `pt','' respectively.
+They are lengths, available for use within the argument of \verb|\ThisStyle|,
+ that scale with the current mathstyle, equalling 1ex and 1pt in
+\verb|\displaystyle| and \verb|\textstyle| math, and scaled by a
+factor of 0.7 in \verb|\scriptstyle| and 0.5 in \verb|\scriptscriptstyle|.
+Such a scalable length is useful when {\sr} is used to place objects
+\margcmd{scriptstyleScaleFactor}%
+relative to each other across various mathstyles. The 0.7 and 0.5
+relative height factors apply to the default Computer Modern font.
+\margcmd{\footnotesize scriptscriptstyleScaleFactor}%
+For other fonts, these scale factors may be reset with a \verb|\def|
+on the macros \verb|\scriptstyleScaleFactor| and
+\verb|\scriptscriptstyleScaleFactor|.
+
+A service routine \vb|\Isnextbyte| was employed by this package.
+\margcmd{Isnextbyte}%
+Because of its more general utility, it is made accessible to the user.
+It is an improved version of the command \vb|\isnextbyte| from the
+\textsf{stringstrings} package. It will determine if the first
+byte from a passed string argument matches a specified
+\textit{match}-character. It produces a \vb|T| or \vb|F| result,
+which is printed out by default. With the use of the \vb|q| optional
+argument, the output can be suppressed, with the result instead being
+stored in a macro \vb|\theresult|.
+
+\subsection{Efficiency of nested \sr{} macros\label{s:nm}}
+
+As of version 1.4, {\sr} commands will autodetect the current math
+display style (so-called display-style, text-style, script-style, and/or
+scriptscript-style) and process its arguments in the same mode. The
+overhead associated with this capability is an invocation of
+\vb|\mathchoice|, which must create 4 boxes (one in each math style)
+before selecting one
+to typeset. While a small overhead in itself, an efficiency issue
+can arise when \sr{} macros are nested, since if 3 \sr{} macros
+are nested, \vb|\mathchoice| will build $4^3=64$ boxes in order
+to select the proper one to typeset (and a nesting level of 4 yields
+256 boxes).
+
+With the use of \vb|\ignoremathstyle|, the math style of the \sr{}
+\margcmd{ignoremathstyle}%
+processing can be fixed in a single math style, thus eliminating the
+construction of \vb|\mathchoice| boxes. The increase in processing
+efficiency can be noticeable when operating on deeply nested \sr{}
+macros.
+
+The invocation of \vb|\ignoremathstyle| will force all subsequent
+\sr{} calls to process its arguments in \vb|\textstyle| math.
+Alternately, \vb|\ignoremathstyle[D]| will force the processing
+of \sr{} macros in \vb|\displaystyle| math.
+
+\begin{sloppypar}
+This streamlining can be undone, reinstating the more general
+math-style preserving approach, with the invocation of
+\vb|\discernmathstyle|.
+\margcmd{discernmathstyle}%
+These macros can be used anywhere in a document by a user, to turn off
+and on the \vb|\mathchoice| feature of \sr{}, or they may be
+used within user macro definitions, to fix the math style by which
+\sr{} processes its macros within the confines of the user macro.
+\end{sloppypar}
+
+\section{Usage Examples}
+
+Now for a few examples. Let us define
+\begin{verbatim}
+ \def\preblob{\displaystyle\sum_{i=0}^3}
+ \def\blob{\displaystyle\frac{\displaystyle\frac{x^3}{z+r^3}}%
+ {\displaystyle\frac{y}{x^2}}%
+ }
+\end{verbatim}
+ \def\preblob{\displaystyle\sum_{i=0}^3}
+ \def\blob{\displaystyle\frac{\displaystyle\frac{x^3}{z+r^3}}%
+ {\displaystyle\frac{y}{x^2}}%
+ }
+Here are the raw definitions of \vb|$\preblob\blob$|, unscaled:
+
+ \rl$\preblob\blob$
+
+\subsection{The $\backslash$\texttt{scalerel} Command}
+
+Now we employ \vb|$\scalerel{\preblob}{\blob}$| to scale the summation
+ to match the size of the acted-upon term:
+
+ \rl$\scalerel{\preblob}{\blob}$
+
+If we wish constrain the width of the summation to 3ex, we employ\\
+\vb|$\scalerel[3ex]{\preblob}{\blob}$|
+
+ \rl$\scalerel[3ex]{\preblob}{\blob}$
+
+Of course, if the manipulated object contains text symbols (as in
+ this case), a width constraint will change their aspect ratio,
+ which is generally not desirable.
+
+Now let's say you wanted to introduce notation to bound mathematical
+expressions by triangles. After defining
+\vb|\blob| as before, you could use\\
+\vb|$\scalerel[3ex]{\triangleleft}{\blob}|\\
+\vb|\scalerel*[3ex]{\triangleright}{\blob}$|
+
+\rl%
+$\scalerel[3ex]{\triangleleft}{\blob}\scalerel*[3ex]{\triangleright}{\blob}$
+
+Here, the second call to \vb|\scalerel| was with the star (\vb|*|)
+option, indicating that \vb|\blob| should not be printed out following
+the right-hand delimiter. A less-tall expression would appear in those
+same delimiters as
+
+\rl%
+$\scalerel[3ex]{\triangleleft}{Q}\scalerel*[3ex]{\triangleright}{Q}$
+
+Because the width limit had not been reached, no horizontal compression
+of the object was required. Note: see the \vb|\scaleleftright| and
+\vb|\stretchleftright| commands for a more direct way to employ these
+sort of transformations.
+
+\subsection{The $\backslash$\texttt{stretchrel} Command}
+
+In its most simple application \vb|\stretchrel| can be used in the
+fashion of a \vb|\left\{| in math mode. While there is no reason to
+replace that more efficient usage supplied by \LaTeX{}, it is
+nonetheless instructional to see a comparison of
+\vb|$\left\{\blob\right.$| and \vb|$\stretchrel[550]{\{}{\blob}$|, to
+see how the aspect-ratio limiting option can be employed to avoid an
+overly stretched (narrow) manipulation:
+
+\rl$\left\{\blob\right.$ ~~~~~ $\stretchrel[550]{\{}{\blob}$
+
+The expression on the right uses a standard \{ character, which has
+ been vertically stretched, but limited to an aspect ratio no
+ narrower than 5.5.
+To use symbols for which the \vb|\left| nomenclature will not work,
+ \vb|\stretchrel| provides a viable alternative, as shown in this
+ stick-figure example:
+
+\vb|3m $\stretchrel[600]{\updownarrow\,}|\\
+\vb|{\fbox{\rule[-1.8em]{0ex}{4em}Work Table}}$|
+
+\rl3m $\stretchrel[600]{\updownarrow\,}
+ {\fbox{\rule[-1.8em]{0ex}{4em}Work Table}}$
+
+or in this use, \vb|$\stretchrel[350]{\int}{\blob} dx$|, of the
+stretched integral sign (aspect limited to 3.5):
+
+\rl$\stretchrel[350]{\int}{\blob} dx$
+
+
+\subsection{Baseline Shifts of \textit{Relative} Scales and Stretches}
+
+It was mentioned that when \vb|\scalerel| and \vb|\stretchrel| are
+employed, the manipulated object gets vertically shifted to match the
+extent of the reference object. To see how this works, we provide the
+following example, that employs some inline math and scaling.
+
+\rl\underline{The baseline is the line that runs under this text}
+\fbox{$\scalerel{i}{\blob}$}\underline{\scaleto{i}{35pt}}
+
+The first case of the large letter ``i'' was generated with
+ \vb|\scalerel|, and so the baseline of the ``i'', normally not a
+ descending letter, was dropped to conform to the descended reference
+ equation.
+All of this was set in an \vb|\fbox| to show the extent of
+ the objects.
+For comparison, an ``i'', scaled to 35pt, was then placed
+ using a \vb|\scaleto| command, which does not change the baseline of
+ the original object.
+
+\subsection{The $\backslash$\texttt{scaleto} and
+$\backslash$\texttt{stretchto} Commands}
+
+The \vb|\scaleto| and \vb|\stretchto| commands are comparable to the
+ \vb|\scalerel| and \vb|\stretchrel| commands, except they do not
+ accept a reference object as their second mandatory argument.
+Rather, they take an absolute height (\textit{i.e.}, height${}+{}$depth),
+ specified with units.
+These commands use the same optional arguments as \vb|\scalerel| and
+ \vb|\stretchrel| to constrain the width and/or the aspect ratio,
+ respectively, of the manipulated object.
+
+As was mentioned in the prior section, a difference between these and
+ the \textit{relative} scale/stretch commands is that an object's
+ baseline is not altered with the use of \vb|\scaleto| and
+ \vb|\stretchto|.
+Because there is no reference object employed with these commands,
+ there is no need for starred (\vb|*|) versions of these commands,
+ which would otherwise suppress the printing of the reference object.
+
+Examples follow the established pattern established in prior sections.
+First, we scale the equation blob used as an example in this
+documentation to a vertical extent of 80pt, preserving the original
+aspect ratio,
+
+\rl\vb|$\scaleto{\blob}{80pt}$ | $\scaleto{\blob}{80pt}$
+
+Below, we stretch the Greek letter, capital phi, to 60pt, but constrain
+the aspect ratio to no less than 1.75.
+
+\rl\vb|$\stretchto[175]{\Phi}{60pt}$ | $\stretchto[175]{\Phi}{80pt}$
+
+\subsection{The $\backslash$\texttt{scaleleftright} and
+ $\backslash$\texttt{stretchleftright}\\Commands}
+
+These commands are composites of several \vb|\scalerel| and
+\vb|\stretchrel| commands, intended to provide the functionality of
+the \vb|\left ...\right| syntax of mathmode, using symbols for which
+the \vb|\left ...\right| syntax does not work. It uses the same
+optional arguments as \vb|\scalerel| and \vb|\stretchrel| in order
+to limit the width or aspect ratio of the respective manipulated
+objects. If one of the symbols on the left or right end of the enclosed
+reference block is to be blank, these commands support the use of the
+period argument \vb|{.}| as a blank placeholder, in a fashion
+analogous to the \vb|\left ...\right| syntax of mathmode.
+
+\rl\vb|$\scaleleftright[3ex]{\prod}{\blob}{\coprod}$ |
+$\scaleleftright[3ex]{\prod}{\blob}{\coprod}$
+
+\rl\vb|$\stretchleftright[450]{.}{\blob}{\in}$ |
+$\stretchleftright[450]{.}{\blob}{\in}$
+
+\subsection{The $\backslash$\texttt{hstretch},
+ $\backslash$\texttt{vstretch}, and $\backslash$\texttt{scaleobj}
+ Commands}
+
+These commands simply perform horizontal or vertical stretching,
+respectively. They use a scale factor, rather than an absolute length.
+If the stretch factor is greater than 1, the stretched length is larger
+than the original. If less than one, it is compressed with respect to
+the original.
+
+\rl\vb|$\otimes\hstretch{3}{\otimes}\hstretch{0.5}{\otimes}$ |
+$\otimes\hstretch{3}{\otimes}\hstretch{0.5}{\otimes}$
+
+\rl\vb|$\otimes\vstretch{3}{\otimes}\vstretch{0.5}{\otimes}$ |
+$\otimes\vstretch{3}{\otimes}\vstretch{0.5}{\otimes}$
+
+The \vb|\scaleobj| command performs scaling in the fashion of a
+\vb|\scalebox| command, except that its argument is processed in math
+mode of the current math display style, by default. Thus, the
+difference between the following two invocations:
+\begin{verbatim}
+ \(\scaleobj{2}{\sum_{i=0}^{n}}\)
+ \[\scaleobj{2}{\sum_{i=0}^{n}}\]
+\end{verbatim}
+is given as
+\(\scaleobj{2}{\sum_{i=0}^{n}}\) versus
+\[\scaleobj{2}{\sum_{i=0}^{n}}\]
+
+\subsection{The \textbackslash\texttt{ThisStyle}, \textbackslash\texttt{SavedStyle},
+\textbackslash\texttt{LMex}, and \textbackslash\texttt{LMpt} Commands}
+
+These are very powerful macros that provide the ability to save the current
+math style and to import it to various places (for example, inside boxes and other
+macros) where the math style would otherwise be lost. These commands are
+part of this package because the various {\sr} macros employ them to
+automatically import the current math style into their arguments.
+
+The easiest way to show how these macros are used is to provide a working
+example, such as the one given below.
+
+\begin{verbatim}
+\documentclass{article}
+\usepackage{stackengine}
+\usepackage{graphicx}
+\usepackage{scalerel}
+\stackMath
+\def\ccdot{\scalebox{1.15}{$\SavedStyle\cdot$}}
+\def\altdiv{\mathbin{\ThisStyle{%
+ \stackunder[-.6\LMex]{%
+ \stackon[-.45\LMex]{\SavedStyle\sim}{\ccdot}%
+ }{\ccdot}}}}
+\begin{document}
+$A \altdiv B ~~A \div B$\par
+$\scriptstyle A \altdiv B ~~A \div B$\par
+$\scriptscriptstyle A \altdiv B ~~A \div B$\par
+\end{document}
+\end{verbatim}
+
+The output of this example shows a fabricated glyph (\verb|\altdiv|) across the
+math styles, comparing it to \verb|\div|:
+
+\stackMath
+\def\ccdot{\scalebox{1.15}{$\SavedStyle\cdot$}}
+\def\altdiv{\mathbin{\ThisStyle{%
+ \stackunder[-.6\LMex]{\stackon[-.45\LMex]{\SavedStyle\sim}{\ccdot}}{\ccdot}}}}
+\rl\scalebox{3}{\parbox{2in}{
+$A \altdiv B ~~A \div B$\par
+$\scriptstyle A \altdiv B ~~A \div B$\par
+$\scriptscriptstyle A \altdiv B ~~A \div B$\par
+}}
+
+The difficulties that must be overcome are several: the composite glyph is created by
+way of a stack, which processes its arguments in either text mode or \verb|\textstyle|
+math mode; and the stacking distances between the components of the composite
+glyph need to vary with the mathstyle. To overcome the first issue, the \verb|\altdiv|
+macro is wrapped in a \verb|\ThisStyle{...}| wrapper. Whenever one of the glyph
+components (\textit{e.g.}, \verb|\sim| or \verb|\cdot|) is employed within the
+\textsf{stackengine} where the mathstyle is
+otherwise lost, it is prepended with a \verb|\SavedStyle| to reinstate the current
+math style. Thus, the glyph components will present in the proper mathstyle.
+Likewise, the vertical stacking gaps between the glyph components,
+given as optional arguments to the stacking commands, are here specified in
+multiples of \verb|\LMex|. In this way, the stacking gaps will shrink with the
+smaller math styles, keeping the spacings on the same relative scale as the size
+of the smaller glyphs.
+
+\section{Real World Application}
+
+\subsection{White Curly Brackets}
+
+Ref: http://tex.stackexchange.com/questions/100966/defining-
+scalable-white- curly-brackets-and-and
+
+\newcommand*{\llbrace}{%
+ \BeginAccSupp{method=hex,unicode,ActualText=2983}%
+ \textnormal{\usefont{OMS}{lmr}{m}{n}\char102}%
+ \mathchoice{\mkern-4.05mu}{\mkern-4.05mu}{\mkern-4.3mu}{\mkern-4.8mu}%
+ \textnormal{\usefont{OMS}{lmr}{m}{n}\char106}%
+ \EndAccSupp{}%
+}
+\newcommand*{\rrbrace}{%
+ \BeginAccSupp{method=hex,unicode,ActualText=2984}%
+ \textnormal{\usefont{OMS}{lmr}{m}{n}\char106}%
+ \mathchoice{\mkern-4.05mu}{\mkern-4.05mu}{\mkern-4.3mu}{\mkern-4.8mu}%
+ \textnormal{\usefont{OMS}{lmr}{m}{n}\char103}%
+ \EndAccSupp{}%
+}
+
+A user defined two new symbols made by combining the font glyphs of a
+brace and a vertical strut, calling them \vb|\llbrace| and
+\vb|\rrbrace|, to look as follows around an argument (in this case
+$x$):
+
+\def\wbrace{\scalebox{5}{$\llbrace x\rrbrace$}}
+\rl\wbrace
+
+But they found that when represented in reduced size fonts, the symbol
+glyphs of the brace and the strut separated (note: \vb|\tiny| font has
+been scaled up to match prior figure's height):
+
+\def\tinywbrace{\scalebox{3}{\tiny$\llbrace x\rrbrace$}}
+\rl$\scalerel*{\tinywbrace}{\wbrace}$
+
+This happens because font designers don't merely scale their fonts when
+shrunk down in size, but they do things (like thickening up lines and
+changing aspect ratios) in an attempt to retain legibility. In this
+case, the font's auto-adjustment at smaller scale caused this composite
+representation to change in unacceptable ways.
+
+The \textsf{scalerel} solution was to use the image from the normal-size
+representation and to shrink it down as needed. So, in this case, a
+normal-sized copy of the braces were stored in boxes called
+\vb|\lXbrace| and \vb|\rXbrace|, resepctively. Then the following
+terms were defined:
+\begin{verbatim}
+\def\lxbrace{\scalerel*{\usebox{\lXbrace}}{\llbrace}}
+\def\rxbrace{\scalerel*{\usebox{\rXbrace}}{\rrbrace}}
+\end{verbatim}
+Now, in lieu of using \vb|\llbrace| directly, the use of
+\vb|\lxbrace| would take a copy of the normal-sized \vb|\lXbrace|
+and scale it down to the vertical height of the malformed tiny
+\vb|\llbrace|, and substitute for it. Here, we show the result at
+both normal size and tiny size:
+
+\newsavebox{\lXbrace}
+\savebox{\lXbrace}{$\llbrace$}
+\newsavebox{\rXbrace}
+\savebox{\rXbrace}{$\rrbrace$}
+\def\lxbrace{\scalerel*{\usebox{\lXbrace}}{\llbrace}}
+\def\rxbrace{\scalerel*{\usebox{\rXbrace}}{\rrbrace}}
+\rl$\scalerel*{\lxbrace x\rxbrace}{\wbrace}$
+{\tiny$\scalerel*{\lxbrace x\rxbrace}{\wbrace}$}
+
+Note that the brace is the properly formed scale of the normal-sized
+brace in both cases, even as the $x$ adjusts to the fontsize reduction.
+
+If one wanted the default braces narrower (to match the look of the
+comparable symbols in the literature), one could use
+\vb|\hstretch| in the definitions to achieve that quickly as
+\begin{verbatim}
+\def\lxbrace{%
+ \hstretch{0.6}{\scalerel*{\usebox{\lXbrace}}{\llbrace}}}
+\def\rxbrace{%
+ \hstretch{0.6}{\scalerel*{\usebox{\rXbrace}}{\rrbrace}}}
+\end{verbatim}
+
+to give the following
+
+\def\lxbrace{\hstretch{0.6}{\scalerel*{\usebox{\lXbrace}}{\llbrace}}}
+\def\rxbrace{\hstretch{0.6}{\scalerel*{\usebox{\rXbrace}}{\rrbrace}}}
+\rl$\scalerel*{\lxbrace x\rxbrace}{\wbrace}$
+{\tiny$\scalerel*{\lxbrace x\rxbrace}{\wbrace}$}
+
+Likewise, the \vb|\left| and \vb|\right| features of equation mode
+cannot be used with the white braces,
+
+\rl \(\llbrace \left\llbracket\left\{\left[(a) \cdot
+bc^{2^3}\right]^4\right\}^5\right\rrbracket \rrbrace\)
+
+but \textsf{scalerel} can fix that, too:
+
+\def\core{ \left\llbracket\left\{\left[(a) \cdot
+bc^{2^3}\right]^4\right\}^5\right\rrbracket}%
+\rl
+\(\scaleleftright[1.5ex]{\lxbrace}{\core}{\rxbrace}\)
+
+with
+\begin{verbatim}
+ \(\scaleleftright[1.5ex]{\lxbrace}{\core}{\rxbrace}\)
+\end{verbatim}
+where \vb|\core| is the core inner equation to which the white braces
+need to be scaled. In this case, the scaled white braces were
+width-limited to 1.5ex.
+
+\subsection{Extra-Wide Oversymbols}
+
+Ref:\\
+http://tex.stackexchange.com/questions/100574/really-wide-hat-symbol/101136\#101136
+
+There are many oversymbols defined to stand over a single-letter
+variable. There are a smaller number of extra-wide oversymbols to
+extend over small groups of symbols. Occasionally, however, a need
+arises for an oversymbol to stretch over a larger group of symbols.
+
+With these definitions,
+\begin{verbatim}
+\usepackage{scalerel,stackengine}
+
+\newcommand\reallywidehat[1]{\ensurestackMath{%
+\savestack{\tmpbox}{\stretchto{%
+ \scaleto{%
+ \scalerel*[\widthof{\ensuremath{#1}}]{\kern-.6pt\bigwedge\kern-.6pt}%
+ {\rule[-\textheight/2]{1ex}{\textheight}}%WIDTH-LIMITED BIG WEDGE
+ }{\textheight}%
+}{0.5ex}}%
+\stackon[1pt]{#1}{\tmpbox}%
+}}
+
+\newcommand\reallywideparen[1]{\ensurestackMath{%
+\savestack{\tmpbox}{\stretchto{%
+ \scaleto{%
+ \scalerel*[\widthof{\ensuremath{#1}}]{\kern-.6pt\frown\kern-.6pt}%
+ {\rule[-\textheight/2]{1ex}{\textheight}}%WIDTH-LIMITED BIG FROWN
+ }{\textheight}%
+}{0.9ex}}%
+\stackon[-.5pt]{#1}{\tmpbox}%
+}}
+\end{verbatim}
+arbitrarily wide oversymbols may be constructed:
+
+\newcommand\reallywidehat[1]{\ensurestackMath{%
+\savestack{\tmpbox}{\stretchto{%
+ \scaleto{%
+ \scalerel*[\widthof{\ensuremath{#1}}]{\kern-.6pt\bigwedge\kern-.6pt}%
+ {\rule[-\textheight/2]{1ex}{\textheight}}%WIDTH-LIMITED BIG WEDGE
+ }{\textheight}%
+}{0.5ex}}%
+\stackon[1pt]{#1}{\tmpbox}%
+}}
+
+\newcommand\reallywideparen[1]{\ensurestackMath{%
+\savestack{\tmpbox}{\stretchto{%
+ \scaleto{%
+ \scalerel*[\widthof{\ensuremath{#1}}]{\kern-.6pt\frown\kern-.6pt}%
+ {\rule[-\textheight/2]{1ex}{\textheight}}%WIDTH-LIMITED BIG FROWN
+ }{\textheight}%
+}{0.9ex}}%
+\stackon[-.5pt]{#1}{\tmpbox}%
+}}
+
+\rl
+$\reallywideparen{POQ}$ $+ \reallywidehat{QOR} + \reallywidehat{ROP}=
+2\pi r$
+
+\rl $\reallywidehat{zbcdefghijklm} \ne \reallywideparen{zbcdefghijklm}$
+
+\section{Future Development}
+
+It would be relatively straightforward to extend this approach to
+horizontal scaling problems. However, it is not exactly clear to the
+author what format is best suited for user needs. If he gets feedback
+in that regard, it will inform him how best to proceed.
+
+\section{Code Listing}
+
+\small\verbatiminput{scalerel.sty}
+
+\end{document}