우분투, 글꼴 설정… 삽질의 시작.

** 이글루스(2010.03.15)에 있던 글.
오래된 글이고, 지금 보면 어설프기도 하지만, 그래도 꽤 긴 내용이라 그냥 버리기에 아까와서 옮겨본다.


이 글은.. 아마도 긴 글이 될 것이다. 생각외로 짧을 지도 모르겠지만..

글꼴 설정에 관해 그간 몇번 글을 썼었는데, 그야말로 단순무식한 관점에서 쓴 글들이었다.
따라서 쓸 때마다 달라지고 갈팡질팡하는 모습이었다.
이 글도 마찬가지가 될테지만, 조금은 정리가 된 모습을 볼 수도 있을 것 같다.
하지만.. 역시 이 글도 마땅한 참고글이 없다. 여기저기서 주워들은 것들과, 순수한 경험에 의해 빚어진 결과만으로 작성한 것이기 때문이다. 어찌보면 역공학이라 할 수도 있겠다~ 시행착오끝에 얻은 결론이기 때문이다.
그래도 빼놓을 수 없는 문서는, fontconfig.org 의 User’s Manual 이다.
http://fontconfig.org/fontconfig-user.html

이제.. 시작!

우분투에서 글꼴에 대한 정보는, 1차적으로 다음 디렉토리에서 찾아볼 수 있을 것이다.

/etc/fonts

여기에는 디렉토리 2개와 파일 2개가 있는데, 그 중 하나는 그 이름도 유명한 fonts.conf 이다.
이 파일은 자동으로 설정되니 지우지 말라고 안에 쓰여있다. 그 파일의 내용은 별 거 없는데, 글꼴이 실제 위치하고 있는 디렉토리명이 있고, 대표글꼴에 대한 이름들이 정의되어 있다.

이제.. 여기서 먼저 생각해봐야 할 것이 이 ‘대표글꼴’이라고 내가 지칭한 Sans-Serif, Serif, Monospace 이 세가지이다.
이게 뭘까???
우분투를 떠나 윈도우에도 저 글꼴들은 존재한다. 비트맵 글꼴이긴 하지만, MS Serif, MS Sans-Serif 가 있다.
근데, Serif 니 Sans Serif 니 얘들이 의미하는 바가 뭘까? 역시 믿는 것은 위키피디아뿐.. 찾아보았다.
http://en.wikipedia.org/wiki/Serif

첫부분만 정리해보면 이렇다.

  • Serif – 글자(획) 끝 부분에 뾰족한 모양이 있는 것.
  • Sans Serif – 모양이 없이 매끈하게 빠진 것.

Sans 는 프랑스어로 ‘없다’라는 뜻이라고 한다. 결국 Serif 가 들어간 서체, 들어가지 않은 서체. 이런 의미인 것이다.
또 다른 표현이 있다는데, Serif 는 Roman 이라고 하기도 하고, Sans Serif 는 Gothic 이라고도 한다고 한다.

우리나라엔 Serif, Sans 라는 것보다는 명조/고딕체로 구분을 하고, 그렇게 알려져있다.
아마도… 이건 일본사람들이 이름을 조금 바꾼 듯 하다. 그래서 Serif 는 명조체가 되고, Sans Serif 는 고딕체가 되지 않았을까.. 생각한다. 네이버 백과사전에 살짝 비슷한 내용이 있는데, 명조체는 워낙엔 명나라에서 유래된 글씨체였으나, 현대의 명조체와는 아무런 관련이 없다고 한다. 즉, 근현대 인쇄기술이 도입되면서 생겨난 용어가 아닐까.. 짐작만 해본다.
명조는 일본말로 ‘민초’ 정도로 읽는데, 과거 OS/2 한글판에서 이 이름을 그대로 쓰는 치욕적인(?) 오류를 범하기도 했었다.

