
새 명령을 만들려고 시도했지만 실패한 것은 이번이 처음이 아닙니다. 내가 발견한 일부 기능은 작동하지 않았습니다("정의되지 않은 제어 순서" 또는 기타 오류 발생).
따옴표-끝따옴표 인수를 사용하십시오.
\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
가능성은 (실제로) 무한하기 때문에 으로 무엇을 할 수 있는지 말하기는 매우 어렵습니다 .
나는 당신이 범하고 있는 오류를 지적하면서 당신의 두 가지 예에 대해 이야기할 수 있습니다.
첫 번째 정의에서 \quote
and를 사용했는데 \endquote
이는 실수입니다. \quote
LaTeX가 찾을 때 수행하는 명령이지만 \begin{quote}
이런 일이 발생합니다.그룹이 열린 후의 부작용으로 \begin
. 그룹은 일반적으로 \end
LaTeX가 발견하면 에 의해 닫혀서 \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}+
다음 단계를 수행합니다
- 그룹 열기( 제공
{
) - 고정 폭 글꼴로 조판 시작
- 모든 특수문자의 의미를 '인쇄 가능'으로 변경
- (그룹 종료 토큰)
+
으로 동작하도록 정의}
- 당신이 찾은 것은 무엇이든 계속해서 조판하세요
- 후행은
+
모든 특수 설정을 취소합니다.
설명이 완전하지는 않지만 우리의 목적에는 충분합니다. 전체 그림을 이해하는 데 관련이 없는 다른 기술적 세부 사항이 있습니다.
정의하면 어떻게 되나요?
\newcommand{\foo}[1]{\verb+#1+}
당신이 제안한대로? TeX가 이를 확인하면 \foo{\baz{x}}
인수를 검색하고 토큰화해야 한다는 것을 알게 됩니다. 그러므로 주장은토큰 4개(저는 •로 구분합니다)
\baz • { • x • }
및 의 의미는 변경되지 않으며 \
더 {
이상 }
수행할 수 없습니다. 더 나쁜 것은 +
그룹 종료 토큰이 되기 위해 의미를 변경해야 하는 것은 정의 시 이미 토큰화되었기 때문에 수정할 수 없다는 것입니다. 따라서 LaTeX에는 명령에 대한 인수를 허용하지 않는 보호 메커니즘이 있습니다 \verb
. 왜냐하면 이러한 위치에서 사용하면 어떤 종류의 해악도 발생할 수 있기 때문입니다. 설정을 취소할 가능성 없이 특수 문자의 의미를 변경하면 탈출구 없는 구석에.
해결 방법이 있나요? 응, 봐\textbf{} 블록 안에 \verb 명령을 넣는 방법은 무엇입니까?, 그러나 먼저 명령에 대한 인수에서 축어적 표현이 실제로 필요한지 스스로에게 물어보십시오.