1 Fontconfig 이용

Emacs를 쓰면서 한글 글꼴 폭이 영문 글꼴 폭의 두 배가 되게 해서 쓰고 있다. 옛 버전에서는 Emacs 소스 코드에 CJK 글꼴에 패딩을 주는 패치를 하고 직접 빌드해서 썼는데 소스 코드가 바뀌면서 패치를 새로 만들어 주어야 하는 것이 귀찮고 잘못 나오는 부분도 있고 해서 다른 방법을 찾아 보다가 fontconfig에서 matrix로 글꼴을 변형하는 방법이 있어 이 방법으로 한글 폭을 늘려서 사용했다. 아래는 ~/.config/fontconfig/fonts.conf 파일 내용 중 일부이다. 이렇게 하면 폭이 1.2배 커진다. 이것이 적용된 D2Coding 글꼴을 유니코드 한글 영역에 대해서 사용하도록 Emacs를 설정하면 된다. (내가 TeX 사용자 그룹에 썼던 댓글 참조)

  <match target="pattern">
    <test qual="any" name="family">
      <string>D2Coding</string>
    </test>
    <edit mode="assign" name="matrix">
      <times>
        <name>matrix</name>
        <matrix>
          <double>1.2</double><double>0</double>
          <double>0</double><double>1.0</double>
        </matrix>
      </times>
    </edit>
  </match>

그런데 이 방법은 Xft에만 적용이 된다. Xft 대신에 Cairo를 쓰도록 Emacs가 개발되고 있는 것 같은데 최근 개발 버전에 Cairo가 기본이 된 것 같다. --without-cairo 옵션과 --with-xft 옵션을 줘서 빌드하면 계속 원하는 모양이 나오지만 Cairo로도 되는 방법이 있으면 좋을 것이다. 아직 Cairo에 대한 Emacs 개발이 다 끝나지 않아서 fontconfig 설정이 안 먹히는 것일까?

2 글꼴 파일 직접 수정

일단은 그냥 글꼴 파일을 고쳐봤다. 글꼴에 대해서 전혀 모르는데 시행착오를 겪으며 글꼴 폭을 늘리는 방법을 알아냈다.

  1. Fontforge라는 프로그램으로 D2Coding.ttc 파일을 연다.
  2. 여러 번 시도할 수 있으니까 파일>파일명을 지정해서 저장을 눌러 .sfd 파일을 저장한다. 원 파일을 닫고 이 파일을 연다.
  3. 글꼴 이름을 바꾸어서 D2Coding도 쓰고 고친 글꼴도 쓰면 좋을 것이다. 요소>폰트정보에서 D2Coding을 다른 이름으로 바꾼다. 난 D3Coding으로 하였다. 바꿀 곳이 PS Names에도 있고 TTF명에도 있다. 바꾸고 OK 한다. 이 상태를 다음에 또 쓸 수 있게 저장한다.
  4. 편집>선택>출력에 적합한 글리프를 클릭해서 글자들을 선택한다.
  5. 메트릭>폭을 설정에서 글리프폭 확대 비율을 120%로 설정하고 OK 한다. 이렇게 하고 글꼴을 출력해도 원하는 결과가 나온다. 그런데 글자 크기는 똑같고 빈공간만 커져서 글자가 듬성듬성해서 보기가 안 좋을 수 있다. 취향 차이일 수 있다. 진짜 글자 폭을 변경하려면 계속한다.
  6. 글자들이 선택된 상태에서 요소>변형에 가서 변형을 하는데 확대·축소를 선택하고 X를 원하는 만큼 100%에서 120%까지의 값을 준다. 그리고 Transform Width Too는 체크가 안 되게 한다. 이것을 체크해 두면 또 폭이 증가한다. OK 한다.
  7. 파일>폰트를 출력에서 TrueType을 선택하고 바꾼 글꼴 이름으로 글꼴을 출력한다.
  8. Emacs에서 이 글꼴을 사용하도록 설정하고 한글 글꼴 폭이 영문 글꼴 폭의 두 배가 되었는지 확인한다. 안 되었다면 4번으로 가서 값들을 바꿔서 시도한다.

3 기울임 글꼴

D2Coding에는 기울임 글꼴이 없다. 그래서 Xft를 쓸 때는 폭 늘리는 방법과 비슷하게 fontconfig에 matrix를 적용했다. 그런데 이 경우에는 기울임 스타일의 글꼴이 있어야 적용되는 것 같다. 그래서 D2Coding.ttc를 fontforge 프로그램으로 열어서 이름 바꾸는 방법과 비슷하게 스타일 관련된 곳의 RegularItalic으로 바꿔주고 D2Coding-It.ttf로 글꼴 출력을 하였다. 그러면 아래의 fontconfig 설정이 적용이 된다.

  <match target="font">
    <test qual="any" name="family" compare="eq">
      <string>D2Coding</string>
    </test>
    <test name="slant" compare="more_eq">
      <int>80</int>
    </test>
    <edit mode="assign" name="matrix">
      <times>
        <name>matrix</name>
        <matrix>
          <double>1</double><double>0.2</double>
          <double>0</double><double>1</double>
        </matrix>
      </times>
    </edit>
  </match>

이렇게 하면 기울임 글꼴에 대해서 위에 있는 폭 늘리는 matrix와 기울이는 matrix가 모두 적용이 되어 폭도 맞고 글꼴도 기울어진다.

