[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