Utilice un nuevo comando en un nuevo entorno

Utilice un nuevo comando en un nuevo entorno

Quiero crear un entorno que newenvironmenthaga 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 \newenvironmentpara definir un entorno que utilice \newcommandpara definir un comando \todouble que contenga el contenido del entorno. Al final del entorno \todoublese 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 \bgrouppara 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}

ingrese la descripción de la imagen aquí

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}

información relacionada