summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/abraces/abraces.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/abraces/abraces.sty')
-rw-r--r--macros/latex/contrib/abraces/abraces.sty460
1 files changed, 350 insertions, 110 deletions
diff --git a/macros/latex/contrib/abraces/abraces.sty b/macros/latex/contrib/abraces/abraces.sty
index 768afbb3cd..68dbc7e8eb 100644
--- a/macros/latex/contrib/abraces/abraces.sty
+++ b/macros/latex/contrib/abraces/abraces.sty
@@ -1,111 +1,351 @@
-\ProvidesPackage{abraces}% http://ctan.org/pkg/abraces
- [2012/08/24 v1.0 Arbitrary and asymmetric braces]
-\newif\if@overload
-\DeclareOption{overload}{\@overloadtrue}
-\ProcessOptions
-\newsavebox{\bracebox}% stores content contained under/over brace
-
-\newcommand{\newbracespec}[2]{% Add a new brace specification based on existing ones
- \@defbracecharcode{#1}{\@genbrace#2\@nnil\@genbrace}
-}
-% Brace components
-\newcommand{\bracescript}[1]{{% Add a script above/below an over-/underbrace
- \let\@@bfil\@@bunfil% Make line leaders into void/empty leaders
- \let\@use@rl@se\phantom% Phantomize some brace components
- \makebox[\wd\bracebox]{$\genbrace{#1}$}% Place the text in a box of width \bracebox
-}}
-\def\@@bunfil{\leaders\hbox{\ }\hfill}% Empty filler
-\newcommand{\bracefil}[1]{%
- \csname brace@char@#1'\endcsname%
-}
-\def\@@bfil{\leaders \vrule \@height \ht\z@ \@depth \z@ \hfill}% default brace filler
-%\def\bfil{\@@bfil}%
-%\def\@bLfil{\@@bfil}% left leader filler
-%\def\@bRfil{\@@bfil}% right leader filler
-\def\aupbracefill#1{$\m@th\setbox\z@\hbox{$\braceld$}\genbrace{#1}$}
-\def\adownbracefill#1{$\m@th\setbox\z@\hbox{$\braceld$}\genbrace{#1}$}
-
-% Repetition structure. Reference:
-% Repeat command n times?
-% http://tex.stackexchange.com/q/16189/5764
-% Alternatively
-% \RequirePackage{expl3}% http://ctan.org/pkg/expl3
-% \ExplSyntaxOn
-% \cs_new_eq:NN \Repeat \prg_replicate:nn
-% \ExplSyntaxOff
-
-\newcommand{\Repeat}[1]{%
- \expandafter\@Repeat\expandafter{\the\numexpr #1\relax}%
-}
-\def\@Repeat#1{%
- \ifnum#1>0
- \expandafter\@@Repeat\expandafter{\the\numexpr #1-1\expandafter\relax\expandafter}%
- \else
- \expandafter\@gobble
- \fi
-}
-\def\@@Repeat#1#2{%
- \@Repeat{#1}{#2}#2%
-}
-% Taken from mathtools package (http://ctan.org/pkg/mathtools)
-\newcommand{\aunderbrace}[2][l1D1r]{%
- \begin{lrbox}{\bracebox}$\displaystyle{#2}$\end{lrbox}%
- \mathop{\vtop{\m@th\ialign{##\crcr
- $\hfil\displaystyle{#2}\hfil$\crcr
- \noalign{\kern.7\fontdimen5\textfont2\nointerlineskip}%
- \aupbracefill{#1}\crcr\noalign{\kern.5\fontdimen5\textfont2}}}}\limits}
-\newcommand{\aoverbrace}[2][L1U1R]{%
- \begin{lrbox}{\bracebox}$\displaystyle{#2}$\end{lrbox}%
- \mathop{\vbox{\m@th\ialign{##\crcr
- \noalign{\kern.5\fontdimen5\textfont2}%
- \adownbracefill{#1}\crcr
- \noalign{\kern.7\fontdimen5\textfont2\nointerlineskip}%
- $\hfil\displaystyle{#2}\hfil$\crcr}}}\limits}
-
-% Parsing structure. Reference:
-% Parsing a macro argument character-by-character for conditional execution
-% http://tex.stackexchange.com/q/33197/5764
-
-\let\@use@rl@se\relax
-\def\@defbracecharcode#1{% Macro to define brace character "codes"
- \@namedef{brace@char@#1}%
-}
-\@defbracecharcode{L}{\@use@rl@se\braceld\@genbrace}% Left down
-\@defbracecharcode{R}{\@use@rl@se\bracerd\@genbrace}% Right down
-\@defbracecharcode{l}{\@use@rl@se\bracelu\@genbrace}% Left up
-\@defbracecharcode{r}{\@use@rl@se\braceru\@genbrace}% Right up
-\@defbracecharcode{U}{\@use@rl@se\braceru\@use@rl@se\bracelu\@genbrace}% Tip up
-\@defbracecharcode{D}{\@use@rl@se\bracerd\@use@rl@se\braceld\@genbrace}% Tip down
-\@defbracecharcode{0}{\@@bunfil\@genbrace}% Do nothing
-\@defbracecharcode{1}{\@@bfil\@genbrace}% 1 filler
-\@defbracecharcode{2}{\@@bfil\@@bfil\@genbrace}% 2 fillers
-\@defbracecharcode{3}{\@@bfil\@@bfil\@@bfil\@genbrace}% 3 fillers
-\@defbracecharcode{4}{\@@bfil\@@bfil\@@bfil\@@bfil\@genbrace}% 4 fillers
-\@defbracecharcode{5}{\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@genbrace}% 5 fillers
-\@defbracecharcode{6}{\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@genbrace}% 6 fillers
-\@defbracecharcode{7}{\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@genbrace}% 7 fillers
-\@defbracecharcode{8}{\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@genbrace}% 8 fillers
-\@defbracecharcode{9}{\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@genbrace}% 9 fillers
-\@defbracecharcode{@}{\@firstofone@go}% Insert arbitrary stuff
-\@defbracecharcode{!}{\@firstofone@len}% Insert a leader of specific length
-\@defbracecharcode{*}{\@repeat@num@times}% Repeat stuff a number of times
-
-\newcommand{\@firstofone@go}[1]{#1\@genbrace}%
-\newcommand{\@firstofone@len}[1]{\hb@xt@#1{\@@bfil}\@genbrace}%
-\newcommand{\@repeat@num@times}[2]{\Repeat{#1}{\@genbrace#2\@nnil}\@genbrace}%
-
-\newcommand{\@genbrace}[1]{%
- \ifx\@nnil#1\relax\else
- \@nameuse{brace@char@#1\expandafter}%
- \fi%
-}
-\newcommand{\genbrace}[1]{%
- \@genbrace#1\@nnil%
-}
-
-% If package was loaded with \usepackage[overload]{abraces}
-\if@overload
- \let\overbrace\aoverbrace
- \let\underbrace\aunderbrace
-\fi
+%% abraces.sty
+%% Copyright 2021 Werner Grundlingh
+%
+% 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.3 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 Werner Grundlingh.
+%
+% This work consists of the file abraces.sty.
+
+\ProvidesPackage{abraces}% http://ctan.org/pkg/abraces
+ [2021/03/31 v2.0 Arbitrary and asymmetric braces]
+
+\RequirePackage{xparse}
+
+\newif\if@overload
+\DeclareOption{overload}{\@overloadtrue}
+\ProcessOptions
+\newsavebox{\bracebox}% stores content contained under/over brace
+
+\newcommand{\newbracespec}[2]{% Add a new brace specification based on existing ones
+ \@defbracecharcode{#1}{\@genbrace#2\@nnil\@genbrace}
+}
+% Brace components
+\newcommand{\bracescript}[1]{{% Add a script above/below an over-/underbrace
+ \let\@@bfil\@@bunfil% Make line leaders into void/empty leaders
+ \let\@use@rl@se\phantom% Phantomize some brace components
+ \makebox[\wd\bracebox]{$\genbrace{#1}$}% Place the text in a box of width \bracebox
+}}
+\def\@@bunfil{\leaders\hbox{\ }\hfill}% Empty filler
+\newcommand{\bracefil}[1]{%
+ \csname brace@char@#1'\endcsname%
+}
+\def\@@bfil{\leaders \vrule \@height \ht\z@ \@depth \z@ \hfill}% default brace filler
+%\def\bfil{\@@bfil}%
+%\def\@bLfil{\@@bfil}% left leader filler
+%\def\@bRfil{\@@bfil}% right leader filler
+\def\aupbracefill#1{$\m@th\setbox\z@\hbox{$\braceld$}\genbrace{#1}$}
+\def\adownbracefill#1{$\m@th\setbox\z@\hbox{$\braceld$}\genbrace{#1}$}
+
+\DeclareDocumentCommand{\downbracketend}{ O{.7\fontdimen5\textfont2} }{%
+ \@use@rl@se
+ {\sbox\z@{$\braceld$}%
+ \dimen@\ht\z@ \advance\dimen@#1\relax
+ \vrule \@width\ht\z@ \@height\ht\z@ \@depth\dimexpr\dimen@-\ht\z@}%
+ \@genbrace}
+
+\DeclareDocumentCommand{\upbracketend}{ O{.7\fontdimen5\textfont2} }{%
+ \@use@rl@se
+ {\sbox\z@{$\bracelu$}%
+ \dimen@\ht\z@ \advance\dimen@#1\relax
+ \vrule \@width\ht\z@ \@height\dimen@ \@depth\z@}%
+ \@genbrace}
+
+% Repetition structure. Reference:
+% Repeat command n times?
+% http://tex.stackexchange.com/q/16189/5764
+\ExplSyntaxOn
+\cs_new_eq:NN \Repeat \prg_replicate:nn
+%FMi
+\cs_new_eq:NN \TrimArgSpaces \tl_trim_spaces:n % only needed when ^{...} should be text
+%FMi
+\ExplSyntaxOff
+
+% Taken from mathtools package (http://ctan.org/pkg/mathtools)
+\DeclareDocumentCommand{\aunderbrace}{ O{l1D1r} m o e{^_}}{%
+ \begin{lrbox}{\bracebox}$\displaystyle{#2}$\end{lrbox}%
+ \mathop{\vtop{\m@th\ialign{##\crcr
+ $\hfil\displaystyle{#2}\hfil$\crcr
+ \noalign{\kern.7\fontdimen5\textfont2\nointerlineskip}%
+ \aupbracefill{#1}\crcr\noalign{\kern.5\fontdimen5\textfont2}}}}\limits
+ % ...there was a ^:
+ \IfValueT{#4}{%
+ ^{%
+%FMi
+ \gdef\@abrace@text@arg{#4}% % save argument then split of portions later
+%FMi
+ \@defbracecharcode{A}{%
+ \@use@rl@se\braceru
+ \makebox[0pt][c]{\scriptsize
+%FMi % split off next part
+ \expandafter\@abrace@next@text\@abrace@text@arg&\@abrace@next@text}%
+%FMi
+ \@use@rl@se\bracelu\@genbrace
+ }%
+ % We interpret U as A
+ \let\brace@char@U\brace@char@A
+%FMi
+ \let\@abrace@stuff\phantom % render @{...} harmless
+%FMi
+ % Use the normal spec by default
+ \IfValueTF{#3}
+ {\bracescript{#3}}% Use newly-specified spec
+ {\bracescript{#1}}% Use default spec
+%FMi
+ \@abrace@is@arg@fully@used{^}{U}%
+%FMi
+ }%
+ }%
+ % ...there was a _:
+ \IfValueT{#5}{%
+ _{%
+%FMi
+ \gdef\@abrace@text@arg{#5}%
+%FMi
+ \@defbracecharcode{A}{%
+ \@use@rl@se\bracerd
+ \makebox[0pt][c]{%
+ \scriptsize % not needed if processed in math
+%FMi
+ \expandafter\@abrace@next@text\@abrace@text@arg&\@abrace@next@text}%
+%FMi
+ \@use@rl@se\braceld\@genbrace
+ }%
+ % We interpret D as A
+ \let\brace@char@D\brace@char@A
+%FMi
+ \let\@abrace@stuff\phantom % render @{...} harmless
+%FMi
+ % Use the normal spec by default
+ \IfValueTF{#3}
+ {\bracescript{#3}}% Use the newly-specified spec
+ {\bracescript{#1}}% Use the default spec
+%FMi
+ \@abrace@is@arg@fully@used{_}{D}%
+%FMi
+ }%
+ }%
+%FMi
+% If there is a second optional argument (#3) but there is neither
+% a ^{..} nor a _{..} then interpret the bracket group was not an optional argument
+% but actually belongs to the current formula, so return it.
+% Order of the test is #3 #5 #4 because an overbrace is more likely to have ^{..}.
+% For underbrace it is #3 #4 #5.
+ \IfValueT{#3}{\IfValueF{#5}{\IfValueF{#4}{[#3]}}}%
+%FMi
+}
+
+%\RequirePackage{unravel}
+
+%FMi
+\def\@abrace@next@text#1&#2\@abrace@next@text{%
+ \gdef\@abrace@text@arg{#2}%
+ % \TrimArgSpaces{#1}% % text solution
+ $\scriptstyle #1$% % use math mode instead? I think so
+}
+%FMi
+
+
+
+%FMi
+% check if current value of \@abrace@text@arg contains parts that haven't been used.
+%
+% Possible cases: (a) empty (b) one or more & symbols (c) some & symbol(s) and other stuff
+%
+% (c) is the case we need to generate an error for.
+
+
+\def\@abrace@is@arg@fully@used#1#2{%
+ \edef\abrace@tempa{\detokenize{#1}}% _ or ^
+ \def\abrace@tempb{#2}% % D or U
+ \let\abrace@next\@abrace@is@arg@fully@used@
+ \expandafter\@abrace@is@arg@fully@used@ \@abrace@text@arg \@nil &%
+}
+
+% As we know that here is at least \verb=\@nil &= in the stream ahead
+% we can grep one argument delimited by \verb=&= and then check if it
+% is empty (case (a) or (b)), if it is \verb=\@nil= (we are done) or
+% if it is anything else (case (c)).
+
+
+\def\@abrace@is@arg@fully@used@ #1&{%
+ \def\@abrace@text@arg{#1}%
+ \ifx\@abrace@text@arg\@empty % ok case
+ \else
+ \ifx\@abrace@text@arg\@nnil % we are done
+ \let\abrace@next\relax
+ \else
+ \PackageError{abraces}{Unused part in \abrace@tempa{...}:\MessageBreak
+ '\detokenize{#1}' dropped}%
+ {There have been more \string& symbols than
+ \abrace@tempb\space or A elements in the pattern.
+ Check your source!}%
+ \fi
+ \fi
+ \abrace@next
+}
+%FMi
+
+
+
+\DeclareDocumentCommand{\aoverbrace}{ O{L1U1R} m o e{^_}}{%
+%
+% \typeout{Arguments: \detokenize{1=#1|2=#2|3=#3|4=#4|5=#5|}}%
+%
+ \begin{lrbox}{\bracebox}$\displaystyle{#2}$\end{lrbox}%
+ \mathop{\vbox{\m@th\ialign{##\crcr
+ \noalign{\kern.5\fontdimen5\textfont2}%
+ \adownbracefill{#1}\crcr
+ \noalign{\kern.7\fontdimen5\textfont2\nointerlineskip}%
+ $\hfil\displaystyle{#2}\hfil$\crcr}}}\limits
+ % ...there was a ^:
+ \IfValueT{#4}{%
+ ^{%
+ % Define a text point instead of a tip
+%FMi
+ \gdef\@abrace@text@arg{#4}% % save argument then split of portions later
+%FMi
+ \@defbracecharcode{A}{%
+ \@use@rl@se\braceru
+ \makebox[0pt][c]{\scriptsize
+%FMi % split off next part
+ \expandafter\@abrace@next@text\@abrace@text@arg&\@abrace@next@text}%
+%FMi
+ \@use@rl@se\bracelu\@genbrace
+ }%
+ % We interpret U as A
+ \let\brace@char@U\brace@char@A
+ % Use the normal spec by default
+%FMi
+ \let\@abrace@stuff\phantom % render @{...} harmless
+%FMi
+ \IfValueTF{#3}
+ {\bracescript{#3}}% Use newly-specified spec
+ {\bracescript{#1}}% Use default spec
+%FMi
+ \@abrace@is@arg@fully@used{^}{U}%
+%FMi
+ }%
+ }%
+ % ...there was a _:
+ \IfValueT{#5}{%
+ _{%
+ % Define a text point instead of a tip
+%FMi
+ \gdef\@abrace@text@arg{#5}%
+%FMi
+ \@defbracecharcode{A}{%
+ \@use@rl@se\bracerd
+ \makebox[0pt][c]{%
+ \scriptsize % not needed if processed in math
+ %FMi
+ \expandafter\@abrace@next@text\@abrace@text@arg&\@abrace@next@text
+ }%
+%FMi
+ \@use@rl@se\braceld\@genbrace
+ }%
+ % We interpret D as A
+ \let\brace@char@D\brace@char@A
+%FMi
+ \let\@abrace@stuff\phantom % render @{...} harmless
+%FMi
+ % Use the normal spec by default
+ \IfValueTF{#3}
+ {\bracescript{#3}}% Use the newly-specified spec
+ {\bracescript{#1}}% Use the default spec
+%FMi
+ \@abrace@is@arg@fully@used{_}{D}%
+%FMi
+ }%
+ }%
+%FMi
+ \IfValueT{#3}{\IfValueF{#4}{\IfValueF{#5}{[#3]}}}%
+%FMi
+}
+
+% Parsing structure. Reference:
+% Parsing a macro argument character-by-character for conditional execution
+% http://tex.stackexchange.com/q/33197/5764
+
+\let\@use@rl@se\relax
+\def\@defbracecharcode#1{% Macro to define brace character "codes"
+ \@namedef{brace@char@#1}%
+}
+\@defbracecharcode{L}{\@use@rl@se\braceld\@genbrace}% Left down
+\@defbracecharcode{R}{\@use@rl@se\bracerd\@genbrace}% Right down
+\@defbracecharcode{l}{\@use@rl@se\bracelu\@genbrace}% Left up
+\@defbracecharcode{r}{\@use@rl@se\braceru\@genbrace}% Right up
+\@defbracecharcode{U}{\@use@rl@se\braceru\@use@rl@se\bracelu\@genbrace}% Tip up
+\@defbracecharcode{D}{\@use@rl@se\bracerd\@use@rl@se\braceld\@genbrace}% Tip down
+\@defbracecharcode{0}{\@@bunfil\@genbrace}% Do nothing
+\@defbracecharcode{1}{\@@bfil\@genbrace}% 1 filler
+\@defbracecharcode{2}{\@@bfil\@@bfil\@genbrace}% 2 fillers
+\@defbracecharcode{3}{\@@bfil\@@bfil\@@bfil\@genbrace}% 3 fillers
+\@defbracecharcode{4}{\@@bfil\@@bfil\@@bfil\@@bfil\@genbrace}% 4 fillers
+\@defbracecharcode{5}{\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@genbrace}% 5 fillers
+\@defbracecharcode{6}{\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@genbrace}% 6 fillers
+\@defbracecharcode{7}{\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@genbrace}% 7 fillers
+\@defbracecharcode{8}{\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@genbrace}% 8 fillers
+\@defbracecharcode{9}{\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@@bfil\@genbrace}% 9 fillers
+\@defbracecharcode{@}{\@firstofone@go}% Insert arbitrary stuff
+\@defbracecharcode{!}{\@firstofone@len}% Insert a leader of specific length
+\@defbracecharcode{*}{\@repeat@num@times}% Repeat stuff a number of times
+\@defbracecharcode{,}{\downbracketend}% Downward bracket end
+\@defbracecharcode{'}{\upbracketend}% Upward bracket end
+
+
+%FMi
+%like U or D (same width) but a straight line marking a possible anchor point for annotation material
+% can be used in patterns, e.g., $\aunderbrace[3A1]{a+b+c+d}_{x}$ makes a an underline rule with
+% the "x" being placed off center
+
+\@defbracecharcode{A}{%
+ \setbox\z@\hbox{$\m@th\braceru\bracelu$}%
+ \hb@xt@\wd\z@{\@@bfil}%
+ \@genbrace}%
+
+%FMi
+
+
+\newcommand{\bracecolor}[1]{\xdef\bracecolor@{\noexpand\color{#1}}\aftergroup\bracecolor@}
+%FMi
+\let\bracecolor\color % no longer needed
+%\newcommand{\@firstofone@go}[1]{\mathord{#1}\@genbrace}%
+\let\@abrace@stuff\@firstofone
+\newcommand{\@firstofone@go}[1]{\mathord{}\@abrace@stuff{#1}\mathord{}\@genbrace}%
+%FMi
+%\newcommand{\@firstofone@go}[1]{#1\@genbrace}%
+\newcommand{\@firstofone@len}[1]{\hb@xt@#1{\@@bfil}\@genbrace}%
+\newcommand{\@repeat@num@times}[2]{\Repeat{#1}{\@genbrace#2\@nnil}\@genbrace}%
+
+\newcommand{\@genbrace}[1]{%
+ \ifx\@nnil#1\relax\else
+%FMi
+ \expandafter\ifx\csname brace@char@#1\endcsname\relax
+ \PackageError{abraces}{Brace pattern '#1' unknown}%
+ {I'll use '0' instead.}%
+ \csname brace@char@0\expandafter\expandafter\expandafter\endcsname
+ \else
+ \csname brace@char@#1\expandafter\expandafter\expandafter\endcsname
+ \fi
+%FMi
+ \fi
+}
+\newcommand{\genbrace}[1]{%
+ \@genbrace#1\@nnil%
+}
+
+% If package was loaded with \usepackage[overload]{abraces}
+\if@overload
+ \let\overbrace\aoverbrace
+ \let\underbrace\aunderbrace
+\fi
\endinput \ No newline at end of file