nejasne chovani LaTeXu
Antonin Strejc
STREJC at vc.cvut.cz
Mon Oct 6 18:54:45 CEST 1997
Josef Tkadlec pise:
>Setkal jsem se v LaTeXu s chovanim, ktere mi
pripada zvlastni. Pokud v >prostredi picture napisi
> \def\p{l} \put(0,0){\makebox(0,0)[\p]{...}}
>je box zarovnan (podle ocekavani) na "levy stred", zatimco v pripade
> \def\p{lt} \put(0,0){\makebox(0,0)[\p]{...}}
>se to chova, jako bych nepovinny parametr vubec neuvedl (vysledek je
>centrovan v obou smerech).
>
>Je nejaky duvod takoveho chovani nebo je to chyba?
Muzeme nahlednout do LATEX.TEX a tam zjistit nasledujici:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jadro chovani lze nalezt v makru \@imakebox, ktere definuje ctyri
makra nasledujicim zpusobem:
\let\mb at t=\vss % top
\let\mb at b=\vss % bottom
\let\mb at l=\hss % left
\let\mb at r=\hss % right
Zjednodusene se tedy da rict, ze v tomto stavu makra produkuji
celkem ctyri glue, jimiz je objekt v boxu ze vsech stran obklopen.
Pokud by se tedy dale nic nezmenilo, byl by objekt centrovan svisle
i vodorovne. Vtip odlisneho umistovani spociva v tom, ze se nekterym
z techto maker odejme efekt glue a misto nej se jim priradi \relax.
Pokud je napriklad uvedeno [lt], pak se provede:
\let\mb at l=\relax
\let\mb at t=\relax
a zbyvajici dve glue "odsunou" objekt pozadovanym smerem.
Naznacena predefinovani na \relax se provadeji smyckou, ktera je
naprogramovana v makru \@tfor#1:=#2\do#3. Parametrem #1 je v tomto
pripade makro \@tempa, nase "lt" je #2 , telem smycky jsou prikazy
uvedene v #3. Smycka bezi tolikrat, kolik tokenu je v #2, s tim ze
tyto tokeny se postupne prirazuji \@tempa. S touto hodnotou se pak
vykonava telo smycky. V pripade "lt" tedy bezi smycka dvakrat:
v prvnim cyklu nabude \@tempa hodnoty "l", provede se
\let\mb at l=\relax, v druhem cyklu nabude \@tempa hodnoty "t" a udela se
\let\mb at t=\relax. Nazvy maker se vytvareji beznou konstrukci
\expandafter\let\csname\mb@\@tempa\endcsname\relax.
A uz se dostavame ke korenu problemu: Pokud je obsahem #2 makro,
tj. Vase \p (predpokl. \def\p{lt}), pozere se cele \p hned v prvnim
cyklu, tedy smycka bezi jen jednou a makru \@tempa se chybne priradi
hodnota "lt". To ma za nasledek, ze se chybne sestavi nazev makra a
provede se prirazeni:
\let\mb at lt=\relax
coz je sice regulerni, ale k nicemu, nebot takto vzniklo makro, ktere
se nikdy nepouzije a jehoz zivot stejne zahy skonci (s koncem grupy).
Tim, ze se neprovedla potrebna dve prirazeni, zustane makrum \mb at l
a \mb at t chybne prirazen puvodni efekt glue a objekt uvnitr boxu
zustane v obou osach centrovan.
ZAVER JE TEDY TEN, ze neni mozno pouzivat v hranatych zavorkach
jakozto nepovinny parametr makro, ktere expanduje na vice nez jeden
token. Proto v pripade \def\p{l} vse chodi spravne, zatimco pri
\def\p{lt} dojde k chybe, protoze smycka \@tfor probehne jen jednou.
Nechavam kazdemu na zvazeni, zda toto chovani oznaci za bug ci
feature...
S pozdravem
Antonin Strejc
---------------------------------------------------------------------
Ing. Antonin Strejc Phone: +420-2-24352938
---------------------------------------------------------------------
Czech Technical University in Prague Computing Centre
Czech Republic Zikova 4, 166 35 Praha 6
---------------------------------------------------------------------
More information about the csTeX
mailing list