%\iffalse meta-comment % File `empheq07.dtx'. % Copyright 2002-2004 Morten H\o gholm. % moho01ab@student.cbs.dk % % It 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 2003/12/01 or later. % % This work has the LPPL maintenance status "maintained". % % The Current Maintainer of this work is Morten H\o gholm. % % This work consists of the files empheq07.dtx and empheq07.ins % and the derived file empheq07.sty. % %<*dtx> \ProvidesFile{empheq07.dtx} % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{empheq07} [2004/07/27 v0.7d Emphasizing equations (MH)] %<*driver> \documentclass[a4paper]{ltxdoc} \usepackage{empheq07} \usepackage{color,fancybox,ifpdf} \ifpdf\else \usepackage{pstricks} \fi \definecolor{lightblue}{rgb}{.8, .8, 1} \OnlyDescription \begin{document} \DocInput{empheq07.dtx} \end{document} % % \fi % \DeclareRobustCommand{\mode}[1]{\texttt{#1}} % \DeclareRobustCommand{\env}[1]{\textsf{#1}} % \DeclareRobustCommand{\pkg}[1]{\texttt{#1}} % \DeclareRobustCommand{\EQ}{\pkg{empheq07}} % % \changes{v0.7d}{2004/07/27}{Changed name to \pkg{empheq07} by request % of Robin Fairbairns} % % \changes{v0.7c}{2004/04/01}{Separated \pkg{empheq} and % \pkg{empheq-obsolete}} % % \changes{v0.7b}{2004/03/13}{Upgraded license to LPPL version 1.3. % The package is still obsolete} % % \changes{v0.7a}{2004/02/15}{This package is now obsolete and has % changed its name to \pkg{empheq-obsolete}} % % \changes{v0.6a}{2003/01/28}{Minor updates to documentation.} % % \changes{v0.5}{2002/12/30}{First experimental and very limited release} % \newif\ifBonusExample % \ifpdf\else % \BonusExampletrue % \fi % \GetFileInfo{empheq07.dtx} % \CheckSum{1273} % \title{The \EQ\ package\thanks{This file % has version number \fileversion, last % revised \filedate.}\\Emphasizing equations in \LaTeXe % \thanks{Thanks to Lars Madsen for asking for the subtle feature % that evolved into this package.}} % \author{Morten H\o gholm} % \date{\filedate} % % \maketitle % % % \begin{abstract} % \noindent The \EQ\ package automatically detects several \pkg{amsmath} % environments and the size of the displayed math material. The user % interface makes it easy to add various kinds of visual markup to % these equations. % \end{abstract} % \tableofcontents % \section{Important Notice} % % This package (\EQ\ \fileversion) is no longer supported. See the % documentation of \pkg{empheq} for more details. % % % \section{Introduction} % Users who have wanted to put a system of equations inside boxes has % hitherto been forced to use the features of \pkg{fancybox} or the \cmd{\boxed} command % of \pkg{amsmath}. Both alternatives have serious limitations though. % \pkg{fancybox} allows only \env{eqnarray}-style equations and at % the end of the day they aren't all that pretty. Most mathematical % typesetting in \LaTeX\ is done with the aid of \pkg{amsmath} % anyway, but it only offers the single line quick-fix \cmd{\boxed}. % What we really want is something that will enable us to do % something along the likes of this: % \begin{subequations}\label{eq:1} % \begin{empheq}[boxtype=\fbox,Left= {\tilde{S}=1 \Rightarrow\empheqlbrace}] % \begin{align} % a&=\int_{-2}^3{t}b^t \, dt \quad\text{and} \label{eq:1a}\\ % c&=d-a \label{eq:1b} % \end{align} % \end{empheq} % \end{subequations} % As you can see, \EQ\ can do all the tricks the \pkg{cases} package % by Donald Arseneau can do and more. It even supports % \env{subequations}---as shown in equations \eqref{eq:1a} and % \eqref{eq:1b}---from \pkg{amsmath} without complaining. % % In order to combine the best of two worlds the \EQ\ package % tries to take advantage of the widespread features of \pkg{amsmath}. % As it should be well known if you read this, \pkg{amsmath} has % amongst its arsenal of structures \env{align}, \env{gather}, \env{alignat} and \env{multline}. % \EQ\ works with these as well as their starred % variants. % % ``But what about \env{equation}?'' you say. \env{equation} is (in % my opinion) merely a poor man's \env{gather}. If you really want % to use \EQ's features on a one-liner (no pun intended) go with % \env{gather}. Anyway the real goal of this package is to do nifty % tricks with multi line equations \ldots % % % \section{Examples} % \changes{v0.7}{2003/05/11}{Added further examples and changed existing ones} % Any options given to \EQ\ is passed on to \pkg{amsmath}, thus the % line\par % \cmd{\usepackage}\oarg{options}|{empheq07}|\\ % will load \pkg{amsmath} with exactly those options. \EQ\ doesn't % redefine anything so to use it in an existing document you need % only replace \pkg{amsmath} with \EQ---no harm done. % % % \EQ\ is \emph{really} easy to use; you simply put an \env{empheq} % environment around your \pkg{amsmath} environment: % \begin{verbatim} % \begin{empheq} % \begin{align} % E&=mc^2 \\ % Y&= \sum_{n=1}^\infty \frac{1}{n^2} % \end{align} % \end{empheq} % \end{verbatim} % \begin{empheq} % \begin{align} % E&=mc^2 \\ % Y&= \sum_{n=1}^\infty \frac{1}{n^2} % \end{align} % \end{empheq} % Impressed? No? Well then I guess it's about time I told you about % the \emph{optional} argument of the \env{empheq} environment. It allows % you control what material to put on either side of the math and % the sort of box to go around it all. That means that we can say % \begin{verbatim} % \begin{empheq}[boxtype=\fbox] % \begin{align} % E&=mc^2 \\ % Y&= \sum_{n=1}^\infty \frac{1}{n^2} % \end{align} % \end{empheq} % \end{verbatim} % to obtain the display % \begin{empheq}[boxtype=\fbox] % \begin{align} % E&=mc^2 \\ % Y&= \sum_{n=1}^\infty \frac{1}{n^2} % \end{align} % \end{empheq} % This requires the use of the \pkg{keyval} package from the tools % bundle, which is undoubtedly installed on your system. When using % the \pkg{keyval} package there are a few things we need to keep in % mind. In mathematical typesetting `|=|' and `|,|' are quite % frequently used, thus requiring the user to enclose them in % braces: % \begin{verbatim} % \begin{empheq}[boxtype=\fbox, % Left={(a,b)=(c,i) \Rightarrow\empheqlbrace}] % \begin{alignat}{2} % (a,b)&= (\cos^a c, \tan^b i)&& \quad\text{for $i>1$}\\ % (a,b)&= (\arccos x^a, \arctan i^b)&& \quad\text{for $i\leq1$} % \end{alignat} % \end{empheq} % \end{verbatim} % \begin{empheq}[boxtype=\fbox, % Left={(a,b)=(c,i) \Rightarrow\empheqlbrace}] % \begin{alignat}{2} % (a,b)&= (\cos^a c, \tan^b i)&& \quad\text{for $i>1$}\\ % (a,b)&= (\arccos c^a, \arctan i^b)&& \quad\text{for $i\leq1$} % \end{alignat} % \end{empheq} % The same with \env{cases} from \pkg{amsmath} for comparison: % \[ % \boxed{(a,b)=(c,i) \Rightarrow % \begin{cases} (a,b)= (\cos^a c, \tan^b i)& \text{for $i>1$}\\ % (a,b)= (\arccos x^a, \arctan i^b)& \text{for $i\leq1$} % \end{cases}} % \] % Notice that \env{cases} uses an array for the conditions, so you % have to force \cmd{\displaystyle} yourself. This is not needed with % \EQ\ as you're already using a \cmd{\displaystyle} environment such as % \env{gather} etc. % % \changes{v0.6b}{2003/03/04}{Added example for changing margins inside the boxtype.} % Observe what can be done if we replace % |\fbox| with another framed box and add some space on all sides: % \begin{verbatim} % \definecolor{lightblue}{rgb}{.8, .8, 1} % \begin{empheq}[boxtype={\setlength{\fboxsep}{10pt}% % \colorbox{lightblue}}, % Right={\empheqrbrace \beta}] % . % . % . % \end{empheq} % \end{verbatim} % \begin{empheq}[boxtype={\setlength{\fboxsep}{10pt}% % \colorbox{lightblue}},Right={\empheqrbrace \beta}] % \begin{align} % a&=\int_{-2}^3{t}b^t \, dt \quad\text{and}\\ % c&=d-a % \end{align} % \end{empheq} % % As a convenience for the user, it is also possible to declare % delimiters with the commands % \cmd{\DeclareRightDelimiter}\marg{delimiter} and its companion % \cmd{\DeclareLeftDelimiter}\marg{delimiter}. For instance the commands % \begin{quote} % |\DeclareRightDelimiter{\rangle}| defines \cmd{\empheqrangle} % \end{quote} % and % \begin{quote} % |\DeclareLeftDelimiter{\langle}| defines \cmd{\empheqlangle}. % \end{quote} % The usage is simple. \DeclareRightDelimiter{\rangle} \DeclareLeftDelimiter{\langle} % \begin{verbatim} % \begin{empheq}[Right=\empheqrangle, % Left=\empheqlangle] % \begin{gather} % a=b \\ % c=d % \end{gather} % \end{empheq} % \end{verbatim} % \begin{empheq}[Right=\empheqrangle,Left=\empheqlangle] % \begin{gather} % a=b \\ % c=d % \end{gather} % \end{empheq} % \cmd{\DeclareRightDelimiter} and its companion have an optional % argument which controls spacing (default is a negative thinspace), % but beware: It will simply overwrite the original definition and % it might not look all that pretty as the following example shows: % \DeclareRightDelimiter[\>]{\rangle} % \DeclareLeftDelimiter[\mkern-10mu]{\langle} % \begin{verbatim} % \DeclareRightDelimiter[\>]{\rangle} % \DeclareLeftDelimiter[\mkern-10mu]{\langle} % \end{verbatim} % \begin{empheq}[Right=\empheqrangle,Left=\empheqlangle] % \begin{gather} % a=b \\ % c=d % \end{gather} % \end{empheq} % % These examples will have given you a glimpse of the possibilities % \EQ\ offers. In particular the commands \cmd{\empheqlbrace} and % \cmd{\empheqrbrace} produce braces just tall enough to encompass % the display. You can of course use \cmd{\big...} delimiters if you % want. % % \ifBonusExample % If you want you can even create your own box and use it with % \env{empheq}. In the following silly example I have created % \cmd{\ErrorBox} with \pkg{PSTricks} to achieve a disturbing % effect: % \makeatletter % \newcommand{\ErrorBox}[1]{% % \setlength{\@tempdima}{\heightof{#1}}% % \addtolength{\@tempdima}{\depthof{#1}}% % \setlength{\@tempdimb}{\widthof{#1}}% % \psset{yunit=\@tempdima}% % \psset{xunit=\@tempdimb}% % \psframebox[fillstyle=vlines,linestyle=none,hatchsep=.2\@tempdimb,hatchcolor=red,hatchangle=-60]{% % \rlap{\kern.5\@tempdimb\makebox[0pt]{{\Large\color{gray} \textbf{Error!}}}}#1}% % } % \makeatother % \begin{empheq}[boxtype=\ErrorBox] % \begin{align*} % E&=mc^3 \\ % F&=G\frac{m+M}{r^2} % \end{align*} % \end{empheq} % Remember one thing when creating your own box: Make it % symmetrical. % \fi % % \section{Bugs and shortcomings} % This package (\EQ) is not supported anymore. Try with the new % version and see if it works; if not, then contact me. See how in % the manual of \pkg{empheq}. % % \StopEventually{} % \section{Implementation} % \subsection{Strategy} % % Whenever \pkg{amsmath} is typesetting a display environment it % actually does it twice; the first for the ``measuring'' phase and % the second for the ``production'' phase. The \EQ\ package uses a % similar approach: % \begin{itemize} % \item Collects the input in a token register for later use. % \item Typesets the input in the background and checks certain values to determine the kind of math structure you just typed. % \item Based on the given information, alterations are made to various lengths. % \item Then the equations are typeset again and stored in a box % for easy retrieval. % \item Finally the saved box is put into a box of the user's liking. % Any material to the right or left of the math structure (added with % the |Left| and |Right| keys) are put into the box as well. % \end{itemize} % Assuming we have found out which \pkg{amsmath} structure the % user typed, there are still a few things we need to sort out % before we proceed. % % First of all the equation number should still be aligned with % those of the ordinary math structures, which is a problem as soon % as the additions we make to the left and the right % differ---presumably they will. And when we are in \mode{fleqn} % mode, we should make sure that the structure is shifted just % enough to the right so that all equations still are right % adjusted. Therefore we need to make clever changes to the % line width to make sure the margins come out right. % % Then assuming we have overcome all of this there's still the final % step: Placing the math structure in the appropriate box at the % appropriate position. Once again we need to do some manipulation % with spacing to make it just right. % % \subsection{Preliminary actions} % % To avoid clashes with other packages, all private commands will contain the sequence \verb|@emphEQ@|. % % We will need \pkg{amsmath} of course and it would be nice if \EQ\ % would recognize all the \pkg{amsmath} options so we make that % happen. To make sure the user has an updated system the newest % release of \pkg{amsmath} is required. % % \pkg{calc} is used to increase readability of the code % (thus making it \emph{far} easier to write too) and \pkg{keyval} % is used for user friendliness. They should all be part of any % \LaTeX\ system. % \begin{macrocode} %<*package> \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{amsmath}} \ProcessOptions\relax \RequirePackage{amsmath}[2000/07/18] \RequirePackage{calc,keyval} % \end{macrocode} % \begin{macro}{\if@emphEQ@FLL}\begin{macro}{\if@emphEQ@FLR}\begin{macro}{\if@emphEQ@L}\begin{macro}{\if@emphEQ@R} % There are four available layouts for mathematical displays: % |[fleqn,leqno]| (FLL), |[fleqn,reqno]| (FLR), |[leqno]| (L) and |[reqno]| (R). We create four \TeX\ conditionals % to make the algorithm easier to read as well as to speed up things a bit. % \begin{macrocode} \newif\if@emphEQ@FLL \newif\if@emphEQ@FLR \newif\if@emphEQ@L \newif\if@emphEQ@R % \end{macrocode} %\end{macro}\end{macro}\end{macro}\end{macro} % We then perform a simple test to determine the current mode. % \begin{macrocode} \if@fleqn \iftagsleft@ \@emphEQ@FLLtrue \else \@emphEQ@FLRtrue \fi \else \iftagsleft@ \@emphEQ@Ltrue \else \@emphEQ@Rtrue \fi \fi % \end{macrocode} % \begin{macro}{\if@emphEQ@gather}\begin{macro}{\if@emphEQ@align}\begin{macro}{\if@emphEQ@alignat} % \begin{macro}{\if@emphEQ@multline}\begin{macro}{\if@emphEQ@NoNumEq} % Since we're going to determinate which math structure the user has % input, we create some more conditionals to improve speed and % readability. Furthermore it will show crucial to know whether or % not the equation counter has been stepped since \env{multline$*$} % and \env{multline} don't have exactly the same structure. % \begin{macrocode} \newif\if@emphEQ@gather \newif\if@emphEQ@align \newif\if@emphEQ@alignat \newif\if@emphEQ@multline \newif\if@emphEQ@NoNumEq % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % % % \begin{macro}{\@emphEQ@Box}\begin{macro}{\@emphEQ@BoxWidth} % \begin{macro}{\@emphEQ@displaywidth}\begin{macro}{\@emphEQ@mathbody} % We need a single box to hold the math structure, a length so we % can remember the size of the displayed math for later use and a % token register for the math environment. % \begin{macrocode} \newsavebox{\@emphEQ@Box} \newlength{\@emphEQ@BoxWidth} \newlength{\@emphEQ@displaywidth} \newtoks\@emphEQ@mathbody % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % \begin{macro}{\@emphEQ@Left}\begin{macro}{\@emphEQ@Right}\begin{macro}{\@emphEQ@lwd}\begin{macro}{\@emphEQ@rwd} % Here are some vital parts: The additional informations the user % want to display on either side of the math structure are saved by % \cmd{\@emphEQ@Left} and \cmd{\@emphEQ@Right} and \cmd{\@emphEQ@lwd} and \cmd{\@emphEQ@rwd} % measure the width of them for later use. % \begin{macrocode} \newcommand{\@emphEQ@Left}{} \newcommand{\@emphEQ@Right}{} \newlength{\@emphEQ@lwd} \newlength{\@emphEQ@rwd} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % \begin{macro}{\@emphEQ@boxtype}\begin{macro}{\@emphEQ@boxtypelength} % \begin{macro}{\@emphEQ@shadowbox}\begin{macro}{\if@emphEQ@shadowbox} % To make sure spacing is right when putting the math structure into % a box, we need to know what kind of box it is: The width is % extremely important. Often we will have to subtract or add half of % an empty (but \emph{not} zero-width) box' width to certain % lengths. When using an \cmd{\fbox} or \cmd{\colorbox} this is just % \cmd{\fboxrule}+\cmd{\fboxsep}, but when using say, % \cmd{\doublebox} of \pkg{fancybox} fame the necessity arises. % \pkg{fancybox} also defines \cmd{\shadowbox} which needs extra % taking care of, since it's asymmetrical unlike most other framed % boxes. % % Thus we test whether or not \pkg{fancybox} has been loaded at the % beginning of the document. If it has, we don't lift a finger; if % it hasn't, we let \cmd{\fbox} be an alias for \cmd{\shadowbox}. % Then we create a private version of \cmd{\shadowbox} for % testing purposes and a conditional for the algorithm. % \begin{macrocode} \newcommand{\@emphEQ@boxtype}{} \newlength{\@emphEQ@boxtypelength} \AtBeginDocument{% \@ifpackageloaded{fancybox}{}{% \let\shadowbox=\fbox}} \newcommand{\@emphEQ@shadowbox}{\shadowbox} \newif\if@emphEQ@shadowbox % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % \begin{macro}{\@emphEQ@templength}\begin{macro}{@emphEQ@EqCtr} % We are almost ready to go. We only need two temporary little % helpers: one length and one counter. % \begin{macrocode} \newlength{\@emphEQ@templength} \newcounter{@emphEQ@EqCtr} % \end{macrocode} % \end{macro}\end{macro} % % \subsubsection{Faraway, so close}\label{sec:CloseEnough} % \begin{macro}{\@emphEQ@CloseEnough} % \changes{v0.6}{2003/01/10}{Added a test for lengths being almost identical} % When determining the display type we will occasionally have to check if an equation of the % form % \[ % \cmd{\totwidth@}-\cmd{\tagshift@}=\cmd{\linewidth} % \] % is true. However small rounding errors \emph{can} occur in % \env{alignat} so we would rather see if the equation % \[ % -\delta<\cmd{\totwidth@}-\cmd{\tagshift@}-\cmd{\linewidth}<\delta % \] % holds for some sufficiently small $\delta>\text{$0$ pt}$. I have used $\delta=\text{$5$ sp}$. % \begin{macrocode} \newcommand{\@emphEQ@CloseEnough}[4]{% \setlength{\@tempdima}{#1-#2}% \ifdim\@tempdima>-5sp \ifdim\@tempdima<5sp #3 \else #4 \fi \else #4 \fi } % \end{macrocode} % \end{macro} % % \subsection{Saving the input} % \begin{macro}{\@emphEQ@MainEnv} % \changes{v0.7}{2003/05/11}{Added use of token register to remove the % need for an extra \cmd{\write} and \pkg{verbatim}} % \begin{macro}{\end@emphEQ@MainEnv} % \begin{macro}{\@emphEQ@get@body}\begin{macro}{\@emphEQ@findend} % \begin{macro}{\@emphEQ@EnvName} % We start out by saving the input in the token register % \cmd{\@emphEQ@mathbody}. The method is heavily inspired by % \pkg{tabularx} \dots\@ No need to copy the words of David Carlisle here---his code will do! % \begin{macrocode} \def\@emphEQ@MainEnv{% \edef\@emphEQ@EnvName{\@currenvir}% {\ifnum0=`}\fi \@emphEQ@mathbody{}\@emphEQ@get@body } \let\end@emphEQ@MainEnv\relax \long\def\@emphEQ@get@body#1\end{% \@emphEQ@mathbody\expandafter{\the\@emphEQ@mathbody #1}% \@emphEQ@findend } \def\@emphEQ@findend#1{% \def\@tempa{#1}% \ifx\@tempa\@emphEQ@EnvName \expandafter\@emphEQ@PostProcess \else \@emphEQ@mathbody\expandafter{\the\@emphEQ@mathbody\end{#1}}% \expandafter\@emphEQ@get@body \fi } \def\@emphEQ@EnvName{@emphEQ@MainEnv} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % \begin{macro}{@emphEQ@PostProcess} % Now we can go on with the post processing, which is the real % workhorse in this package. The first job is to test if we're % using a \cmd{\shadowbox} and then we set some \pkg{amsmath} % dimensions to zero---\pkg{amsmath} doesn't do this by itself, and % for that we can be thankful. Otherwise you wouldn't be reading % this now~;-) % \begin{macrocode} \newcommand*{\@emphEQ@PostProcess}{% \ifx\@emphEQ@boxtype\@emphEQ@shadowbox \@emphEQ@shadowboxtrue \else \@emphEQ@shadowboxfalse \fi \tagshift@=0pt \tagwidth@=0pt \totwidth@=0pt \eqnshift@=0pt \alignsep@=0pt % \end{macrocode} % \subsection{The first pass} % We then run the first pass to find out which environment we've % got. However we have to store the equation counter because it is % stepped in this pass, and we certainly don't want that to happen. % As a side effect this will also tell us if the equations are % numbered. % % If we are to put a brace to the left of the display, it would be % rather pleasant to know just how high the structure is, since this % will affect the height and more importantly the width the brace: % we will need to know the \emph{exact} width of such material. % Hence we put it in a box which is easy to measure and fiddle % around with. To achieve this we put the contents of the token register % \cmd{\@emphEQ@mathbody} in a \env{minipage} inside a \env{lrbox}. Alas, % \env{lrbox} won't let us escape into display math mode, so we play % a dirty trick on it and use a \env{minipage}, which will let us % have our way with it. % % The \env{minipage} starts in horizontal mode and then goes % straight to display math mode, thus adding some space before the % display math. However there was nothing on the first line in the % \env{minipage} thus leading \TeX\ to add a \cmd{\abovedisplayskip} % before the display. We subtract this as fast as we can! % Furthermore it showed in test runs, that an additional~1~pt had to % be subtracted in the top---but not in the bottom. It has nothing % to do with any of the standard page dimensions or parameters. % Strange indeed. % \begin{macrocode} \setcounter{@emphEQ@EqCtr}{\value{equation}}% \begin{lrbox}{\@emphEQ@Box}% \begin{minipage}{\linewidth}% \vskip-\abovedisplayskip\relax\vskip-1pt\relax \the\@emphEQ@mathbody \end{minipage}% \end{lrbox}% % \end{macrocode} % We then look at the equation counter to see if we had any numbered % equations and reset it if that was the case. If we used a % \env{multline$*$} we can detect this by measuring |\tagwidth@|. % \begin{macrocode} \ifnum\value{equation}=\value{@emphEQ@EqCtr}% \ifdim\tagwidth@>0pt \else \@emphEQ@NoNumEqtrue \fi \else \setcounter{equation}{\value{@emphEQ@EqCtr}}% \fi % \end{macrocode} % Now we can determine the various math environments. Firstly we % measure an empty \cmd{\@emphEQ@boxtype}---we will need this % information when the math structure is finally put into a box of % this type, but we have to take it into account when calculating % the allowable width of \env{multline} displays because we want to % use the margins already set for this environment. % \begin{macrocode} \settowidth{\@emphEQ@boxtypelength}{\@emphEQ@boxtype{}}% % \end{macrocode} % The idea is that each of the \pkg{amsmath} multiple line % environments can be singled out because it uses a certain % dimension in a way none of the others use it. % \begin{list}{}{} % \item[\env{align}:] Uses \cmd{\alignsep@} and sets it to something % positive. None of the others use it. % \item[\env{multline}:] Doesn't use \cmd{\eqnshift@}. % \item[\env{gather}:] Doesn't use \cmd{\tagshift@}. % \item[\env{alignat}:] Can be determined because some dimensions % will have special relations e.g., when in |[fleqn,reqno]| mode % the equation % \[ % \cmd{\totwidth@}-\cmd{\tagshift@}=\cmd{\linewidth} % \] % holds\footnote{Well almost---they may be off by a few scaled points. % See section~\ref{sec:CloseEnough} for further details.} % and similarly for the other three display modes. See the % code for these equations. % \end{list} % % \subsubsection{\mode{[fleqn,leqno]}} % ~ % \begin{macrocode} \if@emphEQ@FLL % fleqn and leqno \ifdim\alignsep@>0pt % => align \@emphEQ@aligntrue \setlength{\@emphEQ@displaywidth}{\tagshift@-\@mathmargin}% \else \ifdim\eqnshift@=0pt % => multline %tagwidth@> \@emphEQ@multlinetrue \if@emphEQ@NoNumEq \setlength{\@emphEQ@displaywidth}{% \linewidth-\multlinegap-\@mathmargin -\@emphEQ@boxtypelength}% \else \setlength{\@emphEQ@displaywidth}{% \linewidth-\tagwidth@-\multlinegap -\multlinetaggap-\@emphEQ@boxtypelength}% \fi \else \ifdim\tagshift@=0pt % => gather \@emphEQ@gathertrue \setlength{\@emphEQ@displaywidth}{% \totwidth@-\@mathmargin}% \else \ifdim\tagshift@=\totwidth@ % => alignat \@emphEQ@alignattrue \setlength{\@emphEQ@displaywidth}{% \totwidth@-\@mathmargin}% \else %Nothing thus far... \fi \fi \fi \fi \fi % \end{macrocode} % \subsubsection{\mode{[fleqn,reqno]}} % ~ % \begin{macrocode} \if@emphEQ@FLR % fleqn and reqno \ifdim\alignsep@>0pt % => align \@emphEQ@aligntrue \setlength{\@emphEQ@displaywidth}{% \linewidth-\@mathmargin+\tagshift@}% \else \ifdim\eqnshift@=0pt % => multline \@emphEQ@multlinetrue \if@emphEQ@NoNumEq \setlength{\@emphEQ@displaywidth}{% \linewidth-\multlinegap-\@mathmargin -\@emphEQ@boxtypelength}% \else \setlength{\@emphEQ@displaywidth}{% \linewidth-\tagwidth@-\@mathmargin -\multlinetaggap-\@emphEQ@boxtypelength}% \fi \else \ifdim\tagshift@=0pt % => gather \@emphEQ@gathertrue \setlength{\@emphEQ@displaywidth}{% \totwidth@-\@mathmargin}% \else \@emphEQ@CloseEnough{\totwidth@-\tagshift@}% {\linewidth}% {\@emphEQ@alignattrue \setlength{\@emphEQ@displaywidth}% {\totwidth@-\eqnshift@}}{}% \fi \fi \fi \fi % \end{macrocode} % \subsubsection{\mode{[reqno]}} % ~ % \begin{macrocode} \if@emphEQ@R % reqno \ifdim\alignsep@>0pt % => align \@emphEQ@aligntrue \setlength{\@emphEQ@displaywidth}{\totwidth@}% \else \ifdim\eqnshift@=0pt % => multline \@emphEQ@multlinetrue \if@emphEQ@NoNumEq \setlength{\@emphEQ@displaywidth}{% \linewidth-2\multlinegap -\@emphEQ@boxtypelength}% \else \setlength{\@emphEQ@displaywidth}{% \linewidth-\tagwidth@-\multlinegap -\multlinetaggap-\@emphEQ@boxtypelength}% \fi \else \ifdim\tagshift@=0pt % => gather \@emphEQ@gathertrue \setlength{\@emphEQ@displaywidth}{\totwidth@}% \else \@emphEQ@CloseEnough{\tagshift@}{-\eqnshift@}% {\@emphEQ@alignattrue \setlength{\@emphEQ@displaywidth}{\totwidth@}}{}% \fi \fi \fi \fi % \end{macrocode} % \subsubsection{\mode{[leqno]}} % ~ % \begin{macrocode} \if@emphEQ@L % leqno \ifdim\alignsep@>0pt % => align \@emphEQ@aligntrue \setlength{\@emphEQ@displaywidth}{\totwidth@}% \else \ifdim\eqnshift@=0pt % => multline \@emphEQ@multlinetrue \if@emphEQ@NoNumEq \setlength{\@emphEQ@displaywidth}{% \linewidth-2\multlinegap -\@emphEQ@boxtypelength}% \else \setlength{\@emphEQ@displaywidth}{% \linewidth-\tagwidth@-\multlinegap -\multlinetaggap-\@emphEQ@boxtypelength}% \fi \else \ifdim\tagshift@=0pt % => gather \@emphEQ@gathertrue \setlength{\@emphEQ@displaywidth}{\totwidth@}% \else \@emphEQ@CloseEnough{% \linewidth-\eqnshift@}{\tagshift@}{% \@emphEQ@alignattrue \setlength{\@emphEQ@displaywidth}{\totwidth@}}% {}% \fi \fi \fi \fi % \end{macrocode} % Phew! That was tedious, but necessary. I wish I could say it got % better further down the road, but it doesn't. Now we can measure % the width of the additional material on both sides of the math % structure. We add braces here and there to avoid any % \cmd{\thinmuskip}'s. % \begin{macrocode} \settowidth{\@emphEQ@lwd}{${\@emphEQ@Left}% {\vphantom{\usebox{\@emphEQ@Box}}}$}% \settowidth{\@emphEQ@rwd}{${\vphantom{\usebox{\@emphEQ@Box}}}% {\@emphEQ@Right}$}% % \end{macrocode} % % \subsection{The second pass} % % When we try to create an effect as in the preliminary example % there are a few things we need to tell \LaTeX\ for the overall % result to be acceptable. If the display math is centered, then the % new one should also be centered. This means that when typesetting % the math structure for the second time, we need to make % adjustments to \cmd{\linewidth}, \cmd{\@mathmargin} etc.\ for the % equation tag to be placed correctly. % % That process is extremely tedious, but there are only few % shortcuts, so we just go through each of the four environments, check % each of the four display modes and alter dimensions a we trudge % along. First we check if we are trying to put something into an % asymmetrical box and then make it symmetrical be removing the size % of the shadow. % \begin{macrocode} \begin{lrbox}{\@emphEQ@Box}% \if@emphEQ@shadowbox \addtolength{\@emphEQ@boxtypelength}{-\shadowsize}% \fi % \end{macrocode} % \subsubsection{\env{align}} % ~ % \begin{macrocode} \if@emphEQ@align \if@emphEQ@FLL \begin{minipage}{\linewidth+\@emphEQ@lwd +.5\@emphEQ@boxtypelength}% \addtolength{\@mathmargin}{\@emphEQ@lwd +.5\@emphEQ@boxtypelength}%% \fi \if@emphEQ@FLR \begin{minipage}{\linewidth}% \addtolength{\@mathmargin}{\@emphEQ@lwd +.5\@emphEQ@boxtypelength}%% \fi \if@emphEQ@L \begin{minipage}{\linewidth+\@emphEQ@lwd-\@emphEQ@rwd}% \fi \if@emphEQ@R \begin{minipage}{\linewidth-\@emphEQ@lwd+\@emphEQ@rwd}% \fi \fi % \end{macrocode} % \subsubsection{\env{gather}} % ~ % \begin{macrocode} \if@emphEQ@gather \if@emphEQ@FLL \begin{minipage}{\linewidth+\@emphEQ@lwd +.5\@emphEQ@boxtypelength}% \addtolength{\@mathmargin}{\@emphEQ@lwd +.5\@emphEQ@boxtypelength}%% \fi \if@emphEQ@FLR \begin{minipage}{\linewidth}% \addtolength{\@mathmargin}{\@emphEQ@lwd +.5\@emphEQ@boxtypelength}%% \fi \if@emphEQ@R \setlength{\@emphEQ@templength}{\linewidth-\totwidth@ -\eqnshift@}% \begin{minipage}{\linewidth-\@emphEQ@lwd+\@emphEQ@rwd +\@emphEQ@templength-\eqnshift@}% \fi \if@emphEQ@L \setlength{\@emphEQ@templength}{\linewidth-\totwidth@ -\eqnshift@}% \begin{minipage}{\linewidth+\@emphEQ@lwd-\@emphEQ@rwd -\@emphEQ@templength+\eqnshift@}% \fi \fi % \end{macrocode} % \subsubsection{\env{alignat}} % ~ % \begin{macrocode} \if@emphEQ@alignat \if@emphEQ@FLL \begin{minipage}{\linewidth+\@emphEQ@lwd +.5\@emphEQ@boxtypelength}% \addtolength{\@mathmargin}{\@emphEQ@lwd +.5\@emphEQ@boxtypelength}%% \fi \if@emphEQ@FLR \begin{minipage}{\linewidth}% \addtolength{\@mathmargin}{\@emphEQ@lwd +.5\@emphEQ@boxtypelength}%% \fi \if@emphEQ@L \begin{minipage}{\linewidth+\@emphEQ@lwd-\@emphEQ@rwd}% \fi \if@emphEQ@R \begin{minipage}{\linewidth-\@emphEQ@lwd+\@emphEQ@rwd}% \fi \fi % \end{macrocode} % \subsubsection{\env{multline}} % ~ % \begin{macrocode} \if@emphEQ@multline \if@emphEQ@FLL \begin{minipage}{\linewidth}% \if@emphEQ@NoNumEq \addtolength{\@mathmargin}{\@emphEQ@lwd +.5\@emphEQ@boxtypelength}% \if@emphEQ@shadowbox \addtolength{\@mathmargin}{\shadowsize} \fi% \else \addtolength{\multlinetaggap}{\@emphEQ@lwd +.5\@emphEQ@boxtypelength}% \if@emphEQ@shadowbox \addtolength{\multlinegap}{\shadowsize}% \fi \fi \addtolength{\multlinegap}{\@emphEQ@rwd +.5\@emphEQ@boxtypelength}% \fi \if@emphEQ@FLR \begin{minipage}{\linewidth}% \if@emphEQ@NoNumEq \addtolength{\multlinegap}{\@emphEQ@rwd +.5\@emphEQ@boxtypelength}% \if@emphEQ@shadowbox \addtolength{\multlinegap}{\shadowsize}% \fi \else \addtolength{\multlinetaggap}{\@emphEQ@rwd +.5\@emphEQ@boxtypelength}% \if@emphEQ@shadowbox \addtolength{\multlinetaggap}{\shadowsize}% \fi \fi \addtolength{\@mathmargin}{\@emphEQ@lwd +.5\@emphEQ@boxtypelength}% \fi \if@emphEQ@L \begin{minipage}{\linewidth}% \if@emphEQ@NoNumEq \addtolength{\multlinegap}{.5\@emphEQ@rwd +.5\@emphEQ@lwd+.5\@emphEQ@boxtypelength}% \if@emphEQ@shadowbox \addtolength{\multlinegap}{.5\shadowsize}% \fi \else \addtolength{\multlinetaggap}{\@emphEQ@lwd +.5\@emphEQ@boxtypelength}% \addtolength{\multlinegap}{\@emphEQ@rwd +.5\@emphEQ@boxtypelength}% \if@emphEQ@shadowbox \addtolength{\multlinegap}{\shadowsize}% \fi \fi \fi \if@emphEQ@R \begin{minipage}{\linewidth}% \if@emphEQ@NoNumEq \addtolength{\multlinegap}{.5\@emphEQ@rwd +.5\@emphEQ@lwd+.5\@emphEQ@boxtypelength}% \if@emphEQ@shadowbox \addtolength{\multlinegap}{.5\shadowsize} \fi \else \addtolength{\multlinetaggap}{\@emphEQ@rwd +.5\@emphEQ@boxtypelength}% \addtolength{\multlinegap}{\@emphEQ@lwd +.5\@emphEQ@boxtypelength}% \if@emphEQ@shadowbox \addtolength{\multlinetaggap}{\shadowsize} \fi \fi \fi \fi % \end{macrocode} % Finally we get to typeset the contents of \cmd{\@emphEQ@mathbody} for % the second time\ldots % \begin{macrocode} \vskip-\abovedisplayskip\relax\vskip-1pt\relax \the\@emphEQ@mathbody \end{minipage}% \end{lrbox}% % \end{macrocode} % % \subsection{Putting it into the box} % % Because we were clever to start with---by measuring the width of % the display math and storing it in % \cmd{\@emphEQ@displaywidth}---we can now put it into a box of % width % \cmd{\@emphEQ@displaywidth}+\cmd{\@emphEQ@rwd}+\cmd{\@emphEQ@lwd}. % This doesn't apply to \env{multline} though: it has to be set in a % box of width \cmd{\@emphEQ@displaywidth}. % \begin{macrocode} \setlength{\@emphEQ@BoxWidth}{\@emphEQ@displaywidth+\@emphEQ@rwd +\@emphEQ@lwd}% % \end{macrocode} % \subsubsection{\env{align}} % ~ % \begin{macrocode} \if@emphEQ@align \if@emphEQ@FLL \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@BoxWidth][l]{% \if@emphEQ@shadowbox \kern.5\shadowsize \fi $\@emphEQ@Left$% \kern-.5\@emphEQ@boxtypelength% \kern-\@mathmargin \kern-\@emphEQ@lwd \usebox{\@emphEQ@Box}% \kern-\@emphEQ@displaywidth \kern-\@emphEQ@rwd \kern-\@emphEQ@lwd $\@emphEQ@Right$}}% \fi \if@emphEQ@FLR \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@BoxWidth][l]{% \if@emphEQ@shadowbox \kern.5\shadowsize \fi $\@emphEQ@Left$% \kern-.5\@emphEQ@boxtypelength% \kern-\@mathmargin \kern-\@emphEQ@lwd \usebox{\@emphEQ@Box}% \kern-\alignsep@ $\@emphEQ@Right$}}% \fi \if@emphEQ@L \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@BoxWidth][c]{% %\kern\eqnshift@ %\kern-\alignsep@ $\@emphEQ@Left$% \kern-\eqnshift@ %\kern-\alignsep@ \usebox{\@emphEQ@Box}% %\kern-\eqnshift@ \kern-\alignsep@ $\@emphEQ@Right$}}% \fi \if@emphEQ@R \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@BoxWidth][c]{% $\@emphEQ@Left$% \kern-\eqnshift@ \usebox{\@emphEQ@Box}% \kern-\eqnshift@ $\@emphEQ@Right$}}% \fi \fi % \end{macrocode} % \subsubsection{\env{alignat}} % ~ % \begin{macrocode} \if@emphEQ@alignat \if@emphEQ@FLL \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@BoxWidth][l]{% \if@emphEQ@shadowbox \kern.5\shadowsize \fi $\@emphEQ@Left$% \kern-.5\@emphEQ@boxtypelength \kern-\@mathmargin \kern-\@emphEQ@lwd \usebox{\@emphEQ@Box}% \kern\@mathmargin \kern\@emphEQ@displaywidth \kern-\linewidth $\@emphEQ@Right$}}% \fi \if@emphEQ@FLR \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@BoxWidth][l]{% \if@emphEQ@shadowbox \kern.5\shadowsize \fi $\@emphEQ@Left$% \kern-.5\@emphEQ@boxtypelength \kern-\@mathmargin \kern-\@emphEQ@lwd \usebox{\@emphEQ@Box}% \kern\@mathmargin \kern\@emphEQ@displaywidth \kern-\linewidth \kern\@emphEQ@lwd \kern.5\@emphEQ@boxtypelength $\@emphEQ@Right$}}% \fi \if@emphEQ@L \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@BoxWidth][c]{% $\@emphEQ@Left$% \kern-\eqnshift@ \usebox{\@emphEQ@Box}% \kern-\eqnshift@ $\@emphEQ@Right$}}% \fi \if@emphEQ@R \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@BoxWidth][c]{% $\@emphEQ@Left$% \kern-\eqnshift@ \usebox{\@emphEQ@Box}% \kern-\eqnshift@ $\@emphEQ@Right$}}% \fi \fi % \end{macrocode} % \subsubsection{\env{gather}} % ~ % \begin{macrocode} \if@emphEQ@gather \if@emphEQ@FLL \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@BoxWidth][l]{% \if@emphEQ@shadowbox \kern.5\shadowsize \fi $\@emphEQ@Left$% \kern-.5\@emphEQ@boxtypelength \kern-\@mathmargin \kern-\@emphEQ@lwd \usebox{\@emphEQ@Box}% \kern-\linewidth \kern\@mathmargin \kern\@emphEQ@displaywidth $\@emphEQ@Right$}}% \fi \if@emphEQ@FLR \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@BoxWidth][l]{% \if@emphEQ@shadowbox \kern.5\shadowsize \fi $\@emphEQ@Left$% \kern-.5\@emphEQ@boxtypelength \kern-\@mathmargin \kern-\@emphEQ@lwd \usebox{\@emphEQ@Box}% \kern-\linewidth \kern.5\@emphEQ@boxtypelength \kern\@mathmargin \kern\@emphEQ@displaywidth \kern\@emphEQ@lwd $\@emphEQ@Right$}}% \fi \if@emphEQ@L \setlength{\tagwidth@}{\eqnshift@+\@emphEQ@rwd}% \setlength{\@emphEQ@templength}{\linewidth-\totwidth@ -\eqnshift@}% \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@BoxWidth][c]{% \ifdim\@emphEQ@templength<\tagwidth@ \setlength{\tagwidth@}{\@emphEQ@templength +\@emphEQ@lwd}% \ifdim\tagwidth@<\eqnshift@ \kern-\@emphEQ@templength \kern\eqnshift@ \fi \else \kern-\@emphEQ@lwd \kern\@emphEQ@rwd \kern-\@emphEQ@templength \kern\eqnshift@ \fi $\@emphEQ@Left$% \kern-\eqnshift@ \usebox{\@emphEQ@Box}% %\kern-\eqnshift@ \kern-\@emphEQ@lwd \kern\@emphEQ@rwd \kern-\@emphEQ@templength $\@emphEQ@Right$}}% \fi \if@emphEQ@R \setlength{\tagwidth@}{\eqnshift@+\@emphEQ@rwd}% \setlength{\@emphEQ@templength}{\linewidth-\totwidth@ -\eqnshift@}% \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@BoxWidth][c]{% \kern-\@emphEQ@lwd \kern\@emphEQ@rwd \kern\@emphEQ@templength \kern-\eqnshift@ $\@emphEQ@Left$% \ifdim\@emphEQ@templength>\tagwidth@ \kern-\eqnshift@ \else \kern\@emphEQ@lwd \kern-\@emphEQ@rwd \kern-\@emphEQ@templength \fi \usebox{\@emphEQ@Box}% \kern-\eqnshift@ $\@emphEQ@Right$}}% \fi \fi % \end{macrocode} % \subsubsection{\env{multline}} % % \env{multline} is somewhat more difficult because \env{multline$*$} % differs on several accounts. Thus we make use of our little test % to see if the math structure was numbered to begin with % (\verb|\if@emphEQ@NoNumEq|). % \begin{macrocode} \if@emphEQ@multline \if@emphEQ@FLL \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@displaywidth][l]{% \if@emphEQ@shadowbox \kern.5\shadowsize \fi $\@emphEQ@Left$% \kern-.5\@emphEQ@boxtypelength \kern-\@emphEQ@lwd \if@emphEQ@NoNumEq \if@emphEQ@shadowbox \kern-\shadowsize \fi \kern-\@mathmargin \else \kern-\tagwidth@ \kern-\multlinetaggap \fi \usebox{\@emphEQ@Box}% \kern-\@emphEQ@boxtypelength \if@emphEQ@NoNumEq \kern-\multlinegap \else \kern\multlinegap \fi \kern-\@emphEQ@rwd \kern-\@emphEQ@lwd \kern-\@mathmargin $\@emphEQ@Right$}}% \fi \if@emphEQ@FLR \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@displaywidth][l]{% \if@emphEQ@shadowbox \kern.5\shadowsize \fi $\@emphEQ@Left$% \kern-.5\@emphEQ@boxtypelength \kern-\@emphEQ@lwd \kern-\@mathmargin \usebox{\@emphEQ@Box}% \kern-\@emphEQ@boxtypelength \kern-\@emphEQ@rwd \kern-\@emphEQ@lwd \if@emphEQ@NoNumEq \kern-\multlinegap \else \kern-\multlinetaggap \fi \kern-\@mathmargin \kern-\tagwidth@ $\@emphEQ@Right$}}% \fi \if@emphEQ@L \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@displaywidth][l]{% \if@emphEQ@shadowbox \kern.5\shadowsize \fi $\@emphEQ@Left$% \kern-.5\@emphEQ@boxtypelength \kern-\@emphEQ@lwd \if@emphEQ@NoNumEq \kern-\multlinegap \kern.5\@emphEQ@lwd \kern-.5\@emphEQ@rwd \if@emphEQ@shadowbox \kern-.5\shadowsize \fi \else \kern-\multlinetaggap \kern-\tagwidth@ \fi \usebox{\@emphEQ@Box}% \kern-.5\@emphEQ@boxtypelength \if@emphEQ@NoNumEq \kern.5\@emphEQ@rwd \kern-.5\@emphEQ@lwd \fi \kern-\@emphEQ@rwd \kern-\multlinegap $\@emphEQ@Right$}}% \fi \if@emphEQ@R \savebox{\@emphEQ@Box}{\makebox[\@emphEQ@displaywidth][l]{% \if@emphEQ@shadowbox \kern.5\shadowsize \fi $\@emphEQ@Left$% \kern-.5\@emphEQ@boxtypelength \if@emphEQ@NoNumEq \if@emphEQ@shadowbox \kern-.5\shadowsize \fi \kern-.5\@emphEQ@rwd \kern.5\@emphEQ@lwd \fi \kern-\@emphEQ@lwd \kern-\multlinegap \usebox{\@emphEQ@Box}% \kern-.5\@emphEQ@boxtypelength \kern-\@emphEQ@rwd \if@emphEQ@NoNumEq \kern-\multlinegap \kern-.5\@emphEQ@lwd \kern.5\@emphEQ@rwd \else \kern-\multlinetaggap \fi \kern-\tagwidth@ $\@emphEQ@Right$}}% \fi \fi % \end{macrocode} % % \subsubsection{The final step} % % At last here comes the good part! We are now ready to place the % box containing all of our math material. If we have used a % \env{multline} we have to do a few kerning tricks but at least we % would seem to know the drill by now\ldots To make sure vertical % spacing is ok, we put it all into a simple math environment % \verb|\[...\]|. % \begin{macrocode} \[ \if@emphEQ@align \if@emphEQ@L \kern-\alignsep@ \kern\eqnshift@ \fi \fi \if@emphEQ@gather \if@emphEQ@L \kern-\@emphEQ@templength \kern\eqnshift@ \kern\@emphEQ@rwd \kern-\@emphEQ@lwd \fi \if@emphEQ@R \setlength{\tagwidth@}{\eqnshift@+\@emphEQ@rwd}% \ifdim\@emphEQ@templength>\tagwidth@ \kern-\@emphEQ@templength \kern\eqnshift@ \kern\@emphEQ@lwd \else \kern\@emphEQ@templength \kern-\eqnshift@ \kern\@emphEQ@rwd \kern-\@emphEQ@lwd \fi \fi \fi \if@emphEQ@multline \if@emphEQ@NoNumEq % naught \else \if@emphEQ@FLL \kern-\@mathmargin \kern\tagwidth@ \kern\multlinetaggap \fi \if@emphEQ@L \kern\tagwidth@ \kern\multlinetaggap \kern-\multlinegap \fi \if@emphEQ@R \kern-\tagwidth@ \kern-\multlinetaggap \kern\multlinegap \fi \fi \else % \end{macrocode} % If we are using a \cmd{\shadowbox} in centered display mode, I % would rather that the shadowsize is ignored when placing the box. % Reason: I think it looks better. Judge for yourself: % \begin{gather} % a=b\\ % \Phi(x)=\int_{-\infty}^x e^{-t^2/2}\, dt % \end{gather} % % \begin{empheq}[boxtype=\shadowbox] % \begin{gather} % a=b\\ % \Phi(x)=\int_{-\infty}^x e^{-t^2/2}\, dt % \end{gather} % \end{empheq} % \begin{macrocode} \if@emphEQ@shadowbox \if@emphEQ@R \kern\shadowsize \fi \if@emphEQ@L \kern\shadowsize \fi \fi \fi \@emphEQ@boxtype{\usebox{\@emphEQ@Box}}% % \end{macrocode} % After all is done, we empty out the added material and the % boxtype. % \begin{macrocode} \gdef\@emphEQ@Left{}\gdef\@emphEQ@Right{}% \gdef\@emphEQ@boxtype{}% \]% \ifnum0=`{\fi}% \expandafter\end\expandafter{\@emphEQ@EnvName}% } % \end{macrocode} % % \subsection{Going public\ldots} % \begin{macro}{boxtype}\begin{macro}{Left}\begin{macro}{Right}\begin{macro}{empheq} % In order to simplify the user interface, we make use of % \pkg{keyval}. We define three keys to be used along with a more % accessible version of \env{@emphEQ@MainEnv}. % \changes{v0.7}{2003/05/11}{Changed the user interface slightly} % \begin{macrocode} \define@key{empheq}{boxtype}{\renewcommand\@emphEQ@boxtype{#1}} \define@key{empheq}{Left}{\def\@emphEQ@Left{#1}} \define@key{empheq}{Right}{\def\@emphEQ@Right{#1}} \newenvironment{empheq}[1][]{\setkeys{empheq}{#1}\@emphEQ@MainEnv}% {\end@emphEQ@MainEnv\ignorespacesafterend}% % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % \begin{macro}{\DeclareLeftDelimiter} % \changes{v0.7}{2003/05/11}{Added delimiter interface} % \begin{macro}{\DeclareRightDelimiter} % \changes{v0.7}{2003/05/11}{Added delimiter interface} % It might come in handy to have delimiters of the appropriate size % available to cover the math display as in \eqref{eq:1}. Therefore % we define two commands that will create such delimiters once and % for all. % Use this as an inspiration for further kinds of delimiters. % \begin{macrocode} \newcommand{\DeclareLeftDelimiter}[2][\!]{% \@namedef{empheq\expandafter\@gobble\string#2}{ \left#2 \vphantom{\usebox{\@emphEQ@Box}}% \right.#1}} \newcommand{\DeclareRightDelimiter}[2][\!]{% \@namedef{empheq\expandafter\@gobble\string#2}{% #1\left. \vphantom{\usebox{\@emphEQ@Box}}% \right#2}}% \DeclareRightDelimiter{\rbrace} \DeclareLeftDelimiter{\lbrace} % % \end{macrocode} % \end{macro}\end{macro}\end{macro} % \Finale \endinput