newcommand 中的变量作用域

newcommand 中的变量作用域

考虑这个例子:

\documentclass{article}
\begin{document}
\def\something{something}
\something

    {
        \def\something{another thing}

      \something
    }

    \something
\end{document}

从输出中可以看出,有两个变量something分别存在于各自的范围内:

在此处输入图片描述

现在,我将一个变量放在里面newcommand

\documentclass{article}
\def\something{something}
\newcommand{\dosomething}{
  invoking ``dosomething''
  \def\something{another thing}

  \something
}
\begin{document}
\something

\dosomething

\something
\end{document}

从输出可以看出,调用newcommand改变了变量的先前定义:

在此处输入图片描述

这可能会导致难以察觉的错误,尤其是涉及数百个变量的库。有没有办法保护我的变量不被newcommands 更改?最好的方法是什么?

答案1

TeX 提供了宏扩展机制;宏被替换文本替换。因此,使用您当前的定义

\newcommand{\dosomething}{
  invoking ``dosomething''
  \def\something{another thing}

  \something
}

文件

\begin{document}
\something

\dosomething

\something
\end{document}

实际上相当于

\begin{document}
\something

invoking ``dosomething''
\def\something{another thing}

\something

\something
\end{document}

(加上几个你有点粗心的尾随空格:-)

如果您希望将更改\something限制在执行中,则\dosomething必须包含一定级别的分组,可以使用显式括号{...}或(更易读)使用原语\begingroup/\endgroup

\newcommand{\dosomething}{% <-- don't forget this
  \begingroup
  invoking ``dosomething''%
  \def\something{another thing}%

  \something
  \endgroup
}

相关内容