변경된 매크로 정의가 원본으로 되돌아갑니다.

변경된 매크로 정의가 원본으로 되돌아갑니다.

\testone두 개의 명령 이 있고 \testtwo. 이전 \testtwo에 관련이 있는 경우에만 나타나고 \testone동일한 인수를 사용합니다. 따라서 나는 인수를 다시 선택하는 위치 \testone에 인수를 저장하여 두 번 입력할 필요가 없도록 하고 싶습니다.\@repeat@me\testtwo

그러나 이는 둘 다 동일한 환경에 있는 경우에만 작동합니다. 그러나 어떤 경우에는 변경된 값을 \@repeat@me무시해야 한다고 결정합니다.

\documentclass{article}
\makeatletter

\def\@repeat@me{}

\newcommand\testtwo{\bf{\@repeat@me}% print what is currently defined.
% reset the definition so it does not interfere with next call
\def\@repeat@me{}}

% print it and then remember it.
\newcommand\testone[1]{\def\@repeat@me{#1}\emph{\@repeat@me}}%

\makeatother
\begin{document}

% prints: \emph{Hello World} \bf{Hello World}
\testone{Hello World} \testtwo{}

% prints: \bf{\emph{Hello World}}
% intended: \bf{\emph{Hello World}} \bf{Hello World}
\bf{\testone{Hello World}} \testtwo{}

\end{document}

답변1

전역 할당을 원하는 경우(그룹 및 환경을 이스케이프하려면 필요함) \global\def(또는 \gdef):

\documentclass{scrartcl}

\makeatletter
\newcommand*\@repeat@me{}
\newcommand*\testtwo{\textbf{\@repeat@me}\gdef\@repeat@me{}}
\newcommand\testone[1]{\gdef\@repeat@me{#1}\emph{\@repeat@me}}
\makeatother

\begin{document}

\testone{Hello World} \testtwo
\textbf{\testone{Hello World}} \testtwo

\end{document}

답변2

TeX는 (재)정의가 외부에 존재하고 되돌려질 수 있는 범위를 적용한다는 점에 유의하십시오. 그것이 여기서 일어나는 일입니다. 확장을 살펴보겠습니다:

\testone{Hello World} \testtwo{}

(댓글 포함)으로 확장됩니다.

\def\@repeat@me{Hello World}\emph{\@repeat@me} % \testone{Hello World}
\textbf{\@repeat@me}\def\@repeat@me{}% \testtwo{}

이는 다음으로 확장됩니다.

\emph{Hello World} \textbf{Hello World}% Using the new definition of \@repeat@me

여기에 이미지 설명을 입력하세요

이제 두 번째 매크로 세트의 확장을 살펴보세요.

\textbf{\testone{Hello World}} \testtwo{}

(댓글 포함)으로 확장됩니다.

\textbf{% <--- start of a group/scope
  def\@repeat@me{Hello World}\emph{\@repeat@me}% \testone{Hello World}
} % <--- end of a group/scope
\textbf{\@repeat@me}\def\@repeat@me{}% \testtwo{}

이는 다음으로 확장됩니다.

\textbf{\emph{Hello World}} % At scope-end, \@repeat@me reverts to its original definition
\textbf{}% Since \@repeat@me is empty {}

여기에 이미지 설명을 입력하세요

와 같은 전역 정의를 사용하면 에서 제공하는 범위를 넘어서 생존을 \gdef재정의할 수 있습니다 .\@repeat@me\textbf{..}


여기에 이미지 설명을 입력하세요

\documentclass{article}
\makeatletter

\def\@repeat@me{}

% print it and then remember it.
\newcommand\testone[1]{\gdef\@repeat@me{#1}\emph{\@repeat@me}}%

\newcommand\testtwo{\textbf{\@repeat@me}% print what is currently defined.
  % reset the definition so it does not interfere with next call
  \def\@repeat@me{}}

\makeatother
\begin{document}

% prints: \emph{Hello World} \textbf{Hello World}
\testone{Hello World} \testtwo{}

% prints: \textbf{\emph{Hello World}} \textbf{Hello World}
\textbf{\testone{Hello World}} \testtwo{}

\end{document}

관련 정보