
e-TeX 확장은 Knuth의 원래 TeX의 일부 단점을 해결하기 위한 것이며 한동안 LaTeX2e에서 필요했기 때문에 대부분의 패키지 작성자는 이 확장에 의존할 수 있습니다. 이제 순수 TeX 매크로 관용구를 학습하는 데 사용할 수 있는 리소스가 있습니다.이 토론이 사이트와 다른 사이트에서도e-TeX의 장점일반적으로 나는 e-TeX 확장이 매크로 작성자의 삶을 어떻게 더 쉽게 만들 수 있는지에 대한 몇 가지 구체적인 예를 보고 싶습니다.
특히 확장 및 구문 분석 관련 명령 사용에 대한 몇 가지 실용적인 조언/ 요령 \protected
, \unexpanded
및\detokenize
\scantokens
사용에 대한 몇 가지 실용적인 조언/요령을 알려 주시면 감사하겠습니다. 그것은 나에게 유용해 보이지만 언제 그것을 사용하여 일을 단순화할 수 있는지 결코 깨닫지 못합니다(e-TeX 매뉴얼또한 매우 간결합니다.)
질문의 범위는 상당히 넓지만 위에 나열된 확장에 가장 관심이 있습니다. 다음은 제가 기꺼이 논의하고 싶은 다른 확장에 대한 몇 가지 추가 생각입니다.
일부 확장의 경우 그 유용성이 즉시 명백해졌습니다.
- 유형당 슬롯 수 32767개 증가로 새 레지스터 할당에 대해 걱정할 필요가 없습니다.
- 산술 연산을 용이하게 하는 편리한 등
\numexpr
의 표현식 명령\dimexpr
\unless
negated 로\if
, 특히 s 와 함께 사용\loop
하면 조건이 false인 동안 루프를 실행하려면 새로운 조건을 정의해야 했습니다.- 진단에 도움이 되는 다양한 새로운 추적 명령 및 옵션
하지만 일부 기능을 보면 실제로 해당 기능이 외부 패키지에서 사용되는지 아니면 다음과 같은 "현대적인" 접근 방식으로 대체되었는지 궁금합니다.
- 등을
\beginL
사용한 혼합 방향 조판\beginR
\currentgrouptype
, 등\currentiftype
의 상태 조회\lastnodetype
- 내장된 페이지 상단에서 버려진 항목을 저장할 수 있는 가능성
\pagediscards
\interlinepenalties
등과 같은 특정 처벌을 라인
답변1
e-TeX에서 '큰 티켓' 항목 가져오기:
\protected
내부에서 확장되지 않는 매크로를 만들 수 있습니다\edef
.\protected\def\foo{\let\baz\bong} \edef\test{Some text\foo}
일반적으로 오류가 발생하지만(
\baz
/ 에 대한 정의가 없다고 가정\bong
) 여기서는 '안전'합니다. LaTeX2e 메커니즘을 살펴보면\protect
위의 내용은많은 사용하기 쉽고 안정적임:\protected
매크로절대내부x
유형 정의를 확장하는 반면 LaTeX2e 접근 방식에서는\protected@edef
등이 필요합니다.\unexpanded
Toks를 사용할 필요 없이 임의의 토큰이 확장되지 않도록 보호할 수 있습니다.\edef\test{Some text\unexpanded{lots of \textbf{stuff}}}
이는 임의의 사용자 입력에 매우 유용합니다. 또한 다음과 같은 것도 허용합니다.
\edef\demo{\unexpanded{tokens #}}
이는
#
매크로 내에 쉽게 저장할 수 있음을 의미합니다(expl3
tl
데이터 유형 참조).\detokenize
예를 들어 활성 문자가 있는 경우 물건을 '안전하게' 만드는 데 좋습니다.\csname Tokens\detokenize{&_~^\foo}\endcsname
예를 들어 LaTeX에서 UTF-8 입력에 활성 문자를 사용하는 경우 특히 그렇습니다.
\numexpr
등은 확장 가능한 계산을 쉽게 수행하는 데 적합합니다.
답변2
TeX Live의 소스 파일을 살펴보면서 적어도 내 생각에는 e-TeX의 덜 널리 알려진 기능의 사용에 대한 통찰력을 추가할 수 있습니다.
일부의 경우상태조회기본 요소인 Heiko Oberdiek의 패키지는 해당 응용 프로그램에 대한 몇 가지 설명을 제공합니다. 패키지 atbegshi
는 상자를 인수로 취하는 기본 요소를 재정의할 수 있는 방법( 이 경우)을 보여주며, 인수가 및 \shipout
로 가로채어지면 할당 후에 삽입될 토큰이 그럴 수도 있고 그럴 수도 있다는 점을 고려합니다. 상자가 로 주어지는 지 여부 에 따라 상자 안에 착륙하지 않습니다 . 대략 다음과 같습니다.\setbox
\afterassignment
box0
\hbox{...}
\def\shipout{%
\edef\saved@grouplevel{\number\currentgrouplevel}
\afterassignment\@test
\setbox\mybox=}
\def\@test{%
\ifnum\saved@grouplevel<\currentgrouplevel
\expandafter\aftergroup
\fi
\output
}
e-TeX를 사용하여 상자(그룹을 열었음) 내부에 착륙 \currentgrouplevel
했는지 여부를 결정합니다 \@test
. 이 경우 후속 \output
작업은 상자 이후까지 연기됩니다.
또 다른 유용한 사실은 \lastnodetype
버릴 수 없는 모든 것의 경우 11보다 작고, 현재 목록이 여전히 비어 있으면 -1입니다( setouterhbox
이것의 적용 예를 참조하세요).
egreg가 주석에서 지적했듯이 수학 모드에서 쿼리하여 구분 기호 변형을 \currentgrouptype
사용할지 여부를 결정할 수 있습니다. 예를 들어 다음과 같이 열린 그룹의 16도 마찬가지입니다.\middle
\currentgrouptype
\left
여기).
e-TeX양방향 조판TeX 형태의 기능 - XeT는 XeTeX에서 사용되는 것으로, 패키지 bidi
는 이러한 기능에 대한 인터페이스를 제공합니다. 또한 이와 같은 일부 표준 LaTeX 패키지의 경우에도 babel-hebrew
좋은 방법인 것 같습니다. 그러나 LuaTeX는 등의 기본 요소 \beginL
를 포기 \beginR
하고 대신 Omega TeX 확장을 통합합니다.
그런 다음 여러 기능에 대해 실제 응용 프로그램을 찾지 못했습니다. 그들이 나타나는 유일한 장소는 LaTeX3 커널, ConTeXt MkIV 및 패키지와 같은 모든 기본 요소가 나타나는 곳 unravel
과 작성자가 이를 사용하여 다른 패키지와의 호환성을 높이려고 시도한 몇 가지 다른 장소입니다. 이러한 기능에는 \currentif{type,branch,level}
문의, \pagediscards
기능 및 특정 라인이 포함됩니다 \{inter,club,widow}linepenalties
.