Giusto, c’è anche a pag. 422.
Grazie per l’aiuto, la soluzione è perfetta.
Mi spieghi un paio di cose?
Cosa ci fa quel gruppo, cioè questo
`{\obeylines \gdef\copyans#1
{\def\next{#1}%
\ifx\next\empty\let\next=\endgroup %
\else\immediate\write\ans{\next} \let\next=\copyans\fi\next}} `“sospeso a mezz’aria”? Non è all’interno di nessun comando!
Si sta definendo la macro \copyans con l’argomento delimitato da un carattere ^^M attivo, \obeylines serve a quello. La macro \setupcopy ridà poi \obeylines in modo che \copyans sia valutata nel modo corretto. Ciò che fa \copyans è raccogliere ciò che sta da lì alla fine della riga e scriverla sul file ausiliario. Per questo serve la riga vuota: se l’argomento è vuoto, infatti, si esegue \endgroup che fa finire tutta la faccenda.
La definizione di \copyans va dentro un gruppo per evitare che l’azione di \obeylines si propaghi senza rimedio e infatti è data tramite \gdef.
e poi perché il loop
`\@tempcnta=128
\loop\ifnum\@tempcnta<256
\catcode\@tempcnta=12
\advance\@tempcnta\@ne
\repeat`
dentro \setupcopy, o meglio \ex@sanitize?Ma il loop non è sempre positivo? Non si rimane lì per sempre?o quel catcode risolve tutto? Non potevi scrivere come scritto in manmac.tex cioè \catcode`\|=\other?
No, il \loop cambia in 12 il codice di categoria di tutti i caratteri da 128 a 255. È importante perché il pacchetto inputenc li rende attivi e questo impedirebbe di scriverli sul file delle risposte. Facendoli diventare di categoria 12, saranno scritti tali e quali, ma quando \inputanswers causa la lettura del file delle risposte avranno la categoria giusta.
Ciao
Enrico