맨위로가기

메타폰트

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

메타폰트는 출력 장치 드라이버의 보조 도구로 실행되어 폰트의 비트맵을 생성하거나, 폰트 메트릭 파일을 생성하는 데 사용되는 언어이자 프로그램이다. 1979년 도널드 커누스에 의해 개발되었으며, 인터프리터 언어로서 글꼴 제작에 특화된 명령과 수학적 방정식을 다루는 기능을 제공한다. 메타폰트는 `.mf` 파일을 입력받아 래스터 출력, TeX 폰트 메트릭 정보, 로그 파일 등을 출력하며, 폰트 디자인의 실험과 새로운 글꼴 제작에 활용될 수 있다. 메타폰트 언어는 8가지 유형의 변수를 지원하며, 변수 간의 관계를 방정식으로 정의하여 글꼴 모양을 제어한다. 메타폰트는 전문 글꼴 디자이너들에게 널리 채택되지는 않았지만, 폰트 디자인의 매개변수를 조정하여 다양한 시도를 가능하게 한다.

더 읽어볼만한 페이지

  • 도널드 커누스 - 컴퓨터 프로그래밍의 예술
    도널드 커누스가 집필한 컴퓨터 과학 분야의 대표 저서인 컴퓨터 프로그래밍의 예술은 자료 구조, 알고리즘, 준수치적 알고리즘, 정렬 및 검색, 조합론적 알고리즘 등 프로그래밍 핵심 주제를 깊이 있게 다루고 문제 해결 능력 향상에 기여하며, MIX/MMIX 어셈블리 언어 분석을 통해 튜링상 수상 및 "세기의 과학을 형성한 100여 권의 책"으로 선정되는 등 높은 평가를 받았다.
  • 도널드 커누스 - TeX
    TeX는 도널드 커누스가 개발한 수학, 과학, 공학 분야의 고품질 문서 출력을 위한 조판 시스템이며, 수학 수식 조판에 특화된 매크로 시스템과 높은 확장성을 제공한다.
  • 글꼴 포맷 - 오픈타입
    오픈타입은 마이크로소프트와 어도비가 개발한 글꼴 형식으로, 유니코드를 기반으로 다양한 스크립트 지원, 크로스 플랫폼 호환성, 확장된 타이포그래피 기능, 스마트 폰트 옵션 등을 제공하며 표현력을 확장하는 기술을 포함하고 국제 표준으로도 지정되었다.
  • 글꼴 포맷 - 임베디드 오픈타입
    EOT는 웹 글꼴 포함을 위한 파일 포맷으로, 트루타입 글꼴에서 생성되어 부분 집합화 및 압축을 사용하지만, 인터넷 익스플로러에서만 지원되는 독점 표준이자 보안 문제로 인해 다른 포맷으로 대체되었다.
  • 선언형 프로그래밍 언어 - XAML
    XAML은 마이크로소프트에서 개발한 XML 기반의 마크업 언어로, 사용자 인터페이스, 데이터 바인딩, 이벤트 처리 등을 정의하며 WPF, Silverlight, WF, WinRT API 앱, Xamarin.Forms 등에서 UI 개발에 널리 사용된다.
  • 선언형 프로그래밍 언어 - 임베디드 SQL
    임베디드 SQL은 호스트 프로그래밍 언어 내에 SQL 문을 삽입하여 데이터베이스와 상호 작용하는 기술로, 데이터베이스 액세스를 표준화하지만 보안 취약점과 이식성 저하의 단점도 가진다.
메타폰트 - [IT 관련 정보]에 관한 문서
기본 정보
메타폰트 로고
메타폰트 로고
개발자도널드 커누스
최신 릴리스 버전2.71828182
최신 릴리스 날짜2021년 1월
운영 체제크로스 플랫폼
장르컴퓨터 언어
라이선스퍼미시브

2. 작동 방식

메타폰트는 출력 장치(프린터, 화면) 드라이버의 보조 도구로 실행되는 경우가 가장 많으며, 특정 출력 장치와 해상도에 맞는 비트맵 폰트를 생성한다. 폰트 메트릭(TFM) 파일 생성을 위해 실행될 수도 있으며, 이 파일은 TeX에서 폰트 정보를 처리하는 데 필요하다.

