Re: [Risolto] legare quote al testo precedente

#56123
Up
0
Down
::

[…]
C’è un’altra soluzione che funziona se il capoverso precedente la citazione è di almeno quattro righe (se il capoverso precedente è di tre righe o meno il problema non si pone: tutto di là).
`\newenvironment{specialpar}[1]{\par#1}{\par}

\begin{specialpar}{\widowpenalties 3 10000 -10000 0\relax}
Testo del capoverso precedente la citazione, lungo almeno quattro righe
\end{specialpar}
\begin{quote}
Citazione che si porterà dietro esattamente due righe del capoverso precedente.
\end{quote}`
Carino, vero?

[…]

Non mi convince appieno, per almeno due motivi:

1) occorre intervenire anche sul capoverso precedente la citazione, per incapsularlo nell’ambiente specialpar;

2) ma soprattutto, non è che una variante della prima soluzione (forzare un cambio di pagina due righe prima della citazione), e ne condivide il difetto di richiedere di sapere già che la pagina sta per finire.

Infine, sono un vecchio barbogio tradizionalista, e finché posso rimanere fedele al TeX di Knuth son più contento.

Insisto col dire che la soluzione del problema sia cambiare il valore di \@beginparpenalty, o definendo un ambiente ad hoc come il sopraccitato quote*, o direttamente per le vie brevi:
`
\begingroup
\makeatletter \@beginparpenalty = \@M \makeatother
\begin{quote}
Mettete qui la vostra citazione.\qquad
(\textsl{B.~Stroustrup})
\end{quote}
\endgroup
`
(come avevo scritto — e poi scientemente cancellato! — prima di tentare maldestramente di fare troppo il furbo).

Si può anche considerare una variante più blanda, con \@beginparpenalty impostato a \@highpenalty anziché a 10000.

La soluzione con \widowpenalties è nettamente migliore: modificare \@beginparpenalty infatti normalmente creerà una vedova, perché il capoverso prima della citazione sarà spezzato all’ultima riga. Non una vedova inconsolabile, perché c’è la citazione: soluzione dunque preferibile se per caso il capoverso è solo di tre righe.

Si può agire anche senza introdurre “specialpar”:
`Testo che precede la citazione:\adjustment{\widowpenalties=3 10000 -10000 0\relax}
\begin{quote}
Citazione
\end{quote}`
dove \adjustment ha una definizione molto semplice:
`\newcommand*{\adjustment}[1]{#1}`
Non ti piace dover scrivere esplicitamente quel codice di basso livello? Nessun problema. 🙂
`\newcommand{\splitbefore}[1][0]{%
\ifcase#1\or
\widowpenalties 2 -10000 0 \or
\widowpenalties 3 10000 -10000 0 \or
\widowpenalties 4 10000 10000 -10000 0 \or
\widowpenalties 5 10000 10000 10000 -10000 0
\fi}`
Il nostro codice diventerebbe
`Testo che precede la citazione:\splitbefore[2]
\begin{quote}
Citazione
\end{quote}`
che diventa facilmente modificabile in fase di revisione. L’argomento opzionale vale 0 se non espresso e la macro, in quel caso, non fa nulla. Con argomento x da 1 a 4 spezza il capoverso lasciando x righe sulla nuova pagina.

Le estensioni e-TeX semplificano la vita in molti casi.

Ciao
Enrico

Go to top