ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 페르시아 쐐기 문자
    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

    댓글

Designed by Tistory.