[RISOLTO] Extend Captions

  • Creatore
    Topic
  • #23726
    Up
    0
    Down
    ::


    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

Visualizzazione 7 filoni di risposte
  • Autore
    Risposte
    • #23727
      Up
      0
      Down
      ::

      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

    • #23728
      Up
      0
      Down
      ::


      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

    • #23729
      Up
      0
      Down
      ::

      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 lingua

      Il 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

    • #23730
      Up
      0
      Down
      ::


      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!

    • #23731
      Up
      0
      Down
      ::

      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

    • #23732
      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?

      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 della la definizione `\name` che se inserita nel documento produce in output .

    • #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

    • #23734
      Up
      0
      Down
      ::


      Ho visto solo ora la spiegazione…

      Davvero molto chiara, grazie di tutto e buona giornata!

Visualizzazione 7 filoni di risposte
  • Devi essere connesso per rispondere a questo topic.

Go to top