newcommand의 변수 범위 지정

newcommand의 변수 범위 지정

다음 예를 고려하십시오.

\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
}

관련 정보