考虑这个例子:
\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
改变了变量的先前定义:
这可能会导致难以察觉的错误,尤其是涉及数百个变量的库。有没有办法保护我的变量不被newcommand
s 更改?最好的方法是什么?
答案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
}