如何将 afterpage 放入环境定义中?

如何将 afterpage 放入环境定义中?

如果我\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在同一页面上执行多个操作,则会增加。

注意虚假空间在你的定义中。

相关内容