我想要创建一个执行以下操作的环境newenvironment
:它评估环境的高度,然后将其打印尽可能多的次数(textheight/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}