summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/oubraces
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-03-25 22:35:33 +0000
committerKarl Berry <karl@freefriends.org>2011-03-25 22:35:33 +0000
commit4a417ddbdedf1c39f8ce6b841f979dde689ffc13 (patch)
treef9d0c6382b7d3c2bd8a5b06f8c0698ed677c9422 /Master/texmf-dist/doc/latex/oubraces
parent4929232e95fabffe6c167ee554ec6dc3863af674 (diff)
oubraces (25mar11)
git-svn-id: svn://tug.org/texlive/trunk@21833 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/latex/oubraces')
-rw-r--r--Master/texmf-dist/doc/latex/oubraces/oubraces.pdfbin52584 -> 66372 bytes
-rw-r--r--Master/texmf-dist/doc/latex/oubraces/oubraces.tex248
2 files changed, 196 insertions, 52 deletions
diff --git a/Master/texmf-dist/doc/latex/oubraces/oubraces.pdf b/Master/texmf-dist/doc/latex/oubraces/oubraces.pdf
index 148d87eee64..74f33f8559f 100644
--- a/Master/texmf-dist/doc/latex/oubraces/oubraces.pdf
+++ b/Master/texmf-dist/doc/latex/oubraces/oubraces.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/oubraces/oubraces.tex b/Master/texmf-dist/doc/latex/oubraces/oubraces.tex
index 3fe0fd0c6e3..03aa56b14e1 100644
--- a/Master/texmf-dist/doc/latex/oubraces/oubraces.tex
+++ b/Master/texmf-dist/doc/latex/oubraces/oubraces.tex
@@ -1,67 +1,211 @@
-\documentclass[a4paper]{article}
+\documentclass[11pt]{article}
\usepackage{oubraces}
-\begin{document}
-\title{Braces over and under equations}
+\overfullrule=5pt
+\title{\textsf{oubraces.sty}\\[5pt]
+ \large{Interleave \textbackslash overbrace with \textbackslash underbrace}}
\author{Donald Arseneau}
-\vspace{-\fill}
+\date{2011 (1993)}
+
+\makeatletter
+
+% LaTeX article explaining \overunderbraces
+
+% hacked version with extra labels for this article:
+% \Xoverunderbraces{upper_brace}{main_formula}{lower_brace}{special_labels}
+%
+\newdimen \Xheight
+
+\def\Xoverunderbraces #1#2#3#4{{% #4 = special labels
+ \baselineskip\z@skip \lineskip4pt \lineskiplimit4pt
+ \displaystyle % generate error if not in math mode!
+% first, do the top half of the alignment in a save-box to measure the height
+ \setbox\z@\vbox{\ialign{&\hfil${}##{}$\hfil\cr
+ \global\let\br\br@label #1\cr % upper labels
+ \global\let\br\br@down #1\cr % upper braces
+ #2\cr % main line of the formula
+ }}% finished partial alignment and \vbox.
+ \dimen@-\ht\z@ % Measure height -- it is the height we want for the whole
+% second, do the whole alignment without the rules to find its size
+ \Xheight\z@
+ \setbox\z@\vbox{\ialign{&\hfil${}##{}$\hfil\cr
+ \global\let\br\br@label #1\cr % upper labels
+ \global\let\br\br@down #1\cr % upper braces
+ #2\cr % main line of the formula
+ \global\let\br\br@up #3\cr % lower braces
+ \global\let\br\br@label #3\cr % lower labels
+ \noalign{\kern4pt}% Extra space
+ #4\cr % special labels
+ }}% finished whole alignment and \vbox.
+ \Xheight\ht\z@ \global\let\XV\relax
+% finally, do the whole alignment yet again in its final format
+ \setbox\z@\vbox{\ialign{\XV\hfil${}##{}$\hfil\XV&&\hfil${}##{}$\hfil\XV\cr
+ \global\let\br\br@label #1\cr % upper labels
+ \global\let\br\br@down #1\cr % upper braces
+ #2\cr % main line of the formula
+ \global\let\br\br@up #3\cr % lower braces
+ \global\let\br\br@label #3\cr % lower labels
+ \noalign{\kern4pt \global\let\XV\XVR}% Extra space
+ #4\cr % special labels
+ }}% finished whole alignment and \vbox.
+ \advance\dimen@\ht\z@
+ \lower\dimen@\hbox{\box\z@}% move alignment to get the desired height
+}}
+
+\def\XVR{\kern-.05pt\vbox to\z@{\vss\hrule width.1pt height\Xheight}\kern-.05pt}
+
+\begin{document}
+
\maketitle
-\thispagestyle{empty}
-The syntax is:
+\parskip=4pt
+\linespread{1.05}\selectfont
+
+\noindent Sometimes one would like to interleave braces labelling
+parts of an equation, like in
+$$
+ \overunderbraces{&\br{2}{x}& &\br{2}{y}}%
+ {a + b +&c + d +&e + f&+&g + h&+ i + j&+ k + l + m}%
+ {& &\br{3}{z}}
+ = \pi r^2
+$$
+which is something that straightforward \verb"\overbrace" and
+\verb"\underbrace" cannot do.
+
+There is a trick, which I heard from Etienne Riga, that works well
+for simple cases without requiring any packages or new commands, and
+it involves \emph{overprinting} parts of the equation:
+put an overlapping \verb"\overbrace" (or \verb"\underbrace")
+into \verb"\rlap{$...$}", and insert it into the equation.
+This does not easily handle the multiple-overlap of the example
+above (the overlapping gets misaligned) but can do
+$$
+\rlap{$\overbrace{A+B}^x$}A+\underbrace{B+C}_z
+$$
+with \verb"\rlap{$\overbrace{A+B}^x$}A+\underbrace{B+C}_z".
+
+The oubraces package provides an alternative solution (for both plain
+\TeX\ and \LaTeX) based on visual formatting into columns, like an array
+or table. The formula at top is then produced by
\begin{verbatim}
- \overunderbraces{upper_braces}{main_formula}{lower_braces}
+ \overunderbraces{&\br{2}{x}& &\br{2}{y}}%
+ {a + b +&c + d +&e + f&+&g + h&+ i + j&+ k + l + m}%
+ {& &\br{3}{z}}
+ = \pi r^2
\end{verbatim}
-Suppose we want the equation:
-\[
- \overunderbraces{&\br{2}{x}& &\br{2}{y}}%
- {a + b +&c + d +&e + f&+&g + h&+ i + j&+ k + l + m}%
- {& &\br{3}{z}}
- = \pi r^2
-\]
-There are seven segments:
+
+First, (on paper or imagination) write the formula
+and divide it into segments at the tip of each brace.
+In our example there are seven segments:
+$$
+ \Xoverunderbraces{&\br{2}{x}& &\br{2}{y}}%
+ {a + b +&c + d +&e + f&+&g + h&+ i + j&+ k + l + m}%
+ {& &\br{3}{z}}%
+ {1&2&3&4&5&6&7}
+ = \pi r^2
+$$
+although segments 1 and 7 could be omitted.
+We will type the main line of the formula with \verb"&" inserted
+between each segment:
\begin{verbatim}
- x y
- ,-----^-----. ,-----^-----.
- a + b + c + d + e + f + g + h + i + j + k + l + m = \pi r^2
- 11111111222222223333344455555666666667777777777...
- `-----v-----'
- z
+ a + b +&c + d +&e + f&+&g + h&+ i + j&+ k + l + m
\end{verbatim}
-Insert \texttt{\&} between each segment (where the tips of the braces point)
-to type the main\_formula:
+Each segment then becomes a column in an alignment,
+and each brace may span multiple columns. The idea is best
+illustrated by a \LaTeX{} array:
\begin{verbatim}
- x y
- ,-----^-----. ,-----^-----.
- a + b +&c + d +&e + f&+&g + h&+ i + j&+ k + l + m
- `-----v-----'
- z
+\begin{array}[c]{ccccccc}
+ & \multicolumn{2}{c}{x}& & \multicolumn{2}{c}{y}\\
+ & \multicolumn{2}{c}{\downbracefill}&
+ & \multicolumn{2}{c}{\downbracefill}\\
+ a + b +&c + d +&e + f&+&g + h&+ i + j&+ k + l + m\\
+ & & \multicolumn{3}{c}{\upbracefill}\\
+ & & \multicolumn{3}{c}{z}
+\end{array} = \pi r^2
\end{verbatim}
-Each brace should be specified by typing
+This doesn't work well at all, having bad braces with bad vertical and
+horizontal spacing. We should instead use \TeX's primitive
+\verb"\halign" command, and measure the size of boxes to get the
+correct vertical positioning of the formula's main line. Rather
+than type the very messy \TeX\ commands directly with each use,
+it is better to make a new command:
+$$
+\hbox to\hsize{\indent\verb"\overunderbraces{"{\sl
+ upper\_braces\/}\verb"}{"{\sl main\_formula\/}\verb"}{"{\sl
+ lower\_braces\/}\verb"}"\hfil}
+$$
+We already know how to write the main line of the formula
+(by segmenting the formula and inserting \verb"&" between
+segments), and we will also use \verb"&" between braces.
+Each labelled brace will be specified in the format:
+$$
+\hbox to\hsize{\indent\verb"\br{"$n$\verb"}{"\mbox{\sl
+ label\/}\verb"}"\hfil}
+$$
+where $n$ is the number of segments spanned by the brace.
+Each top brace of our example spans two segments (with an
+empty segment between them) and the bottom
+brace spans three segments, so they are specified by:
+
+\medskip
+\indent \hbox to8em{top braces:\hfil}\verb" &\br{2}{x}& &\br{2}{y}"\\
+\indent \hbox to8em{bottom braces:\hfil}\verb" & &\br{3}{z}"
+
+\medskip
+
+Having determined all three parameters to use with
+\verb"\over"\-\verb"under"\-\verb"braces", the complete command is
\begin{verbatim}
-\br{number_of_segments}{label},
+ \overunderbraces{&\br{2}{x}& &\br{2}{y}}%
+ {a + b +&c + d +&e + f&+&g + h&+ i + j&+ k + l + m}%
+ {& &\br{3}{z}}
+ = \pi r^2
\end{verbatim}
-separated by \texttt{\&} to indicate which segment to start at; use
-\texttt{\& \&} to skip a segment that has no brace. For our example
-formula, the upper and lower brace specifiers are:
-\begin{center}
- \begin{tabular}{ll}
- top row: \verb|&\br{2}{x}& &\br{2}{y}|
- bottom row: \verb|& &\br{3}{z}|
-\end{tabular}
-\end{center}
-Now put them all together:
+which produces the equation at the start of this article.
+
+\end{document}
+
+Here is the definition of \verb"\overunderbraces". It may look
+long, but it has some repetition in order to measure the height of
+the top half of the formula. There are also the auxiliary macros
+\verb"\brAup", \verb"\brAdown", and \verb"\brAlabel" that allow
+the same \verb"\br" command to produce up-braces, down-braces, and
+centered labels at the appropriate places.
+
\begin{verbatim}
-\overunderbraces{&\br{2}{x}& &\br{2}{y}}%
- {a + b +&c + d +&e + f&+&g + h&+ i + j&+ k + l + m}%
- {& &\br{3}{z}}
- = \pi r^2
+% \overunderbraces{upper_braces}{main_formula}{lower_braces}
+%
+\def\overunderbraces #1#2#3{{%
+ \baselineskip=0pt \lineskip=4pt \lineskiplimit=4pt
+ \displaystyle % generate error if not in math mode!
+% first, do the top half of the alignment in a save-box
+ \setbox0=\vbox{\ialign{&\hfil${}##{}$\hfil\cr
+ \global\let\br\brAlabel #1\cr % upper labels
+ \global\let\br\brAdown #1\cr % upper braces
+ #2\cr % main line of the formula
+ }}% finished partial alignment and \vbox.
+ \dimen0=-\ht0 % Measure height of partial alignment --
+% ... it is the height we want for the whole.
+% Now do the whole alignment (notice the repetition from above)
+ \setbox0=\vbox{\ialign{&\hfil${}##{}$\hfil\cr
+ \global\let\br\brAlabel #1\cr % upper labels
+ \global\let\br\brAdown #1\cr % upper braces
+ #2\cr % main line of the formula
+ \global\let\br\brAup #3\cr % lower braces
+ \global\let\br\brAlabel #3\cr % lower labels
+ }}% finished whole alignment and \vbox.
+ \advance\dimen0 by\ht0 % calc. the necessary lowering
+ \lower\dimen0\hbox{\box0}% shift to get the desired height
+}}
+
+% Three aliases for \br.
+% #1=number of spanned columns, #2=label
+\def\brAup#1#2{\multispan{#1}\upbracefill}
+\def\brAdown#1#2{\multispan{#1}\downbracefill}
+\def\brAlabel#1#2{\multispan{#1}\hidewidth $#2$\hidewidth}
\end{verbatim}
-\dots{} and we're done (that code was used to typeset the display at
-the start of this document).
-
-\enlargethispage{2\baselineskip}
-\vspace*{0.5\baselineskip}
-\small
-\noindent This documentation derived from the comments the original
-package, by Robin Fairbairns (2010-02-22)
+
+If you check the definitions in oubraces.sty, you will
+find some streamlining with `internal' commands such as \verb"\dimen@"
+used for \verb"\dimen0".
+
\end{document}