Re: Separare il contenuto di una vbox con un ciclo while

#56390
Up
0
Down
::

Salve a tutti.

Ho la necessità di conservare un testo all’interno di un registro \vbox per poterne controllare le dimensioni. Voglio separare il contenuto della \vbox con il comando \vsplit in modo da spezzettarlo in tante \vbox di assegnata altezza.

Per fare ciò ho definito un nuovo comando nel codice seguente:
`\documentclass{minimal}
\usepackage{ifthen}
\usepackage{lipsum}

\newlength{\larghezza}
\setlength{\larghezza}{8cm}
\newlength{\altezza}
\setlength{\altezza}{4cm}
\newbox\mybox
\newbox\myboxa

\newcommand\Separa[1]{
\setbox\mybox=\vbox{\hsize=\larghezza #1}
\whiledo{\ht\box\mybox >\altezza}{
\setbox\myboxa=\vsplit\mybox to \altezza
\box\myboxa\par\hrule
}
\box\mybox\par\hrule
}

\begin{document}
\Separa{\lipsum[1-4]}
\end{document}
`
La compilazione con pdflatex restituisce l’errore:
`! Missing number, treated as zero.

\box
l.22 \Separa{\lipsum[1-4]}
`
Cosa non funziona?

A parte l’errore di \ht\box, non è molto sensato dividere in pezzi che non hanno come altezza un numero intero di righe. Se vuoi che i vari pezzi siano ben composti verticalmente e che abbiano per altezza la migliore approssimazione a quella desiderata, puoi fare così:
`\newcommand\Separa[1]{%
\par\begingroup\vbadness=10000
\setbox\mybox=\vbox{\hsize=\larghezza #1}
\loop\ifdim\ht\mybox > \altezza
\setbox\myboxa=\vsplit\mybox to \altezza
\vbox{\unvbox\myboxa}\hrule
\repeat
\vbox{\unvbox\mybox}\hrule\endgroup
}`
Un paio di commenti. Metto tutto in un gruppo per poter dare un valore a \vbadness che eviti gli inevitabili messaggi di “Underfull \vbox”; il primo \par mette TeX in modo verticale e non c’è più bisogno di dare \par in seguito: un comando \box, \vbox o \hbox in modo verticale non fa entrare in modo orizzontale. Poi divido in pezzi alti \altezza con \vsplit (uso il metodo \loop che mi piace di più, ma è solo preferenza personale). Invece di \box\myboxa che causa problemi di riempimento (tipicamente sarà una “Underfull \vbox”), eseguo \unvbox\myboxa in una \vbox.

Ciao
Enrico

Go to top