LaTeX 문서 작성에 대한 이해 – 첫 번째
Published by Nineye under programming language on July 6, 2009
최근, 블로그에서 수학 공식을 좀 더 간편하게 표현하는 방법이 없을까.. 라는 생각에, 뒤적거리다 찾아 낸 좋은 솔루션이 LaTeX이다. 이전에도 LaTeX은 linux에서 문서 작성에 자주 쓰이는 개념이라는 것만 대충 알고 있었는데, LaTeX에 대해서 알면 알수록 LaTeX 및 그와 관련된 프로젝트들이 얼마나 많은 일을 할 수 있는 지를 알고는 놀랐다.
이 글에서는 필자가 LaTeX을 접하면서 알게된, LaTeX을 이용하기 위한 기본적인 규칙에 대해 알아보도록 한다. LaTeX에 대한 개념은 wikipedia에 잘 설명되어 있으니 그곳을 참고하자. 또한 LaTeX과 관련된 TeX, tetex 프로젝트, TeX Live 프로젝트, CTAN 프로젝트 등에 대해서도 알아두면, LaTeX이 어떤식으로 사용되는지에 대한 이해를 하는데 큰 도움이 된다.
참고로 이 글은 LaTeX의 기본 개념에 대한 이해의 용도로만 읽고, LaTeX의 문법에 대한 전체 내용을 알고자 하면 LaTeX document를 읽어보도록 하자.
1. LaTeX 코드를 규격화 된 문서 포맷으로 변환하기
LaTeX의 표현 방식은 프로그래밍 언어와 유사하다. 단지 차이가 나는 것은, 프로그래밍 언어는 컴퓨터가 이해할 수 있는 실행 코드를 생성하는 것을 목적으로 하지만, LaTeX은 고품질의 문서 작성을 목적으로 하는 것이다. 이런 의미에서 LaTeX 문서는 프로그래밍 언어에서의 소스 코드와 같은 역할을 한다. 고품질의 LaTeX 문서는 다음과 같은 단계를 거쳐서 만들어 진다.
- LaTex 문서 작성
- latex명령(TeX Live와 같은 LaTeX 프로그램을 설치하면 생성됨)을 이용하여 LaTeX 문서를 컴파일 함
- 컴파일 된 결과물을 보여주거나 프린트 함
위 단계는 실행 코드에 대한 프로그래밍을 하는 단계와 유사하며, 실행 코드의 디버깅과 유사하게 LaTeX 문서의 작성도 “수정-컴파일-실행” 과정을 거쳐서 버그를 수정하고, 더 나은 모습으로의 유지보수도 행하여 진다. 이러한 LaTeX에서의 유지보수 작업은 일반적으로 다음과 같이 행해진다.
- 수정 : 일반적인 문서 작성 툴로 LaTeX 코드를 작성하고 작성된 문서에는 “.tex” 확장자를 붙인다. linux에서는 emacs나 vi와 같은 편집 툴이 기본적인 LaTeX 문법을 지원하기 때문에 쉽게 작성할 수 있다.
- 컴파일 : LaTeX 관련 프로젝트에서 제공하는 패키지(현재는 Tex Live 프로젝트가 유지되고 있다)를 설치하면 /usr/local/texlive/2008/bin/x86_64-linux/(CentOS-64 기준)의 위치에 latex 실행 바이너리(사실 실행 바이너리는 pdftex이며, 이전 버전과의 호환을 위해, pdftex로의 symbolic link인 latex를 제공)가 생성된다. 이 latex 명령의 입력값으로 작성된 LaTeX 코드(*.tex)를 넣으면 컴파일 된 결과물을 얻게 되며, 일반적으로 이 결과물은 dvi(device independent file format) 파일의 형식을 가진다. 만약 컴파일 시 에러가 발생한다면 latex 프로그램은, 일반적인 프로그래밍 언어의 컴파일러와 같이 적절한 에러 메세지를 출력한다. 그러면 에러 메세지를 확인하고 소스를 수정하면 된다. 컴파일이 성공하면 입력 파일인, “.tex”와 파일명이 동일한 “.dvi”파일이 생성될 것이다.
- dvi 파일 보기 : 위 과정의 결과로 생성된 dvi파일은 xdvi 명령으로 눈으로 볼 수 있다(단, X Window가 구동되어야 함).
- 프린트 하기 : dvi파일은 dvips 명령어로 ps(PostScript)파일로의 변환이 가능하다. dvips 명령어를 옵션 없이 수행하면 입력된 dvi파일을 ps로 변환하여 바로 프린터로 보낸다. 변환 결과를 파일로 저장하기를 원한다면 -o 옵션을 사용한다.
- pdf 파일의 생성 : 작성한 LaTeX 소스(.tex)에 대한 결과를 pdf파일 포맷으로 생성하기를 원한다면 latex 명령어가 아닌, pdflatex 명령어로 컴파일 하면 된다.
- 이미지 파일의 생성 : 작성한 LaTeX 소스에 대한 결과를 이미지 파일로 생성하기를 원한다면, 우선 dvi를 ps로 변환한 뒤, convert 명령을 수행하여 png나 gif로 변환할 수 있다. 또한, dvipng 명령은 dvi파일을 바로 png파일로 변환한다. 필자의 블로그에서는 tex=>dvi=>png로의 변환을 수행하여, png파일을 웹페이지에 보이게 해서, 작성한 LaTeX 코드를 표현하고 있다.
2. LaTex 소스 작성의 기본
2.1 간단한 작성 예제
우리는 LaTeX 프로그래밍을 처음 접하니까, 프로그래밍 세계에서의 전통적인 첫 예제를 작성해 보면,
\documentclass{article}
\begin{document}
Hello world.
\end{document}
이는 아래와 같은 결과를 얻는다.
모든 LaTeX문장은 \로 시작한다. documentclass는 문서의 포맷에 대한 정의이며, 수 백 가지의 document class들이 존재한다. 이 중, 위에서 정의된 article은 a4paper, 10pt, twoside, twocolumn등의 속성을 가지는 document class이다. 일반적으로는 article과 amsart라는 document class를 주로 사용하는데, amsart는 AMS 버전의 article이다. AMS는 LaTeX 패키지들 중의 하나이며, document class를 amsart로 정의하면, AMS와 관련된 패키지들이 자동으로 로딩된다. document class를 article로 정의하고 AMS 패키지도 사용하고 싶다면 “\usepackage{amsmath}”를 documentclass 정의 문장 이후의 코드에 포함시키면 된다.
\begin{document} … \end{document}의 쌍은 문서의 몸체, 즉 표현하고자 하는 실제 내용을 담는다. 그 이외의 내용(제목, 저자, 날짜 등등)은 쌍의 외부에 적는다.
2.2 주석
LaTeX에서의 주석 표기는 %문자로 시작하며 주석이 끝나는 것에 대한 표기는 없다. 따라서 LaTeX 컴파일러는 다음 개행 문자가 나올 때까지 %문자로 시작된 line을 모두 주석으로 보게 된다.
2.3 특수 문자
특수 문자의 표현 – 일반적인 특수 문자 및 구두점과 같은 문자는 그것들이 정의된 행위 그대로 사용될 수 있다. 하지만 일반적인 포맷 문자열과 비슷하게, 심볼 그 자체를 사용하고 싶으면 escape character(\)를 심볼 앞에 써야한다. 이는 공백 문자열도 포함이다. 예를 들면, “10\%\ of …”는 로 표현된다.
강세의 표현 – 강세를 표현하기 위해서는, 강세를 표시할 문자 앞에 escape quote문자를 둔다. 예를 들면, “Paul Erd\”os”는 로, “Andr\’e”는
로, “l’H\^opital’s rule”는
로 표현된다.
“[, ]“와 “(, )”는 그 자체를 표현하도록 변환되며, 앞에 escape문자가 들어가면 다른 의미를 가진다. 예를 들면, “[(haha)]“는 로 표현되며, “\[haha\]\(haha\)”는
로 표현된다. 반면, “{, }”는 표현하는 내용들을 그룹화 할 때 이용되며, 그 자체를 표현하려면 앞에 escape문자를 붙여야 한다.
인용 부호의 표현 – 인용 부호는 표현이 되기는 한데, 오히려 쉼표 인용부호?(’) 두 개가 오히려 인용 부호와 비슷한 형태를 가진다. 따라서 인용 부호를 쓰려면 쉼표 인용부호 두 개를 쓰자. 즉, “”TeX” and ”LaTeX””은 로 표현된다. 우측 인용 부호는 정상적이지만 좌측 인용부호도 우측과 동일하게 생성되는데 이것은 좀 더 찾아봐야 할 듯 하다.
2.4 명령어
대부분의 LaTeX소스내의 내용은 일반적인 텍스트와 같이 작성된 그대로 표현된다. 하지만 TeX프로그램에서의 특수문자나 명령어(매크로라 불림)는 있는 그대로의 표현보다는 문서를 꾸미기 위한 역할을 한다. 매크로는 항상 escape character로 시작하며, 그 뒤에는 명령을 나타내는 심볼이나 문자열들이 온다. 매크로는 명령과 관련된 인자를 가질 수 있으며, 일반적으로 괄호안에 표현된다.
줄바꿈 및 단락의 표현 - LaTeX에서의 줄바꿈은 소스 코드와는 상관없이, 특정 표현으로 이루어진다. 예를 들면, “\\*”나 “\newline”는 줄바꿈의 표현이며, “TeX\\*and LaTeX\newline라텍”은 로 표현된다. 또한, 단락의 표현은 “\\”와 “\par”가 있는데, “TeX\\LaTex\par라텍”은
로 표현된다. 단락에 대한 예제를 보면 알겠지만, “\par”는 들여쓰기를 하지만, “\\”는 들여쓰기를 하지 않는다. “\\”는 추가적인 공백에 대한 인자를 뒤에 붙임으로써 이를 표현할 수 있다. 이외에도 줄바꿈, 단락, 페이지 나눔등의 표현들이 있는데 이는 LaTeX document를 참고하자.
2.5 문서의 정보
일반적인 문서에서처럼 LaTeX에서도 해당 문서의 정보를 표현할 수 있는 방법을 제시한다. 이 정보에는 저자, 제목, 작성일 등과 같은 정보를 담을 수 있다. 이들 표현들은 문서 내용의 시작을 나타내는 \begin{document}의 앞에 위치해야 하며, 이들 문서의 정보를 문서의 내용에 나타나게 하는 \maketitle이나, \today와 같은 명령어들은 매크로이기 때문에 \begin{document}의 뒤에 위치해야 한다. 위 문서의 정보를 나타내는 예제는 페이지 단위로 표현되기 때문에 예제는 쓰지 않는다.
2.6 절의 표현
절의 표현은 “\section{}”과 “\subsection{}”으로 표현할 수 있다. 또한 이는 매크로 표현이기 때문에 일반적인 매크로와 같이 “\begin{document}”와 “\end{document}” 사이에 위치한다. 예를 들면, “\section{Special characters}\subsection{Accents}\section{Sectioning}”는 로 표현된다. 또한, “{”앞에 “*”기호를 붙이면 절의 숫자 표현을 없앨 수도 있다.
2.7 environments
LaTeX에서는 html 태그와 비슷하게 특정 구간을 꾸미는 표현도 존재한다. 이러한 표현들은 document의 표현과 같이 “\begin{…}”과 “\end{…}”로 표현한다. 예를 들면, 내용을 문서의 중간에 위치시키는 “\begin{center} ~ \end{center}”, “\item”으로 표현되는 각각의 아이템을 표시하는 “\begin{itemize} ~ \end{itemize}”, 하나의 수학 방정식을 표현하는 “\begin{equation} ~ \end{equation}”, 방정식을 정렬하는 \begin{align} ~ \end{align}” 등이 있다. 이 중, 방정식에 대한 표현을 예로 들어보면, “\begin{equation}\begin{aligned}2x^2 + 3(x-1)(x-2) &= 2x^2 + 3(x^2-3x+2)\\&= 2x^2 + 3x^2 – 9x + 6\\&= 5x^2 – 9x + 6\end{aligned}\end{equation}”는 로 표현된다. “=”부호를 중심으로 정렬해 주고, 방정식의 번호를 표시해 주는 것은 “aligned”명령이며, 예제의 세 문장을 하나의 방정식으로 묶어 주는 것은 “equation”명령이다. 여기서 주의할 점은, equation environment와 align environment를 중첩해서 쓰면 특정 시스템에서 오류를 발생시킨다. 이럴 때는 align environment 대신에 aligned environment를 사용하자. 원인은 잘 모르겠다…ㅋ
3. 컴파일 결과
latex프로그램은 tex파일의 컴파일 후, 에러가 발생하면, gcc와 비슷하게 어디서 어떤 에러가 발생했는지에 대한 에러의 내용을 보여준다. 단, gcc와 다른 점은, gdb처럼 에러를 확인할 수 있는 디버깅 환경을 제공해 주는 것이다. 디버깅 환경은 컴파일 후, “?”프롬프트가 생성됨으로써 제공되며, 이 프롬프트에 여러 명령을 입력함으로써 디버깅을 해 볼 수 있다.
일반적으로는 “!”마크에서 제공하는 에러 내용으로 대부분 처리할 수 있기 때문에 “x”명령으로 그냥 빠져나오지만, 혹시 에러 내용에 대해 이해가 되지 않으면 디버깅 명령어를 통해 디버깅 해보자. 이 글에서는 디버깅에 대해 언급하지 않으니 LaTeX document를 참조하여 디버깅의 방식에 대해 알아보자.
위의 기본적인 내용만 알아도 어느정도 LaTeX을 이용할 수 있다. 나머지는 각종 LaTeX 패키지가 제공해 주는 문법인데, 이것은 패키지마다 다르니, 사용하고 싶은 패키지의 문법만 document를 참조하여 작성하면 된다. 전 세계적으로 엄청나게 많은 LaTeX 패키지들이 있으니, 꼭 필요한 패키지만 모듈로 로딩하고, 그 패키지의 문법만 이용하도록 하자.
그리고 한가지 더, 꼭 이해해야 하는 내용이 있는데 그것은 LaTeX이 제공하는 3가지 기본 모드이다. 이 모드에 따라 표현하는 문법이 약간 달라질 수 있다. 예를 들면, inline math mode를 사용하려면 수학적인 요소 앞뒤에 inline math mode를 의미하는 “$”심볼을 반드시 붙여야 한다. 달리 말하면, TeX에서는 “$~$” 내의 구문에 대해서 inline math mode로 처리를 하게 되는 것이다. 이를 지키지 않으면 latex 프로그램은 컴파일 오류를 발생시킨다. 하지만 여기서 주의해야 하는 점이, 수학적인 요소가 아닌 구문에 “$”심볼을 붙이면 그 구문은 제대로 해석이 되지 않는다. 컴파일 오류까지는 아니지만 의도했던 정상적인 결과가 나오지 않는 것이다.
이 mode에 대한 내용때문에 필자는 엄청 삽질을 했었다. 필자의 wordpress 블로그에 설치한 플러그인 중, WP LaTeX라는 플러그인이 있는데, 이걸 만든 사람은 수학적인 요소만을 표현할 수 있도록 만들어서, 다른 모든 패키지의 표현들이 정상적으로 표현이 되지 않는 문제가 있었다. 결국은 소스를 까보니, “\TeX”나 “\LaTeX”와 같이 기본적으로 정의된 내용의 표현 외에는 모두 “$”심볼을 강제적으로 붙여서 무조건 inline math mode로 만들어 버리는 것이었다. 따라서 inline math mode에 포함되지 말아야 할, 다른 패키지의 내용을 나타내는 코드도 모두 포함되어 버려서, 그 자체의 의미로 해석되지 못하는 것이었다. WP LaTeX 플러그인 이외에, LaTeX를 사용할 수 있는 플러그인은 없었기 때문에, 그 플러그인의 내부에서 inline math mode의 사용과 체크 부분을 모두 수정하여 결국 모든 패키지를 정상적으로 사용하도록 만들었다. 워드프레스의 플러그인은 대부분 업그레이드 시, 이전 소스에 덮어 써버리기 때문에 플러그인의 소스는 정말 고치고 싶지 않았지만 대안이 없어서 일단은 고쳤는데, 앞으로 어떻게 이걸 기억하고 유지할 지가 걱정이다.
어쨌건 필자는 이렇게 적용해서 잘 사용하고 있다. 이 다음에 LaTeX와 관련된 글을 하나 더 쓸건데, 다음 글은 위 단락에서 언급한, LaTeX에서의 세 가지 모드에 대해서 쓰려고 한다.