Suppongo che tu non abbia davvero provato, perché \der[2]{f}{x} e \der{f}{x} danno esattamente lo stesso risultato.
Ammetto le mie colpe 🙁 Domani ho la consegna della tesi di dottorato e non sono molto lucido…
Scusa validissima! In bocca al lupo!
Il condizionale \if è una brutta bestia.
Ho notato! Avevo preferito quello perché mi sono detto “È un comando basilare di TeX, funzionerà in maniera velocissima. Oltretutto devo solo verificare che un parametro è vuoto!”
Solo che poi ho pasticciato prendendo un pezzo di qua e un pezzo di là.
E infatti quella costruzione non è da nessuna parte 🙁
È infatti un comando molto utile, purché si sappia come funziona; e il funzionamento è poco intuitivo, ma così si possono ottenere effetti molto vari.
`\if?#1?\else^{#1}\fi`
Era così semplice!
Era scritto chiaramente nell’Introduzione, così come l’altro
esempio per i comandi espandibili. Scusa la distrazione 🙁
Vabbè almeno ora ho capito (almeno credo) quella sezione.
Be’, semplice forse no. 🙂 Quello che va tenuto presente è che i condizionali \if, \ifcat e \ifx confrontano due token (in modo diverso) e che #1 in una definizione può rappresentare una lista di numerosi token. Quindi anche \ifx#1\@empty non è sufficiente.
Esiste anche un altro metodo, trovato dal solito Heiko Oberdiek:
`\expandafter\ifx\expandafter\relax\detokenize{#1}\relax
<#1 è vuoto>%
\else
<#1 non è vuoto>%
\fi`
L’espansione del comando \detokenize (che è una delle estensioni e-TeX) è la lista di token data come argomento al comando, ma come caratteri di categoria 12 (è una generalizzazione di \string); se #1 non è vuoto, \ifx confronta \relax con il primo carattere prodotto da \detokenize che ovviamente non può essere \relax. Succede allora come con \if!#1!, tutto ciò che segue fino a \else è ignorato. Se invece #1 è vuoto, \ifx confronta \relax con \relax e il test è vero!
Per esempio, l’espansione di \detokenize{\abc\def} è la successione di caratteri di categoria 12 \abc\def; lo stesso effetto si potrebbe ottenere con una macro ricorsiva che mette sempre dopo di sé \string fino a quando incontra una “sentinella”, ma certo una primitiva è più efficiente.
Devo ricordarmi di aggiungerlo all’Introduzione.
Ciao
Enrico