처리 방식과 흐름(DVI/PDF)

LaTeX는 입력하는 동안 결과를 표시하지 않습니다. 일반 텍스트 .tex 파일을 작성하고 컴파일하여 PDF("쓰기 후 한 번에 모든 것을 처리하는" 모델)를 얻습니다. 두 가지 경로가 있습니다. 하나는 중간 DVI 파일을 통과하고 다른 하나는 PDF를 직접 생성합니다.

왜 WYSIWYG가 아닌가?

TeX는 전체 단락을 한 번에 확인하여 줄 바꿈을 최적화합니다. 따라서 단락 끝에 문자 하나를 추가하면 첫 번째 줄이 끝나는 위치가 변경될 수 있습니다. 키를 누를 때마다 이를 다시 실행하는 것은 비용이 너무 많이 듭니다.

따라서 입력할 때 다시 그리는 WYSIWYG 워드 프로세서 대신 TeX는 일괄 처리를 사용합니다. 즉, 전체 문서를 한 번에 조판합니다. 실시간 미리보기는 포기하지만 전체적으로 최적의 조판 설정, 문서 전반의 일관된 서식, 일반 텍스트를 통한 자동화를 얻을 수 있습니다.

소스에서 출력까지: 두 가지 경로

엔진은 귀하가 작성한 .tex를 처리합니다. 출력에는 두 가지 계열이 있습니다. 현대적인 경로에서는 pdfTeX, XeTeX 및 LuaTeX PDF를 직접 생성합니다. 특히 XeTeX 및 LuaTeX는 Unicode 입력을 읽고 시스템에 이미 설치된 OpenType 글꼴을 사용할 수 있습니다.

레거시 경로에서 엔진은 먼저 DVI 파일을 내보냅니다. DVI는 *장치 독립적*을 의미합니다. 이는 특정 출력 장치에 연결되지 않은 페이지에 대한 순수한 설명입니다. 그런 다음 dvi 드라이버는 이를 dvipdfmx에서 PDF로, dvips에서 PostScript로, dvisvgm에서 SVG로 변환합니다. 화면에 렌더링하는 드라이버를 dvi 뷰어라고 합니다. 일본어 형식 pLaTeXupLaTeX는 이 DVI 경로를 사용합니다.

terminal
# Direct PDF (modern engines)
lualatex document.tex        # → document.pdf

# Via DVI (legacy route, e.g. Japanese upLaTeX)
uplatex  document.tex        # → document.dvi
dvipdfmx document.dvi        # → document.pdf

예외적으로 pdfLaTeX는 이전(대개 Unicode가 아닌) 입력 스타일을 유지하면서도 DVI 없이 직접 PDF를 출력합니다. "DVI 대 직접 PDF" 및 "Unicode / 시스템 글꼴 여부"를 두 개의 별도 축으로 처리하는 데 도움이 됩니다.

엔진출력입력 및 글꼴이미지 형식
latexDVI (dvi 드라이버 필요)대부분 ASCIIEPS, PS
pdflatexPDF (직접)제한된 UnicodePNG, JPG, PDF (EPS 자동 변환)
xelatexPDF (직접)Unicode, 시스템 OpenType (fontspec)PNG, JPG, PDF, EPS
lualatexPDF (직접)Unicode, 시스템 글꼴, LuaPNG, JPG, PDF, EPS

도우미 파일과 "두 번 컴파일" 규칙

컴파일하면 PDF 외에도 .aux(레이블 및 참조 데이터), .toc(목차) 및 .log(레코드)와 같은 도우미 파일이 생성됩니다. 상호 참조 및 목차에는 두 번의 패스가 필요합니다: 첫 번째 패스에서는 .aux에 숫자와 위치(“3장이 어느 페이지에 있습니까?”)를 쓰고, 두 번째 패스에서는 이를 다시 읽어 \ref와 내용 목록을 채웁니다.

따라서 출력에 ??가 표시되거나 *Rerun to get cross-references right*와 같은 경고가 표시되면 수정 사항은 간단히 다시 컴파일하는 것입니다. 참고문헌(BibTeX/biber) 및 색인(makeindex)은 더 많은 패스를 추가합니다.

빌드가 중지될 때 확인할 위치

빌드가 중지되면 PDF가 아닌 .log의 첫 번째 오류를 읽으세요. TeX는 첫 번째 문제 이후 계속하려고 시도하므로 뒤따르는 12개의 오류는 종종 결과에 불과합니다. ! Undefined control sequence는 일반적으로 철자가 틀린 명령 또는 누락된 패키지를 의미합니다. File ... not found는 이미지, 클래스 또는 패키지 조회를 가리킵니다. LaTeX Warning: Label(s) may have changed는 또 다른 실행이 필요함을 의미합니다. 메시지가 나타나는 파이프라인 단계를 기준으로 진단합니다.

  • 상호 참조만 잘못된 경우 .aux 또는 .toc 파일을 삭제하기 전에 먼저 latexmk를 다시 실행하세요.
  • 이미지가 누락된 경우 경로가 직접 PDF 또는 DVI인지 확인하고 이에 따라 이미지 형식을 선택하세요.
  • 오래된 도우미 파일이 원인일 가능성이 있는 경우에만 .aux, .toc, .out 및 친구들을 삭제하세요.

패스 계산 중지 — latexmk 및 편집자

손으로 패스를 계산하는 것은 지루합니다. latexmk.aux와 같은 파일을 감시하고 필요한 만큼 정확하게 엔진을 다시 실행하며, 필요할 때 BibTeX/biber 및 makeindex를 호출하고 출력이 안정되면 중지합니다. 기본적으로 루핑을 결정하기 전에 최대 5번($max_repeat = 5)까지 반복됩니다. 그 한도는 거의 모든 실제 문서에 충분합니다.

terminal
latexmk -lualatex document.tex   # LuaLaTeX, as many passes as needed
latexmk -pdf     document.tex     # pdfLaTeX
latexmk -c                        # clean .aux/.log and friends

VS Code(LaTeX Workshop), TeXShop 및 Overleaf와 같은 편집기 및 서비스는 일반적으로 내부적으로 latexmk를 호출하므로 "컴파일"만 누르면 됩니다. 그리고 SyncTeX가 활성화되면 클릭하여 소스의 줄과 PDF의 일치 지점 사이를 이동할 수 있습니다.