90년대 중반, 명조는 ‘바탕’으로, 고딕은 ‘굴림’으로 바꾸려는 움직임이 있고, 최근에도 그대로 이어지고는 있지만, 아직도 명조/고딕은 우리사회에서 많이 불려지고 있다. 가급적이면 바탕/굴림을 많이들 써주면 좋겠다. 뭘 쓰자는 거냐? 근데??

하고 싶은 얘기는 뭐냐하면, Sans 나 Serif 는 쉽게 말해서, 글꼴의 유형을 지칭하는 것이지 글꼴의 ‘이름’을 말하는 것이 아니라는 것이다. 이건 아주 아주 아주 중요한 얘기다. 얼마전까지만 해도 난 저것들이 실제로 어떤 특정글꼴을 일컫는 것으로 알고 있었다. 그게 아니었던 거다.

따라서, 모든 영문 글꼴은 저 두 유형에 대부분 한쪽에 속하게 돼 있다. 획이 곧거나 삐치거나 둘 중 하나인거다.
거기에, 조금 다른 범주가 하나 나오는데, 바로 Monospace 이다. 이건 고정공백글꼴이다. 글자의 생긴 모양보다는 폭에 따른 구분이다.

이걸 모두 정리하면 세가지가 된다.

  • Serif : 획에 삐침이 있는, 바탕 계열
  • Sans : 획에 삐침이 없는, 굴림 계열
  • Monospace : 글자폭이 동일한 글꼴

그런데, 이렇게 정해놓은 이유는 뭘까?
그건 아마도.. MS 윈도우만 주로 쓰는 우리네 환경과는 다르게, 상당히 다양한 컴퓨터 환경에서 통일성을 꾀하기 위해서라고 생각된다.
개발자는 프로그램을 개발할 때 프로그램에 쓰이는 글꼴을 지정을 해줘야할 것이다. 메뉴는 어떤 글꼴을 써야하고, 본문은 뭘 써야하고.. 그런데 개발자가 특정글꼴을 지정해서 제작했다면, 그 글꼴이 없는 시스템에선 제대로 표현되지 않는 문제가 있을 것이다.
이런 것을 대비해서, 개발자는 특정 글꼴을 명시하지 않고, 그저 Serif 나 Sans 를 쓴다, 또는 이 경우는 Monospace 를 쓴다 정도로만 해놓으면, 각 시스템에서 그에 ‘할당‘된 글꼴을 찾아 표시하면 되는 것이다.
이것이 아마도, 현대 컴퓨터에서 다양하게 쓰이는 글꼴 명명방식이 아닌가 한다. 꽤 유연한 방식이다.

그렇다면, 각 시스템은 실제로 설치된 글꼴 중에서 어떤 것을 Sans 로 할지, 어떤 것을 Serif 로 할지, 또 Monospace 로 할지를 정해주는 작업을 해야 한다. 그것이 글 처음에 얘기한 fonts.conf 및 일련의 설정 파일들이다.
그 이전에, 현재 내 시스템에서 Sans 로 등록된 글꼴은 어떤 것이 있는지 알아보면,

$fc-match sans -s
나눔고딕.ttf: "NanumGothic" "Regular"
나눔고딕Bold.ttf: "NanumGothic" "Bold"
UnDotum.ttf: "UnDotum" "Regular"
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-ExtraLight.ttf: "DejaVu Sans" "ExtraLight"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
DejaVuSans-Oblique.ttf: "DejaVu Sans" "Oblique"
DejaVuSans-BoldOblique.ttf: "DejaVu Sans" "Bold Oblique"
wqy-zenhei.ttc: "WenQuanYi Zen Hei" "中等"
Verdana.ttf: "Verdana" "Normal"
Arial.ttf: "Arial" "Normal"
........

이런 목록이 나오는데, 이것으로 대충 감이 잡힐 듯 하다.

