newcommand 中的變數作用域

newcommand 中的變數作用域

考慮這個例子:

\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改變了變數的先前定義:

在此輸入影像描述

這可能會導致模糊的錯誤,特別是對於涉及數百個變數的庫。有沒有辦法保護我的變數不被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
}

相關內容