TeX dietro la facciata, i processori e ciò che non si vede

  • Creatore
    Topic
  • #58929
    Up
    0
    Down
    ::


    È il mio primo messaggio, e ci terrei molto ad avere un aiuto.

    Leggendo il codice di una macro come \inbox, che incornicia un testo/oggetto, mi pare che quanto nel
    codice si riferisce alla cornice preceda l’oggetto e che quindi, visto che i processori TeX funzionano
    soltanto con le liste, il \box256 nel creare l’output debba tracciare la cornice prima di conoscere l’oggetto
    da incorniciare. Il che sicuramente non è.

    \def\inbox{\setbox256\hbox{\vbox{\hrule\hbox{\vrule\kern5pt\vbox{\kern3pt\hbox{\Large Testo/Oggetto} \kern3pt}\kern5pt\vrule}\hrule}}}

    \inbox
    \unhbox256

    Alcune possibilità:
    – la lista di uscita viene rovesciata prima dell’output;
    – la memorizzazione del registro 256 avviene in uno stack;
    – TeX crea un registro temporaneo per i parametri delle tre misure del box Testo/Oggetto
    da passare in fase di output alla cornice.
    Rimane il fatto che se si prova a leggere la lista di \tracingcommands si è portati a credere che TeX
    possa fare qualsiasi cosa, visto che mette in gioco tanti elementi in più di quelli che noi utenti conosciamo
    direttamente; peggio ancora con \tracingmacros, in particolare con lo \@specialoutput .

    Come si può cercare di capire o magari solo di sapere come stanno le cose?
    Meglio se senza andare a fondo di quello che fanno i processori di espansione e di esecuzione.
    Che eventualmente mi sembra dovrebbe essere fatto induttivamente studiando i file di lplain.tex e
    che, stando a \tracingmacros, è sicuramente fuori dalla mia portata.

    Grazie
    Riccardo

