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