summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/cancel/cancel.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/cancel/cancel.sty')
-rw-r--r--macros/latex/contrib/cancel/cancel.sty184
1 files changed, 184 insertions, 0 deletions
diff --git a/macros/latex/contrib/cancel/cancel.sty b/macros/latex/contrib/cancel/cancel.sty
new file mode 100644
index 0000000000..dbf2055da8
--- /dev/null
+++ b/macros/latex/contrib/cancel/cancel.sty
@@ -0,0 +1,184 @@
+% cancel.sty version 2.2 12-Apr-2013.
+% Donald Arseneau asnd@triumf.ca
+% This software is contributed to the public domain by its author,
+% who disclaims all copyrights. For people and jurisdictions that
+% do not recognize contribution to the public domain, this software
+% is licensed by the terms of the unlicense, <http://unlicense.org/>.
+%
+% Commands:
+% ~~~~~~~~~
+% \cancel draws a diagonal line (slash) through its argument.
+% \bcancel uses the negative slope (a backslash).
+% \xcancel draws an X (actually \cancel plus \bcancel).
+% \cancelto{<value>}{<expression>} draws a diagonal arrow through the
+% expression, pointing to the value.
+%
+% The first three work in math and text mode, but \cancelto is only
+% for math mode.
+% The slope of the line or arrow depends on what is being cancelled.
+%
+% Options:
+% ~~~~~~~~
+% By default, none of these commands affects the horizontal spacing,
+% so they might over-print neighboring parts of the formula (or text).
+% They do add their height to the expression, so there should never be
+% unintended vertical overlap. There is a package option [makeroom] to
+% increase the horizontal spacing to make room for the cancellation value.
+%
+% If you use the color package, then you can declare
+% \renewcommand{\CancelColor}{<color_command>}
+% and the cancellation marks will be printed in that color (e.g., \blue).
+% However, if you are using color, I recommend lightly shaded blocks rather
+% than diagonal arrows for cancelling.
+%
+% The option [thicklines] asks for heavier lines and arrows. This may be
+% useful when the lines are colored a light shade.
+%
+% The size (math style) of the \cancelto value depends on package options
+% according to this table:
+%
+% Current style [samesize] [smaller] [Smaller]
+% ------------- ---------------- ---------------- ----------------
+% \displaystyle \displaystyle \textstyle \scriptstyle
+% \textstyle \textstyle \scriptstyle \scriptstyle
+% \scriptstyle \scriptstyle \scriptscriptstyle \scriptscriptstyle
+% \scriptscriptstyle \scriptscriptstyle \scriptscriptstyle \scriptscriptstyle
+%
+% ("smaller" is the default behavior. It gives textstyle limits in
+% displaystyle, whereas "Smaller" gives scriptstyle limits.)
+%
+% This package is provided without guarantees or support. Drawing slashes
+% through math to indicate "cancellation" is poor design. I don't recommend
+% that you use this package at all.
+
+\ProvidesPackage{cancel}[2013/04/12 v2.2 Cancel math terms]
+
+\newcommand{\CancelColor}{}
+\newcommand{\cancelto}{1}% default option = smaller
+\let\canto@fil\hidewidth
+\let\canc@thinlines\thinlines
+
+\DeclareOption{samesize}{\def\cancelto{999}}
+\DeclareOption{smaller}{\def\cancelto{1}}
+\DeclareOption{Smaller}{\def\cancelto{0}}
+\DeclareOption{makeroom}{\def\canto@fil{\hfil}}
+\DeclareOption{overlap}{\let\canto@fil\hidewidth}
+\DeclareOption{thicklines}{\let\canc@thinlines\thicklines}
+
+\ProcessOptions
+
+\DeclareRobustCommand\cancel[1]{\ifmmode
+ \mathpalette{\@cancel{\@can@slash{}}}{#1}\else
+ \@cancel{\@can@slash{}}\hbox{#1}\fi}
+\DeclareRobustCommand\bcancel[1]{\ifmmode
+ \mathpalette{\@cancel{\@can@slash{-}}}{#1}\else
+ \@cancel{\@can@slash{-}}\hbox{#1}\fi}
+\DeclareRobustCommand\xcancel[1]{\ifmmode
+ \mathpalette{\@cancel{\@can@slash{+}\@can@slash{-}}}{#1}\else
+ \@cancel{\@can@slash{+}\@can@slash{-}}\hbox{#1}\fi}
+
+\newcommand\@cancel[3]{%
+\OriginalPictureCmds\@begin@tempboxa\hbox{\m@th$#2{#3}$}%
+\dimen@\height
+\setbox\@tempboxa\hbox{$\m@th\vcenter{\box\@tempboxa}$}%
+\advance\dimen@-\height % the difference in height
+\unitlength\p@ \canc@thinlines
+{\/\raise\dimen@\hbox{\ooalign{#1\hfil\box\@tempboxa\hfil \cr}}}%
+\@end@tempboxa
+}
+
+\def\@can@slash#1{\canto@fil$\m@th \CancelColor\vcenter{\hbox{%
+\dimen@\width \@min@pt\dimen@ 2\@min@pt\totalheight6%
+\ifdim\totalheight<\dimen@ % wide
+ \@min@pt\dimen@ 8%
+ \@tempcnta\totalheight \multiply\@tempcnta 5 \divide\@tempcnta\dimen@
+ \advance\dimen@ 2\p@ % "+2"
+ \edef\@tempa{(\ifcase\@tempcnta 6,#11\or 4,#11\or 2,#11\or 4,#13\else 1,#11\fi
+ ){\strip@pt\dimen@}}%
+\else % tall
+ \@min@pt\totalheight8%
+ \advance\totalheight2\p@ % "+2"
+ \@tempcnta\dimen@ \multiply\@tempcnta 5 \divide\@tempcnta\totalheight
+ \dimen@ \ifcase\@tempcnta .16\or .25\or .5\or .75\else 1\fi \totalheight
+ \edef\@tempa{(\ifcase\@tempcnta 1,#16\or 1,#14\or 1,#12\or 3,#14\else 1,#11\fi
+ ){\strip@pt\dimen@}}%
+\fi
+\expandafter\line\@tempa}}$\canto@fil \cr}
+
+\ifcase\cancelto
+ \def\cancelto#1#2{\mathchoice % Smaller option
+ {\@cancelto\scriptstyle{#1}\displaystyle{#2}}%
+ {\@cancelto\scriptstyle{#1}\textstyle{#2}}%
+ {\@cancelto\scriptscriptstyle{#1}\scriptstyle{#2}}%
+ {\@cancelto\scriptscriptstyle{#1}\scriptscriptstyle{#2}}%
+ }
+\or
+ \def\cancelto#1#2{\mathchoice % smaller option (default)
+ {\@cancelto\textstyle{#1}\displaystyle{#2}}%
+ {\@cancelto\scriptstyle{#1}\textstyle{#2}}%
+ {\@cancelto\scriptscriptstyle{#1}\scriptstyle{#2}}%
+ {\@cancelto\scriptscriptstyle{#1}\scriptscriptstyle{#2}}%
+ }
+\else
+ \def\cancelto#1#2{\mathchoice % samesize option
+ {\@cancelto\textstyle{#1}\displaystyle{#2}}%
+ {\@cancelto\textstyle{#1}\textstyle{#2}}%
+ {\@cancelto\scriptstyle{#1}\scriptstyle{#2}}%
+ {\@cancelto\scriptscriptstyle{#1}\scriptscriptstyle{#2}}%
+ }
+\fi
+
+\newcommand\@cancelto[4]{%
+\OriginalPictureCmds\@begin@tempboxa\hbox{\m@th$#3{#4}$}%
+\dimen@\width % wide
+\@min@pt\dimen@ 2\@min@pt\totalheight4
+\ifdim\totalheight<\dimen@
+ \@tempcnta\totalheight \multiply\@tempcnta 5 \divide\@tempcnta\dimen@
+ \@tempdimb 3\p@ % extra width for arrowhead ("+2")
+ \advance\dimen@ \ifcase\@tempcnta 5\or 5\or 4\or 3\else 2\fi \p@
+ \@min@pt\dimen@9\advance\dimen@\p@
+ \edef\@tempa{\ifcase\@tempcnta 5441\or 5441\or 5421\or 4443\else 3611\fi
+ {\strip@pt\dimen@}{\strip@pt\@tempdimb}}%
+ \def\@tempb{Cancel #4 to #2; case wide }%
+\else % tall
+ \advance\totalheight3\p@ % "+2"
+ \@tempcnta\dimen@ \multiply\@tempcnta 5 \divide\@tempcnta\totalheight
+ \advance\totalheight3\p@ % "+2"
+ \dimen@ \ifcase\@tempcnta .25\or .25\or .5\or .75\else 1\fi \totalheight
+ \@tempdimb \ifcase\@tempcnta .8\or .8\or 1.2\or 1.5\else 2\fi \p@
+ \edef\@tempa{\ifcase\@tempcnta 0814\or 0814\or 1812\or 2734\else 3611\fi
+ {\strip@pt\dimen@}{\strip@pt\@tempdimb}}%
+\fi
+\dimen@\height
+\setbox\@tempboxa\hbox{$\m@th\vcenter{\box\@tempboxa}$}%
+\advance\dimen@-\height % the difference in height
+\unitlength\p@ \canc@thinlines
+{\/\raise\dimen@\hbox{\expandafter\canto@vector\@tempa{#1}{#2}}}%
+\@end@tempboxa
+}
+
+% #1, #2 offset of label #6 extra width to clear arrowhead
+% #3, #4 vector direction #7 superscript label style
+% #5 vector width #8 superscript label
+\def\canto@vector#1#2#3#4#5#6#7#8{%
+ \dimen@.5\p@
+ \setbox\z@\vbox{\boxmaxdepth.5\p@
+ \hbox{\kern-1.2\p@\kern#1\dimen@$#7{#8}\m@th$}}%
+ \ifx\canto@fil\hidewidth \wd\z@\z@ \else \kern-#6\unitlength \fi
+ \ooalign{%
+ \canto@fil$\m@th \CancelColor
+ \vcenter{\hbox{\dimen@#6\unitlength \kern\dimen@
+ \multiply\dimen@#4\divide\dimen@#3 \vrule\@depth\dimen@\@width\z@
+ \vector(#3,#4){#5}%
+ }}^{\raise#2\dimen@\copy\z@\kern-\scriptspace}$%
+ \canto@fil \cr
+ \hfil \box\@tempboxa \kern\wd\z@ \hfil \cr}}
+
+\def\@min@pt#1#2{\ifdim#1<#2\p@ #1#2\p@ \relax\fi}
+
+% pict2e removes bounding box from line and vector, so use original
+% versions by declaring \OriginalPictureCmds; make it a no-op if undefined
+
+\@ifundefined{OriginalPictureCmds}{\let\OriginalPictureCmds\relax}{}
+
+% Sometime maybe find a better solution that uses all slopes with pict2e