Я хочу создать среду, newenvironment
которая будет выполнять следующие действия: оценивать высоту среды, а затем выводить ее столько раз (texttheight/height), сколько поместится на одной странице.
Вот попытка распечатать окружение дважды:
\documentclass{article}
\newenvironment{double}{\newcommand{\todouble}\bgroup}{\egroup\todouble\todouble}
\begin{document}
\begin{double}
Hello, World!
\end{double}
\end{document}
Моя первая идея — использовать \newenvironment
для определения окружения, которое использует \newcommand
для определения команды \todouble
, содержащей содержимое окружения. В конце окружение \todouble
вызывается дважды.
Но это не удается с ошибкой:
! Extra }, or forgotten \endgroup.
\enddouble ->\egroup
\todouble \todouble
l.6 \end{double}
Как это исправить?
решение1
Вы не можете использовать \bgroup
для разграничения обязательный аргумент. И вы хотите, чтобы лидеры заполнили страницу копиями того, что вы впитали.
\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}
Расширенная версия, которая проверяет, помещается ли на странице хотя бы две копии рамки, и просто печатает рамку, если нет.
\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}