모든 TeX-based 엔진의 루트에는 Knuth의 원래 TeX와 엄격한 상위 집합인 e-TeX가 있습니다. 이 페이지에서는 "TeX 프로그램"이 실제로 무엇인지, plain TeX가 무엇인지, 오늘날 거의 아무도 이 프로그램을 직접 작성하지 않는 이유, 여전히 중요한 이유, 그리고 1990년대에 추가된 e-TeX 확장 기능(1990년대에 추가됨)이 이제 모든 현대 엔진의 기반이 되는 확장 기능을 다룹니다.
"TeX 프로그램"이란 무엇입니까?
혼란스럽게도 TeX라는 단어는 두 가지를 나타냅니다. 하나는 Donald Knuth가 작성한 조판 프로그램 자체입니다. 다른 하나는 프로그램이 해석하는 명령 시스템입니다. 적절한 프로그램은 가차 없이 낮은 수준의 엔진입니다. 문자와 상자를 줄과 단락으로 묶고, 줄 바꿈을 최적화하고, 결과를 출력 파일에 기록합니다.
Knuth는 자신의 책 *The Art of Computer Programming*의 인쇄 품질에 만족하지 못한 채 1978년에 첫 번째 TeX를 시작했습니다. 초기 버전은 탐색적 프로토타입이었습니다. 1982년에 완전히 다시 작성되었으며 해당 재작성은 TeX82로 알려져 있습니다. 오늘날 "TeX"는 사실상 이 TeX82 계보를 의미합니다. Knuth가 내장한 최소 명령 세트를 기본형(\def, \hbox, \vbox 등)이라고 합니다.
기본 프리미티브로 문서를 작성하는 것은 비실용적이므로 일반적으로 그 위에 구축된 매크로 레이어인 형식을 사용합니다. plain.tex를 로드하면 plain TeX가 제공됩니다. 훨씬 더 큰 매크로 세트를 로드하면 LaTeX가 제공됩니다. 형식은 미리 확장되어 빌드 시 .fmt 파일로 저장되므로 엔진이 실행될 때마다 처음부터 다시 읽을 필요가 없습니다.
Plain TeX
Plain TeX는 *The TeXbook*에 제시된 Knuth의 표준 형식입니다. 글꼴 설정, 기본 수학 기호, \bye와 같은 편의 매크로 등 최소한의 툴킷을 TeX 자체와 함께 제공되는 plain.tex에 수집합니다. LaTeX 이전에는 이것이 TeX를 사용하는 유일한 실용적인 방법이었습니다.
표기법은 LaTeX와 눈에 띄게 다릅니다. 인라인 수학은 $...$(LaTeX와 동일)입니다. 가로 상자는 \hbox{...}, 세로 상자 \vbox{...}, 표 형식 정렬은 \halign로 수행되고 명령은 \def로 정의되며 텍스트 너비는 \hsize, 문서는 \bye로 끝납니다. \documentclass도 없고 \begin{document}도 없습니다. 이것들은 모두 LaTeX가 매크로로 구축한 것입니다.
% plain TeX — tex hello.tex で処理 / process with: tex hello.tex
\hsize=10cm
\font\big=cmr10 at 17pt
{\big Hello, plain \TeX!}
\medskip
This paragraph is set in the default font.
Inline math works too: $E = mc^2$.
\byetex hello.tex로 예제를 처리하면 DVI 파일이 생성됩니다(PDF가 아님 - 아래 참조). \TeX와 같은 로고 매크로와 \medskip(중간 수직 건너뛰기)와 같은 간격 매크로도 plain TeX에 의해 정의됩니다. LaTeX \documentclass 문서 옆에 설정하면 plain TeX 스킨이 베어 엔진 위에 얼마나 얇은지를 보여줍니다.
프로그래밍 및 WEB 읽기
TeX 자체는 Knuth의 자체 시스템이자 읽기 쉬운 프로그래밍의 기본 관행인 WEB로 작성되었습니다. WEB 소스는 사람이 직접 설명하는 설명과 Pascal 코드가 함께 짜여진 단일 문서입니다. 두 개의 도구는 그로부터 파생물을 추출합니다. tangle는 컴파일 가능한 Pascal를 생성하고 weave는 조판 주석(*TeX: The Program* 책)을 생성합니다.
원래 대상 언어는 Pascal였습니다. 최신 배포판에서는 web2c라는 도구가 빌드를 위해 WEB(Pascal를 통해)를 C로 변환합니다. 따라서 오늘날 귀하의 컴퓨터에서 실행되는 pdfTeX 또는 LuaTeX는 궁극적으로 단일 리터럴 소스로 계속 추적됩니다.
π로 수렴하는 버전 번호
TeX의 버전 번호 지정은 독특합니다. 버전 3부터 업데이트할 때마다 숫자가 하나 더 추가되므로 숫자는 점근적으로 π에 가까워집니다. 현재 버전은 3.141592653이며, 그 해 2월 2021 튠업에 의해 설정되었으며 그 이후로는 변경되지 않았습니다. 이는 프로그램이 본질적으로 완료되었으며 예외적으로 안정적이라는 상징입니다.
Knuth는 사후에 이루어진 "최종 변경"을 통해 버전이 정확히 π로 설정될 것이라고 선언했습니다. 이 시점에서 나머지 버그는 영구적인 기능이 됩니다. 실제로 TeX는 수년 동안 새로운 기능을 얻지 못했으며 보고된 문제는 작은 수정 사항에 불과합니다. 이 동결된 안정성은 수십 년 전의 .tex 파일이 오늘날에도 여전히 동일한 출력을 생성하는 이유입니다.
METAFONT 및 DVI
TeX에는 METAFONT(mf)라는 쌍둥이 컴패니언이 있습니다. 이 시스템은 글꼴을 고정된 모양이 아니라 글리프를 그리는 *프로그램*으로 설명하는 시스템입니다. Knuth는 이를 사용하여 TeX용 전체 Computer Modern 서체 제품군을 디자인했습니다. 노동 분업은 TeX가 캐릭터의 이동 위치를 결정하고 METAFONT가 캐릭터 자체의 모양을 생성한다는 것입니다.
Knuth의 TeX가 직접 내보내는 것은 PDF가 아니라 DVI (DeVice Independent) 파일입니다. DVI에는 장치 독립적인 명령("이 문자를 이 위치에 배치")만 포함되며, 이 명령은 dvips에 의해 PostScript로 또는 dvipdfmx에 의해 PDF로 변환됩니다. 오늘날 널리 사용되는 pdfTeX, XeTeX 및 LuaTeX의 주요 차이점은 이 단계를 건너뛰고 PDF를 직접 생성한다는 것입니다.
여전히 중요한 이유
실제로 새로운 작업을 위해 원시 plain TeX를 작성하는 사람은 거의 없습니다. 실용적인 기계(번호 매기기, 상호 참조, 클래스 파일)는 모두 맨 위에 있는 LaTeX 레이어에 있으며 일상적인 글쓰기는 그 편안함 속에서 이루어집니다. 그러나 여기에 설명된 기본 요소를 아는 것에는 실질적인 가치가 있습니다.
- 모든 형식의 기초. LaTeX 및 ConTeXt는 모두 궁극적으로 이러한 기본 요소를 기반으로 구축되었습니다.
- 오류의 맨 아래까지 볼 수 있습니다.
\hbox및\vbox의 어휘를 알면 복잡한 오류와 낮은 수준의 조정을 읽을 수 있습니다. - 상자와 접착제의 세계관. *상자*와 신축성 있는 *접착제*로 페이지를 구축한다는 TeX의 아이디어는 LaTeX를 심층적으로 사용하기 위한 공유 언어입니다.
- 보편성과 재현성. 엔진이 정지되어 있기 때문에 과거 문서는 미래에도 계속 동일한 결과를 생성합니다.
e-TeX는 무엇입니까?
Knuth가 TeX를 동결했기 때문에 새로운 기능은 다른 사람의 손에서 나와야 했습니다. 그래서 1990년대에 유럽의 NTS(New Typesetting System) 프로젝트 중에서 e-TeX가 나왔고 Peter Breitenlohner가 주요 개발을 맡았습니다. e-TeX는 TeX를 대체하지 않습니다. 이는 엄격한 상위 집합으로 설계되었습니다. 즉, 기존 입력은 변경되지 않고 동일한 출력으로 실행됩니다.
e-TeX에는 두 가지 모드가 있습니다. 호환성 모드에서는 클래식 TeX와 똑같이 작동합니다. *로 시작하여 입력된 확장 모드에서만 추가된 기본 요소를 사용할 수 있습니다. 확장 모드에서 포맷이 구축되면 사용자는 그것에 대해 전혀 생각할 필요가 없습니다.
이제 기준선
오늘날 e-TeX 확장은 단순히 존재한다고 가정됩니다. TeX Live는 2003년부터 e-TeX로 기본값이 설정되었습니다, LaTeX는 2017년부터 공식적으로 e-TeX 프리미티브를 요구했습니다. 더욱 중요한 점은 현재의 모든 엔진 번들 e-TeX: pdfTeX, XeTeX 및 LuaTeX는 모두 e-TeX 확장 기능을 통합하고 그 위에 자체 기능을 추가한다는 것입니다.
즉, pdfLaTeX 또는 LuaLaTeX로 조판하면 이를 깨닫지 못한 채 e-TeX에서 실행되고 있는 것입니다. expl3, LaTeX3 프로그래밍 계층으로 시작하는 많은 최신 패키지는 e-TeX 프리미티브 없이는 존재할 수 없습니다.
프리미티브 e-TeX는 다음을 추가합니다.
e-TeX의 추가 사항은 매크로를 작성하는 사람들에게 가장 중요합니다. 가장 큰 것은 정수, 차원 및 접착제에 대한 산술입니다. 기본 TeX에서는 계산을 위해 스크래치 레지스터를 섞어야 했습니다. e-TeX는 (a+b)*c/d와 같은 표현식을 즉석에서 평가하는 \numexpr, \dimexpr, \glueexpr를 확장 가능한 형태로 제공합니다.
% 拡張モードの e-TeX 系エンジンで / on any e-TeX engine in extended mode
\count0=\numexpr (3+4)*2/7 \relax % 2 が入る / yields 2
% プリミティブが「定義済みか」を安全に分岐 / branch safely on whether a name is defined
\ifdefined\foo \message{foo exists}\else \message{no foo}\fi
% 制御綴を作らずに名前の存在を確かめる / test a control sequence without creating it
\ifcsname chapter\endcsname \message{chapter is defined}\fi
% \unless で「if の否定」を直接書く / negate a conditional directly
\unless\ifnum\count0>10 \message{count0 is not greater than 10}\fi두 번째 기둥은 조건부 및 토큰 조작입니다. \ifdefined는 제어 시퀀스가 정의되었는지 테스트하고 \ifcsname...\endcsname는 이름에서 조합된 시퀀스의 존재를 테스트합니다. 둘 다 부작용 없음(기본 TeX의 이전 \ifx 트릭은 정의되지 않은 시퀀스를 자동으로 \relax로 바꿀 수 있습니다). \unless는 모든 조건을 반전시키고, \detokenize는 토큰 목록을 문자열 형식(범주 코드 12의 문자)으로 바꿉니다.
확장 제어도 강화됩니다. \unexpanded는 내용을 확장하지 않고 그대로 두고, \protected는 \edef 및 \write와 같은 확장 컨텍스트에서 자체적으로 확장되지 *않는* 정의된 매크로를 만듭니다. 이는 LaTeX의 \protect를 낮은 수준에서 올바르게 구현하는 열쇠입니다.
| 원시 | 기능 |
|---|---|
\numexpr / \dimexpr / \glueexpr | 정수/차원/접합 표현식을 제자리에서 평가(확장 가능) |
\ifdefined / \ifcsname | 부작용 없이 제어 시퀀스가 정의/존재하는지 테스트합니다. |
\unless | 다음 조건문의 의미를 뒤집어 보세요. |
\protected | 확장 컨텍스트 내에서 확장되지 않는 매크로를 정의하세요. |
\detokenize / \unexpanded | 토큰을 문자열로 변환/토큰을 확장되지 않은 상태로 유지 |
\scantokens / \readline | 문자열을 토큰으로 다시 읽기/입력 줄을 그대로 읽기 |
\middle | \left … \right 중간에 신축성 있는 구분 기호를 배치합니다. |
\currentgrouplevel / \interactionmode | 현재 그룹 심도 검사/상호작용 모드 가져오기 및 설정 |
이 외에도 \left( … \middle| … \right)와 같은 신축성 있는 구분 기호를 위한 \middle가 있습니다. 문자열을 토큰으로 다시 읽으려면 \scantokens; \readline는 입력 라인을 그대로 읽습니다. \currentgrouplevel는 현재 그룹 깊이를 반환합니다. \interactionmode는 상호 작용 모드를 읽고 변경합니다. e-TeX는 또한 XeTeX, LuaTeX 및 일본어 처리의 이후 작업에 적용되는 양방향(오른쪽에서 왼쪽) 조판을 위한 후크를 도입했습니다.
조용하지만 결과적인 확장은 레지스터의 큰 증가입니다. 베어 TeX에는 \count, \dimen, \skip, \toks 등이 각각 256개만 있었습니다. e-TeX는 이를 32768(희소 배열로 할당됨)로 늘렸습니다. 많은 대형 클래스와 패키지가 로드되는 경우에도 레지스터가 더 이상 쉽게 실행되지 않습니다. 이는 오늘날의 헤비급 LaTeX 설정 아래 알려지지 않은 지원입니다.
이것이 LaTeX 문서에서 어떻게 도움이 되는지
plain TeX에서는 논문이나 기술 문서를 작성할 필요가 없습니다. 그래도 \hbox, \vbox, \count, \dimen 및 \def라는 어휘를 알면 오류 메시지의 맨 아래 계층을 읽을 수 있습니다. 예를 들어, Overfull \hbox는 재료가 라인 박스 밖으로 튀어나온다고 말합니다. Missing number, treated as zero는 TeX가 숫자나 차원으로 읽을 수 있는 것을 기대했지만 찾지 못했다고 말합니다.
레이어를 이해하는 것은 레이어에 직접 산문을 쓰는 것과 다릅니다. LaTeX의 구조 명령이 제목, 목록, 상호 참조 및 정리 환경을 처리하도록 합니다. 문제가 발생한 이유를 읽거나 클래스를 좁게 수정하기 위한 낮은 수준의 명령을 유지하세요. 새 명령을 정의할 때에도 일반 문서는 원시 \def보다 \newcommand 또는 \NewDocumentCommand에 의해 더 잘 제공됩니다. 왜냐하면 LaTeX는 인수 수와 기존 명령과의 충돌을 확인할 수 있기 때문입니다.
- 산문을 작성할 때 LaTeX 구조 명령을 사용하고 낮은 수준의 기본 요소를 드물게 유지하세요.
- 클래스나 패키지를 수정할 때
\ifdefined및\numexpr와 같은 e-TeX 도구는 이전 TeX 트릭보다 안전합니다. - 로그를 읽을 때 경고를 TeX의 상자, 접착제 및 레지스터 언어로 번역하세요. 원인이 드러납니다.