시스템에서 Sans(또는 Sans-Serif, Sans Serif)을 호출하면, 위에 나와있는 글꼴의 우선순위대로 글꼴을 출력한다. 만약 표시해야할 글자가 1순위 글꼴(위의 경우 나눔고딕)에 없다면, 예를 들어 한자를 표시해야 하는데 1순위가 나눔고딕일 경우라면, 그 다음 순위인 은돋움을 자동적으로 호출하게 된다. 만약 은돋움에도 없는 한자라면 쭉쭉 내려가서 “WenQuanYi Zen Hei” 이 글꼴까지 가게 되는 것 같다.

이렇게 글꼴의 유형과 실제 글꼴을 대응시켜주는 작업이 Font Matching 작업인 것이다.
그럼 저 많은 글꼴을 몽땅 다 하나 하나 해줘야 하느냐… 그럴리야 없겠지.

/etc/fonts/conf.d 디렉토리로 가보자.
여기가 우분투 글꼴의 모든 것을 담고 있는 총본부라 할 수 있다. 이 디렉토리의 파일들은 사실 심볼릭링크이고, 사실 실제 파일은 /etc/fonts/conf.avail 에 들어있다. conf.avail 은 이름에서 알 수 있듯 가능한 모든 설정값이 다 보관이 되어 있는 공간 역할이고, 시스템은 conf.d 에서 설정을 읽어오게 된다. 따라서, 필요한 파일들만 심볼릭링크로 conf.d 에 만들어주면 된다.

conf.d 디렉토리엔 번호 순으로 파일들이 정리되어 있는데, 이 번호 순대로 설정을 읽어오게 된다. 각 번호가 의미하는 바는 다음과 같다는데..

 00 through 09        Font directories
 10 through 19        system rendering defaults (AA, etc)
 20 through 29        font rendering options
 30 through 39        family substitution
 40 through 49        generic identification, map family->generic
 50 through 59        alternate config file loading
 60 through 69        generic aliases, map generic->family
 70 through 79        select font (adjust which fonts are available)
 80 through 89        match target="scan" (modify scanned patterns)
 90 through 99        font synthesis

의미하는 바를 대충은 알겠는데, 정확히는 모르겠다.
대충을 적어보면 다음과 같다.

10번대 파일들은 AA, Hinting 에 대한 설정을 담고 있다. 켤 것인지, 끌 것인지, 힌팅은 어느 정도로 줄 것인지.

20대 파일들은 개별 글꼴에 대한 세부 설정을 해주고 있다. 예를 들어, 바탕체, 굴림체등 한글 고정폭 글꼴이 영문자를 2배로 크게 표시하는 등 오류를 잡아준다거나(20-fix-globaladvance.conf), Times 에서 비트맵을 사용하지 않게 한다거나.. 등등의 설정이 있다.
중요한 것은 29-language-selector-ko-kr.conf 이다. 이 파일은 괜히 있다는 것이 우분투 사용자들의 중론이다.
이 파일은 10번대 파일과 중복이 되는 설정이 있으며, 한글 글꼴 중 10~22 포인트 글꼴에서 AA, Hinting 을 모두 꺼버리는 설정값을 가지고 있다. 이 부분 때문에, 우분투 초보자들이 첫 설치후 화면이 왜 이리 뭉개지냐며 짜증을 내곤 하는 일이 종종 생기곤 했다. 한마디로, 이 파일은 없어도 전혀 관계가 없어 보인다.

30번대는 뭐.. 각종 영어글꼴에 관한 설정인데 잘 모르겠다!

40번대는, 각 실제 이름에 입각한 글꼴 패밀리를 위에서 얘기한 명목상 글꼴유형으로 할당해주는 역할이다. 그런데, 이게 설치된 글꼴 파일 정보에 입각해서 만드는 것 같지는 않다. 백묵 글꼴은 내 시스템엔 없음에도 여기엔 백묵글꼴에 대한 정보가 들어가 있다. 아마도, 미리 설정된 값인 것 같다. 사실 이 설정이 크게 중요해보이진 않는다. 적어도 내가 쓰는 한도내에서는.
40대에서 주의깊게 볼 파일은 49-sansserif 이다. 첫 부분 주석과 설정 끝 부분을 보면,

