长块的私有范围

长块的私有范围

我理解私有作用域块是由花括号对 ( {, }) 创建的。

以下文档的正文为“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进行一些簿记。

相关内容