% 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 }