Re: sapthesis: una classe per le tesi di dottorato in Fisica

#28078
Up
0
Down
::

Grazie mille Enrico!

Ti darò il 100% delle royalties*!

Ieri sera, sulla scia di un vecchio post dove mi spiegavi l’uso di \if, avevo trovato una soluzione simile:
`\newcommand{\advisor}[1]{\advance\SAP@advisorcount\@ne
\if?\the\SAP@advisortoks?
\SAP@advisortoks=\expandafter{#1}%
\else
\SAP@advisortoks=\expandafter{\the\SAP@advisortoks\\[0.75mm]#1}%
\fi}
`
Dato che rinuncio alle royalties, ne approfitto per chiederti due cose che immagino
siano correlate:

1. Perché il mio \if non funziona usando solo \SAP@advisortoks e invece funziona
con \the\SAP@advisortoks?

Perché \if espande ciò che segue fino a quando trova due token non espandibili; “?” non è espandibile e nemmeno \SAP@advisortoks. Invece \the è espandibile e la sua espansione consiste, in questo caso, nella lista di token contenuta nel registro \SAP@advisortoks.

Tutti i token definiti con \chardef, \mathchardef, \countdef, \dimendef, \skipdef, \toksdef \font (e qualche altro che mi dimentico e non ho voglia di cercare) sono non espandibili, a differenza di quelli definiti con \def, \gdef, \edef e \xdef.

Il test (con \the, naturalmente) dà “vero” quando il registro toks è vuoto (oppure quando il contenuto del registro comincia con “?” che è, in questo contesto, improbabile). Ma non vale la pena di rischiare quando abbiamo il test numerico che evita le sottigliezze di \if.

2. Come vedi ho messo gli \expandafter a caso 😀 Nella prima riga è inutile.
Cosa fa invece l’\expandafter nella seconda riga? È necessario perché c’è il \the?

La sintassi di un’assegnazione al registro toks \pippo è
`\pippo={}`
e, secondo le regole generali, TeX espande tutto ciò che segue = fino a trovare una graffa (esplicita o implicita). Perciò il codice
`\def\pluto{\bgroup abc}
\pippo=\pluto def}`
è lecito ed equivale all’assegnazione
`\pippo={abcdef}`
Più utilmente,
`\pippo=\expandafter{\the\pippo xyz}`
fa in modo che \expandafter faccia il suo lavoro prima che TeX veda la graffa di apertura; e il lavoro è di espandere il token dopo la graffa, quindi liberando il contenuto del registro \pippo. L’assegnazione
`\pippo={\the\pippo xyz}`
darebbe un disastro quando si scriva “\the\pippo” per usare il contenuto del registro: otterremmo
`\the\pippo xyz`
che espanderebbe \the dando
`\the\pippo xyzxyz`
che espanderebbe \the …

Dovrebbe esserti chiaro perché \expandafter nel primo caso è inutile.

* Che però sono pari a zero 😛 A proposito, royalties è un’altra parola da aggiungere alla questione singolare-plurale dei termini stranieri!

Infatti ho messo la parola in corsivo. 🙂 E mi dai proprio una cattiva notizia, pensavo di diventare ricco con le copiose royalties versate dai numerosissimi dottorandi che useranno la classe. 🙂

Ciao
Enrico

Go to top