tabulky

hans at kolej.mff.cuni.cz hans at kolej.mff.cuni.cz
Thu Oct 24 17:16:28 CEST 2002


> Zdravim,
> 
> Dakujem za odpoved, vyskusal som, trochu som musel upravit aby to preslo,
> ale zostal mi tam jeden problem - treti stlpec je nejak cudne zarovnany
> doprava, povedal by som, ze aza natiahnuty. Neviete mi prosim, poradit, ako
> to odstranit?
> 
> {\def\vr{\vrule height12pt depth2pt width0.5pt}
> \def\hr{\noalign{\hrule}}
> \offinterlineskip
> \halign{\vr~#&~\vr~#&~\vr~#&~\vr~#\vr\cr
> \hr
> &prvy&druhy&treti\cr
> \hr
> abc&1&2&3\cr
> \hr
> & \multispan2 \vr~Roztazeno na 3 sloupce~\vr\cr
> \hr
> }}

    Prostudujte si v TeXbooku na ruby od pana Olšáka, kap. 4, jak
funguje \halign. Po určení šířky sloupce (maximum z přirozených šířek
sázeného materiálu v buňkách daného sloupce), se každá buňka sází jako
\hbox to <width> {...}. No a protože Vám chybí roztažnost v šabloně
obecného řádku, roztahuje se mezera a to máte ve třetím sloupci před
obsahem buňky. 

   Navíc ještě dojde k porušení šířky, protože text "Roztazeno na 3
sloupce", který sázíte přes dva sloupce (\multispan2), je širší než
přirozená šířka těchto sloupců.

   A do třetice Vám nesedí svislé čáry nad sebou, protože mezera za
číslem u \multispan není ignorována. Beru zpět, v šabloně obecného
řádku je pro tento sloupec zrovna také mezera před \vr.

   A ještě: vodorovné čáry máte užší (0,4pt, default z plainu, není-li
\vrule předefinováno), než svislé (0,5pt).

 
  Vyzkoušejte si:

{\setbox\strutbox=\hbox{\vrule height 10pt depth 4pt width 0pt}
  \catcode`\^^I=\catcode`\&
  \def\hflvr{\hfil~\vrule} \let\m=\multispan
  \def\par{\cr \noalign{\hrule}}\obeylines \offinterlineskip %
  \halign{\strut \vrule~\hfil #\hflvr && ~\hfil #\hflvr \span
	prvy	druhy	treti
abc	1	2	3
d	\m3 \hfil Roztazeno na 3 sloupce\hflvr
}}
 
(Sloupce v datových položkách jsou odděleny tabelátorem!)


   Protože nemám rád příliš TeXových maker mezi textem/daty, nadefinuji
si na začátku makra/značky a ty pak použiji v textu. V tomto příkladě
takovými značkami jsou tabelátor, znak konceřádku a makro \m.

   Jak to funguje?:

	\setbox\strubox... nastaví velikost podpěry \strut

	\catcode`\^^I=\catcode`\& nastaví tabelátoru stejný význam jako
má ampersand (ukončení buňku tabulky)

	\m je zkratka za \multispan

	\obeylines způsobí, že konec řádku ja aktivní a přiřadí mu význam
sekvence \par. Ale tu jsme předefinovali na \cr \noalign{\hrule}

	\offinterlineskip vypne vkládání meziřádkových mezer

	šablona první buňky tabulky je \strut \vrule~\hfil #\hfil~\vrule

	šablona každé další buňky (nekonečná šablona -- &&) jest
~\hfil #\hfil~\vrule

	\span v šabloně obecného řádku způsobí, že následující token je
čten v expandovaném tvaru. Co je následující token? No přeci znak konce
řádku. Ten se tedy expanduje na \cr \noalign{\hrule} -- ukončí šablonu a
vysází první vodorovnou čáru.

	dále už jen data oddělena tabelátorem

	konec řádku ukončí řádek tabulky a přidá vodorovnou čáru

	na závěr ukončení skupin

	třetí sloupec bude roztaženější, neboť šířka "Roztazeno na 3
sloupce" je větší než součet šířek "prvy" + "druhy" + "treti"

	mezera za \m3 je záměrně


    Příjemný weekend přeje

-- 
					Hans Ginzel

<>< Faculty of Mathematics and Physics, Charles University, Prague ><>

PS:	A pak, že se v TeXu nedá značkovat a zdroják je nepřehledný.
     Kam se hrabe o 15 let mladší html?
     






More information about the csTeX mailing list