TEX

2. Printen. Boxen

In de inleiding tot TEX hebben we teksten alleen op het scherm gezien. Nu gaan we ze afdrukken. Vervolgens gaan we in op het zetten van tekstblokken op een pagina. Als voorbeeld zetten we een brief en een tekst in twee kolommen.

Afdrukken

Voor de printer moet een driver en fonts geïnstalleerd worden.

Drivers zijn te vinden op disk B100 in de archieven IMPACT.LZH (voor naald en inkjet) en LASER.LZH. Er is geen lijst van printers – er zijn er zo veel en er komen steeds nieuwe. Het is dus even zoeken en proberen om de driver voor je eigen printer te vinden. Haal wat drivers uit het archief en start ze zonder parameters (dwz. tik [Return] als om parameters gevraagd wordt). Dat levert een helptekst met info over de printers waar de driver voor bedoeld is, en combineer dat met info uit de handleiding van je printer. Voor mijn Epson Stylus 800 inkjet printer heb ik bv. de driver DVI LQ.TTP nodig, niet zo vanzelfsprekend. De driver moet in de BIN folder komen bij de screendriver DVI VIEW.TTP en aangemeld worden in Ctex in het menu Finden.

De fonts in de FONTS folder zijn voor het scherm met 96 dpi (dots per inch). Voor de printer heb je andere fonts nodig, bv. 360 dpi voor de Epson Stylus. Een beperkte verzameling fonts is te vinden op disk B105, voor de Epson in het BJ MINI archief. Een complete verzameling voor alle mogelijke printers is veel te groot. De volgende keer gaan we met MetaFont zelf ontbrekende fonts aanmaken.

Zet met het Install programma de fonts op hun plaats, bv. in TEX\BJ FONTS voor de Epson. Raadpleeg nog eens de helptekst van de printerdriver om de parameters te bepalen. Voor de Epson Stylus zijn dat

    -i -v=360 -f=\tex\bj fonts

Start Ctex, tik P (of klik op Drucken in het menu Arbeiten), klik op einstellen en vul de parameters in. Nu kan je een tekst zonder magnification afdrukken als het goed is. Op ST’s werkt dat, op de Milan moet nog -o=prn: toegevoegd worden aan de parameters om de output naar de printerpoort te sturen.

Briefhoofd

De bedoeling is een bestand BRIEF.TEX te maken met een briefkader dat je eigen briefhoofd, de plaats voor het adres, de datum enz. bevat. Als je dan een brief aan P. Puk wilt schrijven, zet je BRIEF.TEX in de editor, je vult het adres in, schrijft de brieftekst en zet het bestand als PUK.TEX weer op schijf. Alle namen en maten in dit verhaal zijn willekeurig. BRIEF.TEX begint met een paar instellingen:

    \magnification 1200 \vsize 250 true mm \hsize 160 true mm
    \nopagenumbers \parindent 0 mm

De eerste drie commando’s kennen we al uit de Inleiding (Stap 1 en Opmaak). Het vierde commando onderdrukt paginanummers; als je die in een lange brief toch wilt hebben, zet je een procentteken voor dit commando (Stap 3). Het laatste commando zorgt dat TEX niet bij elke nieuwe alinea inspringt (\parindent 0 werkt niet, TEX wil een maat zien).

Vervolgens het briefhoofd, voorlopig in de linker bovenhoek. Andere plaatsen komen later aan de orde (onder ‘Meer boxen’).

    % briefhoofd
     {\obeylines {\bf
      A. Texnicus } {\sevenrm
      Tolstr.\ 88
      1234 TT Assen
      Tel 0999-999999 } }

Het commando \obeylines maakt dat TEX niet zelf de tekst gaat opmaken in regels van gelijke lengte. Zonder dit commando zouden naam, straat, enz. niet onder maar achter elkaar gezet worden. De werking van \obeylines wordt begrensd door de eerste en laatste accolade. De naam is vet gezet met \bf, zoals we in Stap 2 gezien hebben. Adres enz. zetten we in een klein lettertje. Met \sevenrm wordt het cmr7 font aangeroepen dat we al kennen als font voor sub- en superscripts in wiskundeformules. Achter de straatnaam staat een punt. Als die punt gevolgd wordt door een spatie, dan duidt dat meestal op het einde van een zin, en TEX zet daar wat extra wit achter. Om te vermijden dat het huisnummer ver achter de straatnaam komt zetten we een \ achter de punt. Dat is niet nodig na A., want TEX weet dat een zin niet eindigt met een hoofdletter.

