Use novo comando em novo ambiente

Use novo comando em novo ambiente

Quero criar um ambiente que newenvironmentfaça o seguinte: avalie a altura do ambiente e depois imprima quantas vezes (altura/altura do texto) couberem em uma página.

Aqui está uma tentativa de imprimir o ambiente duas vezes:

\documentclass{article}
\newenvironment{double}{\newcommand{\todouble}\bgroup}{\egroup\todouble\todouble}
\begin{document}
\begin{double}
    Hello, World!
\end{double}
\end{document}

Minha primeira ideia é usar \newenvironmentpara definir um ambiente que use \newcommandpara definir um comando \todouble que contenha o conteúdo do ambiente. No final do ambiente \todoubleé chamado duas vezes.

Mas isso falha com o erro:

! Extra }, or forgotten \endgroup.
\enddouble ->\egroup 
                 \todouble \todouble 
l.6 \end{double}

Como posso consertar isso?

Responder1

Você não pode usar \bgrouppara delimitar um argumento obrigatório. E você quer que os líderes preencham a página com cópias do que você absorveu.

\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}

insira a descrição da imagem aqui

Uma versão estendida que verifica se pelo menos duas cópias da caixa cabem na página e apenas imprime a caixa caso não caibam.

\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}

informação relacionada