Quero criar um ambiente que newenvironment
faç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 \newenvironment
para definir um ambiente que use \newcommand
para 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 \bgroup
para 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}
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}