- Questo topic ha 8 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 18 anni, 4 mesi fa da
MasterMirko.
-
CreatoreTopic
-
20 Aprile 2008 alle 14:52 #23726::
Ciao a tutti… ho un problema.Leggendo l’articolo di Claudio Beccari su arstexnica 1 per i registri token, ho voluto usare quella soluzione per rinominare e creare nuovi nomi da mettere nei captions italian e english.
Il codice a pag 11 purtroppo mi genera circa 35 errori (sostenendo che mancano delimitatori $, errori di spazi verticali e altri). Inoltre ho l’avvertimento che non ho caricato il linguaggio italiano.
Usando semplicemente \addto{\captionsitalian}… ottengo anche qui dei problemi!
Insomma, vorrei trovare il modo per inserire altri nomi da me definiti, così da usarli nel testo.
In babel carico [english,italian] e il documento non ha errori e viene generato correttamente (senza questa nuova funzionalità).Qualcuno sa darmi una mano?
Graize a tutti e buona domenica, ciao ciao
-
CreatoreTopic
-
AutoreRisposte
-
-
20 Aprile 2008 alle 15:06 #23727::
Ciao a tutti… ho un problema.
Leggendo l’articolo di Claudio Beccari su arstexnica 1 per i registri token, ho voluto usare quella soluzione per rinominare e creare nuovi nomi da mettere nei captions italian e english.
Il codice a pag 11 purtroppo mi genera circa 35 errori (sostenendo che mancano delimitatori $, errori di spazi verticali e altri). Inoltre ho l’avvertimento che non ho caricato il linguaggio italiano.
Usando semplicemente \addto{\captionsitalian}… ottengo anche qui dei problemi!
Insomma, vorrei trovare il modo per inserire altri nomi da me definiti, così da usarli nel testo.
In babel carico [english,italian] e il documento non ha errori e viene generato correttamente (senza questa nuova funzionalità).Qualcuno sa darmi una mano?
Non sarebbe meglio fare un esempio del codice che ti dà errore? Ma forse ti sei solo dimenticato di proteggere quel codice con \makeatletter prima e \makeatother dopo.
Ciao
Enrico
-
20 Aprile 2008 alle 15:34 #23728::
Il problema era proprio quello, grazie!
Ora ho scritto
`\makeatletter
\newcommand*\ExtendCaptionsM[3]
{ { \@ifundefined{captions#1}
{ \PackageWarning{prova}%
{ Language option #1 not specified
\MessageBreak
Skipping any redefinition
\MessageBreak
}
}
{ \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}
}
}
}
\makeatother`
In modo da usarlo come
`\ExtendCaptionsM{italian}{preface}{NuovaPrefazione}`
ma non funziona… anche se non dà errori!
Siccome so già di aver fatto qualche stupidata, qualcuno sa aiutarmi?Grazie
-
20 Aprile 2008 alle 16:23 #23729::
Il problema era proprio quello, grazie!
Ora ho scritto
`\makeatletter
\newcommand*\ExtendCaptionsM[3]
{ { \@ifundefined{captions#1}
{ \PackageWarning{prova}%
{ Language option #1 not specified
\MessageBreak
Skipping any redefinition
\MessageBreak
}
}
{ \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}
}
}
}
\makeatother`
In modo da usarlo come
`\ExtendCaptionsM{italian}{preface}{NuovaPrefazione}`
ma non funziona… anche se non dà errori!
Siccome so già di aver fatto qualche stupidata, qualcuno sa aiutarmi?Stai aggiungendo a \captionsitalian i token
`\def\@tempB{NuovaPrefazione}`
che non è proprio utilissimo. Immagino che tu voglia una cosa del genere:primo argomento = lingua
secondo argomento = comando che contenga la “fixed tag”
terzo argomento = la fixed tag nella linguaIl secondo argomento dovrebbe essere proprio un comando: quindi meglio una sintassi come
`\ExtendCaptionsM{italian}{\newprefacename}{Nuova Prefazione}`
e la parte rilevante del codice (cioè il terzo argomento di \@ifundefined) diventa
`\expandafter\let\expandafter\@tempA\csname captions#1\endcsname
\toks0=\expandafter{\@tempA\def#2{#3}}
\expandafter\xdef\csname captions#1\endcsname{\the\toks0 }`
In realtà non ci sarebbe bisogno di \@tempA, con un trucco più bieco.
`\toks0=\expandafter\expandafter\expandafter{%
\csname captions#1\endcsname\def#2{#3}}
\expandafter\xdef\csname captions#1\endcsname{\the\toks0 }`
Il primo \expandafter espande il terzo che espande \csname producendo il token \captionsitalian (se il primo argomento è italian); rimane il secondo che a questo punto espande \captionsitalian, come desiderato.Ciao
Enrico
-
20 Aprile 2008 alle 16:35 #23730::
Perfetto, grazie, così funziona!
Io avevo scelto quella via perché nell’articolo era messo come esercizio per il lettore, ma così mi va bene lo stesso!Io quello che speravo era di fare in modo che il \@tempB diventasse come \VALOREname con il solo VALORE scritto da me quando chiamo la macro, così che dentro essa non dovessi scrivere io \abstractname per esempio, ma solo abstract.
Grazie ancora tante, buona serata!
-
20 Aprile 2008 alle 17:58 #23731::
Perfetto, grazie, così funziona!
Io avevo scelto quella via perché nell’articolo era messo come esercizio per il lettore, ma così mi va bene lo stesso!Io quello che speravo era di fare in modo che il \@tempB diventasse come \VALOREname con il solo VALORE scritto da me quando chiamo la macro, così che dentro essa non dovessi scrivere io \abstractname per esempio, ma solo abstract.
Grazie ancora tante, buona serata!
`\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 }`
Adesso funziona
`\ExtendCaption{italian}{abc}{pippo}`
che aggiunge
`\def\abcname{pippo}`
a \captionsitalian. Ma poi nelle macro dovrai comunque usare \abcname, quindi tanto vale fare meno fatica, non credi?Ciao
Enrico
-
20 Aprile 2008 alle 19:17 #23732::
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?
Grazie ancora, buona serata!
Riepilogo la soluzione:
`\makeatletter
\newcommand*\ExtendCaptionsM[3]
{ { \@ifundefined{captions#1}
{ \PackageWarning{AggiungiCaption}%
{ Language option #1 not specified
\MessageBreak
Skipping any redefinition
\MessageBreak
}
}
{ \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}
}
}
}
\makeatother`
Da usare come:
`\ExtendCaptionsM{}{ }{ }`
Che aggiunge nelle infix string dellala definizione `\ name` che se inserita nel documento produce in output .
-
20 Aprile 2008 alle 19:44 #23733::
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
-
2 Maggio 2008 alle 11:40 #23734
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.