TeXShop(Mac)

TeXShop가 인터넷에 공개된 것은 2000년 7월 23일, Mac OS X 10.0이 판매되기 여덟 달 전이었습니다. 오리건 대학의 수학자 Richard Koch는 아직 정식으로 존재하지도 않는 운영체제를 위해 LaTeX 프런트엔드를 만들고 있었고, 그 도박은 성공했습니다. 26년이 지난 지금도 MacTeX가 /Applications/TeX/에 놓아 주는 편집기는 여전히 TeXShop이고, 여전히 무료이며, 여전히 GPLv2이고, 여전히 macOS 전용입니다. 이 페이지에서는 그 역사가 남긴 것들 — 실체가 셸 스크립트 폴더에 지나지 않는 엔진 팝업, 파일 단위로 설정을 고정하는 % !TEX 줄, ⌘ 클릭으로 오가는 SyncTeX — 과 함께 TeXShop가 더 이상 알맞은 도구가 아니게 되는 지점까지 살펴봅니다.

TeXShop가 DVI가 아니라 PDF를 보여 주는 이유

macOS 자체가 PDF로 화면을 그리기 때문입니다. 1996년 말 Apple이 NeXT를 인수하면서 NeXTSTEP의 Display PostScript는 폐기되었고, Mac의 그래픽 계층인 Quartz는 PDF 위에 다시 세워졌습니다. Koch의 표현을 빌리면 이로써 PDF는 시스템의 근간이 되었고, 만들기 쉬우며 표시하기는 거의 공짜가 되었습니다. DVI 뷰어를 새로 만들려면 몇 달이 걸렸겠지만 PDF 뷰어는 사실상 거저 얻은 셈입니다. 게다가 그는 마침 dvips를 거치지 않고 .tex를 곧바로 .pdf로 만드는 pdfTeX(당시 0.14 버전)를 발견한 참이었습니다. 소스 창, 그 옆의 미리보기 창, 그 사이의 pdflatex라는 TeXShop의 생김새는 결국 Apple이 "화면에 사각형을 어떻게 그릴 것인가"를 정한 결과에서 떨어져 나온 것입니다.

첫 공개판이 나온 2000년 7월, Mac OS X는 아직 퍼블릭 베타였고 거기에는 Koch의 잘못이 아닌 화려한 결함이 하나 있었습니다. 당시 Apple의 PDF 코드는 내장 글꼴을 읽지 못했기 때문에 Times로 조판한 본문은 아름답게 표시되는데 수식만은 하얀 사각형으로 나왔습니다. 하필 수학자에게 가장 필요한 부분이었습니다. 2000년 개발자 회의에서 Koch는 최신 베타를 들고 숙소로 달려가 설치하고 TeXShop을 실행해 보았지만 글꼴은 여전히 나오지 않았습니다. 결국 수정된 것은 2001년 3월 정식판에서였습니다. 그리고 2002년, TeXShop 1.19는 Apple Design Award를 받습니다. 다만 부문 이름이 오픈 소스 이식(port) 부문이어서, 애초에 무엇을 이식한 적도 없는 이 프로그램의 수상은 Mac TeX 메일링 리스트를 갸웃하게 만들었습니다. 뒷날 XeTeX의 저자 Jonathan Kew가 Windows와 Linux에서도 이만큼 쉬운 TeX을 만들고 싶었을 때 본보기로 든 것이 바로 "Dick Koch의 수상작 TeXShop"이었고, 그렇게 나온 것이 TeXworks입니다.

TeXShop 설치 — MacTeX 안에 들어 있습니다

TeXShop만 따로 내려받을 필요는 없습니다. MacTeX가 함께 가져옵니다. MacTeX-2026은 TeX Live 2026을 담고 있으며, 배포판 본체는 /usr/local/texlive/2026/에, GUI 프로그램 다섯 개 — TeXShop, TeX Live Utility, LaTeXiT, BibDesk, hintView — 는 /Applications/TeX/에 놓습니다. macOS 11 Big Sur 이상이 필요하고 Intel과 Apple Silicon 모두에서 네이티브로 동작합니다. 아래 내용의 전제로 중요한 것은 TeXShop 자체에는 TeX이 한 줄도 들어 있지 않다는 점입니다. 어디까지나 프런트엔드일 뿐이며, 조판할 때마다 /Library/TeX/texbinpdflatex, lualatex, latexmk를 실행할 따름입니다. TeXShop을 지워도 터미널의 TeX은 살아 있지만, /usr/local/texlive/를 지우면 TeXShop은 한 줄도 조판하지 못합니다.

