
내 egreg의 대체 솔루션을 기반으로이전 질문그로부터 문자를 매크로로 만드는 아이디어를 배웠고 이제는 실제로 훨씬 더 좋아하는 브라켓에 대한 다른 구문을 정의했습니다. 내 매크로거의작동합니다(여기서 약간의 카고 컬트 프로그래밍이 진행되고 있지만 제가 완전히 이해하지 못한 솔루션의 일부(로 시작하는 두 줄)를 \begingroup\lccode
매크로에 복사하고 약간 조정했기 때문에 문제는 다음과 같습니다. 거기에는 다른 질문에 대한 egregs 설명 덕분에 나머지 부분은 충분히 이해했다고 믿기 때문입니다.
내 매크로 정의는 다음과 같습니다.
\newcommand{\braket}[2][\middle]{\ensuremath{
\begingroup
\begingroup\lccode`~=`<
\lowercase{\endgroup\def~}{#1\langle}
\begingroup\lccode`~=`|
\lowercase{\endgroup\def~}{#1\pipedel}
\begingroup\lccode`~=`>
\lowercase{\endgroup\def~}{#1\rangle}
\edef\pipedel{\delimiter\the\delcode`|}
\mathchardef\lt\mathcode`<
\mathchardef\pipechar\mathcode`|
\mathchardef\gt\mathcode`>
\mathcode`\<=\string"8000
\mathcode`\|=\string"8000
\mathcode`\>=\string"8000
\left.
#2
\right.
\endgroup
}}
다음 사용법은 모두 예상대로 작동합니다.
\braket{<\psi|\psi>}
\braket{<\psi|A|\psi>}
\braket{<\psi|\frac{p^2}{2m}|\psi>}
\braket[\Big]{<\alpha|\beta>}
\braket{|a \gt 0>}
\braket[]{<\psi|\frac{p^2}{2m}|\phi>}
(마지막 것은 단순히 자동 크기 적응을 비활성화합니다).
그러나 다음은~ 아니다올바르게 작동:
\braket{<0|1>}
"〈0|1〉"을 제공해야 하지만 "〈0>"만 제공합니다.
그러면 내 매크로에 어떤 문제가 있으며 어떻게 수정합니까?
답변1
문제는 TeX가 활성 파이프를 찾으면 이를 다음으로 확장한다는 것입니다.
\delimiter 2532108
그 뒤에 오는 숫자가 해당 코드에 통합됩니다.
\mathchardef\lt\mathcode`<
\mathchardef\pipechar\mathcode`|
\mathchardef\gt\mathcode`>
\edef\pipedel{\delimiter\the\delcode`| }
\show\pipedel
\newcommand{\braket}[2][\middle]{
\begingroup
\begingroup\lccode`~=`<
\lowercase{\endgroup\def~}{#1\langle}
\begingroup\lccode`~=`|
\lowercase{\endgroup\def~}{#1\pipedel\relax}
\begingroup\lccode`~=`>
\lowercase{\endgroup\def~}{#1\rangle}
\mathcode`\<=\string"8000
\mathcode`\|=\string"8000
\mathcode`\>=\string"8000
\mathopen{}\left.#2\right.\mathclose{}
\endgroup
}
\relax
문제를 피할 수 있습니다 . 또한 일부 부분은 정의를 벗어나는 것이 더 낫기 때문에 \ensuremath
권장되지 않습니다.
\lowercase
트릭 에 대한 참고 사항
문자(범주 코드 11 또는 12)에 수학 코드가 할당되고 "8000
수학 모드에서 발견되면 TeX에서는 해당 문자가 활성인 것처럼(즉, 매크로처럼) 처리되며 활성 문자로 정의해야 합니다. .
매우 일반적으로 사용되는 트릭은~
~이다활동적인; active에 의미를 부여하려면 <
두 가지 전략이 있습니다. 첫 번째는
{\catcode`<=\active \gdef<{something}}
여기에는 몇 가지 단점이 있습니다. 사전에 실행해야 하며글로벌. 그래서 우리는 다른 전략을 사용합니다:
\begingroup\lccode`~=`< \lowercase{\endgroup\def~}{something}
어떻게 작동하나요? 우선, 우리는 그룹을 열고 그룹에서 TeX에게 의 소문자 대응이 임을 알려 ~
줍니다 <
. 그런 다음 우리는 \lowercase
를 수행합니다.캐릭터 토큰소문자로 변환하고(그러나 제어 시퀀스는 변경되지 않은 채로 유지) 토큰을 처음부터 있었던 것처럼 다시 넣습니다. 그래서 TeX는
\endgroup\def<{something}
(하지만<
~이다활성 상태이므로 \lowercase
카테고리 코드는 변경되지 않습니다). 와 및 정의 \endgroup
사이의 대응을 취소 합니다 . 나중에 우리가 마법이 일어날 것이라고 말할 때( 에 대한 예방 조치입니다.~
<
\mathcode`<=\string"8000
\string
바벨"
활성 캐릭터로 만들어졌을 수도 있음 )