%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Autor: Joachim Bleser % % TH Darmstadt -- Hochschulrechenzentrum % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % History: % % % % Version 1.0 % % Definition von \PARPIC un \HPIC % % % % Version 1.1 (7.3.90) % % Korrektur des \PICCHANGEMODUS % % Einfuehrung einer Option DASH und OVAL fuer \PARPIC und \HPIC % % % % Version 1.2 (12.3.90) % % Neue Umgebungen OVALENV und DASHENV % % Dokumentation innerhalb der .STY-Datei % % Korrektur der Umgebungen SHADOWENV und FRAMEENV % % % % Version 1.3 (2.5.90) % % Korrektur der DASH Option von \PARPIC und \DASHENV-Umgebung % % % % Version 1.4 (3.8.90) % % Ueberarbeitung aller Optionen von \PARPIC und \HPIC % % Neue Befehle : \PICCAPTION % % \PICHSKIP % % % % Version 1.4 (Dez.90 - Jan.91) % % Dokumentation des .sty-Files % % % % Version 2.0 (Juni 91) % % Ueberarbeitung und Umstrukturierung von \PARPIC und \HPIC % % Einfuehrung einer Option BOX fuer \PARPIC und \HPIC % % Einfuehrung eines Positionsparameters fuer \PARPIC und \HPIC % % % % Version 2.1 (November 91) % % Korrektur des \X@PAR und des \PICSKIP Kommandos % % % % Version 3.0 (Juli 92) % % Erweiterung der Unterschriften-Funktionalitaet % % Korrektur von \PARPIC % % Korrektur von \X@PAR % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % PICINS.STY enthaelt Kommandos, die die Integration von Bildern % in Text unterstuetzen. Dies sind im Einzelnen: % % \parpic : Text umfliesst das Bild % \hpic : Bilder in einem eigenen Absatz % \picskip : beeinflusst das Umfliessen von Bildern durch Text % \pichskip : horizontaler Abstand zwischen Bild und Text % \shadowthickness: Schattendicke % \dashlength: Laenge der Striche % \boxlength: Tiefe der Box % \piccaption: Unterschrift unter/neben das Bild % \newcaption: Erweitertes \caption-Kommando % \picchangemode: steuert Bildplazierung % % Weiterhin werden vier neue Umgebungen definiert: % frameenv : Umrahmt den Inhalt % shadowenv: Umrahmt den Inhalt und schattiert den Rahmen % ovalenv : Umrahmt den Inhalt mit abgerundeten Ecken % dashenv : Umrahmt den Inhalt mit einem gestrichelten Rahmen % % \message{Option `picins' Version 3.0 Sep. 1992, TH Darmstadt/HRZ} % Deklaration der benoetigten 'Variablen' % Alle Variablen, die mit \d@... anfangen, enthalten Dimensionen, % und alle Variablen, die mit \c@... anfangen, enthalten Counts \newbox\@BILD% eine BOX zur Aufnahme des Bildinhalts \newbox\@TEXT% und eine Box fuer die (optionale) Unterschrift \newdimen\d@breite% Bildbreite \newdimen\d@hoehe% Bildhoehe \newdimen\d@xoff% Offset in x-Richtung \newdimen\d@yoff% Offset in y-Richtung \newdimen\d@shad% Schattendicke \newdimen\d@dash% Strichlaenge \newdimen\d@boxl% Boxlaenge (bzw. -tiefe) \newdimen\d@pichskip% Raum zwischen Bild und Text bei \PARPIC \newdimen\d@tmp \newdimen\d@tmpa \newdimen\d@bskip \newdimen\hsiz@% Variable fuer original \hsize \newdimen\p@getot@l% Variable fuer original \pagetotal \newcount\c@breite \newcount\c@hoehe \newcount\c@xoff \newcount\c@yoff \newcount\c@pos \newcount\c@shad \newcount\c@dash \newcount\c@boxl \newcount\c@zeilen% Anzahl der einzurueckenden Zeilen bei \PARPIC \newcount\@changemode% Flag fuer den \PICCHANGEMODE \newcount\c@piccaption% Flag fuer Unterschrift unter/neben \parpic \newcount\c@piccaptionpos% Wo soll die Unterschrift stehen? \newcount\c@picpos \newcount\c@whole% Count fuer \@wholewidth (Liniendicke) \newcount\c@half% Haelfte von \C@WHOLE \newcount\c@tmp \newcount\c@tmpa \newcount\c@tmpb \newcount\c@tmpc \newcount\c@tmpd \newskip\d@leftskip \newif\if@list \@listfalse% TRUE, wenn \PARPIC innerhalb einer LIST-Umgebung % verwendet wird \newif\if@offset% TRUE, wenn bei \PARPIC oder \HPIC Offset angegeben wurden, % ansonsten FALSE % Es folgen einige Voreinstellung (Defaults): \c@piccaptionpos=1% Default Unterschrift unter Bild \c@picpos=0 \d@shad=4pt% Default fuer Schattendicke \d@dash=4pt% Default fuer gestrichelte Rahmen \d@boxl=10pt% Default fuer Boxtiefe \d@pichskip=1em% Default fuer Abstand zwischen Bild und Text \@changemode=0% Default kein Wechselmodus \def\@captype{figure}% Default fuer \piccaptype \let\old@par=\par% \PAR-Kommando wird gerettet % \pichskip steuert den horizontalen Abstand zwischen Bild und Text \def\pichskip#1{\d@pichskip #1\relax} % \shadowthickness destimmt die Schattendicke (Option [s]) \def\shadowthickness#1{\d@shad #1\relax} % \dashlength bestimmt die Strichlaenge (Option [d]) \def\dashlength#1{\d@dash #1\relax} % \boxlength bestimmt die Boxtiefe (Option [x]) \def\boxlength#1{\d@boxl #1\relax} \def\picchangemode{\@changemode=1}% Einschalter fuer den Wechselmode \def\nopicchangemode{\@changemode=0}% Ausschalter fuer den Wechselmode \def\piccaptionoutside{\c@piccaptionpos=1}% Unterschrift unter dem Rahmen \def\piccaptioninside{\c@piccaptionpos=2}% Unterschrift im Rahmen \def\piccaptionside{\c@piccaptionpos=3}% Unterschrift rechts/links neben Bild \def\piccaptiontopside{\c@piccaptionpos=4}%Unterschrift rechts/links neben Bild %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Der \piccaption-Befehl % ====================== % Der \PICCAPTION-Befehl macht nichts anderes, als ein Makro mit % der Kurzform und ein Makro mit der richtigen Unterschrift zu % definieren. Die Auswertung dieser Makros erfolgt in \PARPIC. \def\piccaption{\@ifnextchar [{\@piccaption}{\@piccaption[]}} \def\@piccaption[#1]#2{\c@piccaption=1\def\sh@rtf@rm{#1}\def\capti@nt@xt{#2}} % \MAKE@PICCAPTION verwendet das orginal LaTeX-Caption Kommando, um % Unterschrift zu erzeugen. Es muss nur die Textbreite angepasst werden. \def\make@piccaption{% \hsiz@\d@breite% So breit darf die Unterschrift werden \ifnum\c@piccaptionpos=2% Abhaenig von der Postion, an der die \advance\hsiz@ -2\fboxsep% Unterschrift stehen soll, wird die Textbreite \fi% entsprechend korrigiert. \ifnum\c@piccaptionpos>2% \hsiz@\hsize\advance\hsiz@-\d@breite\advance\hsiz@-\d@pichskip% \fi% \setbox\@TEXT=\vbox{\hsize\hsiz@\caption[\sh@rtf@rm]{\capti@nt@xt}}% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Der \newcaption-Befehl % ====================== % Das \piccaption-Kommando entspricht weitgehend dem LaTeX % \caption-Kommando aus dem LATEX.TEX-File % Dieses Kommando bewirkt, dass der Unterschriftentext linksbuendig % untereinander steht. \def\newcaption{\refstepcounter\@captype\@dblarg{\@newcaption\@captype}} \long\def\@newcaption#1[#2]#3{% \old@par% \addcontentsline{\csname ext@#1\endcsname }{#1}% {\protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}} \begingroup\@parboxrestore\normalsize% \@newmakecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\old@par% \endgroup% } \long\def\@newmakecaption#1#2{% \vskip 10pt% \setbox\@tempboxa \hbox {#1: #2}% \ifdim \wd\@tempboxa >\hsize% #1: #2\par%<-- So steht's im Orginal \setbox0=\hbox{#1: }\dimen0=\hsize\advance\dimen0 by-\wd0 \setbox1=\vtop{\hsize=\dimen0 #2} \hbox{\box0 \box1} \par \else \hbox to\hsize {\hfil \box \@tempboxa \hfil} \fi } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Der \parpic-Befehl % ================== % Syntax: \parpic(breite,hoehe)(x-off,y-off)[Optionen][Position]{Bildinhalt} % ------------------------------------------------------------------ % \parpic positioniert ein Bild an den Anfang eines neuen Absatzes. % Neben dem Bild steht Text (das Bild wird vom Text umflossen). % Angegeben werden muss der Bildinhalt, alle anderen Angaben sind optional. % % Vorgehensweise: % Zuerst wird gefragt, ob die optionalen Parameter vorhanden sind % Dem LaTeX-Befehl \@ifnextchar werden drei Parameter uebergeben: % 1. das Zeichen, das als naechstes erwartet wird % 2. die Aktion, die ausgefuehrt wird, wenn das Zeichen tatsaechlich % erscheint % 3. die Aktion, die ausgefuehrt wird, wenn das Zeichen nicht erscheint % Im dritten Fall werden Defaultwerte an die Aktion uebergeben. % % Dann werden Bildhoehe und Bildbreite ermittelt. Wurden Offsets % uebergeben, wird das Bild nach diesen Offsets positioniert, ansonsten % wird nach Parameter #6 positioniert. % Anschliessend werden die Umrahmnungsparameter ausgewertet. % Nun wird berechnet, ob das Bild noch auf die aktuelle Seite passt, % oder ob umgebrochen werden muss. Nun kann das Bild positioniert % werden. Zuletzt wird die Anzahl der einzurueckenden Zeilen berechnet % und das \par-Kommando fuer eigene Zwecke umdefiniert. % % Es wird getestet, ob Bildbreite und Bildhoehe explizit angegeben wurden \def\parpic{% \@ifnextchar ({\iparpic}{\iparpic(0pt,0pt)} } % Es wird getestet, ob Offsets angeben wurden. \def\iparpic(#1,#2){% \@ifnextchar ({\@offsettrue\iiparpic(#1,#2)}% {\@offsetfalse\iiparpic(#1,#2)(0pt,0pt)} } % Es wird getestet, ob Umrahmungsoptionen angegeben wurden. Wenn nicht, % wird ein [l] (d.h. Bild auf die linke Seite) als Default uebergeben. \def\iiparpic(#1,#2)(#3,#4){% \@ifnextchar [{\iiiparpic(#1,#2)(#3,#4)}{\iiiparpic(#1,#2)(#3,#4)[l]} } % Es wird getestet, ob Positionsparameter angegeben wurden. \def\iiiparpic(#1,#2)(#3,#4)[#5]{% \@ifnextchar [{\ivparpic(#1,#2)(#3,#4)[#5]}{\ivparpic(#1,#2)(#3,#4)[#5][]} } \def\ivparpic(#1,#2)(#3,#4)[#5][#6]#7{% \let\par=\old@par\par% \hangindent0pt\hangafter1% Default Einstellungen vornehmen \setbox\@BILD=\hbox{#7}% \d@breite=#1\d@breite=\the\d@breite% Die Bildbreite wird bestimmt \ifdim\d@breite=0pt\d@breite=\wd\@BILD\fi% \c@breite=\d@breite\divide\c@breite by65536% \multiply\c@piccaption\c@piccaptionpos% \d@hoehe=#2\d@hoehe=\the\d@hoehe% Die Bildhoehe wird bestimmt \ifdim\d@hoehe=0pt\d@hoehe=\ht\@BILD\advance\d@hoehe by\dp\@BILD\fi% \c@hoehe=\d@hoehe\divide\c@hoehe by65536% \d@xoff=#3\c@xoff=\d@xoff\divide\c@xoff by65536% Der x-Offset wird berechnet \d@yoff=\d@hoehe% Der y-Offset wird berechnet \advance\d@yoff by-#4\c@yoff=\d@yoff\divide\c@yoff by65536% \c@pos=1\unitlength1pt% \if@offset% Bild wird nach den Offsets innerhalb der Rahmens positioniert \setbox\@BILD=\hbox{% \begin{picture}(\c@breite,\c@hoehe)% \put(0,0){\makebox(\c@breite,\c@hoehe){}}% \put(\c@xoff,\c@yoff){\box\@BILD}% \end{picture}% }% \else% Bild wird nach Parameter #6 positioniert \setbox\@BILD=\hbox{% \begin{picture}(\c@breite,\c@hoehe)% \put(0,0){\makebox(\c@breite,\c@hoehe)[#6]{\box\@BILD}}% \end{picture}% }% \fi% \ifnum\c@piccaption=2% Unterschrift in den Rahmen, unterhalb des Bildes. \make@piccaption% Unterschrift erzeugen. \advance\d@hoehe\ht\@TEXT\advance\d@hoehe\dp\@TEXT% 'Bild'hoehe korrigieren \c@hoehe=\d@hoehe\divide\c@hoehe by65536% \setbox\@BILD=\vbox{\box\@BILD\vspace{-5pt}% \hbox{\hspace{\fboxsep}\box\@TEXT}% \vspace{4pt}}% \fi% % Nun werden die Umrahmungsparameter ausgewertet \@tfor\@tempa := #5\do{% \if\@tempa f\setbox\@BILD=\hbox{\Rahmen(\c@breite,\c@hoehe){\box\@BILD}}\fi% \if\@tempa s\setbox\@BILD=\hbox{\Schatten(\c@breite,\c@hoehe){\box\@BILD}}\fi% \if\@tempa o\setbox\@BILD=\hbox{\Oval(\c@breite,\c@hoehe){\box\@BILD}}\fi% \if\@tempa d\setbox\@BILD=\hbox{\Strich(\c@breite,\c@hoehe){\box\@BILD}}\fi% \if\@tempa x\setbox\@BILD=\hbox{\Kasten(\c@breite,\c@hoehe){\box\@BILD}}\fi% \if\@tempa l\c@pos=1\fi% \if\@tempa r\c@pos=2\fi% }% \ifnum\c@piccaption=1% Unterschrift unterhalb des Rahmens \make@piccaption% Unterschrift erzeugen. \advance\d@hoehe\ht\@TEXT\advance\d@hoehe\dp\@TEXT% \c@hoehe=\d@hoehe\divide\c@hoehe by65536% 'Bild'-hoehe korrigieren. \setbox\@BILD=\vbox{\box\@BILD\vspace{-5pt}\hbox{\box\@TEXT}\vspace{4pt}}% \fi% \ifodd\count0\c@picpos=0\else\c@picpos=\@changemode\fi% % Wenn der verbleibende vertikale Platz auf der Seite fuer das Bild % nicht mehr ausreicht, wird ein Seitenumbruch erzwungen. \pagetotal=\the\pagetotal% \d@tmp=\pagegoal\advance\d@tmp by-\pagetotal\advance\d@tmp by-\baselineskip% \ifdim\d@hoehe>\d@tmp% \vskip 0pt plus\d@hoehe\relax\pagebreak[3]\vskip 0pt plus-\d@hoehe\relax% \ifnum\c@picpos=1\c@picpos=0\else\c@picpos=\@changemode\fi% \fi% \ifnum\c@picpos=1\ifnum\c@pos=1\c@pos=2\else\c@pos=1\fi\fi% % Wird \parpic innerhalb einer LIST-Umgebung verwendet (\@listdepth>0), % muessen besondere Vorkehrungen getroffen werden. \ifnum\@listdepth>0 \@listtrue\parshape 0% \advance\hsize -\rightmargin% \d@leftskip \leftskip% \leftskip \@totalleftmargin% \if@inlabel\rule{\linewidth}{0pt}\vskip-\baselineskip\relax\fi% \else\@listfalse\medskip% \fi% % Soll das Bild auf der rechten Seite positioniert werden, muss der % Betrag der Einrueckung berechnet werden. % einrueck := akt_textbreite - bildbreite \if@list\d@tmpa=\linewidth\else\d@tmpa=\hsize\fi% \ifnum\c@piccaption=3% Unterschrift soll neben das Bild, vertikal zentriert \make@piccaption% \d@tmp\ht\@TEXT\advance\d@tmp\dp\@TEXT% \ifdim\d@hoehe>\d@tmp% \setbox\@TEXT=\vbox to\d@hoehe{\vfill\box\@TEXT\vspace{.2\baselineskip}\vfill}% \else% \setbox\@BILD=\vbox to\d@tmp{\vfill\box\@BILD\vfill}% \d@hoehe\d@tmp% \fi% \fi% \ifnum\c@piccaption=4% Unterschrift soll neben das Bild auf gleiche Hoehe \make@piccaption% \d@tmp\ht\@TEXT\advance\d@tmp\dp\@TEXT%\advance\d@tmp-10pt% \setbox\@TEXT=\vbox to\d@hoehe{\vspace{-10pt}\box\@TEXT\vfil}% \advance\d@hoehe-\d@tmp% \fi% \ifnum\c@pos=1\d@tmpa=0pt% \ifnum\c@piccaption>2% Unterschrift soll neben das Bild \setbox\@BILD=\hbox{\box\@BILD\hspace{\d@pichskip}\hbox{\box\@TEXT}}% \fi% \else\advance\d@tmpa by-\wd\@BILD\d@breite=-\d@breite% \ifnum\c@piccaption>2% Unterschrift soll neben das Bild \d@tmpa=0pt% \setbox\@BILD=\hbox{\hbox{\box\@TEXT}\hspace{\d@pichskip}\box\@BILD}% \fi% \fi% % Um den Wert von \d@bskip wird nach der Bildplazierung wieder % nach oben zurueckgesprungen. Der Wert .3\baselineskip wurde % empirisch ermittelt. \p@getot@l\the\pagetotal% \d@bskip\d@hoehe\advance\d@bskip by\parskip\advance\d@bskip by.3\baselineskip% % Nun wird das Bild (evt. eingerueckt und) positioniert. {\noindent\hspace*{\d@tmpa}\relax% \box\@BILD\nopagebreak\vskip-\d@bskip\relax\nopagebreak}% % Aus der Bildhoehe berechnet sich die Anzahl der einzurueckenden Zeilen. % zeilen := bildhoehe / baselineskip \d@tmp=-\d@hoehe\divide\d@tmp by\baselineskip% \c@zeilen=\d@tmp\advance\c@zeilen by-1% \ifdim\d@breite<0pt\advance\d@breite by-\d@pichskip% \else\advance\d@breite by\d@pichskip% \fi% \hangindent=\d@breite% Der Bertag der Einrueckung. \hangafter=\c@zeilen% Die Anzahl der einzurueckenden Zeilen. % Die Bedeutung des \par-Kommandos wird gerettet; anschliessend wird % \par umdefiniert. \let\par=\x@par% \ifnum\c@piccaption=3% In diesem Fall steht kein weiterer Text neben \hangindent0pt\hangafter1\let\par=\old@par% dem Bild ==> vskip \vskip\d@hoehe\vskip.2\baselineskip% \fi% \c@piccaption=0% Das Unterschriftenflag wird wieder geloescht } \newdimen\ptoti \newdimen\ptotii % Das \x@par-Makro % ---------------- % Das \x@par-Makro ersetzt solange das aktuelle \par-Kommando, solange noch % Zeilen einzuruecken sind; anschliessend erhaelt das \par-Kommando seine % alte Bedeutung zurueck. \def\x@par{% \ptoti\pagetotal% Hoehe VOR dem \par-Kommando. \old@par% \old@par entspricht dem aktuellen \par \ptotii\pagetotal% Hoehe NACH dem \par-Kommando. \ifdim\ptoti=\ptotii% Der Absatz enthaelt KEINE Zeile (ist leer). \d@tmp\d@hoehe% \else% Der Absatz enthaelt mindestens eine Zeile. \d@tmp\baselineskip% Die Hoehe des vorangehenden Absatzes \multiply\d@tmp by\prevgraf% wird aus der Anzahl Zeilen des Absatzes \advance\d@tmp by\parskip% berechnet \global\advance\d@hoehe by-\d@tmp\d@tmp=\d@hoehe% \fi% % Wenn die verbleibende Bildhoehe > 0pt ist, muessen noch mehr Zeilen % eingerueckt werden. \ifdim\d@hoehe>0pt% \divide\d@tmp by\baselineskip\c@zeilen=-\d@tmp\advance\c@zeilen by-1% \c@zeilen=\the\c@zeilen% Um Aenderung nach aussen sichtbar zu machen \else\c@zeilen=0 \fi \ifnum\c@zeilen<0\hangafter=\c@zeilen\hangindent=\d@breite% \else\let\par=\old@par% \hangindent 0pt% \leftskip \d@leftskip% \if@list\parshape \@ne \@totalleftmargin \linewidth% \advance\hsize \rightmargin% \fi% \fi% } % Das \picskip-Makro % ------------------ % Mit dem \picskip-Kommando kann die Anzahl der einzurueckenden Zeilen % beeinflusst werden. Als Parameter wird die gewuenschte Anzahl von % einzurueckenden Zeilen uebergeben. Ist diese 0, wird der verbleibende % Platz neben dem Bild uebersprungen (\vspace*{\d@hoehe}) und der % Text wird unterhalb des Bildes fortgesetzt. % \def\picskip#1{% \let\par=\old@par% \par% \pagetotal\the\pagetotal% \c@tmp=#1\relax% \ifnum\c@tmp=0% Sprung ueber den verbleibenden Zwischenraum hinweg \d@tmp\baselineskip\multiply\d@tmp by\prevgraf\advance\d@tmp\parskip% \ifdim\p@getot@l<\pagetotal \advance\d@hoehe by-\d@tmp\advance\d@hoehe by1ex% \ifdim\d@hoehe>0pt\vspace*{\d@hoehe}\fi% \fi% \ifdim\p@getot@l=\pagetotal% Test auf Leerzeile \advance\d@hoehe by-\d@tmp\advance\d@hoehe by1ex% \ifdim\d@hoehe>0pt\vspace*{\d@hoehe}\fi% \fi% \else\hangafter=-\c@tmp\hangindent=\d@breite% \fi% \leftskip \d@leftskip% % Wurde \PARPIC innerhalb einer LIST-Umgebung verwendet, so wird nun % \parshape wieder gesetzt. \if@list\parshape \@ne \@totalleftmargin \linewidth% \advance\hsize \rightmargin% \fi% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Der \hpic-Befehl % ================ % Syntax: \hpic(breite,hoehe)(x-off,y-off)[Optionen][Position]{Bildinhalt} % ------------------------------------------------------------ % \hpic ermoeglicht das komfortable Positionieren von Bilder in einem % eigenen Absatz; d.h. Text neben dem Bild ist nicht moeglich. % % Vorgehensweise: % Zuerst werden Bildbreite und Bildhoehe sowie die Offsets bestimmt. % Wurden Offsets uebergeben, wird das Bild nach Vorgabe positioniert, % ansonsten nach Paramter #6. Anschliessend werden die Umrahmungs- % parameter ausgewertet. Zuletzt wird das Bild in eine \parbox % positioniert. % % Es wird getestet, ob Bildbreite und Bildhoehe explizit angegeben wurden \def\hpic{% \@ifnextchar ({\ihpic}{\ihpic(0pt,0pt)} } % Es wird getestet, ob Offsets angegeben wurden \def\ihpic(#1,#2){% \@ifnextchar ({\@offsettrue\iihpic(#1,#2)}% {\@offsetfalse\iihpic(#1,#2)(0pt,0pt)} } % Es wird getestet, ob Umrahmungsoptionen angegeben wurden. Wenn nicht, % wird ein [l] (d.h. Bild auf die linke Seite) als Default uebergeben. \def\iihpic(#1,#2)(#3,#4){% \@ifnextchar [{\iiihpic(#1,#2)(#3,#4)}{\iiihpic(#1,#2)(#3,#4)[l]} } % Es wird getestet, ob Positionsparameter angegeben wurden \def\iiihpic(#1,#2)(#3,#4)[#5]{% \@ifnextchar [{\ivhpic(#1,#2)(#3,#4)[#5]}{\ivhpic(#1,#2)(#3,#4)[#5][]} } \def\ivhpic(#1,#2)(#3,#4)[#5][#6]#7{% \setbox\@BILD=\hbox{#7}% \d@breite=#1\d@breite=\the\d@breite% \ifdim\d@breite=0pt\d@breite=\wd\@BILD\fi% \c@breite=\d@breite\divide\c@breite by65536% \d@hoehe=#2\d@hoehe=\the\d@hoehe% \ifdim\d@hoehe=0pt\d@hoehe=\ht\@BILD\advance\d@hoehe by\dp\@BILD\fi% \c@hoehe=\d@hoehe\divide\c@hoehe by65536% \d@xoff=#3\c@xoff=\d@xoff\divide\c@xoff by65536% \d@yoff=\d@hoehe% \advance\d@yoff by-#4\c@yoff=\d@yoff\divide\c@yoff by65536% \c@pos=0\d@tmpa=\parindent\parindent=0pt\unitlength1pt% \if@offset \setbox\@BILD=\hbox{% \begin{picture}(\c@breite,\c@hoehe)% \put(0,0){\makebox(\c@breite,\c@hoehe){}}% \put(\c@xoff,\c@yoff){\box\@BILD}% \end{picture}% }% \else% Bild wird nach Parameter #6 positioniert \setbox\@BILD=\hbox{% \begin{picture}(\c@breite,\c@hoehe)% \put(0,0){\makebox(\c@breite,\c@hoehe)[#6]{\box\@BILD}}% \end{picture}% }% \fi% \@tfor\@tempa := #5\do{% \if\@tempa f\setbox\@BILD=\hbox{\Rahmen(\c@breite,\c@hoehe){\box\@BILD}}\fi% \if\@tempa s\setbox\@BILD=\hbox{\Schatten(\c@breite,\c@hoehe){\box\@BILD}}\fi% \if\@tempa o\setbox\@BILD=\hbox{\Oval(\c@breite,\c@hoehe){\box\@BILD}}\fi% \if\@tempa d\setbox\@BILD=\hbox{\Strich(\c@breite,\c@hoehe){\box\@BILD}}\fi% \if\@tempa x\setbox\@BILD=\hbox{\Kasten(\c@breite,\c@hoehe){\box\@BILD}}\fi% \if\@tempa t\c@pos=1\fi% \if\@tempa b\c@pos=2\fi% }% \ifnum\c@pos=0\parbox{\d@breite}{\makebox[0cm]{}\\\box\@BILD\smallskip}\fi% \ifnum\c@pos=1\parbox[t]{\d@breite}{\makebox[0cm]{}\\\box\@BILD\smallskip}\fi% \ifnum\c@pos=2\parbox[b]{\d@breite}{\makebox[0cm]{}\\\box\@BILD\smallskip}\fi% \parindent=\d@tmpa% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % =============== % Die Hilfsmakros % =============== % Die nun folgenden Makros sind nicht fuer die Verwendung % in einem Dokument geeignet. Sie dienen den oben definierten % 'Hauptmakros' zur Unterstuetzung. % Das \Rahmen-Makro % ----------------- % Mit diesem Makro wird mittels der \picture-Umgebung ein Rahmen um das % Bild gezeichnet ==> \framebox % Parameter: % #1,#2: Breite und Hoehe in Punkten % #3 : Bildinhalt % Die Breite und Hoehe des Bildes werden zuletzt um zweimal Liniendicke % erhoeht. \def\Rahmen(#1,#2)#3{% \c@whole=\@wholewidth\divide\c@whole by65536% \c@half=\@halfwidth\divide\c@half by65536% \c@tmpa=#1\advance\c@tmpa by\c@whole\advance\c@tmpa by\c@whole% \c@tmpb=#2\advance\c@tmpb by\c@whole\advance\c@tmpb by\c@whole% \begin{picture}(\c@tmpa,\c@tmpb)% \put(\c@whole,\c@half){\framebox(#1,#2){#3}}% \end{picture}% \global\advance\d@breite by2\@wholewidth% \global\advance\d@hoehe by2\@wholewidth% } % Das \Schatten-Makro % ----------------- % Mit diesem Makro wird mittels der \picture-Umgebung ein Rahmen und ein % Schatten um das Bild gezeichnet ==> \framebox + 2 \rule % Parameter: % #1,#2: Breite und Hoehe in Punkten % #3 : Bildinhalt % Die Breite und Hoehe des Bildes werden zuletzt um zweimal Liniendicke % und einmal Schattendicke erhoeht. \def\Schatten(#1,#2)#3{% \c@whole=\@wholewidth\divide\c@whole by65536% \c@half=\@halfwidth\divide\c@half by65536% \c@shad=\d@shad\divide\c@shad by65536% \c@tmp=\c@whole\advance\c@tmp by\c@whole\c@tmpd=\c@tmp% \advance\c@tmp by\c@shad% \advance\c@tmpd by#1% \advance\c@half by\c@shad% \c@tmpa=#1\advance\c@tmpa by\c@tmp% \c@tmpb=#2\advance\c@tmpb by\c@tmp% \begin{picture}(\c@tmpa,\c@tmpb)% \put(\c@whole,\c@half){\framebox(#1,#2){#3}}% \put(\c@shad,0){\rule{\c@tmpd pt}{\c@shad pt}}% \put(\c@tmpd,0){\rule{\c@shad pt}{#2 pt}}% \end{picture}% \global\advance\d@breite by2\@wholewidth\global\advance\d@breite by\d@shad% \global\advance\d@hoehe by2\@wholewidth\global\advance\d@hoehe by\d@shad% } % Das \Oval-Makro % ----------------- % Mit diesem Makro wird mittels der \picture-Umgebung ein runder Rahmen um das % Bild gezeichnet ==> \oval % Parameter: % #1,#2: Breite und Hoehe in Punkten % #3 : Bildinhalt \def\Oval(#1,#2)#3{% \@wholewidth=0.4pt% \c@tmpa=\the#1\divide\c@tmpa by2% \c@tmpb=\the#2\divide\c@tmpb by2% \begin{picture}(#1,#2)% \put(\c@tmpa,\c@tmpb){\oval(#1,#2)}% \put(0.4,0.4){#3}% \end{picture}% \global\advance\d@breite by1pt\global\advance\d@hoehe by1pt% } % Das \Strich-Makro % ----------------- % Mit diesem Makro wird mittels der \picture-Umgebung ein gestrichelter Rahmen % um das Bild gezeichnet ==> \dashbox % Parameter: % #1,#2: Breite und Hoehe in Punkten % #3 : Bildinhalt % Die Breite und Hoehe des Bildes werden zuletzt um zweimal Liniendicke % erhoeht. \def\Strich(#1,#2)#3{% \c@whole=\@wholewidth\divide\c@whole by65536% \c@half=\@halfwidth\divide\c@half by65536% \c@dash=\d@dash\divide\c@dash by65536% \c@tmp=\c@whole\advance\c@tmp by\c@whole% c@tmp = 2*c@whole \c@tmpa=#1\advance\c@tmpa by\c@tmp% \c@tmpb=#2\advance\c@tmpb by\c@tmp% \c@tmpc=#1\advance\c@tmpc by\c@whole% \c@tmpd=#2\advance\c@tmpd by\c@whole% \begin{picture}(\c@tmpa,\c@tmpb)% \put(\c@half,\c@half){\dashbox{\c@dash}(\c@tmpc,\c@tmpd){#3}}% \end{picture}% \global\advance\d@breite by2\@wholewidth% \global\advance\d@hoehe by2\@wholewidth% } % Das \Kasten-Makro % ----------------- % Mit diesem Makro wird mittels der \picture-Umgebung ein 3D-Kasten % um das Bild gezeichnet ==> \dashbox % Parameter: % #1,#2: Breite und Hoehe in Punkten % #3 : Bildinhalt % Die Breite und Hoehe des Bildes werden zuletzt um die Kastentiefe % erhoeht. \def\Kasten(#1,#2)#3{% \@wholewidth=0.4pt% \c@boxl=\d@boxl\divide\c@boxl by65536\c@boxl=\the\c@boxl% \c@tmpa=#1\advance\c@tmpa by\c@boxl% \c@tmpb=#2\advance\c@tmpb by\c@boxl% \c@tmp=#2% \begin{picture}(\c@tmpa,\c@tmpb)% \put(0,\c@boxl){\framebox(#1,#2){#3}}% \put(\c@boxl,0){\line(-1,1){\c@boxl}}% \put(\c@boxl,0){\line(1,0){#1}\line(-1,1){\c@boxl}}% \put(\c@boxl,0){\put(#1,0){\line(0,1){\c@tmp}% \put(0,\c@tmp){\line(-1,1){\c@boxl}}}}% \end{picture}% \global\advance\d@breite by\d@boxl% \global\advance\d@hoehe by\d@boxl% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newbox\env@box% \newdimen\d@envdp \newcount\c@hsize \newcount\c@envdp \newdimen\d@envb % Die Umgebung FRAMEENV % ===================== % Syntax: \begin{frameenv}[Breite] ... \end{frameenv} % Diese Umgebung umrahmt ihren Inhalt % % Vorgehensweise: % Die Textbreite (\textwidth) wird etwas verkleinert und der Umgebungs- % inhalt in eine \vbox eingeschlossen. Dadurch erfolgt der Zeilenumbruch % automatisch. Anschliessend wird die \vbox innerhalb einer % 'picture'-Umgebung in eine \framebox positioniert. % % Zuerst wird die optionale 'Breite' abgefragt \long\def\frameenv{\@ifnextchar [{\@frameenv}{\@frameenv[\textwidth]}} \long\def\@frameenv[#1]{% % \textwidth wird gerettet und anschliessend mit der 'Breite' initialisiert \hsiz@=\textwidth \textwidth=#1 \d@envb=#1 % Damit der Text (der Inhalt) nicht bis an die Umrahmung heranreicht, wird % die \textwidth etwas verkleinert \advance\textwidth by-2\@wholewidth % \fboxsep (LaTeX-Befehl) enthaelt den Abstand zwischen Text und Umrahmung \advance\textwidth by-2\fboxsep \hsize=\textwidth \linewidth=\textwidth % Nun wird eine \vbox geoffnet, in die der Text geschrieben wird. \setbox\env@box=\vbox\bgroup}% % \def\endframeenv{% \egroup% Die Box wird geschlossen und alle Werte wieder zurueckgesetzen \hsize=\hsiz@ \textwidth=\hsiz@ \linewidth=\hsiz@ \c@breite=\d@envb \divide\c@breite by65536 \advance\d@envb by-2\@wholewidth \c@hsize=\d@envb \divide\c@hsize by65536% Breite der Box in Punkten \d@envdp=\dp\env@box \advance\d@envdp by\ht\env@box% \advance\d@envdp by2\fboxsep% \d@hoehe=\d@envdp \advance\d@hoehe by2\@wholewidth % Fuer die \picture-Umgebung werden alle Dimesionen in Punkte umgerechnet \c@hoehe=\d@hoehe \divide\c@hoehe by65536 \c@envdp=\d@envdp \divide\c@envdp by65536% \c@tmp=\@wholewidth \divide\c@tmp by65536 \vskip\@wholewidth% Etwas vertikaler Abstand zum vorhergehenden Text \unitlength 1pt\noindent% \begin{picture}(\c@breite,\c@hoehe)(0,0) \put(\c@tmp,\c@tmp){\framebox(\c@hsize,\c@envdp){\box\env@box}} \end{picture}% } % Die Umgebung SHADOWENV % ====================== % Syntax: \begin{shadowenv}[Breite] ... \end{shadowenv} % Diese Umgebung umrahmt und schattiert ihren Inhalt % % Vorgehensweise: % Die Textbreite (\textwidth) wird etwas verkleinert und der Umgebungs- % inhalt in eine \vbox eingeschlossen. Dadurch erfolgt der Zeilenumbruch % automatisch. Anschliessend wird die \vbox innerhalb einer % 'picture'-Umgebung in eine \framebox positioniert und der Schatten % angehaengt. % % Zuerst wird die optionale 'Breite' abgefragt \long\def\shadowenv{\@ifnextchar [{\@shadowenv}{\@shadowenv[\textwidth]}} \long\def\@shadowenv[#1]{% % \textwidth wird gerettet und anschliessend mit der 'Breite' initialisiert \hsiz@=\textwidth \textwidth=#1 \d@envb=#1 % Damit der Text (der Inhalt) nicht bis an die Umrahmung heranreicht, wird % die \textwidth etwas verkleinert \advance\textwidth by-2\@wholewidth % \fboxsep (LaTeX-Befehl) enthaelt den Abstand zwischen Text und Umrahmung \advance\textwidth by-2\fboxsep \advance\textwidth by-\d@shad% Korrektur um die Schattendicke \hsize=\textwidth \linewidth=\textwidth % Nun wird eine \vbox geoffnet, in die der Text geschrieben wird. \setbox\env@box=\vbox\bgroup}% % \def\endshadowenv{% \egroup \hsize=\hsiz@ \textwidth=\hsiz@ \linewidth=\hsiz@ \d@tmpa=\d@envb \c@breite=\d@envb \divide\c@breite by65536 \advance\d@envb by-2\@wholewidth \advance\d@envb by-\d@shad \c@hsize=\d@envb \divide\c@hsize by65536% \d@envdp=\dp\env@box \advance\d@envdp by\ht\env@box% \advance\d@envdp by2\fboxsep% \c@envdp=\d@envdp \divide\c@envdp by65536% \d@hoehe=\d@envdp % Umgebungshoehe := Texthoehe + 2*Strichdicke + Schattendicke \advance\d@hoehe by2\@wholewidth \advance\d@hoehe by\d@shad % Umrechnen der Dimensionen in Counts fuer die \picture-Umgebung \c@hoehe=\d@hoehe \divide\c@hoehe by65536 \c@shad =\d@shad \divide\c@shad by65536 \c@tmp=\@wholewidth \divide\c@tmp by65536 \advance\d@tmpa by-2\d@shad \c@xoff =\d@tmpa \divide\c@xoff by65536 \advance\c@xoff by\c@shad \advance\c@xoff by-1 \advance\d@envdp by\@wholewidth \vskip\@halfwidth \unitlength 1pt\noindent% \begin{picture}(\c@breite,\c@hoehe)(0,0) \put(\c@tmp,\c@shad){\framebox(\c@hsize,\c@envdp){\box\env@box}} \put(\c@shad,0){\rule{\d@tmpa}{\d@shad}}% Horizontaler Schatten \put(\c@xoff,0){\rule{\d@shad}{\d@envdp}}% Vertikaler Schatten \end{picture}% \vskip\@halfwidth } % Die Umgebung DASHENV % ====================== % Syntax: \begin{dashenv}[Breite] ... \end{dashenv} % Diese Umgebung umrahmt ihren Inhalt gestrichelt. % % Vorgehensweise: % Die Textbreite (\textwidth) wird etwas verkleinert und der Umgebungs- % inhalt in eine \vbox eingeschlossen. Dadurch erfolgt der Zeilenumbruch % automatisch. Anschliessend wird die \vbox innerhalb einer % 'picture'-Umgebung in einer \dashbox positioniert % % Zuerst wird die optionale 'Breite' abgefragt \long\def\dashenv{\@ifnextchar [{\@dashenv}{\@dashenv[\textwidth]}} \long\def\@dashenv[#1]{% \hsiz@=\textwidth \textwidth=#1 \d@envb=#1 \advance\textwidth by-2\@wholewidth \advance\textwidth by-2\fboxsep \hsize=\textwidth \linewidth=\textwidth \setbox\env@box=\vbox\bgroup}% % \long\def\enddashenv{% \egroup \hsize=\hsiz@ \textwidth=\hsiz@ \linewidth=\hsiz@ \c@breite=\d@envb \divide\c@breite by65536 \advance\d@envb by-\@wholewidth \c@hsize=\d@envb \divide\c@hsize by65536% \d@envdp=\dp\env@box \advance\d@envdp by\ht\env@box% \advance\d@envdp by2\fboxsep% \advance\d@envdp by\@wholewidth \d@hoehe=\d@envdp \advance\d@hoehe by2\@wholewidth \c@hoehe=\d@hoehe \divide\c@hoehe by65536 \c@envdp=\d@envdp \divide\c@envdp by65536% Hoehe der Box in Punkten \c@dash=\d@dash \divide\c@dash by65536% Strichlaenge in Punkten \c@whole=\@wholewidth \divide\c@whole by65536 \c@half=\@halfwidth \divide\c@half by 65536 \noindent\unitlength 1pt \begin{picture}(\c@breite,\c@hoehe)(0,0) \put(\c@half,\c@whole){\dashbox{\c@dash}(\c@hsize,\c@envdp){\box\env@box}} \end{picture}% } % Die Umgebung OVALENV % ====================== % Syntax: \begin{ovalenv}[Breite] ... \end{ovalenv} % Diese Umgebung umrahmt ihren Inhalt mit abgerundeten Ecken. % % Vorgehensweise: % Die Textbreite (\textwidth) wird etwas verkleinert und der Umgebungs- % inhalt in eine \vbox eingeschlossen. Dadurch erfolgt der Zeilenumbruch % automatisch. Anschliessend wird die \vbox innerhalb einer % 'picture'-Umgebung in einem \oval positioniert. % % % Zuerst wird die optionale 'Breite' abgefragt \long\def\ovalenv{\@ifnextchar [{\@ovalenv}{\@ovalenv[\textwidth]}}% \long\def\@ovalenv[#1]{% \hsiz@=\textwidth \textwidth=#1 \d@envb=#1 % \fboxsep (LaTeX-Befehl) enthaelt den Abstand zwischen Text und Umrahmung \advance\textwidth by-4\fboxsep \hsize=\textwidth \linewidth=\textwidth \setbox\env@box=\vbox\bgroup}% % \long\def\endovalenv{% \egroup \hsize=\hsiz@ \textwidth=\hsiz@ \linewidth=\hsiz@ \@wholewidth=0.4pt \c@breite=\d@envb \divide\c@breite by65536 \advance\d@envb by-2\@wholewidth \c@hsize=\d@envb \divide\c@hsize by65536% Breite des Ovals in Punkten \d@envdp=\dp\env@box \advance\d@envdp by\ht\env@box% \advance\d@envdp by4\fboxsep% \c@envdp=\d@envdp \divide\c@envdp by65536% \d@hoehe=\d@envdp \advance\d@hoehe by2\@wholewidth \c@hoehe=\d@hoehe \divide\c@hoehe by65536 \c@tmpa=\c@hsize \divide\c@tmpa by2% Der Mittelpunkt des Ovals ist die \c@tmpb=\c@envdp \divide\c@tmpb by2% Breite/Hoehe geteilt durch 2 \d@tmpa=2\fboxsep \advance\d@tmpa by\@wholewidth \c@xoff=\d@tmpa \divide\c@xoff by65536% \advance\d@tmpa by\dp\env@box \c@yoff=\d@tmpa \divide\c@yoff by65536% \unitlength 1pt\noindent \begin{picture}(\c@breite,\c@hoehe)(0,0) \put(\c@tmpa,\c@tmpb){\oval(\c@hsize,\c@envdp)} \put(\c@xoff,\c@yoff){\box\env@box}% \end{picture}% }