Visualizzazione 6 filoni di risposte
  • Autore
    Risposte
    • #58930
      Up
      0
      Down
      ::

      È il mio primo messaggio, e ci terrei molto ad avere un aiuto.

      Leggendo il codice di una macro come \inbox, che incornicia un testo/oggetto, mi pare che quanto nel
      codice si riferisce alla cornice preceda l’oggetto e che quindi, visto che i processori TeX funzionano
      soltanto con le liste, il \box256 nel creare l’output debba tracciare la cornice prima di conoscere l’oggetto
      da incorniciare. Il che sicuramente non è.

      \def\inbox{\setbox256\hbox{\vbox{\hrule\hbox{\vrule\kern5pt\vbox{\kern3pt\hbox{\Large Testo/Oggetto} \kern3pt}\kern5pt\vrule}\hrule}}}

      \inbox
      \unhbox256

      Alcune possibilità:
      – la lista di uscita viene rovesciata prima dell’output;
      – la memorizzazione del registro 256 avviene in uno stack;
      – TeX crea un registro temporaneo per i parametri delle tre misure del box Testo/Oggetto
      da passare in fase di output alla cornice.
      Rimane il fatto che se si prova a leggere la lista di \tracingcommands si è portati a credere che TeX
      possa fare qualsiasi cosa, visto che mette in gioco tanti elementi in più di quelli che noi utenti conosciamo
      direttamente; peggio ancora con \tracingmacros, in particolare con lo \@specialoutput .

      Come si può cercare di capire o magari solo di sapere come stanno le cose?
      Meglio se senza andare a fondo di quello che fanno i processori di espansione e di esecuzione.
      Che eventualmente mi sembra dovrebbe essere fatto induttivamente studiando i file di lplain.tex e
      che, stando a \tracingmacros, è sicuramente fuori dalla mia portata.

      Grazie
      Riccardo

      Benvenuto!

      Dove hai trovato quel codice? L’uso di \setbox256 mi lascia alquanto perplesso. Ma non è molto importante. Vediamo un po’ alla volta:

      1. \setbox256=\hbox{
      Istruiamo TeX a inserire nel registro box numero 256 una hbox che cominciamo a costruire.

      2. \vbox{
      La hbox contiene una vbox

      3. \hrule
      Il primo elemento di questa vbox è un filetto orizzontale

      4. \hbox{
      L’elemento successivo è una hbox

      5. \vrule
      Il primo elemento di questa hbox è un filetto verticale

      6. \kern5pt
      Il secondo elemento è una crenatura (orizzontale) di 5pt

      7. \vbox{
      Il terzo elemento è una vbox

      8. \kern3pt\hbox{\Large Testo/Oggetto} \kern3pt}
      che a sua volta consiste di una crenatura (verticale) di 3pt, di una hbox contenente finalmente il testo da incorniciare e un’altra crenatura (verticale) di 3pt

      9. \kern5pt\vrule}
      Siamo tornati nella hbox, ci sono 5pt di spazio che separano la vbox dal filetto verticale; chiudiamo la hbox

      10. \hrule}}
      Siamo di nuovo nella vbox, inseriamo un filetto orizzontale e chiudiamo la vbox e la hbox

      Ora che tutto è in ordine, TeX può procedere a decidere quanto lunghi siano i filetti orizzontali e alti quelli verticali: una hrule è larga quanto la vbox che la contiene, una vrule è alta (e profonda) quanto la hbox che la contiene. Questo se non sono stati esplicitamente dati valori con “width” o “height” e “depth” rispettivamente.

      Occorre tenere presente un’altro fatto: in una vbox gli oggetti che non fanno cominciare il modo orizzontale sono impilati l’uno sull’altro; fra due hbox viene inserita l’interlinea, ma questo non accade fra una hrule e una hbox.

      Puoi provare a leggere gli Appunti; certo che cominciare da questo mi pare un pochino troppo audace.

      Ciao
      Enrico

    • #58931
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Ciao Riccardo,
        studiare lplain è fuori luogo perché l’ultima volta che l’ho visto non esisteva ancora LaTeX2e 🙂

        Se invece vuoi davvero impratichirti di programmazione TeX con i comandi primitivi devi leggere il TeXbook; oppure TeX by topic, al limite persino TeX for the impatient.
        Ma le cose che descrivi per il comando ‘ibox sono di due specie:

        1) l’uso della scatola 256 te l’ho insegnato io e prevede una distribuzione del sistema TeX moderno, cosicché sia tex, sia LaTeX, sia ConTeXt mk ii, sia XeTeX e XeLaTeX usano motori di composizione che incorprano le estensioni di e-EeX e quindi anche i registri oltr e quello numerato 255, che ear il minte massimo quando il moter di composizione era il tex-Kunthiano.

        2) le istruzioni che descrivi nella definizione di \inbox sono le stesse, tranne i valori parametrizzati delle crenature che vengono eseguiti durante l’esecuzione di \fbox o, mutati mutandis, di \frambox.
        Quindi probabilmente puoi trovare un minimo di descrizione in quella parte del codice documentato per il formato di latex che si trova in texnf-ditr/source/…

        In realtà la documentazione del nucleo di LaTeX è più scarsa di quella che sostanzialmente ti ha dato Enrico nel messaggio precedente. I suoi appunti di programmazione sono eccellenti e te li avevo già consigliati tempo fa.

        Se ti leggi gli Appunti e arrivi a capire in ogni dettaglio, non a sommi capi, ogni problema di programmazione lì illustrato, sei a vallo e non hai più nulla da imparare per apprendere la programmazione con i comandi primitivi di TeX 🙂

      • #58932
        Up
        0
        Down
        ::


        Quando ho aperto la mia pagina non avevo aspettative e invece ho trovato due risposte, e che risposte!

        Non mi aspettavo egreg9. Lo conosco indirettamente, i suoi Appunti (dopo le indicazioni di Claudio) sono spesso sul mio tavolo.

        Non mi aspettavo neanche Claudio con cui però ho ormai da parecchio tempo un rapporto di posta elettronica che mi ha molto aiutato.

        Un minimo di presentazione.

        Il TeX di questo periodo per me è in un certo qual modo un ritorno. Molti anni fa (con Textures e PicTeX) ci sono stato un po’ sopra, per motivi di utilità e a livelli amatoriali.
        E non avrei potuto farlo senza l’aiuto di un bel po’ di libri, che conservo. Riprenderlo ora, anche sollecitato da Claudio, si sta rivelando essere una tessitura di per sé
        interessante e autosufficiente per quello che è venuto dopo.
        La sua sintassi lavorandoci su si può capire, quello che ha dietro, quello che fanno i suoi processori, come intervengono sul codice esplicito è il lato oscuro.

        Nel caso specifico mi pare che si possa affermare che le dimensioni del Test/Oggetto rilevate nell’input sono comunicate all’output via parametri?

        Riccardo

        PS Il numero di registro, da e-TeX, è suggerito da Claudio in un’altra circostanza. Il codice della filettatura trovato da me per tentativi è sostanzialmente quello dell’esercizio 21.3 di The TeXbook.

      • #58933
        Up
        0
        Down
        ::

        Nel caso specifico mi pare che si possa affermare che le dimensioni del Test/Oggetto rilevate nell’input sono comunicate all’output via parametri?

        No, TeX conosce la misura delle box che crea.

        Ciao
        Enrico

      • #58934
        Up
        0
        Down
        ::


        Rispondo a egreg9.

        Con i parametri intendevo i parametri dimensionali di un registro box.
        Una conoscenza per il tramite di qualcosa, che va gestita.

        Credo sia la stessa conoscenza di cui dici tu, riferita a quelli che negli
        Appunti indichi come registri interni di un registro box.

        Ora mi sento rassicurato.
        Grazie,
        Riccardo

      • #58935
        Up
        0
        Down
        ::


        Per egreg9.

        Quando scrivi

        “in una vbox gli oggetti che non fanno cominciare il modo orizzontale sono impilati l’uno sull’altro;”

        intendi parlare di uno stack?
        Ciao,
        Riccardo

      • #58936
        Up
        0
        Down
        ::

        Per egreg9.

        Quando scrivi

        “in una vbox gli oggetti che non fanno cominciare il modo orizzontale sono impilati l’uno sull’altro;”

        intendi parlare di uno stack?
        Ciao,
        Riccardo

        No, intendo dire come vengono composti sulla pagina. TeX funziona essenzialmente come lo stampatore di un tempo: una lettera alla volta viene composta una riga di stampa; al termine di un capoverso le varie righe vengono aggiustate allargando o restringendo gli spazi e magari spostando parole o pezzi da una riga alla precedente o successiva. Le righe così ottenute vengono impilate una sull’altra e quando si ha una pagina piena la si aggiusta per evitare vedove e orfani.

        Internamente TeX rappresenta una vbox come una successione di hbox una dopo l’altra, intervallate dall’interlinea (ci sono altre cose, in realtà, ma non importa). Ciascuna hbox è a sua volta una successione di hbox una dopo l’altra, eventualmente intervallate da spazi (anche qui ci sono altre cose che non sono così importanti per una descrizione sommaria).

        Come queste liste verticali e orizzontali siano gestite dal programma è del tutto irrilevante.

        Ciao
        Enrico

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

    Go to top