메타폰트는 "증명 모드"로 실행될 수 있는데, 이 모드에서는 폰트 글리프의 확대 이미지와 함께 폰트 디자이너가 지정한 점의 위치와 이름 등 추가 정보를 제공한다. 또한, 메타폰트는 대화식으로 실행하여 생성되는 이미지를 화면에 표시할 수도 있다.

메타폰트는 글리프뿐만 아니라 모든 종류의 그래픽 출력을 렌더링할 수 있지만, 수학적 일러스트레이션에는 메타포스트(MetaPost) 및 아심토트(Asymptote)가 선호된다.

METAFONT는 문자의 모양을 그리는 프로그램 소스 파일을 읽어들여, 조판용 정보(문자 크기나 합자 등의 정보)를 가진 폰트 메트릭 파일과 문자 모양 정보(글리프 데이터)를 가진 비트맵 폰트 파일을 생성하는 시스템이다.[1] 폰트 파일을 생성할 때 몇 가지 매개변수를 조정하여 동일한 소스 파일로부터 여러 종류의 폰트를 생성하는 것도 가능하다. 생성하는 문자의 윤곽에는 베지어 곡선이 사용된다.

METAFONT는 도널드 커누스가 개발한 조판 시스템 TeX와 함께 개발되었다. TeX에서는 수식 조판 등에도 역점을 두었는데, 그럴 경우 더욱 풍부한 조판 정보를 폰트 자체가 갖는 것이 기대된다. METAFONT는 그러한 조판 정보를 가진 폰트를 작성할 필요성에서 개발되었으며, TeX와 마찬가지로 자유 소프트웨어이며, 여러 플랫폼에 이식되었다.

METAFONT로 생성한 폰트를 다른 형식(Type1 등)으로 변환하는 프로그램도 개발되었다. 또한, METAFONT용 프로그램과 비슷한 구문의 프로그램으로 PostScript 형식의 이미지 파일을 생성할 수 있는 MetaPost도 개발되었다.

2. 1. 출력 파일

메타폰트는 `.mf` 파일을 입력받아 여러 종류의 파일을 출력한다. 주요 출력 파일은 다음과 같다.

파일 종류설명
NAME.NNNNgfNNNN 해상도(기본값 2602)의 래스터 출력을 포함하는 파일이다.
NAME.tfmTeX 폰트 메트릭 정보를 담은 파일로, TeX에 필요한 정보이다. 일반적으로 메타폰트에 이 파일을 생성하도록 지시해야 한다.
NAME.log처리 과정에서 생성되는 로그 파일이다.



`gftopk` 프로그램을 사용하여 NNNNgf 파일을 pk (packed) 형식 (.NNNNpk)으로 변환할 수 있다. pk 형식은 파일 크기를 약 절반으로 줄이고 처리 속도를 향상시키기 위해 도입되었다.[1] GF와 PK 형식 모두 비트맵의 런 렝스 인코딩을 사용하지만, 런 렝스의 다른 이진 인코딩을 사용한다. PK 형식은 비트맵에 대한 몇 가지 전처리 (경계 상자, 반복되는 행 삭제)를 수행하고 문자의 모든 행을 하나의 긴 비트 시퀀스로 인코딩한다.[1]

'TeX 디렉토리 구조' 표준에서는 파일 이름이 8+3자로 제한되므로 GF 및 PK 파일은 `.gf` 및 `.pk` 확장자만 갖는다. 서로 다른 해상도의 파일은 `dpiNNNN`과 같은 별도의 디렉토리에 배치하여 구분한다. (예: `dpi300/cmr10.pk`)

3. 언어

메타폰트 언어는 인터프리터 언어이며, ''본질적으로 선언적이며 명령형이 아니다''.[2] 프로그래밍 언어로서, 메타폰트는 글꼴 메트릭 파일과 글꼴 글리프 파일을 생성하고, 글꼴 제작에 특화된 각종 명령이 있으며, 수학적인 의미의 방정식을 그대로 다루고 연립 일차 방정식을 통해 변수 값을 지정할 수 있다는 특징을 가진다. 또한 연산자의 의미 변경까지 가능한 유연한 사용자 정의 기능을 제공한다.

