Metapost - jak dostat hodnotu promenne do label?

Jaromir Kuben kuben at scova.vabo.cz
Tue May 27 10:27:10 CEST 2003


Jan Houstek píše:
> 
> > Dobry den,
> >
> > da se nejak dostat (a pripadne jak) hodnota metapostovske promenne do
> > TeXovskeho textu vkladaneho pomoci label?
> 
> Predem inzeruji, ze se nepovazuju za experta na MP, pisu z hlavy, takze me
> neberte ve vsem 100% vazne :-)
> 
> Metapost nejdrive sestavi .tex soubor ze vsech kusu zdrojaku mezi
> btex,etex a verbatimtex,etex (patricne je obali tak, aby kazdy label byl
> na zvlastni strance). Tento soubor prozene TeXem a z vysledneho dvi
> vypreparuje umisteni boxu se znaky a patricne je vlozi do vysledneho
> postrscriptu.
> 
> Z toho mj. plyne, ze v okamziku, kdy se sazi labely TeXem metapost jeste
> nevi, jakou hodhotu bude mit jaka promenna. Taky se label v cyklu bude
> sazet jenom jednou a ne tolikrat, kolikrat se vykona cyklus.
> 
> Metapost totiz potrebuje vedet, jak je vysledny label velky, proto ho musi
> sazet predtim, nez se provadi samotne zpracovani metapostoveho kodu.
> 
> Muzete pouzit prikaz show, hodnoty promennych se zapisi do logu, ktery
> muzete z toho TeXu nacist a nejak pouzit. Nevyresite tim ale problem s tim
> cyklem.
> 
> Pokud jsem psal bludy, tak se omlouvam, nejaky guru me jiste opravi.
> 
> -- Honza Houstek

Dobry den.

Je to mozne, ale musi se vedet, jak na to. Trik lze nalezt v souboru
tex.mp,
ktery je standardni soucasti instalace metapostu.

Pouzije se primitiv write, ktery bohuzel neni popsan v manualu mpman.ps.
Byl totiz
pridan pozdeji a najdete ho dokumentaci mpgraph.ps na str. 17.

Popis nahore je spravny, metapost vysbira okoli btex a etex (a verbatim)
na zacatku,
takze takto to nejde. Pomoci write se zapise retezcova promenna do
pomocneho souboru,
ktery se vzapeti nacte. Tim dojde k zavolani texu, vytvori se popisek a
je to. Tedy:

for i=1 upto 10:
write "label(popis[" & decimal(i) & "]=btex " & decimal(i) & 
 " etex,(5.5u," & decimal(i) & "*v));" to "soubor.mp";
write EOF to "soubor.mp";
draw (0,i*v)--(5u,i*v);
scantokens "input soubor"
endfor

Takto se ale vola tex tolikrat, kolik je prubehu cyklu. Takze pro velky
pocet (a pokud by se volal treba latex, ne plain) je to velmi pomale.
Je proto taktictejsi napred si pripravit popisky (jde o objekty typu
picture)
a pak je dalsim cyklem nakreslit. Tedy:

beginfig(1);

picture popis[];
u=20mm; v=8mm;
for i=1 upto 10:
write "popis[" & decimal(i) & "]=btex " & decimal(i) & " etex;" to
"soubor.mp";
endfor

write EOF to "soubor.mp";
scantokens "input soubor"

for i=1 upto 10:
draw (0,i*v)--(5u,i*v);
label(popis[i],(5.5u,i*v));
endfor

endfig;

end

Tohle jsem zkousel a chodi to (v OS/2 s emtexem).
Mozna budete muset pri opakovanem volani smazat rucne pomocny soubor
soubor.mpx
(nebo jak ho Vas metapost pojmenovava).
Snad Vam to pomuze. Ja kdysi ten soubor tex.mp objevil nahodou.
Zdravi
          Jaromir Kuben




More information about the csTeX mailing list