Используйте newcommand в newenvironment

Используйте newcommand в newenvironment

Я хочу создать среду, 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}

Связанный контент