이 두 부분은 갱신 주기가 서로 다르다는 점에서 사람들이 자주 헷갈립니다. 패키지 업데이트는 같은 폴더에 있는 TeX Live Utility가 맡습니다. 실행하면 지난번 이후 CTAN에서 바뀐 것을 모아서 제시합니다. TeXShop 본체는 오리건 대학에 있는 Koch의 페이지에서 따로 갱신됩니다. 현행 5.57(2025년 10월)은 macOS 10.13 High Sierra 이상에서 동작하며 Tahoe까지 지원합니다. macOS 26 Tahoe용으로는 TUG가 별도의 추가 설치 프로그램을 제공하는데, 5.57을 대체하지 않고 TeXShop 5.58을 나란히 설치합니다. 5.58은 같은 프로그램을 Tahoe에서 다시 빌드한 것으로, 그래야 Apple의 Liquid Glass 외관이 적용되기 때문입니다. /usr/local/texlive/ 아래에는 여러 해의 TeX Live가 함께 있을 수 있고, 어느 것을 활성화할지는 TeX Live Utility의 Configure 메뉴에서 고릅니다.

Typeset 버튼(⌘T)과 엔진 팝업 메뉴

⌘T는 파일을 저장한 뒤 조판합니다. 무엇이 실행되는지를 정하는 것은 Typeset 버튼 옆의 팝업 메뉴(툴바에서는 Program이라는 이름)입니다. 이 항목들은 프로그램 안에 박혀 있는 것이 아닙니다. TeXShop은 ~/Library/TeXShop/Engines/ 폴더를 읽어 거기서 찾은 .engine 파일 하나마다 메뉴 항목 하나를 보여 줄 뿐이며, .engine 파일의 정체는 파일 이름을 $1로 받는 짧은 셸 스크립트입니다. 기본 제공되는 LuaLaTeX.engine은 전부 네 줄입니다. TeXShop에 대해 가장 쓸모 있는 사실이 바로 이것입니다. 터미널에서 칠 수 있는 명령이라면 그대로 이 메뉴에 올릴 수 있습니다. 폴더로는 TeXShop → Open ~/Library/TeXShop 메뉴로 바로 갈 수 있습니다.

terminal
#!/bin/tcsh

set path= ($path /Library/TeX/texbin /usr/texbin /usr/local/bin)
lualatex -file-line-error -synctex=1 "$1"

이 스크립트에 붙은 두 옵션에는 이유가 있으며, 직접 만드는 엔진에도 반드시 넣어야 합니다. -synctex=1은 뒤에서 설명할 ⌘ 클릭을 가능하게 하는 .synctex.gz 파일을 만들어 냅니다. -file-line-error는 오류 메시지의 모양을 바꿔서, TeX 전통의 l.42 대신 ./main.tex:42: Undefined control sequence. 형태로 내보냅니다. 파일 이름과 줄 번호가 있으면 그리로 뛸 수 있습니다. TeXShop의 내장 LaTeX 명령도 처음부터 둘 다 넘기므로(pdflatex --file-line-error --synctex=1) 기본값은 충분히 합리적입니다. 오히려 직접 만든 엔진만이 조용히 동기화 기능을 잃습니다. 새 문서를 어떤 엔진으로 열지는 마지막 선택이 기억되고, 엔진 이름이 지정되지 않았을 때 어느 경로(pdfTeX, TeX + DVI, 개인 스크립트)를 탈지는 환경설정 → Typeset → Default Command가 정합니다.

팝업 항목실제로 실행되는 것이럴 때 고릅니다
LaTeXpdflatex --file-line-error --synctex=1(내장)기본값. 라틴 문자 위주 문서에는 이것으로 충분합니다
XeLaTeXxelatex -file-line-error -synctex=1fontspec으로 시스템 글꼴 사용, 여러 문자 혼용
LuaLaTeXlualatex -file-line-error -synctex=1시스템 글꼴과 Lua. 새로 시작하는 일본어 문서의 1순위
pdflatexmklatexmk -pdf(pdfLaTeX 구동)참고문헌·색인·상호 참조가 있는 문서. 한 번에 끝납니다
lualatexmk / xelatexmklatexmk -pdf(LuaLaTeX / XeLaTeX 구동)Lua 또는 Xe 경로에서 같은 자동 재실행을 얻습니다
latexmklatexdvipsps2pdfEPS 그림이나 PSTricks에 의존하는 옛 원고

한 번의 조판으로 끝나지 않는 이유 — pdflatexmk와 재실행 경고

