`font` — 폰트 만들고 조사하기

font — 폰트 만들고 조사하기

위젯마다 하나씩 폰트를 지정하다 보면, 여기저기 같은 폰트를 반복해서 쓰게 돼요. font 명령으로 이름 붙은 폰트(named font) 를 만들어 두면, 그 이름을 여러 위젯이 공유하면서 나중에 한 곳만 바꿔도 전부 따라 바뀌어요. 또 실제로 어떤 글꼴이 적용되는지도 조사할 수 있어요.

출처: Tcl/Tk Manual — font

본문

시그니처

font option ?arg ...?

font 명령은 이름 붙은 폰트 정의나 실제 폰트 속성 조사처럼 폰트를 다루는 여러 기능을 제공해요. 첫 인자에 따라 여러 형태로 나뉘며, 현재 지원되는 형태는 다음과 같아요.

font actual font ?-displayof window? ?option? ?--? ?char?
font configure fontname ?option? ?value option value ...?
font create ?fontname? ?option value ...?
font delete fontname ?fontname ...?
font families ?-displayof window?
font measure font ?-displayof window? text
font metrics font ?-displayof window? ?option?
font names

하위 명령

font actual font ?-displayof window? ?option? ?--? ?char?window 디스플레이에서 font를 쓸 때 실제로 얻어지는 속성 정보를 돌려줘요. 플랫폼 제약(폰트 패밀리·포인트 크기의 가용성 등) 때문에 요청한 속성과 실제 속성이 다를 수 있어요. window를 생략하면 메인 창으로 기본 설정돼요. option을 지정하면 그 속성값만, 생략하면 모든 속성과 값의 목록을 돌려줘요. char를 주면 한 문자여야 하고, 반환되는 속성은 그 문자를 렌더링하는 데 실제로 쓰이는 특정 폰트의 것이에요(기본 폰트가 그 문자를 포함하지 않으면 기본과 달라져요). char가 하이픈일 수 있으면, 잘못 옮겨적은 옵션과 구별하도록 --를 앞에 붙여야 해요.

font configure fontname ?option? ?value option value ...?fontname이라는 이름 붙은 폰트의 원하는 속성을 조회하거나 바꿔요. 옵션을 주지 않으면 모든 옵션과 값 목록, 값 없는 옵션 하나는 그 속성값을 돌려줘요. 하나 이상의 옵션-값 쌍을 주면 그 이름 붙은 폰트를 새 값으로 수정해요. 이 경우 그 폰트를 쓰는 모든 위젯이 새 속성으로 다시 그려져요.

참고: Aqua/macOS에서는 시스템 폰트(아래 PLATFORM SPECIFIC FONTS 참고)가 시스템 테마로 구현돼 실제로 바뀌지 않을 수 있어요. 수정 효과를 내려면 font actual로 설정값을 얻고 font create로 수정 가능한 폰트 사본을 합성하세요.

font create ?fontname? ?option value ...? — 새 이름 붙은 폰트를 만들고 그 이름을 돌려줘요. fontname을 생략하면 Tk가 fontx 형태의 새 이름(x는 정수)을 생성해요. 옵션-값 쌍은 원하는 속성을 지정하며 몇 개든 줄 수 있어요.

font delete fontname ?fontname ...? — 지정한 이름 붙은 폰트를 삭제해요. 그 폰트를 쓰는 위젯이 있으면 모든 인스턴스가 해제될 때까지 실제 삭제되지 않아요. 그동안 위젯들은 마지막으로 알려진 값을 계속 표시해요. 삭제된 폰트를 나중에 font create로 다시 만들면 위젯들이 새 폰트로 다시 그려져요.

font families ?-displayof window?window 디스플레이에 존재하는 모든 폰트 패밀리 이름의 대소문자 구분 없는 목록을 돌려줘요. window를 생략하면 메인 창으로 기본 설정돼요.

font measure font ?-displayof window? textwindow에서 fonttext를 표시할 때 차지할 공간을 측정해요. 반환값은 text의 총 폭(픽셀)이며, 필기체 f처럼 과장된 문자가 쓰는 추가 픽셀은 포함하지 않아요. 문자열에 개행이나 탭이 있으면 측정할 때 확장하거나 특별히 처리하지 않아요.

font metrics font ?-displayof window? ?option?window에서 font를 쓸 때의 메트릭(폰트별 데이터) 정보를 돌려줘요. option을 지정하면 그 메트릭 값만, 생략하면 전체 메트릭 목록을 돌려줘요.

font names — 현재 정의된 모든 이름 붙은 폰트의 목록을 돌려줘요.

폰트 설명(FONT DESCRIPTIONS)

위 어디서든 font를 인자로 받는 곳에서 다음 형식을 폰트 설명으로 쓸 수 있어요. 위젯의 -font 옵션을 지정할 때도 같은 형식이 허용돼요.