3. 1. 변수와 방정식

메타폰트는 8가지 유형의 변수를 지원한다.[1] 메타포스트는 색상(세 개의 숫자 묶음)을 아홉 번째 유형으로 추가하고, 그림에 대해 완전히 다른(비래스터) 모델을 사용한다.[1] 변수의 이름은 단순 토큰이 아닌, 기호 토큰과 숫자 인덱스의 시퀀스로 구성된다.[1]

메타폰트는 연립 일차 방정식을 통해 변수 값을 지정할 수 있는 기능을 제공한다.[1] 수치 변수(또는 쌍 또는 변환 변수의 구성 요소)는 다음 세 가지 상태를 가질 수 있다.[1]

  • "알려짐"(설정됨)
  • "알 수 없는 독립"(설정되지 않음)
  • "알 수 없는 종속"(설정되지 않았지만 하나 이상의 독립적인 변수의 선형 표현식으로 제공됨)


메타폰트가 방정식 문을 실행하면 관련된 독립 변수 중 하나를 종속 변수로 바꾸고 다른 모든 종속 변수의 식에서 해당 변수를 제거한다.[1] 종속 변수의 식에 독립 변수가 남아 있지 않으면 해당 변수가 알려지게 된다.[1]

3. 2. 구문

메타폰트는 일반적인 구문을 가진 숫자 및 문자열 상수 토큰을 사용한다. 문자열은 `"` 따옴표로 구분되며, 숫자 상수는 소수점을 가질 수 있지만 지수 부분은 가질 수 없다. 다른 모든 토큰은 '기호'로 분류되며 임의로 재정의될 수 있다. 특정 의미를 가진 토큰이 특정 문자로 구성된 이름을 가져야 한다는 제한은 없다. 런타임 시에는 임의의 유형의 상수 값 토큰인 '캡슐' 토큰이 추가로 있을 수 있으며, 소스 코드에서는 기호 토큰으로 나타난다.

문자가 숫자 또는 문자열 상수에 관여하는 경우를 제외하고, 특정 문자를 포함하는 토큰의 범위는 해당 문자가 속한 클래스에 따라 달라진다. TeX와 달리 메타폰트는 고정된 문자 클래스를 가지고 있다. `,`, `;`, `(`, `)` 문자는 "고독한 문자"이며 단일 문자 토큰만 형성한다. `<=>:|`, `‘’` (작은 따옴표), `+-`, `/*\`, `!?`, `#&@$`, `^~`, `[`, `]`, `{}`, `.` 문자 클래스, 밑줄 클래스와 대문자 및 소문자 A–Z의 경우, 토큰은 동일한 클래스에서 가장 긴 연속된 문자 시퀀스로 구성된다. 공백 문자는 토큰에 기여하지 않으며, `%`는 줄 끝까지 지속되는 주석을 시작한다.

이러한 규칙의 주목할 만한 적용 사례는 `#`이 메타폰트 코드에서 변수 이름의 일부로 자주 나타난다는 것이다. 예를 들어 `em#` 및 `pt#`가 있다.

구분 기호(예: 괄호)는 내장된 의미가 없으며, 대신 두 개의 기호 토큰을 일치하는 구분 기호 쌍으로 바꾸는 명령이 있지만, 일반적으로 메타폰트 프로그램은 일반 괄호만 사용한다. 표현식의 우선 순위를 무시하는 것 외에도, 구분 기호는 특정 종류의 매크로 인수를 둘러싸는 데에도 필요하다.

3. 3. 그래픽스

메타폰트의 곡선은 이차 곡선이 아닌 3차 스플라인으로 정의되어 더 복잡한 연산이 가능하며, 이는 더 큰 다용성을 제공한다.[3]

