Co se nevejde do boxu

Petr Olsak olsak at math.feld.cvut.cz
Thu Sep 28 00:22:37 CEST 2000


>Dobry den.
>Asi pred tremi mesici jsem se ptal vazeneho clenstva konference, zda by mi
>neporadili s tim, jak na terminal vypsat to, co se vejde do boxu o zadane
>sirce...
>Makro pracuje celkem uspokojive, akorat je zde jeden  problem: ignoruje mi
>mezery ze vstupu!

Dobry vecer,

Chyba Vaseho makra je v tom, ze jste pouzil neseparovany parametr, kam
nikdy nevstoupi token mezera, ale az nasledujici token.  Viz TBN,
str.35, odst. "Je-li parametr neseparovany...".  Chete-li osetrit ve
vstupnim proudu v makrech i mezery, musite pouzit \futurelet.

>Take jsem neprisel na zpusob, jak zabranit expanzi ridicich sekvenci

To jste mel s tim \newtoks\text dobre, jen nevim, proc jste
\immediate\write zabaloval do \edef\act. Tento nadbytecny ukon
zpusobil, ze se Vam to pri tisku na terminal expandovalo.

Pokusil jsem se upravit Vase makro tak, aby byly navic splneny Vase
pozadavky. Neni vylouceno, ze by to slo udelat jednoduseji, ale ted
momentalne je pulnoc.

\hsize=\maxdimen
\newdimen\CoseVejde \CoseVejde=3cm

\newtoks\text
\def\zmer {\futurelet\znak\vykonejzmer}
\def\vykonejzmer{%
  \ifx \znak\par \let\next=\relax
  \else
     \ifcat \znak\space
        \def\next{\afterassignment\prectimezeru\let\nxt= }% zlikviduj
mezeru
     \else
        \let\next=\prectiznak
     \fi
  \fi
  \next}
\def\prectimezeru{\prectiznak\space}
\def\prectiznak#1{%
  \def\protect{}%
  \ifcat\noexpand\znak\relax \let\protect=\noexpand \fi
  \edef\act{\text={\the\text \protect #1}}\act
  \setbox0=\hbox{\the\text}%       zkusi se dat do boxu
  \let\next=\zmer
  \ifdim \wd0<\CoseVejde          %pokud se to vejde, vypise obsah
     \immediate\write16{\the\text}%
  \else \let\next=\dobehni     % uz se nevejde, pozer zbytek vstupu
  \fi
  \next}
\def\dobehni #1\par{}

\zmer Tak \TeX, to bude opravdu zajimave!

\bye

Petr Olsak





More information about the csTeX mailing list