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