![\AtBeginEnvironment 不接受代码中的参数](https://linux22.com/image/314825/%5CAtBeginEnvironment%20%E4%B8%8D%E6%8E%A5%E5%8F%97%E4%BB%A3%E7%A0%81%E4%B8%AD%E7%9A%84%E5%8F%82%E6%95%B0.png)
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}
)。