글꼴 도구

대부분의 작성자는 .vf 파일을 직접 만지지 않습니다. 하지만 글꼴을 만들거나 연결하는 쪽으로 가면 세 가지 고급 도구가 필요해집니다. 논리 글꼴을 실제 글꼴에 연결하는 가상 글꼴, CJK 글리프 폭과 문장부호 간격을 기록하는 JFM (Japanese Font Metric), 그리고 글꼴 안에 실제로 무엇이 들어 있는지 보여 주는 글리프 표 출력 도구입니다. 이 페이지는 글꼴 개발자와 고급 사용자를 위한 그런 저수준 유틸리티를 다룹니다.

가상 글꼴 — 논리 글꼴을 실제 글꼴에 매핑하기

가상 글꼴(virtual font, .vf)은 TeX이 보는 하나의 논리 글꼴을 실제 글리프와 저수준 조판 명령의 열에 대응시키는 “층”입니다. TeX FAQ의 표현을 빌리면 가상 글꼴은 “글꼴의 글리프를 만들기 위해 여러 조각을 모으는 수단”이며, 그 조각은 다른 글꼴, 룰, 위치 정보가 있는 조판 명령에서 가져올 수 있습니다. 이를 통해 문자의 순서를 다시 매핑하거나, 여러 글꼴을 하나로 결합하거나, 스몰 캡스를 흉내 내거나, 수학 글꼴의 부품을 모아 하나의 서체로 만들 수 있습니다.

이 구조는 역할이 둘로 나뉩니다. TeX 본체는 폭, 높이, 깊이 같은 치수만 알면 되며, 이는 함께 있는 .tfm (TeX Font Metric) 에서 읽습니다. 반면 각 글리프를 “실제로 어떻게 그릴지”, 즉 어느 실제 글꼴의 어느 위치 글자를 얼마나 이동해 놓을지는 .vf에 쓰이고, 이를 읽는 것은 DVI 드라이버(dvips, dvipdfmx)입니다. 따라서 가상 글꼴은 항상 .tfm.vf 두 개가 한 쌍입니다. TeX은 .tfm으로 조판 위치를 정하고, 드라이버가 .vf를 펼쳐 실제 글꼴로 흘려보냅니다.

바이너리 .vf는 사람이 읽고 쓰기 위한 것이 아니므로, 대응되는 사람이 읽을 수 있는 텍스트 형식 .vpl (Virtual Property List) 이 있습니다. 이는 중첩된 “property list”로 쓰이며 글꼴의 세부 사항을 손으로 기술하고 확인하기에 좋습니다. 두 형식을 서로 변환하는 프로그램이 다음 두 가지이며, 모든 TeX 배포판에 포함되어 있습니다(fontware 도구에서 온 vptovfvftovp).

  • vptovf.vpl(텍스트) → .vf + .tfm(바이너리). 손으로 쓰거나 편집한 가상 글꼴 설명을 TeX과 드라이버가 사용할 수 있는 형태로 만듭니다.
  • vftovp.vf + .tfm(바이너리) → .vpl(텍스트). 기존 가상 글꼴을 사람이 읽을 수 있는 형태로 되돌려 내용을 확인하거나 편집할 수 있게 합니다.

인수 순서는 기억해 둘 만합니다. vftovp가상 글꼴, 메트릭, 출력 순서이고, vptovf설명, 가상 글꼴, 메트릭 순서입니다. 둘 다 확장자는 생략할 수 있으며 각각 .vf / .tfm / .vpl이 보충됩니다. 예를 들어 기존 가상 글꼴을 풀어 보려면 다음처럼 합니다.

terminal
# 仮想フォントを人間可読の VPL に戻して中身を見る
# Turn a virtual font back into a readable VPL to inspect it
vftovp font.vf font.tfm font.vpl

# 編集後、VPL から .vf と .tfm を作り直す
# After editing, rebuild the .vf and .tfm from the VPL
vptovf font.vpl font.vf font.tfm

