我对 LaTeX 还很陌生,所以如果这是一个初学者的问题,我深感抱歉,但是我还没有找到一个好的方法来查询它。
我观察到,当我使用像这样的环境时\begin{itemize}...\end{itemize}
,我可以将内容放置\newcommand
在环境范围内。
\documentclass{article}
\begin{document}
\begin{itemize}
\newcommand{\FFF}{\epsilon}
\item $\FFF$
\end{itemize}
%$\FFF$ %this is out of scope, so it would cause an error if it were commented back in.
\end{document}
itemize
但是,像和 这样的环境enumerate
往往会产生特殊效果(例如赋予 含义\item
)。我的问题是是否存在一个没有“特殊效果”的环境,其唯一作用是限制声明的范围。
答案1
正如 Alan Munn 所说,使用括号是一种方法。您也可以简单地定义自己的环境:
\newenvironment*{dummyenv}{}{}
然后像平常一样使用它:
\begin{dummyenv}
\newcommand*{\scopedcommand}{Do stuff}
\scopedcommand % This works
\end{dummyenv}
两个参数分别newenvironment
是在环境内容之前和之后插入的代码。将它们留空实际上定义了一个不执行任何操作的环境。
因此,下面的代码无法编译:
\documentclass[a4paper]{article}
\newenvironment*{dummyenv}{}{}
\begin{document}
\begin{dummyenv}
\newcommand*{\dummycmd}{This is scoped}
\dummycmd
\end{dummyenv}
\dummycmd
\end{document}
除非你注释掉第二个dummycmd
。
编辑:另外,意思是:您也可以使用 TeX 基元\begingroup
和\endgroup
来实现这一点。它们构成了 TeX 所称的“半简单”组,并且不能与互换{...}
。
编辑2:正如 @tohecz 在评论中提醒我的那样,正确的做法(如果你真的想要一个环境,无论出于什么原因)是使用
\begin{@empty}
\end{@empty}
任何其他解决方案也可以起作用,但是,这比定义新环境更清晰。