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