\AtBeginEnvironment 不接受代码中的参数

\AtBeginEnvironment 不接受代码中的参数

etoolbox 的文档在环境钩子部分中说:

代码参数中的参数字符是允许的,并且不需要加倍。

但是,这样无法编译:

\documentclass{article}

\usepackage{etoolbox}

\newenvironment{foo}[1]{}{}
\AtBeginEnvironment{foo}{begin hook: #1}

\begin{document}

\begin{foo}{bar}
  Lorem ipsum dolor sit amet.
\end{foo}

\end{document}

错误信息是

! You can't use `macro parameter character #' in horizontal mode.
\@begin@foo@hook ->begin hook: ##
                                 1
l.11 \begin{foo}
                {bar}

是我做错了什么还是文档有误?

答案1

该文件指的是这样的案例

\documentclass{article}

\usepackage{etoolbox}

\newenvironment{foo}[1]{}{}
\AtBeginEnvironment{foo}{\newcommand\baz[1]{begin hook: #1}}

\begin{document}

\begin{foo}{bar}
  \baz{Lorem} ipsum dolor sit amet.
\end{foo}

\end{document}

我们不需要#在 的定义中重复使用 token \baz。这与

\documentclass{article}

\usepackage{etoolbox}

\newcommand\foo[1]{%
  \newcommand\baz[1]{begin hook: ##1}%
}

\begin{document}

\begin{foo}{bar}
  \baz{Lorem} ipsum dolor sit amet.
\end{foo}

\end{document}

我们确实需要将#代币加倍。

钩子不能对环境的访问#1比任何其他代码都多(它不会添加到底层\foo,而是使用专用宏)。因此,如果你想访问#1重新定义\foo(或等效\renewenviornment{foo})。

相关内容