Newsgroup: it.comp.software.tex
Titolo: Espansione in \vbox

Buon giorno a tutti,
                                   mi servirebbe sapere se si può
cambiare il materiale che esce da una \vbox durante \unvcopy.
Precisamente sto facendo una "slide show" con plain pdfTeX.
L'apparizione graduale dei singoli elementi di ogni slide è realizzata
in questo modo: Su ogni pagina faccio \unvcopy255 e poi aggiungo
un'elemento nuovo. Ogni slide è quindi contenuto in tante pagine,
quanti contiene gli elementi. Funziona bene, ma io voglio che gli
elementi "vecchi" (quelli provenienti dalla \unvcopy255) siano resi in
un colore meno chiaro. I colori gli ho fatti per comandi come
\textcolor, a cui sono asegnati colori predefiniti (\let\textcolor
\black). E gli colori predefiniti sono fatti così: \def
\black{\pdfliteral{0 0 0 rg 0 0 0 RG}}.
Qualcuno sa come fare? O almeno dirmi a quale livello è stato espanso
il materiale contenuto in una \vbox? Sapendolo forse troverei un modo
da fare.
Vi ringrazio in anticipo
Tomáš Kučera

 da fare.
Saresti cos� gentile da mostrare un esempio compilabile in modo da
non dover reinventare tutto?
Ciao
Enrico

Certo. Premetto che le definizioni che uso sono molto più complesse.
Ho estratto solo il problema menzionato. Non funziona quindi per
niente per es. la formattazione verticale ecc. La cosa dovrebbe essere
compilabile con semplice "pdftex".
\font\esempio=cmbx10 at 20pt
\esempio
\def\item{\par\hang\textindent}
\long\def\punto#1{\item{--}#1\par}
\def\pause{\output={\unvcopy255\global\output={\slidesoutput}
\slidesoutput}\vfill\eject}
\def\endslide{\vfill\eject}
\def\slidesoutput{%
\shipout\vbox{%
\makeheadline\pagebody\makefootline
}%
\advancepageno
\ifnum\outputpenalty>-20000 \else \dosupereject \fi%
}
\output={\slidesoutput}
\def\red{\pdfliteral{1 0 0 rg 1 0 0 RG}}%
\def\blue{\pdfliteral{0 0 1 rg 0 0 1 RG}}%
\let\textcolor\red
\textcolor %Nel caso di bisogno non sarebbe problema definire il
colore individualmente per ogni elemento dentro la definizione di
\punto.
\pdfcatalog{/PageMode /FullScreen}
%============ L'inizio del testo ==============================
\punto{il primo elemento (in rosso)}\pause
\punto{il secondo}
\punto{e il terzo appariscono insieme (in rosso, ma il primo adesso in
blu)}\pause
\punto{e l'ultimo (in rosso, ma i primi tre ora in blu)}
\endslide
%==========La fine del testo =================================
\bye
Spero che sia auto spiegabile.
Grazie
Tomáš

 Tom�?
Mi dispiace, ma penso che tu ti sia messo in un'impresa piuttosto
complicata. Non me la sento di mettermi a studiare \pdfliteral e
roba simile.
Ciao
Enrico

 roba simile.
In realt� qualcosa credo di averla capita. :-)
\font\esempio=cmbx10 at 20pt
\esempio
%%% le prossime due righe per mettere a posto le
%%% spaziature nell'output
\baselineskip=24pt
\setbox\strutbox=\hbox{\vrule height17pt depth7pt width0pt }
%%%
\def\item{\par\hang\textindent}
\long\def\punto#1{\item{--}\strut#1\strut\par}
\newbox\prevboxa
\newbox\prevboxb
\def\partialoutput{%
  \setbox\prevboxb\vbox{{\blue\unvcopy\prevboxa}{\red\unvcopy 255 }}%
  \global\setbox\prevboxa\vbox{\unvbox\prevboxa\unvbox255 }%
  \shipout\vbox{\unvbox\prevboxb}}
\output={\partialoutput}
\def\pause{\vfill\eject}
\def\endslide{\vfill\eject\setbox0=\vbox{\unvbox\prevboxa}}
\def\red{\pdfliteral{1 0 0 rg 1 0 0 RG}}%
\def\blue{\pdfliteral{0 0 1 rg 0 0 1 RG}}%
\pdfcatalog{/PageMode /FullScreen}
%============ L'inizio del testo ==============================
\punto{il primo elemento (in rosso)}\pause
\punto{il secondo}
\punto{e il terzo appaiono insieme (in rosso, ma il primo adesso in
blu)}\pause
\punto{e l'ultimo (in rosso, ma i primi tre ora in blu)}
\endslide
%==========La fine del testo =================================
\bye
Ciao
Enrico

\pdfliteral non fa niente altro che mettere il suo argomento così come
è nel codice pdf. \pdfliteral{<text>} equivale a \special{pdf:
<text>}.
Credo che la domanda potrebbe essere messa anche così: Come fare che
uno \special non espanda nella \vbox, ma lo faccia dopo di uscirne
durante la \unvcopy?
Poi potrei mettere una \textcolor da espandere nella \vbox, seguita da
un'altra da aspettare fino a \unvcopy. E l'\unvcopy la potrei fare
dopo di ridefinire \textcolor.
Si può mascherare un comando in \vbox in questo modo?
Tomas

Hai risposto mentre scrivevo, il mio italiano non è tanto veloce... Mi
metto a leggere la tua risposta.
Tomáš

Così non funziona:
1) Ogni \pause produce una pagina separata. Ma non è il problema da
risolvere qui.
2) Purtroppo, i comandi \red e \blu non hanno nessun effetto. Credo
che per cambiare il colore a un testo, il comando con il nuovo colore
dovrebbe trovarsi dopo il vecchio, più vicino al testo da ricolorare.
L'ultimo di questi comandi, che precede il testo, avrà alla fine
l'effetto. E i comandi originali (espansi?) sono (o no?) sempre
contenuti nel materiale rilasciato dalla \unvcopy/\unvbox, cioè sono
loro da essere espressi.
Ti ringrazio comunque di dedicarmi il tuo tempo. Se sapessi rispondere
alla mia domanda riformulata (vedi sopra), proverei trovare una via...
Tomáš

 loro da essere espressi.
Io ottengo tre pagine, la prima ha il primo item rosso;
la seconda il primo item blu e secondo e terzo rossi;
la terza ha i primi tre item blu e il quarto rosso.
Mi pare fosse quello che volevi.
Ciao
Enrico

Ti ringrazio tanto! Certo che è quello che volevo! I casini gli ho
combinati io - avevo copiato solo le parti importanti della tua
versione nuova nella mia vecchia - e naturalmente poi mi è scapata una
cosa delle vecchie da cancellare.
Tante grazie ancora una volta!
Ciao
Tomáš