콘솔 마지막 줄에 LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.가 보인다면 화면의 PDF는 한 번 뒤처진 상태입니다. LaTeX은 첫 번째 실행에서 레이블·쪽 번호·목차를 .aux.toc에 쓰고 다음 실행에서 그것을 읽습니다. 그래서 상호 참조가 있는 문서는 본래 두 번, 참고문헌이 있으면 사이에 bibtexbiber를 끼워 실행해야 합니다. ⌘T를 세 번 눌러도 해결은 됩니다. 다만 횟수를 세는 일은 사람이 할 일이 아닙니다. latexmk는 보조 파일을 비교해 필요한 만큼만, 색인과 참고문헌 처리까지 포함해 자동으로 돌려 줍니다.

TeXShop은 이 엔진들을 함께 넣어 두면서도 기본적으로는 꺼 놓았습니다. 한 번만 하면 되는 2분짜리 설정입니다. ~/Library/TeXShop/Engines/Inactive/Latexmk/를 열어 pdflatexmk.engine(또는 lualatexmk.engine, xelatexmk.engine)을 두 단계 위인 ~/Library/TeXShop/Engines/로 옮기고 TeXShop을 다시 시작하면 Program 팝업에 이름이 나타납니다. 먼저 맛만 보고 싶다면 지름길이 있습니다. 메뉴의 Typeset with Alternate Engine환경설정 → Engine → Alternate Engine에 적힌 엔진을 실행하는데, 이 칸은 공장 출하 시점부터 pdflatexmk입니다. 빌드가 이상해질 때 — 낡은 .aux가 남거나 레이블이 끝내 해결되지 않을 때 — Option 키를 누른 채 메뉴를 열면 Typeset이 Trash Aux & Typeset(⌥⌘T)으로 바뀌어 중간 파일을 먼저 버리고 다시 조판합니다.

% !TEX 줄 — root, TS-program, encoding

파일은 자기 설정을 스스로 지니고 다닐 수 있고, 공동 작업이라면 마땅히 그래야 합니다. 문서 앞 스무 줄 안에 % !TEX 줄을 두면 TeXShop이 그것을 읽습니다. 반면 LaTeX에게는 % 이후의 평범한 주석일 뿐이라 아무 일도 일어나지 않습니다. 이 비대칭이 요령의 전부입니다. 파일 스스로 "이렇게 조판해 달라"고 적어 두고 다니기 때문에, 공저자의 Mac으로 건너가도 지정이 사라지지 않습니다. 실제로 쓰이는 것은 다음 세 가지면 거의 충분합니다.

지시 줄작성 예효과
% !TEX root% !TEX root = ../thesis.tex상위 파일을 지정합니다. 각 장 파일 맨 위에 두면 그 안에서 ⌘T를 눌러도 논문 전체가 조판되고 SyncTeX도 돌아올 길을 찾습니다
% !TEX TS-program% !TEX TS-program = lualatexmk엔진을 지정합니다. 값은 Engines/의 파일 이름에서 .engine을 뺀 것입니다. % !TEX program도 같은 뜻이며, 팝업 선택보다 우선합니다
% !TEX encoding% !TEX encoding = UTF-8 Unicode이 문서의 문자 인코딩을 지정하며, 해당 파일에 한해 환경설정 기본값을 덮어씁니다
latex
% !TEX root = ../thesis.tex
% !TEX TS-program = lualatexmk
% !TEX encoding = UTF-8 Unicode

% This chapter has no preamble of its own.
% Pressing Typeset here builds ../thesis.tex instead.
\chapter{Method}
\label{chap:method}

셋 중 하루를 구해 주는 것은 root입니다. 학위 논문을 장별로 나눈 뒤 이 줄 없이 chapter3.tex에서 ⌘T를 누르면, TeX은 \documentclass가 없는 파일을 읽기 시작하다가 첫 본문에서 ! LaTeX Error: Missing \begin{document}.에 부딪힙니다. 경로는 그 장 파일을 기준으로 한 상대 경로이므로, chapters/ 아래에 있는 장은 ../thesis.tex로 부모를 가리킵니다. 그리고 같은 줄이 PDF에서 ⌘ 클릭했을 때 어느 장의 몇 번째 줄인지를 SyncTeX에 알려 줍니다. 문서를 나누는 그 순간에 넣어 두는 것이 정답이지, 고장 난 뒤에 찾을 것이 아닙니다.

인코딩 — .tex 파일이 깨지거나 아예 열리지 않는 이유