Xft로 컴파일된 Emacs에서 fontconfig matrix 적용 글꼴 사용 모습

그런데 Cairo를 쓰면 역시 이것도 무효가 되기 때문에 직접 글꼴을 기울였다. D2Coding-It.ttf을 파일을 기초로 해서 fontforge 폰트정보에서 D2CodingD3Coding 같은 이름으로 바꿔주고 이전처럼 폭을 설정하고, 요소>변형에서 전과 조금 달리 확대·축소와 동시에 아래 선택에서 기울기를 선택하고 시계방향으로 15° 정도를 주어 변형한다. 이것을 출력하여 .ttf 파일로 저장하면 Emacs에서 한글 기울어진 글꼴을 볼 수 있다.

Cairo로 컴파일된 Emacs에서 직접 수정한 글꼴 사용 모습

완벽을 기하기 위해 D2Coding.ttc에 있는 Bold 글꼴도 Regular와 같이 폭을 늘려서 .ttf 파일로 저장해 주자. 그러면 fc-list D3Coding 명령을 치면 다음과 같이 출력된다.

$ fc-list D3Coding
/home/esrevinu/.fonts/D3CodingBold.ttf: D3Coding:style=Bold
/home/esrevinu/.fonts/D3Coding.ttf: D3Coding:style=Regular
/home/esrevinu/.fonts/D3Coding-It.ttf: D3Coding:style=Itailic

4 Emacs 설정

난 Spacemacs를 쓰는데 글꼴 관련 설정은 다음과 같이 했다.

(defun dotspacemacs/init ()
  (setq-default
   dotspacemacs-default-font '("Source Code Pro"
                               :size 13
                               :weight normal
                               :width normal)
   ))
(defun dotspacemacs/user-init ()
  (setq haskell-font-lock-symbols t)

  (when window-system
    (require 'fira-code-mode)
    (add-hook 'prog-mode-hook #'fira-code-mode)
    (add-hook 'org-mode-hook #'fira-code-mode)

    (setq haskell-font-lock-symbols-alist
          '(("." "∘" haskell-font-lock-dot-is-not-composition)))
    (add-hook 'haskell-mode-hook
              (lambda ()
                (prettify-symbols-mode -1)
                (setq prettify-symbols-alist
                      (append '(
                                ("\\" . ?λ)
                                ("()" . ?∅)
                                ("not" . ?¬)
                                ("&&" . ?∧)
                                ("||" . ?∨)
                                ("undefined" . ?⊥)
                                ("forall" . ?∀)
                                ("sqrt" . ?√)
                                ("pi" . ?π)
                                )
                              (seq-filter (lambda (item)
                                            (let ((a (car item)))
                                              (not (or (equal a "x")
                                                       (equal a "&&")
                                                       (equal a "||")))))
                                          prettify-symbols-alist)))
                (prettify-symbols-mode t))))
  )

(defun dotspacemacs/user-config ()
  (when window-system
    (diminish 'fira-code-mode "λ")
    (fira-code-mode--setup)

    (set-fontset-font t '(#X1200 . #Xa95f) '("D3Coding" . "unicode-bmp"))
    (set-fontset-font t '(#Xac00 . #Xd7af) '("D3Coding" . "unicode-bmp"))

    (set-fontset-font t '(#X1100 . #X11ff) '("함초롬돋움" . "unicode-bmp"))
    (set-fontset-font t '(#Xa960 . #Xa97c) '("함초롬돋움" . "unicode-bmp"))
    (set-fontset-font t '(#Xd7b0 . #Xd7fb) '("함초롬돋움" . "unicode-bmp"))
    (set-fontset-font t '(#Xe0bc . #Xefff) '("함초롬돋움" . "unicode-bmp"))
    (set-fontset-font t '(#Xf100 . #Xf66e) '("함초롬돋움" . "unicode-bmp"))

    (set-fontset-font t 'han '("Noto Sans CJK KR" . "unicode-bmp"))
    )
  )

fira-code-modeEmacs-instructions에서 얻을 수 있는데 Fira Code Symbol이란 글꼴이 필요하다. 그런데 이 글꼴은 유니코드 개인사용영역에 ligature 글꼴을 넣어 놓았는데 공교롭게도 옛한글 완성형 한글 코드와 충돌이 난다. 위 코드에서 함초롬돋움 글꼴을 쓰는 부분이 옛한글 부분이다. 옛한글 쓰지도 않지만 완벽하게 하기 위해 글꼴 파일을 고쳐서 글자를 이동시키고 fira-code-mode도 수정했다. 링크의 코드에서 #Xe100#Xe000으로, #Xe16f#Xe06f으로, Fira Code SymbolFira Code Symbol2로 바꾼 후에 수정한 Fira Code Symbol 글꼴을 쓰면 된다.

Source Code Pro 글꼴이 13 크기일 때만 D2Coding 120% 폭 늘림이 맞는 것 같다. 다른 크기이면 다른 폭 늘림 비율을 적용해야 할 것이다. 공식을 만들 수 있을 것이다. Visual Studio Code에서도 D3Coding을 적용하고 글꼴 크기를 13으로 바꾸니까 잘 된다. Visual Studio Code에서는 Fira Code 글꼴을 D3Coding 글꼴 앞에 두었다. Visual Studio Code는 fontconfig matrix가 적용되지 않았다.