\def\fileversion{v1.4}
\def\filedate{94/01/04}
\def\docdate {93/08/14}

%% \CheckSum{0}
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%%
%
% \iffalse    This is a METACOMMENT
%              Everything up to the next `\ fi' (without a blank) will
%              be ignored.  This is necessary because `%' may no longer
%              be a comment mark when this file is read in.
%
% Style-option `zsb' to use with LaTeX v2.09
% Copyright (C) 1992 Andreas Schrell, all rights reserved.
%
% IMPORTANT NOTICE:
%
% You are not allowed to change this file.  You may however copy
% this file to a different name and then change this copy.
%
% You are allowed to distribute this file under the condition that
% it is distributed together with all files mentioned in readme.txt.
% If you receive only some of these files from someone, complain!
%
% You are NOT ALLOWED to distribute this file alone.
% You are NOT ALLOWED to take money for the distribution or use of
% this file (or a changed version) except for some nominal charge
% for copying etc.
%
%
% Error reports for UNCHANGED versions please to:
%
%                          Andreas Schrell
%                          Windh"ovel 2
%                          D-42279 Wuppertal
%                          Federal Republic of Germany
%               Internet:  <Andreas.Schrell@FernUni-Hagen.de>
%
% \fi
%
% \DoNotIndex{\@M,\@Mi,\@bsphack,\@cclv,\@colht,\@currlist,\@deferlist}
% \DoNotIndex{\@elt,\@esphack,\@floatplacement}
% \DoNotIndex{\@ifundefined,\@ifnextchar,\@makecol}
% \DoNotIndex{\@ne,\@outputpage,\@scolelt,\@spaces,\@tempb,\@tempcnta}
% \DoNotIndex{\@warning,\@width}
% \DoNotIndex{\addvspace,\advance,\allowbreak}
% \DoNotIndex{\baselineskip,\begingroup,\box,\columnsep,\copy,\count}
% \DoNotIndex{\count@,\def,\dimen@,\divide,\docdate}
% \DoNotIndex{\edef,\eject,\egroup,\else,\endgroup,\endinput}
% \DoNotIndex{\fi,\fileversion,\filedate}
% \DoNotIndex{\gdef,\global}
% \DoNotIndex{\hbox,\hfil,\hrule,\ht,\hss}
% \DoNotIndex{\ifdim,\ifnum,\ifvoid,\ignorespaces,\insert,\immediate}
% \DoNotIndex{\let,\loop}
% \DoNotIndex{\maxdepth,\message,\multiply}
% \DoNotIndex{\newbox,\newcount,\newdimen,\newskip,\number,\newpage}
% \DoNotIndex{\outputpenalty,\p@,\penalty}
% \DoNotIndex{\relax,\repeat,\setbox,\skip,\space,\splitmaxdepth}
% \DoNotIndex{\splittopskip,\string,\sixt@@n}
% \DoNotIndex{\the,\thepage,\thr@@,\topskip,\tw@,\typeout}
% \DoNotIndex{\unvbox,\vbox,\vfill,\vsplit,\voidb@x,\vrule}
% \DoNotIndex{\write,\wd}
% \DoNotIndex{\z@}
%
% \changes{v1.0b}{93/02/24}{{\tt`FreeEinfachseite} schaltete nicht
% auf Einfachseiten.}
% \changes{v1.0b}{93/02/24}{{\tt`KorEinfachseite} fehlte ganz.}
% \changes{v1.0h}{93/06/21}{{\tt`MaximalSeite} aufgenommen.}
% \changes{v1.1}{93/08/14}{{\tt`QuerFormat} hinzugef"ugt.}
% \changes{v1.1}{93/08/14}{Automatische Berechnung von Satzbreite und
%                          Satzh"ohe bei FreeStyle, falls nicht angegeben.}
% \changes{v1.1}{93/08/14}{Testversion von {\tt`SchnittMarken}}
% \changes{v1.2}{93/08/14}{Dimensionsregister sparen.}
% \changes{v1.3}{93/10/03}{{\tt`Zentriert auf} hinzugef"ugt.
%                          Schnittmarken mit Mittelmarkierungen.}
%
% \title{\vfil \thispagestyle{empty}
%         Dokumentation zum KONSTRUK.STY\\[4mm]
%        F"ur \LaTeX-Seitenlayout Festlegung
%       \thanks{Diese Datei
%        hat die Versionsnummer \fileversion, letzte "Anderung vom
%        \filedate, Dokumentation vom \docdate.}}
%
% \author{%
%       Andreas Schrell\\
%       Windh"ovel 2\\
%       D-42279 Wuppertal\\
%       Federal Republic of Germany\\
%       {\rm E-Mail:} {\tt Andreas.Schrell@FernUni-Hagen.de}}
%
% \date{Ausdruck vom \today}
%
%
% \maketitle
% \vfil
% \begin{abstract}
% \noindent
% Diese Stil-Option f"ur \LaTeX\ dient zum komfortablen Festlegen des
% Seitenlayouts f"ur \TeX-Dokumente. Neben vordefinierten Formaten werden
% auch Befehle zum freien Einstellen des Layouts und Makros zum Testen
% zur Verf"ugung gestellt.
% \end{abstract}
%
% \vfil\vfil
%
% \pagebreak
% \MakeShortVerb{\|}
%
% \section{Beschreibung der Befehle}
%
% \subsection{Papierformat festlegen}
%
% Nach dem Laden des Style-Files sollte das Papierformat des sp"ateren
% Druckerzeugnisses angegeben werden. Hierzu dient der Befehl
%\begin{verbatim}
%\PapierFormat
%\end{verbatim}
% Als Parameter bekommt er entweder die genauen Ma"se des Papiers, z.\,B.
%\begin{verbatim}
%\PapierFormat <200mm,280mm>
%\end{verbatim}
% oder eines der folgenden Formatk"urzel:
%\begin{verbatim}
%A0 A1 A2 A3 A4 A5 A6 A7 A8 A9
%B0 B1 B2 B3 B4 B5 B6 B7 B8 B9
%C0 C1 C2 C3 C4 C5 C6 C7 C8 C9
%\end{verbatim}
% Daraus wird dann die Papiergr"o"se des zugeh"origen DIN-Formats
% ermittelt. In diesem Falle werden die ermittelten Werte auch auf
% dem Bildschirm ausgegeben.
%
% Das so erzeugte Format kann mit dem Befehl
%\begin{verbatim}
%\QuerFormat
%\end{verbatim}
% in das entsprechende Querformat (landscape) umgewandelt werden. Hierbei
% wird nat"urlich nicht automatisch die \TeX-Ausgabe gedreht sondern nur
% die Seitenausma"se bestimmt.
%
% \subsection{Freies Layout}
%
% \def\dim{{\it dimen\/}}
% Der umfangreichste Befehl des Makropakets ist der |\FreeStyle|. Hier
% die vollst"andige Syntax:
% \begin{tabbing}
% |\FreeStyle| \= [|Doppelseite|]  [|Einfachseite|] \\
%   \> |Satzbreite <|\dim|>| \\
%   \> |Satzhoehe <|\dim|>| \\
%  \> |Bund <|\dim|>| \\
%  \> |Oben <|\dim|>| \\
%  \> |Aussen <|\dim|>| \\
%  \> |Unten <|\dim|>| \\
%  \> |Kopfzeile| \= \\
%  \>\> [|lebend|] [|tot|] \\
%  \>\> |Hoehe <|\dim|>| \\
%  \>\> |Abstand <|\dim|>| \\
%  \>\> |Text {...}      |\hskip 3cm (bei Einfachseite) \\
%  \>\> |Text {...} {...}|\hskip 3cm (bei Doppelseite) \\
%  \> |/| \\
%  \> |Fusszeile| \= \\
%  \>\> |Abstand <|\dim|>| \\
%  \>\> |Text {...}      |\hskip 3cm (bei Einfachseite) \\
%  \>\> |Text {...} {...}|\hskip 3cm (bei Doppelseite) \\
%  \> |/| \\
% |/|
% \end{tabbing}
% Die Schl"usselworte k"onnen innerhalb einer Wertigkeit in beliebiger
% Reihenfolge aufgef"uhrt werden. Nat"urlich k"onnen sie auch weggelassen
% werden. Alle L"angenangaben stehen in spitzen Klammern (also Kleiner-
% und Gr"o"serzeichen). Der Schr"agstrich dient zum Beenden der
% Teildefinitionen und des Gesamtmakros. Er darf nicht weggelassen
% werden. Ebenso m"ussen auch alle Leerzeichen eingehalten werden.
% Wichtig ist, da"s der |Abstand| der Kopfzeile der wirkliche Abstand
% ist, in der Fu"szeile jedoch den Abstand Basislinie -- Basislinie
% bedeutet.
%
% \subsubsection{Konstruktionsmethoden}
%
% Es werden die folgenden Konstruktionen angeboten:\\*
% |\Aehnlichkeitskonstruktion <|\dim|>| \\*
% |\Renaissancekonstruktion <|\dim|>| \\*
% |\Diagonalkonstruktion <|\dim|>| \\*
% |\GoldenerSchnitt| \\*
% |\SilbernerSchnitt| \\*
% |\Rasterkonstruktion {|{\it Teilung\/}|}| \\*
% |\FertigLayout 12A 12B 12C 10A 10B 10C 8A 7A| (wahlweise) \\*
% |\MaximalSeite| \\*
% Dimensionsangaben bezeichnen immer die Satzbreite. Standardm"a"sig
% werden Doppelseiten vorgesehen. Die Kopf- und Fu"szeilen werden
% nicht ver"andert. Mit einem nachfolgenden |\FreeStyle|-Befehl k"onnen
% einzelne Parameter ver"andert werden.
%
% \subsubsection{Korrekturen am Format}
% Zus"atzlich zum |\FreeStyle| gibt es auch den Befehl |\KorrStyle|. Er
% besitzt dieselbe Syntax, Ma"se werden jedoch nicht auf den angegebenen
% Betrag gesetzt, sondern entsprechend ver"andert. Zum Beispiel w"urde der
% Befehl
%\begin{verbatim}
%\KorrStyle
%           Satzbreite <-1cm>
%           /
%\end{verbatim}
% die Satzbreite um 1\,cm verringern.
%
% \subsubsection{Schnittmarken}
%
% Schnittmarken am Papierrand k"onnen mit dem Befehl
%\begin{verbatim}
%\SchnittMarken
%\end{verbatim}
% am Beginn einer Seite erzeugt werden. Dies ist allerdings nur dann
% sinnvoll, wenn man z.\,B. mit DVIDVI mehrere Seiten auf ein Blatt
% drucken m"ochte und dies sp"ater beschneidet. Wird \verb+\SchnittMarken+
% nicht am Seitenanfang aufgerufen, wird ein \verb+\clearpage+
% eingef"ugt.
%
% \subsubsection{Layout-Zeichnungen}
%
% Der Befehl
%\begin{verbatim}
%\Layout
%\end{verbatim}
% erzeugt eine Layoutzeichnung in Originalgr"o"se. Die Beschriftung kann
% mit
% \begin{tabbing}
% |\Layoutbeschriftung| \= \\
% \> |Token| \\
% \> |TeX-Namen| \\
% \> |Werte| \\
% \> |Einheit <|\dim|>| \\
% \> |Konstruktion| \\
% |/|
% \end{tabbing}
% eingestellt werden. Kleine Skizzen k"onnen mit
%\begin{verbatim}
%\begin{Layoutskizze} <5cm>
%\GoldenerSchnitt
%\end{Layoutskizze}
%\end{verbatim}
% erzeugt werden. Man kann den |<..>|-Parameter auch weglassen. Dann
% geht die Skizze "uber die gesamte Zeilenbreite. Hier das Beispiel:
% \[ \begin{Layoutskizze} <5cm>
% \GoldenerSchnitt
% \end{Layoutskizze} \]
%
%
%
% \end{document}
%
% \StopEventually{\PrintIndex \PrintChanges}
%
% \typein[\MitBesch]{^^JWollen Sie auch eine ausf\string"uhrliche
% Beschreibung der Makros? (j/n)}
%
% \if n\MitBesch \let\next\end \else \def\next#1{} \fi
% \next{document}
%
% \pagebreak
%
% \section{Die Makros}
%
% Zuerst die Lade-Meldung:
%    \begin{macrocode}
\message{^^JLaTeX Konstruktion-Stil-Option Version \fileversion.^^J}%
%    \end{macrocode}
%
% Im folgenden werden die Makros vorgestellt. Bis auf das Verfahren der
% Token-Parameter ist die Programmierung recht einfach. Es mu"s im
% wesentlichen gerechnet werden. Als allererstes sorgen wir daf"ur, da"s
% \TeX\ keine Schusterjungen und Hurenkinder setzt:
%    \begin{macrocode}
\widowpenalty10000 \clubpenalty10000
%    \end{macrocode}
%
% \subsection{Die Schl"usselwort-Programmierung}
%
% Die Makros sind im Wesentlichen aus \PiCTeX\ "ubernommen. Ich danke
% an dieser Stelle M.\,J.\,Wichura f"ur seine vorbildliche Arbeit.
% Als erstes ben"otigen wir eine Hilfsmeldung und ein paar zus"atzliche
% Makros, damit ein potentieller Benutzer auch
% interaktiv falsche Schl"usselworte korrigieren kann.
%    \begin{macrocode}
\newhelp\Schluesselhilfe{Das angegebene Schluesselwort ist nicht
   definiert. Ersetze NEUES WORT in der vorgeschlagenen Antwort
   durch das richtige!}

\def\fixSchluessel#1{%
   \errhelp=\Schluesselhilfe
   \errmessage{Unbekanntes Schluesselwort `#1':^^J%
   \the\Schluesseltoks{NEUES WORT}'}}

\newtoks\Schluesseltoks
\Schluesseltoks={Eingabe `i\Schluessel}

\def\Schluessel#1{\nextSchluessel#1 }
%    \end{macrocode}
% Nun kommt das Makro, das eine Schl"usselwortliste durchwandert und
% daraus \TeX-Makronamen erzeugt. Damit unterschiedliche Oberbegriffe
% mit gleichen Schl"usseln zu unterschiedlichen Befehlen expandiert
% werden, wird der Oberbegriff mit in den Namen aufgenommen.
%    \begin{macrocode}
\def\nextSchluessel#1 {%
   \expandafter\ifx\csname\Ober#1\endcsname \relax
      \def\Snext{\fixSchluessel{#1}}%
   \else
      \def\Snext{\csname\Ober#1\endcsname}%
   \fi
   \Snext}
%    \end{macrocode}
% Die Makros der Schl"usselworte sind abh"angig vom Befehl, daher mu"s
% jeweils ein Oberbegriff definiert bzw. restauriert werden.
%    \begin{macrocode}
\def\NewOber#1{%
   \expandafter\edef\csname OOBER#1\endcsname{\Ober}%
   \edef\Ober{#1}}
\def\OldOber#1{%
   \edef\Ober{\csname OOBER#1\endcsname}}
\def\Ober{}
%    \end{macrocode}
%
% \subsection{Ausgabe einer Testseite}
%
% \begin{macro}{\Layoutbeschriftung}
% Zu Beginn soll ein Makro vorgestellt werden, mit dem das Seitenlayout
% gezeichnet werden kann. Unterschiedliche Versionen sorgen daf"ur,
% da"s sowohl mit als auch ohne Beschriftung ausgegeben werden kann. Die
% folgenden Beschriftungsmethoden sind implementiert:
% \begin{description}
% \item[TeX-Namen] Es werden die \TeX-Bezeichnungen eingetragen.
% \item[Token] Es werden die Token f"ur den |\FreeStyle|-Befehl
% eingetragen.
% \item[Werte] Es werden die Werte eingetragen.
% \item[Einheit] Die Einheit f"ur die Werte wird festgelegt.
% \end{description}
%    \begin{macrocode}
\def\Layoutbeschriftung {\NewOber{LB}%
   \Tokenfalse \TeXNamenfalse \Wertefalse
   \Pfeilefalse
   \def\Einheit{1mm}\def\EFaktor{1}\def\EMass{mm}%
   \nextSchluessel}
\newif\ifTeXNamen \newif\ifToken
\newif\ifWerte \newif\ifPfeile
\def\Einheit{1mm}
\def\EFaktor{1}\def\EMass{mm}
%    \end{macrocode}
% F"ur jedes der erlaubten Token folgt nun dessen Definition. Wir
% beginnen am Ende:
%    \begin{macrocode}
\@namedef{LB/}{\OldOber{LB}}
%    \end{macrocode}
% Einfacher geht es nicht, oder? Als n"achstes werden dann einfach die
% |\if|s entsprechend den Token gesetzt.
%    \begin{macrocode}
\@namedef{LBTeX-Namen}{%
   \Tokenfalse \TeXNamentrue
   \Pfeiletrue
   \nextSchluessel}
\def\LBToken{%
   \Tokentrue \TeXNamenfalse
   \Pfeiletrue
   \nextSchluessel}
\def\LBWerte{%
   \Wertetrue \Pfeiletrue
   \nextSchluessel}
\def\getEinheit#1#2. {%
   \def\EFaktor{#1}\def\EMass{#2}}
\def\LBEinheit <#1> {\def\He{#1}%
   \def\Einheit{#1}\relax
   \expandafter\getEinheit\He.
   \Wertetrue \Pfeiletrue
   \nextSchluessel}
\def\LBKonstruktion{%
   \ifx\setcoordinatesystem\undefined
        \message{Warnung: Die Konstruktionsskizze kann nur mit
            \string\PiCTeX\space gezeichnet werden.}%
    \else
      \Konstruktiontrue
   \fi
   \nextSchluessel}
\newif\ifKonstruktion \Konstruktionfalse
%    \end{macrocode}
% \end{macro}
%
% Im folgenden wird ein Hilfsmakro ben"otigt, da"s die Einheit pt von
% einer Zahl entfernt. Es stammt auch aus \PiCTeX.
%    \begin{macrocode}
\newdimen\removeDIM
\def\removept#1#2{\removeDIM=#1\relax
   \edef#2{\expandafter\removePT\the\removeDIM}}
{\catcode`p=12 \catcode`t=12 \gdef\removePT#1pt{#1}}
%    \end{macrocode}
%
% \begin{macro}{\KonKasten}
% Der wichtige Befehl, der jetzt programmiert werden soll, wird eine
% ganze Reihe von K"asten zu zeichnen haben. Hiermit beginnen wir.
%    \begin{macrocode}
\def\KonKasten #1 #2 [#3] at #4 #5 {%
   \removept{#1}\Hw \removept{#2}\Hh
   \removept{#4}\Hx \removept{#5}\Hy
   \put(\Hx,\Hy){\makebox(0,0)[#3]{\framebox(\Hw,\Hh){}}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\KonPfeil}
% \begin{macro}{\KonText}
% Ein Pfeil zum Beschriften wird auch ben"otigt. Hier wird auch
% entschieden, was als Ma"swert stehen soll. Wir brauchen (wieder
% aus \PiCTeX\ ein Makro, mit dem man Dimensionsregister dividieren
% kann:
%    \begin{macrocode}
\newdimen\dimenA \newdimen\dimenB
\newdimen\dimenC \newdimen\dimenD
\def\@Divide#1#2#3{%
  \dimenB=#1%
  \dimenC=#2%
  \dimenD=\dimenB
  \divide \dimenD \dimenC
  \dimenA=\dimenD
  \multiply\dimenD \dimenC
  \advance\dimenB -\dimenD
  \dimenD=\dimenC
    \ifdim\dimenD<0pt\dimenD=-\dimenD
  \fi
  \ifdim\dimenD<64pt
    \Divstep[256]\Divstep[256]%
  \else
    \DIvide
  \fi
  #3=\dimenA\ignorespaces}
\def\DIvide{%
  \ifdim\dimenD<256pt
    \Divstep[64]\Divstep[32]\Divstep[32]%
  \else
    \Divstep[8]\Divstep[8]\Divstep[8]\Divstep[8]\Divstep[8]%
    \dimenA=2\dimenA
  \fi}
\def\Divstep[#1]{%
  \dimenB=#1\dimenB
  \dimenD=\dimenB
  \divide \dimenD by \dimenC
  \dimenA=#1\dimenA
    \advance\dimenA by \dimenD
  \multiply\dimenD by \dimenC
    \advance\dimenB by -\dimenD}
%    \end{macrocode}
% Um die vielen Berechnungen etwas "ubersichtlicher zu gestalten,
% benutzen wir die Token-Makros zum Parsen von einfachen Formeln.
% Es sind Ausdr"ucke der Form
%\begin{verbatim}
%\Rechne {...} + {...} - ... + {...} -> {...} [...]
%\end{verbatim}
% erlaubt. Es sind als "`Zahlen"' nur Dimensionen (pt) erlaubt.
% Sie k"onne allerdings optionale Faktoren haben. Beispiel:
%\begin{verbatim}
%\Rechne {0.5\textwidth} + {\textwidth} - {2pt} -> {\Ergebnis}
%\end{verbatim}
% Die Makros sind eigentlich recht linear. Mit dem optionalen Argument
% (in eckigen Klammern) kann das Ergebnis gleich ohne "`pt"' in ein
% Makro "ubernommen werden.
% \changes{v1.0b}{93/02/24}{$/$ und $*$ beim Rechnen erg"anzt.}
%    \begin{macrocode}
\newdimen\HW
\def\Rechne #1 {\NewOber{Rechne}%
   \dimenA = #1%
   \nextSchluessel}
\@namedef{Rechne->}#1 {\OldOber{Rechne}%
   #1=\dimenA\relax
   \@ifnextchar[{\Rechneopt}{\ignorespaces}}
\def\Rechneopt[#1] {\removept{\dimenA}{#1}\ignorespaces}
\@namedef{Rechne+}#1 {%
   \advance\dimenA by #1%
   \nextSchluessel}
\@namedef{Rechne-}#1 {%
   \advance\dimenA by -#1%
   \nextSchluessel}
\@namedef{Rechne/}#1 {%
   \divide\dimenA by #1%
   \nextSchluessel}
\@namedef{Rechne*}#1 {%
   \multiply\dimenA by #1%
   \nextSchluessel}