TeXShop 4.00부터 공장 기본값은 Unicode (UTF-8)이며, 오늘 새로 쓰는 문서에는 이것이 정답입니다. 설정 위치는 환경설정 → Source → Encoding입니다. 텍스트 파일에는 자신이 무엇으로 부호화되었는지 알리는 머리말이 없으므로 TeXShop은 추측할 수 없고, 일부러 추측하지도 않습니다. 파일이 올바른 UTF-8이 아닐 때 — IsoLatin9으로 움라우트를 쓰는 서유럽 공저자, 연구실 보관함에서 나온 옛 원고 — 디코딩이 실패하고, TeXShop은 대체 인코딩인 IsoLatin9으로 다시 열지 묻습니다. 이 값은 고정이며 바꿀 수 없습니다. 그 제안을 받아들여 \usepackage[...]{inputenc} 줄을 보고 실제 정체를 확인하고, 저장하지 않은 채 닫은 뒤 Open 대화상자에서 올바른 인코딩으로 다시 엽니다. 그런 다음 % !TEX encoding 줄을 덧붙이면 다음 사람이 같은 수고를 반복하지 않습니다.

TeXShop의 일본어 지원은 바로 이 경로로 들어왔고, 이 프로그램 역사에서 가장 좋은 이야기이기도 합니다. Mac OS 9 시절 일본어 글꼴은 백슬래시를 엔 기호 모양으로 그렸고, 일본어 자판의 엔 키는 백슬래시 바이트를 냈습니다. \section¥section은 같은 바이트열이었고 TeX은 아무것도 눈치채지 못했습니다. 그러다 Unicode가 두 문자를 분리하고 자판이 진짜 엔 기호를 내보내기 시작하자, 일본의 TeX 쪽은 ¥를 TeX 제어 문자로 받아들이는 방식으로 대응했습니다. 남겨진 것이 TeXShop이었습니다. Koch는 일본 사용자들이 어려움을 겪는다는 말을 1년쯤 듣고 나서야 제니타니 세이지(Seiji Zenitani)로부터 원인 설명과 코드를 함께 받았다고 적었습니다. 일본어 현지화도 그의 작업입니다. 제니타니가 소개한 수학자 시시쿠라 미쓰히로(Mitsuhiro Shishikura)는 엔 기호 문제의 더 깔끔한 수정과 함께, 거의 지나가는 말처럼 미리보기 창의 돋보기와 매크로 편집기까지 보내왔습니다. 두 사람의 이름은 데라다 유스케(Yusuke Terada), 소노베 이사오(Isao Sonobe)와 나란히 지금도 TeXShop 배포 페이지의 감사 목록에 남아 있습니다.

일본어와 CJK — LuaLaTeX인가, upLaTeX + dvipdfmx인가

오늘 처음부터 시작하는 문서라면 Program 팝업에서 LuaLaTeX을 고르는 것으로 이야기가 끝납니다. UTF-8을 그대로 읽고 Mac에 이미 설치된 글꼴을 바로 부를 수 있으므로, luatexja 패키지나 ltjsarticle 같은 클래스를 쓰면 별도 장치 없이 일본어가 조판됩니다. 중국어와 한국어라면 xeCJKctex와 함께 쓰는 XeLaTeX이 같은 자리를 차지합니다. 여기서 피해야 할 유일한 길은 pdflatex입니다. pdfTeX은 유니코드 글꼴에 손쉽게 접근할 수 없던 시절의 설계라, CJK를 억지로 통과시키려면 옛 CJK 패키지와 미리 변환된 글꼴의 세계로 들어가야 합니다. 오늘날 일부러 택할 길은 아닙니다.

다른 한 길은 일본 출판계가 수십 년 써 온 조합인 upLaTeX + dvipdfmx이고, 연구실에서 물려받은 템플릿은 대개 이쪽을 전제로 합니다. TeXShop에는 이를 위한 체크박스가 있어서, 환경설정 → Engine → pTeX support (for Japan)을 켜면 내장 명령이 pTeX 계열로 바뀝니다. ~/Library/TeXShop/Engines/Inactive/Latexmk/에는 이 경로를 latexmk로 돌리는 dvipdfmxmk.engine도 들어 있습니다. 직접 만든다면 한 줄이면 되고, 그 한 줄이 부품들의 연결을 보여 줍니다. ptex2pdf는 TeX Live에 딸려 오는 스크립트로 TeX 실행과 DVI→PDF 변환을 함께 처리합니다. -l은 plain이 아닌 LaTeX을, -u는 유니코드를 다루는 upTeX을 고르며, -ot는 엔진 본체로 넘길 추가 옵션입니다.

