표준 \newcommand et al과 대조되는 \DeclareTextSymbol 및 \DeclareTextCommandDefault

표준 \newcommand et al과 대조되는 \DeclareTextSymbol 및 \DeclareTextCommandDefault

~ 안에이것답변 egreg 는 매크로를 사용했으며 \DeclareTextSymbol이전 에 (실패한) 간단한 또는 .\DeclareTextCommandDefault\UndeclareTextCommand\newcommand\let

누군가 이러한 명령의 올바른 사용과 표준과의 차이점 \newcommand등에 대해 자세히 설명해 주시겠습니까?

답변1

일부 명령은 현재 출력 인코딩에 따라 작업을 선택할 수 있습니다.

가장 간단한 예는 악센트의 예입니다. \"출력 인코딩(사용 가능한 글리프와 글꼴에서의 해당 위치 간의 대응)이 OT1 또는 T1일 때 다르게 동작하기를 원합니다 .

첫 번째 경우 는 \"u악센트와 문자의 출력을 구성하고 T1을 사용하면 미리 구성된 문자를 직접 조판합니다(하이픈 넣기를 고려할 때 이 차이는 매우 중요합니다).

따라서 인코딩을 전환할 때 정의를 변경하기 위해 명령 목록을 유지하는 대신 \DeclareTextSymbol또는 유사한 기능을 사용하여 명령을 정의할 수 있습니다.

을 살펴보자 \textborn. 기본 LaTeX에서는 정의되지 않았지만 textcomp이에 대한 정의를 제공합니다.

% textcomp.sty, line 225
\DeclareTextCommandDefault{\textborn}{\tc@check@symbol2\textborn}

대체 텍스트가 무엇을 해야 하는지 아는 것은 중요하지 않지만 이는 다음 \textborn과 같이 정의됩니다.

\?-cmd \textborn \?\textborn

(세 개의 토큰, 마지막은 확장이 위의 대체 텍스트이고 \tc@check@symbol2\textborn다음을 수행하여 액세스할 수 있는 단일 토큰입니다 \csname ?\string\textborn\endcsname.)

나중에 가 ts1enc.def로드되면 textcomp.sty암시적으로 호출하기 때문에 \usepackage[TS1]{inputenc}LaTeX는

\DeclareTextSymbol{\textborn}{TS1}{98}

이전과 비슷한 트릭을 수행하고 다음 \textborn과 같이 정의합니다.

\TS1-cmd \textborn \TS1\textborn

(다시 3개의 토큰) 이것이 가장 중요한 부분입니다. 이와 같은 명령은 어떻게 작동합니까?

확장 시 \textbornLaTeX가 문자 조판이 예상되는 위치에 있으면 현재 출력 인코딩이 TS1에 대해 확인됩니다. 그렇다면 현재 글꼴의 글리프 번호 98만 사용됩니다. 그렇지 않으면 그룹이 열리고 인코딩이 TS1로 전환되고 문자 98이 조판되고 그룹이 닫힙니다.

이러한 명령은 항상 강력합니다. 즉, 이동 인수에서 발견되면 쓰기 작업이 포함될 때 확장하는 대신 자체적으로 생성됩니다.

이것은 할 때 당신의 당혹감을 설명해야합니다

\let\oldtextborn\textborn

로드하기 전에 및 에 kpfonts의해 생성된 출력 간에 차이가 없는 것을 확인합니다 . 패키지 는 재정의하지 않고 선택한 글꼴 계열 이름을 기반으로 TS1 인코딩에 새 글꼴을 연결합니다. 그래서 그리고 여전히 동일합니다.\textborn\oldtextbornkpfonts\textborn\oldtextborn\textborn

\textborn가족을 사용하도록 정의하려면 cmr다음과 같은 전략이 필요하기 때문에 주의해야 합니다.

\let\oldtextborn\textborn
\renewcommand\textborn{{\fontfamily{cmr}\selectfont\oldtextborn}}

안전이 보장되지는 않습니다. 예를 들어 \textborn섹션 제목이나 캡션과 같이 움직이는 논쟁에 나타나면 파일 .aux에는 다음이 포함됩니다.

\@writefile{toc}{\contentsline {section}{\numberline {1}{\fontfamily  {cmr}\selectfont  {\fontfamily  {cmr}\selectfont  \textborn }}}{1}}

명령이 몇 번 확장된 것처럼 보입니다. 다른 상황에서는 이로 인해 무한 루프가 발생할 수도 있습니다.

관련된 전략이 \UndeclareTextCommand확실히 더 안전합니다.

관련 정보