+% \subsection{Bracketty notation}
+%
+% This is mostly an exercise in keeping track of data structures. Which is a
+% problem, because \TeX\ isn't really very good at data structures. Our main
+% trick is Church-encoded tuples; i.e., we represent a collection of things
+% as a higher-order function which applies a given projection to the tuple.
+%
+% \begin{macro}{\brk@delim}
+% \begin{macro}{\brk@plain}
+% \begin{macro}{\brk@size}
+% A delimiter keeps track of a before-string, a plain-text delimiter, a sized
+% delimiter, and an after-string. Rather than just projecting components, we
+% we want to typeset the things, so we provide two macros for doing this: one
+% typesets the plain version (possibly with a prefix), and the other applies
+% a size to the sized delimiter.
+% \begin{macrocode}
+\def\brk@delim#1#2#3#4#5{#5{#1}{#2}{#3}{#4}}
+\def\brk@plain#1#2#3#4#5{#2#1#3#5}
+\def\brk@size#1#2#3#4#5{#2#1#4#5}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\brk@bbigg}
+% Before we get really stuck in, here's a quick macro to collect a |\bbigg|
+% argument and pass it to its continuation.
+% \begin{macrocode}
+\def\brk@bbigg#1{\@testopt{\brk@bbigg@{#1}}\z@}
+\def\brk@bbigg@#1[#2]#3{#1{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\brk@lefttwo}
+% \begin{macro}{\brk@righttwo}
+% We now begin the two-delimiter machinery proper. The macro |\defbrk| will
+% package up the delimiters in a macro. The following two projections pick
+% out the left and right delimiters and apply them to their argument.
+% \begin{macrocode}
+\def\brk@lefttwo#1#2#3{#2{#1}}
+\def\brk@righttwo#1#2#3{#3{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\brk@plaintwo}
+% \begin{macro}{\brk@sizetwo}
+% The next stage is to typeset a full delimited expression, which is what we
+% do here.
+% \begin{macrocode}
+\def\brk@plaintwo#1#2%
+ {#1{\brk@lefttwo{\brk@plain{}}}#2#1{\brk@righttwo{\brk@plain{}}}}
+\def\brk@sizetwo#1#2#3#4%
+ {#3{\brk@lefttwo{\brk@size{#1}}}#4#3{\brk@righttwo{\brk@size{#2}}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\brk@maintwo}
+% \begin{macro}{\brk@bigtwo}
+% \begin{macro}{\brk@Bigtwo}
+% \begin{macro}{\brk@biggtwo}
+% \begin{macro}{\brk@Biggtwo}
+% \begin{macro}{\brk@bbiggtwo}
+% \begin{macro}{\brk@auto}
+% And finally, the top-level handlers for two-delimiter bracket-notation
+% macros.
+% \begin{macrocode}
+\def\brk@maintwo#1{\@ifnextchar[{\brk@maintwo@size#1}{\brk@plaintwo#1}}
+\def\brk@maintwo@size#1[#2][#3]{\brk@sizetwo{#2}{#3}#1}
+\def\brk@bigtwo{\brk@sizetwo\bigl\bigr}
+\def\brk@Bigtwo{\brk@sizetwo\Bigl\Bigr}
+\def\brk@biggtwo{\brk@sizetwo\biggl\biggr}
+\def\brk@Biggtwo{\brk@sizetwo\Biggl\Biggr}
+\def\brk@bbiggtwo#1{\brk@bbigg{\brk@bbiggtwo@#1}}
+\def\brk@bbiggtwo@#1#2{\brk@sizetwo{\bbiggl#1{#2}}{\bbiggr#1{#2}}}
+\def\brk@auto{\brk@sizetwo\left\right}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\brk@leftthree}
+% \begin{macro}{\brk@midthree}
+% \begin{macro}{\brk@rightthree}
+% \begin{macro}{\brk@plainthree}
+% \begin{macro}{\brk@sizethree}
+% Next, the three-delimiter projections.
+% \begin{macrocode}
+\def\brk@leftthree#1#2#3#4{#2{#1}}
+\def\brk@midthree#1#2#3#4{#3{#1}}
+\def\brk@rightthree#1#2#3#4{#4{#1}}
+\def\brk@plainthree#1#2#3{%
+ #1{\brk@leftthree{\brk@plain{}}}#2%
+ #1{\brk@midthree{\brk@plain\mathrel}}#3%
+ #1{\brk@rightthree{\brk@plain{}}}%
+}
+\def\brk@sizethree#1#2#3#4#5#6{%
+ #4{\brk@leftthree{\brk@size{#1}}}#5%
+ #4{\brk@midthree{\brk@size{#2}}}#6%
+ #4{\brk@rightthree{\brk@size{#3}}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\brk@mainthree}
+% \begin{macro}{\brk@bigthree}
+% \begin{macro}{\brk@Bigthree}
+% \begin{macro}{\brk@biggthree}
+% \begin{macro}{\brk@Biggthree}
+% \begin{macro}{\brk@bbiggthree}
+% And finally, the top-level handlers for three-delimiter bracket-notation
+% macros.
+% \begin{macrocode}
+\def\brk@mainthree#1{\@ifnextchar[{\brk@mainthree@size#1}{\brk@plainthree#1}}
+\def\brk@mainthree@size#1[#2][#3][#4]{\brk@sizethree{#2}{#3}{#4}#1}
+\def\brk@bigthree{\brk@sizethree\bigl\bigm\bigr}
+\def\brk@Bigthree{\brk@sizethree\Bigl\Bigm\Bigr}
+\def\brk@biggthree{\brk@sizethree\biggl\biggm\biggr}
+\def\brk@Biggthree{\brk@sizethree\Biggl\Biggm\Biggr}
+\def\brk@bbiggthree#1{\brk@bbigg{\brk@bbiggtree@#1}}
+\def\brk@bbiggthree@#1#2%
+ {\brk@sizethree{\bbiggl#1{#2}}{\bbiggm#1{#2}}{\bbiggr#1{#2}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@csname}
+% A brief change of pace: \syntax{"\\@csname{"<cont>"}{"<command>"}"} calls
+% \<cont> with the name of the control sequence \<command>, suitable for
+% inlcuding as part of |\csname|\ldots|\endcsname|. I use |\string|, and
+% then there's a dance to remove the backslash from the beginning and the
+% space from the end.
+% \begin{macrocode}
+\def\@csname#1#2{\expandafter\@csname@\string#2 \relax#1}
+\begingroup \lccode`\|=`\\
+ \lowercase{\endgroup \def\@csname@|#1 \relax#2{#2{#1}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\defbrk}
+% There's nothing to do now but to define |\defbrk| itself. This is mostly a
+% tedious exercise in collecting the arguments.
+% \begin{macrocode}
+\def\defbrk@delim#1{\@testopt{\defbrk@delim@i{#1}}{}}
+\def\defbrk@delim@i#1[#2]#3{%
+ \def\@tempa{#3}%
+ \ifx\@tempa\@empty \expandafter\@firstoftwo
+ \else \expandafter\@secondoftwo \fi
+ {\@testopt{\defbrk@delim@ii{#1}{#2}{}{.}}{}}%
+ {\@testopt{\defbrk@delim@ii{#1}{#2}{#3}{#3}}{}}%
+}
+\def\defbrk@delim@ii#1#2#3#4[#5]{#1{\brk@delim{#2}{#3}{#4}{#5}}}
+\def\defbrk{\@ifstar\defbrk@three\defbrk@two}
+\def\defbrk@two#1{\defbrk@delim{\defbrk@two@i{#1}}}
+\def\defbrk@two@i#1#2{\defbrk@delim{\defbrk@two@ii{#1}{#2}}}
+\def\defbrk@two@ii{\@csname\defbrk@two@iii}
+\def\defbrk@two@iii#1#2#3{%
+ \@namedef{(#1)}##1{##1{#2}{#3}}%
+ \expandafter\defbrk@two@iv\csname(#1)\endcsname{#1}%
+}
+\def\defbrk@two@iv#1#2{%
+ \@namedef{#2}{\brk@maintwo#1}%
+ \@namedef{big#2}{\brk@bigtwo#1}%
+ \@namedef{Big#2}{\brk@Bigtwo#1}%
+ \@namedef{bigg#2}{\brk@biggtwo#1}%
+ \@namedef{Bigg#2}{\brk@Biggtwo#1}%
+ \@namedef{bbigg#2}{\brk@bbiggtwo#1}%
+ \@namedef{auto#2}{\brk@auto#1}%
+}
+\def\defbrk@three#1{\defbrk@delim{\defbrk@three@i{#1}}}
+\def\defbrk@three@i#1#2{\defbrk@delim{\defbrk@three@ii{#1}{#2}}}
+\def\defbrk@three@ii#1#2#3{\defbrk@delim{\defbrk@three@iii{#1}{#2}{#3}}}
+\def\defbrk@three@iii{\@csname\defbrk@three@iv}
+\def\defbrk@three@iv#1#2#3#4{%
+ \@namedef{(#1)}##1{##1{#2}{#3}{#4}}%
+ \expandafter\defbrk@three@v\csname(#1)\endcsname{#1}%
+}
+\def\defbrk@three@v#1#2{%
+ \@namedef{#2}{\brk@mainthree#1}%
+ \@namedef{big#2}{\brk@bigthree#1}%
+ \@namedef{Big#2}{\brk@Bigthree#1}%
+ \@namedef{bigg#2}{\brk@biggthree#1}%
+ \@namedef{Bigg#2}{\brk@Biggthree#1}%
+ \@namedef{bbigg#2}{\brk@bbiggthree#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%