summaryrefslogtreecommitdiff
path: root/macros/latex209/contrib/picins/picins.doc
blob: 179c51960970db7c178affb11d59b4b4887ca5b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%	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}%
}