次の例を考えてみましょう。
\documentclass{article}
\begin{document}
\def\something{something}
\something
{
\def\something{another thing}
\something
}
\something
\end{document}
出力から、something
それぞれ独自のスコープ内にある 2 つの変数があることがわかります。
ここで、変数を の中に配置します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
}