[1] fontnamefont create로 만든 이름 붙은 폰트의 이름이에요. 위젯이 이름 붙은 폰트를 쓰면, 그 폰트가 존재하는 한 (아무리 잠재적으로 잘못되거나 무의미한 속성 집합이어도) 오류가 나지 않는 게 보장돼요. 이름 붙은 폰트의 속성과 정확히 일치하게 표시할 수 없으면 다른 비슷한 폰트가 자동으로 대체돼요.

[2] systemfont — 그래픽 서버가 해석하는 플랫폼별 폰트 이름이에요. X에서는 이름 중간의 여러 필드를 생략하기 위해 "*" 문자 하나를 쓴 XLFD(아래 [4])도 포함해요.

[3] family ?size? ?style? ?style ...? — 첫 요소가 원하는 폰트 패밀리, 선택적 둘째 요소가 원하는 크기인 목록이에요. 크기 해석은 아래 FONT OPTIONS의 -size와 같은 규칙을 따라요. 크기 뒤의 추가 선택 인자는 폰트 스타일이에요. 가능한 스타일 값: normal, bold, roman, italic, underline, overstrike.

[4] X-font names (XLFD)-foundry-family-weight-slant-setwidth-addstyle-pixel-point-resx-resy-spacing-width-charset-encoding 형태의 Unix 중심 폰트 이름이에요. 신경 쓰지 않는 필드를 건너뛰는 데 "*" 문자를 쓸 수 있어요. 생략한 필드마다 정확히 "*" 하나가 있어야 하고, XLFD 끝의 "*"는 남은 필드를 모두 건너뜁니다(가장 짧은 유효 XLFD는 그냥 "*"로, 모든 필드를 기본값으로 의미해요). 생략한 필드는 기본값으로 채워져요. 호환성을 위해 XLFD는 항상 지정된 픽셀 크기(포인트 아님)의 폰트를 고르는데, 이 해석이 엄밀히 정확하진 않지만 실제로는 대부분의 기존 XLFD 사용 앱이 "포인트"를 곧 "픽셀"로 가정하기 때문에 실제 정확한 크기를 쓰면 (일반적으로 더 크게) 잘못 표시돼요.

[5] option value ?option value ...? — 원하는 폰트 속성을 지정하는 옵션-값 쌍 목록이에요. 이름 붙은 폰트를 정의할 때 쓰는 형식과 같아요(아래 FONT OPTIONS 참고).

폰트 설명 font를 쓰면 시스템은 위 다섯 규칙을 나열된 순서대로 파싱하려 해요. [1]과 [2]는 기존 이름 붙은 폰트나 시스템 폰트의 이름과 일치해야 해요. [3], [4], [5]는 모든 플랫폼에서 받아들여지고 가장 가까운 폰트가 사용돼요. 어떤 경우엔 가까운 폰트를 찾지 못할 수도 있는데(폰트 패밀리가 쓰레기 값인 경우 등), 그땐 시스템 의존 기본 폰트가 선택돼요. 위 패턴 어느 것과도 일치하지 않으면 오류가 생성돼요.

폰트 메트릭(FONT METRICS)

font metrics 명령이 폰트 생성 시 결정된 폰트별 데이터를 조회할 때 쓰는 옵션이에요. 이 속성들은 폰트 전체에 대한 것이지, 그 폰트로 그린 개별 문자가 아니에요. 아래에서 폰트의 "baseline(기준선)"은 대부분 글자의 밑부분이 맞춰지는 가로선을 말하고, 소문자 g 같은 일부 글자는 기준선 아래로 내려가요.

-ascent — 가장 키 큰 글자가 기준선 위로 올라간 픽셀 + 폰트 디자이너가 추가한 여백. -descent — 어떤 글자든 기준선 아래로 내려간 최대 픽셀 + 디자이너 추가 여백. -linespace — 같은 폰트의 두 텍스트 줄을 어떤 줄의 문자가 다른 줄의 문자와 겹치지 않게 배치해야 하는 세로 간격(픽셀)으로, 보통 기준선 위 ascent + 기준선 아래 descent의 합이에요. -fixed — 고정폭 폰트면 "1", 비례 간격 폰트면 "0"을 돌려주는 boolean 플래그예요. 제어·탭 등 비출력 문자의 폭은 이 값을 계산할 때 포함하지 않아요.

폰트 옵션(FONT OPTIONS)

다음 옵션은 모든 플랫폼에서 지원되며, 이름 붙은 폰트를 만들거나 위 스타일 [5]로 폰트를 지정할 때 써요.

-family name — 대소문자 구분 없는 폰트 패밀리 이름이에요. Tk는 Courier(모노스페이스 "타자기" 폰트), Times(세리프 "신문" 폰트), Helvetica(산세리프 "유럽식" 폰트) 패밀리를 지원할 것을 보장해요. 이들 중 하나를 쓰면 가장 비슷한 네이티브 폰트 패밀리가 자동 대체돼요. 플랫폼별 고유 폰트 패밀리 이름도 쓸 수 있는데, 그 플랫폼에서는 원하는 대로 동작하지만 다른 플랫폼에선 제대로 표시되지 않을 수 있어요. 패밀리를 지정하지 않거나 인식하지 못하면 플랫폼별 기본 폰트가 선택돼요.

