KTUGFaq

KTUG FAQ

로그인:
비밀번호:
가입
You will be surrounded by luxury.
FrontPage › hoze/MultilingualTypesetting
이 글은 정확성을 담보할 수 없습니다. 틀린 곳이 있으면 바로잡아 주시기 바랍니다.

목차

1 독일어

1 독일어


이 글은 다국어 조판을 위한 인코딩과 폰트에 대한 이해를 돕고자 한다. 결론적으로 이 글은 inputenc, fontenc, babel 패키지에 의존하는 기존의 pdflatex에서 탈피하여 xelatex의 사용을 권장한다.

독일어 단어 하나를 식자해 보자. 색인을 만들어 보는 것이 이해하기에 더 큰 도움이 된다.
\documentclass{article}
\usepackage{makeidx}
\makeindex
\begin{document}
gemaß \index{gemaß} %<- a umlaut가 위키에서 제대로 저장되지 않는 듯하다.
gem\"a\ss \index{gem\"a\ss}
gemass \index{gemass}
\printindex
\end{document}
결과는 아래와 같다.

.pdf
gem gemaß gemass

Index 
gemaß, 1
gemass, 1
gem, 1
.idx
\indexentry{gemaß}{1}
\indexentry{gem\"a\ss}{1}
\indexentry{gemass}{1}
.ind
\begin{theindex}

  \item gem\"a\ss, 1
  \item gemass, 1
  \item gemaß, 1

\end{theindex}
아래와 같이 오류가 발견된다.
  • gemaß가 gem으로 식자되었다.
  • 색인에서 정렬 순서가 잘못되었다.
미국 사람이 어쩌다 한 두 개 독일어 단어를 식자하기 위해 umlaut와 estset 매크로을 입력하는 것은 번잡한 일이 아니겠지만, 독일 사람이라면 이를 결코 즐거워하지 않을 것이다. 우리가 이를 충분히 잘 이해할 필요가 있다. ASCII 코드만으로 입력된 텍 문서에서 \ss 매크로는 지정된 폰트에서 ß 글리프를 찾아 식자하도록 한다. 아시아 텍 컨퍼런스 2008에서 Werner Lemberg 씨가 아주 잘 설명했듯이 (아주 잘 이해한 것은 아니지만), A 코드 = A 글리프의 등식은 성립하지 않는다. 그런 쉬운 설명은 영어 DOS에서나 가능할 것이다.

우리가 A 키를 눌렀을 때, 컴퓨터에 입력되는 것은 A 모양의 글리프가 아니고, A에 지정되어 있는 어떤 번호(코드)이다. A를 사용하는 언어가 얼마나 많을까? 영어의 A, 독일어의 A, 러시아어의 A는 저마다 다른 번호를 갖고 있는 것이다. 그것을 인코딩이라고 한다. 자 이제 gemaß를 제대로 식자하기 위해 과거에 독일 사람들이 사용했을 방법을 써 보자.
\usepackage[latin1]{inputenc}
이 때 반드시 iso-8859-2 또는 이에 상응하는 인코딩으로 텍 문서를 저장해야 한다. 이제 식자가 제대로 되었다. 요즘에는 유니코드가 대세이니 utf8로 저정하는 것이 더 나을 것이다. 그런데 ind는 좀 해괴한 결과를 보여준다.
\begin{theindex}

  \item gem\"a\ss, 1
  \item gem\IeC {\"a}\IeC {\ss }, 1
  \item gemass, 1

\end{theindex}
이에 대해 makeindex에서 -g 옵션이 해결해 준다지만, 잘 작동하지 않는다. 이를 위한 간단하지만 매우 성가신 해법은 이렇다.
\index{gemas@gemaß}
그런데 이에 앞서 우리는 이런 의구심을 가질 수 있다. 왜 유니코드로 입력했는데 ind에 gem\IeC {\"a}\IeC {\ss }로 들어가는가? 앞에서 말했듯이 A 코드 = A 글리프가 성립하지 않기 때문이다. 텍은 우리에게 이렇게 말한다. "네가 입력한 문자 코드가 어떤 글리프를 의미하는지는 알겠지만 내가 처리할 수 있는 폰트들은 유니코드로 인코딩되어 있지 않다." 그러니까 예를 들어 A가 63 코드로 입력되었다면, 폰트에서 63 코드의 글리프를 찾아서 식자해야 하는데 폰트에는 A 글리프가 있기는 하지만 그것이 63 코드로 되어 있지 않다는 것이다. 따라서 우리는 식자가 아래와 같은 단계로 처리됨을 이해해야 한다.
입력 인코딩 -> 폰트 인코딩 -> 글리프
이것은 makeindex의 한계이기도 하고, pdflatex의 한계이기도 하다. pdflatex으로는 폰트 인코딩을 유니코드로 할 수 없다고 말한다 해도 완전한 거짓은 아닐 것이다. 이것은 당연하기도 하다. 텍에서 전통적으로 사용하던 type1 등의 폰트들이 유니코드 체계로 되어 있지 않기 때문이다. 해법은 xelatex에 있다. xelatex은 단지 트루타입 폰트를 쓸 수 있을 뿐만 아니라 A 코드 = A 글리프 등식이 가능하게, 적어도 그런 느낌이 들게 한다.

xelatex으로 넘어가기 전에 babel 패키지를 잠깐 살펴 보자.
\usepackage[german]{babel}

"`gemass \index{gemass}"'
babel은 장절 이름을 지정된 언어의 것으로 바꾸어 줄 뿐만 아니라, 그 언어의 하이프네이션까지 처리한다. 그리고 위의 예에서 보듯이 estset 매크로처럼 "`와 "'를 독일어 인용 부호로 바꾸어 주기도 한다.

그러면 xelatex으로 컴파일하면 어떻게 될까? 여기저기서 오류가 발생한다. xelatex은 gem\"a\ss를 달가와하지 않는다. 각설하고 xelatex으로 깔끔하게 컴파일되는 깔끔한 텍 문서는 이렇다.
\documentclass{article}
\usepackage{xunicode}
\usepackage{xltxtra}
\usepackage{makeidx}
\makeindex
\begin{document}
gemaß \index{gemaß}
gemass \index{gemass}
\printindex
\end{document}
.idx를 보자
\indexentry{gemaß}{1}
\indexentry{gemass}{1}
아주 만족스럽다. .ind도 만족스럽다.
\begin{theindex}

  \item gemass, 1
  \item gemaß, 1

\end{theindex}
여기서 유의해야 할 것은 fontspec으로 트루타입 폰트를 지정해야 써야 할 수 밖에 없다는 것이다. 독일어 문자를 식자하기 위해 xunicode와 xltxtra 패키지를 불러서 썼는데, 이것은 cm 폰트 이외에 다른 기존의 type1 폰트를 쓸 수 없게 만드는 것처럼 보인다.

우리는 다국어 조판에서 궁합이 맞는 조합들을 아래와 같이 정리할 수 있다.
  • pdflatex: inputenc, fontenc, 폰트 패키지 (palatino 등), babel, makeindex
  • xelatex: xunicode, xlxtra, fontspec, polyglossia, texindy

polyglossia는 babel를 대신하는 것이고, texindy는 makeindex를 대신하는 것이다. 독일어처럼 몇몇 글자만 영어와 다르다면, babel과 makeindex만으로도 만족할 수 있지만, 러시아어에서는 xelatex 조합 외에는 온전하게 처리할 길이 없다.

texindy에 대해서는, 아직 알게 된 것이 많지 않지만, 다른 지면을 통해 설명하겠다. 이 글을 쓰게 된 궁극의 목적은 다국어 조판에서 색인 정렬 문제를 풀기 위한 것이다.

^
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-01-07 13:30:51
Processing time 0.0536 sec