plain – magie in \box255

  • Creatore
    Topic
  • #81762
    Up
    0
    Down
    ::


    Un formato struttura le lettere (nel senso di “missive”) in questo modo:
    1) – elementi iniziali
    2) – corpo di testo
    3) – formula di chiusura (in un rigo a sè)
    4) – firma/e (in un rigo a sè)
    5) – eventuali elementi finali

    E’ necessario evitare che la pagina venga interrotta tra il corpo di testo e la formula di chiusura o tra la formula di chiusura e la firma.

    Possibile soluzione: se l’interruzione di pagina càpita in un punto “vietato” il formato salva un certo valore in un file ausiliario. In una seconda compilazione se il valore nel file ausiliario indica che l’interruzione è avvenuta tra l’elemento 2) e il 3) il \baselineskip viene aumentato un pò, in modo da lasciare sulla pagina successiva un paio di righe prima della formula di chiusura; se invece l’interruzione di pagina avviene tra l’elemento 3) e il 4) il \baselineskip viene aumentato un pò di più. Spero di essere stato chiaro.

    La domanda è: come fare in modo che \box255 “si accorga” che l’interruzione di pagina avviene in un punto vietato, e poi distingua tra interruzione prima della formula di chiusura e interruzione prima della firma?

    Grazie infinite, ciao.

Visualizzazione 2 filoni di risposte
  • Autore
    Risposte
    • #81763
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Per quel che mi risulta quello che vorresti fare implica modificare la routine di uscita per lo ship out. Io non ci metterei le mani sopra anche se la routine di output di plain è decisamente più semplice di quella di LaTeX.

        Tuttavia ci sono alcune cose in plain come le penalità da mettere prima dei punti vietati di interruzione pagina, i comandi \filbreak e \goodbreak; ne trovi le definizioni nel file plain.tex. Secondo me, benché siano usabili anche con LaTeX, non funzionano affidabilmente come previsto, ma Knuth li descrive nel TeXbook come dei comandi molto utili.

      • #81764
        Up
        0
        Down
        ::

        OldClaudio” post=81044Per quel che mi risulta quello che vorresti fare implica modificare la routine di uscita per lo ship out. Io non ci metterei le mani sopra anche se la routine di output di plain è decisamente più semplice di quella di LaTeX.

        Tuttavia ci sono alcune cose in plain come le penalità da mettere prima dei punti vietati di interruzione pagina, i comandi \filbreak e \goodbreak; ne trovi le definizioni nel file plain.tex. Secondo me, benché siano usabili anche con LaTeX, non funzionano affidabilmente come previsto, ma Knuth li descrive nel TeXbook come dei comandi molto utili.

        Sono soluzioni a cui ho pensato e che mi sembrano problematiche:

        1) rendere elastici \parskip e \baselineskip, aggiungendo delle \penalty nei punti “vietati”. Il problema è che così le distanze tra paragrafi e le altezze delle linee di base risultano diverse da una pagina all’altra, e il risultato è inguardabile.

        2) Knuth suggerisce qualche magia per gestire particolari interruzioni di pagina tra una sezione e l’altra (tipo \vskip 0pt plus.3\vsize\penalty-250\vskip 0pt plus-.3\vsize) ma io non sono mai riuscito a farle funzionare, e ho visto formati scritti da gente molto più titolata di me che usano le stesse magie con i miei stessi scarsissimi risultati.

        3) L’unica alternativa “facile” sembra essere quella di lavorare su \widowpenalty e \clubpenalty, incollando con dei \kern le sezioni indivisibili del documento: la densità del “grigio” del testo resta uguale su tutte le pagine, ma la pagina che subisce l’interruzione risulta più breve delle altre, e comunque non riempie adeguatamente la pagina fisica. E’ comunque l’ipotesi su cui sto lavorando.

        L’idea di lasciare dei particolari whatsit in certe linee per analizzarli al momento dello \shipout (per poi adottare la strategia che indicavo nel primo post) mi sembra una idea interessante, ma non sono ancora all’altezza di elaborare qualcosa di definito.

        Grazie, ciao.

      • #81765
        Up
        0
        Down
        ::

        Sam Qasbah” post=81030Un formato struttura le lettere (nel senso di “missive”) in questo modo:
        1) – elementi iniziali
        2) – corpo di testo
        3) – formula di chiusura (in un rigo a sè)
        4) – firma/e (in un rigo a sè)
        5) – eventuali elementi finali

        E’ necessario evitare che la pagina venga interrotta tra il corpo di testo e la formula di chiusura o tra la formula di chiusura e la firma.

        Possibile soluzione: se l’interruzione di pagina càpita in un punto “vietato” il formato salva un certo valore in un file ausiliario. In una seconda compilazione se il valore nel file ausiliario indica che l’interruzione è avvenuta tra l’elemento 2) e il 3) il \baselineskip viene aumentato un pò, in modo da lasciare sulla pagina successiva un paio di righe prima della formula di chiusura; se invece l’interruzione di pagina avviene tra l’elemento 3) e il 4) il \baselineskip viene aumentato un pò di più. Spero di essere stato chiaro.

        La domanda è: come fare in modo che \box255 “si accorga” che l’interruzione di pagina avviene in un punto vietato, e poi distingua tra interruzione prima della formula di chiusura e interruzione prima della firma?

        Grazie infinite, ciao.

        Rendi elastico [tt]\baselineskip[/tt]. Inserisci [tt]\nobreak[/tt] tra la fine della lettera e la parte finale, che inserisci in un [tt]\vtop[/tt]. L’elasticità di [tt]\baselineskip[/tt] non serve, in realtà, anzi è meglio evitarla.

        Ciao
        Enrico

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

    Go to top