<!--
  If the font still has no generic name, add sans-serif
 -->

    <match target="pattern">
        <test qual="all" name="family" compare="not_eq">
            <string>sans-serif</string>
        </test>
        <test qual="all" name="family" compare="not_eq">
            <string>serif</string>
        </test>
        <test qual="all" name="family" compare="not_eq">
            <string>monospace</string>
        </test>
        <edit name="family" mode="append_last">
            <string>sans-serif</string>
        </edit>
    </match>

이제 아까 fc-match sans -s 명령에서 왜 그리 많은 글꼴들이 sans 에 할당되었는지 알 수 있게 됐다. Generic Name 이 없는 글꼴은 모두 sans-serif 에 할당되는 모양이다. sans-serif 가 아니고, serif 가 아니고, monospace 가 아니면 sans-serif 로 할당하라는 뜻이다. 이 부분은 나중에 한번 더 얘기하겠다.

50대는 별 거없다.

60대는 Alias 에 대한 설정인데, 아마도 Type1 글꼴과 Truetype 글꼴간 이름을 대응시켜주는 듯 하다. 사용자가 크게 신경쓸 부분은 없어보인다.
여기서 가장 중요하게 볼 파일은 한글관련 설정파일인 69-language-selector-ko-kr.conf 이다. 전문을 옮겨서 하나 하나 살펴보겠다.

<fontconfig>

<!-- Set preferred Korean fonts -->
    <match target="pattern">
        <test qual="any" name="family">
            <string>serif</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>UnBatang</string>
        </edit>
    </match>
    <match target="pattern">
        <test qual="any" name="family">
            <string>sans-serif</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>UnDotum</string>
            <string>Guseul</string>
        </edit>
    </match>
    <match target="pattern">
        <test qual="any" name="family">
            <string>monospace</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
        <!--    <string>UnDotum</string>  -->
            <string>Guseul</string>
        </edit>
    </match>

<!-- Bind EunGuseul with Bitstream Vera Sans -->
<match target="pattern">
    <test name="family">
        <string>Guseul</string>
    </test>
    <edit mode="append" binding="strong" name="family">
        <string>Bitstream Vera Sans</string>
    </edit>
</match>

<!-- Bind EunGuseul Mono with Bitstream Vera Sans Mono -->
<match target="pattern">
    <test name="family">
        <string>Guseul Mono</string>
    </test>
    <edit mode="append" binding="strong" name="family">
        <string>Bitstream Vera Sans Mono</string>
    </edit>
</match>

</fontconfig>

맨 첫 부분으로 나머지 모두를 설명할 수 있을 것 같다.

    <match target="pattern">
        <test qual="any" name="family">
            <string>serif</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>UnBatang</string>
        </edit>
    </match>

이 파일의 첫목적은 Sans, Serif, Monospace 글꼴을 한글글꼴에 어떻게 대응시킬지를 정해주는 것이다.
처음에 serif 패밀리를 지정하고, 은바탕 글꼴을 할당해주었는데, 그 방식으로는 ‘Prepend’ 라는 명령을 사용했다. 일 전의 글에서 Prepend, Append, Assign 등에 대해 잘못 얘기했었는데(그래도 결과는 같지만) 이젠 좀 더 진실(?)에 가까운 설명을 해보도록 한다.
간단하게 말해서, Prepend 는 대응된 글꼴 목록 중에서 현재 설정한 글꼴에 최우선권을 부여하겠다는 얘기가 된다. Append 는 나중 우선권을 주겠단 뜻이 되고, Assign 은 대응을 아예 다시하겠다는 얘기가 된다. 예를 들면 아래와 같다.

먼저, 설치되고 아무 것도 건드리지 않은 상태에서 fc-match serif -s 의 결과는

$ fc-match serif -s
UnBatang.ttf: "UnBatang" "Regular"
Guseul.ttf: "Guseul" "Regular"
DejaVuSerif.ttf: "DejaVu Serif" "Book"
DejaVuSerif-Bold.ttf: "DejaVu Serif" "Bold"
wqy-zenhei.ttc: "WenQuanYi Zen Hei" "中等"

