Re: [RISOLTO] Extend Captions

#23733
Up
0
Down
::

Grazie moltissime, è veramente perfetto! Sì, userò \abcname nelle macro, ma almeno nelle definizioni nel preambolo me lo volevo risparmiare se possibile, eheh! Grazie!
Ora confronto permettimi un confronto…
Tua versione CORRETTA:
`\expandafter\let\expandafter\@tempA\csname captions#1\endcsname
\toks0=\expandafter\expandafter\expandafter{%
\expandafter\@tempA\expandafter\def\csname #2name\endcsname{#3}}
\expandafter\xdef\csname captions#1\endcsname{\the\toks0 }`
Versione mia errata:
`\expandafter\let\expandafter\@tempA\csname captions#1\endcsname
\expandafter\let\expandafter\@tempB\csname #2name\endcsname
\toks0=\expandafter{\@tempA\def\@tempB{#3}}
\expandafter\xdef\csname captions#1\endcsname{\the\toks0}`

Ammesso che conosco meno della metà dei comandi che ci sono… ma la differenza a occhio mi sembra solo di alcuni \expandafter in meno, o sbaglio?

Sbagli. Supponendo una chiamata
`\ExtendCaptionsM{italian}{abc}{pippo}`
il tuo codice inserisce alla fine del testo di sostituzione della macro \captionsitalian i token
`\def\@tempB{pippo}`
e non quello che speri tu. Il token \@tempB passa del tutto inalterato e la sua definizione iniziale è di essere del tutto equivalente a \relax (perché, probabilmente, \abcname non è definito).

Con \let rendi equivalente al significato di al momento dell’assegnazione. Nel tuo codice diventa equivalente a un comando costruito con \csname che, se non è definito, è equivalente a \relax.

Quando poi darai \selectlanguage{italian}, LaTeX eseguirà \def\@tempB{pippo} che non serve a nulla. Gli \expandafter che ho usato servono proprio per mettere nella lista di token proprio il comando \abcname.

Proviamo a seguire l’espansione, mettendo “abc” al posto di #2 e la stringa “pippo” al posto di #3:
`\toks0=\expandafter\expandafter\expandafter{%
\expandafter\@tempA\expandafter\def\csname abcname\endcsname{pippo}}`
Siccome dopo \toks0= ci deve essere una graffa, TeX comincia a espandere. Chiamo (i) l’i-esimo \expandafter (i va da 1 a 5).

(1) espande (3) che espande (4) che espande (5) il quale espande \csname; a questo punto abbiamo
`\toks0=\expandafter{\@tempA\def\abcname{pippo}}`
e ora tocca a (2) che espande \@tempA, cioè libera il testo di sostituzione di \captionsitalian.

Ciao
Enrico

Go to top