Re: \catcode e scrittura su file di caratteri speciali.

#63304
Up
0
Down
::

Sam Qasbah” post=62234Salve a tutti. Il quesito è molto `low level’, ma so che qui più d’uno sarà in grado di aiutarmi.

Non riesco a comprendere appieno un meccanismo di TeX relativo alla modifica del category code di alcuni tokens.

Parto dalla macro presente in Salomon, “The Advanced TeXbook”, pag. 202, che riporto. Lo scopo della macro è di scrivere su file i caratteri speciali come $, %, &, \, ecc.

`
\newwrite\out
\immediate\openout\out=filename

\def\VwriteA{\begingroup\sanitize\aux}
\def\aux#1{\write\out{#1{\folio}\endgroup}

\def\makeother#1{\catcode`#1=12\relax}
\def\sanitize{\makeother\ \makeother\\\makeother\$\makeother\&%
\makeother\#\makeother\_\makeother\%\makeother\~\makeother\|}
`

Orbene, arrivato al terzo rigo TeX espande \sanitize modificando anche il codice di categoria della barra rovescia, facendolo diventare 12 (other). Questo dovrebbe significare che, da quel momento in poi, TeX non può più essere in grado di riconoscere, all’interno del blocco \begingroup..\endgroup, le susseguenti sequenze di controllo in quanto non trova più tokens di categoria 0 (escape). E quindi non dovrebbe riconoscere nè espandere la sequenza “\aux” in quanto questa, nella lista di tokens `masticata’ sequenzialmente da TeX, subisce l’effetto delle modifiche appena effettuate da \sanitize.

Questo ragionamento sembra corretto, ma si scontra col fatto che la macro funziona, e quindi è ben scritta.

Ho la sensazione che il mio errore derivi da una confusione sulla fisiologia di TeX, ovvero sul `dove’ avvengono le varie operazioni di espansione tra bocca, esofago e stomaco.

In conclusione la domanda è: come mai, nella macro riportata, TeX espande correttamente \aux pur avendo appena modificato il codice di categoria della barra rovescia da 0 a 12?

Grazie, ciao.

Quando TeX digerisce una definizione la trasforma in una lista di token che non sono più dipendenti dalla “sequenza di caratteri” necessaria per esprimerli. In altre parole quando TeX ha bisogno di espandere \VwriteA va a prendere la definizione in memoria in cui la lista di token relativa è in formato “interno” e quindi il codice di categoria di \ non ha alcuna importanza.

Ciao
Enrico

Go to top