Spaziatura verticale prima e dopo verse

  • Creatore
    Topic
  • #55287
    franen
    Partecipante
      Up
      0
      Down
      ::


      Ciao,
      sto impaginando un libro, non mio, che contiene dei componimenti poetici.
      Io desidererei che le linee di testo fossero tutte regolarmente spaziate del valore dell’interlinea, in modo da avere una perfetta sovrapposizione del testo fra bianca e volta.
      Col il testo semplice riesco a ottenere un buon risultato, forzando \lineskip e \parskip a zero.
      Tuttavia quando introduco l’ambiente verse non riesco a ottenere la spaziatua corretta. Ho letto il manuale di verse e la guida di Fabiano Busdraghi senza trovare informazioni a riguardo.
      Qualcuno ha idee su come risolvere il problema

      Grazie,
      Francesco

      Esempio compilabile (la griglia serve chiaramente solo per verificare l’allineamento corretto)`\documentclass[10pt,openany]{book}
      \usepackage[paperwidth=120mm, paperheight=205mm, textwidth=85mm, top=45pt, outer=21mm]{geometry}

      \usepackage[T1]{fontenc}
      \usepackage[utf8]{inputenc}
      \usepackage[italian]{babel}
      \usepackage[oldstylenums]{kpfonts}

      \usepackage{verse}
      \setlength{\vindent}{0pt}
      \setlength{\stanzaskip}{\baselineskip}
      \setlength{\leftmargini}{0pt}

      \usepackage{tikz}
      \usepackage{eso-pic}
      \usepackage{ifthen}
      \newcommand{\rete}{\AddToShipoutPicture{%
      {\begin{tikzpicture}
      \draw[thick](0pt,188mm)–(210mm,188mm);
      \draw[thick](0pt,23.5mm)–(210mm,23.5mm);
      \foreach \y in {0,84.4,96.4,…,556}
      \draw(0mm,\y pt)–(210mm,\y pt);
      \ifthenelse{\isodd{\thepage}}%
      {\draw(14mm,0mm)–(14mm,200mm);
      \draw(99mm,0mm)–(99mm,200mm);}
      {\draw(21mm,0mm)–(21mm,200mm);
      \draw(107mm,0mm)–(107mm,200mm);}
      \end{tikzpicture}}%
      }}
      \rete %inserisce la griglia sullo sfondo

      \lineskip=0pt
      \parskip=0pt
      \begin{document}
      Solo che non bisogna avere fretta. Ma io sono convinta che qui è la vita e la salvezza del mondo: quando questa sarà zona di incontro.

      \begin{verse}
      Temporale\\
      In alto sotto le rocce\\
      nuvole nere di piombo\\
      il [\dots]

      Altra stanza:\\
      In alto sotto le rocce\\
      nuvole nere di piombo\\
      il [\dots]
      \end{verse}

      Usciamo dalle case per camminare in mezzo ai campi, per vedere le striature di neve, e i rami degli alberi contro il cielo. Per scoprire il silenzio: è un buon amico.
      \end{document}`

    Visualizzazione 9 filoni di risposte
    • Autore
      Risposte
      • #55288
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          `
          % !TEX encoding = UTF-8 Unicode
          \documentclass[10pt,openany]{book}
          \usepackage[paperwidth=120mm, paperheight=205mm, textwidth=85mm, top=45pt, outer=21mm]{geometry}

          \usepackage[T1]{fontenc}
          \usepackage[utf8]{inputenc}
          \usepackage[italian]{babel}
          \usepackage[oldstylenums]{kpfonts}

          \usepackage{verse}
          \setlength{\vindent}{0pt}
          \setlength{\stanzaskip}{\baselineskip}
          \setlength{\leftmargini}{0pt}

          \usepackage{tikz}
          \usepackage{eso-pic}
          \usepackage{ifthen}
          \newcommand{\rete}{\AddToShipoutPicture{%
          {\begin{tikzpicture}
          \draw[thick](0pt,188mm)–(210mm,188mm);
          \draw[thick](0pt,23.5mm)–(210mm,23.5mm);
          \foreach \y in {0,84.4,96.4,…,556}
          \draw(0mm,\y pt)–(210mm,\y pt);
          \ifthenelse{\isodd{\thepage}}%
          {\draw(14mm,0mm)–(14mm,200mm);
          \draw(99mm,0mm)–(99mm,200mm);}
          {\draw(21mm,0mm)–(21mm,200mm);
          \draw(107mm,0mm)–(107mm,200mm);}
          \end{tikzpicture}}%
          }}
          \rete %inserisce la griglia sullo sfondo

          \makeatletter
          \renewenvironment{verse}
          {\let\\\@centercr
          \list{}{\itemsep \z@
          \itemindent -1.5em%
          \listparindent\itemindent
          \rightmargin \leftmargin
          \advance\leftmargin 1.5em
          \advance\topsep .5mm
          \advance\parsep 3mm
          }%
          \item\relax}
          {\endlist}

          \lineskip=0pt
          \parskip=0pt
          \begin{document}
          Solo che non bisogna avere fretta. Ma io sono convinta che qui è la vita e la salvezza del mondo: quando questa sarà zona di incontro.

          \advance\topsep 1mm
          \begin{verse}\advance\parsep 2mm
          Temporale\\
          In alto sotto le rocce\\
          nuvole nere di piombo\\
          il [\dots]

          Altra stanza:\\
          In alto sotto le rocce\\
          nuvole nere di piombo\\
          il [\dots]
          \end{verse}

          Usciamo dalle case per camminare in mezzo ai campi, per vedere le striature di neve, e i rami degli alberi contro il cielo. Per scoprire il silenzio: è un buon amico.
          \end{document}
          `

          Prova così

        • #55289
          franen
          Partecipante
            Up
            0
            Down
            ::


            Grazie.
            Questo codice risolve abbastanza bene (non perfettamente purtroppo) il caso specifico. Tuttavia non è una soluzione generale, lo si nota sostituendo alla prima riga un testo più lungo, tipo \lipsum[1-2].
            Vedo che hai ridefinito l’ambiente verse introducendo dei valori per topsep e parsep. Posso chiederti come li hai scelti? Poi li riprendi nel documento, come mai? Mi puoi spiegare a cosa serve il comando \advance?

            Grazie mille.

            Francesco

          • #55290
            OldClaudio
            Partecipante
              Up
              0
              Down
              ::


              \parsep e \partopsep li avevo messi prima nel documento ma non sortivano nessuna effetto, poi li ho spostati nella definizione di verse ma mi sono dimenticato di cancellarli da sotto.

              \advance è un comando “primitivo” di TeX; serve per eseguire una somma; vuol dire in sostanza “aggiungi”, non “avanza” o, se vuoi, vuol dire anche questo nel senso traslato di “andare avanti”.

              I valori li ho provati, tanto per vedere se facevano qualcosa e che cosa, poi in due o tre colpetti li ho messi a posto. Però per rendere più generale il codice bisognerebbe parametrizzare quei due “avanzamenti” al valore di \baselineskip, in modo che il tutto si aggiusti da solo quando si cambia corpo. A me il tuo esempio minimo viene bene mettendo:
              `
              \advance\topsep 0.09\baselineskip
              \advance\parsep 0.75\baselineskip
              `
              ma puoi farci sopra delle variazioni sul tema.

            • #55291
              Up
              0
              Down
              ::

              \parsep e \partopsep li avevo messi prima nel documento ma non sortivano nessuna effetto, poi li ho spostati nella definizione di verse ma mi sono dimenticato di cancellarli da sotto.

              \advance è un comando “primitivo” di TeX; serve per eseguire una somma; vuol dire in sostanza “aggiungi”, non “avanza” o, se vuoi, vuol dire anche questo nel senso traslato di “andare avanti”.

              I valori li ho provati, tanto per vedere se facevano qualcosa e che cosa, poi in due tre colpetti li ho messi a posto. Però per rendere più generale il codice bisognerebbe parametrizzare quei due “avanzamenti” al valore di \baselineskip, in modo che il tutto si aggiusti da solo quando si cambia corpo. A me il tuo esempio minimo viene bene mettendo:
              `
              \advance\topsep 0.09\baselineskip
              \advance\parsep 0.75\baselineskip
              `
              ma puoi farci sopra delle variazioni sul tema.

              In LaTeX è
              `\addtolength{\topsep}{0.09\baselineskip}`
              🙂

              Ciao
              Enrico

            • #55292
              franen
              Partecipante
                Up
                0
                Down
                ::


                Mi spiace, ma non mi torna.
                La spaziatura prima del primo verso sembra essere influenzata dal testo che c’è prima (ho provato con \lipsum[1-2]).
                Non riesco a capire cos’è che comanda la spaziatura verticale in questo caso.
                Ho imposto che lineskip e parskip siano zero quindi mi aspetto che alla fine di un capoverso LaTeX non aggiunga ulteriori spazi. Quindi suppongo che sia solo verse a definire la spaziatura. Ma con il medesimo \topsep ottengo risultati diversi a seconda della lunghezza del testo che lo precede. C’è qualche altro parametro da impostare? Son io che sto sbagliando qualcosa?

                Francesco

              • #55293
                OldClaudio
                Partecipante
                  Up
                  0
                  Down
                  ::


                  No, non sbagli niente;

                  TeX (verse) inserisce uno spazio fisso che non tiene conto del fatto che la riga con cui finisce il capoverso precedente abbia o non abbia discendenti.

                  I primi due capoversi di lipsum, con al tua giustezza, finiscono entrambi con una riga senza discendenti, mentre nel tuo primo esempio l’ultim riga prima dei versi terinava con un discendente;

                  Per aggiustare le cose prova a terminare il capoverso (non di lipsum, perché non puoi metterci le mani dentro) con un comando \strut:
                  `
                  … Ave Caesar, morituri te salutant\strut.
                  `

                  In questo caso metti un discendente invisibile che ti rende sempre il capoverso precedente terminante con la giusta profondità.

                • #55294
                  franen
                  Partecipante
                    Up
                    0
                    Down
                    ::


                    Ancora non capisco. Mi dici che TeX non tiene conto di eventuali discendenti nell’ultima riga, ma mi consigli di aggiungerne a mano?
                    In realtà ho fatto alcune prove, e il risultato non dipendeva solo dai discendenti.
                    Poi non mi piace l’idea di dover modificare il testo per inserire caratteri fittizi per ottenere quel che voglio.
                    Mi son ricordato del pacchetto grid di Kaveh Bazargan che mi avevi suggerito tempo fa riguardo alla questione del rispetto dell’interlinea. Ho guardato come Kaveh ha ridefinito verse:
                    `\renewenvironment{verse}
                    {\let\\\@centercr
                    \list{}{\itemsep \z@
                    \itemindent -1.5em%
                    \listparindent\itemindent
                    \rightmargin \leftmargin
                    \advance\leftmargin 1.5em}%
                    \topsep\z@\partopsep\z@\parskip\z@%
                    \itemsep\z@\@outerparskip\z@\parsep\z@%
                    \@topsep\z@\@topsepadd\z@%
                    \item\relax}
                    {\endlist}`
                    Io l’ho modifica così:`\renewenvironment{verse}
                    {\let\\\@centercr
                    \list{}{\itemsep \z@
                    \itemindent -1.5em%
                    \listparindent\itemindent
                    \rightmargin \leftmargin
                    \advance\leftmargin 1.5em \addvspace{\baselineskip}}%
                    \topsep\z@\partopsep\z@\parskip \baselineskip%
                    \itemsep\z@\@outerparskip\z@\parsep\z@%
                    \@topsep\z@\@topsepadd\baselineskip%
                    \item\relax}
                    {\endlist}`
                    La prima modifica lascia una riga prima della poesia, la seconda gestisce lo spazio fra le stanze e l’ultima aggiunge una riga alla fine.
                    Così pare funzionare correttamente. Anche se non mi piace l’idea di aver introdotto così la spaziatura verticale.
                    Come mai la modifica di topsep non produce variazioni nell’output? Come mai definisce \topsep e @topsep? Molte domande, scusate.
                    L’ultima: sono accettabili le modifiche che ho fatto?

                    Grazie ancora della vostra disponibilità.

                    Francesco

                  • #55295
                    OldClaudio
                    Partecipante
                      Up
                      0
                      Down
                      ::


                      \@topsep e \@topsepadd non li ho mai incontrati, ma suppongo che siano parametri interni del più genrale environment list su cui si basa verse.

                      Le modifiche sono corrette? se funzionano lo sono. Chissà se Enrico è in grado di spiegarci perché così funziona.

                    • #55296
                      Up
                      0
                      Down
                      ::

                      Ancora non capisco. Mi dici che TeX non tiene conto di eventuali discendenti nell’ultima riga, ma mi consigli di aggiungerne a mano?
                      In realtà ho fatto alcune prove, e il risultato non dipendeva solo dai discendenti.
                      Poi non mi piace l’idea di dover modificare il testo per inserire caratteri fittizi per ottenere quel che voglio.
                      Mi son ricordato del pacchetto grid di Kaveh Bazargan che mi avevi suggerito tempo fa riguardo alla questione del rispetto dell’interlinea. Ho guardato come Kaveh ha ridefinito verse:
                      `\renewenvironment{verse}
                      {\let\\\@centercr
                      \list{}{\itemsep \z@
                      \itemindent -1.5em%
                      \listparindent\itemindent
                      \rightmargin \leftmargin
                      \advance\leftmargin 1.5em}%
                      \topsep\z@\partopsep\z@\parskip\z@%
                      \itemsep\z@\@outerparskip\z@\parsep\z@%
                      \@topsep\z@\@topsepadd\z@%
                      \item\relax}
                      {\endlist}`
                      Io l’ho modifica così:`\renewenvironment{verse}
                      {\let\\\@centercr
                      \list{}{\itemsep \z@
                      \itemindent -1.5em%
                      \listparindent\itemindent
                      \rightmargin \leftmargin
                      \advance\leftmargin 1.5em \addvspace{\baselineskip}}%
                      \topsep\z@\partopsep\z@\parskip \baselineskip%
                      \itemsep\z@\@outerparskip\z@\parsep\z@%
                      \@topsep\z@\@topsepadd\baselineskip%
                      \item\relax}
                      {\endlist}`
                      La prima modifica lascia una riga prima della poesia, la seconda gestisce lo spazio fra le stanze e l’ultima aggiunge una riga alla fine.
                      Così pare funzionare correttamente. Anche se non mi piace l’idea di aver introdotto così la spaziatura verticale.
                      Come mai la modifica di topsep non produce variazioni nell’output? Come mai definisce \topsep e @topsep? Molte domande, scusate.
                      L’ultima: sono accettabili le modifiche che ho fatto?

                      Grazie ancora della vostra disponibilità.

                      Francesco

                      Non vedo perché tutte queste complicazioni. 🙂 La tua modifica di \topsep non ha influenza perché è data fuori dall’argomento di \list, dove invece vanno tutti i parametri per comporre la lista. O, meglio, influenza solo la fine della lista, quando il parametro \topsep è usato di nuovo.
                      `\renewenvironment{verse}
                      {\let\\\@centercr
                      \list{}{\itemsep \z@
                      \itemindent -1.5em%
                      \listparindent\itemindent
                      \rightmargin \leftmargin
                      \advance\leftmargin 1.5em
                      \topsep\baselineskip
                      \partopsep\z@
                      % \@outerparskip\z@
                      \parsep\z@}
                      \parskip\baselineskip
                      \item\relax}
                      {\endlist}`
                      Qui metto fuori l’impostazione di \parskip, perché serve solo fra le strofe. Non credo che \@outerparskip serva.

                      Ciao
                      Enrico

                    • #55297
                      franen
                      Partecipante
                        Up
                        0
                        Down
                        ::


                        Grazie, funziona bene!
                        Francesco

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

                    Go to top