생성된 .tfm은 texmf 트리의 .../fonts/tfm/<supplier>/ 아래에, .vf.../fonts/vf/<supplier>/ 아래에 놓고 mktexlsr로 파일 이름 데이터베이스를 갱신하면 kpsewhich font.vf처럼 검색할 수 있습니다. PostScript 글꼴에서 가상 글꼴을 생성하는 현대적인 작업에서는 .vpl을 직접 손으로 쓰기보다 fontinst 를 사용하는 것이 일반적입니다. 실제로 가상 글꼴은 처음부터 직접 작성하는 대상이라기보다, 이런 도구가 내놓은 결과를 읽고 미세 조정하는 대상으로 보는 편이 더 가깝습니다.

JFM — Japanese Font Metric

일본어 조판에는 서양문자용 .tfm만으로는 부족한 정보가 필요합니다. 한자와 가나는 기본적으로 정사각형(전각) 박스에 들어가며, 글자 사이의 공간은 서양문자처럼 단어 사이 공백으로 띄우는 것이 아니라 문장부호(괄호와 구두점) 주변에서만 조이거나 벌립니다. 이 정보를 담는 구조가 JFM (Japanese Font Metric) 입니다. pTeX와 upTeX는 .tfm과 비슷한 바이너리 JFM 파일을 사용하고, LuaTeX-ja는 같은 역할을 Lua 테이블로 기술합니다.

서양문자 TFM과 가장 큰 차이는 JFM이 문자를 “문자 클래스(character class)”로 묶어 다룬다는 점입니다. LuaTeX-ja 매뉴얼이 정하듯 JFM의 모든 길이는 디자인 크기 단위의 부동소수점 수로 쓰이며, zw(전각 폭)와 zh(전각 높이, height + depth)를 기준으로 각 문자 클래스마다 width, height, depth, italic(이탤릭 보정)을 가집니다. 클래스 0은 반드시 존재하며 다른 어떤 클래스에도 속하지 않는 대다수 일본어 문자가 여기에 들어갑니다. 문장부호 등은 별도 클래스로 나누고, 한 클래스와 다른 클래스 사이에 삽입할 glue/kern 표를 둡니다. 이것이 글자 사이와 문장부호 주변의 공간을 만드는 방식입니다.

pTeX 계열에서는 JAglue(일본어 문자끼리, 그리고 일본어 문자와 서양문자 텍스트 사이에 들어가는 간격)가 조판 시 자동으로 삽입됩니다. 클래스 사이의 간격은 JFM이 정하고, 클래스가 지정되지 않은 일본어 문자 사이에는 기본 kanjiskip, 일본어/서양문자 경계에는 xkanjiskip이 들어갑니다. 후자는 *kinsoku*(행 머리나 행 끝에 와서는 안 되는 문자를 제어하는 규칙)와 함께 일본어 조판의 모양을 지탱하는 핵심입니다. LuaTeX-ja의 JFM 파일은 처음에 luatexja.jfont.define_jfm{ ... }을 단 한 번 호출하는 Lua 스크립트이며, 다음과 같은 골격을 가집니다.

latex
-- LuaTeX-ja の JFM(抜粋)。寸法はすべてデザインサイズ単位
-- A LuaTeX-ja JFM (excerpt); all lengths are in design-size units
luatexja.jfont.define_jfm {
  version = 3,
  dir = 'yoko',          -- 横組み / horizontal
  zw = 1.0, zh = 1.0,     -- 全角の幅・高さ / full-width, full-height
  [0] = {                -- 文字クラス 0:大多数の漢字・仮名 / class 0: most kanji & kana
    chars = { '漢' },
    width = 1.0, height = 0.88, depth = 0.12, italic = 0.0,
  },
  [1] = {                -- 句点など別クラス / a class for stops, etc.
    chars = { '。', '、' },
    width = 0.5, height = 0.88, depth = 0.12, italic = 0.0,
  },
}

