Scoprire la definizione di una macro in LaTeX

  • Questo topic ha 3 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 16 anni fa da rodimus.
  • Creatore
    Topic
  • #49288
    Up
    0
    Down
    ::


    Ciao a tutti,
    quando si desidera conoscere la definizione di una macro in TeX, è sufficiente avviare il relativo programma senza argomenti e interrogarlo mediante l’istruzione «\show». Ad esempio, per conoscere la definizione della macro «\TeX» basta avviare una finestra di terminale, digitare prima

    `tex
    `
    e successivamente

    `\show\TeX
    `
    La risposta del sistema sarà

    `> \TeX=macro:
    ->T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX.
    `
    Domanda: è possibile fare la stessa cosa con LaTeX? Lo chiedo perché se avvio [pdf]latex usando l’istruzione «\show» per conoscere la definizione di una macro del linguaggio, come ad esempio «\LaTeX», ottengo in risposta solamente

    `> \LaTeX=macro:
    ->\protect \LaTeX .
    `
    In realtà non è che mi interessi conoscere la definizione di quella macro specifica, in quanto:

    1. la si scopre subito con Google;

    2. robitex ha comunque già spiegato che è sufficiente rintracciare la sezione «Logos» all’interno del documento «source2e.pdf» per conoscerla;

    3. esistono altri modi (più o meno efficaci) per cercarla (es. richiamare grep ricorsivamente sull’albero di sistema e cercare i pattern «\def» o «\newcommand» seguiti dalla macro in questione).

    Quello che mi interessa sapere, piuttosto, è se esiste un’istruzione specifica per LaTeX che abbia lo stesso significato di «\show» per TeX.

    Grazie mille e a presto.

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

      Ciao a tutti,
      quando si desidera conoscere la definizione di una macro in TeX, è sufficiente avviare il relativo programma senza argomenti e interrogarlo mediante l’istruzione «\show». Ad esempio, per conoscere la definizione della macro «\TeX» basta avviare una finestra di terminale, digitare prima

      `tex
      `
      e successivamente

      `\show\TeX
      `
      La risposta del sistema sarà

      `> \TeX=macro:
      ->T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX.
      `
      Domanda: è possibile fare la stessa cosa con LaTeX? Lo chiedo perché se avvio [pdf]latex usando l’istruzione «\show» per conoscere la definizione di una macro del linguaggio, come ad esempio «\LaTeX», ottengo in risposta solamente

      `> \LaTeX=macro:
      ->\protect \LaTeX .
      `
      In realtà non è che mi interessi conoscere la definizione di quella macro specifica, in quanto:

      1. la si scopre subito con Google;

      2. robitex ha comunque già spiegato che è sufficiente rintracciare la sezione «Logos» all’interno del documento «source2e.pdf» per conoscerla;

      3. esistono altri modi (più o meno efficaci) per cercarla (es. richiamare grep ricorsivamente sull’albero di sistema e cercare i pattern «\def» o «\newcommand» seguiti dalla macro in questione).

      Quello che mi interessa sapere, piuttosto, è se esiste un’istruzione specifica per LaTeX che abbia lo stesso significato di «\show» per TeX.

      Grazie mille e a presto.

      Il metodo per “irrobustire” una macro usato da LaTeX2e è piuttosto ingegnoso. Il problema della robustezza si ha quando occorre scrivere su file ausiliari e un’intempestiva espansione può creare errori in lettura.

      Che hanno ideato dunque Mittelbach e soci? La macro “\LaTeX” è definita come “\protect\LaTeX “. C’è una differenza sostanziale fra “\LaTeX” e \LaTeX “: il nome della seconda macro termina con uno spazio! Lo si vede bene dall’output di \show: ogni nome di sequenza di controllo è seguito da uno spazio, si guardi \show\TeX; nel caso di \show\LaTeX è piuttosto evidente che dopo la X ci sono due spazi: il primo fa parte del nome.

      Supponiamo che “\LaTeX” compaia in un titolo di capitolo e quindi vada scritto sul file .toc; in queste situazioni TeX esegue l’espansione completa, quindi avremo

      “\LaTeX” -> “\protect\LaTeX ” -> “\LaTeX ”

      e solo quest’ultimo token viene scritto sul file ausiliario (spazio compreso), perché in tali situazioni \protect significa \noexpand, la cui espansione è nulla, ma ha come effetto di rendere inespandibile il token che segue. Poco male, perché quando il .toc verrà letto, LaTeX vedrà solo “\LaTeX” seguito da due spazi che sono del tutto irrilevanti.

      Se invece “\LaTeX” viene trovato durante la composizione di testo normale, \protect vale \relax, quindi sarà espanso “\LaTeX “.

      Come vedere la definizione di “\LaTeX “? Facile. 🙂
      `\expandafter\show\csname LaTeX \endcsname`
      In questo modo si fornisce a TeX il token giusto, cioè quello il cui nome è “\LaTeX “, impossibile da scrivere altrimenti. Infatti \expandafter causa l’espansione di \csname, la cui funzione è proprio di costruire un token simbolico con i caratteri fino a \endcsname, senza tener conto dei codici di categoria. La definizione di \LaTeX è data con \DeclareRobustCommand{\LaTeX}{…} che equivale, in soldoni, a due definizioni:
      `\expandafter\def\expandafter\LaTeX\expandafter{%
      \expandafter\protect\csname LaTeX \endcsname}
      \expandafter\def\csname LaTeX \endcsname{…}`
      Un pochino più complesso è vedere il significato di un comando con argomento opzionale definito tramite \newcommand; per esempio
      `\show\qbezier
      > \qbezier=macro:
      ->\@protected@testopt \qbezier \\qbezier {0}.`
      Qui il funzionamento è simile: quando si è durante la scrittura di un file ausiliario, \@protected@testopt fa sì che solo \qbezier sia scritto, ignorando il resto. Altrimenti \qbezier viene ignorato e si espande “\\qbezier”: con due barre rovesce! La prima è la solita, la seconda fa parte del nome. Soluzione:
      `\expandafter\show\csname\string\qbezier\endcsname`
      Ciao
      Enrico

    • #49290
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Certo, la macro è sempre \show, ma (pdf)latex generalmente protegge i comandi fragili, che invece con (plain) tex non sono protetti.

        la cosa è delicata: per diversi motivi, comprensibili a posteriori, un comando \pippo viene definito come \protect\pippo .
        Nota lo spazio fra \pippo e il punto fermo di fine periodo. L’utente non se ne accorge, quando un comando così protetto viene scritto in un file ausiliario viene scritto con lo spazio appeso, e quando il file viene riletto quello spazio non conta niente.

        Per cui per avere il significato di una macro al di là del suo nome per l’utente bisogna essere “astuti”; il comando per conoscere la definizione di \LaTeX, tanto per fare un esempio, è:
        `
        \expandafter'show\csname LaTeX \endcsname
        `

        L’uso di \csname…\encsname serve per creare un nome di macro che contenga qualunque segno, anche uno spazio; noti infatti lo spazio prima di \endcsname; invece lo spazio dopo\csname serve a LaTeX per capire che è finito il nome della macro.
        \expandafter fa esattamente quello che dice il suo nome: espandi (esegui) \show DOPO aver espanso (eseguito) \csname; questo a sua volta ha bisogni di trattare tutto quanto fino a \endcsname per poter svolgere il suo compito.

        In buona sostanza viene prima eseguito \csname…\endcsname per produrre \LaTeX_
        (ho sostituito lo spazio con la lineetta ribassata per marcarlo, altrimenti questo browser non lo fa vedere) poi viene eseguito \show\LaTeX_

        Se usi tex, conosci certamente questi comandi “primigeni” dai quali con le macro si ottengono tutti gli altri.

      • #49291
        Up
        0
        Down
        ::


        Ringrazio entrambi per le risposte ricevute; volevo solamente sapere se esisteva un comando equivalente a «\show» per LaTeX (o meglio, capire perché saltava fuori quel «\protect» nel mio tentativo) ma ho ricevuto delle spiegazioni veramente esaurienti e approfondite.

        Se usi tex, conosci certamente questi comandi “primigeni” dai quali con le macro si ottengono tutti gli altri.

        In verità per quanto riguarda TeX al momento mi trovo ad un livello veramente base: mi farebbe piacere impararlo nel corso del tempo per poter capire a fondo diversi aspetti di LaTeX che mi sono tuttora oscuri, ma ho deciso di pianificare questa mia formazione in tempi lunghi, senza alcuna fretta. Conosco «\show» solamente perché l’avevo letto su una guida di base tempo fa e si vede che mi è rimasto impresso l’esempio sotto riportato.

        Attualmente ho deciso di dare la priorità ad un altro eccellente sistema di impaginazione del passato del quale purtroppo non si discute più granché.

        Grazie ancora e a presto.

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

    Go to top