我正在尝试使用开头和结尾的钩子来复制文档。以下是我的问题的简单示例:
\documentclass{minimal}
\usepackage{environ}
\usepackage{forloop}
%Repeat text
\newcounter{loopcntr}
\newcommand{\rpt}[1]{
\forloop{loopcntr}{0}{\value{loopcntr}<2}{#1}
}
%Create an environment to repeat text
\NewEnviron{rptenv}{
\rpt{\BODY}
}
\AtBeginDocument{
\begin{rptenv}
}
\AtEndDocument{
\end{rptenv}
}
\begin{document}
Hello.
\end{document}
为什么不起作用?如果我将钩子中的“rptenv”替换为“center”,它就会像魔法一样工作。有没有其他方法可以在不更改文件主体任何内容的情况下实现自动重复?
答案1
下面的方法似乎可以通过一些技巧来实现:
\documentclass{minimal}
\usepackage{environ}
\usepackage{forloop}
%Repeat text
\newcounter{loopcntr}
\newcommand{\rpt}[1]{
\forloop{loopcntr}{0}{\value{loopcntr}<3}{#1}
}
%Create an environment to repeat text
\NewEnviron{rptenv}{%
\rpt{\BODY}%
}
\makeatletter
\g@addto@macro\document{%
\rptenv
}
\makeatother
\begin{document}
Hello.
\end{document}
\begin{rptenv}
在另一个环境中不起作用,因为环境名称用于查找该\end{...}
部分。
当调用钩子时,前导码尚未完成\AtBeginDocument
,因此钩子之后的部分\begin{document}
不能被调用两次。此问题在示例中通过附加\rptenv
到命令形式来修复\document
。
我已删除,,\endrptenv
因为这里不需要它(它会扩展为\ignorespacesafterend
,但工作已由完成\end{document}
,因此之后的空格无关紧要)。