我希望创建一个交替表现为脚注、尾注或注释(即隐藏)的环境。首先,我定义了一个环境“注释”,如下所示:
\newenvironment{note}
{ \footnote{ }
{ } }
现在期待
Hello\begin{note}world\end{note}
将扩展为
Hello\footnote{world}
但事实似乎并非如此。文档编译时没有任何警告,并且 pdf 输出确实包含脚注,但脚注是空的。
可能存在什么问题?我该如何解决?
答案1
要创建一个新的环境,它必须具有以下形式
\newenvironment{<env>}
{<begin env>}% \begin{<env>}
{<end env>}% \end{<env>}
其中<begin env>
执行于\begin{<env>}
并且<end env>
执行于\end{<env>}
。使用你的方法会引起混淆,即使你思考它可能有效:
\newenvironment{note}
{ \footnote{ }
{ } }
例如,尽管您认为\begin{note}
应该扩展为\footnote{
并且\end{note}
应该扩展为}
,从而包含环境内容,但 TeX 在定义时创建了环境,并且定义中的括号是不明确的。实际上,实际上\begin{note}
扩展为,\footnote{ } { }
因为平衡的括号对在同一级别/深度上匹配。
解决这一困境的方法是捕获环境内容第一的- 得益于environ
,然后将其传递给\footnote
。环境内容在名为 的宏中获取\BODY
:
\documentclass{article}
\usepackage{environ}% http://ctan.org/pkg/environ
\NewEnviron{note}{\footnote{\BODY}}% Environment-form of \footnote
\begin{document}
Hello\footnote{world}. Hello\begin{note}world\end{note}.
\end{document}
请注意,即使采用类似环境的方法,您在其中包含的内容方面仍然受到限制(例如,没有逐字内容)。
答案2
\NewEnviron
可能最简单的方法是使用environ
打包并定义您的note
环境为
\NewEnviron{note}{\footnote{\BODY}}
完整代码
\documentclass{article}
\usepackage{environ}
\NewEnviron{note}{\footnote{\BODY}}
\begin{document}
Hello\begin{note}world\end{note}
\end{document}
输出: