From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/calculation/calculation.dtx | 804 +++++++++++++++++++++++ 1 file changed, 804 insertions(+) create mode 100644 macros/latex/contrib/calculation/calculation.dtx (limited to 'macros/latex/contrib/calculation/calculation.dtx') diff --git a/macros/latex/contrib/calculation/calculation.dtx b/macros/latex/contrib/calculation/calculation.dtx new file mode 100644 index 0000000000..aa5b57ac97 --- /dev/null +++ b/macros/latex/contrib/calculation/calculation.dtx @@ -0,0 +1,804 @@ +% +% \title{The calculation environment\\ +% \normalsize formatting reasoned calculations and calculational proofs} +% +% \author{Maarten Fokkinga ({m.m.fokkinga@gmail.com})} +% \maketitle +% \MakeShortVerb{\"} +% \begin{abstract} +% \noindent +% The "calculation" environment formats \emph{reasoned calculations}, +% also called \emph{calculational proofs}. The notion of reasoned +% calculations was originally advocated by Wim Feijen and Edsger +% Dijkstra. The "calculation" package accepts options "fleqn" and +% "leqno" (with the same effect as \LaTeX\ options "fleqn" and "leqno", +% and inherits these from the document class), it allows steps and +% expressions to be numbered (by \LaTeX\ equation numbers, obeying the +% \LaTeX\ "\label" command to refer to these numbers), and a step +% doesn't take vertical space if its hint is empty. An expression in a +% calculation can be given a comment; it is placed at the side opposite +% to the equation numbers. +% \par +% Calculations are allowed inside hints although numbering and +% commenting is then disabled. +% \end{abstract} +% +% \section{User manual} +% This package provides the "calculation" environment, to format +% \emph{reasoned calculations}, also called \emph{calculational proofs}. +% The \emph{steps} in the calculation are vertically listed, and each step +% is accompanied by a (possibly empty) \emph{hint}, explaining why the +% step is valid. This style was originally advocated by Wim Feijen and +% Edsger Dijkstra. The "calculation" package accepts options "fleqn" and +% "leqno" (with the same effect as \LaTeX\ options "fleqn" and "leqno", +% and inherits these from the document class), it allows steps and +% expressions to be numbered (obeying \LaTeX's "\label" command to refer +% to these numbers). A step doesn't take vertical space if its hint is +% empty. An expression in a calculation can be given a comment; it is +% placed at the side opposite to the equation numbers. +% \par +% Calculations are allowed inside hints by the "subcalculation" +% environment (for small calculations which do not deserve a separate +% discussion before or after the main calculation), although numbering +% and commenting is then disabled. +% +% \iffalse ================= BEGIN example =============================== +% Here is some stuff to generate file "calculation.expl", containing an +% example of the "calculation" environment. This file will be read +% twice: once to show it verbatim, and once to show \LaTeX's output. +% +% In order to process this example, this file that you are reading now +% should be used as package. Thus, assuming that this file is called +% calculation.dtx, the driver file should have in its prelude: +% \makeatletter +% \input{calculation.dtx} +% \calc@fleqn\calc@leqno\calc@blocktrue % options: fleqn, leqno, block. +% \makeatother +% Once "calculation.sty" has been generated, you may use +% \usepackage[fleqn,leqno,block]{calculation} +% instead. +% ==================================================================== \fi +% \iffalse From the \TeX book, page 422: \fi +% \chardef\other=12 +% \newwrite\expl +% \immediate\openout\expl=calculation.example +% \def\copytoblankline{\begingroup\setupcopy\copyexpl} +% \def\setupcopy{\def\do##1{\catcode`##1=\other}\dospecials +% \catcode`\|=\other \obeylines} +% {\obeylines \gdef\copyexpl#1 +% {\def\next{#1}% +% \ifx\next\empty\let\next=\endgroup % +% \else\immediate\write\expl{\next} \let\next=\copyexpl\fi\next}} +% \copytoblankline% +% \begin{verbatim} +% Demo: +% \begin{calculation}[\approx] +% expr \comment{cmnt!} +% \step*{\label{N}% +% This step has nbr~\ref{N}} +% expr +% \step*{} +% \label{N2} +% expr~left~part~~~ + ~~~ +% \\ +% expr~right~part +% \step[=]{ +% left part:\\ +% \begin{subcalculation}[\leq] +% expr +% \step{hint} +% expr +% \step{hint} +% expr +% \end{subcalculation} +% \\ +% right part, similarly:\\ +% \begin{subcalculation} +% expr \step{} expr +% \step{} expr +% \end{subcalculation} +% \\ +% end of hint +% } +% \doNumber\label{E} +% this~expr~has~number~\ref{E} +% \step{hint 1st line\\ +% hint 2nd line} +% expr +% \end{calculation} +% Note: step (\ref{N2}) is empty. +% \end{verbatim} + +% \iffalse Previous blank line is significant! \fi +% \immediate\closeout\expl +% \IfFileExists{calculation.example}{ +% \subsection{Example} +% \newsavebox{\fminibox} +% \newlength{\fminilength} +% \newenvironment{fminipage}[1][\linewidth] +% {\setlength{\fminilength}{##1}% +% \begin{lrbox}{\fminibox}\begin{minipage}{\fminilength}} +% {\end{minipage}\end{lrbox}\noindent +% \makebox[0pt][r]{\fbox{\usebox{\fminibox}}}\ignorespaces} +% Here is an example (with options "fleqn", "leqno", and "block", +% and default step symbol `$=$'); \LaTeX\ source on the left, +% output on the right: +% \par\noindent +% \begin{center}\hspace*{-0.08\linewidth} +% \begin{fminipage}[0.43\linewidth] +% \input{calculation.example} +% \end{fminipage}% +% \renewenvironment{verbatim}{\relax}{\relax}% +% \makebox[0pt][l]{\fbox{\begin{minipage}{0.5\linewidth} +% \input{calculation.example} +% \end{minipage}}} +% \end{center}}{} +% \iffalse ================= END of example ========================= \fi +% \iffalse ========================================================== \fi +% +% \subsection{Usage} +% The "calculation" environment is used in it most simple form as +% follows: +% \pagebreak[3] +% \begin{verbatim} +% \begin{calculation} +% EXPRESSION +% \step{HINT} +% EXPRESSION +% \step{HINT} +% EXPRESSION +% ... +% \end{calculation}\end{verbatim} +% Each "HINT" is normal text, each "EXPRESSION" is mathematical text.\par +% Depending on various parameters, the output is, more or less, like +% this: +% \begin{verbatim} +% EXPRESSION +% = { HINT } +% EXPRESSION +% = { HINT } +% EXPRESSION +% ...\end{verbatim} +% Command "\stepsymbol" defines the default step symbol, "=" in the +% above example; it can be redefined with "\renewcommand". Moreover, the +% "calculation" environment itself has an optional parameter, overruling +% the default step symbol in this specific calculation, and even each +% step has an optional parameter giving the step symbol for that +% particular step. Command "\step*" produces a step that is numbered +% with an equation number, as in \LaTeX; \LaTeX\ command "\label" may be +% used to label the number so that references can be made to it. Command +% "\doNumber" inside an EXPRESSION produces an equation number. Command +% "\comment{TEXT}" inside an EXPRESSION produces TEXT at the side of the +% paper opposite to the equation number side. So, in full glory, the +% environment has the following appearance: +% \begin{macrocode} +%% ==================== Usage ==================================== +%% +%% \begin{calculation}[SYMBOL] +%% EXPRESSION <-- may contain \doNumber and \comment{TEXT} +%% \step*[SYMBOL]{HINT} +%% EXPRESSION <-- may contain \doNumber and \comment{TEXT} +%% \step*[SYMBOL]{HINT} +%% EXPRESSION <-- may contain \doNumber and \comment{TEXT} +%% ... +%% \end{calculation} +%% Each asterisk "*" and each part "[...]" is optional. +%% +% \end{macrocode} +% An empty "HINT" +% takes no vertical space while the "SYMBOL" is still vertically +% centered in between the two "EXPRESSIONs". Both in "EXPRESSION" and in +% "HINT" new lines may be generated by~"\\". As in \LaTeX, "EXPRESSION" +% may not contain empty lines. Hints may have empty lines, even at the +% beginning. +% +% Option "block" makes the entire hint (possibly several lines) into one +% block which, as a whole, is surrounded by delimiters. +% +% Page breaks will occur only immediately after a step-plus-hint; a +% page break within or after an expression would be confusing for the +% reader. +% +% \subsection{Options and document style parameters} +% By default, calculations are placed horizontally centered on the page, +% but when the entire document has option "fleqn" (``flush left +% equations''), or when the package is given this option explicitly, +% then calculations are placed flush left. +% +% By default, calculations have their step and expression numbers at the +% right side of the page (just as in \LaTeX), but when the entire +% document has option "leqno" (``left equation numbers''), or when the +% package is given this option explicitly, then calculations are placed +% at the left side of the page. +% +% By default, the first line of a "HINT" is opened by "\Hlineopen" and +% the last one is closed by "\Hlineclose" (braces in the above example), +% but when option "block" is given to the package, then the entire hint +% is made into one block surrounded by "\Hblockopen" and "\Hblockclose". +% Both "\Hblockopen" and "\Hblockclose" must be ``delimiters'' so that +% they can be stretched vertically. At least the following symbols are +% delimiters: braces~$\{~\}$, brackets~$[~]$, vertical bar~$|$, vertical +% double bar~$\|$, angles~$\langle~\rangle$, and ``nothing'' (in \LaTeX\ +% indicated by a dot~"."). These commands can be redefined with +% "\renewcommand". +% +% The amount of space between "\Hlineopen" and the first token of the +% hint is given by "\Hsep". The amount of indentation of the text of a +% hint, relative to the expressions, is given by "\Hindent" plus "\Hsep" +% (plus the width of "\Hblockopen" if option "block" is valid). +% +% +% In summary, the following are the style parameters and options: +% \begin{macrocode} +%% -------------- DOCUMENT STYLE PARAMETERS ------------------------ +%% options: +%% fleqn, leqno, block +%% commands: +%% \newcommand{\stepsymbol}{=} +%% \newcommand{\Hblockopen}{|} +%% \newcommand{\Hblockclose}{.} +%% \newcommand{\Hlineopen}{\lbrace} +%% \newcommand{\Hlineclose}{\rbrace} +%% \newcommand{\Hindent}{1em} +%% \newcommand{\Hsep}{1ex} +%% \newcommand{\calculcolsep}{\arraycolsep} +%% \newcommand{\Hposv}{t} +%% % vertical position of the step symbol in front of a block hint +%% These default values may be redefined by "\renewcommand". +% \end{macrocode} +%% +\iffalse ============================== code =======================\fi +% \section{The LaTeX code for the macros} +% +% \begin{macrocode} + +\def\fileversion{1.00} +\def\filedate{5 Jan 2015} +\def\docdate{5 Jan 2015} + +\ProvidesPackage{calculation}[2014/12/05 Format reasoned calculations] + +% \end{macrocode} +% \changes{v0.x}{1991-2014}{Ugly constructed, ugly to use, nice output} +% \changes{v1.00}{5 Jan 2015}{Original idea implemented anew} + +% +% \noindent +% All auxiliary variables specific to this package are named as follows: +% \begin{verbatim} +% \calc@.... or +% \subcalc@... or +% \ifcalc@... or +% \endcalc@... +% \end{verbatim} +% Here are the options "fleqn", "leqno", and "block", and their effect: +% \begin{macrocode} + +\DeclareOption{fleqn}{\calc@fleqn} +\DeclareOption{leqno}{\calc@leqno} +\DeclareOption{block}{\calc@blocktrue} + +% \end{macrocode} +% +% \subsection{Preliminary auxiliaries} +% To place comments and step/expr numbers at opposite sides, we place +% them in a very wide box at the right side of the page, and +% surround them by suitable fill's: +% \begin{verbatim} +% ... \calc@eqnoLfil \calc@eqnoRfil ... +% ... \calc@eqnoLfil \calc@eqnoRfil ... +% ... \calc@eqnoRfil \calc@eqnoLfil ... +% \end{verbatim} +% Depending on the options, these ``fill''s are set to "\hfil" or "{}". +% We first check that these fill commands are not yet in use: +% \begin{macrocode} + +\newcommand{\calc@fill}{\relax} +\newcommand{\calc@eqnoLfil}{\relax} +\newcommand{\calc@eqnoRfil}{\relax} + +% \end{macrocode} +% Eqno's at the left side means no fill at the L~side and a real fill at the R~side: +% \begin{macrocode} + +\newcommand{\calc@leqno} + {\def\calc@eqnoLfil{}\def\calc@eqnoRfil{\hfil}} + +% \end{macrocode} +% Eqno's at the right side: +% \begin{macrocode} + +\newcommand{\calc@reqno} + {\def\calc@eqnoRfil{}\def\calc@eqnoLfil{\hfil}} + +% \end{macrocode} +% Calculations horizontally centered on the page: +% \begin{macrocode} + +\newcommand{\calc@ceqn}{\def\calc@fill{fil}} + +% \end{macrocode} +% Calculations flush left: set "\calc@indent" to "\mathindent". +% However, global document option fleqn defines "\mathindent"; +% if global option fleqn is not used, "\mathindent" is defined now: +% \begin{macrocode} + +\newcommand{\calc@fleqn} + {\@ifundefined{mathindent} + {\calc@indent\leftmargini}{\calc@indent\mathindent} + \def\calc@fill{fill}} + +% \end{macrocode} +% \subsection{Default settings related to the options} +% +% By default, calculations are centered and eqno's at the right (LaTeX' +% default); and by default no block hints (so "\Hlineopen" at the very +% first line and "\Hlineclose" at the very last line): +% \begin{macrocode} + +\calc@ceqn +\calc@reqno +\newif\ifcalc@block \calc@blockfalse +\newdimen\calc@indent\calc@indent\z@skip + +% \end{macrocode} +% Recall that "\calc@indent" is set to "\mathindent" if "fleqn" is +% valid. +% \begin{macrocode} + +\ProcessOptions + +% \end{macrocode} +% \subsection{Auxiliary commands of general use} +% \begin{macrocode} + +\RequirePackage{delarray} + +% \end{macrocode} +% Package "delarray" (and hence package "array") is required for "\left" +% and "\right" delimiters for array's and tabulars --- which we will +% exploit for hints. With this package, the delimiters come out well if +% the array (tabular, in our case) has option "[t]" (top alignment). +% Command "\@ifmtarg" is my poor man's way to test for an empty +% argument; it should be "\protect"ed in moving arguments. Note: the +% command "\@ifmtarg" provided by "\RequirePackage{ifmtarg}" doesn't +% work if the argument (a HINT in our case) contains `"&"' symbols. +% \begin{macrocode} + +\newcommand\@ifmtarg[3] + {{\def\myempty{}\def\myarg{#1}\ifx\myempty\myarg{#2}\else{#3}\fi}} + %% usage: \@ifmtarg {arg} {then} {else} + +% \end{macrocode} +% +% \subsection{Default values for the document style parameters} +% \noindent +% \iffalse===========================================================\fi +% \fbox{NAMING CONVENTION: EXPR = Expression, H = Hint} +% \iffalse===========================================================\fi +% \begin{macrocode} + +\newcommand{\stepsymbol}{=} +\newcommand{\Hblockopen}{|} +\newcommand{\Hblockclose}{.} +\newcommand{\Hlineopen}{\lbrace} +\newcommand{\Hlineclose}{\rbrace} +\newcommand{\Hindent}{1em} +\newcommand{\Hsep}{1ex} +\newcommand{\Hposv}{t} +\newcommand{\calculcolsep}{\arraycolsep} + +% \end{macrocode} +% The delimiters need some preprocessing in view of the way they will be used (in command "\calc@@@step"). In particular, the spaces at the beginning of a hint will be ignored (see "\HlineOPEN" below). +% \begin{macrocode} + +\newcommand{\Hsepskip}{\hbox to \Hsep {}} +\newcommand{\HlineOPEN} + {\ifcalc@block\else\makebox[0pt][r]{\m@th$\Hlineopen$\Hsepskip}\fi + \ignorespaces} +\newcommand{\HlineCLOSE} + {\ifcalc@block\else\makebox[0pt][l]{\m@th\Hsepskip$\Hlineclose$}\fi} + +% \end{macrocode} +% NOTE: +% The else clause in "\HlineCLOSE", above, assumes that the last hint +% line is not empty. In order to get "\Hlineopen" and "\Hlineclose" +% vertically aligned in case the last hint line is empty, the else +% clause should read in that case: +% +% ``"\makebox[0pt][r]{\m@th$\Hlineclose$\Hsepskip}"''. +% +% \noindent +% Alas, I don't know how to check ``the preceding line is empty'' in +% the definition of "\calc@@@step" below, just in front of +% "\HlineCLOSE". +% \begin{macrocode} + +\newcommand{\HblockOPEN}{\ifcalc@block\Hblockopen\else.\fi} +\newcommand{\HblockCLOSE}{\ifcalc@block\Hblockclose\else.\fi} + +% \end{macrocode} +% +% \subsection{Specific auxiliaries} +% Some sanity checks, and several auxiliaries: +% \begin{macrocode} +\newcommand{\calc@origmath}{\relax} +\newcommand{\calc@stepsymbol}{\relax} +\newlength\calc@math % to store the value of \mathsurround +\newif\ifcalc@emptyH % for temporary local use only +\newif\ifcalc@numberedstep % true if currently in \step* +\newif\ifcalc@eqnoswitch % true if an eqno will be produced +\newcommand{\calc@emptyHskip}{-0.5\baselineskip}% for empty hints +\calc@eqnoswitchfalse +% \end{macrocode} +% By default the expressions in a calculation are not numbered. +% Whenever an expression is to be numbered, the switch is set true. +% This is done by "\doNumber", which will be made available inside expressions of a calculation. Doing "\doNumber" twice should have the same effect as doing it once! +% \begin{macrocode} +\newcommand{\calc@doNumber} + {\ifcalc@eqnoswitch \else + \global\calc@eqnoswitchtrue + \stepcounter{equation} + \gdef\@currentlabel{\p@equation\theequation} + \fi} +% \end{macrocode} + +\iffalse ================= calculation environment ===================\fi +% \subsection{Main code: calculation and step} +% The main idea of the calculation environment is to adapt \LaTeX's way +% of formatting math expressions, and eqnarray in particular. Thus +% "calculation" sets up a "\halign" with three columns: +% \begin{itemize}\item[] +% The 1st one for the step symbol (math mode) \\ +% The 2nd for the hint and expression (math mode) \\ +% The 3rd one for the comment and step/expr number (LR mode) +% \end{itemize} +% +% \noindent +% An eqno is placed in a large "\hbox" of length "\linewidth" which +% itself is considered of zero length and placed at the right in the +% last column. By suitable fill's the eqno then appears either at the +% left or right side of that large "\hbox", and thus at the left or +% right side of the page. +% +% Command "\step" will be invoked inside an expression; thus, briefly +% said, it should have this effect: ``end the expression, begin a new +% line, print the step symbol and hint, and begin a new expression''. +% +% \subsubsection{The calculation environment} +% \begin{environment}{calculation} +% The "calculation" environment has one optional argument, for the step +% symbol, the default being "\stepsymbol"; within the code for the +% environment, the step symbol is known as "\calc@stepsymbol". +% Because the step symbol and expr/hint must be set with zero +% mathsurround, we set mathsurround to zero (by \TeX's "\m@th"), but +% take measures to reset "\mathsurround" to its original value inside +% hints. +% +% A newline command "\\" inside expressions is delegated to "\calc@cr" +% (defined below). +% +% Inside the environment, command "\step" and environment +% "subcalculation" are made available; outside the environment "\step" +% and "subcalculation" may have another meaning. +% +% \begin{macrocode} + +\newenvironment{calculation}[1][\stepsymbol] + {\setlength\calc@math\mathsurround + \def\calc@origmath{\mathsurround\calc@math}% + \abovedisplayskip\topsep + \ifvmode\advance\abovedisplayskip\partopsep\fi + \belowdisplayskip\abovedisplayskip + \belowdisplayshortskip\abovedisplayskip + \abovedisplayshortskip\abovedisplayskip + \def\calc@stepsymbol{#1}% + \tabskip\calc@indent plus 1fil + \let\\=\calc@cr + \def\step{\calc@step}% Make \step available inside calculations + \def\subcalculation{\calc@subcalculation}% similarly subcalculation + \def\endsubcalculation{\endcalc@subcalculation}% + $$ + \halign to \displaywidth + \bgroup + \tabskip\z@ \hfil\m@th$ ## $\hskip\calculcolsep + & \m@th$ ## $\hfil\tabskip 0pt plus 1\calc@fill + & \hfil\llap{##}\tabskip\z@ + \cr + \calc@beginEXPR + } +% \end{macrocode} +% In the preceding line, the "\halign" declaration ends with the +% beginning of a math expression ("\calc@beginEXPR", which will skip to +% the the 2nd column, that is, the column for expressions). The +% following line closes the environment; it ends the last math +% expression ("\calc@endEXPR", which will step over to the last column, +% and print the eqno and comment): +% \begin{macrocode} + {\calc@endEXPR + \egroup $$ \global\@ignoretrue\ignorespaces} + +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\calc@cr} +% The command "\\" within expressions is delegated to "\calc@cr"; it +% ends the current expression, gives a little extra vspace, +% and begins a new line of the expression: +% \begin{macrocode} + +\newcommand\calc@cr{ + \calc@endEXPR + \noalign{\nopagebreak\vskip\jot} + \calc@beginEXPR} + +% \end{macrocode} +% From \LaTeX\ we've taken over the idea of extra "\jot" vertical space +% between lines of one mathematical expression. The "\nopagebreak" +% prevents a calculation to be split within or just after an expression; +% that would be too confusing for the reader. +% \end{macro} +% +\iffalse ================= step command ===================\fi +% \subsubsection{The step command} +% \begin{macro}{\...step} +% Most of the work for the calculation environment, is done in command +% "\step" or its companions "\calc@step", "\cal@@step" and +% "\calc@@@step". +% Recall that "\step" has been made available inside "calculation" by a +% local definition that simply calls "\calc@step". This latter one first +% checks whether the next token is a star~"*" (and stores this +% information in the global "\calc@numberedstep") and then calls +% "\calc@@step". This "\calc@@step" has one optional argument, the +% default being "\calc@stepsymbol" (set by the calculation environment); +% it calls "\calc@@@step" with the step symbol: +% \begin{macrocode} + +\newcommand{\calc@step} + {\@ifstar{\global\calc@numberedsteptrue\calc@@step} + {\global\calc@numberedstepfalse\calc@@step}} + +\newcommand{\calc@@step}[1][\calc@stepsymbol]{\calc@@@step{#1}} + +% \end{macrocode} +% +% \noindent +% \DescribeMacro{\calc@@@step} +% Now, the final "\calc@@@step" has two obligatory arguments: +% \begin{itemize}\item[] +% "#1" = step symbol\\ +% "#2" = hint lines possibly including several "\\"'s +% \end{itemize} +% As a preparation it checks whether the hint is empty and stores this +% in "\calc@Hempty". Then it ends the current expression, does a +% negative vskip if the hint is empty, and increases the equation +% counter if the step is numbered: +% \begin{macrocode} + +\newcommand{\calc@@@step}[2] + { \@ifmtarg{#2}{\global\calc@emptyHtrue}{\global\calc@emptyHfalse} + \calc@endEXPR + \ifcalc@emptyH \noalign{\vskip \calc@emptyHskip} + \else \noalign{\nopagebreak\vskip\jot} + \fi + \ifcalc@numberedstep + \refstepcounter{equation} + \gdef\@currentlabel{\p@equation\theequation} + \gdef\calc@stepno{\theequation} + \fi +% \end{macrocode} +% After these preparations, print the step symbol in the 1st column: +% \begin{macrocode} + #1 & +% \end{macrocode} +% Now print the hint, if not empty. First take care of the +% indentation, then take the hint lines as body of a tabular which +% has "\HblockOPEN" and "\HblockCLOSE" as delimiters and put +% "\HlineOPEN" in front of the 1st line and "\HlineCLOSE" after the +% last line. These delimiters have been defined to be null depending +% on the validity of option "block". The "tabular" comes from package +% "delarray", and thus has the feature of allowing the delimiters +% around the column specification. We also take care to restore +% "\mathsurround" to its original value within each hint line. +% \begin{macrocode} + \ifcalc@emptyH + \else + \hskip\Hindent + \begin{tabular}[\Hposv] + \HblockOPEN{>{\calc@origmath\Hsepskip}l<{\Hsepskip}}\HblockCLOSE + \HlineOPEN #2\HlineCLOSE + \end{tabular} + \fi + & + \ifcalc@numberedstep \calc@print@theequation \fi + \cr +% \end{macrocode} +% Now, having completed the step-and-hint line by "\cr" and before +% beginning the next math expression, do a negative vskip if the hint +% was empty, and put some extra space between the hint and expression +% (just as within expressions): +% \begin{macrocode} + \ifcalc@emptyH \noalign{\vskip \calc@emptyHskip} \fi + \noalign{\vskip\jot} + \calc@beginEXPR + } + +% \end{macrocode} +% \end{macro} +% +\iffalse ====================== Auxiliary commands ===================\fi +% \subsubsection{Remaining auxiliary commands} +% \begin{macro}{\calc@beginEXPR} +% When "\calc@beginEXPR" is called, a new line of the "\halign" of +% "calculation" is to be filled. Since no step symbol has to be printed, +% we skip over to the next column (the 2nd one). This column is +% processed in math mode, so nothing has to be done, except for making +% "\doNumber" and "\comment" available and resetting the current comment +% to ``nothing, yet'': +% \begin{macrocode} + +\newcommand{\calc@beginEXPR} + {& + \def\doNumber{\calc@doNumber} + \def\comment{\gdef\calc@comment} + \gdef\calc@comment{} + } + +% \end{macrocode} +% \end{macro} +% \begin{macro}{\calc@endEXPR} +% When "\calc@endEXPR" is called, we simply step over to the last (3rd) +% column by~"&" and print the eqno and comment (possibly null), and +% close the line with "\cr": +% \begin{macrocode} + +\newcommand{\calc@endEXPR} + { & \calc@@eqno\calc@@comment \cr } + +% \end{macrocode} +% \end{macro} +% \begin{macro}{\calc@@comment} +% The type setting of comments and numbers is rather straightforward: at +% the very right end of a wide "\hbox", which is pretended to be of zero +% width, and surrounded by suitable fill's to shift them to the other +% side, if needed. +% \begin{macrocode} + +\newcommand{\calc@@comment} + {\llap{\hbox to\linewidth + {\calc@eqnoRfil \normalfont\normalcolor\calc@comment + \calc@eqnoLfil}}} +\newcommand{\calc@@eqno} + {\ifcalc@eqnoswitch + \calc@print@theequation + \global\calc@eqnoswitchfalse + \fi} +\newcommand{\calc@print@theequation} + {\llap{\hbox to\displaywidth + {\calc@eqnoLfil \m@th\normalfont\normalcolor (\theequation)% + \calc@eqnoRfil}}} + +% \end{macrocode} +% \end{macro} +% +\iffalse ===================== subcalculation ===================== \fi +% \section{Subcalculation} +% +% There are several problems in using the "calculation" environment +% within hints. First, the width need be determined. (When option "fleqn" +% is valid, then the width is more or less the line length minus these +% three: "\calc@indent", width of widest step symbol, "\Hindent".) +% Second, even if the width for the sub calculation is known, it is hard +% to get the eqno and comment at the right place on the page. Third, in +% all my attempts, a sub calculation in the hint of a numbered step +% takes the number for it self. (This could be solved by implementing a +% stack or push down store in \TeX\ or a kind of recursive commands that +% build their own stack.) In view of all this, we forbid sub +% calculations to have numbered steps, numbered expressions, and +% comments in expressions. (This seems reasonable; after all, a +% subcalculation within a hint should be very simple and not +% ``view-able'' from the outside.) Also, we pretend the calculation to +% have zero width; it is the users responsibility to observe overfull +% lines! Finally, as a kind of fine tuning the lay-out, we halve the +% indentation for the calculation, and make sub calculations flush left. +% Actions within "subcalculation" must not overwrite gobal +% variables of environment "calculation", of course. So, we have to +% introduce some new global variables: +% \begin{macrocode} + +\newif\ifsubcalc@emptyH +\newcommand{\subcalc@stepsymbol}{\relax} + +% \end{macrocode} +% +% \begin{environment}{subcalculation} +% Since numbering and comments are not allowed, we use only two columns. +% +% \begin{macrocode} + +\newenvironment{calc@subcalculation}[1][\stepsymbol]{% + \begin{minipage}[c]{0pt} + \abovedisplayskip 0pt + \belowdisplayskip \abovedisplayskip + \belowdisplayshortskip\belowdisplayskip + \abovedisplayshortskip\abovedisplayskip + \def\subcalc@stepsymbol{#1}% + \@ifundefined{mathindent}{\calc@indent\leftmargini}{}% + \divide\calc@indent by 2 + \tabskip\calc@indent plus 1fil + \let\\=\subcalc@cr + \def\step{\subcalc@step}% Make \step available + \def\comment + {\@latex@error{No \string\comment\space in subcalculations}}% + $$ + \m@th + \halign + \bgroup + \tabskip\z@ \hfil$ ## $\hskip\calculcolsep + & + $ ## $\hfil\tabskip 0pt plus 1\calc@fill + \cr + & + \global\@ignoretrue + } + { \raisebox{0pt}[0pt][1.5ex]{} + \cr \egroup $$\par\end{minipage} + \ignorespaces} +% \end{macrocode} +% \end{environment} +% +% \noindent +% How to deal with "\\" (which will invoke "\subcalc@cr") in hints and +% exprs: Close the current line (of the "\halign") and in the next line +% skip the column for the step symbol: +% \begin{macrocode} + +\newcommand\subcalc@cr + {\cr + \noalign{\nopagebreak\vskip\jot} + & + \global\@ignoretrue\ignorespaces + } + +% \end{macrocode} +% +% \begin{macro}{\subcalc@step} +% A step in a subcalculation is more or less the same as a step in the +% normal calculation, except that numbering is not allowed: +% \begin{macrocode} + +\newcommand{\subcalc@step} + {\@ifstar{\subcalc@@stepSTAR}{\subcalc@@step}} + +\newcommand{\subcalc@@stepSTAR}[1] + {\@latex@error + {No \string\step* in subcalculations; use \string\step.}} + +\newcommand{\subcalc@@step}[1][\subcalc@stepsymbol] + {\subcalc@@@step{#1}} + +\newcommand{\subcalc@@@step}[2] + {\@ifmtarg{#2} + {\global\subcalc@emptyHtrue}{\global\subcalc@emptyHfalse} + \cr + \ifsubcalc@emptyH + \noalign{\vskip \calc@emptyHskip} + \else + \noalign{\nopagebreak\vskip\jot} + \fi + #1 & + \ifsubcalc@emptyH \else + \hskip\Hindent + \hbox to 0pt {% + \begin{tabular}[\Hposv] + \HblockOPEN{>{\calc@origmath\Hsepskip}l<{\Hsepskip}}\HblockCLOSE + \HlineOPEN #2\HlineCLOSE + \end{tabular}} + \fi + \cr + \ifsubcalc@emptyH \noalign{\vskip \calc@emptyHskip} \fi + & \global\@ignoretrue + } +% \end{macrocode} +% \end{macro} +% \iffalse =============== end of calculation.dtx =====================\fi -- cgit v1.2.3