누가 futurelet을 설명해 줄 수 있나요?이내에환경 정렬?
예:
\A 명령은 다음 문자가 {이면 "A"를, &이면 "B"를, 그 외의 경우에는 "C"를 제공해야 합니다.
\gdef\A{\futurelet\thesymbol\B}
\gdef\B#1{\ifx\bgroup\thesymbol A\else\ifx&\thesymbol B\else C\fi\fi}
일반 텍스트나 인라인 수학의 경우에는 꽤 잘 작동합니다.
\A{a},\A&,\A a % -> "A,B,C"
$\A{a}$,$\A&$,$\A a$ % -> "A,B,C"
하지만align* 환경(amsmath) 내에서 사용하는 순간 "불완전 \ifx" 오류가 발생합니다.
\begin{align*} \A{a},\A&,\A a \end{align*}% --> error.
누군가 나에게 설명해줄 수 있나요? 고마워!
크리스
추신: 내가 이해하지 못하는 정렬 환경의 futurelet에 관한 더 많은 것들이 있습니다:
\gdef\A{\futurelet\thesymbol\alpha}
\gdef\D#1{\detokenize{#1}}
그 다음에
\begin{align*}
\D&,\A a % -> "&,alpha a" (okay)
\A a,\D{&} % -> "alpha a,&" (okay)
\A a,\D& % -> error: "Argument of D has an extra }." (???)
\end{align*}
답변1
\gdef\B#1{\ifx\bgroup\thesymbol A\else\ifx&\thesymbol B\else C\fi\fi}
TeX가 라텍스 케이스에 지정된 대로 &
템플릿의 나머지 부분을 바꾸는 것을 확인하면 템플릿 의 처음 두 토큰을 비교합니다(아마도 셀( 및 그룹)은 문제가 종료될 것입니다) .\halign
c
r
\ifx
\unskip
\hfil
&
futurelet 이전에 그룹을 시작하고 테스트 후에 그룹을 종료하는 동안 숨기려면 다음이 필요합니다.
{\ifnum0=`}
...
\ifnum0=`{\fi}
표 형식의 코드 전체에 나타나는 형식입니다.
이것은 의도한 결과인 A,B,C를 생성합니다.
\documentclass{article}
\usepackage{amsmath}
\gdef\A{{\ifnum0=`}\fi\futurelet\thesymbol\B}
\gdef\B#1{\ifx\bgroup\thesymbol A\else\ifx&\thesymbol B\else C\fi\fi \ifnum0=`{\fi}}
\begin{document}
\begin{align*} \A{a},\A&,\A a \end{align*}
\end{document}
두 번째 예에서는 &
그룹을 종료하는 메모의 경우
a,\D&
은 다음과 같 {\D}
으며 둘 다 동일한 오류가 발생합니다.
! Argument of \D has an extra }.
<inserted text>
\par
l.15 {\D}
무엇을 하려는지 명확하지 않기 때문에 수정 사항이 무엇인지 명확하지 않습니다 {\D}
.
답변2
나는 TeX 코드에 대한 David의 이해와 경쟁할 수 없으므로 귀하의 매크로를 수정하려고 시도하지 않을 것입니다(그러나 귀하가 하고 있는 일은 근본적으로 현명하지 못한 것이라고 생각합니다). 그러나 "TeX가 the를 볼 때"에 대한 그의 의견은 &
다음과 같이 확장될 수 있습니다. 정렬을 스캔할 때 TeX는 대부분의 사용자(경험이 많고 지식이 풍부한 사용자라도)가 실행에 대해 가지고 있는 정신적 모델과 다소 상충되는 방식으로 작동합니다. 즉, 우리는상상하다TeX은 항상 다음 세 가지 중 하나를 수행합니다.
매크로 파서 "입"에 음식을 제공하기 위해 문자를 토큰화하기 위해 입력을 스캔합니다.
매크로 확장;
확장 불가능한 토큰 실행: 또는 같은 프로그래밍 지시문
\def
또는\hbox
문자와 같은 완전한 조판 명령.
이 모델에서는 모든 사람이 정렬(TeX 기본 형식 \halign
또는 \valign
) 내에서 탭 문자가 &
3번 항목인 실행에서 작업을 수행할 것으로 기대합니다. 그러나 실제로는 그렇지 않습니다. 실제로 TeX는 포인트 1의 탭 문자를 "알립니다"! TeX의 경우읽은 적이 있다앰퍼샌드(또는 이와 동등한 문자 범주)를 사용하면 현재 셀이 즉시 종료되고, 그룹이 닫히고, v
템플릿의 "부분"이 삽입되는 등의 작업이 수행됩니다.
(편집하다:나는 단지 훑어보던 중 errorlog.pdf
(즉, texdoc errorlog
) 1978년 3월 18일 디버깅 세션에서 관련 설명을 찾았습니다.
get next 루틴 인터셉트
&
및\cr
토큰을 만듭니다. 나는 그냥 [즉, 눈이 아닌 TeX의 뱃속에]&
and를\cr
넣을 수 있다고 생각했습니다.big_switch
그것은 아주 큰 실수였습니다.
이는 Knuth가 이러한 배열 토큰의 동작을 위와 같이 분명히 기괴하게 선택하게 만든 이유에 대한 흥미로운 부분 통찰력이자 이것이 실제로 동작이라는 확인입니다.
물론 예외는 TeX가 미완성 중괄호 그룹 내에 있는 경우입니다(이 그룹을 시작하는 암시적 문자나 가 아닌 실제 중괄호 문자여야 합니다 ). 이는 확장 가능하게 여는 중괄호와 동등한 \begingroup
David의 }` 구성으로 이어집니다. {\ifnum0=
배치될 수 있는 매크로 정의 내부에 실제로 불균형 중괄호를 만들지 않고.
이 이상한 구문 분석 규칙의 결과는 테이블 셀의 매크로가 읽는 내용이나 환경에 포함된 내용에 매우 주의해야 한다는 것입니다. 매크로 인수 구문 분석이 아닌 할당을 통해 인수를 효과적으로 읽는 것과 같은 매크로는 훨씬 더 불안정합니다. 필수 묶는 중괄호가 없으면 읽을 수 있는 탭이~ 아니다보호받으세요. 테이블 호환 환경 \ifnum
에는 발생할 수 있는 탭 문자를 보호하기 위한 것이 포함됩니다. 더 순진한 것들은 셀 전체에 걸쳐 분할되어 아마도 실패할 것입니다.