Ridefinire comando con parametri usando il comando stesso

  • Creatore
    Topic
  • #27991
    Up
    0
    Down
    ::


    Ciao a tutti,

    mi sto divertendo a creare una classe personalizzata a partire dalla classe book.

    Il problema delle testatine dopo un \chapter*{…} è ben noto ed è ben nota anche la soluzione: \markboth{…}{…}

    Ho provato, senza successo, a ridefinire \chapter* per far sì che il \markboth venga dato in automatico. Ecco un esempio (ovviamente non funzionante…) per dare l’idea di ciò che sto cercando di fare:

    `
    \newcommand{\origchapter}[2][]{}
    \let\origchapter\@chapter
    \newcommand{\newchapter}[2][]{\origchapter{#1}{#2} \markboth{#2}{#2}}
    \let\@chapter\newchapter
    `

    Credo che questo problema ricada nel caso più generale di ridefinire un comando con parametri usando la definizione precedente del comando stesso.

    Spero possiate aiutarmi.
    Grazie mille.

Visualizzazione 2 filoni di risposte
  • Autore
    Risposte
    • #27992
      Up
      0
      Down
      ::

      Ciao a tutti,

      mi sto divertendo a creare una classe personalizzata a partire dalla classe book.

      Il problema delle testatine dopo un \chapter*{…} è ben noto ed è ben nota anche la soluzione: \markboth{…}{…}

      Ho provato, senza successo, a ridefinire \chapter* per far sì che il \markboth venga dato in automatico. Ecco un esempio (ovviamente non funzionante…) per dare l’idea di ciò che sto cercando di fare:

      `
      \newcommand{\origchapter}[2][]{}
      \let\origchapter\@chapter
      \newcommand{\newchapter}[2][]{\origchapter{#1}{#2} \markboth{#2}{#2}}
      \let\@chapter\newchapter
      `

      Credo che questo problema ricada nel caso più generale di ridefinire un comando con parametri usando la definizione precedente del comando stesso.

      Spero possiate aiutarmi.

      Il comando \chapter per prima cosa controlla se è seguito dall’asterisco:
      `\newcommand\chapter{…
      \secdef\@chapter\@schapter}`
      Il comando che viene eseguito se c’è l’asterisco è \@schapter, che ha un solo argomento. Direi che la cosa da fare è
      `\let\orig@schapter\@schapter
      \def\@schapter#1{\orig@schapter{#1}\markboth{#1}{#1}}`
      Nel tuo codice ci sono vari errori, ma temo che sarebbe troppo lungo analizzarli tutti. La prima riga, in ogni caso, è perfettamente inutile. E \@chapter non ha due parametri come li immagini tu.

      Ciao
      Enrico

    • #27993
      Up
      0
      Down
      ::


      Sì, ho sbagliato tutto… non sono stato capace di capire il file book.cls 😥

      In effetti la prima riga è praticamente inutile però dovrebbe controllare se il comando \orig@schapter esiste già. (Lo consigli anche tu negli “Appunti di programmazione in LaTeX e TeX” a cavallo tra la pagina 15 e la pagina 16. Volevo fare il preciso!)

      Credo che userò la seguente ridefinizione nella mia classe, a meno che ci sia un motivo particolare per usare \def al posto di \renewcommand.
      `
      \newcommand{\orig@schapter}[1]{}
      \let\orig@schapter\@schapter
      \renewcommand{\@schapter}[1]{\orig@schapter{#1}\markboth{#1}{#1}}
      `

      Grazie per tutto il tempo che dedichi al Forum!
      Ciao!

    • #27994
      Up
      0
      Down
      ::

      Sì, ho sbagliato tutto… non sono stato capace di capire il file book.cls 😥

      In effetti la prima riga è praticamente inutile però dovrebbe controllare se il comando \orig@schapter esiste già. (Lo consigli anche tu negli “Appunti di programmazione in LaTeX e TeX” a cavallo tra la pagina 15 e la pagina 16. Volevo fare il preciso!)

      Credo che userò la seguente ridefinizione nella mia classe, a meno che ci sia un motivo particolare per usare \def al posto di \renewcommand.
      `
      \newcommand{\orig@schapter}[1]{}
      \let\orig@schapter\@schapter
      \renewcommand{\@schapter}[1]{\orig@schapter{#1}\markboth{#1}{#1}}
      `

      Non è certo sbagliato eseguire quel controllo, ma in quel modo è particolarmente inefficiente e basta \newcommand{\orig@schapter}{}; un comando con argomento opzionale ne definisce in realtà due (o forse tre).

      L’uso di \def è per velocizzare la faccenda, quando si sa che il comando non è definito oppure ne stiamo scientemente ridefinendo uno.

      Ciao
      Enrico

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

Go to top