1 % proof.sty (Proof Figure Macros)
5 % Copyright (C) 1990 Makoto Tatsuta (tatsuta@riec.tohoku.ac.jp)
7 % This program is free software; you can redistribute it or modify
8 % it under the terms of the GNU General Public License as published by
9 % the Free Software Foundation; either versions 1, or (at your option)
12 % This program is distributed in the hope that it will be useful
13 % but WITHOUT ANY WARRANTY; without even the implied warranty of
14 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 % GNU General Public License for more details.
18 % In \documentstyle, specify an optional style `proof', say,
19 % \documentstyle[proof]{article}.
21 % The following macros are available:
23 % In all the following macros, all the arguments such as
24 % <Lowers> and <Uppers> are processed in math mode.
26 % \infer<Lower><Uppers>
29 % Use & in <Uppers> to delimit upper formulae.
30 % <Uppers> consists more than 0 formulae.
32 % \infer returns \hbox{ ... } or \vbox{ ... } and
33 % sets \@LeftOffset and \@RightOffset globally.
35 % \infer[<Label>]<Lower><Uppers>
36 % draws an inference labeled with <Label>.
38 % \infer*<Lower><Uppers>
39 % draws a many step deduction.
41 % \infer*[<Label>]<Lower><Uppers>
42 % draws a many step deduction labeled with <Label>.
44 % \deduce<Lower><Uppers>
45 % draws an inference without a rule.
47 % \deduce[<Proof>]<Lower><Uppers>
48 % draws a many step deduction with a proof name.
51 % If you want to write
67 \newdimen\inferLineSkip \inferLineSkip=2pt
68 \newdimen\inferLabelSkip \inferLabelSkip=5pt
69 \def\inferTabSkip{\quad}
73 \newdimen\@LeftOffset % global
74 \newdimen\@RightOffset % global
75 \newdimen\@SavedLeftOffset % safe from users
80 \newdimen\UpperLeftOffset
81 \newdimen\UpperRightOffset
88 \newdimen\HLabelAdjust
89 \newdimen\VLabelAdjust
99 \newif\if@inferRule % whether \@infer draws a rule.
100 \newif\if@ReturnLeftOffset % whether \@infer returns \@LeftOffset.
101 \newif\if@MathSaved % whether inner math mode where \infer or
106 \def\DeduceSym{\vtop{\baselineskip4\p@ \lineskiplimit\z@
107 \vbox{\hbox{.}\hbox{.}\hbox{.}}\hbox{.}}}
111 % \@SaveMath is called in the very begining of toplevel macros
112 % which are \infer and \deduce.
113 % \@RestoreMath is called in the very last before toplevel macros end.
114 % Remark \infer and \deduce ends calling \@infer.
116 \def\@SaveMath{\@MathSavedfalse \ifmmode \ifinner
117 \relax $\relax \@MathSavedtrue \fi\fi }
119 \def\@RestoreMath{\if@MathSaved \relax $\relax\fi }
123 \def\@ifEmpty#1#2#3{\def\@tempa{\@empty}\def\@tempb{#1}\relax
124 \ifx \@tempa \@tempb #2\else #3\fi }
126 \def\infer{\@SaveMath \@ifnextchar *{\@inferSteps}{\@inferOneStep}}
128 \def\@inferOneStep{\@inferRuletrue
129 \@ifnextchar [{\@infer}{\@infer[\@empty]}}
131 \def\@inferSteps*{\@ifnextchar [{\@@inferSteps}{\@@inferSteps[\@empty]}}
133 \def\@@inferSteps[#1]{\@deduce{#1}[\DeduceSym]}
135 \def\deduce{\@SaveMath \@ifnextchar [{\@deduce{\@empty}}
136 {\@inferRulefalse \@infer[\@empty]}}
138 % \@deduce<Proof Label>[<Proof>]<Lower><Uppers>
140 \def\@deduce#1[#2]#3#4{\@inferRulefalse
141 \@infer[\@empty]{#3}{\@SaveMath \@infer[{#1}]{#2}{#4}}}
143 % \@infer[<Label>]<Lower><Uppers>
144 % If \@inferRuletrue, draws a rule and <Label> is right to
146 % Otherwise, draws no rule and <Label> is right to <Lower>.
148 \def\@infer[#1]#2#3{\relax
150 \if@ReturnLeftOffset \else \@SavedLeftOffset=\@LeftOffset \fi
151 \setbox\@LabelPart=\hbox{$#1$}\relax
152 \setbox\@LowerPart=\hbox{$#2$}\relax
154 \global\@LeftOffset=0pt
155 \setbox\@UpperPart=\vbox{\tabskip=0pt \halign{\relax
156 \global\@RightOffset=0pt \@ReturnLeftOffsettrue $##$&&
158 \global\@RightOffset=0pt \@ReturnLeftOffsetfalse $##$\cr
160 % Here is a little trick.
161 % \@ReturnLeftOffsettrue(false) influences on \infer or
162 % \deduce placed in ## locally
163 % because of \@SaveMath and \@RestoreMath.
164 \UpperLeftOffset=\@LeftOffset
165 \UpperRightOffset=\@RightOffset
166 % Calculate Adjustments
167 \LowerWidth=\wd\@LowerPart
168 \LowerHeight=\ht\@LowerPart
169 \LowerCenter=0.5\LowerWidth
171 \UpperWidth=\wd\@UpperPart \advance\UpperWidth by -\UpperLeftOffset
172 \advance\UpperWidth by -\UpperRightOffset
173 \UpperCenter=\UpperLeftOffset
174 \advance\UpperCenter by 0.5\UpperWidth
176 \ifdim \UpperWidth > \LowerWidth
177 % \UpperCenter > \LowerCenter
179 \RuleAdjust=\UpperLeftOffset
180 \LowerAdjust=\UpperCenter \advance\LowerAdjust by -\LowerCenter
181 \RuleWidth=\UpperWidth
182 \global\@LeftOffset=\LowerAdjust
184 \else % \UpperWidth <= \LowerWidth
185 \ifdim \UpperCenter > \LowerCenter
188 \RuleAdjust=\UpperCenter \advance\RuleAdjust by -\LowerCenter
189 \LowerAdjust=\RuleAdjust
190 \RuleWidth=\LowerWidth
191 \global\@LeftOffset=\LowerAdjust
193 \else % \UpperWidth <= \LowerWidth
194 % \UpperCenter <= \LowerCenter
196 \UpperAdjust=\LowerCenter \advance\UpperAdjust by -\UpperCenter
199 \RuleWidth=\LowerWidth
200 \global\@LeftOffset=0pt
206 \setbox\ResultBox=\vbox{
207 \moveright \UpperAdjust \box\@UpperPart
208 \nointerlineskip \kern\inferLineSkip
209 \moveright \RuleAdjust \vbox{\hrule width\RuleWidth}\relax
210 \nointerlineskip \kern\inferLineSkip
211 \moveright \LowerAdjust \box\@LowerPart }\relax
213 \@ifEmpty{#1}{}{\relax
215 \HLabelAdjust=\wd\ResultBox \advance\HLabelAdjust by -\RuleAdjust
216 \advance\HLabelAdjust by -\RuleWidth
217 \WidthAdjust=\HLabelAdjust
218 \advance\WidthAdjust by -\inferLabelSkip
219 \advance\WidthAdjust by -\wd\@LabelPart
220 \ifdim \WidthAdjust < 0pt \WidthAdjust=0pt \fi
222 \VLabelAdjust=\dp\@LabelPart
223 \advance\VLabelAdjust by -\ht\@LabelPart
224 \VLabelAdjust=0.5\VLabelAdjust \advance\VLabelAdjust by \LowerHeight
225 \advance\VLabelAdjust by \inferLineSkip
227 \setbox\ResultBox=\hbox{\box\ResultBox
228 \kern -\HLabelAdjust \kern\inferLabelSkip
229 \raise\VLabelAdjust \box\@LabelPart \kern\WidthAdjust}\relax
231 }\relax % end @ifEmpty
233 \else % \@inferRulefalse
235 \setbox\ResultBox=\vbox{
236 \moveright \UpperAdjust \box\@UpperPart
237 \nointerlineskip \kern\inferLineSkip
238 \moveright \LowerAdjust \hbox{\unhbox\@LowerPart
239 \@ifEmpty{#1}{}{\relax
240 \kern\inferLabelSkip \unhbox\@LabelPart}}}\relax
243 \global\@RightOffset=\wd\ResultBox
244 \global\advance\@RightOffset by -\@LeftOffset
245 \global\advance\@RightOffset by -\LowerWidth
246 \if@ReturnLeftOffset \else \global\@LeftOffset=\@SavedLeftOffset \fi