다음 예를 고려하십시오.
\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
출력에서 변수의 이전 정의가 변경된 호출을 볼 수 있습니다 .
이로 인해 특히 수백 개의 변수가 포함된 라이브러리에서 모호한 오류가 발생할 수 있습니다. 내 변수가 s에 의해 변경되는 것을 방지할 수 있는 방법이 있나요 newcommand
? 가장 좋은 접근 방식은 무엇입니까?
답변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
}