-size size — 폰트의 원하는 크기예요. size가 양수면 포인트 단위, 음수면 절댓값을 픽셀 단위로 해석해요. 지정한 크기로 표시할 수 없으면 가까운 크기를 골라요. 지정하지 않거나 0이면 플랫폼 의존 기본 크기를 골라요. 크기는 보통 포인트로 지정해야 해요. 그래야 화면 해상도가 바뀌거나 스크립트가 플랫폼을 옮겨도 앱이 같은 화면상 실제 크기를 유지할 수 있어요. 다만 고정 크기 비트맵에 텍스트를 정렬해야 할 때처럼 픽셀 지정이 유용한 경우도 있어요. 포인트와 픽셀의 매핑은 앱 시작 시 설치된 모니터 속성에 따라 정해지며, tk scaling 명령으로 덮어쓸 수 있어요.

-weight weight — 폰트 문자의 명목 두께예요. normal은 보통, bold는 굵게 지정해요. 지정한 값에 가장 가까운 사용 가능한 weight가 선택돼요. 기본은 normal이에요.

-slant slant — 문자가 수직에서 기울어진 정도예요. 유효 값은 romanitalic이에요. roman은 보통 세운 모양, italic은 수직에서 몇 도 기운 모양이에요. 가장 가까운 사용 가능한 slant가 선택돼요. 기본은 roman이에요.

-underline boolean — 이 폰트의 문자에 밑줄을 그을지 지정하는 boolean 플래그예요. 기본값은 false예요.

-overstrike boolean — 이 폰트 문자 중앙에 가로선을 그을지 지정하는 boolean 플래그예요. 기본값은 false예요.

표준 폰트(STANDARD FONTS)

모든 시스템에서 지원되며 적절한 시스템 기본값과 일치하는 값으로 기본 설정된 이름 붙은 폰트들이에요.

  • TkDefaultFont — 달리 지정되지 않은 모든 GUI 항목의 기본 폰트.
  • TkTextFont — entry 위젯, listbox 등의 사용자 텍스트용.
  • TkFixedFont — 표준 고정폭 폰트.
  • TkMenuFont — 메뉴 항목용.
  • TkHeadingFont — 목록·표의 열 제목용.
  • TkCaptionFont — 창·대화상자 캡션 바용.
  • TkSmallCaptionFont — 포함된 창이나 도구 대화상자의 캡션용.
  • TkIconFont — 아이콘 캡션용.
  • TkTooltipFont — 툴팁 창(임시 정보 창)용.

이 폰트들은 시스템 변화에 따라 Tk 자신이 수정할 수 있으므로 직접 바꾸지 않는 게 좋아요. 대신 폰트의 사본을 만들어 그걸 수정하세요.

플랫폼별 폰트(PLATFORM SPECIFIC FONTS)

지원되는 시스템 폰트예요.

X Windowsxlsfonts(1)이 나열하는 것을 포함해 모든 유효한 X 폰트 이름을 쓸 수 있어요.

MS Windows — 다음 폰트가 지원되고 사용자의 스타일 기본값에 매핑돼요.

system
ansi
device
systemfixed
ansifixed
oemfixed

macOS — 다음 폰트가 지원되고 사용자의 스타일 기본값에 매핑돼요.

system
application
menu

추가로 다음 이름 붙은 폰트들이 Aqua 테마 폰트에 접근하게 해 줘요.

systemSystemFont
systemEmphasizedSystemFont
systemSmallSystemFont
systemSmallEmphasizedSystemFont
systemApplicationFont
systemLabelFont
systemViewsFont
systemMenuTitleFont
systemMenuItemFont
systemMenuItemMarkFont
systemMenuItemCmdKeyFont
systemWindowTitleFont
systemPushButtonFont
systemUtilityWindowTitleFont
systemAlertHeaderFont
systemToolbarFont
systemMiniSystemFont
systemDetailSystemFont
systemDetailEmphasizedSystemFont

예제

시스템에 설치된 모든 폰트 패밀리마다 시연 텍스트를 넣어 text 위젯을 채우기.

pack [text .t -wrap none] -fill both -expand 1
set count 0
set tabwidth 0
foreach family [lsort -dictionary [font families]] {
    .t tag configure f[incr count] -font [list $family 10]
    .t insert end ${family}:\t {} \
            "This is a simple sampler\n" f$count
    set w [font measure [.t cget -font] ${family}:]
    if {$w + 5 > $tabwidth} {
        set tabwidth [expr {$w + 5}]
        .t configure -tabs $tabwidth
    }
}

font families로 패밀리 목록을 얻고, 각 패밀리에 태그별 폰트를 지정한 뒤, font measure로 라벨 폭을 재서 탭 간격을 맞추는 흐름이에요.

더 알아보기

options 문서의 -font 항목과 tk scaling 명령을 함께 보세요. 위젯별 폰트 지정 규칙도 options에서 다뤄져요.