- Questo topic ha 7 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 15 anni, 9 mesi fa da
egreg9.
-
CreatoreTopic
-
22 Novembre 2010 alle 0:43 #52774::
Ciao a tuttidovrei definire dei comandi per formattare alcuni titoli (“titoli”, “articoli”, “capi”) di un testo legislativo.
La questione è già stata trattata
qui e
quiTali 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
-
CreatoreTopic
-
AutoreRisposte
-
-
22 Novembre 2010 alle 9:10 #52775::
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
quiTali 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
IvanHai provato a modificare quanto suggerito in questo filone?
Ciao
Enrico
-
22 Novembre 2010 alle 13:34 #52776::
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
quiTali 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
IvanHai provato a modificare quanto suggerito in questo filone?
Ciao
EnricoRisolto 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
-
22 Novembre 2010 alle 13:55 #52777::
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
-
22 Novembre 2010 alle 23:00 #52778::
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
EnricoGrazie anche per questo 🙂
Ciao
Ivan
-
22 Novembre 2010 alle 23:32 #52779::
[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
-
22 Novembre 2010 alle 23:43 #52780::
[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
-
22 Novembre 2010 alle 23:53 #52781::
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
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.