일반적인 트루타입이나 포스트스크립트 타입 1과 같은 아웃라인 글꼴 형식과는 다르게, 메타폰트 글꼴은 주로 유한한 너비를 가진 "펜"으로 이루어진 스트로크와 채워진 영역으로 구성된다. 메타폰트는 글리프의 윤곽선을 직접 설명하는 대신 펜 경로를 설명한다. 컴퓨터 모던 계열의 서예 수학 글꼴과 같이 비교적 단순한 메타폰트 글꼴은 각 글리프의 시각적 "스트로크"를 정의하기 위해 큰 펜을 사용하여 단일 펜 스트로크를 사용한다. 반면, 로마자체의 컴퓨터 모던 계열의 텍스트 글꼴과 같이 더 복잡한 글꼴은 작은 펜을 사용하여 시각적 "스트로크"의 윤곽선을 따라가며 채운다. 이는 아웃라인 글꼴과 매우 유사하지만, 펜 모양에 의해 정의된 약간 부드러운 모서리를 가진다는 특징이 있다.

4. 활용

메타폰트는 전문 글꼴 디자이너들에게 널리 채택되지는 않았지만, 다양한 매개변수를 조정하여 폰트 디자인을 실험하고 새로운 글꼴을 만드는 데 활용될 수 있다. 헤르만 차프와 같은 유명한 글꼴 디자이너들이 도널드 커누스와 협력하여 메타폰트를 이용해 새로운 글꼴을 만들기도 했다. 하지만, 크누스는 "예술가에게 60개의 매개변수로 글꼴을 쓰는 방법을 이해할 만큼 수학자가 되라고 요구하는 것은 너무 과하다."라고 말했다.[4] 조너선 호플러는 메타폰트 시스템이 "여러분이 가장 좋아하는 글꼴의 기술과는 거리가 멀다... 글자가 골격 형태에서 시작한다는 크누스의 생각은 잘못되었다."라고 언급했다.[5]

메타폰트 시스템을 사용하면 세리프 글꼴이 텍스트 과정에서 서서히 산세리프 디자인으로 변환되는 것과 같은 특이한 폰트 처리도 가능하다. 1982년에 크누스는 이러한 변환을 시연하기도 했다.[6]

5. 역사

도널드 커누스는 1977년에 글꼴 제작 소프트웨어 작업을 시작하여 1979년에 첫 번째 버전의 메타폰트를 제작했다.[7] 1984년에 커누스는 기존 메타폰트 언어의 단점을 보완하여 완전히 새로운 시스템을 개발했으며, 현재 사용되는 것은 이 수정된 시스템이다.[7] 메타폰트는 TeX와 유사한 버전 관리 시스템을 가지고 있으며, 각 개정판마다 숫자가 점근선적으로 ''e''에 접근한다.[7]

6. 예제

다음은 글꼴의 문자 "B"에 대해 눕혀지고 닫힌 모양을 만드는 예제이다.[15]

```matlab

% 파일 이름: beta.mf

% mode_setup;

% 문자 B에 대한 콩 모양 정의

beginchar("B",11pt#,11pt#,0);

% 방정식 시스템으로 좌표 설정

y1=y2=y3=0;

y4=y5=y6=h;

x1=x4=0;

x2=x5=w;

x3=x6=2*w;

% 펜 정의

pickup pencircle xscaled 0.2w yscaled 0.04w rotated 45;

% 문자 곡선 그리기

% z1은 (x1, y1)과 동일합니다.

draw z1..z3..z6{z2-z6}..z5..{z4-z2}z4..cycle;

endchar;

end

```

위 코드는 다음과 같은 글리프를 생성한다.



위 예제는 다음 명령 행을 사용하여 처리된다.[15]

```bash

mf '\mode=ljfour; mode_setup; input beta.mf';

gftopk beta.600gf beta.600pk

```

그런 다음 아래 LaTeX 파일에서 사용할 수 있다.[15] (모든 파일은 같은 디렉토리에 있어야 한다. 또는 적절한 방법을 사용하여 TeX 시스템이 이 정보를 참조할 수 있게 해야 한다.)

