-
페르시아 쐐기 문자TeX과 친구들 2019. 12. 20. 16:59
고대 페르시아 쐐기 문자를 식자하는 방법을 소개하는 이 글에서 몇 가지 중요한 것들을 배웠다.
\documentclass{article}
\usepackage{fontspec}
\newfontfamily\oldpersianfont[Mapping=latin-to-oldpersian]{Noto Sans Old Persian}
\newcommand\textop[1]{{\oldpersianfont #1}}
\newenvironment{OldPersian}{\oldpersianfont\ignorespaces}{\ignorespacesafterend}
\begin{document}
\textop{𐎭 𐎡 𐎼 𐎹 𐎺}
\textop{da-a-ra-ya-va-ha-u-sha-}
\end{document}일단 쐐기 문자가 포함된 폰트를 구해야 한다. Noto 폰트에 포함되어 있다고 하니 구글을 또 칭송해야겠다. 문제는 입력기이다. 한두 줄이라면 글자 복사가 인내할 만한 방법이겠지만. AncientEgyptianHieroglyphs.otf 폰트처럼 글리프들이 라틴 영역에 할당되어 있으면 편하겠지만 Noto 폰트는 그렇지 않다. 𐎠의 문자 코드는 U+103A0이라고 한다. 정의된 유니코드 영역에 글리프들이 배치되는 것이 올바르다.
해법은 매핑을 이용하는 것이다. A(U+0061)를 𐎠(U+103A0)로 바꾸는 것이다. 그런데 latin-to-oldpersian이란 맵은 존재하지 않는다.
; TECkit mapping for TeX input conventions <-> Unicode characters
LHSName "latin-to-oldpersian"
RHSName "UNICODE"
pass(Unicode)
; ligatures from Knuth's original CMR fonts
U+002D U+002D <> U+2013 ; -- -> en dash
U+002D U+002D U+002D <> U+2014 ; --- -> em dash
U+0027 <> U+2019 ; ' -> right single quote
U+0027 U+0027 <> U+201D ; '' -> right double quote
U+0022 > U+201D ; " -> right double quote
U+0060 <> U+2018 ; ` -> left single quote
U+0060 U+0060 <> U+201C ; `` -> left double quote
U+0021 U+0060 <> U+00A1 ; !` -> inverted exclam
U+003F U+0060 <> U+00BF ; ?` -> inverted question
; additions supported in T1 encoding
U+002C U+002C <> U+201E ; ,, -> DOUBLE LOW-9 QUOTATION MARK
U+003C U+003C <> U+00AB ; << -> LEFT POINTING GUILLEMET
U+003E U+003E <> U+00BB ; >> -> RIGHT POINTING GUILLEMET
;U+0020 > U+0020 ; space maps to space
U+002D > U+200D ; hyphen as Zero Width Joiner
U+002E > U+200D ; dot as Zero Width Joiner
U+007C > U+200C ; pipe as Zero Width Non-Joiner
U+0061 <> U+103A0 ; a 𐎠
U+0069 <> U+103A1 ; i 𐎡
U+0075 <> U+103A2 ; u 𐎢
U+006B U+0061 <> U+103A3 ; ka 𐎣
U+006B U+0075 <> U+103A4 ; ku 𐎤
U+0067 U+0061 <> U+103A5 ; ga 𐎥
U+0067 U+0075 <> U+103A6 ; gu 𐎦
U+0078 U+0061 <> U+103A7 ; xa 𐎧
U+0063 U+0068 U+0061 <> U+103A8 ; cha 𐎨
U+006A U+0061 <> U+103A9 ; ja 𐎩
U+006A U+0069 <> U+103AA ; ji 𐎪
U+0074 U+0061 <> U+103AB ; ta 𐎫
U+0074 U+0075 <> U+103AC ; tu 𐎬
U+0064 U+0061 <> U+103AD ; da 𐎭
U+0064 U+0069 <> U+103AE ; di 𐎮
U+0064 U+0075 <> U+103AF ; du 𐎯
U+0074 U+0068 U+0061 <> U+103B0 ; tha 𐎰
U+0070 U+0061 <> U+103B1 ; pa 𐎱
U+0062 U+0061 <> U+103B2 ; ba 𐎲
U+0066 U+0061 <> U+103B3 ; fa 𐎳
U+006E U+0061 <> U+103B4 ; na 𐎴
U+006E U+0075 <> U+103B5 ; nu 𐎵
U+006D U+0061 <> U+103B6 ; ma 𐎶
U+006D U+0069 <> U+103B7 ; mi 𐎷
U+006D U+0075 <> U+103B8 ; mu 𐎸
U+0079 U+0061 <> U+103B9 ; ya 𐎹
U+0076 U+0061 <> U+103BA ; va 𐎺
U+0076 U+0069 <> U+103BB ; vi 𐎻
U+0072 U+0061 <> U+103BC ; ra 𐎼
U+0072 U+0075 <> U+103BD ; ru 𐎽
U+006C U+0061 <> U+103BE ; la 𐎾
U+0073 U+0061 <> U+103BF ; sa 𐎿
U+007A U+0061 <> U+103C0 ; za 𐏀
U+0073 U+0068 U+0061 <> U+103C1 ; sha 𐏁
U+0073 U+0073 U+0061 <> U+103C2 ; ssa 𐏂
U+0068 U+0061 <> U+103C3 ; ha 𐏃
U+0061 U+0075 U+0072 <> U+103C8 ; aur 𐏈
U+0061 U+0075 U+0072 U+0032 <> U+103C9 ; aur2 𐏉
U+0061 U+0075 U+0072 U+0033 <> U+103CA ; aur3 𐏊
U+0078 U+0078 <> U+103CB ; xx 𐏋
U+0064 U+0061 U+0068 <> U+103CC ; dah 𐏌
U+0064 U+0061 U+0068 U+0032 <> U+103CD ; dah2 𐏍
U+0062 U+0061 U+0067 U+0061 <> U+103CE ; baga 𐏎
U+0062 U+0075 U+0075 <> U+103CF ; buu 𐏏
U+0064 U+0069 U+0076 <> U+103D0 ; div 𐏐
U+0031 <> U+103D1 ; 1 𐏑
U+0032 <> U+103D2 ; 2 𐏒
U+0031 U+0030 <> U+103D3 ; 10 𐏓
U+0032 U+0030 <> U+103D4 ; 20 𐏔
U+0031 U+0030 U+0030 <> U+103D5 ; 100 𐏕이것을 latin-to-oldpersiand.map이란 파일이름으로 저장하고, teckit_compile.exe를 이용하여 컴파일한다.
#>teckit_compile.exe latin-to-oldpersian.map
그러면 latin-to-oldpersian.tec라는 바이너리 파일이 생긴다. 맵 파일이 어디엔가 존재하리라 막연히 생각했지만 컴파일된 것이 사용된다는 건 전혀 알지 못했다. 이 맵의 처음 몇 줄은 tex-text.map과 동일한다.
루비는 stackengine 패키지를 이용하여 구현할 수 있다. 발음 부호를 표현하기 위해서는 별도의 글자 치환이 필요하다. 이를테면 -sha가 -ša로 바뀌어야 한다. expl3의 정규표현식이 그것을 용이하게 한다.
\regex_replace_all:nnN
{ ([sh]){2,2} }
{ s \x{030c} }
\l_xander_oper_tl[]는 찾을 문자들을, ()는 그것이 대체될 것임을, {2,2}는 두 글자가 일치해야 함을 (s 또는 h가 아니라 sh) 의미한다. ()는 생략해도 될 것 같고, {2,2}는 {2}로 써도 될 듯하다. \x는 문자 코드를 가리킨다. 결과적으로 sh가 s ̌ 로 바뀌는데, ̌는 합자 문자여서 앞에 오는 문자와 결합하여 š가 된다.
이집트 상형 문자의 식자도, 그것들의 합자 규칙만 이해한다면, 이와 같은 방식으로 가능할 것이다.
'TeX과 친구들' 카테고리의 다른 글
lwarp (0) 2020.05.13 고대 그리스어 키보드 (0) 2020.01.14 토큰 리스트 (0) 2019.04.04 이단 조판을 위한 세 가지 방법 (0) 2019.01.23 확장하거나 확장하지 않거나 (0) 2018.08.13