[cstex] Je \vsplit opravdu globalni?

Zdenek Wagner zdenek.wagner at gmail.com
Mon Oct 17 11:58:22 CEST 2011


2011/10/17 Jan Sustek <Jan.Sustek na seznam.cz>:
> Dobry den,
>
> dekuji za pekny ranni orisek. :-)
>
Dekuji za podrobne vysvetleni. Pokud jsem to dobre pochopil, tak
\vsplit vlastne pouziva "pass by reference". Neni to sice globalni,
ale je to presne to, co ve svem makru potrebuji. Jiz jen akademicky by
me zajimalo, jestli je \vsplit prirazeni, tedy jestli se provede
\afterassignment a ve kterem okamziku. Jde mi o pripad, kdy vysledek
\vsplit primo sazim, ne kdyz odlomeny kus vkladam do jineho boxu
pomoci \setbox. A pokud \vsplit je prirazeni a odlomeny kus ukladam
pomoci \setbox do boxu, kde se \afterassignment provede?

> Koukal jsem do TeXbooku a TBN a nikde jsem nenasel, ze by melo byt prirazeni pomoci \vsplit globalni. Podle me by bylo logicke, kdyby prirazeni pomoci \vsplit poslouchalo skupiny stejne jako kazde jine prirazeni, napriklad jako \setbox.
>
> Ale podle zdrojaku TeXu se \setbox a \vsplit chovaji jinak. Prikazy, ktere maji hodnotu cur_cmd<=70, nemohou mit prefix (napriklad \global) (sekce 1211). No a \vsplit ma hodnotu 20 (sekce 208, 1072) a \setbox ma 98 (sekce 209). To znamena, ze \setbox muzeme nastavit lokalne, nebo globalne, ale u \vsplitu si vybirat nemuzeme.
>
> Hlubsi pohled do zdrojaku ukazuje nasledujici. WEBove makro box(#) je ukazatel (sekce 230, 221) do TeXove pameti (ta je globalni), kde je ulozen obsah boxu. Hodnota ukazatele se meni v zavislosti na skupinach. Ale primitiv \vsplit meni primo obsah pameti (sekce 977, treti radek od konce), na niz se ukazatel box(n) ukazuje. To znamena, ze by melo platit, ze se box \xxx meni na urovni skupiny, kde do nej byl prirazen obsah, nezavisle na urovni skupiny, kde byl pouzit \vsplit. To je videt i na nize uvedenem prikladu. Pokud byl box \xxx prirazen globalne, je potom i \vsplit\xxx globalni.
>
> Prijemne TeXovani preje
> Jan Sustek
>
>
> \documentclass{article}
> \begin{document}
> \newcount\i
> \newbox\xxx
>
> \setbox\xxx\hbox{uvodni hbox}
> {
> \setbox\xxx\vbox{\hsize5cm \loop\ifnum\i<200 \advance\i1 \the\i\ \repeat}
> {
>  Zkuste pred nasledujici setbox dat global
>
>  \setbox\xxx\vbox{\hsize3cm \i250 \loop\ifnum\i<400 \advance\i1 (\the\i) \repeat}
>  \vsplit\xxx to 3cm
>  tady je box se zavorkami \copy\xxx
> }
>
> \vsplit\xxx to 5cm
> tady je box bez zavorek
> \copy\xxx
> }
>
> A tady je \copy\xxx
>
> \end{document}
>
>
>
>
>
>> ------------ Původní zpráva ------------
>> Od: Zdenek Wagner <zdenek.wagner na gmail.com>
>> Předmět: [cstex] Je \vsplit opravdu globalni?
>> Datum: 16.10.2011 15:44:30
>> ----------------------------------------
>> Vážení experti (a expertky),
>> při psaní makra jsem narazil na to, že bych potřeboval větší \vbox
>> rozlámat pomocí \vsplit, a kousky použít později. Protože makro bude
>> dělat spoustu dalších věcí, budou určité činnosti probíhat uvnitř
>> skupin. Nenašel jsem však, jak se chová \vsplit. Udělal jsem
>> nednoduchý experiment:
>>
>> \newbox\xxx
>> \setbox\xxx\vbox{\vskip 0pt plus 10pt \text}
>>
>> {\vsplit \xxx to 50pt \vskip 1cm \copy\xxx}\vskip 2cm \copy\xxx
>>
>> Z tohoto experimentu se zdá, že \vsplit přiřadí do \xxx zbytek
>> globálně, tj. po uzavření skupiny není v \xxx původní obsah. Oba
>> \copy\xxx totiž vysadí totéž. Je tato vlastnost dokumentována? Přesně
>> tohle chování se mi v makru hodí, ale nevím, zda se na to mohu
>> spolehnout. (Pozn: před vlastním pokusem si definujte \text)
>>
>> --
>> Zdeněk Wagner
>> http://hroch486.icpf.cas.cz/wagner/
>> http://icebearsoft.euweb.cz
>>
>> _______________________________________________
>> csTeX mailing list
>> csTeX na cs.felk.cvut.cz
>> http://lists.felk.cvut.cz/mailman/listinfo/cstex
>>
>>
>>
>
> _______________________________________________
> csTeX mailing list
> csTeX na cs.felk.cvut.cz
> http://lists.felk.cvut.cz/mailman/listinfo/cstex
>



-- 
Zdeněk Wagner
http://hroch486.icpf.cas.cz/wagner/
http://icebearsoft.euweb.cz



More information about the csTeX mailing list