Zobecneni makra pro tabulky

petr-brezina at volny.cz petr-brezina at volny.cz
Sat Dec 3 21:44:22 CET 2005


Dobry vecer,

tvorba tabulek v TeXu je ponekud slozitejsi zalezitost. Pro snadnou
tvorbu hezkych tabulek je zapotrebi pochopit, jak to funguje; pak
budete schopen vytvaret tabulky podle svych predstav. Vrele
doporucuji prostudovat si prislusnou kapitolu v Knuthove TeXbooku
ci v Olsakove TeXbooku naruby (osobne se mi zdal Knuthuv vyklad
teto problematiky o neco malo pristupnejsi nez Olsakuv). Je to
cetba asi tak na dva tri vecery.

Pro inspiraci prikladam dve rychla reseni Vaseho ukolu. Prvni
reseni ma tu nevyhodu, ze polozky ve vsech sloupcich budou
zarovnany pokazde vlevo (tak je to i v prikaldu z Vaseho mejlu).
Druhe reseni umoznuje menit zarovnani jednotlivych sloupcu, resp.
polozek; je ovsem zapotrebi pro kazdy sloupec rucne nastavit sirku.
Zarovnani se uskutecnuje pomoci prikazu \vlevo a \vpravo, ktere
mohou podle potreby nabyvat vyznamu \hfil nebo \relax; uzivatel
muze operativne menit jejich vyznam pomoci prikazu \lh, \lr, \ph a
\pr. Sirka sloupce se urcuje pomoci \bn{sirka}. Vertikalni cara
mezi sloupci se kresli pomoci \x. Prikazy \bn, \lh, \lr, \ph, \pr
se uvadeji pred sloupcem, k nemuz se vztahuji, a to tak, ze \bn a
\lh ci \lr je pred prikazem \x a prikaz \ph ci \pr je az za
priakazem \x. Vyjimkou je prvni radek; pro nej se sirka a zarovnani
nastavuje zcela pred tabulkou.

Poznamka k Vasemu makru: Prikazy \hfil, kterymi jste zrejme
zamyslel zarovnat text v jednotlivych polozkach, jsou zcela
bezvyznamne; natahovaci mezera, kterou vytvori, nema prostor, aby
se natahla, takze zustane nulova. Zdanlive vystredeni cisel je
zpusobeno tim, ze pred nimi je mezera (to je ta mezera za
hvezdickou), kdezto pred "Po, Ut, St, Ct, Pa" mezera neni. Pokud
byste trval na sve koncepci makra a chtel ho pouze "zobecnit pro
predem neurceny pocet radku", tak ho muzete upravit napriklad timto
zpusobem:

\def\hr{\hrule\vskip2pt}% vod. linka s mezerou
\def\tbb#1{\hr\hbox{\strut\hskip1mm\relax #1 }}% obsah jedne bunky
\def\tsl{\vrule\vbox\bgroup\bunka}
\def\konecsloupce{ \endtsl}
\def\bunka#1*{%
   \def\temp{#1}%
   \ifx\temp\konecsloupce
      \def\next{\hrule\egroup\ignorespaces}
   \else
      \def\next{\tbb{#1}\bunka}
   \fi
   \next}
% volani: \tsl Po* 3* 3* 1* 2* 3* 4* 5* \endtsl*
% (mezera pred \endtsl je povinna!)

\tsl ---*Jonagold*Rubin*Idared* \endtsl*
\tsl Po* 3* 3* 1* \endtsl*
\tsl Ut* 2* 1* 0* \endtsl*
\tsl St* 2* 1* 3* \endtsl*
\tsl Ct* 3* 2* 3* \endtsl*
\tsl Pa* 1* 2* 3* \endtsl*
\tsl So* 2* 0* 1* \endtsl*
\vrule


% % % % %

% Prve reseni

% makro, ktere vysazi tabulku po sloupcich s neomezenym
% poctem radku, zarovnanych vlevo:
\def\tabulka{%
   \vbox\bgroup
   \hbox\bgroup
   \valign\bgroup&\hrule\vfil
      \hbox{\strut\kern5pt ##\unskip\kern5pt}\cr}
% ukonceni makra \tabulka:
\def\endtabulka{%
   \egroup % konec skupiny pro \valign
   \egroup % konec skupiny pro \hbox
   \hrule % horizont. cara na konci tabulky
   \egroup} % konec skupiny pro \vbox
% vertikalni cara:
\def\x{\crcr\noalign{\vrule}}

\tabulka
\x
1 & 2 & 3 & 4 & 5 & 6 & 10 \x
alfa & beta & gamma & delta & epsilon & dzeta & kappa \x
a & b & g & d & kratke e & dz & k \x
\endtabulka


% Druhe reseni

% makro, ktere vysazi tabulku po sloupcich s neomezenym
% poctem radku, horizontalni zarovnani a sirka sloupcu
% se reguluje pomoci specialnich prikazu (\bn, \lh, \lr, \ph, \pr),
% zapsanych primo v tele tabulky
\def\tabulka{%
   \vbox\bgroup
   \hbox\bgroup
   \valign\bgroup&\hrule\vfil
      \hbox to\bnwd{%
         \strut\kern5pt\vlevo ##\unskip\vpravo\kern5pt}\cr}
% ukonceni makra \tabulka:
\def\endtabulka{%
   \egroup % konec skupiny pro \valign
   \egroup % konec skupiny pro \hbox
   \hrule % horizont. cara na konci tabulky
   \egroup} % konec skupiny pro \vbox
% vertikalni cara:
\def\x{\crcr\noalign{\vrule}}

\newdimen\bnwd % sirka bunky
\let\vlevo=\relax
\let\vpravo=\relax
\def\bn#1{\global\bnwd=#1} % sirka bunky nasledujiciho sloupce
\def\lh{\global\let\vlevo=\hfil}
\def\lr{\global\let\vlevo=\relax}
\def\ph{\global\let\vpravo=\hfil}
\def\pr{\global\let\vpravo=\relax}

\bn{20pt}\lh\pr
\tabulka
\x
1 & 2 & 3 & 4 & 5 & 6 & 10
\bn{1.7cm}\lr\x\ph
alfa & beta & gamma & delta & epsilon & dzeta & kappa
\bn{2cm}\lh\x\ph
a & b & g & d & kratke e & dz & k
\x
\endtabulka

\bye



--
Zaregistrujte si svou .EU domenu vcas. S VOLNY mate sanci byt
prvni. http://domeny.volny.cz/eu/





More information about the csTeX mailing list