diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-12 23:47:08 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-12 23:47:08 +0000 |
commit | 3b927eb81270ca256a85224fda0e0812120168a3 (patch) | |
tree | fc763fee20a22d51cc18825d462a1554e86fcdce /Master/texmf-dist/tex/texsis/base/TXSprns.tex | |
parent | 4b07bbd62fe0b4abde93a927773133aac4a9a2ac (diff) |
trunk/Master/texmf-dist/tex/texsis/
git-svn-id: svn://tug.org/texlive/trunk@626 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/texsis/base/TXSprns.tex')
-rw-r--r-- | Master/texmf-dist/tex/texsis/base/TXSprns.tex | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/texsis/base/TXSprns.tex b/Master/texmf-dist/tex/texsis/base/TXSprns.tex new file mode 100644 index 00000000000..ea6c988caa7 --- /dev/null +++ b/Master/texmf-dist/tex/texsis/base/TXSprns.tex @@ -0,0 +1,230 @@ +%% file: TXSprns.tex - Automatic Parnthesis Sizing - TeXsis version 2.18 +%% @(#) $Id: TXSprns.tex,v 18.0 1999/07/09 17:24:29 myers Exp $ +%======================================================================* +% +% \autoparens provides automatic sizing of () and [] in displayed +% equations by making these active characters and inserting \left and +% \right as needed. Automatic sizing is NOT provided for other delimiters +% such as \{ \} -- these must be handled as in Plain TeX. This feature is +% turned on and off by: +% \autoparens ==> automatic sizing on +% \offparens ==> automatic sizing off +% The default is \autoparens once you say \texsis. +% +% While \onparens generally simplifies the typing of equations, +% it can cause problems which might not be expected. Since \autoparens uses +% \left ... \right internally, parentheses must be properly balanced. +% In particular, splitting parentheses by breaking a long equation with +% an \EQNalign will produce an error. Most problems can be solved by using +% control sequences for the plain characters: +% \lparen ==> ( +% \rparen ==> ) +% \lbrack ==> [ +% \rbrack ==> ] +% +% You can still use \left and \right in equations with \autoparens, +% but they are implicitly inserted if you fortet them. +% +% In older versions of TeXsis we used \onparens to provide automatic +% parenthesis sizing everywhere. This caused some unexpected problems, +% so we have restricted \autoparens to displayed equations, where it +% is most usefful. \onparens is still around, but we don't encourage +% its use anymore. Still, we did fix this a little bit so that parens +% and brackets are only active in math mode. +% +% Dependencies: \emsg and \@errmark come from TXSmacs.TeX +%======================================================================* +\message{Auto-sizing of Parentheses.} +\catcode`@=11 % make sure @ is a letter here + +% ---------- first save usual definitions of () and [] and \left and \right + +\ifx\@left\undefined % if \@left undefined then do it + \let\@left=\left \let\@right=\right + \let\lparen=( \let\rparen=) + \let\lbrack=[ \let\rbrack=] + \let\@vert=\vert +\fi % else its already done + +% ---------- Now make definition of () and [] for use when they are active + +\begingroup %=== make these active catcodes local === +\catcode`\(=\active \catcode`\)=\active +\catcode`\[=\active \catcode`\]=\active + +\gdef({\relax % \relax just in case in an alignment + \ifmmode \push@delim{P}% % if math mode record opening delim + \@left\lparen % and do \left ( + \else\lparen % else, just a left paren + \fi} + +\global\let\@lparen=( % another name for it + +\gdef){\relax % \relax in case in an alignment + \ifmmode\@right\rparen % if math mode then \right ) + \pop@delim\@delim % get last opening delimiter + \if P\@delim \relax \else % check for miss-matched delimiters + \if B\@delim\emsg{> Expecting \string] but got \string).}% + \@errmark{PAREN}% + \else\emsg{> Unmatched \string).}\@errmark{PAREN}% + \fi\fi + \else\rparen % else just a ")" + \fi} + +\gdef[{\relax % just in case in alignment + \ifmmode \push@delim{B}% % if math mode record opening delim + \@left\lbrack % and do \left [ + \else\lbrack % else, just a left bracket + \fi} +\global\let\@lbrack=[ % another name for it + +\gdef]{\relax % \relax in case in an alignment + \ifmmode\@right\rbrack % if math mode then \right ] + \pop@delim\@delim % get last opening delimeter + \if B\@delim \relax \else % check for mis-matched delimeters + \if P\@delim\emsg{> Expecting \string) but got \string].}% + \@errmark{BRACK}% + \else\emsg{> Unmatched \string].}\@errmark{BRACK}% + \fi\fi + \else\rbrack % else just a "]" + \fi} + +% Make \left(, \right), \left[ and \right] work properly even if easyparens +% is on. To use these \let\left=\EZYleft and \let\right=\EZYright + +\gdef\EZYleft{\futurelet\nexttok\@EZYleft} % \nexttok is next tok on list +\gdef\@EZYleft#1{% % look for ( or [ + \ifx\nexttok( \let\nexttok=\lparen % replace ( with \lparen + \else + \ifx\nexttok[ \let\nexttok=\lbrack % replace [ with \lbrack + \fi\fi + \@left\nexttok} % do usual \left to \nexttok + +\gdef\EZYright{\futurelet\nexttok\@EZYright} % \nexttok is next tok on list +\gdef\@EZYright#1{% % look for ) or ] + \ifx\nexttok) \let\nexttok=\rparen % replace ) with \rparen + \else + \ifx\nexttok] \let\nexttok=\rbrack % replace ] with \rbrack + \fi\fi + \@right\nexttok} % do usual \right to \nexttok + +\endgroup %=== close () and [] as active characters === + +%--------------------------------* +% macros to push and pop delimeter marker on the stack called \@delimlist + +\toksdef\@CAR=0 \toksdef\@CDR=2 % for push and pop delimeters + +\def\push@delim#1{\@CAR={{#1}}% % add #1 + \@CDR=\XA{\@delimlist}% % to front + \edef\@delimlist{\the\@CAR\the\@CDR}}% % of \@delimlist + +\def\pop@delim#1{\XA\pop@delimlist\@delimlist\endlist#1}% pop from list to #1 + +\def\pop@delimlist#1#2\endlist#3{\def\@delimlist{#2}\def#3{#1}} + +\def\@delimlist{} % start with null list + +%==================================================* +% Turning EZparens on and off: + +\newif\ifEZparens \EZparensfalse + +\def\autoparens{\EZparenstrue % turn on the switch + \everydisplay={\@onParens}% % in displayed equations + } + +\def\@onParens{% turn on paren-matching definitions and active characters + \ifEZparens % only if switched on + \def\@delimlist{}% % reset delim list to null + \let\left=\EZYleft % get \left([ correct + \let\right=\EZYright % similarly for \right's + \catcode`\(=\active \catcode`\)=\active % make ( and ) + \catcode`\[=\active \catcode`\]=\active % and [ and ] active + \fi} + +\def\offparens{% turn off automatic paren sizing + \EZparensfalse\@offParens % switch and active chars off + \everymath={}\everydisplay={}} % clear \every... + +\def\@offParens{% + \let\left=\@left % restore \left and \right + \let\right=\@right % to original definitions + \catcode`(=12 \catcode`)=12 % make ( and ) + \catcode`[=12 \catcode`]=12 % and [ and ] "other" + } +\offparens % default until \texsis + +%======================================================================* +% \onparens (backward compatability, but to be removed soon) +% +% \onparens does automatic parenthesis sizing in both in-line +% and displayed equations. In-line equations are a bit difficult. +% When TeX gets a $ it has to look ahead at the next character to +% see if it is another $. If it was not then it puts it back in +% the input stream, but the character code is already set -- if it +% was ( or [ then you can't make these \catcode=\active. Thus in +% math mode (but not displayed equations) we have to look ahead +% at the token and take corrective action. +% +% Unfortunately if the first token is complex (i.e. enclosed in { }'s) +% then the lookahead ends up removing the { }'s, which can cause +% errors. Put \relax at the begining of such equations until I find +% a fix. Or use \autoparens instead. + +\def\onparens{% OLD version of \autoparens for both math and displayed eqns + \EZparenstrue % turn on the switch + \everymath={\@onMathParens}% % in math mode + \everydisplay={\@onParens}% % in displayed equations + } +\def\easyparenson{\onparens} % OLD synonym + +\def\@onMathParens#1{% check lookahead for a missed ( or [ + \@SetRemainder#1\endlist % to put back lookahead + \ifx#1\lparen\let\@remainder=\@lparen\fi % lookahead for missed ( + \ifx#1\lbrack\let\@remainder=\@lbrack\fi % and get rid of [ found + \@onParens % make ), (, ], [ active + \@remainder} % now do what followed + +% \@SetRemainder looks at lookahead from \@onMathParens. If there +% is more than one token (#2 not empty) then the lookahead was a complex +% token so it should be enclosed in { }'s + +\def\@SetRemainder#1#2\endlist{% + \ifx @#2@ \def\@remainder{#1}% + \else \def\@remainder{{#1#2}}% + \fi} + +\def\easyparensoff{\offparens} % synonym for \offparens + +% -- Redefine some PLAIN macros so that they will work with \easyparenson + +\def\pmatrix#1{\@left\lparen\matrix{#1}\@right\rparen} + +\def\bordermatrix#1{\begingroup \m@th + \setbox\z@\vbox{\def\cr{\crcr\noalign{\kern2\p@\global\let\cr\endline}}% + \ialign{$##$\hfil\kern2\p@\kern\p@renwd&\thinspace\hfil$##$\hfil + &&\quad\hfil$##$\hfil\crcr + \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}% + #1\crcr\omit\strut\cr}}% + \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}% + \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}% + \setbox\tw@\hbox{$\kern\wd\@ne\kern-\p@renwd\@left\lparen\kern-\wd\@ne + \global\setbox\@ne\vbox{\box\@ne\kern2\p@}% + \vcenter{\kern-\ht\@ne\unvbox\z@\kern-\baselineskip}\,\right\rparen$}% + \;\vbox{\kern\ht\@ne\box\tw@}\endgroup} + +% Partitioned matrix +% usage: +% \partitionmatrix{a&&b&&c\cr\tabelrule d&e&f\cr} +% (leave off the last \cr or you'll get an extre line at the bottom) +% (The \mathstrut tries to make two n-row partition matrices have the +% same height and depth unless some row is unusually large.) + +\def\partitionmatrix#1{\,\vcenter{\offinterlineskip\m@th + \def\tablerule{\noalign{\hrule}} + \halign{\hfil\loosebox{$\mathstrut ##$}\hfil&&\quad\vrule##\quad&% + \hfil\loosebox{$##$}\hfil\crcr + #1\crcr}}\,} + +%>>> EOF TXSprns.tex <<< |