GS + /PAPERSIZE
Zdenek Wagner
wagner at cesnet.cz
Wed Jun 1 11:28:26 CEST 2005
Vazeni kolegove,
nejprve se chci omluvit za svuj omyl. Jak se pise v manualu,
-sPARAM=hodnota vklada do systemdict definici stringu, a to jeste pred
tim, nez gs_init.ps nastavi systemdict na readonly. Parametr
-sPAPERSIZE=a4 je tedy ekvivalentni
systemdict /PAPERSIZE (a4) put
V gs_init.ps lze odkomentovat kod:
(a4) /PAPERSIZE where { pop pop } { /PAPERSIZE exch def } ifelse
rozeberme si jej. Operator where zjistuje, zda jmeno na vrcholu zasobniku
(v nasem pripade /PAPERSIZE) je znamo v nejakem slovniku, ktery ma PS
interpret k dispozici (tj. v zasobniku slovniku). Pokud ano, bude zasobnik
obsahovat:
(a4) -dict- true
Symbolem -dict- oznacuji objekt prislusneho slovniku, v nemz byla nalezena
definice /PAPERSIZE. Operator ifelse "spolkne" a provede prikazy v prvni
zavorce, cimz se odstrani zbyvajici dva operatory. To se stane v pripade,
ze uvedeme -sPAPERSIZE, protoze definice je jiz v systemdict (-dict- je
tedy objekt prave s timto slovnikem).
Pokud se definice v zadnem slovniku nenajde, bude po provedeni where v
zasobniku:
(a4) false
Operator ifelse spolkne false a provede prikazy v druhe zavorce, tj.
(a4) /PAPERSIZE exch def
tim se jmenu /PAPERSIZE priradi hodnota (a4) a ulozi do aktualniho
slovniku, jimz je systemdict. To se stane v pripade, ze prislusny kod je
odkomentovan a zadna definice /PAPERSIZE se v _zadnem_ dostupnem slovniku
nenajde.
Pozdeji ve stejnem souboru, pod nadpisem "Establish a default
environment", probehne nastaveni defaultniho prostredi. Najdete tam
prikazy:
systemdict /PAPERSIZE known
Zde se testuje, zda existuje definice /PAPERSIZE ve slovniku systemdict.
Nyni si predstavme hypotetickou situaci. Jeste predtim, nez GS zacne
interpretovat soubor gs_init.ps, ze podari nadefinovat /PAPERSIZE v
nejakem jinem slovniku a tento slovnik operatorem begin vlozit do
zasobniku slovniku. Test /PAPERSIZE where zjisti, ze definice jiz
existuje, takze defaultni nastaveni nepouzije. Pozdeji test systemdict
/PAPERSIZE known zjisti, ze v tomto slovniku prislusna definice neni,
takze zadne nastaveni velikosti neprovede. Zustanou tedy defaultni
"natvrdo zadratovane" hodnoty. Pokud ale uvedeme -sPAPERSIZE, vlozi se
definice do systemdict. Test /PAPERSIZE where opet zjisti, ze definice jiz
existuje (nezalezi na tom, kterou najde). Test systemdict /PAPERSIZE known
take definici najde, takze zacne nastavovat defaultni prostredi. V nem je
prikaz: PAPERSIZE load, ktery natahne do zasobniku prislusnou definici z
aktualniho slovniku. Aktualnim slovnikem je v tomto okamziku systemdict,
takze se pouzije definice spravna, nikoliv ta podloudne podvrzena.
Toto je jedna z moznosti, ktera me napada, i kdyz netusim, jak se da
pdvrhnout definice. Druha moznost je, ze ps2pdf nejakym mechanismem
propasuje do parametru -sPAPERSIZE=letter. Kdyz se prida explicitne
nastaveni A4, pak nejspis pozdeji uvedeny parmetr prepise ten predchozi
(pokud k definicim dochazi v poradi, jak jsou uvedeny na prikazovem
radku).
Zdenek Wagner
e-mail: wagner at cesnet.cz
see also http://hroch486.icpf.cas.cz/wagner/
http://icebearsoft.euweb.cz
More information about the csTeX
mailing list