Re: Definire un condizionale come alias di un altro

#90750
Up
0
Down
::

antonio.macrì” post=90295Questo il codice:
`\documentclass{article}

\def\ifciao{\iftrue}

\begin{document}
\ifciao
\typeout{Ciao!}
\fi
\iffalse
\ifciao
Ciao!!
\fi
\fi
\end{document}`

Il primo [tt]\ifciao[/tt] non dà alcun problema. Il secondo, invece, viene completamente saltato e conduce all’errore:
`! Extra \fi.
l.14 \fi

? `

Il primo [tt]\ifciao[/tt] viene valutato sempre, in quanto esterno, mentre il secondo, che è annidato dentro un altro condizionale falso, sembra essere sbrigativamente saltato da TeX. Perché avviene ciò? Se ci metto un qualsiasi condizionale dichiarato con [tt]\newif[/tt] funziona correttamente.

Secondo quale regola TeX salta il corpo di un condizionale falso? O meglio (ci sono sul fatto che pensa solo a bilanciare i condizionali annidati): secondo quale criterio TeX determina se una sequenza di controllo incontrata è un condizionale? Flag interni (praticamente una valutazione a livello di stomaco)? Credevo che il tutto avvenisse a un livello piuttosto superficiale, già sulle “labbra” (per esempio che venissero saltate le macro che iniziano con [tt]\if[/tt]).

Il mio obiettivo originario era definire un condizionale come alias di un altro, da qui l’uso del [tt]\def[/tt]. Mi sembra di aver visto altri esempi di definizione di condizionali in questo modo: devo dedurre che in tutti quei casi si suppone di non annidare i condizionali?

Occorre ricordare che quando TeX scarta i token corrispondenti a un ramo di un condizionale non esegue alcuna espansione, ma si limita a tenere conto dei condizionali che incontra. Nel primo esempio, [tt]\ifciao[/tt] viene espanso e quindi TeX trova
`\iftrue\typeout{Ciao!}\fi`
che sa bene come gestire.

Nel secondo caso
`\iffalse\ifciao Ciao!!\fi\fi`
il condizionale è falso, quindi il ramo vero è tutto ciò che va fino al primo [tt]\else[/tt] o, se mancante, al primo [tt]\fi[/tt]. Perciò il passo successivo dell’espansione lascia
`\fi\fi`
Il primo sparisce perché TeX sa di aver espanso il condizionale [tt]\iffalse[/tt]; il secondo è di troppo. Se invece fosse
`\iftrue\ifciao Ciao!!\fi\fi`
TeX terrebbe tutto e, eliminato [tt]\iftrue[/tt] troverebbe [tt]\ifciao[/tt] che espanderebbe prima di aver “visto” [tt]\fi[/tt].

Solo con
`\let\ifciao\iftrue`
daresti a [tt]\ifciao[/tt] lo stato di vero condizionale. E infatti, quando esegui [tt]\newif\ifpippo[/tt], le macro definiscono
`\let\ifpippo\iffalse
\def\pippotrue{\let\ifpippo\iftrue}
\def\pippofalse{\let\ifpippo\iffalse}`

Ciao
Enrico

Go to top