텍스트를 복제하지 않고 반복하는 방법은 무엇입니까?

텍스트를 복제하지 않고 반복하는 방법은 무엇입니까?

내 문서에 '요구사항'을 적는 명령을 정의했습니다. 자동으로 스타일을 지정하고 번호를 매기고 번호를 얻기 위해 참조할 수 있는 레이블을 생성합니다. 정말 훌륭합니다. 그러나 때로는 요구사항을 참조할 때 요구사항의 전체 텍스트를 반복하여 독자가 문서로 돌아갈 필요가 없도록 하고 싶습니다. 물론 다시 작성하고 싶지는 않습니다. 왜냐하면 한 곳에서 변경하면 오류가 발생하기 쉽기 때문입니다. 명령을 사용하여 텍스트를 어떻게 반복합니까?

내 명령 정의의 현재 형식은 다음과 같습니다.

\newcommand{\requirement}[2]{
    \vspace{10pt}
    \noindent
    \textbf{
        \refstepcounter{reqnum}
        \label{req:#2}
        R\thereqnum: #1
    }
}

나는 다음 시도의 다양한 변형을 시도했지만 소용이 없었습니다.

\newcommand{\requirement}[2]{
    \vspace{10pt}
    \noindent
    \textbf{
        \refstepcounter{reqnum}
        \label{req:#2}
        R\thereqnum: #1
    }
    \newcommand{\req{#2}}{#1}
}

답변1

\csname <string>\endcsname명령을 내리는 가 있습니다 \<string>. 또한 사용하기 매우 편리한 etoolbox의 매크로를 사용할 수도 있습니다.

\newcommand{\req{#2}}{#1}으로 바꾸면 \expandafter\def\csname req#2\endcsname {#1}작동합니다.

\def\name매크로를 정의합니다 \name. 와는 반대로 \newcommand이미 존재하는지 묻지 않습니다 . 따라서 이미 존재 \name하는 경우 덮어씁니다 \name. 이는 유용할 수 있지만 일반적으로 해롭습니다.

just 를 쓰면 lonesome (및 누락 ) 이 있기 때문에 \def\csname req#2\endcsname {<definition>}재정의를 시도하고 오류가 발생합니다 .\csname\endcsname\

\expandafter앞에 넣으면 \def,

\expandafter\def\csname req#2\endcsname {<definition>}

된다

\def\req<argument2> {<definition>}

그리고 짜잔, 그것은 정의되었습니다. \expandafter다음 토큰의 확장을 지연합니다(명령 시퀀스일 수 있음). 두 사이클 동안 두 개의 확장 후 지연이 발생합니다.

관련 정보