Sam Qasbah” post=64466Salve a tutti.
Invece di accapigliarvi in dispute teoriche sulla classe memoir, dedicate qualche minuto a risolvere un problema con l’uso dell’antico linguaggio di Knuth.
All’inizio di un pacchetto si stile, che necessita di essere usato con XeTeX, ho inserito il seguente controllo sul motore in uso:
`
\expandafter\ifx\csname XeTeXrevision\endcsname\relax%
\let\@@endinput\endinput%
\errmessage{Ahi ahi, nothing to do.}\fi%
\csname @@endinput\endcsname%
…
`Il meccanismo sembra non fare una grinza, eppure non funziona. Provato su TeXworks con pdfTeX il motore continua bellamente a leggere le istruzioni successive, naturalmente sollevando errori e bloccando la compilazione invece di fermarsi al \csname @@endinput\endcsname e interrompere la lettura del pacchetto.
Dove cavolo sbaglio?
Se prima non dichiari “\catcode`@=11”, stai semplicemende dicendo “\let\@=@”, che non è molto utile; e “\@@endinput” non è definito. Infatti pdftex stampa “endinput”, trova “\endinput” ed esce dal file; ti trovi un condizionale non finito.
Il metodo corretto è
`\expandafter\ifx\csname XeTeXrevision\endcsname\relax
\errmessage{Ahi ahi, nothing to do.}%
\expandafter\endinput
\fi`
Puoi evitare \expandafter se metti \fi subito dopo \endinput, perché TeX comunque legge tutta la riga prima di eseguire \endinput.
Oppure con il tuo metodo, ma con la riga
`\expandafter\let\csname @@endinput\endcsname\endinput`
perché dentro \csname…\endcsname i codici di categoria sono ignorati (a parte 0, 9, 13, 14 e 15 per motivi che puoi immaginare).
Ciao
Enrico