위 내용 중에서 은바탕이 바로 69-language-selector-ko-kr.conf 파일에 의해 할당된 것이다. 나머지는 (아마도) 자동으로 할당된 듯 하다. 자동으로 할당되는 내용(설정)이 어디에 있는지는 모르겠다. 어떤 메커니즘에 의해 저런 일련의 글꼴들이 Serif 에 할당되는지는 모르겠단 것이다.
어쨌든 중요한 것은, 시스템에서 인위적으로 대응시켜준 것은 위 파일에 있는, Serif:은바탕이 유일하다.

이제, Prepend, Append, Assign 을 좀 더 쉽게 알아보기 위해서 ~/.fonts.conf 를 만들고 아래 내용을 추가한다.

<?xml version="1.0"?>
  <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
  <fontconfig>

 <match target="pattern" >
    <test name="family" >
      <string>Serif</string>
    </test>
    <edit mode="prepend" binding="strong" name="family" >
        <string>나눔명조</string>
    </edit>
 </match>

  </fontconfig>

Serif 패밀리에 나눔명조를 Prepend 시켜줬다. 즉, 최우선권을 준 것이다. fc-match 결과는,

fc-match serif -s
나눔명조.ttf: "나눔명조" "Regular"
UnBatang.ttf: "UnBatang" "Regular"
Guseul.ttf: "Guseul" "Regular"
DejaVuSerif.ttf: "DejaVu Serif" "Book"
DejaVuSerif-Bold.ttf: "DejaVu Serif" "Bold"
wqy-zenhei.ttc: "WenQuanYi Zen Hei" "中等"

이렇게 해서 은바탕보다 나눔명조에 우선권이 할당되었음을 볼 수 있다.
만약, 같은 설정에서 append 를 하면 어떻게 될까? 그때는 나눔명조가 은바탕 아래, 구슬 위에 위치하게 된다. 즉 1순위 은바탕 뒤에 Append 되어 2순위가 되는 것이다. 구슬 이하로 밀리지 않은 것은, 구슬 이하는 아까도 말했듯 자동으로 추가되어 그런게 아닌가.. 생각한다.

그러면, 만약 1순위는 나눔명조, 2순위는 은바탕, 3순위는 AR PL UMing CN 으로 하고 싶다면?

<match target="pattern" >
    <test name="family" >
      <string>Serif</string>
    </test>
    <edit mode="prepend" binding="strong" name="family" >
        <string>나눔명조</string>
    </edit>
   <edit mode="append" binding="strong" name="family" >
        <string>AR PL UMing CN</string>
    </edit>
 </match>

나눔은 Prepend 로 설정, AR PL UMing 은 Append 로 설정하여 은바탕을 사이에 낀 형태가 되었다.

이제 다음을 보면 좀 더 확실해진다.

저 화면은 김프에서 “한국韓國韩国” 이라 입력하고 글꼴을 Serif 로 준 것이다. 모양이 비슷하여 잘 구분은 안되지만, 한국은 나눔명조로, 韓國은 나눔명조에 없으므로 은바탕으로, 韩国은 AR PL UMing 글꼴로 할당되었다. 혹 헷갈릴 수도 있는데, 한글/한자/한자간체를 알아서 구분하여 글꼴이 할당되는 것이 아니고, 순차적으로 할당이 되는 것같다.

이제 Append/Prepend 는 대충 감이 오므로, 원하는대로 설정이 가능하게 됐다.
만약에, 나눔고딕/AR/은바탕 순으로 하고 싶다면?
이 때는 나눔고딕과 AR을 Prepend 하면 된다.

<match target="pattern" >
    <test name="family" >
      <string>Serif</string>
    </test>
    <edit mode="prepend" binding="strong" name="family" >
        <string>나눔명조</string>
        <string>AR PL UMing CN</string>
    </edit>
 </match>

위와 같이 Prepend 안에 두 개를 같이 써주면 된다.

