Classicthesis e comando \font

  • Creatore
    Topic
  • #17647
    lorenzo.pantieri
    Partecipante
      Up
      0
      Down
      ::


      Ciao a tutti. Ho una curiosità. Che cosa fa il comando \font di classicthesis? Il seguente
      `\documentclass{scrreprt}
      \usepackage{classicthesis-ldpkg}
      \usepackage[subfigure]{classicthesis}
      \DeclareRobustCommand*{\font}[1]{#1%
      \index{Font!#1}\index{#1}}
      \begin{document}
      Il font \font{Palatino}.
      \end{document}
      `
      produce l’errore:
      `! You can't use a prefix with `begingroup'.

      begingroup
      `
      D’altra parte, se provo il “semplice” \font senza altre definizioni:
      `\documentclass{scrreprt}
      \usepackage{classicthesis-ldpkg}
      \usepackage[subfigure]{classicthesis}
      \begin{document}
      Il font \font{Palatino}.
      \end{document}
      `
      ottengo comunque un erorre:
      `! Missing control sequence inserted.

      \inaccessible
      l.5 Il font \font{
      Palatino}.
      ?
      `
      Grazie mille,
      L.

    Visualizzazione 5 filoni di risposte
    • Autore
      Risposte
      • #17648
        Up
        0
        Down
        ::

        Ciao a tutti. Ho una curiosità. Che cosa fa il comando \font di classicthesis? Il seguente
        `\documentclass{scrreprt}
        \usepackage{classicthesis-ldpkg}
        \usepackage[subfigure]{classicthesis}
        \DeclareRobustCommand*{\font}[1]{#1%
        \index{Font!#1}\index{#1}}
        \begin{document}
        Il font \font{Palatino}.
        \end{document}
        `
        produce l’errore:
        `! You can't use a prefix with `begingroup'.

        begingroup
        `
        D’altra parte, se provo il “semplice” \font senza altre definizioni:
        `\documentclass{scrreprt}
        \usepackage{classicthesis-ldpkg}
        \usepackage[subfigure]{classicthesis}
        \begin{document}
        Il font \font{Palatino}.
        \end{document}
        `
        ottengo comunque un erorre:
        `! Missing control sequence inserted.

        \inaccessible
        l.5 Il font \font{
        Palatino}.
        ?
        `
        Grazie mille,
        L.

        Ehm, \font è un comando primitivo di TeX, che serve per definire i font da usare.

        Ciao
        Enrico

      • #17649
        lorenzo.pantieri
        Partecipante
          Up
          0
          Down
          ::

          Ehm, \font è un comando primitivo di TeX, che serve per definire i font da usare.

          Perfetto. Per la cronaca, ho optato per
          `\DeclareRobustCommand*{\fonte}[1]{#1%
          \index{Font!#1}%
          \index{#1}}`
          Grazie ancora,
          Lorenzo

        • #17650
          Up
          0
          Down
          ::

          Ehm, \font è un comando primitivo di TeX, che serve per definire i font da usare.

          Perfetto. Per la cronaca, ho optato per
          `\DeclareRobustCommand*{\fonte}[1]{#1%
          \index{Font!#1}%
          \index{#1}}`

          Ridefinire il comando \font non è una buonissima idea, come avrai capito. Per motivi vari, gli sviluppatori di LaTeX hanno deciso che \DeclareRobustCommand non verifichi se il comando è già definito come con \newcommand, ma consultando il log si vede se ciò accade.

          È bene, quando si usa \DeclareRobustCommand andare a vedere ciò che c’è scritto nel log, proprio per non incorrere in problemi del genere: ridefinire una primitiva piuttosto importante come \font fa sballare qualsiasi documento.

          Ciao
          Enrico

        • #17651
          lorenzo.pantieri
          Partecipante
            Up
            0
            Down
            ::

            Ridefinire il comando \font non è una buonissima idea, come avrai capito. Per motivi vari, gli sviluppatori di LaTeX hanno deciso che \DeclareRobustCommand non verifichi se il comando è già definito come con \newcommand, ma consultando il log si vede se ciò accade.

            Bene. Ho definito un comando \fonte (non \font, che mi guardo bene dal toccare!). Ho usato \DeclareRobustCommand* perché funzionasse anche all’interno di argomenti di sezioni, sottosezioni, …

            Visto che siamo in argomento: che differenza c’è tra \DeclareRobustCommand e la sua versione asteriscata?

            Grazie,
            L.

          • #17652
            Up
            0
            Down
            ::

            Visto che siamo in argomento: che differenza c’è tra \DeclareRobustCommand e la sua versione asteriscata?

            Che diamine! La stessa che c’è fra \newcommand e \newcommand*. Quasi.

            Una macro TeX può essere dichiarata \long al momento della definizione; in tal caso è ammesso che all’interno dei suoi argomenti, al momento della chiamata, compaia il token \par. Le definizioni con \newcommand sono tutte di macro \long, quelle con \newcommand* no.

            Analogamente per \DeclareRobustCommand. Con una differenza un po’ sottile. Con \DeclareRobustCommand\pippo{…} e con la versione * si definisce un comando \pippo che non è \long e che non ha argomenti. “Ma come?”, dirai, “Posso ben scrivere \DeclareRobustCommand\pippo[4]{…} e usare i parametri nella definizione.”

            Il fatto è che \DeclareRobustCommand definisce sempre due comandi; nel nostro caso “\pippo” e “\pippo “; noterai che nella seconda ho aggiunto uno spazio: proprio così, la seconda macro definita ha uno spazio nel nome e questa è la macro che può essere \long e avere argomenti.

            L’espansione di primo livello di “\pippo” è proprio “\protect\pippo “. Quando LaTeX scrive sui file ausiliari, il significato di \protect è \noexpand, quindi la macro che segue non viene espansa. Quando invece i file ausiliari vengono letti, il significato di \protect è \relax, cosicché l’espansione di “\pippo” (senza lo spazio) viene eseguita completamente.

            Ricapitoliamo: quando LaTeX incontra “\pippo” nell’argomento di un comando \write, lo espande in “\protect\pippo ” e lo scrive, perché l’espansione è ormai inibita. Quando legge, vede scritto “\protect\pippo” e ignora gli spazi seguenti (ormai quello spazio aggiunto durante la scrittura non fa più parte del nome, perché il file ritorna nel meccanismo di lettura così com’è), ma siccome \protect equivale a \relax, LaTeX espande “\pippo” in “\protect\pippo ” (con lo spazio che stavolta fa parte del nome) ed espande “\pippo ” andando in cerca di eventuali argomenti. I due \protect che valgono \relax sono passati intatti all’interno di TeX, ma tanto non fanno niente.

            Complicato? Un po’, è vero. Come si fa a definire una macro che ha uno spazio nel nome? Con \csname…\endcsname, naturalmente.

            Puoi vedere il meccanismo in azione lanciando una sessione interattiva di LaTeX dal terminale; indico con $ il prompt della shell e con * il prompt di LaTeX (il primo è sempre **)
            `$ latex
            **\relax
            *\DeclareRobustCommand{\pippo}{A}
            *\show\pippo`
            La risposta sarà
            `> \pippo=macro:
            ->\protect \pippo .`
            e ci sono due spazi dopo \pippo: uno è quello del nome, l’altro quello che TeX aggiunge sempre, in questi casi, al nome del comando.

            L’estensione e-TeX prevede un altro prefisso da dare alle macro, oltre ai classici \long, \outer e \global: \protected. Una macro definita (con \def) dando il prefisso \protected non viene espansa quando TeX scrive sui file ausiliari. Questo renderebbe superfluo il ricorso a \DeclareRobustCommand.

            Ciao
            Enrico

          • #17653
            lorenzo.pantieri
            Partecipante
              Up
              0
              Down
              ::


              Enrico, scusa il ritardo con cui ti ringrazio per la tua lezione (l’avevo stampata su carta per studiarla per bene).

              Grazie ancora.

              A presto,
              Lorenzo

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

          Go to top