如果我\afterpage
在我的自定义环境之外使用,它工作正常:
\documentclass{article}
\usepackage{lipsum, afterpage}
\newenvironment{myenv}{
some macros that manipulate page numbering
} {
another macros here
}
\begin{document}
\lipsum[1-10]
\afterpage{
\begin{myenv}
\lipsum[3]
\end{myenv}
}
\lipsum[2]
\end{document}
我想把宏放在\afterpage
环境定义里面。我理解这对于使用\NewEnviron
包中的宏是必要的environ
:
\documentclass{article}
\usepackage{lipsum, afterpage, environ}
\NewEnviron{myenv}{
\afterpage{
some macros that manipulate page numbering
\BODY
another macros here
}
}
\begin{document}
\lipsum[1-10]
\begin{myenv}
\lipsum[3]
\end{myenv}
\lipsum[2]
\end{document}
但我收到错误:
$ pdflatex my.latex ... ! Undefined control sequence. \AP@ ...that manipulate page numbering \par \BODY \par another macros here \... l.20 \lipsum[2]
答案1
你不想把 token\BODY
放入 afterpage 中,你想把当前环境中的所有 token 都放进去
\def\afterpagebody#1{%
\afterpage{%%
some macros that manipulate page numbering%%
#1%
another macros here%
}}
\NewEnviron{myenv}{%%
\expandafter\afterpagebody\expandafter{\BODY}%%
}
afterpage
我希望您在生产中使用它之前阅读文档中的警告:-)
答案2
\BODY
在跟随您环境的页面上不可见myenv
,因此出现“未定义控制序列”错误。它仅在 内可用myenv
。为了避免 的\BODY
可访问性复杂化,您可以将其存储在另一个变量中:
\documentclass{article}
\usepackage{lipsum}
\usepackage{afterpage,environ}
\newcounter{myenvcntr}
\NewEnviron{myenv}{%
\stepcounter{myenvcntr}%
\expandafter\global\expandafter\let\csname BODY@\themyenvcntr\endcsname\BODY
\begingroup\edef\x{\endgroup\noexpand\afterpage{\noexpand\setcounter{myenvcntr}{\themyenvcntr}}}\x
\afterpage{%
some macros that manipulate page numbering
\csname BODY@\themyenvcntr\endcsname
another macros here
}%
}
\begin{document}
\lipsum[1-10]
\begin{myenv}
This is some text in \texttt{myenv}. \lipsum[1]
\end{myenv}
\lipsum[2]
\end{document}
上述方法存储\BODY
在内部\BODY@<num>
,<num>
如果您myenv
在同一页面上执行多个操作,则会增加。
注意虚假空间在你的定义中。