Adres

We willen het adres zodanig plaatsen dat het b.v. onder het transparante raampje van een vensterenvelop terecht komt, als de brief daar opgevouwen in gedaan wordt. Dat kan als volgt:

    \vskip 20 true mm \moveright 90 true mm
    % adres
     \vbox to 30 true mm {\vfil \obeylines
      P. Puk
      Pompoen 11
      8888 PP Peek
      \vfil }

Het \vskip commando (zie Inleiding onder ‘Opmaak’) maakt witruimte tot aan de bovenkant van het venster. De \vbox to 30 mm {… } opdracht laat TEX een (onzichtbare) rechthoekige ruimte van 30 mm hoog maken die opgevuld wordt met het materiaal tussen de accolades. Met \moveright wordt de box een eind naar rechts verschoven. De \vfil’s zorgen voor vulling: er wordt zoveel wit boven en onder het adres toegevoegd dat het precies in de 30 mm hoogte past. Zonder de eerste \vfil wordt het adres bovenin het venster gezet, zonder de tweede \vfil onderin, met beide gecentreerd.

Na het adres komt:

    \vskip 20 true mm -

Dit zet een streepje op de plaats waar de brief gevouwen moet worden.

Brieftekst

De rest van het briefkader is nu snel gemaakt. Eerst de datum, rechts uitgelijnd:

    \hfill Assen, \the\day-\the\month-\the\year

TEX vult de datum in van het Control Panel. Een vulling \hfil is te zwak. TEX heeft ook sterkere vullingen met twee l’s. Dat is hier nodig om de datum helemaal naar rechts te drukken.

Dan de brieftekst:

    \parindent 10 mm
    Beste Piet
    \medskip
    brieftekst brieftekst brieftekst
    \bigskip \hskip 80 true mm   Groeten,
    \bye

Met \parindent herstellen we het inspringen bij nieuwe alinea’s. (Je kunt TEX ook de opdracht \parskip 2 mm geven. TEX scheidt dan de alinea’s met een kleine vskip.) De \medskip en \bigskip commando’s leveren vskip’s ter waarde van een halve en een hele regelafstand. De brief is klaar.

Meer boxen

We gaan nu een andere indeling maken van het bovendeel van de brief, in twee kolommen. Daartoe zetten we twee vboxen naast elkaar. In de linker komt weer het briefhoofd en in de rechter het adres, maar dat kan evengoed andersom. Na de eerste twee regels met instellingen komt:

    \hbox {
     \vbox to 80 true mm { \hsize 90 true mm \vskip 10 true mm
    % briefhoofd

…

      \vfil }
     \vbox to 80 true mm { \hsize 69 true mm \vskip 30 true mm
    % adres

…

     \vfil } }

