Quiero crear un entorno que newenvironment
haga lo siguiente: evalúa la altura del entorno y luego lo imprime tantas veces (altura del texto/altura) como quepan en una página.
Aquí hay un intento de imprimir el entorno dos veces:
\documentclass{article}
\newenvironment{double}{\newcommand{\todouble}\bgroup}{\egroup\todouble\todouble}
\begin{document}
\begin{double}
Hello, World!
\end{double}
\end{document}
Mi primera idea es utilizar \newenvironment
para definir un entorno que utilice \newcommand
para definir un comando \todouble
que contenga el contenido del entorno. Al final del entorno \todouble
se llama dos veces.
Pero esto falla con el error:
! Extra }, or forgotten \endgroup.
\enddouble ->\egroup
\todouble \todouble
l.6 \end{double}
¿Cómo puedo arreglarlo?
Respuesta1
No se puede utilizar \bgroup
para delimitar un argumento obligatorio. Y usted quiere que los líderes llenen la página con copias de lo que absorbió.
\documentclass{article}
\newenvironment{double}
{%
\par % be in vertical mode
\setbox0=\vbox\bgroup % start a box
\strut % ensure good height for the first line
\ignorespaces % ignore the end of line
}
{%
\egroup % end the box
\hrule height0pt % vertical analog of \leavevmode
\cleaders\copy0\vfill % repeat as much as necessary
}
\begin{document}
\begin{double}
Hello, World!
\end{double}
\end{document}
Una versión extendida que verifica si al menos dos copias del cuadro caben en la página y, en caso contrario, simplemente imprime el cuadro.
\documentclass{article}
\usepackage{lipsum}
\newenvironment{double}
{%
\par % be in vertical mode
\setbox0=\vbox\bgroup % start a box
\strut % ensure good height for the first line
\ignorespaces % ignore the end of line
}
{%
\ifhmode\strut\fi\egroup % end the box
% see if at least two copies of the box fit in the page
\ifdim\ht0 < \dimexpr .5\textwidth-4ex\relax
\hrule height0pt % vertical analog of \leavevmode
\cleaders\copy0\vfill % repeat as much as necessary
\clearpage
\else
\unvbox0
\clearpage
\fi
}
\begin{document}
\begin{double}
Hello, World!
\end{double}
\begin{double}
\lipsum*[2]
\end{double}
\begin{double}
\lipsum
\end{double}
\end{document}