terminal
#!/bin/sh

# a hand-written engine: upLaTeX, then dvipdfmx, with SyncTeX enabled
ptex2pdf -u -l -ot "-synctex=1 -file-line-error" "$1"

이 선택은 보기보다 무겁고, 나중에 싼값으로 되돌릴 수 없습니다. upLaTeX용으로 쓰인 클래스(jsarticle, ujarticle)는 LuaLaTeX에서 통하지 않고 그 반대도 마찬가지이며, 학과 논문 템플릿에 들어 있는 매크로의 절반도 사정이 같습니다. 처음에 한 번 정하고, 엔진을 명시한 템플릿을 물려받았다면 마감 일주일 전에 옮기려 하지 말고 그대로 따르는 편이 좋습니다. 그리고 그 결정을 남의 Mac 위에서도 살아남게 하는 줄이 상위 파일 맨 위의 % !TEX TS-program입니다.

SyncTeX — ⌘ 클릭으로 소스와 PDF 사이를 오가기

조작은 ⌘ 클릭, 그것뿐입니다. 미리보기 창에서 단어를 ⌘ 클릭하면 그것을 만들어 낸 소스 줄로 이동합니다(역방향 검색). 소스에서 ⌘ 클릭하면 대응하는 PDF 위치로 스크롤합니다(정방향 검색). TeXShop은 2.18 버전부터 SyncTeX를 지원하고 표준 엔진은 모두 -synctex=1을 넘기므로 손대지 않아도 동작합니다. 조판할 때마다 PDF 옆에 .synctex.gz가 생기는 것이 그 증거입니다. 만약 듣지 않는다면 세 가지를 확인하십시오. 마지막 편집 이후 한 번이라도 조판했는지, 직접 만든 엔진이 -synctex=1을 빠뜨리지 않았는지, 그리고 환경설정 → Typeset → Sync Method가 옛 pdfsync가 아니라 SyncTeX 쪽에 있는지.

이 기능이 힘을 발휘하는 것은 교정할 때입니다. PDF를 읽다가 어색한 문장을 발견하고 소스 300줄을 눈으로 뒤지는 왕복이 통째로 사라지고, 그 문장을 ⌘ 클릭한 뒤 바로 고쳐 쓰면 됩니다. 다만 여러 파일로 나뉜 프로젝트에서는 모든 하위 파일에 % !TEX root 줄이 들어 있어야 제자리에 착지합니다. 이 줄이 없으면 TeXShop은 그 쪽을 만들어 낸 상위 파일을 알지 못하므로 클릭은 아무 데도 가지 않습니다. 장 안에서 ⌘T가 통하게 해 주는 것과 같은 줄이며, 그래서 문서를 나누는 시점에 넣어 둘 값어치가 있습니다.

TeXShop인가, TeXworks・TeXstudio・VS Code인가

TeXShop이 앞서는 지점은 초심자가 실제로 필요로 하는 단 하나, 곧 설정할 것이 없다는 점입니다. MacTeX을 깔고, 파일을 열고, ⌘T를 누르면 끝입니다. 익숙해진 뒤에도 꽤 쾌적합니다. Esc 키의 명령 자동 완성, AppleScript로도 쓸 수 있는 매크로, 편집 가능한 테마가 있고, 엔진 폴더 덕분에 "모르는 명령이라 못 쓴다"는 일이 없습니다. 한계도 그만큼 분명합니다. 프로젝트 사이드바가 없고, 버전 관리가 통합되어 있지 않으며, 입력하는 대로 다시 조판하는 연속 컴파일도 없고, 무엇보다 Mac이 아닌 기계에서는 아예 돌아가지 않습니다.

  • Mac만 쓰고, 혼자 쓰며, 설정에 시간을 들이고 싶지 않다면: TeXShop이 기본 답입니다. Program 팝업과 % !TEX 줄이면 거의 충분합니다.
  • Windows나 Linux에서도 같은 조작감이 필요하다면: TeXShop을 본뜬 TeXworks. 거의 그대로 옮겨 갑니다.
  • 구조 브라우저·기호 패널·문헌 관리를 한 창에 원한다면: TeXstudio나 Texmaker.
  • 이미 Git과 LSP, 터미널이 있는 편집기에서 쓰고 있다면: VS Code + LaTeX Workshop, 아래에는 그대로 MacTeX.
  • 아무것도 설치하지 않을 공저자가 있다면: Overleaf를 공유 장소로 삼고 TeXShop은 최종 손질용 로컬 사본으로 남깁니다.