| % proof.sty (Proof Figure Macros) |
| % |
| % version 3.1 (for both LaTeX 2.09 and LaTeX 2e) |
| % Nov 24, 2005 |
| % Copyright (C) 1990 -- 2005, Makoto Tatsuta (tatsuta@nii.ac.jp) |
| % |
| % This program is free software; you can redistribute it or modify |
| % it under the terms of the GNU General Public License as published by |
| % the Free Software Foundation; either versions 1, or (at your option) |
| % any later version. |
| % |
| % This program is distributed in the hope that it will be useful |
| % but WITHOUT ANY WARRANTY; without even the implied warranty of |
| % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| % GNU General Public License for more details. |
| % |
| % Usage: |
| % In \documentstyle, specify an optional style `proof', say, |
| % \documentstyle[proof]{article}. |
| % |
| % The following macros are available: |
| % |
| % In all the following macros, all the arguments such as |
| % <Lowers> and <Uppers> are processed in math mode. |
| % |
| % \infer<Lower><Uppers> |
| % draws an inference. |
| % |
| % Use & in <Uppers> to delimit upper formulae. |
| % <Uppers> consists more than 0 formulae. |
| % |
| % \infer returns \hbox{ ... } or \vbox{ ... } and |
| % sets \@LeftOffset and \@RightOffset globally. |
| % |
| % \infer[<Label>]<Lower><Uppers> |
| % draws an inference labeled with <Label>. |
| % |
| % \infer*<Lower><Uppers> |
| % draws a many step deduction. |
| % |
| % \infer*[<Label>]<Lower><Uppers> |
| % draws a many step deduction labeled with <Label>. |
| % |
| % \infer=<Lower><Uppers> |
| % draws a double-ruled deduction. |
| % |
| % \infer=[<Label>]<Lower><Uppers> |
| % draws a double-ruled deduction labeled with <Label>. |
| % |
| % \deduce<Lower><Uppers> |
| % draws an inference without a rule. |
| % |
| % \deduce[<Proof>]<Lower><Uppers> |
| % draws a many step deduction with a proof name. |
| % |
| % Example: |
| % If you want to write |
| % B C |
| % ----- |
| % A D |
| % ---------- |
| % E |
| % use |
| % \infer{E}{ |
| % A |
| % & |
| % \infer{D}{B & C} |
| % } |
| % |
| |
| % Style Parameters |
| |
| \newdimen\inferLineSkip \inferLineSkip=2pt |
| \newdimen\inferLabelSkip \inferLabelSkip=5pt |
| \def\inferTabSkip{\quad} |
| |
| % Variables |
| |
| \newdimen\@LeftOffset % global |
| \newdimen\@RightOffset % global |
| \newdimen\@SavedLeftOffset % safe from users |
| |
| \newdimen\UpperWidth |
| \newdimen\LowerWidth |
| \newdimen\LowerHeight |
| \newdimen\UpperLeftOffset |
| \newdimen\UpperRightOffset |
| \newdimen\UpperCenter |
| \newdimen\LowerCenter |
| \newdimen\UpperAdjust |
| \newdimen\RuleAdjust |
| \newdimen\LowerAdjust |
| \newdimen\RuleWidth |
| \newdimen\HLabelAdjust |
| \newdimen\VLabelAdjust |
| \newdimen\WidthAdjust |
| |
| \newbox\@UpperPart |
| \newbox\@LowerPart |
| \newbox\@LabelPart |
| \newbox\ResultBox |
| |
| % Flags |
| |
| \newif\if@inferRule % whether \@infer draws a rule. |
| \newif\if@DoubleRule % whether \@infer draws doulbe rules. |
| \newif\if@ReturnLeftOffset % whether \@infer returns \@LeftOffset. |
| |
| % Special Fonts |
| |
| \def\DeduceSym{\vtop{\baselineskip4\p@ \lineskiplimit\z@ |
| \vbox{\hbox{.}\hbox{.}\hbox{.}}\hbox{.}}} |
| |
| % Macros |
| |
| % Renaming @ifnextchar and @ifnch of LaTeX2e to @IFnextchar and @IFnch. |
| |
| \def\@IFnextchar#1#2#3{% |
| \let\reserved@e=#1\def\reserved@a{#2}\def\reserved@b{#3}\futurelet |
| \reserved@c\@IFnch} |
| \def\@IFnch{\ifx \reserved@c \@sptoken \let\reserved@d\@xifnch |
| \else \ifx \reserved@c \reserved@e\let\reserved@d\reserved@a\else |
| \let\reserved@d\reserved@b\fi |
| \fi \reserved@d} |
| |
| \def\@ifEmpty#1#2#3{\def\@tempa{\@empty}\def\@tempb{#1}\relax |
| \ifx \@tempa \@tempb #2\else #3\fi } |
| |
| \def\infer{\@IFnextchar *{\@inferSteps}{\relax |
| \@IFnextchar ={\@inferDoubleRule}{\@inferOneStep}}} |
| |
| \def\@inferOneStep{\@inferRuletrue \@DoubleRulefalse |
| \@IFnextchar [{\@infer}{\@infer[\@empty]}} |
| |
| \def\@inferDoubleRule={\@inferRuletrue \@DoubleRuletrue |
| \@IFnextchar [{\@infer}{\@infer[\@empty]}} |
| |
| \def\@inferSteps*{\@IFnextchar [{\@@inferSteps}{\@@inferSteps[\@empty]}} |
| |
| \def\@@inferSteps[#1]{\@deduce{#1}[\DeduceSym]} |
| |
| \def\deduce{\@IFnextchar [{\@deduce{\@empty}} |
| {\@inferRulefalse \@infer[\@empty]}} |
| |
| % \@deduce<Proof Label>[<Proof>]<Lower><Uppers> |
| |
| \def\@deduce#1[#2]#3#4{\@inferRulefalse |
| \@infer[\@empty]{#3}{\@infer[{#1}]{#2}{#4}}} |
| |
| % \@infer[<Label>]<Lower><Uppers> |
| % If \@inferRuletrue, it draws a rule and <Label> is right to |
| % a rule. In this case, if \@DoubleRuletrue, it draws |
| % double rules. |
| % |
| % Otherwise, draws no rule and <Label> is right to <Lower>. |
| |
| \def\@infer[#1]#2#3{\relax |
| % Get parameters |
| \if@ReturnLeftOffset \else \@SavedLeftOffset=\@LeftOffset \fi |
| \setbox\@LabelPart=\hbox{$#1$}\relax |
| \setbox\@LowerPart=\hbox{$#2$}\relax |
| % |
| \global\@LeftOffset=0pt |
| \setbox\@UpperPart=\vbox{\tabskip=0pt \halign{\relax |
| \global\@RightOffset=0pt \@ReturnLeftOffsettrue $##$&& |
| \inferTabSkip |
| \global\@RightOffset=0pt \@ReturnLeftOffsetfalse $##$\cr |
| #3\cr}}\relax |
| \UpperLeftOffset=\@LeftOffset |
| \UpperRightOffset=\@RightOffset |
| % Calculate Adjustments |
| \LowerWidth=\wd\@LowerPart |
| \LowerHeight=\ht\@LowerPart |
| \LowerCenter=0.5\LowerWidth |
| % |
| \UpperWidth=\wd\@UpperPart \advance\UpperWidth by -\UpperLeftOffset |
| \advance\UpperWidth by -\UpperRightOffset |
| \UpperCenter=\UpperLeftOffset |
| \advance\UpperCenter by 0.5\UpperWidth |
| % |
| \ifdim \UpperWidth > \LowerWidth |
| % \UpperCenter > \LowerCenter |
| \UpperAdjust=0pt |
| \RuleAdjust=\UpperLeftOffset |
| \LowerAdjust=\UpperCenter \advance\LowerAdjust by -\LowerCenter |
| \RuleWidth=\UpperWidth |
| \global\@LeftOffset=\LowerAdjust |
| % |
| \else % \UpperWidth <= \LowerWidth |
| \ifdim \UpperCenter > \LowerCenter |
| % |
| \UpperAdjust=0pt |
| \RuleAdjust=\UpperCenter \advance\RuleAdjust by -\LowerCenter |
| \LowerAdjust=\RuleAdjust |
| \RuleWidth=\LowerWidth |
| \global\@LeftOffset=\LowerAdjust |
| % |
| \else % \UpperWidth <= \LowerWidth |
| % \UpperCenter <= \LowerCenter |
| % |
| \UpperAdjust=\LowerCenter \advance\UpperAdjust by -\UpperCenter |
| \RuleAdjust=0pt |
| \LowerAdjust=0pt |
| \RuleWidth=\LowerWidth |
| \global\@LeftOffset=0pt |
| % |
| \fi\fi |
| % Make a box |
| \if@inferRule |
| % |
| \setbox\ResultBox=\vbox{ |
| \moveright \UpperAdjust \box\@UpperPart |
| \nointerlineskip \kern\inferLineSkip |
| \if@DoubleRule |
| \moveright \RuleAdjust \vbox{\hrule width\RuleWidth |
| \kern 1pt\hrule width\RuleWidth}\relax |
| \else |
| \moveright \RuleAdjust \vbox{\hrule width\RuleWidth}\relax |
| \fi |
| \nointerlineskip \kern\inferLineSkip |
| \moveright \LowerAdjust \box\@LowerPart }\relax |
| % |
| \@ifEmpty{#1}{}{\relax |
| % |
| \HLabelAdjust=\wd\ResultBox \advance\HLabelAdjust by -\RuleAdjust |
| \advance\HLabelAdjust by -\RuleWidth |
| \WidthAdjust=\HLabelAdjust |
| \advance\WidthAdjust by -\inferLabelSkip |
| \advance\WidthAdjust by -\wd\@LabelPart |
| \ifdim \WidthAdjust < 0pt \WidthAdjust=0pt \fi |
| % |
| \VLabelAdjust=\dp\@LabelPart |
| \advance\VLabelAdjust by -\ht\@LabelPart |
| \VLabelAdjust=0.5\VLabelAdjust \advance\VLabelAdjust by \LowerHeight |
| \advance\VLabelAdjust by \inferLineSkip |
| % |
| \setbox\ResultBox=\hbox{\box\ResultBox |
| \kern -\HLabelAdjust \kern\inferLabelSkip |
| \raise\VLabelAdjust \box\@LabelPart \kern\WidthAdjust}\relax |
| % |
| }\relax % end @ifEmpty |
| % |
| \else % \@inferRulefalse |
| % |
| \setbox\ResultBox=\vbox{ |
| \moveright \UpperAdjust \box\@UpperPart |
| \nointerlineskip \kern\inferLineSkip |
| \moveright \LowerAdjust \hbox{\unhbox\@LowerPart |
| \@ifEmpty{#1}{}{\relax |
| \kern\inferLabelSkip \unhbox\@LabelPart}}}\relax |
| \fi |
| % |
| \global\@RightOffset=\wd\ResultBox |
| \global\advance\@RightOffset by -\@LeftOffset |
| \global\advance\@RightOffset by -\LowerWidth |
| \if@ReturnLeftOffset \else \global\@LeftOffset=\@SavedLeftOffset \fi |
| % |
| \box\ResultBox |
| } |