我理解私有作用域块是由花括号对 ( {
, }
) 创建的。
以下文档的正文为“bar baz”:
\documentclass{article}
\begin{document}
\newcommand{\foo}{baz}
{
\renewcommand{\foo}{bar}
\foo
}
\foo
\end{document}
如果作用域区域很长,那么括号对在语法上可能显得很别扭。是否有一种首选方法来创建长文本序列的作用域块?
答案1
我想说,首选方法很大程度上取决于具体情况。我想到三种选择:
- 定义环境。当您想要进行的更改会影响某些内容的排版方式时,这是首选方法,例如,因为环境的内容与周围内容是不同类型的文本(或其他内容)。
使用括号或
\begingroup
和进行显式分组\endgroup
。 两者的作用域行为完全相同,但更详细的\begingroup
和\endgroup
命令更清晰一些,对于较长的文本部分应该是首选。请注意,在文档中间明确重新定义宏有点违背了 LaTeX 将内容与设计分开的概念,一般来说,这是一种不好的做法。作为例外,这样做是可以的,但一般来说,你应该在序言中用语义命名的宏“隐藏”重新定义。
有时,将您想要进行的更改实现为开关而不是开始-结束对是合适的选择,例如字体开关或
\@makeatletter
和\@makeatother
。 如果开关仅更改局部定义,您仍然可以通过使用上述选项之一将其括在组中来限制其效果。
根据我的经验,当您想要“更改一长段文本中的某些内容”时,通常应该涉及一个环境。要么是执行您想要的操作的指定环境,要么是始终在环境内使用的宏(例如在table
或中tikzpicture
)。
回答你的问题,一个\begingroup
-\endgroup
对是否完全等同于一个环境:关于范围,它是。\begin{foo}
只是扩展到\begingroup
并进行一些簿记,然后是\foo
。\end{foo}
扩展到\endfoo
然后\endgroup
进行一些簿记。