e-TeX를 이용한 매크로 기술

e-TeX를 이용한 매크로 기술

e-TeX 확장은 Knuth의 원래 TeX의 일부 단점을 해결하기 위한 것이며 한동안 LaTeX2e에서 필요했기 때문에 대부분의 패키지 작성자는 이 확장에 의존할 수 있습니다. 이제 순수 TeX 매크로 관용구를 학습하는 데 사용할 수 있는 리소스가 있습니다.이 토론이 사이트와 다른 사이트에서도e-TeX의 장점일반적으로 나는 e-TeX 확장이 매크로 작성자의 삶을 어떻게 더 쉽게 만들 수 있는지에 대한 몇 가지 구체적인 예를 보고 싶습니다.

특히 확장 및 구문 분석 관련 명령 사용에 대한 몇 가지 실용적인 조언/ 요령 \protected, \unexpanded\detokenize\scantokens 사용에 대한 몇 가지 실용적인 조언/요령을 알려 주시면 감사하겠습니다. 그것은 나에게 유용해 보이지만 언제 그것을 사용하여 일을 단순화할 수 있는지 결코 깨닫지 못합니다(e-TeX 매뉴얼또한 매우 간결합니다.)


질문의 범위는 상당히 넓지만 위에 나열된 확장에 가장 관심이 있습니다. 다음은 제가 기꺼이 논의하고 싶은 다른 확장에 대한 몇 가지 추가 생각입니다.

일부 확장의 경우 그 유용성이 즉시 명백해졌습니다.

  • 유형당 슬롯 수 32767개 증가로 새 레지스터 할당에 대해 걱정할 필요가 없습니다.
  • 산술 연산을 용이하게 하는 편리한 등 \numexpr의 표현식 명령\dimexpr
  • \unlessnegated 로 \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등이 필요합니다.

  • \unexpandedToks를 사용할 필요 없이 임의의 토큰이 확장되지 않도록 보호할 수 있습니다.

    \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\afterassignmentbox0\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.

관련 정보