이제 남은 것은 Assign 인데, 이것도 별 건 없다. 다음의 결과는 어떻게 될까?

 <match target="pattern" >
    <test name="family" >
      <string>Serif</string>
    </test>
    <edit mode="assign" binding="strong" name="family" >
        <string>나눔명조</string>
    </edit>
 </match>

짐작한대로, 다음과 같은 결과가 나온다.

$ fc-match serif -s
나눔명조.ttf: "나눔명조" "Regular"
UnDotum.ttf: "UnDotum" "Regular"
Guseul.ttf: "Guseul" "Regular"
DejaVuSerif.ttf: "DejaVu Serif" "Book"
DejaVuSerif-Bold.ttf: "DejaVu Serif" "Bold"
DejaVuSerif-Italic.ttf: "DejaVu Serif" "Italic"
DejaVuSerif-BoldItalic.ttf: "DejaVu Serif" "Bold Italic"
wqy-zenhei.ttc: "WenQuanYi Zen Hei" "中等"
....

은바탕이 사라져버렸다. Assign 은 워낙에 은바탕으로 설정되었던 것을 지워버리고 그 자리에 나눔명조를 넣겠다는 의미인 것이다.
다시 말해서, 69-language-selector-ko-kr.conf 에 설정된 Serif 관련 내용을 초기화하고 다시 설정해준다는 의미이다.

이것으로 그동안 애매하게 괴롭히던 Append/Prepend/Assign 에 대한 궁금증이 모두 풀렸다.
이 설정들을 적절히 사용하면, 원하는 대로 영어/한글/한자 글꼴을 짝지워 줄 수 있다.

나머지 70/80/90 및 기타 설정은 잘 모르겠다~

이제 대강 분위기 파악은 했고, 원하는대로 설정을 하려면 어찌해야하는지 번개같이 정리해본다.
저 설정을 직접 건드리는 건 root 권한이 필요하기도 하고, 기본값을 변경하는 것이므로 별로 권장할만한 방법은 아니라고 본다.
conf.d 에서 필요하지 않은 파일들을 지우는 정도로 기본설정은 마친다.

한글 환경에서 필요없는 파일은 다음과 같다.

  • 29-language-selector-ko-kr.conf (AA, Hint 관련; 지워도 무방)
  • 44-wqy-zenhei.conf (선택적 삭제)
  • 49-sansserif.conf (선택적 삭제)

44-wqy-zenhei.conf 이 파일이 왜 필요가 없었는지는 잘 기억이 나질 않는다. 이 설정이 있으나 없으나 저 글꼴을 쓰지 않는 이상 큰 차이는 없지 않을까?
49-sansserif.conf 이 내용은 위에 쓴대로, 미리 알려진 Alias 가 없을 때에는 무조건 Sans 에 추가하는 것인데.. 이게 있으면 Flash 에서 약간 이상한 동작을 보일 수도 있다.

예를 들어, Sans 를 한자가 없는 글꼴에 할당을 했다고 하면(예를 들어 Sans 에 나눔고딕을 Prepend), Flash 제목에서 한자가 표시되질 않는다.

이 때, 49-sansserif.conf 를 지워버리면 한자가 표시된다.

우분투 버그질라였었나.. 이 문제로 몇년을 토론한 걸 본 적이 있는데… 원인이 뭔지, 49-sansserif.conf 이 파일의 설정이 어떤 것이기에, 어떤 연유로 저런 결과를 나았는지는 아직도 확실히 알 수가 없다. 혹자는 플래시의 문제라고도 하는데..

아무튼, 29는 정말로 불필요한 설정이므로 지워버리면 되고, 44,49는 환경에 따라서 적절히 지우거나 이름을 바꾸거나 하면 될 것이다.

마지막으로, 모든 설정은 ~/.fonts.conf 에 기록하는 것을 원칙으로 한다. 홈디렉토리에 설정해놓는 것이 나중을 위해서도, 고칠 때도 Root 권한이 없어도 되고, 두루 두루 좋고 편하다.

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.