Newcommand: 무엇을 할 수 없나요?

Newcommand: 무엇을 할 수 없나요?

새 명령을 만들려고 시도했지만 실패한 것은 이번이 처음이 아닙니다. 내가 발견한 일부 기능은 작동하지 않았습니다("정의되지 않은 제어 순서" 또는 기타 오류 발생).

  • 따옴표-끝따옴표 인수를 사용하십시오.

    \newcommand{\mytest}[1]{
      \quote #1 \endquote
    }
    
  • \verb인수와 함께 명령을 사용하십시오 .

    \newcommand{\mytest}[1]{
      \verb+#1+
    }
    
  • 환경 을 사용하십시오 begin{lstlisting}:

    \newcommand{\mytest}[1]{
      \begin{lstlisting}
      #1
      \end{lstlisting}
    }
    

\newcommand내가 할 수 있는 것과 할 수 없는 것에 대한 전체 목록을 어디서 찾을 수 있는지 아시나요 ? 그리고 더 좋은 건, 왜?

답변1

\newcommand가능성은 (실제로) 무한하기 때문에 으로 무엇을 할 수 있는지 말하기는 매우 어렵습니다 .

나는 당신이 범하고 있는 오류를 지적하면서 당신의 두 가지 예에 대해 이야기할 수 있습니다.

첫 번째 정의에서 \quoteand를 사용했는데 \endquote이는 실수입니다. \quoteLaTeX가 찾을 때 수행하는 명령이지만 \begin{quote}이런 일이 발생합니다.그룹이 열린 후의 부작용으로 \begin. 그룹은 일반적으로 \endLaTeX가 발견하면 에 의해 닫혀서 \end{quote}에 의해 수행된 매개변수 설정이 자동으로 취소됩니다 \quote.

정의에 따라 \mytest{something}선 너비가영구적으로 변경됨왼쪽 들여쓰기는 영원히 계속됩니다. 대신에 다음과 같이 말하는 것이 안전합니다.

\newenvironment{myenv}{\quote}{\endquote}

\begin{myenv}그룹화는 및 에 의해 제공되기 때문입니다 \end{myenv}.

의 주요 기능은 무엇입니까 \newcommand? 간단한 예를 살펴보겠습니다.

\newcommand{\foo}[1]{?#1!}

이제 를 입력하면 \foo{xyz}입력하는 것과 정확히 동일합니다.

?xyz!

왜냐하면 TeX가 스캔할 때 인수( 아닌 경우 첫 번째 토큰 또는 일치하는 토큰 목록까지의 전체 토큰 목록 ) \foo를 찾아야 하고 명령어 에 지정된 대체 텍스트로 바꿔야 한다는 것을 알기 때문입니다 . 여기서 는 로 표시됩니다 .\foo{}\foo<argument>\newcommand<argument>#1

최대 9개의 인수를 가질 수 있습니다(아무 것도 없을 수도 있음). 완료된 것은 이 "대체"뿐입니다. 조건부 구조와 함께 적절한 정의를 사용하면 재귀 매크로를 정의할 수도 있지만 설명하기에는 너무 길어집니다. "사용자 정의"의 가장 큰 부분은 논리 단위를 표시하기 위한 단순한(또는 약간 복잡한) 대체입니다.

TeX는 명령이 나올 때까지 명령 뒤에 오는 내용을 검사하지 않습니다.가지다에게. 따라서 을 수행할 때 \foo인수를 통과하지 않고 매크로 교체가 끝날 때까지 인수 내부의 매크로를 확장하지 않습니다. 그래서 후에

\foo{\baz{x}}

TeX는 볼 것이다

?\baz{x}!

그 후에는 먼저 처리 ?한 다음 \baz{x}처음부터 입력에 있었던 것처럼 처리하지만 두 번째 예에서는 약간의 차이가 나타납니다.

타이핑의 차이점 \foo{\baz{x}}?\baz{x}!TeX이 이미 가지고 있다는 것입니다.토큰화된 \baz{x}.

\verb명령은 모든 특수 문자의 의미를 변경하여 작동합니다. 이는 문자 그대로 조판될 텍스트의 흡수를 가능한 한 지연함으로써 이루어지며 이는 그룹에서 발생합니다. 그래서

\verb+\baz{x}+

다음 단계를 수행합니다

  1. 그룹 열기( 제공 {)
  2. 고정 폭 글꼴로 조판 시작
  3. 모든 특수문자의 의미를 '인쇄 가능'으로 변경
  4. (그룹 종료 토큰) +으로 동작하도록 정의}
  5. 당신이 찾은 것은 무엇이든 계속해서 조판하세요
  6. 후행은 +모든 특수 설정을 취소합니다.

설명이 완전하지는 않지만 우리의 목적에는 충분합니다. 전체 그림을 이해하는 데 관련이 없는 다른 기술적 세부 사항이 있습니다.

정의하면 어떻게 되나요?

\newcommand{\foo}[1]{\verb+#1+}

당신이 제안한대로? TeX가 이를 확인하면 \foo{\baz{x}}인수를 검색하고 토큰화해야 한다는 것을 알게 됩니다. 그러므로 주장은토큰 4개(저는 •로 구분합니다)

\baz • { • x • }

및 의 의미는 변경되지 않으며 \{이상 }수행할 수 없습니다. 더 나쁜 것은 +그룹 종료 토큰이 되기 위해 의미를 변경해야 하는 것은 정의 시 이미 토큰화되었기 때문에 수정할 수 없다는 것입니다. 따라서 LaTeX에는 명령에 대한 인수를 허용하지 않는 보호 메커니즘이 있습니다 \verb. 왜냐하면 이러한 위치에서 사용하면 어떤 종류의 해악도 발생할 수 있기 때문입니다. 설정을 취소할 가능성 없이 특수 문자의 의미를 변경하면 탈출구 없는 구석에.

해결 방법이 있나요? 응, 봐\textbf{} 블록 안에 \verb 명령을 넣는 방법은 무엇입니까?, 그러나 먼저 명령에 대한 인수에서 축어적 표현이 실제로 필요한지 스스로에게 물어보십시오.

관련 정보