LuaTeX-ja에는 용도별 표준 JFM이 함께 제공됩니다. jfm-ujis.lua는 upTeX용 메트릭 upnmlminr-h.tfm을 기반으로 한 표준(대부분의 글자가 정사각형)이고, jfm-jis.lua는 pTeX에서 널리 쓰이는 jis.tfm에 해당하며(글자가 가로로 긴 직사각형이 되기 쉬움), jfm-min.lua는 pTeX 기본 min10.tfm에 해당합니다. 글꼴 정의에서는 \jfont\F=HaranoAjiMincho-Regular:jfm=ujis처럼 jfm=으로 지정합니다. 한편 pTeX 계열의 바이너리 JFM은 서양문자 pl/tfm을 다루는 pltotftftopl의 일본어판에 해당하는 ppltotfptftopl로 텍스트와 상호 변환할 수 있습니다.

글꼴에 무엇이 들어 있는지 나열하기 — fonttable과 nfssfont

글꼴에 실제로 어떤 글리프가 들어 있는지 확인하려면 글리프 표(글꼴 표) 를 출력합니다. 문서 안에서 손쉽게 출력하는 방법은 fonttable 패키지이며, 중심 명령 \fonttable{<font>}는 지정한 글꼴의 모든 글리프를 표로 배열해 조판합니다. 인수는 글꼴, 더 정확히는 .tfm의 이름입니다. Computer Modern Roman은 cmr10, Zapf Dingbats는 pzdr처럼 지정합니다.

document.tex
\documentclass{article}
\usepackage{fonttable}
\begin{document}
% フォント名(.tfm)を渡すと全字形の表が出る
% Pass a font (.tfm) name to get a table of every glyph
\fonttable{cmr10}

% NFSS の 4 属性で指定する版(エンコーディング/ファミリ/シリーズ/シェイプ)
% The NFSS-attribute version (encoding/family/series/shape)
\xfonttable{T1}{cmr}{m}{n}
\end{document}

NFSS의 네 속성으로 지정하려면 \xfonttable{<encoding>}{<family>}{<series>}{<shape>} 를 사용합니다(예: \xfonttable{T1}{cmr}{m}{n}). 표의 문자 범위는 \fontrange{<low>}{<high>}로 16글리프 블록 단위로 좁힐 수 있으며, 최대 256글리프까지 나열됩니다. \fonttext{<font>}를 사용하면 글리프 격자가 아니라 그 글꼴로 조판한 예문을 출력하므로 실제 보이는 모습을 판단하기 좋습니다.

fonttable은 원래 TeX에 포함된 고전 도구 nfssfont.textestfont.tex 를 패키지로 사용할 수 있게 다시 포장한 것입니다(패키지 코드의 많은 부분은 nfssfont.tex의 수정판이고, 글리프 테스트 명령군은 Knuth의 testfont.tex를 다시 구현한 것입니다). 고전판은 *대화형*으로 동작하는 것이 특징입니다. 예를 들어 tex nfssfont로 시작하고, 글꼴 이름(cmr10 등)을 입력한 뒤, \table로 표를 출력하고, \init으로 다른 글꼴로 전환하며, \bye로 종료합니다.

terminal
# 古典的な対話ツール:起動 → フォント名 → \table\bye
# The classic interactive tool: launch, name the font, \table, \bye
tex nfssfont
# Name of font to test = cmr10
# *\table
# *\bye

관련해서 현재 글꼴의 정체를 로그에 남기려면 \showfont 를 사용할 수 있습니다. 이는 현재 글꼴의 NFSS 다섯 속성, 즉 encoding, family, series, shape, size를 표시합니다. 글꼴 로딩 동작 자체를 추적하고 싶을 때는 tracefnt 패키지가 유용합니다. 마지막으로 시스템에 무엇이 설치되어 있고 어디에서 읽히는지 알아보려면, 글꼴 맵을 관리하는 updmap 과 파일의 실제 위치를 찾는 kpsewhich(예: kpsewhich cmr10.tfm)가 출발점입니다.