Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
% pf.sty
%
% last modified on Mon Jul 13 15:55:55 1992 by lamport
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% THE pf STYLE %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% CONTENTS
% 1. Introduction
% 2. The Basic Commands
% 3. Different Styles of Numbering
% 4. Indentation
% 5. Assumptions
% 6. Portions of a Proof
% 7. Conjunctions and Disjunctions
% 8. Miscellany
% 9. List of all Commands and Environments
%
% 1. INTRODUCTION
%
% The pf style provides commands and environments for typesetting
% hierarchically structured proofs. Below is an example of what
% such a proof looks like, and the commands that generate it.
% The commands are explained individually below. Then
%
% THE OUTPUT THE INPUT
% ~~~~~~~~~~ ~~~~~~~~~
% Any text... Any text
% \begin{proof}
% 1. Text of step 1. \step{label-1}{Text of step 1.}
% \begin{proof}
% 1.1. Text of step. \step{label-1.1}{Text of step}
% \begin{proof}
% Proof: Paragraph \pf\ Paragraph proof.~\qed
% proof. [] \end{proof}
%
% 1.2. Text of step. \step{label-1.2}{Text of step.}
% \begin{proof}
% Proof: Paragraph \pf\ Paragraph proof.~\qed
% proof. [] \end{proof}
%
% 1.3. QED \qedstep
% \begin{proof}
% 1.3.1. Text of step \step{label-1.3.1}{Text...}
% Proof: ... [] \begin{proof} ... \end{proof}
%
% 1.3.2. QED \qedstep
% Proof: ... \begin{proof}...\end{proof}
% \end{proof}
% \end{proof}
%
% 2. Text of step 2. \step{label-2}{Text of step 2.}
% Proof: ... \begin{proof} \pf\ ... \end{proof}
%
% 3. QED \qedstep
% Proof: ... \begin{proof} \pf\ ... \end{proof}
%
%
% The best way to read such proofs is hierarchically. To find out
% how, search below for the \pfhidelevel command and the \hideqedproof
% command.
%
%
% 2. THE BASIC COMMANDS
%
% The proof Environment:
% Increments the proof depth, and indents the enclosed text the
% appropriate amount. For example, if the proof environment follows a
% \step command that produces step number 2.6.7, then the first \step
% command inside the environment will produce step number 2.6.7.1.
%
% \step{LABEL}{TEXT}
% This command produces a proof step such as
% 2.6.7.1. TEXT
% The step number 2.6.7.1 is determined by the position of the \step
% command in the proof. The LABEL is a symbol label used to refer to the
% step number. A subsequent \stepref{LABEL} command will generate the
% step number 2.6.7.1. The same LABEL may be re-used, but
% not in a context where it is legal to refer to a previous step with the
% same label. (See the discussion of step numbering below.)
%
% This command is equivalent to
% \begin{step+}{LABEL}
% TEXT
% \end{step+}
% The step+ environment form is more convenient if TEXT is long or
% complicated.
%
% \qedstep
% This command produces something like
%
% 2.6.7.5. QED
%
% If the proof of step 2.6.7 is a sequence of steps (rather than a
% paragraph proof), then the last step in its proof is normally of this
% form. The "QED" in the statement simply denotes the current
% goal---what must be proved to prove step 2.6.7. The proof of this QED
% step will be followed immediately by the
% \end{proof} command that ends the proof of step 2.6.7.
%
% The pf style does not enforce this method of structuring proofs;
% the proof of statement 2.6.7 could end with an ordinary \step
% command.
%
% \pf, \qed
% These are simple text-producing commands that normally begin and end a
% paragraph-style proof. However, they are not required. Remember to
% put a "\ " after the \pf command, and to tie the \qed command to the
% last word of the proof with a "~".
%
% \pfsketch
%
% An intuitive prook sketch often introduces a multi-step proof, as in
%
% 1.3. All odd numbers are prime.
% Proof sketch: The proof is by induction, with the
% base case proved in step 1 and the induction step in
% step 2.
% 1.3.1. The number 1 is a prime.
% Proof: ...
% 1.3.2. If n is an odd prime, then n+2 is prime.
% Proof: ...
% 1.3.3. QED
% Proof: 1.3.1, 1.3.2, and mathematical induction.
%
% This is entered as
%
% \step{label-1.3}{All odd numbers are prime}
% \begin{proof}
% \pfsketch\ The proof is by induction...
% \step{label-1.3.2}{The number 1 is a prime}
% ...
% \end{proof}
%
% The \pfsketch command is, like \pf, just produces the text. It isn't
% required by the pf style.
%
%
% 3. DIFFERENT STYLES OF NUMBERING
%
% In the long style of proof numbering, a step number is something like
% 2.6.7.5, meaning that it is the fifth step in the proof of statement
% 2.6.7, which is the seventh step in the proof of statement 2.6, which
% is... Statement 2.6.7.5 has the short name <4>5, meaning it is the
% fifth statement in the current level-4 proof. Numbering style is
% controlled by the commands
%
% \pfshortnumbers{N} : Use short step numbers for all levels
% >= N (Default is N = 1, using only short
% numbers.
%
% These are local declarations that obey the usual scoping rules. Thus,
% putting a \pfshortnumbers declarations right after a \begin{proof}
% command causes all steps in that proof to have short numbers.
%
% Steps 2.6.7.5, 2.6.6.5, and 4.9.1.5 all have the same short numbers
% <4>5. However, no ambiguity arises from the use of short numbers
% because at most one of these steps can be mentioned at any point in a
% proof. Let the ANCESTORS of step 2.6.7.5 be steps 2.6.7, 2.6, and 2.
% Let the ELDER SIBLINGS of step 2.6.7.5 be steps 2.6.7.1, 2.6.7.2,
% 2.6.7.3, and 2.6.7.4. The proof statement 2.6.7.5 may refer only
% to steps in the following two sets:
% (i) The elder siblings of itself and of its ancestors.
% (ii) Itself and its ancestors.
% The steps in (i) are the previously-proved assertions that can be used
% in the proof of 2.6.7.5. The assumptions of the steps in (ii) are the
% ones that are being assumed in the proof. (Assumptions are discussed
% below.)
%
% The command \stepref{LABEL} anywhere in the proof of step 2.6.7.5 (or in
% the step itself) produces the step number of a step lying in sets (i)
% or (ii) having LABEL as its label (the first argument of its \step
% command). An error message is generated if the \step command has a
% label that is the label of a step in set (i) or (ii).
%
% Note that the last step of a proof is never an elder sibling, so it
% can't be in the set (i) for any statement. A QED-step has no
% assumptions, so it can't be in the set (ii) for any statement. That is
% why the \qedstep command does not specify a label. Actually, \qedstep
% is defined to equal \label{qedstepN}{...}, where N is the current
%. level number. Thus, an error will be generated if two \qedstep commands
% occur in the same proof, since they will have the same labels.
%
% Short step numbers are really nice. They take up less space and are
% easier to read. They are the preferred form for long proofs. However,
% long step numbers are better for referring to a proof step from outside
% the proof. The pf style allows you to print the long numbers of steps as
% marginal notes, something like
%
% Theorem: ...
% ...
% 2.4.5.6. <4>6. All odd numbers greater than 2 are prime.
% 2.4.5.6.1. <5>1. The number 3 is prime.
% ...
%
% (The long numbers are printed in a smaller font, so it looks
% better than you'd guess from this.) The relevant commands are:
%
% \pfsidenumbers{N}{D}
% Print side numbers for proof steps of all levels \geq N, left-aligned
% a distance D to the left of the left margin of the text.
%
% \pfnosidenumbers
% Do not print side numbers (the default)
%
%
% 4. INDENTATION
%
% There are two styles of indentation:
%
% Long Style
% 1. XXXXX
% 1.1. XXXXX
% 1.1.1. XXXXX
% 1.1.1.1. XXXX
% Proof: ...
%
% Short Style
% 1. XXXXX
% 1.1. XXXXX
% 1.1.1. XXXXX
% 1.1.1.1. XXXX
% Proof: ...
%
% In the long style, the proof of a statement lines up with the text of
% the statement. In the short form, each level is indented the same
% distance from the next higher level. The relevant declarations
% are
%
% \pflongindent
% Indent proofs to full width of item label
%
% \pfshortindent
% Indent proofs by the length parameter \pfindent (the default)
%
%
% 5. ASSUMPTIONS
%
% A common form of a step is
%
% <4>5. Assume: 1. n is an odd number
% 2. n > 2
% Prove: n is prime
%
% This asserts that the Prove clause follows from the Assume clause. The
% "QED" at the end of the proof of this step refers to the Prove clause.
% The input to produce this is
%
% \step{label-4.5}{
% \assume{\begin{enumerate}
% \item $n$ is an odd number
% \item $n>2$
% \end{enumumerate}}
% \prove{$n$ is prime}}
%
% The relevant command syntax is
%
% \assume{TEXT}
% \prove{TEXT}
%
% The formatting of the enumerate environment is changed to work
% propertly inside a proof environment. (It is actually redefined
% to be the pfenum environment, described far below.) Note that
% \label and \ref command for subitem b of item 3 produces the label
% "3b". Note: there is an enumerate* environment that is like
% enumerate, except it indents the items.
%
%
% Another form of assumption is a Case assumption. The statement
%
% <5>1. Case: n is of the form 4n+1
%
% means
%
% <5>1. Assume: n is of the form 4n+1
% Prove: QED
%
% where QED is the current goal. A proof by cases is structured
% as follows
%
% <4>5. Assume: 1. n is an odd number
% 2. n > 2
% Prove: n is prime
%
% <5>1. Assume: n equals 4m+1 for some m
% Prove: QED
% Proof: ... []
%
% <5>2. Assume: n equals 4m+3 for some m
% Prove: QED
% Proof: ... []
%
% <5>3. QED
% Proof: By <5>1, <5>2, and assumption <4>.2 (which
% states that n is odd), since any odd number has
% the form 4m+1 or 4m+3. []
%
% A case assumption is produced with a \case command, which works like
% \assume and \prove. It has the syntax
%
% \case{TEXT}
%
% Corresponding to the \assume, \prove, and \case commands are
% the assume+, prove+, and case+ environments. For example, \prove{TEXT}
% is equivalent to \begin{prove+} TEXT \end{prove+}
%
% Note the reference, in the proof of <5>3, to the second conjunct of the
% Assume clause in statement <4>5 as "assumption <4>.2". Since a proof
% of a step can only use assumptions in that step or its ancestors, a
% level number suffices to identify an assumption. The Assume clause of
% statement <4>5 is called "assumption <4>". The ".2" refers to the
% second item in that clause. As mentioned below, this use of ".2" to
% refer to the second component of a conjunction can be used
% in other circumstances as well.
%
% When long numbering is used, assumptions must be referred to by the
% name of the statement containing the assumption. Thus, "assumption
% 2.6.7.5.2" could potentially mean either the Assume clause of statement
% 2.6.7.5.2, or the second item in the Assume clause of 2.6.7.5. One way
% to remove the ambiguity is to use something other than "." in long step
% numbers. The possibilities 2:6:7:5 and 2-6-7-5 don't look too good;
% the best alternative to "." seems to be a raised period ($\cdot$). The
% "." is changed by redefining \pfdot, as described below. Assumptions
% are referred to with the following commands:
%
% \levelref{LABEL}
% If \stepref{LABEL} produces <4>5, then \levelref{label}
% produces <4>.
% If \stepref{LABEL} produces 2.6.7.5, then \levelref{label} also
% produces 2.6.7.5.
%
% \toplevel
% If \stepref{LABEL} produces <4>5, then \toplevel
% produces "<0>".
% If \stepref{LABEL} produces 2.6.7.5, then \toplevel
% produces "0".
%
%
% 6. PORTIONS OF A PROOF
%
% You may want to format only part of a proof--for example, you might
% want to write the proof of statement 2.1.3 as a separate proof. You'd
% want something like
%
% 2.1.3. All odd numbers are prime.
% 2.1.3.1. ...
%
% To do this, first imagine the shortest proof you can that has a
% statement numbered 2.1.3:
%
% 1. X
% 2. X
% 2.1. X
% 2.1.1. X
% 2.1.2. X
% 2.1.3. All odd numbers are prime.
% 2.1.3.1. ...
%
% Write this using the \step command and prove environment. Now, change
% every \step{LABEL}{X} command to \nostep{LABEL}, and change the proof
% environments surrounding the proofs of steps 2 and 2.1 by noproof
% environments. This yields
%
% \begin{proof}
% \nostep{label-1}
% \nostep{label-2}
% \begin{noproof}
% \nostep{label-2.1}
% \begin{noproof}
% \nostep{label-2.1.1}
% \nostep{label-2.1.2}
%
% \step{label-2.1.3} All oddnumbers are prime
% \begin{proof}
% \step{label-2.1.3.1} ...
% \end{proof}
% \end{noproof}
% \end{noproof}
% \end{proof}
%
% which produces the desired result. Note that the labels of the \nostep
% commands can be used to refer to the corresponding step numbers.
%
% 7. CONJUNCTIONS AND DISJUNCTIONS
%
% It is very convenient to write conjunctions as lists bulleted by \land.
% This is done with the conj environment, where
%
% $X = \begin{conj} PRODUCES X = /\ A
% A \\ B \\ C /\ B
% \end{conj}$ /\ C
%
% The conj* environment is similar, except it numbers the conjuncts.
%
% $X = \begin{conj*} PRODUCES X = 1./\ A
% A \\ B \\ C 2./\ B
% \end{conj*}$ 3./\ C
%
% If X is defined in this way, then X.2 denotes the formula B.
%
% The disj and disj* environments are similar. Disjuncts
% are numbered a, b, c
%
% These environments are implemented with the array environment.
% They should nest properly. They can be used only in math mode.
%
%
% 8. MISCELLANY
%
% \pfhidelevel{N} : A counter that controls what levels of proof
% are shown. The command \setcounter{pfhidelevel}{2} causes
% only level-1 and level-2 steps to be printed, and the proofs
% of level-2 steps (including all level-3 and higher steps)
% to be omitted. The default value of the counter is very large.
% The value of the counter should always be positive.
%
% \unhideqedproof
% \hideqedproof : Used in conjunction with the pfhidelevel counter.
% The \unhideqedproof command causes one extra level of proof
% to be displayed for the lowest level \qedstep. The \hideqedproof
% returns to the default of not showing this extra level.
%
% \pflet : like \prove and \assume, but with keyword "Let"
%
% \kwfont : Selects the font for the keywords "Proof", "Assume",
% "Prove", and "Case". Default is \sc; you can
% change it by something like \renewcommand{\kwfont}{\em}
%
% \pfdot : Defines the "." in long step numbers. Try
% \renewcommand{\pfdot}{\mbox{$\cdot$}} for variety.
%
% \pfindent : The amount by which proof levels are indented in
% the short indent option. Changed with \setlength.
% This is a local declaration.
%
% \pfstepnumber{LEVEL}{NUMBER}{LONGNUMBER} :
% Generates either NUMBER or LONGNUMBER, depending
% on the numbering style in effect.
%
% \pflevelnumber{LEVEL}{LONGNUMBER} :
% Generates either or LONGNUMBER, depending
% on the numbering style in effect.
%
% The following parameters control vertical spacing.
%
% \pftopsep : space above first proof environment
% \pfbotsep : space below first proof environment
% \pfsep : space above and below inner proof environment
% \stepsep : space above and below proof step
%
% The last two are set to zero, and probably should remain there. It
% might be desirable to have vertical spacing depend more finely on the
% level number. This can be done using the \makefcn command (see far
% below), and will be if there seems to be a need. However,
% zero extra vertical spacing seems to be fine.
%
% \pf, \qed, \pfsketch : Described above. Can be changed with
% \renewcommand
%
%
% 9. LIST OF ALL COMMANDS AND ENVIRONMENTS
%
% Text-Producting Commands Environments
% \pf, \pfsketch proof
% \qed noproof
% \step step+ [version of \step]
% \nostep assume+ [version of \assume]
% \qedstep prove+ [version of \prove]
% \assume case+ [version of \case]
% \prove conj, conj*
% \pflet disj, disj*
% \case pfenum, enumerate*
% \pfdot ["." in long names]
% \stepref, \levelref, \toplevel
% \pfstepnumber, \pflevelnumber
%
% Declarations
% \kwfont [keyword font]
% \pfshortnumbers
% \pfsidenumbers, \pfnosidenumbers
% \pflongindent, \pfshortindent
% \pfindent
% \pftopsep, \pfbotsep
% \pfsep, \stepsep
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SPACING %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% COMMANDS
% \pflongindent == Indent proofs to full width of item label
% \pfshortindent == Indent proofs by \pfindent [the default]
\newif\if@pfLongIndent % true if indent proof to width of label.
\@pfLongIndentfalse
\newcommand{\pflongindent}{\@pfLongIndenttrue}
\newcommand{\pfshortindent}{\@pfLongIndentfalse}
% PARAMETERS
% \pfindent == indentation at beginning of a proof
% \pftopsep == space above first proof environment
% \pfbotsep == space below first proof environment
% \pfsep == space above and below inner proof environment
% \stepsep == space above and below proof step
% pfhidelevel == counter, specifying level at which proofs are hidden
\newlength{\pfindent}
\newlength{\pftopsep}
\newlength{\pfbotsep}
\newlength{\pfsep}
\newlength{\stepsep}
\newbox{\pfbox}
\newcounter{pfhidelevel}
\setcounter{pfhidelevel}{9999}
\newcommand{\pfhidelevel}[1]{\setcounter{pfhidelevel}{#1}}
\setlength{\pfindent}{1em}
\setlength{\pftopsep}{1ex} % space above first proof environment
\setlength{\pfbotsep}{1ex} % space below first proof environment
\setlength{\pfsep}{0pt} % space above and below inner proof environment
\setlength{\stepsep}{0pt} % space above and below proof step
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% STEP NUMBERING %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% COMMANDS
% \pfshortnumbers{N} == Use short step numbers for all levels >= N
%
% \pfsidenumbers{N}{D} == print side numbers for proof steps of all
% levels >= N, left-aligned length D
% to left of left margin
% \pfnosidenumbers == do not print side numbers (the default)
%\newcommand{\pflongnumbers}{\@pfLongNumberstrue}
\newcommand{\pfshortnumbers}[1]{\pfshortNumberLevel=#1\relax}
\newcount\pfshortNumberLevel \pfshortNumberLevel=0
% \@pfLongNumbersfalse}
% \newif\if@pfLongNumbers % true if indent proof to width of label.
%\@pfLongNumbersfalse
\newcommand{\pfstepnumber}[3]{%
\ifnum \pfLevelCount < \pfshortNumberLevel
#3%
\else $\langle#1\rangle#2$%
\fi}
\newcommand{\pflevelnumber}[2]{%
\ifnum \pfLevelCount < \pfshortNumberLevel
#2%
\else $\langle#1\rangle$%
\fi}
\newif\if@pfSideNumbers % true if putting long numbers at margin
\@pfSideNumbersfalse
\newcounter{pf@sidenumberdepth}
\newlength{\pf@sidenumberoutdent}
\newcommand{\pfsidenumbers}[2]{\@pfSideNumberstrue
\setcounter{pf@sidenumberdepth}{#1}%
\addtocounter{pf@sidenumberdepth}{-1}%
\setlength{\pf@sidenumberoutdent}{#2}}
\newcommand{\pfnosidenumbers}{\@pfSideNumbersfalse}
\newcount\pfLevelCount \pfLevelCount=0 % current level number
\newcount\pfStepCount \pfStepCount=0 % current step number
\newcommand{\pfLongLevel}{} % The long version of current level--e.g., 2.7.5
\newcommand{\pfLongStep}{} % The long version of current step--e.g., 2.7.5.2
\newcommand{\pfStepName}{} % {current level name}{current step name}
% \pfSetName == LongStep := current long step name
% StepName := current step name
\newcommand{\pfSetName}{%
\edef\pfLongStep{%
\ifnum\pfLevelCount>\@ne
\pfLongLevel\pfdot\the\pfStepCount
\else\the\pfStepCount\fi}%
\edef\pfStepName{%
\ifnum \pfLevelCount < \pfshortNumberLevel
{\pfLongStep}{\pfLongStep}%
\else
{$\langle\the\pfLevelCount\rangle$}%
{$\langle\the\pfLevelCount\rangle\the\pfStepCount$}%
\fi}}
% \pfSetRef{foo} == IF \pf@foo UNDEFINED
% THEN \pf@foo := StepName
% ELSE WARNING
\newcommand{\pfSetRef}[1]{%
\@ifundefined{pf@#1}%
{\expandafter
\edef\csname pf@#1\endcsname{\pfStepName}}%
{\typeout{WARNING:
proof step "#1" (<\the\pfLevelCount>\the\pfStepCount)
already defined}}%
}
\newcommand{\pfPrintStepNumber}[2]{#2}
\newcommand{\pfPrintLevelNumber}[2]{#1}
% \stepref{FOO} == Print \pf@FOO as a step number
\newcommand{\stepref}[1]{\@ifundefined{pf@#1}{{\bf ??}\typeout{WARNING:
proof step "#1" undefined}}{\expandafter\expandafter\expandafter
\pfPrintStepNumber\csname pf@#1\endcsname}}
\newcommand{\levelref}[1]{\@ifundefined{pf@#1}{{\bf ??}\typeout{WARNING:
proof step #1 undefined}}%
{\expandafter\expandafter\expandafter
\pfPrintLevelNumber\csname pf@#1\endcsname}}
\newcommand{\toplevel}{\pflevelnumber{0}{0}}
\newlength{\pf@outdent}
\newcommand{\pfSideNumber}{%
\if@pfSideNumbers
\ifnum\pfLevelCount>\value{pf@sidenumberdepth}%
\hspace*{-\pf@outdent}%
\makebox[0pt][l]{\footnotesize\pfLongStep}%
\hspace*{\pf@outdent}%
\else\fi
\else\fi}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% THE pflist ENVIRONMENT %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% The pflist environment is the same as list environment except
%% it can be nested deeper.
\def\pflist#1#2{\ifnum \@listdepth >15\relax \@toodeep
\else \global\advance\@listdepth\@ne \fi
\rightmargin \z@ \listparindent\z@ \itemindent\z@
\csname @list\romannumeral\the\@listdepth\endcsname
\def\@itemlabel{#1}\let\makelabel\@mklab \@nmbrlistfalse #2\relax
\@trivlist
\parskip\parsep \parindent\listparindent
\advance\linewidth -\rightmargin \advance\linewidth -\leftmargin
\advance\@totalleftmargin \leftmargin
\parshape \@ne \@totalleftmargin \linewidth
\ignorespaces}
\def\endpflist{\global\advance\@listdepth\m@ne
\endtrivlist}
\let\@listvii=\@listv
\let\@listviii=\@listv
\let\@listix=\@listv
\let\@listx=\@listv
\let\@listxi=\@listv
\let\@listxii=\@listv
\let\@listxiii=\@listv
\let\@listxiv=\@listv
\let\@listxv=\@listv
\let\@listxvi=\@listv
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% THE proof ENVIRONMENT %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\newenvironment{proof}{% BEGIN:
\edef\pfLongLevel % LongLevel :=
{\ifnum\pfLevelCount>\z@ % IF LevelCount > 0
\ifnum\pfLevelCount>\@ne% THEN IF LevelCount > 1
\pfLongLevel\pfdot\else\fi % THEN LongLevel * "." FI
\the\pfStepCount % * StepCount
\else\fi}% % ELSE FI
\advance\pfLevelCount\@ne % LevelCount := LevelCount + 1
\@tempcnta=\value{pfhidelevel}%
\ifnum\@tempcnta<\@ne
\setcounter{pfhidelevel}{1}%
\typeout{WARNING: pfhidelevel < 1, setting to 1}%
\@tempcnta=\@ne\fi
\advance\@tempcnta\@ne
\if@qedstep
\advance\@tempcnta\@ne
\ifnum\pfLevelCount
= \@tempcnta
\sbox{\pfbox}\bgroup\begin{minipage}{\textwidth}\fi
\else
\ifnum\pfLevelCount
= \@tempcnta
\sbox{\pfbox}\bgroup\begin{minipage}{\textwidth}\fi\fi
\pfStepCount=\z@ % StepCount := 0
\ifnum\pfLevelCount>\@ne % IF LevelCount > 1
\begin{pflist}{}{% % THEN Begin List with
\topsep=\pfsep\relax % \topsep := \pfsep
\itemsep=\z@ % \itemsep := 0
\parsep=\z@ % \parsep := 0
\partopsep=\z@ % \partopsep := 0
\if@pfLongIndent % IF LongIndent
\settowidth{\leftmargin}%% THEN
{\expandafter % \leftmargin := width of step name
\pfPrintStepNumber % + \labelsep
\pfStepName.}%
\advance\leftmargin
\labelsep
\else % ELSE
\leftmargin=\pfindent % \leftmargin := \pfindent
\fi\relax
} \item[]
\else \par % ELSE \par
\addvspace{\pftopsep}% % addvspace of \pftopsep
\parindent=\z@ % \parindent := 0
\parskip = \z@ % \parskip := 0
\@ifundefined{mathindent}{%
\abovedisplayskip=\z@ plus .2ex % set display skips
\abovedisplayshortskip=\z@ plus .2ex
\belowdisplayskip=\z@ plus .2ex
\belowdisplayshortskip=\z@ plus .2ex}{%
\mathindent=1em}%
\let\enumerate\pfenum % enumerate environment <- pfenum
\let\endenumerate\endpfenum %
\fi
\@qedstepfalse
}% % END:
{\ifnum\pfLevelCount>\@ne % IF LevelCount > 1
\end{pflist}% % THEN End List
\else \par % ELSE \par
\addvspace{\pfbotsep}% % addvspace of \pfbotsep
\fi
\@tempcnta=\value{pfhidelevel}%
\advance\@tempcnta\@ne
\if@qedstep
\advance\@tempcnta\@ne
\ifnum\pfLevelCount
= \@tempcnta
\end{minipage}\egroup\sbox{\pfbox}{}\@qedstepfalse\fi
\else
\ifnum\pfLevelCount
=\@tempcnta
\end{minipage}
\egroup\sbox{\pfbox}{}\fi
\fi}
\newenvironment{noproof}{% % BEGIN:
\edef\pfLongLevel % LongLevel :=
{\ifnum\pfLevelCount>\z@ % IF LevelCount > 0
\ifnum\pfLevelCount>\@ne% THEN IF LevelCount > 1
\pfLongLevel.\else\fi % THEN LongLevel * "." FI
\the\pfStepCount % * StepCount
\else\fi}% % ELSE FI
\advance\pfLevelCount\@ne % LevelCount := LevelCount + 1
\pfStepCount=\z@ % StepCount := 0
\par % \par
\parindent=\z@ % \parindent := 0
\parskip = \z@ % \parskip := 0
\@ifundefined{mathindent}{%
\abovedisplayskip=\z@ plus .2ex % set display skips
\abovedisplayshortskip=\z@ plus .2ex
\belowdisplayskip=\z@ plus .2ex
\belowdisplayshortskip=\z@ plus .2ex}{%
\mathindent=1em}%
\let\enumerate\pfenum % enumerate environment <- pfenum
\let\endenumerate\endpfenum %
}% % END:
{\par} % \par
%% step
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \step, \assume, ETC. %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\newcommand{\step}[2]{\begin{step+}{#1}#2\end{step+}}
\newif\if@qedstep % true right after a \qedstep if in the scope of an
% \unhideqedproof declaration
\@qedstepfalse
\newif\if@unhideqedstep % set true by \unhideqproof, false by \hideqproof.
\@unhideqedstepfalse
\newcommand{\unhideqedproof}{\@unhideqedsteptrue}
\newcommand{\hideqedproof}{\@unhideqedstepfalse}
\newcommand{\qedstep}{\step{qedstep\the\pfLevelCount}{Q.E.D.}
\if@unhideqedstep\@qedsteptrue\fi}
\newcommand{\nostep}[1]{%
\advance\pfStepCount\@ne % StepCount := StepCount + 1
\pfSetName % SetName
\pfSetRef{#1}% % SetRef
}
\newenvironment{step+}[1]%
{\endgroup % Move Outside environment scope
\advance\pfStepCount\@ne % StepCount := StepCount + 1
\pfSetName % SetName
\pfSetRef{#1}% % SetRef
\begingroup\@endpefalse % Move inside environment scope
\def\@currenvir{step+}% % by simulating \begin{step+}
\begin{pflist}{}{% % Begin list environment with
\setlength
{\pf@outdent}{\textwidth}% % \pf@outdent = outdent
\addtolength % for side numbers
{\pf@outdent}{-\linewidth}%
\addtolength
{\pf@outdent}%
{\pf@sidenumberoutdent}%
\topsep=\stepsep\relax % \topsep := \stepsep
\itemsep=\z@ % \itemsep := 0
\parsep=\z@ % \parsep := 0
\partopsep=\z@ % \partopsep := 0
\settowidth{\labelwidth}% % \labelwidth := width of step name.
{\expandafter
\pfPrintStepNumber
\pfStepName.}%
\leftmargin=\labelwidth\relax % \leftmargin := \labelwidth
\advance\leftmargin\labelsep % + \labelsep
\relax}%
\item[\pfSideNumber% % \item[ \pfSideNumber
\expandafter % StepNumber]
\pfPrintStepNumber\pfStepName.]}%
{\end{pflist}}
%%%%% \assume, \prove, and \case commands
\newenvironment{assume+}{%
\begin{pflist}{}{% % Begin list environment with
\topsep=\z@ % \topsep := 0
\itemsep=\z@ % \itemsep := 0
\parsep=\z@ % \parsep := 0
\partopsep=\z@ % \partopsep := 0
\settowidth{\labelwidth}% % \labelwidth := width "Assume:"
{{\kwfont Assume\/}:}%
\leftmargin=\labelwidth\relax % \leftmargin := \labelwidth
\advance\leftmargin\labelsep % + \labelsep
\relax}%
\item[{\kwfont Assume\/}:]}% % \item[Assume:]]
{\end{pflist}}
\newcommand{\assume}[1]{\begin{assume+}#1\end{assume+}}
\newcommand{\prove}[1]{\begin{prove+}#1\end{prove+}}
\newenvironment{prove+}{%
\begin{pflist}{}{% % Begin list environment with
\topsep=\z@ % \topsep := 0
\itemsep=\z@ % \itemsep := 0
\parsep=\z@ % \parsep := 0
\partopsep=\z@ % \partopsep := 0
\settowidth{\labelwidth}% % \labelwidth := width "Assume:"
{{\kwfont Assume\/}:}%
\leftmargin=\labelwidth\relax % \leftmargin := \labelwidth
\advance\leftmargin\labelsep % + \labelsep
\relax}%
\item[{\kwfont
Prove\/}:\hfill]}% % \item[Prove:]]
{\end{pflist}}
\newcommand{\pflet}[1]{\begin{pflet+}#1\end{pflet+}}
\newenvironment{pflet+}{%
\begin{pflist}{}{% % Begin list environment with
\topsep=\z@ % \topsep := 0
\itemsep=\z@ % \itemsep := 0
\parsep=\z@ % \parsep := 0
\partopsep=\z@ % \partopsep := 0
\settowidth{\labelwidth}% % \labelwidth := width "Assume:"
{{\kwfont Let\/}:}%
\leftmargin=\labelwidth\relax % \leftmargin := \labelwidth
\advance\leftmargin\labelsep % + \labelsep
\relax}%
\item[{\kwfont
Let\/}:\hfill]}% % \item[Let:]]
{\end{pflist}}
%\newcommand{\prove}[1]{%
% \begin{pflist}{}{% % Begin list environment with
% \topsep=\z@ % \topsep := 0
% \itemsep=\z@ % \itemsep := 0
% \parsep=\z@ % \parsep := 0
% \partopsep=\z@ % \partopsep := 0
% \settowidth{\labelwidth}% % \labelwidth := width "Assume:"
% {{\kwfont Assume\/}:}%
% \leftmargin=\labelwidth\relax % \leftmargin := \labelwidth
% \advance\leftmargin\labelsep % + \labelsep
% \relax}%
% \item[{\kwfont Prove\/}:\hfill] % \item[Prove:]]
% #1
% \end{pflist}}
\newcommand{\case}[1]{%
\begin{pflist}{}{% % Begin list environment with
\topsep=\z@ % \topsep := 0
\itemsep=\z@ % \itemsep := 0
\parsep=\z@ % \parsep := 0
\partopsep=\z@ % \partopsep := 0
\settowidth{\labelwidth}% % \labelwidth := width "Case:"
{{\kwfont Case\/}:}%
\leftmargin=\labelwidth\relax % \leftmargin := \labelwidth
\advance\leftmargin\labelsep % + \labelsep
\relax}%
\item[{\kwfont
Case\/}:] % \item[Case:]]
#1
\end{pflist}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MISCELLANY %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\newcommand{\pf}{{\kwfont Proof\/}:}
\newcommand{\pfsketch}{{\kwfont Proof sketch\/}:}
%\newcommand{\qed}{\rule{.4em}{1.75ex}}
\newcommand{\qed}{{\fboxsep=\z@\fbox{\rule{.5em}{0pt}\rule{0pt}{2ex}}}}
\let\kwfont=\sc
\def\pfdot{.}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% STACKS %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \@push{\stack}{element} == \stack := <> :o: \stack
% \@pop{\stack}{\cmd} == \cmd := head(\stack)
% \stack := tail(\stack)
% \newstack{\stack} == \stack := emptystack
%
% \@head{\stack}{\var} == \var := head(\stack)
% Note: to push a counter value, use \the\value{ctr}
% to push a length \foo, use \the\foo
%
\def\@push#1#2{{\let\@nil\relax\let\@elt\relax\xdef#1{#2\@elt#1}}}
\def\@pop#1#2{{\let\@nil\relax\let\@elt\relax
\xdef#2{\expandafter\@innerhead#1}
\xdef#1{\expandafter\@innerpop#1}}}
\def\@innerpop#1\@elt#2\@nil{#2\@nil}
\def\@head#1#2{{\let\@elt\relax\xdef#2{\expandafter\@innerhead#1}}}
\def\@innerhead#1\@elt#2\@nil{#1}
\def\newstack#1{\gdef#1{\@nil}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% LISTS OF CONJUNCTIONS AND DISJUNCTIONS %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{conj} -> /\ A
% A \\ B \\ C /\ B
% \end{conj} /\ C
%
% \begin{conj*} -> 1./\ A
% A \\ B \\ C 2./\ B
% \end{conj*} 3./\ C
%
% The disj and disj* environments are similar. Disjuncts
% are numbered a, b, c
%
% These environments are arrays; they must be used in math mode.
\newcounter{pf@conjCounter} % counter for conj* and disj*
\newstack\pf@conj % stack of counters
\newenvironment{conj}{%
\begin{array}[t]{@{\land\;}l@{}}%
}{%
\end{array}}
\newenvironment{disj}{%
\begin{array}[t]{@{\lor\;}l@{}}%
}{%
\end{array}}
\newenvironment{conj*}{%
\@push\pf@conj{\the\value{pf@conjCounter}}%
\setcounter{pf@conjCounter}{0}%
\begin{array}[t]{@{\addtocounter{pf@conjCounter}{1}%
\mbox{\protect\small\protect\arabic{pf@conjCounter}.}
\land\;}l@{}}%
}{%
\end{array}%
\@pop\pf@conj\pf@temp
\setcounter{pf@conjCounter}{\pf@temp}}
\newenvironment{disj*}{%
\@push\pf@conj{\the\value{pf@conjCounter}}%
\setcounter{pf@conjCounter}{0}%
\begin{array}[t]{@{\addtocounter{pf@conjCounter}{1}%
\mbox{\protect\small\protect\alph{pf@conjCounter}.}
\lor\;}l@{}}%
}{%
\end{array}%
\@pop\pf@conj\pf@temp
\setcounter{pf@conjCounter}{\pf@temp}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ENUMERATED LISTS %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% pfenum environment : In proofs, the enumerate environment
% is redefined to be the pfenum environment
%
% enumerate* environment : Like pfenum, except with additional
% indentation.
%
% \enumindent : The indentation for enumerate*
% pfenumdepth : Depth of current pfenum list
% pfenum : pfenum list counter
%
% Uses counters pfenumi, ... , pfenumiii just like the
% ordinary enumerate environment uses counters enumi, ... , enumiv.
% \pf@setEnumWidth{\cmd} : Sets \cmd to the width of the label of the
% item number 2 for the current enumeration level.
%
% \pf@enumLabel : prints the current pfenum label, using the
% pfenumi... counter.
\newcounter{pfenum}
\newcounter{pfenumdepth}
\newlength{\enumindent}
\setlength{\enumindent}{1em}
\@definecounter{pfenumi}
\@definecounter{pfenumii}
\@definecounter{pfenumiii}
%\@definecounter{pfenumiv}
\def\labelpfenumi{\thepfenumi.}
\def\thepfenumi{\arabic{pfenumi}}
\def\labelpfenumii{(\thepfenumii)}
\def\thepfenumii{\alph{pfenumii}}
\def\p@pfenumii{\thepfenumi}
\def\labelpfenumiii{\thepfenumiii.}
\def\thepfenumiii{\roman{pfenumiii}}
\def\p@pfenumiii{\thepfenumi\thepfenumii}
%\def\labelpfenumiv{\thepfenumiv.}
%\def\thepfenumiv{\Alph{pfenumiv}}
%\def\p@pfenumiv{\p@pfenumiii\thepfenumiii}
\newcommand{\pf@setEnumWidth}[1]{%
\settowidth{#1}{\setcounter{\@pfenumctr}{2}%
\csname the\@pfenumctr\endcsname.%
\setcounter{\@pfenumctr}{0}}}
\newcommand{\pf@enumLabel}{%
\hfill\makebox[0pt][r]{\csname the\@pfenumctr\endcsname.}}
\newenvironment{pfenum}{% % BEGIN
\ifnum \value{pfenumdepth}>2% % IF pfenumdepth > 2
\relax\@toodeep \else % THEN error
\addtocounter{pfenumdepth}{1}% % ELSE pfenumdepth := pfenumdepth + 1
\edef\@pfenumctr{pfenum% % @pfenumctr := pfenumN
\romannumeral\the % where N = Roman(pfenumdepth)
\value{pfenumdepth}}% %
\fi % FI
\begin{pflist}% % Begin list environment with
{\pf@enumLabel}{% % Default label = pf@enumlabel
\labelsep= % \labelsep =
\ifcase\value{pfenumdepth} % CASE OF pfenumdepth
\labelsep %
\or .67\labelsep % 1 -> .67\labelsep
\or .67\labelsep % 2 -> .67\labelsep
\else \labelsep % >2 -> \labelsep
\fi %
\topsep=\z@ % \topsep := 0
\itemsep=\z@ % \itemsep := 0
\parsep=\z@ % \parsep := 0
\partopsep=\z@ % \partopsep := 0
\pf@setEnumWidth\labelwidth % set \labelwidth with setEnumWidth
\leftmargin=\labelwidth\relax % \leftmargin := \labelwidth
\advance\leftmargin\labelsep % + \labelsep
\relax
\usecounter{\@pfenumctr}% % counter @pfenumctr
}%
}{% % END
\end{pflist}% % End list
\addtocounter{pfenumdepth}{-1}% pfenumdepth := pfenumdepth - 1
}
\newenvironment{enumerate*}{% % BEGIN
\ifnum \value{pfenumdepth}>2% % IF pfenumdepth > 2
\relax\@toodeep \else % THEN error
\addtocounter{pfenumdepth}{1}% % ELSE pfenumdepth := pfenumdepth + 1
\edef\@pfenumctr{pfenum% % @pfenumctr := pfenumN
\romannumeral\the % where N = Roman(pfenumdepth)
\value{pfenumdepth}}% %
\fi % FI
\begin{pflist}% % Begin list environment with
{\pf@enumLabel}{% % Default label = pf@enumlabel
\labelsep= % \labelsep =
\ifcase\value{pfenumdepth} % CASE OF pfenumdepth
\labelsep %
\or .67\labelsep % 1 -> .67\labelsep
\or .67\labelsep % 2 -> .67\labelsep
\else \labelsep % >2 -> \labelsep
\fi %
\topsep=\z@ % \topsep := 0
\itemsep=\z@ % \itemsep := 0
\parsep=\z@ % \parsep := 0
\partopsep=\z@ % \partopsep := 0
\pf@setEnumWidth\labelwidth % set \labelwidth with setEnumWidth
\leftmargin=\labelwidth\relax % \leftmargin := \labelwidth
\advance\leftmargin\labelsep % + \labelsep
\advance\leftmargin\enumindent% + \enumindent
\relax
\usecounter{\@pfenumctr}% % counter @pfenumctr
}%
}{% % END
\end{pflist}% % End list
\addtocounter{pfenumdepth}{-1}% pfenumdepth := pfenumdepth - 1
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% FUNCTIONS %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \makefcn{\FOO}{V0}{{V1}...{Vk}} :
% Defines \FOO{n} == CASE n = 0 -> V0
% n = 1 -> V1
% ...
% n \geq k -> Vk
%
% Useful when Vi is a dimension applying to a depth-i environment
\def\makefcn#1#2#3{{\let\or\relax
\gdef\fcn@temp{}%
\gdef\fcn@tempb{#2}%
\@tfor\foo:=#3\do{\xdef\fcn@temp{\fcn@temp\or\foo}\xdef\fcn@tempb{\foo}}%
\let\ifcase\relax\let\else\relax\let\fi\relax
\xdef#1##1{\ifcase ##1 #2\fcn@temp\else\fcn@tempb\fi}}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% FUNCTIONS %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \pfif{A}{B}{C} : if A then B \pfIF{A}{B}{C} : if A
% else C THEN B
% ELSE C
\newcommand{\pfmathdef}[1]{\relax\ifmmode #1\else $#1$\fi}
\newcommand{\pfif}[3]{{\pfmathdef{%
\begin{array}[t]{@{}l@{\;\;}l@{\;\;}l@{}}
{\bf if}\;\;#1&{\bf then}\\
&{\bf else}
\end{array}}}}
\newcommand{\pfIF}[3]{{\pfmathdef{%
\begin{array}[t]{@{}l@{\;\;}l@{}}
{\bf if}\;\;#1\\
\begin{array}[t]{@{\hspace{1em}}l@{\;\;}l@{}}
{\bf then}\\
{\bf else}
\end{array}
\end{array}}}}