Dunque,
volendo utilizzare macro con argomenti delimitati, per esempio una coppia di valori separati da un punto e virgola, scriverò:`
\def\test#1;#2{\def\one{#1}\def\two{#2}}`Se poi vado a vedere l’applicazione:`\test pippo;pluto
\one\two`come mai il secondo argomento consiste di un solo carattere?
Naturalmente se metto un delimitatore finale, il secondo argomento viene letto per intero.
Immagino che sia il comportamento stantard di TeX, ma se qualcuno mi può dare qualche spiegazione TeXnica in più gli sarei grato.
ByeLa macro \test ha due argomenti, il primo delimitato (da ;), il secondo non delimitato che quindi obbedisce alle regole usuali: è il primo token trovato o, se questo token è una graffa aperta (più precisamente un carattere di categoria 1), tutto ciò che va dalla graffa aperta alla graffa chiusa che la bilancia.
L’argomento denotato da #k (k è una cifra da 0 a 9) è delimitato quando nel
della definizione è seguito da un token che non è l’indicatore di parametro successivo (se k=1, per esempio, l’indicatore di parametro successivo è #2) o dalla graffa che introduce il .
è, più o meno, la sintassi per un comando
, cioè \def, \edef, \gdef o \xdef; è il comando da definire (un token simbolico o un carattere attivo); è una qualsiasi lista di token dove sono ammessi token di tipo speciale, cioè gli indicatori di parametro. Prima di #1 possono esserci altri token, ma questi “delimitano il comando”, non l’argomento. Ciao
Enrico
Capito.
Del resto se TeX non si fermasse ad un solo token (salvo parentesi graffe), non saprebbe quando fermarsi a leggere l’argomento.
Capisco anche perché al comando \newcommand è possibile specificare il
esempio:`\newcommand\mycmd[1]{something with #1})`
Immagino che se non metto le parentesi graffe a circondare un argomento con un solo token, TeX svolga il suo lavoro più velocemente, anche se la sintassi del linguaggio in questo caso produce qualche tipo di incoerenza (la regola “delimitare un argomento obbligatorio con le graffe” può essere disattesa):
`\newcommand{\mycmd}[1]{something with #1}
\newcommand\mycmd[1]{something with #1}`
Grazie delle informazioni!