```latex

\documentclass{article}

\newfont{\letterbeta}{beta}

\newcommand{\otherbeta}

\begin{document}

이상한 \otherbeta\를 여기에 사용해 봅시다.

\end{document}

```

결과 PDF 파일은 다음과 같을 것이다.



다음은 간단한 샘플 프로그램과 그 출력을 나타낸다.

```

1: beginchar(65,10pt#,10pt#,0pt#);

2: pickup pencircle xscaled 1.2pt yscaled 0.5pt rotated 120;

3: z1=(0.1w,0.75h);

4: z2-z1=whatever*(8,1);

5: x2=0.9w;

6: z3=(0.8w,0.1h);

7: draw z1--z2{z1-z2}..{z2-z1}z3;

8: labels(1,2,3);

9: endchar;

10: end.

```

행 번호는 설명을 위해 붙여져 있다.

  • 1행: 문자의 정보를 정한다. 문자 코드 65의 문자를 폭 10pt, 높이 10pt, 깊이 0pt (폭과 높이가 같은 값이나, 인수는 이 순서)로 작성하는 것을 선언한다.
  • 2행: 문자를 그리는 데 사용하는 "펜"을 정의한다. 이 펜은 단위 원을 세로 가로 다른 비율로 확대 축소하여 만들어지는 타원을 120도 회전시킨 것이다.
  • -|]]
  • 3행~6행: 3개 점의 위치를 정한다. 3개의 점은 각각 z1, z2, z3으로, 그림에서는 1, 2, 3으로 라벨을 붙여 표시되어 있다. w와 h의 값은 1행의 선언에 의해 결정되며, 이 예에서는 좌하의 좌표가 (0,0), 우하가 (w,0), 우상이 (w,h) 등이 된다.
  • z1과 z3은 각각 3행과 6행에서 명시적으로 결정된다.
  • z2의 결정 방식에 METAFONT의 특징이 잘 나타나 있다. 4행의 단계에서는 "z1에서 z2로 향하는 벡터가 (8,1)이라는 성분을 갖는 벡터의 몇 배가 되는가"만 정의되어 있다. 이어서 5행에서 z2의 x 성분이 명시적으로 주어지면, z2의 위치가 자동적으로 결정된다. METAFONT 내부에서는 4행의 단계에서 일차 방정식이 만들어진 후 5행과 함께 풀린다.
  • 7행: 문자를 그린다. 먼저 z1에서 z2로 직선을 그리고, z2에서는 z2에서 z1으로 향하는 방향으로 선을 그리기 시작한다. 그 선은 매끄러운 곡선을 그리면서 z3으로 향하지만, 최종적으로 z3에 도달할 때에는 z1에서 z2로 향하는 방향을 향하도록 한다.
  • 8행: 3개의 점에 라벨을 붙여 표시하고 있다.
  • 9행: 1행부터 이어진 문자 코드 65의 문자는 종료된다. 다른 코드의 문자를 그리고 싶다면 1행과 마찬가지로 계속할 수도 있다.
  • 10행: 1문자 밖에 없는 이 글꼴 세트가 종료된다.

7. PostScript Type 1 글꼴 생성

