考慮這個例子:
\documentclass{article}
\begin{document}
\def\something{something}
\something
{
\def\something{another thing}
\something
}
\something
\end{document}
從輸出可以看出,有兩個變數something
各自存在於自己的作用域:
現在,我將一個變數放在 a 中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
}