picinpar.sty 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. % This is picinpar.sty
  2. % Macros for making windows with LaTeX
  3. %
  4. % By Friedhelm Sowa, Heinrich-Heine-University D\"usseldorf,
  5. % Computing Center
  6. % In case of emergency try to get the email adress
  7. % after having checked the input :-)
  8. % Okay, for those who are too lazy:
  9. % tex@ze8.rz.uni-duesseldorf.de
  10. % sowa@convex.rz.uni-duesseldorf.de
  11. %
  12. % Incorporated are basic ideas of Alan Hoenig (Thanks Alan!)
  13. % Thanks to Phil Taylor, who gave some useful hints during his
  14. % tutorial at the EURO TeX 92 in Prague.
  15. %
  16. % Also thanks to Ulrik Vieth, who incorporated the macros for
  17. % generating captions within the windows.
  18. %
  19. %----------------
  20. % Known problems:
  21. %
  22. % - Don't use \samepage
  23. % - Use \footnotemark within and \footnotetext outside the
  24. % window-environment instead of \footnote
  25. % - When using the epic-package load picinpar before epic
  26. % like \documentstyle[...,picinpar,epic]{...}
  27. %----------------
  28. %
  29. % Here we go
  30. %
  31. % Counts
  32. \newcount\br \newcount\bl
  33. \newcount\na \newcount\nb \newcount\tcdsav
  34. \newcount\tcl \newcount\tcd \newcount\tcn
  35. \newcount\cumtcl \newcount\cumpartcl
  36. % Dimens
  37. \newdimen\lftside \newdimen\rtside
  38. \newdimen\hpic \newdimen\vpic
  39. \newdimen\strutilg \newdimen\picwd
  40. \newdimen\topheight \newdimen\ilg
  41. \newdimen\lpic \newdimen\cumpar
  42. % Tokens
  43. \newtoks\twa \newtoks\la \newtoks\ra
  44. \newtoks\ha \newtoks\pictoc
  45. % Boxes
  46. \newbox\rawtext \newbox\holder
  47. \newbox\windowbox \newbox\wartext
  48. \newbox\finaltext \newbox\aslice \newbox\bslice
  49. \newbox\wbox \newbox\wstrutbox \newbox\picbox
  50. \newbox\waslice \newbox\wbslice \newbox\fslice
  51. % Another strut
  52. \def\wstrut{\relax\ifmmode\copy\wstrutbox\else\unhcopy\wstrutbox\fi}
  53. %
  54. \long\def\window[#1,#2,#3,#4] {%
  55. % #1 is an integer---no. of lines down from par top
  56. % #2 is l, r or c what means left, right or centered
  57. % default is, that the picture is printed at the left side
  58. % #3 is the material for setting a graphic box
  59. % #4 is the explanation for the graphic
  60. \vskip\parskip
  61. \global\cumpar=0pt
  62. \global\cumpartcl=0
  63. \global\cumtcl=0
  64. \tcd=#1
  65. \lftside=0pt \rtside=0pt
  66. % \hpic=\linewidth
  67. \twa={} \la={} \ra={} \ha={}
  68. \setbox\wbox=\hbox{(}
  69. \computeilg
  70. \pictoc={#3}
  71. \setbox\windowbox=\vbox{\hbox{#3}}
  72. \setbox\wbox=\vbox{\hbox{\noindent#4}}
  73. \picwd=\wd\windowbox
  74. \hpic=\picwd
  75. \vpic=\ht\windowbox\advance\vpic\dp\windowbox
  76. \if #2c\lftside=\linewidth\advance\lftside-\picwd\rtside=0.5\lftside
  77. \lftside=\rtside
  78. \else \if #2r\lftside=\linewidth\advance\lftside-\picwd
  79. \rtside=0pt
  80. \else\rtside=\linewidth\advance\rtside-\picwd
  81. \lftside=0pt
  82. \fi
  83. \fi
  84. %
  85. % In case of a centered picture, that does not allow text beside
  86. % we have to add some glue between preceding text, window and
  87. % following text.
  88. %
  89. \if #2c
  90. \ifdim\rtside<72pt
  91. \rtside=0pt\lftside=0pt
  92. \setbox\windowbox=\vbox{%
  93. \hrule width\picwd height0pt depth0pt
  94. \vskip.5\parskip\box\windowbox\vskip.5\parskip
  95. \hrule width\picwd height0pt depth0pt}
  96. \vpic=\ht\windowbox\advance\vpic\dp\windowbox
  97. \fi
  98. \parskip0pt % Within the window area a \parskip>0pt may look ugly
  99. \fi
  100. \ifnum\picwd=0\setbox\picbox=\vbox{\hbox{\noindent#4}} % without picture
  101. \hpic=\wd\picbox % calculate dimensions
  102. \ifnum\lftside=0\rtside=\linewidth\advance\rtside-\hpic
  103. \else\ifnum\rtside=0\lftside=\linewidth\advance\lftside-\hpic
  104. \else\rtside=0.5\linewidth\advance\rtside-0.5\hpic
  105. \lftside=\rtside
  106. \fi\fi
  107. \else\setbox\picbox=\vbox{\hsize=\hpic\vbox to\vpic{\box\windowbox\vfill}%
  108. \ifdim\ht\wbox>0pt\vskip\ilg\vbox{\hsize=\hpic\noindent#4
  109. %
  110. % See above, this is the second part of glue
  111. %
  112. \if #2c
  113. \ifdim\rtside=0pt \ifdim\lftside=0pt
  114. \vskip\parskip\hrule width\hpic height0pt depth0pt
  115. \fi \fi
  116. \fi
  117. }
  118. \fi}\fi
  119. \vpic=\ht\picbox\advance\vpic\dp\picbox
  120. \ifdim\lftside>0pt\advance\lftside-0.5\baselineskip\fi % put in a distance
  121. \ifdim\rtside>0pt\advance\rtside-0.5\baselineskip\fi % between text and
  122. % window
  123. \global\br=\rtside \global\bl=\lftside
  124. \ifnum\picwd=0
  125. \ifdim\vpic>0pt\picwd=\hpic
  126. \else\vpic=\ht\picbox\advance\vpic\dp\picbox
  127. \fi
  128. \fi
  129. \global\tcl=0 \lpic=0pt
  130. \loop\global\advance\tcl by 1 \lpic=\tcl\baselineskip
  131. \ifdim\lpic<\vpic\repeat
  132. \vpic=\lpic
  133. \global\cumtcl=\tcl
  134. %
  135. % Here we know exactly the number of indented lines and
  136. % are able to generate the tokens for the \parshape list
  137. %
  138. \ifnum\bl>0\la={ 0pt \lftside}\fi
  139. \ifnum\br>0\ra={ 0pt \rtside}\fi
  140. \ifnum\tcd>0\ha={ 0pt \linewidth}\fi
  141. \ifnum\tcl<1\global\tcl=1\fi
  142. \createparshapespec
  143. \tcd=#1 % restore the lintel
  144. \global\tcdsav=#1
  145. %
  146. % This is a very tricky part of the package. Some day there
  147. % will exist a detailed documentation.
  148. %
  149. \ifdim\parskip>0pt
  150. \def\par{\hfill\vadjust{\vskip0pt\vbox to\parskip{\vss}}
  151. \global\advance\cumpartcl by 1
  152. \global\advance\cumpar by \parskip
  153. \global\lpic=\ht\wstrutbox
  154. \global\advance\lpic by \dp\wstrutbox
  155. \ifdim\cumpar<\lpic
  156. \else\advance\cumpar by -\lpic
  157. \advance\cumtcl by -1
  158. \fi
  159. \egroup\global\tcd=\tcdsav
  160. \setbox\wartext=\vbox{\unvbox\rawtext}
  161. \setbox\rawtext=\vbox\bgroup
  162. \clubpenalty=0\widowpenalty=0
  163. \tolerance=1000
  164. \global\lpic=\ht\wstrutbox
  165. \global\advance\lpic by \dp\wstrutbox
  166. %
  167. % Pick up header lines
  168. %
  169. \ifnum\tcd>0\vbadness=10000\splittopskip0pt
  170. \loop\setbox\holder=\vsplit\wartext to \lpic
  171. \hpic=\wd\holder\prune\holder\hpic
  172. \ifdim\ht\holder=\parskip
  173. \hbox{\vrule height\parskip width0pt depth0pt}
  174. \typeout{A paragraph ended within headlines! Please change }
  175. \typeout{the number of headlines for the window environment!}
  176. \global\advance\tcd by -1
  177. \else\hbox{\vbox{\box\holder\unskip}}
  178. \global\advance\tcd by -1
  179. \fi
  180. \ifnum\tcd>0\repeat
  181. \global\tcd=0
  182. \ifdim\ht\wartext>0pt
  183. \ifdim\ht\wartext=\parskip\global\advance\tcdsav by 1
  184. \setbox\holder=\vsplit\wartext to \lpic
  185. \hbox{\vrule height\parskip width0pt depth0pt}
  186. \global\advance\cumpar by -\parskip
  187. \global\advance\cumpartcl by -1
  188. \fi\fi
  189. \fi
  190. %
  191. % Pick up lines beside window, the rest too
  192. %
  193. \global\tcn=0
  194. \topheight=0pt
  195. \ifdim\ht\wartext>0pt\vbadness=10000\splittopskip0pt
  196. \loop\setbox\holder=\vsplit\wartext to \lpic
  197. \hpic=\wd\holder\prune\holder\hpic
  198. \ifdim\ht\holder=\parskip
  199. \hbox{\vrule height\parskip width0pt depth0pt}
  200. \global\advance\topheight by \parskip
  201. \else
  202. \setbox\fslice=\hbox{\box\holder}
  203. \hpic=\ht\fslice
  204. \advance\hpic by\dp\fslice
  205. \ifdim\hpic>\lpic
  206. \global\advance\topheight by\hpic
  207. \hbox{\vbox{\box\fslice\vss}}
  208. \else\ifdim\hpic=0pt\relax
  209. \else\global\advance\topheight by \lpic
  210. \hbox{\vbox{\box\fslice}}\fi\fi
  211. \fi
  212. \ifdim\ht\wartext>0pt\repeat
  213. \tcn=0
  214. \loop\advance\tcn by 1
  215. \advance\topheight by -\lpic
  216. \ifdim\topheight>0pt\repeat
  217. \hpic=\topheight
  218. \ifdim\hpic<0pt\advance\tcn by -1\fi
  219. \global\topheight=\tcn\lpic
  220. \fi
  221. %
  222. % If the indented part is not completed we have to generate a
  223. % new token for the \parshape list
  224. %
  225. \ifnum\tcn<\cumtcl
  226. \global\tcl=\cumtcl
  227. \global\advance\topheight by\cumpartcl\parskip
  228. \global\advance\tcl by -\tcn \global\twa={}
  229. \ifnum\tcl>0
  230. \global\vpic=\topheight
  231. \global\topheight=\tcl\lpic
  232. \global\advance\vpic by \topheight
  233. \global\advance\vpic by \lpic
  234. \createparshapespec
  235. \parshape=\tcn \the\twa
  236. \else\parshape=0
  237. \fi
  238. \else\parshape=0\fi}
  239. \else\def\par{\\}
  240. \fi % new definition of \par in case of \parskip>0 ends here
  241. %
  242. % This is where we start to pick up the paragraph(s)
  243. %
  244. \setbox\rawtext=\vbox\bgroup\unvbox\rawtext\unskip
  245. \clubpenalty=0\widowpenalty=0
  246. \tolerance=1000
  247. \parshape=\tcn \the\twa }
  248. %
  249. \def\endwindow{%
  250. \global\tcd=\tcdsav
  251. \egroup\vskip\parskip\parshape=0 % reset parshape; end \box\rawtext
  252. \vbadness=10000
  253. \splittopskip=0pt
  254. %
  255. % Typeset the lines above the window
  256. %
  257. \ifnum\tcd>0\setbox\holder=\vsplit\rawtext to \tcd\baselineskip
  258. \tcn=\tcd
  259. \loop\advance\tcn -1
  260. \setbox\fslice=\vsplit\holder to\baselineskip
  261. \prune\fslice\linewidth
  262. \topheight=0pt
  263. \ifnum\dp\fslice>\dp\wstrutbox
  264. \advance\topheight-\dp\fslice
  265. \advance\topheight\dp\wstrutbox
  266. \advance\topheight\ilg\fi
  267. \hbox to\linewidth{\box\fslice}
  268. \vskip-\topheight
  269. \ifdim\ht\holder>0pt\repeat
  270. \fi
  271. %
  272. % Now we build the boxes beside the window
  273. %
  274. \global\topheight=\tcl\baselineskip
  275. \ifnum\cumpartcl>0\global\tcl=\cumtcl
  276. \global\topheight=\vpic
  277. \fi
  278. \ifnum\bl>0\ifnum\br>0\multiply\topheight by 2\fi\fi
  279. \ifnum\bl>0\setbox\holder=\vsplit\rawtext to\topheight
  280. \else\ifnum\br>0\setbox\holder=\vsplit\rawtext to\topheight\fi\fi
  281. \tcn=\tcl \na=0 \nb=0
  282. \ifnum\bl>0\ifnum\br>0\multiply\tcn by 2\fi\fi
  283. \ifnum\bl>0\na=\tcn\ifnum\br>0\divide\na by 2\fi\fi
  284. \ifnum\br>0\nb=\tcn\ifnum\bl>0\divide\nb by 2\fi\fi
  285. \ifnum\na=0\ifnum\nb=0
  286. \setbox\waslice=\vbox to\vpic{\vss}
  287. \setbox\wbslice=\vbox to\vpic{\vss}
  288. \bl=1\br=1
  289. \vskip\ilg
  290. \fi\fi
  291. %
  292. % both sides
  293. %
  294. \ifnum\na>0 \ifnum\nb>0
  295. \loop\advance\nb -1
  296. \advance\na -1
  297. \setbox\aslice=\vsplit\holder to\baselineskip
  298. \prune\aslice\lftside
  299. \setbox\waslice=\vbox{\unvbox\waslice\hbox
  300. to\lftside{\box\aslice\hfil}}
  301. \setbox\bslice=\vsplit\holder to\baselineskip
  302. \prune\bslice\rtside
  303. \setbox\wbslice=\vbox{\unvbox\wbslice\hbox
  304. to\rtside{\box\bslice\hfil}}
  305. \ifnum\nb>0\repeat
  306. \fi\fi
  307. %
  308. % only text on the left side
  309. %
  310. \ifnum\na>0
  311. \loop\advance\na -1
  312. \setbox\aslice=\vsplit\holder to\baselineskip
  313. \prune\aslice\lftside
  314. \setbox\waslice=\vbox{\unvbox\waslice\hbox
  315. to\lftside{\box\aslice\hfil}}
  316. \ifdim\ht\holder>0pt\repeat
  317. \fi
  318. %
  319. % only text on the right side
  320. %
  321. \ifnum\nb>0
  322. \loop\advance\nb -1
  323. \setbox\bslice=\vsplit\holder to\baselineskip
  324. \prune\bslice\rtside
  325. \setbox\wbslice=\vbox{\unvbox\wbslice\hbox
  326. to\rtside{\box\bslice\hfil}}
  327. \ifdim\ht\holder>0pt\repeat
  328. \fi
  329. %
  330. % fixing the dimensions of the window part
  331. %
  332. \ifnum\bl=0\topheight=\ht\wbslice
  333. \else\ifnum\br=0\topheight=\ht\waslice
  334. \else\ifdim\ht\waslice>\ht\wbslice\topheight=\ht\waslice
  335. \else\topheight=\ht\wbslice\fi\fi\fi
  336. %
  337. % ship out the window material to the main vertical list
  338. %
  339. \setbox\windowbox=\vbox{\hbox to\linewidth{%
  340. \ifnum\bl>0\box\waslice\hfill\fi%
  341. \vbox to\topheight{\hrule width\picwd height0pt depth0pt\vskip0pt%
  342. \vfill\unvbox\picbox%
  343. \ifnum\picwd>0\vfill\fi%
  344. \vss}\ifnum\br>0\hfill\box\wbslice\fi}}%
  345. \unvbox\windowbox%
  346. \loop
  347. \setbox\bslice=\vsplit\rawtext to\baselineskip
  348. \prune\bslice\linewidth
  349. \setbox\wbslice=\vbox{\hbox to\linewidth{\box\bslice\hfil}}
  350. \unvbox\wbslice
  351. \ifdim\ht\rawtext>0pt
  352. \repeat
  353. }% FINITO
  354. %
  355. % What else do we need?
  356. %
  357. \def\prune#1#2{
  358. % take a \vbox containing a single \hbox,
  359. % \unvbox it, and cancel the \lastskip
  360. % put in a \hbox of width #2
  361. \unvbox#1 \setbox#1=\lastbox % \box#1 now is an \hbox
  362. \ifdim\ht#1=\parskip
  363. \setbox#1=\hbox to#2{\vrule height\parskip depth0pt width0pt\hfill}
  364. \else\ifdim\ht#1=0pt\relax
  365. \else\setbox#1=\hbox to#2{\wstrut\unhbox#1\unskip}\fi\fi}
  366. %
  367. % Here the token \twa is generated.
  368. % It's not so difficult as it looks like.
  369. %
  370. \def\createparshapespec{%
  371. \global\tcn=0
  372. \ifnum\bl>0\global\tcn=\tcl\else\ifnum\br>0\global\tcn=\tcl\fi\fi
  373. \na=0 \nb=0
  374. \ifnum\bl>0\ifnum\br>0\multiply\tcn by 2\fi\fi
  375. \ifnum\bl>0\na=\tcn\ifnum\br>0\divide\na by 2\fi\fi
  376. \ifnum\br>0\nb=\tcn\ifnum\bl>0\divide\nb by 2\fi\fi
  377. \global\advance\tcn by\tcd \global\advance\tcn by1
  378. \ifnum\tcd>0
  379. \loop\twa=\expandafter{\the\twa\the\ha}\advance\tcd -1
  380. \ifnum\tcd>0\repeat
  381. \fi
  382. \ifnum\bl>0 \ifnum\br>0
  383. \loop\twa=\expandafter{\the\twa\the\la}\advance\na -1
  384. \twa=\expandafter{\the\twa\the\ra}\advance\nb -1
  385. \ifnum\na>0\repeat
  386. \fi\fi
  387. \ifnum\na>0
  388. \loop\twa=\expandafter{\the\twa\the\la}\advance\na -1
  389. \ifnum\na>0\repeat
  390. \fi
  391. \ifnum\nb>0
  392. \loop\twa=\expandafter{\the\twa\the\ra}\advance\nb -1
  393. \ifnum\nb>0\repeat
  394. \fi
  395. \global\twa=\expandafter{\the\twa 0pt \the\linewidth}}
  396. %
  397. \def\computeilg{% compute the interline glue
  398. \tcl=0\ilg=0pt\strutilg=0pt
  399. \loop\setbox\wbox=\hbox{\char\tcl}
  400. \ifdim\ht\wbox>\ilg\ilg=\ht\wbox\fi
  401. \ifdim\dp\wbox>\strutilg\strutilg=\dp\wbox\fi
  402. \advance\tcl by 1
  403. \ifnum\tcl<128\repeat
  404. \ht\wbox=\ilg
  405. \dp\wbox=\strutilg
  406. \strutilg=\ht\wbox %\advance\strutilg by\ilg
  407. \ifdim\strutilg>\baselineskip
  408. \typeout{character with height greater baselineskip found in font}
  409. \typeout{baselineskip changed to 1.5 of that height!}
  410. \baselineskip=1.5\strutilg
  411. \fi
  412. \global\ilg=\baselineskip
  413. \global\advance\ilg-\ht\wbox \global\advance\ilg-\dp\wbox
  414. \strutilg=\ht\wbox \advance\strutilg by\ilg
  415. \setbox\wstrutbox=\hbox{\vrule height\strutilg depth\dp\wbox width0pt}}
  416. %
  417. % frames
  418. %
  419. \def\framepic#1{\vbox{%
  420. \hsize\expandafter\wd\csname #1box\endcsname
  421. \advance\hsize .8pt \hrule%
  422. \hbox to\hsize%
  423. {\vrule\hfill\vbox to\expandafter\ht\csname #1box\endcsname{%
  424. \expandafter\box\csname #1box\endcsname }\hfill\vrule}\hrule\vss}}
  425. %
  426. \def\wframepic#1{\vbox{%
  427. \hsize\expandafter\wd\csname #1box\endcsname
  428. \advance\hsize 3.8pt\hrule%
  429. \hbox to\hsize%
  430. {\vrule\hfill\vbox{\kern1.5pt%
  431. \expandafter\box\csname #1box\endcsname
  432. \kern1.5pt}\hfill\vrule}\hrule\vss}}
  433. %
  434. % caption
  435. %
  436. \def\winstepcounter#1{\global\advance\csname c@#1\endcsname 1
  437. {\let\@elt\@stpelt \csname cl@#1\endcsname}}
  438. \def\winrefstepcounter#1{\winstepcounter{#1}\let\@tempa\protect
  439. \def\protect{\noexpand\protect\noexpand}%
  440. \edef\@currentlabel{\csname p@#1\endcsname\csname the#1\endcsname}%
  441. \let\protect\@tempa}
  442. \long\def\w@dblarg#1{\@ifnextchar[{#1}{\w@xdblarg{#1}}}
  443. \long\def\w@xdblarg#1#2\par{#1[{#2}]#2\par}
  444. \def\wincaption{\winrefstepcounter\@captype \w@dblarg{\@wincaption\@captype}}
  445. \long\def\@wincaption#1[#2]#3\par{\par\addcontentsline{\csname
  446. ext@#1\endcsname}{#1}{\protect\numberline{\csname
  447. the#1\endcsname}{\ignorespaces #2}}\begingroup
  448. \@parboxrestore
  449. \normalsize
  450. \@makewincaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
  451. \endgroup}
  452. \long\def\@makewincaption#1#2{%
  453. \setbox\@tempboxa\hbox{\footnotesize{\bf #1:\enspace}{#2}}%
  454. \ifdim\wd\@tempboxa>\picwd
  455. {\footnotesize{\bf #1:\enspace}{#2\par}}
  456. \else
  457. \hbox to\picwd{\hfil\box\@tempboxa\hfil}
  458. \fi}
  459. \long\def\figwindow[#1,#2,#3,#4] {%
  460. \advance\c@figure -1
  461. \begin{window}[#1,#2,{#3},{\def\@captype{figure}%
  462. \wincaption#4\par}] }
  463. \long\def\tabwindow[#1,#2,#3,#4] {%
  464. \advance\c@table -1
  465. \begin{window}[#1,#2,{#3},{\def\@captype{table}%
  466. \wincaption#4\par}] }
  467. \def\endfigwindow{\end{window}}
  468. \def\endtabwindow{\end{window}}
  469. \endinput
  470. %%%
  471. \documentstyle[german,picinpar]{article}
  472. \setlength{\parskip}{.66\baselineskip}
  473. \setlength{\parindent}{0pt}
  474. \begin{document}
  475. \section*{Beispiele zu {\tt picinpar.sty}}
  476. \font\yn=cmss17 scaled \magstep5 %oder sonst was gro"ses (yinit?)
  477. \begin{verbatim}
  478. \begin{window}[0,l,{\yn V},{}]
  479. or einigen Jahren wurde von ...
  480. ... Abschnitts erfolgten automatisch.
  481. \end{window}
  482. \end{verbatim}
  483. \begin{window}[0,l,{\yn V},{}]
  484. or einigen Jahren wurde von Donald E.~Knuth im TUGboat ein kleines
  485. Problem mit der Bitte um L"osung vorgestellt. Es handelte sich darum,
  486. in einem Paragraphen ein Fenster zu erzeugen, in das man beliebigen Text
  487. oder eine Zeichnung hineinsetzen kann. Prompt kamen dann in den folgenden
  488. Ausgaben L"osungsvorschl"age: Einer von DEK pers"onlich, der andere von
  489. Alan Hoenig. Der letztgenannte brachte die elegantere L"osung, die keine
  490. manuellen Korrekturen mehr notwendig machte. Sein Makro verlangte lediglich
  491. in den Parametern Informationen "uber die Breite und H"ohe der
  492. freizulassenden Stelle im Paragraphen. Die Einz"uge und der Satz der
  493. Fragmente des Abschnitts erfolgten automatisch.
  494. \end{window}
  495. \begin{verbatim}
  496. \begin{figwindow}[2,r,{
  497. \unitlength1cm
  498. \begin{picture}(3,1.4)
  499. \put(0.7,0.7){\circle*{0.2}} \put(0.7,0.7){\circle{1.2}}
  500. \put(0.7,0.7){\vector(0,1){0.6}} \put(2.5,0.7){\circle*{0.5}}
  501. \end{picture}
  502. },{Kreise und Pfeile}]
  503. Was leisten nun diese Macros ...
  504. ... sieht hierbei wie folgt aus:
  505. \end{figwindow}
  506. \end{verbatim}
  507. \begin{figwindow}[2,r,{
  508. \unitlength1cm
  509. \begin{picture}(3,1.4)
  510. \put(0.7,0.7){\circle*{0.2}} \put(0.7,0.7){\circle{1.2}}
  511. \put(0.7,0.7){\vector(0,1){0.6}} \put(2.5,0.7){\circle*{0.5}}
  512. \end{picture}
  513. },{Kreise und Pfeile}]
  514. Was leisten nun diese Macros? Einen kleinen Eindruck hat man schon
  515. zu Anfang dieses Artikels bekommen: der erste Buchstabe des Absatzes
  516. ist in einer anderen Schriftgr"o"se gedruckt und in den Absatz eingepa"st.
  517. Es mu"s aber nicht unbedingt Text sein, der so einger"uckt wird. Es kann
  518. ebenso eine \verb?picture?--Umgebung sein, die so in den Absatz eingef"ugt
  519. wird. Das rechts stehende Beispiel, das aus "'\LaTeX , Eine Einf"uhrung"'
  520. bekannt sein d"urfte, ist in einer \verb?minipage?--Umgebung gesetzt
  521. worden. Die Eingabe im Text sieht hierbei wie oben aus.
  522. \end{figwindow}
  523. \begin{verbatim}
  524. \begin{tabwindow}[1,r,{
  525. \begin{tabular}[t]{|r|l|r@{:}l|}
  526. \hline
  527. 1&HSV&12&0\\
  528. ...
  529. \end{tabular}
  530. },{Tabelle}]
  531. Auch der Satz von Tabellen in ...
  532. ... w"urde sie etwas durchh"angen.
  533. Nachdem die Tastatur gequ"alt ...
  534. ... noch die Nummerierung stimmt.
  535. \end{tabwindow}
  536. \end{verbatim}
  537. \begin{tabwindow}[1,r,{
  538. \begin{tabular}[t]{|r|l|r@{:}l|}
  539. \hline
  540. 1&HSV&12&0\\
  541. \hline
  542. 2&MSV&11&1\\
  543. \hline
  544. 3&VfB&10&2\\
  545. \hline
  546. 4&SVW&9&3\\
  547. \hline
  548. 5&1.\ FCK&8&4\\
  549. \hline
  550. \end{tabular}
  551. },{Tabelle}]
  552. Auch der Satz von Tabellen in ein Fenster ist kein gro"ses Problem.
  553. Man nimmt einfach eine Tabelle, oder denkt sich auch eine aus.
  554. Dann wird daf"ur Sorge getragen, da"s sie auch mit der unteren
  555. Zeile ausgerichtet wird. Ansonsten w"urde sie etwas durchh"angen.
  556. Nachdem die Tastatur gequ"alt und das Hirn zermartert wurde kommt
  557. dann so etwas heraus, wie es hier rechts zu sehen ist. Sogar die
  558. Tabellenbezeichnung ist erschienen. Aber wirklich interessant wird's,
  559. wenn auch bei der n"achsten Tabelle noch die Nummerierung stimmt.
  560. \end{tabwindow}
  561. \begin{verbatim}
  562. \begin{tabwindow}[2,l,{
  563. \begin{tabular}[t]{|r|l|r@{:}l|}
  564. ...
  565. \end{tabular}
  566. },{Tabelle}]
  567. Was wahnsinnig ...
  568. ... sagt's denn?
  569. \end{tabwindow}
  570. \end{verbatim}
  571. \begin{tabwindow}[2,l,{
  572. \begin{tabular}[t]{|r|l|r@{:}l|}
  573. \hline
  574. 1&HSV&12&0\\
  575. \hline
  576. 2&MSV&11&1\\
  577. \hline
  578. 3&VfB&10&2\\
  579. \hline
  580. 4&SVW&9&3\\
  581. \hline
  582. 5&1.\ FCK&8&4\\
  583. \hline
  584. \end{tabular}
  585. },{Tabelle}]
  586. Was wahnsinnig auflockernd wirkt, ist der st"andige Positionswechsel
  587. von Abbildungen auf einer Seite. Das Auge wird nicht m"ude bei
  588. der Erkundung der typographischen Vielfalt, die in gedruckten
  589. Werken enthalten ist. Aber man sollte sich nichtsdestotrotz doch
  590. auf die wesentlichen Mitteilungen konzentrieren, die mit derartigen
  591. Werken vermittelt werden sollen.
  592. Was sind aber nun die essentiellen Informationen? Naja, ein kleines
  593. {\tt l} und eine {\tt 2} bewirkt ein g"anzlich anderes Erscheinungsbild
  594. der Realit"at, wie sie mit den Augen eines Fu"sballfans der sechziger
  595. Jahre gesehen sein k"onnte. Bevor wir es vergessen: Da war doch noch
  596. die Unsicherheit wegen der Nummerierung von Tabellen. Na also, wer
  597. sagt's denn?
  598. \end{tabwindow}
  599. \begin{verbatim}
  600. \begin{tabwindow}[4,c,{
  601. \begin{tabular}[t]{|r|l|r@{:}l|r@{:}l|}
  602. ...
  603. \end{tabular}
  604. },{Tabelle}]
  605. \sloppy
  606. Aber jetzt wird alles auf ...
  607. ... genug der Beispiele.
  608. \end{tabwindow}
  609. \end{verbatim}
  610. \begin{tabwindow}[4,c,{
  611. \begin{tabular}[t]{|r|l|r@{:}l|r@{:}l|}
  612. \hline
  613. 1&HSV&12&0&14&1\\
  614. \hline
  615. 2&MSV&11&1&10&4\\
  616. \hline
  617. 3&VfB&10&2&12&9\\
  618. \hline
  619. 4&SVW&9&3&11&9\\
  620. \hline
  621. 5&1.\ FCK&8&4&10&10\\
  622. \hline
  623. \end{tabular}
  624. },{Tabelle}]
  625. \sloppy
  626. Aber jetzt wird alles auf die Spitze getrieben. Oder vielmehr
  627. in die Mitte gesetzt. Ja doch, auch der zentrierte Satz einer Tabelle
  628. ist ebenfalls kein gro"ses Problem. Ein Problem ist jedoch, wie denn
  629. der Text gelesen werden soll. Erst die linke Spalte und dann die
  630. rechte oder einfach von links nach rechts? Oft kann man es nicht
  631. falsch machen. Das tr"ostet doch ungemein!
  632. Nun noch ein kleiner Hinweis in eigener Sache:
  633. Beim zentrierten Satz ist es schon besser, wenn der Abstand zwischen
  634. den Abschnitten auf $0pt$ gesetzt wird oder nur ein Paragraph verwendet
  635. wird. Der Grund? Die Abst"ande k"onnen unabh"angig vom Zeilenabstand
  636. sein und so ist ein optisch korrekter Satz der Spalten rechts und
  637. links vom Fenster etwas m"uhsam {\tt :-)}. Um nichts dem Zufall zu
  638. "uberlassen wird dies gleich von {\tt picinpar} erledigt.
  639. \end{tabwindow}
  640. Jetzt noch der Fall, bei dem eine Abbildung zentriert in den Text gesetzt
  641. werden soll, aber rechts und links so wenig Platz ($<=72pt$) bleibt,
  642. da"s dort die Probleme mit den Trennungen zu gro"s werden w"urden. Als
  643. Beispiel wird im Fenster die \TeX{}--Eingabe zu diesem Fall gezeigt. Um
  644. gleich etwaigen Problemen vorzubeugen, wird zun"achst wie folgt vorgegangen:
  645. {\parskip0pt\topsep0pt
  646. \begin{verbatim}
  647. \newbox\pppbox
  648. \setbox\pppbox=\vbox{\hsize=11cm
  649. \begin{verbatim}
  650. \begin{figwindow}[4,c,{\wframepic{ppp}
  651. },
  652. {Die Eingabe zu diesem Textteil!}]
  653. Diese Vorgehensweise ist wegen der Benutzung
  654. ...
  655. dem Einsatz im Wege.
  656. \end{figwindow}
  657. \end{verbatim}
  658. \verb?\end{verbatim}?
  659. \begin{verbatim}
  660. }
  661. \end{verbatim}
  662. }
  663. \newbox\pppbox
  664. \setbox\pppbox=\vbox{\hsize=11cm
  665. \begin{verbatim}
  666. \begin{figwindow}[4,c,{\wframepic{ppp}
  667. },
  668. {Die Eingabe zu diesem Textteil!}]
  669. Diese Vorgehensweise ist wegen der Benutzung
  670. ...
  671. dem Einsatz im Wege.
  672. \end{figwindow}
  673. \end{verbatim}
  674. }
  675. \begin{figwindow}[4,c,{\wframepic{ppp}},
  676. {Die Eingabe zu diesem Textteil!}]
  677. Diese Vorgehensweise ist wegen der Benutzung von {\tt figwindow} und
  678. der {\tt verbatim} dargestellten Eingabe notwendig. Aber ist ja auch egal.
  679. Wichtig ist einfach, da"s festgestellt wird, ob rechts und links vom
  680. zentrierten Bild noch genug Platz frei ist, um dort Text ohne gro"se
  681. Probleme zu setzen. Die Wahl von $72pt$ ist mehr oder weniger willk"urlich
  682. vorgenommen worden. Letztlich h"angt diese Grenze ja auch von der
  683. verwendeten Sprache ab. Falls also nicht genug Platz an den Seiten
  684. vorhanden ist, dann wird einfach nach dem Fenster mit dem Text fortgefahren.
  685. Noch mal schnell ein Blick auf die Nummerierung der Abbildungen...
  686. Ja, stimmt genau. Jetzt steht also dem Einsatz nichts im Wege.
  687. \end{figwindow}
  688. \begin{window}[3,r,{\arraycolsep=2.5pt \def\arraystretch{.75}
  689. $\left(\begin{array}{ccccccccc}%
  690. *&*&*&*&&&&&\\
  691. **&*&*&*&*&&&&\\ \cline{3-6}
  692. *&*&\multicolumn{1}{|c}{*}&*&*&\multicolumn{1}{c|}{*}&&&\\
  693. &*&\multicolumn{1}{|c}{*}&*&*&\multicolumn{1}{c|}{*}&*&&\\
  694. &&\multicolumn{1}{|c}{*}&*&*&\multicolumn{1}{c|}{*}&*&*&\\ \cline{3-6}
  695. &&&*&*&*&*&*&*\\
  696. &&&&*&*&*&*&*\\
  697. &&&&&*&*&*&*\\
  698. &&&&&&*&*&*
  699. \end{array}
  700. \right)$},{}]
  701. Doch halt! Es handelt sich hier ja um \TeX{}. Und das ist Grund genug, auch
  702. noch kurz auf mathematischen Formelsatz einzugehen. Sowohl im Fenster als
  703. auch im Text neben dem Fenster k"onnen Formeln erscheinen, deren Dimensionen
  704. beim Satz weitestgehend ber"ucksichtigt werden. Da ist also rechts ein
  705. {\tt array} und hier folgt eine Formel:
  706. \def\formel#1#2#3#4#5{#1(#4)-#1(#3)=
  707. \int_{#3}^{#4}\sum_{j=0}^{#5}#2(x_j)
  708. \prod_{{k=0}\atop{k\not= j}}^{#5}
  709. {x-x_k\over x_j-x_k}\; dx}
  710. $\formel Ffabn$
  711. Der zentrierte Satz von Formeln neben dem Text ist bisher mit
  712. {\tt picinpar.sty} nicht m"oglich, vielleicht kommt es aber eines
  713. Tages. Und "uberhaupt hat sich gerade der Mathematiksatz als gro"ses
  714. Problem bei der Entwicklung herausgestellt, da doch viel {\tt glue} in
  715. den {\tt boxes} verwendet wird. Aber es geht ja doch so halbwegs.
  716. \end{window}
  717. \vfill
  718. \centerline{Friedhelm Sowa, Heinrich--Heine--Universit"at D"usseldorf,
  719. Universit"atsrechenzentrum}
  720. \centerline{Email: sowa@convex.rz.uni-duesseldorf.de {\sl oder}
  721. tex@ze8.rz.uni-duesseldorf.de}
  722. \end{document}