메타폰트 프로그램을 포스트스크립트 타입 1 글꼴로 변환하는 데 사용되는 여러 도구가 개발되었다.[15] 대부분은 메타포스트(MetaPost)의 메타폰트 언어의 하위 집합을 EPS 윤곽선으로 변환하는 기능을 사용하며, 이를 사용하여 포스트스크립트 타입 1 글꼴로 변환할 수 있다. 메타폰트 펜 스트로크의 벡터 윤곽선을 생성하는 것은 쉽지 않은데, 이는 글리프의 메타폰트 모델은 래스터 이미지이고 대부분의 스트로크의 정확한 윤곽선은 베지어 곡선이 아니기 때문이다.


  • 폴란드 JNS 팀은 포스트스크립트 타입 1 글꼴을 만들기 위해 METATYPE1[9] (메타포스트 기반)을 개발했다. 이 도구의 가장 큰 단점은 펜을 사용할 수 없다는 점으로, 메타폰트 언어의 힘을 크게 감소시킨다. 처음에는 폴란드 GUST 활자 주조소에서 컴퓨터 모던의 현대화되고 확장된 변형인 라틴 모던을 제작하는 데 사용되었다.
  • mf2pt1[10]은 메타포스트를 기반으로 하며, Scott Pakin이 개발하고 Werner Lemberg가 일부 기여했다. 또한 설명서에 자세히 설명된 몇 가지 제한 사항이 있으며, 가장 중요한 제한 사항은 각 글리프가 닫힌 경로에서 완전히 그려져야 한다는 것이다. mf2pt1의 제한 사항을 극복하기 위해 메타포스트에서 출력된 EPS는 FontForge로 후처리될 수 있다. FontForge는 메타폰트의 타원형 펜으로 메타포스트에서 생성된 복잡한 포스트스크립트 경로를 해석할 수 있으며, 윤곽선 중첩을 제거할 수도 있다. FontForge는 스크립팅을 지원하므로 이 후처리 단계를 자동화할 수도 있다. 이 접근 방식은 Achim Blumensath가 개발한 MnSymbol 수학 글꼴의 타입 1 윤곽선을 생성하는 데 사용되었다. MnSymbol은 미니온 프로의 보조 글꼴로 설계되었다.
  • MetaFog[11]는 펜 스트로크를 분석적으로 변환할 수 있는 독점 변환기이지만, 특이한 경우를 제거하려면 수동 후처리가 필요하며, 공개적으로 사용할 수 없다. 메타포스트 출력만 처리할 수 있다.[12]


펜 스트로크가 있는 타입 1 글꼴을 생성하는 일반적인 접근 방식은 고해상도 비트맵을 생성한 다음 mftrace[13] 및 TeXtrace[14]와 같은 패키지로 구현된 자동 추적기를 사용하는 것이다.

8. 비판적 시각 (중도진보 관점)

헤르만 차프와 같은 유명한 글꼴 디자이너들이 크누스와 협력하여 메타폰트를 이용해 새로운 글꼴을 만들고자 했지만, 전문 글꼴 디자이너들은 이 시스템을 널리 채택하지 않았다. 크누스는 "예술가에게 60개의 매개변수로 글꼴을 쓰는 방법을 이해할 만큼 수학자가 되라고 요구하는 것은 너무 과하다"라고 그 이유를 설명했다.[4] 조너선 호플러는 메타폰트 시스템에 대해 "여러분이 가장 좋아하는 글꼴의 기술과는 거리가 멀다... 글자가 골격 형태에서 시작한다는 크누스의 생각은 잘못되었다"라고 비판했다.[5]

참조

[1] 간행물 Packed (PK) Font File Format https://www.tug.org/[...] 1985
[2] 서적 The METAFONTbook Addison Wesley 1986
[3] 인터뷰 Interview: Donald E. Knuth http://www.advogato.[...] 2000-01-25
[4] 간행물 Questions and Answers with Prof. Donald E. Knuth http://www.tug.org/T[...] CSTUG, Charles University, Prague 1996-03
[5] 웹사이트 Knuth's idea that letters start with skeletal forms is flawed. But his work is important and had lasting impact. https://twitter.com/[...] Twitter 2018-08-18
[6] 간행물 The Concept of a Meta-Font https://s3-us-west-2[...] 1982
[7] 웹사이트 Knuth: Computers and Typesetting http://www-cs-facult[...]
[8] 웹사이트 METAFONT Tutorial http://metafont.tuto[...]
[9] 웹사이트 CTAN: tex-archive/fonts/utilities/metatype1 http://www.ctan.org/[...]
[10] 웹사이트 CTAN: tex-archive/support/mf2pt1 http://www.ctan.org/[...]
[11] 웹사이트 R. J. Kinch, "MetaFog: converting Metafont shapes to contours", TUGboat 16(3), 233–43 (1995) http://www.tug.org/T[...]
[12] 문서 K. Píška, 2004
[13] 문서 mftrace http://lilypond.org/[...]
[14] 문서 TeXtrace http://pts.szit.bme.[...]
[15] 웹인용 METAFONT Tutorial http://metafont.tuto[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com