Mantenere titolo unito al paragrafo successivo

  • Creatore
    Topic
  • #52774
    Up
    0
    Down
    ::


    Ciao a tutti

    dovrei definire dei comandi per formattare alcuni titoli (“titoli”, “articoli”, “capi”) di un testo legislativo.
    La questione è già stata trattata
    qui e
    qui

    Tali titoli vanno però inseriti in un testo che fa già uso dei comandi \chapter, \section, ecc.
    Ho quindi definito dei comandi appositi. Per esempio:

    `
    \newcounter{articolo}
    \setcounter{articolo}{1}
    \newcommand{\articolo}[1]{%
    \begingroup
    \par\vskip\baselineskip
    \centering ART~\Roman{articolo} #1
    \nobreak\par\vskip\baselineskip
    \refstepcounter{articolo}%
    \endgroup}
    `

    Il problema principale di questo codice è che se il comando cade a fine pagina (o a fine colonna, in un testo a due colonne) può rimanere isolato. A niente sembra servire \nobreak.
    C’è una soluzione?

    Ciao
    Ivan

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

      Ciao a tutti

      dovrei definire dei comandi per formattare alcuni titoli (“titoli”, “articoli”, “capi”) di un testo legislativo.
      La questione è già stata trattata
      qui e
      qui

      Tali titoli vanno però inseriti in un testo che fa già uso dei comandi \chapter, \section, ecc.
      Ho quindi definito dei comandi appositi. Per esempio:

      `
      \newcounter{articolo}
      \setcounter{articolo}{1}
      \newcommand{\articolo}[1]{%
      \begingroup
      \par\vskip\baselineskip
      \centering ART~\Roman{articolo} #1
      \nobreak\par\vskip\baselineskip
      \refstepcounter{articolo}%
      \endgroup}
      `

      Il problema principale di questo codice è che se il comando cade a fine pagina (o a fine colonna, in un testo a due colonne) può rimanere isolato. A niente sembra servire \nobreak.
      C’è una soluzione?

      Ciao
      Ivan

      Hai provato a modificare quanto suggerito in questo filone?

      Ciao
      Enrico

    • #52776
      Up
      0
      Down
      ::

      Ciao a tutti

      dovrei definire dei comandi per formattare alcuni titoli (“titoli”, “articoli”, “capi”) di un testo legislativo.
      La questione è già stata trattata
      qui e
      qui

      Tali titoli vanno però inseriti in un testo che fa già uso dei comandi \chapter, \section, ecc.
      Ho quindi definito dei comandi appositi. Per esempio:

      `
      \newcounter{articolo}
      \setcounter{articolo}{1}
      \newcommand{\articolo}[1]{%
      \begingroup
      \par\vskip\baselineskip
      \centering ART~\Roman{articolo} #1
      \nobreak\par\vskip\baselineskip
      \refstepcounter{articolo}%
      \endgroup}
      `

      Il problema principale di questo codice è che se il comando cade a fine pagina (o a fine colonna, in un testo a due colonne) può rimanere isolato. A niente sembra servire \nobreak.
      C’è una soluzione?

      Ciao
      Ivan

      Hai provato a modificare quanto suggerito in questo filone?

      Ciao
      Enrico

      Risolto con:
      `\newcommand{\articolo}[1][]{%
      \par\vspace*{2ex}
      {\centering \sffamily ART. \Roman{articolo}#1%
      \nobreak\par\vspace*{2ex}}
      \refstepcounter{articolo}}`

      Il segreto sta in \vspace*. Con \vspace non funziona.

      Grazie

      Ciao
      Ivan

    • #52777
      Up
      0
      Down
      ::

      Risolto con:
      `\newcommand{\articolo}[1][]{%
      \par\vspace*{2ex}
      {\centering \sffamily ART. \Roman{articolo}#1%
      \nobreak\par\vspace*{2ex}}
      \refstepcounter{articolo}}`

      Il segreto sta in \vspace*. Con \vspace non funziona.

      Ma che ci sta a fare \nobreak prima di \par?

      Sarà meglio anche spostare prima il \refstepcounter, che dici?
      `\newcommand{\articolo}[1][]{%
      \par\vspace{2ex}
      {\centering \sffamily ART. \refstepcounter{articolo}\Roman{articolo}#1\par
      \vspace*{2ex}}}`
      Così non devi dire \setcounter{articolo}{1} all’inizio, ma non è tanto qui il punto, quanto che concettualmente il registro va modificato prima di essere usato.

      Ciao
      Enrico

    • #52778
      Up
      0
      Down
      ::

      Risolto con:
      `\newcommand{\articolo}[1][]{%
      \par\vspace*{2ex}
      {\centering \sffamily ART. \Roman{articolo}#1%
      \nobreak\par\vspace*{2ex}}
      \refstepcounter{articolo}}`

      Il segreto sta in \vspace*. Con \vspace non funziona.

      Ma che ci sta a fare \nobreak prima di \par?

      🙄 Evidentemente non serve…I dubbi si moltiplicano. A cosa serve realmente \nobreak? È equivalente a \penalty10000, giusto? Lo stesso problema delle righe isolate l’avevo incontrato anche per lo stile philosophy-modern. Anche in quel caso, con \vspace* funzionava e con \vskip no, anche con \null davanti. Perché? \null\vskip non dovrebbe essere equivalente a \vspace*?

      Sarà meglio anche spostare prima il \refstepcounter, che dici?
      `\newcommand{\articolo}[1][]{%
      \par\vspace{2ex}
      {\centering \sffamily ART. \refstepcounter{articolo}\Roman{articolo}#1\par
      \vspace*{2ex}}}`
      Così non devi dire \setcounter{articolo}{1} all’inizio, ma non è tanto qui il punto, quanto che concettualmente il registro va modificato prima di essere usato.

      Ciao
      Enrico

      Grazie anche per questo 🙂

      Ciao
      Ivan

    • #52779
      Up
      0
      Down
      ::

      [quote]Risolto con:
      `\newcommand{\articolo}[1][]{%
      \par\vspace*{2ex}
      {\centering \sffamily ART. \Roman{articolo}#1%
      \nobreak\par\vspace*{2ex}}
      \refstepcounter{articolo}}`

      Il segreto sta in \vspace*. Con \vspace non funziona.

      Ma che ci sta a fare \nobreak prima di \par?

      🙄 Evidentemente non serve…I dubbi si moltiplicano. A cosa serve realmente \nobreak? È equivalente a \penalty10000, giusto? Lo stesso problema delle righe isolate l’avevo incontrato anche per lo stile philosophy-modern. Anche in quel caso, con \vspace* funzionava e con \vskip no, anche con \null davanti. Perché? \null\vskip non dovrebbe essere equivalente a \vspace*?[/quote]
      È vero, \nobreak è equivalente a \penalty10000; ma se lo dai là sei ancora in modo orizzontale, mentre a te serve in modo verticale.

      Infatti
      `\newcommand{\articolo}[1][]{%
      \par\vspace{2ex}
      {\centering\sffamily ART. \refstepcounter{articolo}\Roman{articolo}#1\par
      \nobreak\vspace{2ex}}}`
      funziona allo stesso modo. Nota le modifiche: il primo \vspace va senza asterisco, perché così può essere eliminato a un cambio di pagina. Probabilmente sarebbe meglio specificare anche una componente di allargamento.

      TeX non spezza una pagina che in certe posizioni. Può spezzare a uno skip, purché sia preceduto da un “non discardable item”; può spezzare a un kern, se è seguito da uno skip; oppure a una penalità.

      Il \par fa andare in modo verticale e TeX esamina se può spezzare la pagina: il prossimo item è una penalità, quindi sarebbe possibile, tuttavia la penalità in questione è 10000, cioè talmente alta che TeX nemmeno ci pensa (la potrebbe però usare in condizioni estreme, con avviso di Underfull \vbox o Overfull \vbox).

      Allo skip successivo non può spezzare, perché una penalità è un “discardable item”. Né può spezzare al successivo item che è ancora uno skip; infatti \vspace emesso in modo verticale emette due skip, uno uguale all’argomento specificato e uno nullo. L’item precedente è ancora uno skip.

      Perché funziona con \vspace*{2ex}? Perché questo comando inserisce
      (1) una \hrule invisibile
      (2) \nobreak
      (3) \vskip{2ex}
      (4) \vskip{0pt plus 0pt minus 0pt}

      Esattamente come \vspace, ma c’è la \hrule seguita da \nobreak. 🙂

      Lo skip nullo emesso da \vspace e \vspace* serve per l’interazione con \addvspace. Credo; non c’è traccia del motivo in source2e.

      \null è equivalente a \hbox{}; quindi \null\vspace produce esattamente il contrario di quello che ti serve: un posto ottimo dove cambiare pagina, perché c’è uno skip preceduto da un “non discardable item”, la \hbox vuota.

      Ti confondi perché è possibile usare \null\vfill per iniziare una pagina con spazio bianco; ma la faccenda riguarda l’eliminazione degli skip (e degli altri “discardable item”) a un cambio pagina.

      Ciao
      Enrico

    • #52780
      Up
      0
      Down
      ::

      [quote][quote]Risolto con:
      `\newcommand{\articolo}[1][]{%
      \par\vspace*{2ex}
      {\centering \sffamily ART. \Roman{articolo}#1%
      \nobreak\par\vspace*{2ex}}
      \refstepcounter{articolo}}`

      Il segreto sta in \vspace*. Con \vspace non funziona.

      Ma che ci sta a fare \nobreak prima di \par?

      🙄 Evidentemente non serve…I dubbi si moltiplicano. A cosa serve realmente \nobreak? È equivalente a \penalty10000, giusto? Lo stesso problema delle righe isolate l’avevo incontrato anche per lo stile philosophy-modern. Anche in quel caso, con \vspace* funzionava e con \vskip no, anche con \null davanti. Perché? \null\vskip non dovrebbe essere equivalente a \vspace*?[/quote]
      È vero, \nobreak è equivalente a \penalty10000; ma se lo dai là sei ancora in modo orizzontale, mentre a te serve in modo verticale.

      Infatti
      `\newcommand{\articolo}[1][]{%
      \par\vspace{2ex}
      {\centering\sffamily ART. \refstepcounter{articolo}\Roman{articolo}#1\par
      \nobreak\vspace{2ex}}}`
      funziona allo stesso modo. Nota le modifiche: il primo \vspace va senza asterisco, perché così può essere eliminato a un cambio di pagina. Probabilmente sarebbe meglio specificare anche una componente di allargamento.

      TeX non spezza una pagina che in certe posizioni. Può spezzare a uno skip, purché sia preceduto da un “non discardable item”; può spezzare a un kern, se è seguito da uno skip; oppure a una penalità.

      Il \par fa andare in modo verticale e TeX esamina se può spezzare la pagina: il prossimo item è una penalità, quindi sarebbe possibile, tuttavia la penalità in questione è 10000, cioè talmente alta che TeX nemmeno ci pensa (la potrebbe però usare in condizioni estreme, con avviso di Underfull \vbox o Overfull \vbox).

      Allo skip successivo non può spezzare, perché una penalità è un “discardable item”. Né può spezzare al successivo item che è ancora uno skip; infatti \vspace emesso in modo verticale emette due skip, uno uguale all’argomento specificato e uno nullo. L’item precedente è ancora uno skip.

      Perché funziona con \vspace*{2ex}? Perché questo comando inserisce
      (1) una \hrule invisibile
      (2) \nobreak
      (3) \vskip{2ex}
      (4) \vskip{0pt plus 0pt minus 0pt}

      Esattamente come \vspace, ma c’è la \hrule seguita da \nobreak. 🙂

      Lo skip nullo emesso da \vspace e \vspace* serve per l’interazione con \addvspace. Credo; non c’è traccia del motivo in source2e.

      \null è equivalente a \hbox{}; quindi \null\vspace produce esattamente il contrario di quello che ti serve: un posto ottimo dove cambiare pagina, perché c’è uno skip preceduto da un “non discardable item”, la \hbox vuota.

      Ti confondi perché è possibile usare \null\vfill per iniziare una pagina con spazio bianco; ma la faccenda riguarda l’eliminazione degli skip (e degli altri “discardable item”) a un cambio pagina.

      Ciao
      Enrico[/quote]
      Chiarissimo come sempre 😀
      Ecco il codice:
      `\newcommand{\articolo}[1][]{%
      \par\vskip2ex plus 2pt minus 1pt
      {\centering\sffamily ART. \refstepcounter{articolo}\Roman{articolo}#1\par
      \nobreak\vskip2ex plus 2pt minus 1pt}} `
      Funziona correttamente. Come vedi ho aggiunto degli spazi elastici.

      Ciao
      Ivan

    • #52781
      Up
      0
      Down
      ::

      Ecco il codice:
      `\newcommand{\articolo}[1][]{%
      \par\vskip2ex plus 2pt minus 1pt
      {\centering\sffamily ART. \refstepcounter{articolo}\Roman{articolo}#1\par
      \nobreak\vskip2ex plus 2pt minus 1pt}} `
      Funziona correttamente. Come vedi ho aggiunto degli spazi elastici.

      Puoi benissimo usare \vspace, anzi è addirittura consigliabile, direi. Quanto alla componente di elasticità, mi sembri un po’ taccagno, sai? 🙂 Io pensavo a 2ex plus 1ex minus .7ex o qualcosa del genere.

      Ciao
      Enrico

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

Go to top