Op de eerste stippels komt weer het briefhoofd (5 regels) en op de tweede stippels het adres (5 regels in het voorbeeld). Er worden twee vboxen naast elkaar gezet in een hbox. (Als je \hbox { en de laatste accolade weglaat, zet TEX de vboxen onder elkaar.) Beide vboxen zijn 80 mm hoog. Hun breedte wordt bepaald door hsize. Deze maat is binnen de vboxen op 90 mm (links) en 69 mm (rechts) gezet. Buiten de vbox neemt TEX weer de oorspronkelijke instelling, 160 mm. Door de vskips (10 en 30 mm) te variëren kunnen de teksten op en neer geschoven worden in de kolommen.

Twee kolommen

Het opmaken van de brief gaat in WordPlus eenvoudiger (maar niet zo mooi). We gaan nu iets doen dat in de oude WordPlus niet kan: tekst in kolommen zetten. Stel nu dat we halverwege een pagina verder in twee kolommen willen werken. Daarvoor stoppen we de tekst bovenaan de pagina in een box, we laten TEX de verdere tekst in een lange kolom ter breedte \colwidth zetten, en van die kolom twee stukken afsplitsen van de juiste lengte. Eerst definiëren we een paar hulpvariabelen:

    \newdimen \ohsize \newdimen \ovsize
    \newdimen \colwidth \colwidth 80 true mm

Dan bewaren we de tekst bovenaan de pagina in een box. TEX heeft 256 boxen waarvan 0-9 vrij beschikbaar zijn voor de gebruiker. TEX gebruikt zelf box 255 voor het opmaken van een volle pagina. Die wordt dan doorgegeven naar het DVIbestand volgens de output routine \output{\plainoutput}. Box 255 is dan leeg. Die output routine gaan we nu veranderen, zodat box 255 doorgegeven wordt naar box 0:

    \output {\global \setbox0 \vbox {\unvbox255} }
    \eject

Het \eject commando vult box 255 en roept de output routine aan. Vervolgens bewaren we hsize en vsize in de hulpvariabelen ohsize en ovsize, en dan veranderen we hsize in colwidth en we maken vsize ruim twee maal zo groot:

    \ohsize \hsize \ovsize \vsize
    \hsize \colwidth
    \multiply \vsize by 2 \advance \vsize by 5 mm

Voor we nu TEX box 255 met de nieuwe afmetingen hsize en vsize met tekst laten opvullen, definiëren we eerst een nieuwe output routine. Deze wordt pas gebruikt als TEX voldoende tekst heeft verwerkt om box 255 te vullen, of als TEX een eject of bye tegenkomt.

    \output {
     \dimen0 \ovsize \advance \dimen0 by -\ht0
     \setbox1 \vsplit255 to \dimen0
     \setbox2 \vsplit255 to \dimen0

     \setbox9 \vbox{\unvbox255}
     \setbox255 \vbox to \ovsize {
      \unvbox0
      \hbox to \ohsize {\box1 \hfil \box2} }
     \hsize \ohsize \vsize \ovsize
     \plainoutput
     \unvbox9 }

Eerst wordt dimen0 (één van de 256 maatvariabelen van TEX) gelijk gemaakt aan de oude vsize verminderd met ht0, de hoogte van box 0: dat is juist de hoogte die nog beschikbaar is op de pagina. Dan worden er twee kolommen van die hoogte afgesplitst en in box 1 een 2 gestopt, en de rest wordt in box 9 opgeborgen. Box 255 is dan leeg. Vervolgens wordt box 255 weer opgebouwd met bovenin box 0 en daaronder naast elkaar box 1 en 2. Na het terugzetten van hsize en vsize op de oude waarden laten we plainoutput het karwei afmaken. Ten slotte halen we het restant uit box 9; dat wordt het begin van de volgende pagina. Als die vol is, komt onze output routine opnieuw in actie, maar dan met een lege box 0.

Tips

Een paar tips tot slot. De hier besproken drivers voor scherm en printer werken gebrekkig bij multitasking. Er bestaan versies die daar wel geschikt voor zijn, uitgegeven door Maxon. Maar deze MultiTEX van Strunk is moeilijk te verkrijgen; neem contact op met de Stichting ST.

Dan vskips die niet werken bovenaan de pagina. Ze worden meestal gebruikt om een tekstdeel duidelijk te scheiden van het volgende. Dat is aan het begin van een nieuwe pagina niet nodig, daarom negeert TEX vskips daar (ook \medskip, \bigskip enz.). Als je bovenaan de pagina ruimte wilt maken, gebruik dan \vglue in plaats van \vskip.

Bij het zetten van tekst in smalle kolommen wordt het voor TEX moeilijk om het wit tussen de woorden gelijkmatig te verdelen in een alinea. Je krijgt dan vaak de melding ‘overfull \hbox’. Als dat te vaak gebeurt, verander dan de tolerance met b.v.

    \tolerance 1000

De standaard waarde van deze parameter is 200, de grootste waarde 10000.

BRIEF.TEX en de twee kolom routine BICOL.TEX staan op de TEX page van de ST website.

Robert Best