요약
이 강의는 LaTeX의 첫걸음을 다루는 강좌 첫 단원을 연다. 먼저 단원의 목적을 설명한다. LaTeX를 한 번도 써 보지 않은 사람이 짧은 문서를 스스로 작성하고 컴파일하고 고칠 수 있는 데까지 이끄는 것이다. 이어서 단원의 네 강의와 이들을 잇는 흐름을 소개하는데, 조판이라는 개념에서 시작해 오류를 읽는 법까지 이어진다. 또 전제로 하는 얼마 안 되는 지식, 곧 컴퓨터에서 파일과 폴더를 다루는 능력을 밝힌다. 그리고 단원이 해결하는 문제를 제시한다. 빈 파일에서 조판된 문서에 이르는 것, 그리고 무언가 잘못되었을 때 조판 엔진의 메시지에서 그 원인에 이르는 것이다. 끝으로 이 같은 순환이 실험 보고서에도, 철학 논문에도, 라틴어 텍스트의 교감본에도 똑같이 쓰인다는 것을 보인다.
학습 목표
- 단원 내용의 순서를 설명하고, 각 강의가 다음 강의에 무엇을 주는지 설명한다.
- 단원이 전제하는 사전 지식을 확인하고 그에 맞게 컴퓨터를 준비한다. 특히 파일 확장자가 보이도록 한다.
- LaTeX 문서가 왜 아무 결과도 내지 못할 수 있는지, 그리고 오류가 왜 항상 그 위치에서 보고되지는 않는지 예를 들어 설명한다.
- 단원이 쌓아 올리는 “작성, 컴파일, 수정”의 순환을 다른 분야와 이후 단원에서 알아본다.
시작 평가
단원을 시작하기 전에 출발점을 재어 두면 좋다. 이 평가는 자기 평가이며 점수를 매기지 않는다. 목적은 오직 학습의 방향을 잡는 데 있다. 여덟 문항은 두 문항씩 차례대로 단원의 네 강의에 대응한다. LaTeX를 써 본 적이 없는 사람이 정답을 맞히지 못하는 것은 당연하며, 그래도 상관없다. 맞든 틀리든 모든 답이 요점을 설명하고 그 요점을 다루는 강의를 알려 주기 때문이다. 같은 능력은 단원 끝의 정리 강의에서 다시 측정한다. 이 단원은 강좌의 첫 단원이므로 앞 단원에 관한 문항은 없다.
단원을 시작하기 전에 출발점을 확인해 보세요. 짧은 자기 평가입니다. 점수가 매겨지지 않으며 결과는 브라우저에만 저장됩니다.
문제 1한 연구자가 한국어로 논문을 쓰면서 다성조 그리스어 구절을 인용하고 있고, 학술지는 그의 컴퓨터에 설치된 OpenType 글꼴을 쓰도록 요구한다. 이 강좌의 기준에 따르면 어떤 조판 엔진으로 컴파일해야 하는가?
속도가 할 수 없는 일을 메워 주지는 않는다. pdfLaTeX는 시스템의 OpenType 글꼴을 직접 불러오지 못하며, Unicode로 입력한 그리스 문자는 특별한 인코딩과 글꼴을 준비하지 않는 한 컴파일을 멈추게 한다.같은 LaTeX를 이해하기는 하지만 텍스트를 읽는 방식과 쓸 수 있는 글꼴이 다르다. 시스템 글꼴을 불러오는 fontspec에는 XeLaTeX나 LuaLaTeX가 필요하다.Texmaker는 편집기이지 조판 엔진이 아니다. 원본은 그 안에서 작성하며, Texmaker는 설치된 배포판에 들어 있는 조판 엔진을 호출한다. 물음은 그 가운데 어느 것을 호출해야 하느냐는 것이다.LuaLaTeX는 그리스어를 악센트와 기식 부호까지 그대로 쓸 수 있고, 요구된 글꼴을\setmainfont로 불러온다. XeLaTeX도 가능하지만, 이 강좌는 모든 문서를 같은 방식으로 컴파일하기 위해 LuaLaTeX를 택한다.복습: LaTeX란 무엇인가
문제 2문서 본문에
합격률은 약 70%였다.라는 줄을 그대로 쓰면 무엇이 출력되는가?퍼센트 기호는 LaTeX가 예약해 둔 문자 가운데 하나이다. 그대로 쓰면 출력되지 않고 어떤 동작을 한다.주석은 오류가 아니다. 그래서 이 실수가 위험하다. 조판 엔진은 아무 표시 없이 문장의 절반을 버리고, 결과를 읽어 보고서야 그것을 알게 된다.주석은 기호에서 그치지 않고, 그 뒤로 줄 끝까지 오는 모든 것에 미친다.퍼센트 기호는 주석을 시작한다. 조판 엔진은 그 뒤로 줄 끝까지 오는 모든 내용을 줄바꿈까지 포함해 무시하며 경고도 하지 않는다. 기호를 출력하려면\%라고 쓴다.복습: LaTeX란 무엇인가
문제 3어떤 학위 논문 폴더에
thesis.tex,thesis.aux,thesis.log,thesis.toc,thesis.pdf, 그리고 논문에 넣는 그림map.png가 있다. 공동 저자가 자기 컴퓨터에서 이 논문을 컴파일하려 한다. 최소한 무엇을 받아야 하는가?보조 파일은 컴파일할 때 다시 만들어지므로 쓸모가 없다. 남의.aux는 오래된 참조를 다음 컴파일까지 끌고 올 수도 있다.그림은 컴파일이 만드는 것이 아니라 컴파일이 쓰는 것이다.map.png가 없으면 조판 엔진은 파일을 찾지 못해 멈춘다.차례는 두 번째 컴파일로 얻는다. 그리고 정작 꼭 필요한 그림이 빠졌다.필요한 것은 조판 엔진이 만들어 낼 수 없는 것, 곧 저자가 쓰거나 마련한 것뿐이다. 나머지 파일은 컴파일이 다시 만든다.복습: 작업 환경
문제 4한 학생이 원본을 고친 뒤 컴파일했는데, 뷰어에 보이는 PDF가 바뀌지 않는다. 로그는
Fatal error occurred, no output PDF file produced!라는 줄로 끝난다. 이 학생이 보고 있는 PDF는 어느 것인가?그런 경우는 로그가 오류 없이 끝나고 폴더의 PDF에 마지막 컴파일 시각이 찍혀 있을 때이다. 여기서는 로그가 PDF를 만들지 않았다고 말한다.손상되었다면 뷰어에는 아무것도 보이지 않을 것이다. 보이는 것은 완전하고 읽을 수 있는 문서이며, 다만 오래되었을 뿐이다.그것도 가능한 다른 고장이지만 로그가 이를 배제한다. PDF를 만들지 않았다고 하므로 새 PDF는 존재하지 않는다.심각한 오류 때문에 결과를 쓰기 전에 컴파일이 멈추었다. 폴더의 PDF는 마지막으로 성공한 컴파일의 것이고, 뷰어는 아무 일도 없었다는 듯이 그것을 보여 준다. 로그가 가리키는 오류를 고쳐야 한다.복습: 작업 환경
문제 5문서 본문에서 몇 개의 문단 뒤에 저자가
\usepackage{amsmath}를 썼다. 컴파일하면 어떻게 되는가?그렇게 동작하는 선언도 있다. 예를 들어\setmainfont는 본문에서도 쓴 자리부터 효력을 낸다. 그러나 패키지는 그렇지 않다.조판 엔진은 원본의 순서를 바꾸지 않는다. 차례대로 읽으며, 제자리에 있지 않은 것을 발견하면 오류로 알린다.글을 조판하지 않는 것은 사실이지만, 그것은 본문 앞에 둘 수 있다는 뜻일 뿐 본문 안에 두어도 된다는 뜻은 아니다.\begin{document}에 이르면 설정이 마감되며, 그 뒤에 불러온 패키지는 이미 적용된 결정을 바꿀 수 있다. 그래서 패키지는 프리앰블에서만 불러올 수 있다.복습: 문서의 해부
문제 6문서 본문에
파일을 final_report.tex라는 이름으로 저장하시오.라는 문장이 그대로 쓰여 있다. 컴파일하면 어떻게 되는가?밑줄 기호는 열 개의 예약 문자 가운데 하나이다. 그대로 쓰면 출력되지 않는다.그것은 주석을 시작하는 퍼센트 기호의 동작이다. 밑줄 기호는 다른 일, 곧 아래 첨자를 쓰는 일을 한다.조판 엔진이 비슷한 일을 하기는 하지만, 오류를 알린 뒤 빠졌다고 여기는 달러 기호를 스스로 넣을 때의 일이다. 결과는 의도한 것이 아니다.밑줄 기호는 수식 안에서 아래 첨자를 쓰는 데 쓰인다. 본문에서는 조판 엔진이 수식을 여는 부분이 빠졌다고 보고 오류를 알린다. 밑줄을 출력하려면\_라고 쓴다.복습: 문서의 해부
문제 7어떤 컴파일의 로그에
! Undefined control sequence.라는 오류가 있고, 그 아래에l.7 \sectoin이라는 줄이 있다. 이것은 무엇을 나타내는가?정의되지 않은 명령은 불러오지 않은 패키지 때문일 수도 있다. 그러나\section에는 패키지가 필요 없으며, 로그에 보이는 명령은 이름의 오타를 드러낸다.l.7이 가리키는 것은 원본이며, 고치는 것도 원본이다. 로그는 알려 줄 뿐이다.이 숫자는 원본의 행 번호이지 문서의 절 번호가 아니다.오류는 고장의 종류, 곧 정의되지 않은 명령임을 말한다.l.7은 원본의 행 번호를 알려 주고, 그 뒤에 이어지는 문자열은 정확히 그 모르는 명령에서 끝난다.복습: 컴파일과 오류 수정
문제 8컴파일로 PDF는 만들어졌지만, 로그에
Overfull \hbox (3.21451pt too wide) in paragraph at lines 20--24라는 줄이 있다. 이것은 무슨 뜻인가?오류는 느낌표로 시작한다. 이 줄은 조판에 관한 경고이고, PDF는 유효하다.숫자는 원본의 행이지 PDF의 쪽이 아니며, 삐져나온 것은 글줄이지 쪽이 아니다.문단의 길이는 상관없다. 문제는 제대로 나누지 못한 한 줄이며, 그 줄 안에서 해결한다.조판 엔진이 그 문단의 어떤 줄을 나눌 적당한 방법을 찾지 못했다. 예를 들어 하이픈으로 나누는 법을 모르는 긴 단어 때문이며, 그 줄을 판면보다 넓은 채로 남겨 두었다. PDF는 만들어졌으므로, PDF에서 그 문단을 살펴보고 손을 댈 필요가 있는지 판단하면 된다.복습: 컴파일과 오류 수정
단원의 내용
이 단원은 강좌의 첫째 목표, 곧 문서를 만들어 컴파일하고 그 오류를 진단해 고치는 일에 이바지하며, 다른 모든 목표의 전제이기도 하다. 여러 언어와 문자로 된 텍스트의 조판, 긴 문서의 구성, 수학과 논리학의 표기, 표와 그림의 제시, 참고 문헌의 관리, 학술 장르마다 알맞은 클래스의 선택은 모두 “작성, 컴파일, 수정”의 순환이 더는 어렵지 않다는 것을 전제로 한다. 이 단원의 목표는 LaTeX를 써 본 적이 없는 사람이 단원을 마쳤을 때, 빈 파일에서 짧은 문서를 작성하고, Texmaker나 Overleaf에서 LuaLaTeX로 컴파일하며, 컴파일되지 않으면 그 원인을 스스로 찾아 고칠 수 있게 하는 것이다. 네 강의는 각각이 앞의 강의 위에 서는 하나의 사슬을 이룬다.
- LaTeX란 무엇인가. 조판이 무엇인지 설명하고, 마크업 언어를 워드프로세서와 비교하며, TeX와 LaTeX의 기원과 내용과 형식을 분리한다는 원칙을 이야기하고, LuaLaTeX를 택하는 이유를 밝히며, 원본이 PDF가 되는 과정을 보인다. 단원 전체의 용어, 곧 원본, 조판 엔진, 컴파일, 프리앰블, 본문, 로그를 정한다.
- 작업 환경. 첫 강의에서 설명한 것을 실제로 설치한다. 패키지 관리자를 갖춘 TeX 배포판과, LuaLaTeX로 컴파일하고 UTF-8로 저장하도록 설정한 편집기 Texmaker이다. 브라우저에서 쓰는 대안으로 Overleaf를 소개하고, 컴파일이 어떤 파일을 남기며 그중 무엇을 보관해야 하는지 설명한다. 끝으로 설치를 확인하는 두 개의 시험용 문서로 마무리한다.
- 문서의 해부. 원본을 부품으로 나눈다. 프리앰블과 본문, 명령과 그 인자, 선언의 적용 범위를 제한하는 그룹, 환경, 열 개의 예약 문자, 주석, 패키지, 클래스이다. 이 강의를 거치면 첫 강의의 최소 문서는 따라 쓰기만 하는 요리법이 아니라 부품별로 이해할 수 있는 구조가 된다.
- 컴파일과 오류 수정. 로그 읽는 법을 가르친다. 오류와 경고를 구별하고, 각 오류의 위치를 원본에서 찾고, 자주 나오는 메시지를 알아보고, 메시지만으로 부족할 때 원인을 좁혀 들어간다. 이 강의는 앞의 내용을 하나로 모은다. 거의 모든 오류는 원본의 구조에 관한 어떤 규칙을 어긴 것이며, 그 진단은 작업 환경에 기대고 있기 때문이다.
단원은 종합과 도전 과제 강의로 끝난다. 이 강의는 배운 것을 개념과 절차의 사슬로 엮고, 마무리 평가에서 시작 평가와 같은 능력을 다시 재며, 여러 강의를 아우르는 도전 과제를 낸다.
전제로 하는 지식
이 단원은 거의 아무것도 없는 데서 시작한다. LaTeX를 써 본 경험도, 프로그래밍 능력도, 수학 지식도 전제하지 않는다. 영어 지식도 전제하지 않는다. 조판 엔진의 메시지는 영어로 나오지만, 강좌에서 다루는 메시지는 모두 설명하기 때문이다. 전제하는 것은 컴퓨터를 다루는 보통의 능력뿐이다. 폴더를 만들고, 정해진 이름으로 정해진 폴더에 파일을 저장하고, 나중에 그것을 찾고, 파일을 복사하고 옮기고 지우고, 프로그램을 설치하는 일이다. 아니면 브라우저와 Overleaf 계정이 있으면 된다.
여기서 미리 해 둘 준비가 하나 생긴다. 작업 환경 강의 전에 마쳐 두는 것이 좋다. 파일 이름은 본체와 확장자로 이루어지며, 확장자는 마지막 마침표 뒤의 부분이다. report.tex에서 본체는 report이고 확장자는 tex이다. 그런데 Windows의 파일 탐색기와 macOS의 Finder는 기본적으로 알려진 확장자를 숨긴다. 그래서 report.tex와 report.pdf가 모두 report로 보이고, 확장자로만 구별되는 컴파일의 보조 파일들은 서로 구별할 수 없게 된다. 따라서 확장자를 표시하는 설정을 켜 두는 것이 좋다. Windows에서는 파일 탐색기의 “보기” 메뉴에, macOS에서는 Finder의 고급 설정에 있다. Linux의 파일 관리자는 기본적으로 확장자를 표시한다.
단원이 해결하는 문제
워드프로세서로 쓰는 사람은 쓰면서 결과를 본다. LaTeX에서는 원본과 쪽 사이에 원본을 글자 그대로 읽는 프로그램이 있고, 결과는 컴파일해야 비로소 나타난다. 여기서 두 가지 문제가 생기며, 그것이 이 단원의 문제이다. 첫째는 빈 파일에서 조판된 문서에 어떻게 이르느냐는 것이다. 무엇을 설치해야 하는지, 원본에는 최소한 무엇이 있어야 하는지, 조판 엔진은 그것을 어떻게 처리하는지. 둘째는 문서가 나오지 않거나 의도와 다르게 나올 때 어떻게 하느냐는 것이다. 조판 엔진은 오류를 쪽 위에 보여 주지 않고 자기만의 언어로 로그에 적으며, 때로는 실수를 저지른 곳에서 멀리 떨어진 곳에서 보고한다. 다음 예는 열다섯 줄짜리 문서로 두 문제를 함께 보여 준다.
다음 원본은 완전한 문서이다. 문서 클래스를 선언하고, 패키지를 불러오고, 제목과 저자와 빈 날짜를 저장하고, 두 개의 절을 조판한다. 둘째 줄과 셋째 줄은 한글을 위한 설정이다. kotex 패키지는 LuaLaTeX에서 한글 조판 기능을 더하고(fontspec도 이 패키지가 불러온다), \setmainhangulfont는 한글이 들어 있는 글꼴(여기서는 Noto Serif CJK KR)을 고른다. 기본 글꼴(Latin Modern)에는 한글이 없기 때문이다. 또 한글에는 이탤릭체가 없으므로 여기서는 강조에 \textbf의 굵은꼴을 쓴다. LuaLaTeX로 컴파일하면 다음 결과가 나온다.
열한째 줄에서 \textbf의 인자를 닫는 중괄호를 빠뜨리면 조판 엔진은 PDF를 전혀 만들지 않고, 로그에는 다른 줄들과 함께 다음 줄들이 나온다.
Runaway argument?{가설을 검토한다. \par \section {답} 답은 앞 절에 근거\ETC.! File ended while scanning use of \textbf ....! ==> Fatal error occurred, no output PDF file produced!오류는 열한째 줄이 아니라 파일 끝에서 보고된다. 조판 엔진이 \textbf의 인자를 문단과 다음 절과 \end{document}를 넘어 계속 읽다가 마침내 파일이 끝났기 때문이다. 그러나 로그는 빠진 단서를 준다. “Runaway argument?” 다음 줄은 폭주한 인자를 그 처음부터 재현하는데, 그 처음, 곧 “가설” 앞의 중괄호가 바로 오류의 자리이다. 로그를 이렇게 읽는 법은 컴파일과 오류 수정 강의에서 배운다. 닫히지 않은 중괄호가 왜 뒤따르는 모든 것을 휩쓸어 가는지 이해하는 것은 문서의 해부 강의에서 배운다.
따라서 이 두 문제에 대한 단원의 답은 두 부분으로 이루어진다. 첫째 문제에 대해서는 설치와 시험을 마친 환경, 그리고 부품별로 구조를 이해할 수 있는 원본이다. 그 안에는 주문 같은 것이 하나도 없다. 둘째 문제에 대해서는 하나의 방법이다. 로그를 첫 오류부터 읽고, 오류의 위치를 원본에서 찾고, 어긴 규칙을 알아보고, 메시지만으로 부족하면 원본의 일부를 비활성화해 원인을 좁혀 들어간다. 어느 부분도 명령의 암기를 요구하지 않는다. 두 부분 모두 조판 엔진이 읽듯이 원본을 읽기를 요구한다.
여러 분야에서의 단원
이 단원에서 배우는 순환은 모든 분야에서 같으며, 분야마다 달라지는 것은 쓰는 내용뿐이다. 화학 실험 보고서, 각주가 백 개 달린 철학 논문, 라틴어 원문과 번역을 곁들인 키케로 한 구절의 주해, 표가 들어간 경제학 보고서, 사료를 다룬 역사학 학위 논문, 정리가 담긴 수학 논문은 모두 똑같이 시작한다. 폴더 하나, 프리앰블과 본문을 갖춘 원본 파일 하나, 컴파일, 그리고 그 로그를 읽는 일이다. 마찬가지로 이 단원의 오류들, 곧 닫히지 않은 중괄호, 그대로 쓴 예약 문자, 엉뚱한 곳에서 불러온 패키지는 분야를 가리지 않고 이 문서들 어디에서나 나타난다.
그래서 이 단원에서 배우는 것은 사이트의 다른 강좌에서도 쓰인다. 아리스토텔레스 논리학이나 역학의 기초의 과제와 노트는 첫 주부터 LaTeX로 쓸 수 있다. R을 이용한 데이터 분석에서는 분석 결과를 조판된 문서에 넣는다. 그리고 C++ 프로그래밍 I에서도 순환은 본질적으로 같다. 원본을 쓰고, 컴파일러가 그것을 읽으며, 행 번호를 가리키는 그 메시지를 이 단원에서 배우는 방법으로 읽는다.
어디로 이어지는가
단원을 마치면 최소 문서는 익숙한 출발점이 되고, 이후의 단원들은 그 위에 쌓아 올린다. 둘째 단원은 텍스트 자체를 다룬다. 언어와 문자(그리스어와 라틴어 포함), 글꼴, 각주, 긴 인용이다. 셋째 단원은 긴 문서의 구조를 다룬다. 장, 차례, 상호 참조를 갖추고 여러 파일로 나뉜 문서이다. 넷째 단원은 수학과 논리학을 올바른 표기법으로 쓰는 법을, 다섯째 단원은 표와 그림을, 여섯째 단원은 참고 문헌과 분야별 인용 관례를, 일곱째 단원은 학술 장르마다 알맞은 문서 클래스를 다룬다. 프레젠테이션에서 편지와 포스터까지이다. 그 모든 단원에서 새 명령은 하나하나 작성되고 컴파일되며, 실패하면 이 단원에서 배운 것으로 고쳐질 것이다.