ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 토큰 리스트
    TeX과 친구들 2019. 4. 4. 17:39

    tex 파일이든 뭐든 텍스트 파일을 읽어들이는 방식은 텍에게 매한가지일 것이다. KTS 설립 10주년 기념 문집 『TeX 조판, 그 이상의 가능성 』에 실린 남수진, 「TeX 매크로 작성 기법」과 김도현, 「TeX 토큰과 확장: 입력 문자열 처리」에 따르면 텍의 문자열 처리 과정은 다음과 같다.

    입력: 파일을 줄 단위로 읽어 토큰 리스트를 만든다.
    > 전개: 더 이상 할 수 없을 때까지 모든 토큰들을 전개(확장)한다.
    > 실행: \hskip 같은 원시 명령들이 처리하는 일을 말하는 것이겠지 ...
    > 출력: 수평 모드와 수직 모드를 오가며 페이지를 만드는 것을 말하는 것이겠지 ...

    내가 충분히 이해하지 못했던 것은 중복된 공백이 무시되는 따위의 처리가 정확히 언제 이루어지느냐는 것이었다. 이를테면, "A␣␣␣␣␣␣B"-> "A␣B". 텍이 한 라인을 읽는 순간, 즉 토큰 리스트에 들어가는 순간 그렇게 된다. 이제까지 이를 정확히 이해할 필요가 없었다. tsv 파일을 읽는 매크로를 만들면서 이것이 내게 문제로 떠올랐다.

    나는 (아마 다른 많은 사람들도) csv보다 tsv 포맷을 선호한다. 그런데 탭 문자는 공백처럼 간주된다. 따라서 텍이 tsv 라인을 읽어들이는 순간 칼럼 구분이 사라진다. 이 문제는 다음과 같은 방법으로 해결된다. 토큰 리스트가 아니라 스트링으로, 즉 verbatim하게 읽어들이고 탭 문자를 다른 기호 문자로 바꾸는 것이다. 그리고 그 문자를 기준으로 칼럼 내용들을 시퀀스에 담는다.

    \ior_str_map_inline:Nn \l_tsv_ior
    {
        \str_set:Nn \l_tmpa_str { ##1 }
        \regex_replace_all:nnN { \t }{ | } \l_tmpa_str
        \seq_set_split:NnV \l_tmpa_seq { | } \l_tmpa_str
        ...
    }

    토큰 리스트로 라인을 읽어들이려면 \ior_map_inline:Nn

    여기까지는 행복하다. 그런데 tsv에 아래와 같은 텍 매크로가 포함되어 있다면? 

    \ruby{居酒屋}{いざかや}  \t  이자카야  \t  선술집

    \ruby가 이미 스트링으로 바뀌었기 때문에 그대로 출력된다. 그러니 저것을 되살리려면 스트링을 다시 토큰들로 바꿔야 한다. 다행히, 플레인 텍에도 있는지 모르겠지만, expl3에 그렇게 하는 함수가 있다.

    \tl_set_rescan:Nnn \l_tmpa_tl {}{ #1 }

    이 함수의 사용법이 이렇다.

    \documentclass[a4paper]{article}
    \usepackage{xparse}

    \ExplSyntaxOn
    \NewDocumentCommand\tentative{ m }
    {
      \tl_set_rescan:Nnn \l_tmpa_tl
      { 
        \char_set_catcode_space:n {111} 
        \char_set_catcode_letter:N \\ 
        \char_set_catcode_letter:N \% 
      }
      { #1 }
      \tl_use:N \l_tmpa_tl
    }
    \ExplSyntaxOff

    \ begin{document}

    \tentative{I am happy \% to join with you today in what will go down in history \\ 
    as the greatest demonstration for freedom in the history of our nation.}

    \ end{document}

    소문자 'o' (십진수로 111)에 catcode 10을, \\\%에 catcode 11을 부여하고, 나머지는 이미 정해진 대로 한다. 그래서 'today'가 't day'로 바뀌었다.

    'TeX과 친구들' 카테고리의 다른 글

    고대 그리스어 키보드  (0) 2020.01.14
    페르시아 쐐기 문자  (0) 2019.12.20
    이단 조판을 위한 세 가지 방법  (0) 2019.01.23
    확장하거나 확장하지 않거나  (0) 2018.08.13
    블리드와 슬러그  (2) 2018.08.10

    댓글

Designed by Tistory.