\def\ABS#1{\ifdim#1<0pt-#1\else#1\fi}
%    \end{macrocode}
% Jetzt kommt das Makro, mit dem die Bema"sung ausgegeben wird. Die
% Einstellungen aus |\Layoutbeschriftung| werden beachtet.
%    \begin{macrocode}
\def\CUT#1{\edef\TMP{#1}%
   \edef#1{\expandafter\MakeCUT\TMP.000*}}
\def\MakeCUT#1.#2#3#4*{#1.#2#3}
\def\Wert#1#2{\@Divide{#1}{\Einheit}{\dimenA}%
   \removept{\dimenA}{#2}%
   \CUT#2}
\def\KonText#1{%
   \def\Name{%
      \ifToken\hbox{\footnotesize#1\vphantom{)}}%
      \else
         \ifTeXNamen\hbox{\footnotesize\char92#1\vphantom{)}}\fi
      \fi}%
   \ifWerte
      \ifToken
         \expandafter\HW\csname DIM#1\endcsname
      \else
         \expandafter\HW\csname #1\endcsname
      \fi
      \ifdim\HW>12pt\vbox\fi{\footnotesize
      \Wert{\HW}{\Hw}%
      \Name
      \hbox{\ifToken~=~\else\ifTeXNamen~=~\fi\fi
      \Hw
      \if\EFaktor1\else\cdot\EFaktor\fi
      \,\EMass\vphantom{(}}}%
   \else
      \Name
   \fi}
\def\KonPfeil #1 from #2 #3 to #4 #5 {{%
   \ifdim#2=#4% vertikaler Pfeil
      \ifdim#3=#5\else
         \Rechne {#3} - {#5} -> {\dimen0}
         \Rechne {\ABS{\dimen0}} -> {\dimen1} [\Hl]
         \Rechne {0.5\dimen0} + {#5} -> {\dimen0} [\Hm]
         \ifdim#5<#3%
            \removept{#5}\Ha
         \else
            \removept{#3}\Ha
         \fi
         \removept{#2}\Hx
         \put(\Hx,\Ha){\vector(0,1){\Hl}}
         \put(\Hx,\Ha){\vector(0,-1){0}}
         \put(\Hx,\Hm){\makebox(0,0)[l]{\fbox{\KonText{#1}}}}
      \fi
   \else       % horizontaler Pfeil
      \Rechne {#2} - {#4} -> {\dimen0}
      \Rechne {\ABS{\dimen0}} -> {\dimen1} [\Hl]
      \Rechne {0.5\dimen0} + {#4} -> {\dimen0} [\Hm]
      \ifdim#4<#2%
         \removept{#4}\Ha
      \else
         \removept{#2}\Ha
      \fi
      \removept{#3}\Hy
      \put(\Ha,\Hy){\vector(1,0){\Hl}}
      \put(\Ha,\Hy){\vector(-1,0){0}}
      \put(\Hm,\Hy){\makebox(0,0)[t]{\fbox{\KonText{#1}}}}
   \fi
}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% Nun zeichnen wir einfach eine \LaTeX-picture-Umgebung mit K"asten,
% die die Layoutteile umranden. Hier k"onnen wir auch noch einige
% Register allozieren.
%    \begin{macrocode}
\newif\ifKopfinnen
\newdimen\Skizze
%    \end{macrocode}
% \begin{macro}{\Layoutskizze}
% Das Layout soll sowohl formatf"ullend als auch klein in Abbildungen
% dargestellt werden k"onnen. Die kleine Darstellung ruft man mit dem
% Environment |Layoutskizze| auf. Der Verkleinerungsfaktor wird der
% aktuellen Satzbreite angepa"st. Hier die Makros:
%    \begin{macrocode}
\def\Layoutskizze{\@ifnextchar<{\Layoutmitmass}{\Layoutohne}}
\def\Layoutohne{\leavevmode\hbox\bgroup
   \Skizze=\linewidth\ignorespaces}
\def\Layoutmitmass <#1> {\leavevmode\hbox\bgroup
    \Skizze=#1\ignorespaces}
\def\endLayoutskizze{%
   \@Divide{\Skizze}{2\Papierbreite}{\Skizze}%
   \removept{\Skizze}\MinFak
   \mbox{\fboxrule=0.1pt\fboxsep=-\fboxrule
   \topskip=0pt
   \unitlength=\Skizze
   \ifKopfinnen
      \Rechne {\DIMOben} + {\DIMKAbstand} + {\DIMKHoehe}
         -> {\dimen0}
   \else
      \dimen0=\DIMOben
   \fi
   \Pfeilefalse
   \fbox{\c@page=2\Konstruktionsbild
      \vbox to \MinFak\Papierhoehe
      {\kern\MinFak\dimen0
         \hbox to \MinFak\Papierbreite{%
         \kern\MinFak\DIMAussen
         \LayoutXX
         \hss}\vss}}%
   \fbox{\c@page=1\Konstruktionsbild
      \vbox to \MinFak\Papierhoehe
      {\kern\MinFak\dimen0
         \hbox to \MinFak\Papierbreite{%
         \kern\MinFak\DIMBund
         \LayoutXX
         \hss}\vss}}}%
   \egroup}
%    \end{macrocode}
% \end{macro}
% Das Konstruktionsbild wird mit \PiCTeX\ realisiert. Das Bild darf
% keine Ausma"se haben:
%    \begin{macrocode}
\def\Konstruktionsbild{%
   \ifKonstruktion
      \beginpicture
      \accountingoff
      \setcoordinatesystem units <\unitlength,\unitlength>
      \setplotarea x from 0 to 0, y from 0 to 0
      \the\PiCKonstruktion
      \endpicture
   \fi}
\newtoks\PiCKonstruktion \PiCKonstruktion={}
%    \end{macrocode}
% Das gro"se Layout ist ganz einfach:
%    \begin{macrocode}
\def\Layout{{\unitlength=1pt\LayoutXX}%
   \thispagestyle{empty}}
%    \end{macrocode}
% Jetzt kommt das eigentliche Makro, das die Zeichnung realisiert.
%    \begin{macrocode}
\def\LayoutXX{\hbox{%
   \removept{\topskip}\TOPSKIP
   \begin{picture}(0,0)(0,-\TOPSKIP)
   \ifKopfinnen
      \KonKasten {\textwidth} {\headsep} [bl] at 0pt 0pt
      \thicklines
      \KonKasten {\textwidth} {\DIMSatzhoehe} [bl]
         at {0pt} {-\textheight}
   \else
      \KonKasten {\textwidth} {\headheight} [bl] at 0pt {\headsep}
      \thicklines
      \KonKasten {\textwidth} {\textheight} [tl] at 0pt 0pt
   \fi
   \thinlines
   \Rechne {-\textheight} - {\footskip} -> {\dimen2}
   \KonKasten {\textwidth} {\headheight} [bl] at 0pt {\dimen2}
   \ifPfeile
      \fboxsep=1pt \fboxrule=0.1pt
      \ifToken
         \Rechne {\dimen2} + {\footskip} -> {\dimen2}
         \KonPfeil {Satzbreite}
            from {0pt} {-0.1\textheight}
            to {\textwidth} {-0.1\textheight}
         \ifKopfinnen
            \Rechne {\headsep} + {\headheight} -> {\dimen2} [\Zpt]
            \KonPfeil {Satzhoehe}
               from {0.1\textwidth} {\dimen2}
               to {0.1\textwidth} {-\textheight}
         \else
            \def\Zpt{0}%
            \KonPfeil {Satzhoehe}
               from {0.1\textwidth} {0pt}
               to {0.1\textwidth} {-\textheight}
         \fi
         \KonPfeil {KAbstand}
            from {0.2\textwidth} {0pt}
            to {0.2\textwidth} {\headsep}
         \Rechne {\headsep} + {\headheight} -> {\dimen2}
         \KonPfeil {KHoehe}
            from {0.3\textwidth} {\headsep}
            to {0.3\textwidth} {\dimen2}
         \Rechne {-\textheight} - {\footskip} -> {\dimen2}
         \KonPfeil {FAbstand}
            from {0.2\textwidth} {-\textheight}
            to {0.2\textwidth} {\dimen2}
         \Rechne {-\textheight} - {\DIMUnten} -> {\dimen3}
         \KonPfeil {Unten}
            from {0pt} {-\textheight} to {0pt} {\dimen3}
         \ifKopfinnen
            \Rechne {\topmargin} + {\voffset} + {1in}
               + {\headheight} + {\headsep} -> {\dimen2}
            \Rechne {\headheight} + {\headsep} -> {\dimen3}
         \else
            \dimen2 = \DIMOben
            \dimen3 = 0pt
         \fi
         \KonPfeil {Oben}
            from {0pt} {\dimen2} to {0pt} {\dimen3}
         \ifodd\value{page}
            \Rechne {-\oddsidemargin} - {\hoffset} - {1in} -> {\dimen2}
            \KonPfeil {Bund}
               from {\dimen2} {\Zpt pt} to {0pt} {\Zpt pt}
            \Rechne {\textwidth} + {\DIMAussen} -> \dimen2
            \KonPfeil {Aussen}
               from {\textwidth} {\Zpt pt} to {\dimen2} {\Zpt pt}
         \else
            \Rechne {-\evensidemargin} - {\hoffset} - {1in} -> {\dimen2}
            \KonPfeil {Aussen}
               from {\dimen2} {\Zpt pt} to {0pt} {\Zpt pt}
            \Rechne {\textwidth} + {\DIMBund} -> \dimen2
            \KonPfeil {Bund}
               from {\textwidth} {\Zpt pt} to {\dimen2} {\Zpt pt}
         \fi
      \fi
   \fi
   \end{picture}}}
%    \end{macrocode}
%
% \subsubsection{Papierformat}
%
% \begin{macro}{\PapierFormat}
% F"ur die Konstruktionen mu"s das Papierformat bekannt sein. Man kann
% DIN-Formate angeben, aber auch explizite L"angenangaben sind erlaubt.
%    \begin{macrocode}
\let\EndPapierFormat\relax
\let\EndPapierFormatEX\relax
\def\PapierFormat{%
   \@ifnextchar<{\let\EndPapierFormatEX\EndPapierFormat
        \PapierFormatEX}{\PapierFormatDIN}}
\let\Papierformat\PapierFormat
\newdimen\Papierbreite \newdimen\Papierhoehe
\def\PapierFormatEX<#1,#2> {%
   \Papierbreite=#1\relax
   \Papierhoehe=#2\relax
   \EndPapierFormatEX}
\def\WZwei{1.4142pt}
\newcount\loopcount
\def\PapierFormatDIN#1#2 {%
   \if#1A\PapierFormatEX <841mm,1189mm>
   \else
      \if#1B\PapierFormatEX <1000mm,1414mm>
      \else
         \if#1C\PapierFormatEX <917mm,1297mm>
         \else
            \message{Warnung: Formatreihe #1 nicht definiert.}
            \message{Benutze DIN-A-Reihe.}
            \PapierFormatEX <841mm,1189mm>
         \fi
      \fi
   \fi
   \loopcount=#2\relax
   \loop
   \ifnum\loopcount>0
      \@Divide{\Papierbreite}{\WZwei}{\Papierbreite}
      \@Divide{\Papierhoehe}{\WZwei}{\Papierhoehe}
      \advance\loopcount by -1
   \repeat
   \RoundmmInt\Papierbreite
   \RoundmmInt\Papierhoehe
   \Wert{\Papierbreite}\Ha \Wert{\Papierhoehe}\Hb
   \message{DIN #1#2 berechnet zu <\Ha\EMass,\Hb\EMass>.}%
   \EndPapierFormat}
\PapierFormat <210mm,297mm>
%    \end{macrocode}
% Nach der DIN-Norm wird nach der Berechnung das Format auf Millimeter
% gerundet. Das geschieht durch das Makro |\RoundmmInt|. Der Summand
% 0.5001 ist der Wert 0.5, der jedoch wegen der Integer-Rechnung von
% \TeX\ etwas korrigiert werden mu"s. |\CUTG| schneidet auf ganze
% Zahlen ab.
%    \begin{macrocode}
\def\RoundmmInt#1{%
   \@Divide{#1}{1mm}{\HW}%
   \Rechne {\HW} + {0.0pt} -> {\HW}
   \removept{\HW}\Hw
   \CUTG\Hw
   #1=\Hw mm}
\def\CUTG#1{\edef\TMP{#1}%
   \edef#1{\expandafter\MakeCUTG\TMP.000*}}
\def\MakeCUTG#1.#2#3#4*{#1}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\QuerFormat}
% Das Umschalten auf Querformat ist ganz einfach, es wird nur die
% Papierh"ohe mit der Papierbreite vertauscht:
%    \begin{macrocode}
\def\QuerFormat{%
    \dimen0=\Papierbreite
    \Papierbreite=\Papierhoehe
    \Papierhoehe=\dimen0}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Freie Einstellung der Parameter}
%
% \begin{macro}{\FreeStyle}
% Die Konstruktionsmethoden bauen alle auf dem folgenden Befehl
% auf. Mit |\FreeStyle| werden beliebige Werte gesetzt und
% globale Einstellungen vorgenommen.
%
% Zuerst ben"otigen wir einige Register:
%    \begin{macrocode}
\newdimen\DIMSatzbreite \newdimen\DIMSatzhoehe
\newdimen\DIMBund \newdimen\DIMAussen
\newdimen\DIMOben \newdimen\DIMUnten
\newdimen\DIMKAbstand \newdimen\DIMKHoehe
\newdimen\DIMFAbstand
\newif\ifDoppelseite \Doppelseitefalse
\newif\ifnoSB \newif\ifnoSH
%    \end{macrocode}
% Jetzt folgen die Makros f"ur die Schl"usselworte.
%    \begin{macrocode}
\def\FreeStyle{\NewOber{Free}%
   \noSBtrue\noSHtrue
   \DIMSatzbreite = \textwidth
   \DIMSatzhoehe = \textheight
   \ifKopfinnen
      \Rechne {\DIMSatzhoehe} + {\headsep} + {\headheight}
         -> {\DIMSatzhoehe}
      \Rechne {1in} + {\topmargin} + {\voffset} -> {\DIMOben}
   \else
      \Rechne {1in} + {\topmargin} + {\voffset}
         + {\headheight} + {\headsep} -> {\DIMOben}
   \fi
   \Rechne {1in} + {\hoffset} + {\oddsidemargin} -> {\DIMBund}
   \Rechne {\Papierbreite} - {\DIMBund} - {\DIMSatzbreite}
      -> {\DIMAussen}
   \Rechne {\Papierhoehe} - {\DIMOben} - {\DIMSatzhoehe}
      -> {\DIMUnten}
   \DIMKAbstand = \headsep
   \DIMKHoehe = \headheight
   \DIMFAbstand = \footskip
   \if@twoside\Doppelseitetrue\fi
   \nextSchluessel}
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\@namedef{Free/}{\OldOber{Free}%
   \ifnoSB
     \Rechne {\Papierbreite} - {\DIMBund} - {\DIMAussen}
       -> {\DIMSatzbreite}
   \fi
   \textwidth = \DIMSatzbreite
   \ifnoSH
     \Rechne {\Papierhoehe} - {\DIMOben} - {\DIMUnten}
       -> {\DIMSatzhoehe}
   \fi
   \textheight = \DIMSatzhoehe
   \headheight\DIMKHoehe
   \headsep\DIMKAbstand
   \footskip\DIMFAbstand
   \voffset=0pt\hoffset=0pt
   \Rechne {\DIMBund} - {1in} -> {\oddsidemargin}
   \Rechne {\DIMAussen} - {1in} -> {\evensidemargin}
   \ifKopfinnen
      \Rechne {\DIMSatzhoehe} - {\headsep} - {\headheight}
         -> {\textheight}
      \Rechne {\DIMOben} - {1in} -> {\topmargin}
   \else
      \textheight = \DIMSatzhoehe
      \Rechne {\DIMOben} - {\headsep} - {\headheight} - {1in}
         -> {\topmargin}
   \fi
   \ifDoppelseite
      \@twosidetrue\@mparswitchtrue
      \ifx\KopfTextlinks\Pempty\else
         \def\@evenhead{\KopfTextlinks}%
      \fi
      \ifx\FussTextlinks\Pempty\else
         \def\@evenfoot{\FussTextlinks}%
      \fi
    \else
        \@twosidefalse\@mparswitchfalse
   \fi
   \ifx\KopfTextrechts\Pempty\else
      \def\@oddhead{\KopfTextrechts}%
   \fi
   \ifx\FussTextrechts\Pempty\else
      \def\@oddfoot{\FussTextrechts}%
   \fi
}
\def\Pempty{.}
\def\KopfTextlinks{.}
\def\KopfTextrechts{.}
\def\FussTextlinks{.}
\def\FussTextrechts{.}
\def\FreeDoppelseite{\Doppelseitetrue
   \nextSchluessel}
\def\FreeEinfachseite{\Doppelseitefalse
    \nextSchluessel}
\def\FreeSatzbreite <#1> {\DIMSatzbreite=#1%
   \noSBfalse
   \nextSchluessel}
\def\FreeSatzhoehe <#1> {\DIMSatzhoehe=#1%
   \noSHfalse
   \nextSchluessel}
\def\FreeBund <#1> {\DIMBund=#1%
   \nextSchluessel}
\def\FreeAussen <#1> {\DIMAussen=#1%
   \nextSchluessel}
\def\FreeOben <#1> {\DIMOben=#1%
   \nextSchluessel}
\def\FreeUnten <#1> {\DIMUnten=#1%
   \nextSchluessel}
\def\FreeKopfzeile{\NewOber{FreeKopf}%
   \nextSchluessel}
\@namedef{FreeKopf/}{\OldOber{FreeKopf}%
   \nextSchluessel}
\def\FreeKopflebend{\Kopfinnentrue
   \nextSchluessel}
\def\FreeKopftot{\Kopfinnenfalse
   \nextSchluessel}
\def\FreeKopfHoehe <#1> {\DIMKHoehe#1
   \nextSchluessel}
\def\FreeKopfAbstand <#1> {\DIMKAbstand#1
   \nextSchluessel}
\def\FreeKopfText{%
   \ifDoppelseite
      \let\next\KTextzwei
   \else
      \let\next\KTexteins
   \fi\next}
\def\KTexteins #1 {\def\KopfTextrechts{{#1}}%
   \nextSchluessel}
\def\KTextzwei #1 #2 {\def\KopfTextlinks{{#1}}%
   \def\KopfTextrechts{{#2}}%
   \nextSchluessel}
\def\FreeFusszeile{\NewOber{FreeFuss}%
   \nextSchluessel}
\@namedef{FreeFuss/}{\OldOber{FreeFuss}%
   \nextSchluessel}
\def\FreeFussAbstand <#1> {\DIMFAbstand#1
   \nextSchluessel}
\def\FreeFussText{%
   \ifDoppelseite
      \let\next\FTextzwei
   \else
      \let\next\FTexteins
   \fi\next}
\def\FTexteins #1 {\def\FussTextrechts{{#1}}%
   \nextSchluessel}
\def\FTextzwei #1 #2 {\def\FussTextlinks{{#1}}%
   \def\FussTextrechts{{#2}}%
   \nextSchluessel}
%    \end{macrocode}
%
% \subsection{Korrektur voreingestellter Werte}
%
% An dieser Stelle wiederholen sich in etwa die Makros aus dem
% vorangegangenen Abschnitt. Die Zuweiseungen sind jedoch Additionen.
% Die Kopf- und Fu"szeilen-Textfestlegung ist in |\KorrStyle| nicht
% vorgesehen. Man kann ja |\FreeStyle| dazu benutzen.
%    \begin{macrocode}
\def\KorrStyle{\NewOber{Korr}%
   \DIMSatzbreite = \textwidth
   \DIMSatzhoehe = \textheight
   \ifKopfinnen
      \Rechne {\DIMSatzhoehe} + {\headsep} + {\headheight}
         -> {\DIMSatzhoehe}
      \Rechne {1in} + {\topmargin} + {\voffset} -> {\DIMOben}
   \else
      \Rechne {1in} + {\topmargin} + {\voffset}
         + {\headheight} + {\headsep} -> {\DIMOben}
   \fi
   \Rechne {1in} + {\hoffset} + {\oddsidemargin} -> {\DIMBund}
   \Rechne {\Papierbreite} - {\DIMBund} - {\DIMSatzbreite}
      -> {\DIMAussen}
   \Rechne {\Papierhoehe} - {\DIMOben} - {\DIMSatzhoehe}
      -> {\DIMUnten}
   \DIMKAbstand\headsep
   \DIMKHoehe\headheight
   \DIMFAbstand\footskip
   \if@twoside\Doppelseitetrue\fi
   \nextSchluessel}
\@namedef{Korr/}{\OldOber{Korr}%
   \textwidth\DIMSatzbreite
   \headheight\DIMKHoehe
   \headsep\DIMKAbstand
   \footskip\DIMFAbstand
   \voffset=0pt \hoffset=0pt
   \Rechne {\DIMBund} - {1in} -> {\oddsidemargin}
   \Rechne {\DIMAussen} - {1in} -> {\evensidemargin}
   \ifKopfinnen
      \Rechne {\DIMSatzhoehe} - {\headsep} - {\headheight}
         -> {\textheight}
      \Rechne {\DIMOben} - {1in} -> {\topmargin}
   \else
      \textheight = \DIMSatzhoehe
      \Rechne {\DIMOben} - {\headsep} - {\headheight} - {1in}
         -> {\topmargin}
   \fi
   \ifDoppelseite
      \@twosidetrue\@mparswitchtrue
    \fi
}
\def\KorrDoppelseite{\Doppelseitetrue
   \nextSchluessel}
\def\KorrEinfachseite{\Doppelseitefalse
   \nextSchluessel}
\def\KorrSatzbreite <#1> {\advance \DIMSatzbreite by #1%
   \nextSchluessel}
\def\KorrSatzhoehe <#1> {\advance \DIMSatzhoehe by #1%
   \nextSchluessel}
\def\KorrBund <#1> {\advance \DIMBund by #1%
   \nextSchluessel}
\def\KorrAussen <#1> {\advance \DIMAussen by #1%
   \nextSchluessel}
\def\KorrOben <#1> {\advance \DIMOben by #1%
   \nextSchluessel}
\def\KorrUnten <#1> {\advance \DIMUnten by #1%
   \nextSchluessel}
\def\KorrKopfzeile{\NewOber{KorrKopf}%
   \nextSchluessel}
\@namedef{KorrKopf/}{\OldOber{KorrKopf}%
   \nextSchluessel}
\def\KorrKopflebend{\Kopfinnentrue
   \nextSchluessel}
\def\KorrKopftot{\Kopfinnenfalse
   \nextSchluessel}
\def\KorrKopfHoehe <#1> {\advance \DIMKHoehe by #1
   \nextSchluessel}
\def\KorrKopfAbstand <#1> {\advance \DIMKAbstand by #1
   \nextSchluessel}
\def\KorrFusszeile{\NewOber{KorrFuss}%
   \nextSchluessel}
\@namedef{KorrFuss/}{\OldOber{KorrFuss}%
   \nextSchluessel}
\def\KorrFussAbstand <#1> {\advance \DIMFAbstand by #1
   \nextSchluessel}
%    \end{macrocode}
%
% \subsection{Konstruktionsmethoden}
%
% Um dem Anwender nun aber wirklich das Leben zu erleichtern, werden
% einige Konstruktionsmethoden hier schon implementiert. Ihre Ergebnisse
% k"onnen dan immer noch mit |\KorrStyle| korrigiert bzw. angepa"st
% werden. Wichtig ist, da"s dem Benutzer verschiedene Layouts an die
% Hand gegeben werden, die ohne Aufwand mit \TeX\ realisiert werden
% k"onnen. Bevor diese Konstruktionsmethoden aufgerufen werden k"onnen,
% mu"s das Papierformat definiert worden sein.
%
% \subsubsection{"Ahnlichkeitskonstruktion}
%
% Die Basis ist eine vom Benutzer zu w"ahlende Satzbreite. Davon
% ausgehend wird dann ein zum Papierformat "ahnliches Rechteck als
% Satzspiegel konstruiert. Die R"ander werden im Verh"altnis des
% goldenen Schnitts ($1:1.618$) verteilt.
%    \begin{macrocode}
\def\Aehnlichkeitskonstruktion <#1> {%
   \@Divide{\Papierhoehe}{\Papierbreite}{\HW}%
   \removept{\HW}\Hf
   \DIMSatzbreite=#1\relax
   \DIMSatzhoehe=\Hf\DIMSatzbreite
   \Rechne {\Papierbreite} - {\DIMSatzbreite} -> {\HW}
   \DIMAussen = 0.618\HW \DIMBund = 0.382\HW
   \Rechne {\Papierhoehe} - {\DIMSatzhoehe} -> {\HW}
   \DIMUnten = 0.618\HW \DIMOben = 0.382\HW
   \WerteRealisieren}
%    \end{macrocode}
% Die Festlegung der \TeX-Werte kann man sich nun aus dem |\FreeStyle|
% borgen, genauer aus dem Makro |\Free/|. Zum Ende der Konstruktion
% wird dann noch eine Plausibilit"atspr"ufung durchgef"uhrt, um den
% Benutzer vor merkw"urdigen Werten zu warnen.
%    \begin{macrocode}
\def\WW#1{\Wert{\csname DIM#1\endcsname}{\HH}%
   \message{(#1:\HH)}}
\def\WerteRealisieren{%
   \Plausibilitaet%
   \DIMKAbstand=1\baselineskip
   \DIMKHoehe=1\baselineskip
   \DIMFAbstand=2\baselineskip
   \Kopfinnentrue
   \NewOber{Korr}%
   \csname Korr/\endcsname}
%    \end{macrocode}
%
% Die Plausibilit"atspr"ufung wird gleich anschlie"send programmiert. Sie
% ist recht einfach nachzuvollziehen.
%    \begin{macrocode}
\def\Plausibilitaet{%
   \ifdim\DIMSatzbreite<0.6\Papierbreite
      \KonWarn{Die Satzbreite ist ziemlich klein.}%
   \fi
   \ifdim\DIMSatzbreite>0.8\Papierbreite
      \KonWarn{Die Satzbreite ist ziemlich gross.}%
   \fi
   \ifdim\DIMBund<15mm
      \KonWarn{Der Bundsteg ist sehr klein ausgefallen.}%
   \fi
   \ifdim\Rcount=1234pt\else
      \ifdim\Rcount<5pt
         \removept{\Rcount}\RCount
         \KonWarn{Rasterteilung zu grob (\RCount).}%
      \fi
      \ifdim\Rcount>12pt
         \removept{\Rcount}\RCount
         \KonWarn{Rasterteilung zu fein (\RCount).}%
      \fi
   \fi}
\def\KonWarn#1{\message{Layout Warnung: #1}}
%    \end{macrocode}
%
% \subsubsection{Renaissance-Verteilung}
%
% Bei der Renaissance-Verteilun werden die R"ander im Verh"altnis
% $2:3:4:5$ aufgeteilt. Die Satzbreite wird vorgegeben.
%
%    \begin{macrocode}
\def\Renaissancekonstruktion <#1> {%
   \DIMSatzbreite=#1\relax
    \Rechne {\Papierbreite} - {\DIMSatzbreite} -> {\HW}
   \divide\HW by 6
    \DIMBund=2\HW \DIMAussen=4\HW \DIMOben=3\HW \DIMUnten=5\HW
    \Rechne {\Papierhoehe} - {\DIMOben} - {\DIMUnten}
        -> {\DIMSatzhoehe}
   \WerteRealisieren}
%    \end{macrocode}
%
% \subsubsection{Rasterkonstruktion}
%
% Die allgemeine Rasterkonstruktion geht von einer rasterartigen
% Aufteilung der Seite auf. Die R"ander werden dann im Verh"altnis
% $1:2$ besetzt.
%    \begin{macrocode}
\newdimen\Rcount \Rcount=1234pt
\def\Rasterkonstruktion #1 {\Rcount=#1pt%
   \advance\Rcount by -3pt%
   \removept{\Rcount}\RCount
   \@Divide{\Papierbreite}{#1pt}{\HW}%
   \DIMSatzbreite=\RCount\HW
   \@Divide{\Papierhoehe}{\Papierbreite}{\HW}%
   \removept{\HW}\Hw
   \DIMSatzhoehe=\Hw\DIMSatzbreite
   \@Divide{\Papierbreite}{#1pt}{\HW}%
   \DIMBund=1\HW
   \DIMAussen=2\HW
    \edef\RasterWeiteB{\the\HW}%
   \@Divide{\Papierhoehe}{#1pt}{\HW}%
   \DIMOben=1\HW
   \DIMUnten=2\HW
    \edef\RasterWeiteH{\the\HW}%
   \Rcount=#1pt%
   \WerteRealisieren
%    \end{macrocode}
% Nun wird noch die Konstruktionsmethode als \PiCTeX-Eingabe festgelegt,
% damit sie bei der Satzspiegelzeichnung mit eingebaut werden kann:
%    \begin{macrocode}
   \PiCKonstruktion={%
      \removept{\Papierbreite}\Pb
      \removept{\Papierhoehe}\Ph
      \dimen0\Rcount\removept{\Rcount}\RC
      \edef\RC{\expandafter\MakeCUTG\RC.000*}%
      \expandafter\HW\RC pt
      \ifdim\Rcount=\HW
         \accountingoff
         \put {\beginpicture
               \setplotarea x from 0 to {\Pb}, y from 0 to {\Ph}
                    \accountingoff
               \linethickness=0.1pt
               \grid {\RC} {\RC}
               \endpicture} [Bl] at 0 0
      \fi}}
%    \end{macrocode}
%
% \subsubsection{Diagonalkonstruktion}
%
% Das Diagonalverfahren ist ein Rasterverfahren mit ggf.
% nichtganzzahliger Rasterzahl. Die Berechnung erfolgt nach
% der gew"unschten Satzbreite
%    \begin{macrocode}
\def\Diagonalkonstruktion <#1> {\DIMSatzbreite=#1
   \Rechne {0.33333\Papierbreite} - {0.33333\DIMSatzbreite} -> {\HW}
   \@Divide{\Papierbreite}{\HW}{\Rcount}%
   \removept{\Rcount}\RCOunt
   \Rasterkonstruktion {\RCOunt}
%    \end{macrocode}
% Auch hier kommt noch die Konstruktionsmethode:
%    \begin{macrocode}
   \PiCKonstruktion={%
      \removept{\Papierbreite}{\Pb}%
      \removept{\Papierhoehe}{\Ph}%
      \removept{0.5\Papierhoehe}{\Phh}%
      \ifodd\value{page}%
         \plot {\Pb} 0 0 {\Ph} /
         \plot {\Pb} 0 0 {\Phh} {\Pb} {\Ph} /
      \else
         \plot 0 {\Ph} {\Pb} {\Phh} 0 0 /
         \plot 0 0 {\Pb} {\Ph} /
      \fi}}
%    \end{macrocode}
%
% \subsubsection{Goldener Schnitt}
%
% Der Konstruktion zum Goldenen Schnitt ist noch einfacher zu
% programmieren. Sie hat den Vorteil, da"s zus"atzlich zu den R"andern
% auch der Satzspiegel zum Papierformat im Goldenen Schnitt steht.
% Es handelt sich einfach um die Rasterkonstruktion mit Rasterwert~9.
%    \begin{macrocode}
\def\GoldenerSchnitt{%
   \Rasterkonstruktion 9
%    \end{macrocode}
% Die Konstruktionsmethode wird jedoch wie bei der Diagonalkonstruktion
% mit einer Zusatzkonstruktion gezeichnet.
%    \begin{macrocode}
   \PiCKonstruktion={%
      \removept{\Papierbreite}{\Pb}%
      \removept{\Papierhoehe}{\Ph}%
      \removept{0.5\Papierhoehe}{\Phh}%
      \removept{0.3333\Papierbreite}{\Pbd}%
      \removept{0.6667\Papierbreite}{\Pbdd}%
      \removept{0.6667\Papierhoehe}{\Phs}%
      \removept{0.8333\Papierhoehe}{\Phss}%
      \ifodd\value{page}%
         \plot {\Pb} 0 0 {\Ph} /
         \plot {\Pb} 0 0 {\Phh} {\Pb} {\Ph} /
         \plot {\Pbd} {\Phs} {\Pbd} {\Ph} /
         \plot {\Pbd} {\Ph} 0 {\Phss} /
      \else
         \plot 0 {\Ph} {\Pb} {\Phh} 0 0 /
         \plot 0 0 {\Pb} {\Ph} /
         \plot {\Pbdd} {\Phs} {\Pb} {\Phss} /
      \fi}}
%    \end{macrocode}
%
% \subsubsection{Silberner Schnitt}
%
% Da wir bei der Konstruktion des Goldenen Schnitts eigentlich gar nicht
% so recht wissen, was hier eigentlich im Verh"altnis des Goldenen
% Schnitts stehen soll, kommt hier ein etwas abgewandeltes Verfahren.
% Damit steht die Satzbreite (Satzh"ohe) zur Papierbreite (Papierh"ohe)
% etwa im richtigen Verh"altnis ($3:5$).
%    \begin{macrocode}
\def\SilbernerSchnitt{%
   \Rasterkonstruktion 8
%    \end{macrocode}
% Die Konstruktionsmethode ist fast die des Goldenen Schnitts:
%    \begin{macrocode}
   \PiCKonstruktion={%
      \removept{\Papierbreite}{\Pb}%
      \removept{\Papierhoehe}{\Ph}%
      \removept{0.5\Papierhoehe}{\Phh}%
      \removept{0.3333\Papierbreite}{\Pbd}%
      \removept{0.5\Papierbreite}{\Pbh}%
      \removept{0.6667\Papierhoehe}{\Phs}%
      \ifodd\value{page}%
         \plot {\Pb} 0 0 {\Ph} /
         \plot {\Pb} 0 0 {\Phh} {\Pb} {\Ph} /
         \plot {\Pbd} {\Phs} {\Pbd} {\Ph} /
         \plot {\Pbd} {\Ph} {-\Pbh} {\Phh} /
      \else
         \plot 0 {\Ph} {\Pb} {\Phh} 0 0 /
         \plot 0 0 {\Pb} {\Ph} /
            \plot 0 {\Ph} {\Pb} 0 /
      \fi}}
%    \end{macrocode}
%
% \subsection{Fertige Layouts}
%
% Die fertigen Layouts werden auf den Originalkonstruktionen aufgebaut.
% Dann werden die Werte entsprechend ge"andert.
% \changes{v1.0f}{93/05/13}{{\tt`FertigLayout} {\tt`fi} erg"anzt.}
%    \begin{macrocode}
\def\FertigLayout #1 {%
    \expandafter\ifx\csname Fertig#1\endcsname\undefined
        \message{Layout Warnung: Das fertige Layout #1 existiert nicht.}%
    \else
        \csname Fertig#1\endcsname
    \fi}
\@namedef{Fertig12A}{\Rasterkonstruktion 12 }
\@namedef{Fertig12B}{\Rasterkonstruktion 12
    \dimen0=\RasterWeiteB \dimen1=\RasterWeiteH
    \Rechne {\DIMSatzbreite} - {\dimen0} -> {\DIMSatzbreite}
    \Rechne {\DIMSatzhoehe} - {\dimen1} -> {\DIMSatzhoehe}
    \DIMBund=1.5\dimen0 \DIMAussen=2.5\dimen0
    \DIMOben=1.5\dimen1 \DIMUnten=2.5\dimen1
    \WerteRealisieren}
\@namedef{Fertig12C}{\Rasterkonstruktion 12
    \dimen0=\RasterWeiteB \dimen1=\RasterWeiteH
    \DIMOben=\dimen1 \DIMUnten=2\dimen1
    \DIMBund=2\dimen0 \DIMAussen=2\dimen0
    \DIMSatzbreite=8\dimen0 \DIMSatzhoehe=9\dimen1
    \WerteRealisieren}
\@namedef{Fertig10A}{\Rasterkonstruktion 10 }
\@namedef{Fertig10B}{\Rasterkonstruktion 10
    \Rechne {\DIMBund} + {\RasterWeiteB} -> {\DIMBund}
    \Rechne {\DIMSatzbreite} - {\RasterWeiteB} -> {\DIMSatzbreite}
    \WerteRealisieren}
\@namedef{Fertig10C}{\Rasterkonstruktion 10
    \dimen0=\RasterWeiteB
    \Rechne {\DIMBund} + {0.5\dimen0} -> {\DIMBund}
    \Rechne {\DIMSatzbreite} - {0.5\dimen0} -> {\DIMSatzbreite}
    \WerteRealisieren}
\@namedef{Fertig8A}{\Rasterkonstruktion 8 }
\@namedef{Fertig7A}{\Rasterkonstruktion 7 }
%    \end{macrocode}
%
% \subsection{Wenn man fast alles auf eine Seite bekommen will\ldots}
% F"ur Seiten, die einen m"oglichst gro"sen Satzspiegel erhalten sollen,
% gibt es den folgenden Befehl:
%    \begin{macrocode}
\def\MaximalSeite{%
    \FreeStyle  Einfachseite
                Oben    <15mm>
                Unten   <20mm>
                Bund    <20mm>
                Aussen  <10mm>
                Fusszeile   Abstand <8mm>
                            Text    {\hfil--\,\thepage\,--\hfil} /
                Kopfzeile   tot
                            Hoehe   <0mm>
                            Abstand <0mm>
                            Text    {\hfil} /
    /
}
%    \end{macrocode}
%
% Die Schnittmarken bestehen aus $+$-Zeichen, die mittels Kerning und
% leeren Boxen an die richtigen Stellen positioniert werden. Mittels
% \verb+\clearpage+ wird ggf. am Anfang eine neue Seite erzeugt. Hierdurch
% ist garantiert, da"s das Makro nur am Seitenanfang aufgerufen wird.
%    \begin{macrocode}
\def\@SPunkt{\vbox to 0pt{\vss\hbox to 0pt{\hss+\hss}\vss}}
\def\@SDot{\vbox to 0pt{\vss\hbox to 0pt{\hss.\hss}\vss}}
\def\SchnittMarken{\clearpage{\offinterlineskip%
    \vbox to 0pt{\kern-\DIMOben
        \ifKopfinnen\else
            \kern-\headsep\kern-\headheight
        \fi
        \hbox to 0pt{\kern-\DIMBund\@SPunkt
            \kern0.5\Papierbreite
            \@SDot
            \kern0.5\Papierbreite
            \@SPunkt\hss}%
        \kern0.5\Papierhoehe
        \hbox to 0pt{\kern-\DIMBund\@SDot
            \kern\Papierbreite\@SDot\hss}%
        \kern0.5\Papierhoehe
        \hbox to 0pt{\kern-\DIMBund\@SPunkt
            \kern0.5\Papierbreite
            \@SDot
            \kern0.5\Papierbreite
            \@SPunkt\hss}%
        \vss}}}
%    \end{macrocode}
%
% \subsection{Zentrieren auf dem Druckformat}
%
% \begin{macro}{\Zentriert}
% Mittels \verb+\Zentriert auf+ kann das erstellte Layout auf das
% angegebene Druckformat zentriert werden. Normalerweise steht es
% ja in der linken oberen Ecke. Es werden die Differenzen zwischen
% dem bestehenden und dem angegebenen Format berechnet. Entsprechend
% werden dann \verb+\hoffset+ und \verb+\voffset+ erh"oht.
%    \begin{macrocode}
\def\Zentriert auf {\bgroup\let\EndPapierFormat\EndZentriert
    \edef\PB@{\the\Papierbreite}%
    \edef\PH@{\the\Papierhoehe}%
    \def\message##1{}%
    \PapierFormat}
\def\EndZentriert{%
    \advance\Papierbreite by -\PB@
    \advance\Papierhoehe by -\PH@
    \Papierhoehe=0.5\Papierhoehe
    \Papierbreite=0.5\Papierbreite
    \typeout{Verschoben um (\the\Papierbreite,\the\Papierhoehe).}%
    \global\advance\hoffset by \Papierbreite
    \global\advance\voffset by \Papierhoehe
    \egroup}
%    \end{macrocode}
% \end{macro}
%
%
\endinput
