Curiosità

  • Creatore
    Topic
  • #50271
    ernded
    Partecipante
      Up
      0
      Down
      ::


      Una volta si parlava di comandi LaTeX “robusti” e “fragili” e c’era il comando \protect per rendere robusto un comando fragile e ricordo anche che i comandi “fragili” non erano pochissimi:

      1) Perché alcuni comandi si “rompevano”? Che cosa vuol dire?

      2) Ora non se ne sente più parlare perché le nuove versioni hanno risolto il problema o per qualche altro motivo?
      Grazie
      Ernesto

    Visualizzazione 3 filoni di risposte
    • Autore
      Risposte
      • #50272
        Up
        0
        Down
        ::

        Una volta si parlava di comandi LaTeX “robusti” e “fragili” e c’era il comando \protect per rendere robusto un comando fragile e ricordo anche che i comandi “fragili” non erano pochissimi:

        1) Perché alcuni comandi si “rompevano”? Che cosa vuol dire?

        2) Ora non se ne sente più parlare perché le nuove versioni hanno risolto il problema o per qualche altro motivo?

        Quando TeX scrive su un file ausiliare, esegue l’espansione completa delle macro che incontra. Facciamo l’esempio di un input come
        `\chapter{Pippo \textit{va} al mare}`
        Fra i vari mestieri di \chapter c’è di scrivere sul file .aux e sul .toc il titolo del capitolo. Qui nasce il problema: l’espansione di \textit{va} sarebbe
        `\ifmmode
        \nfss@text{\itshape va}%
        \else
        \hmode@bgroup\text@command {va}\itshape\check@icl va\check@icr
        \expandafter \egroup
        \fi`
        e ancora ci sarebbe da espandere; ma proprio qui è uno dei problemi, sebbene nel caso in esame non sia rilevante. Il condizionale \ifmmode sarebbe espanso a sua volta e nel momento sbagliato: durante la scrittura e non durante la composizione.

        LaTeX originale risolveva il problema con \protect che assume significati diversi quando si compone il testo e quando invece si scrive su file ausiliari; nel primo caso vale \relax (cioè non fa nulla), nel secondo vale \noexpand il cui effetto è di inibire l’espansione del token che lo segue. Perciò un ipotetico \chapter{Pippo \protect\textit{va} al mare} farebbe scrivere nel file ausiliario
        `Pippo \textit {va} al mare`
        come desiderato (nota che il nome del comando è seguito, secondo le regole, da uno spazio).

        LaTeX2e risolve il problema in modo diverso, che ho già spiegato qui un paio di volte. Non per tutti i comandi, ma per quelli che sono maggiormente indiziati di andare in un titolo di sezione. Con il trucco escogitato ciò che viene scritto nel file ausiliario da \chapter{Pippo \textit{va} al mare} è
        `Pippo \textit {va} al mare`
        Qui il nome del comando è seguito da due spazi! Il trucco sta qui. 🙂 Cerca “\protect” nel forum per trovare la spiegazione, è un filone abbastanza recente.

        Con le estensioni e-TeX, che ormai sono usate quando si compila con latex o pdflatex, c’è un altro sistema a disposizione. Sarà quello impiegato da LaTeX3: il segreto si chiama \protected\def, ma la spiegazione sarebbe troppo lunga. Storia analoga a quella del margine troppo stretto: “Hanc marginis exiguitas non caperet”. 😉

        Ciao
        Enrico

      • #50273
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          I comandi fragili si rompevano perché in certe situazioni il loro sviluppo cominciava al momento sbagliato e quindi non facevano quello che dovevano producendo spesso degli errori “fatali”.

          Per rendere robusti i comandi si usava protect, ma ancora talvolta non bastava.

          In LaTeX2e a seconda dei comandi che potrebbero avere per argomento un comando da eseguire al momento giusto (potenzialmente fragile) si definiscono diversi livelli di protezione, non solo uno, al punto che talvolta anche lo stesso \protect viene protetto. È diffcile dare esempi senza scendere nei dettagli, ma se apri latex.ltx e cerchi la stringa protect (senza backslash) troverai molti “sinonimi’ tipo \write@protect, \edef@protect (cito a memoria) ognuno di quali protegge quel che deve proteggere in un modo diverso.

          Il LaTeX3 Team sta facendo il possibile per eliminare i comandi fragili; dicono che ce ne è ancora qualcuno quindi anche loro non li hanno trovati tutti; tuttavia se ti scrivi delle macro può succedere facilmente che non proteggi abbastanza le tue macro subalterne o che la tua macro bella e comodissima alla fine risulti fragile.

          Ecco perché una quantità di comandi in latex.ltx sono definiti con \DeclareRobustCommand invece che con \def come succedeva nelle prime versioni nel 1994 e come succedeva sempre con il nucleo di LaTeX209, quello che è stato sostituito da LaTeX2e.

          Nota che \def in LaTeX2e è sostituito da \newcommand, che non fa molto di più di \def, salvo, importantissimo, controllare che il nuovo comando sia effettivamente non ancora definito e la sua struttura (il suo nome) non possa andare in conflitto con i comandi del nucleo di LaTeX. Quindi i comandi definiti con \newcommand potrebbero risultare fragili a seconda di che cosa sono chiamati a fare e, specialmente, quando.

        • #50274
          Up
          0
          Down
          ::

          I comandi fragili si rompevano perché in certe situazioni il loro sviluppo cominciava al momento sbagliato e quindi non facevano quello che dovevano producendo spesso degli errori “fatali”.

          Per rendere robusti i comandi si usava protect, ma ancora talvolta non bastava.

          In LaTeX2e a seconda dei comandi che potrebbero avere per argomento un comando da eseguire al momento giusto (potenzialmente fragile) si definiscono diversi livelli di protezione, non solo uno, al punto che talvolta anche lo stesso \protect viene protetto. È diffcile dare esempi senza scendere nei dettagli, ma se apri latex.ltx e cerchi la stringa protect (senza backslash) troverai molti “sinonimi’ tipo \write@protect, \edef@protect (cito a memoria) ognuno di quali protegge quel che deve proteggere in un modo diverso.

          Il LaTeX3 Team sta facendo il possibile per eliminare i comandi fragili; dicono che ce ne è ancora qualcuno quindi anche loro non li hanno trovati tutti; tuttavia se ti scrivi delle macro può succedere facilmente che non proteggi abbastanza le tue macro subalterne o che la tua macro bella e comodissima alla fine risulti fragile.

          Ecco perché una quantità di comandi in latex.ltx sono definiti con \DeclareRobustCommand invece che con \def come succedeva nelle prime versioni nel 1994 e come succedeva sempre con il nucleo di LaTeX209, quello che è stato sostituito da LaTeX2e.

          Nota che \def in LaTeX2e è sostituito da \newcommand, che non fa molto di più di \def, salvo, importantissimo, controllare che il nuovo comando sia effettivamente non ancora definito e la sua struttura (il suo nome) non possa andare in conflitto con i comandi del nucleo di LaTeX. Quindi i comandi definiti con \newcommand potrebbero risultare fragili a seconda di che cosa sono chiamati a fare e, specialmente, quando.

          Aggiungo una curiosità. I tipici comandi fragili di LaTeX2.09 erano quelli con argomento opzionale. Con la ridefinizione di \newcommand per ammettere la possibilità di un argomento opzionale, LaTeX2e ha ottenuto che i comandi così introdotti sono automaticamente robusti, purché abbiano un argomento opzionale!
          `\newcommand{\pippo}[1]{…} % non necessariamente robusto
          \newcommand{\pluto}[2][…]{…} % sicuramente robusto`
          Ciao
          Enrico

        • #50275
          ernded
          Partecipante
            Up
            0
            Down
            ::


            Molto interessante, grazie a Enrico e Claudio
            ciao
            Ernesto

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

        Go to top