언어학(gb4e/tipa/avm)

언어학 논문에서 LaTeX이 정말로 필요해지는 것은 나무나 발음 기호보다 먼저 번호 때문입니다. “(1)을 보라”, “(3b)와 대조하라” — 예문에 붙은 번호는 본문에서 몇 번이고 참조되고, 중간에 예문 하나를 끼워 넣으면 그 뒤가 전부 밀립니다. 이를 손으로 하는 것은 불가능하므로, 언어학자는 gb4eexpex 같은 번호 붙은 예문과 주석을 위한 패키지에 다다릅니다. 이 페이지는 그 번호 기구를 중심에 두고 행간 주석(\gll\glt), IPA 발음 기호(tipa와 유니코드), OT 표(tableau), 그리고 자질 구조를 다룹니다. 아울러 TeX Live 2024에서 실제로 밟은 함정도 적습니다. gb4e는 라벨 이름에 밑줄 하나를 넣은 것만으로 PDF를 내지 않고 죽습니다.

번호 붙은 예문과 하위 예문 — (1)(1a)를 만드는 두 가지 방식

살아 있는 선택지는 사실상 둘, gb4eexpex입니다. gb4eexe 환경 안에 \ex를 늘어놓고, 하위 예문이 필요한 곳에 xlist 환경을 중첩합니다. (1) 아래에 a., b.가 붙고, 참조는 LaTeX 표준의 \label·\ref에 실립니다. expex는 방식이 아주 다릅니다. \pex\xe로 예문을 묶고 하위 예문은 \a를 쓰며, 참조는 LaTeX의 \ref가 아니라 자체 명령 \getref를 씁니다. 어느 쪽을 고를지는 “LaTeX의 참조 기구에 올라타고 싶은가”로 거의 결정됩니다. linguex(v4.3)와 covington(v2.14)도 TeX Live 2024에 들어 있으며, 앞의 것은 \ex.처럼 구두점 같은 짧은 표기로 쓸 수 있는 것이 특징입니다.

패키지TeX Live 2024참조 방식손봐야 할 점
gb4e있음(변경 기록은 2010년에서 멈춤)LaTeX 표준의 \label / \ref밑줄에서 치명적으로 죽음. \noautomath가 필요
expex있음 (v5.1b)자체 \getref / \getfullref / \nextxLaTeX의 \ref는 듣지 않고 \cref도 대상 밖
langsci-gb4e있음(2022-10-21자)gb4e와 동일Language Science Press가 관리하는 gb4e 개정판
linguex있음 (v4.3)LaTeX 표준\ex.처럼 구두점 같은 짧은 표기
covington있음 (v2.14)LaTeX 표준예문·주석·기호를 모아 둔 오래된 도구 상자
avm없음Manning의 avm.sty는 포함되지 않음. langsci-avm을 사용

gb4e로 행간 주석 조판 — \gll\glt

행간 주석의 본질은 낱말 단위의 세로 정렬이고, 그 일을 \gll이 맡습니다. 첫 줄에 원자료를, 둘째 줄에 낱말별 주석을 쓰고 각 줄을 \\로 닫으면, gb4e가 두 줄을 공백으로 쪼개어 대응하는 낱말끼리 세로로 맞춥니다. 자유 번역은 셋째 줄의 \glt에 넘깁니다(세 줄짜리 정렬이 필요하면 \glll을 씁니다). 여기서 조심할 것은 정렬의 단위가 “공백으로 구분된 낱말”이라는 점입니다. 원문 한 낱말을 주석 두 낱말로 설명하고 싶다면 마침표로 이어 this.one처럼 한 토큰으로 묶습니다. 이는 라이프치히 주석 규칙의 방식이기도 하며, TeX Live에 함께 들어 있는 leipzig 패키지가 \Erg, \Pfv 같은 표준 약호를 정의해 줍니다. 비문법성 표시는 \ex[*]{...}처럼 대괄호로 넘깁니다. 예문이 하나뿐이라면 exe 환경을 세우지 않고 \ea\z로 감싸는 짧은 표기도 있습니다.

latex
\documentclass{article}
\usepackage{gb4e}
\noautomath          % see the next section: this line prevents a fatal error
\begin{document}

\begin{exe}
  \ex \label{ex:one}
  \gll Kore wa rei desu.\\
       this TOP example COP\\
  \glt `This is an example.'
  \begin{xlist}
    \ex \label{ex:sub} A sub-example, printed with the label a.
  \end{xlist}
  \ex[*]{ Sleep colorless green ideas furiously. }
\end{exe}

See (\ref{ex:one}) and (\ref{ex:sub}).
\end{document}

gb4e가 ! TeX capacity exceeded, sorry [parameter stack size=20000].로 죽을 때

원인은 밑줄이고, 해결책은 \usepackage{gb4e} 바로 뒤에 \noautomath 한 줄을 더하는 것입니다. \label{ex_one}이라고 쓴 것만으로 TeX Live 2024의 pdfLaTeX은 이렇게 넘어집니다. ! TeX capacity exceeded, sorry [parameter stack size=20000].에 이어 트레이스백에 \gb@ifnextchar가 나타나고 ==> Fatal error occurred, no output PDF file produced!로 끝납니다. PDF는 1바이트도 나오지 않습니다. 같은 일이 \cite{smith_2020}에서도 일어납니다. 저자와 연도를 밑줄로 잇는 것은 지극히 평범한 BibTeX 키 표기이므로, 참고문헌을 더하는 순간 문서가 망가지게 됩니다. \noautomath를 넣으면 둘 다 통과합니다.

왜 그런지는 gb4e 자신의 소스에 적혀 있습니다. gb4e는 _^를 활성 문자로 만들어 본문에서도 아래 첨자·위 첨자를 쓸 수 있게 합니다. 효과는 실제로 극적이어서, gb4e를 불러오면 본문에 NP_i, t_j, X^0을 그대로 쓸 수 있습니다. gb4e 없이 같은 것을 쓰면 ! Missing $ inserted.가 납니다. 통사론 논문에서 첨자 붙은 범주명을 수백 번 쓴다는 것을 생각하면, 이는 충분히 고마운 기능입니다. 그 대가가 _를 “TeX 본래의 뜻”으로 쓰는 다른 매크로와 정면으로 충돌하는 것입니다. 소스의 주석도 그대로 말합니다. 이 파일은 _^를 본문에서 쓸 수 있게 하므로, 그것들을 TeX 본래의 뜻으로 쓰는 파일 뒤에 불러와야 하며, \noautomath로 끌 수 있다고 안내합니다. “gb4e는 프리앰블 맨 마지막에”라는 익숙한 조언의 알맹이가 바로 이것입니다.

\cref?? 1이 되는 문제 — cref reference format for label type 'xnumi' undefined

해결책은 프리앰블에 두 줄, \crefname{xnumi}{example}{examples}\crefname{xnumii}{example}{examples}입니다. gb4e와 cleveref를 함께 불러오면 컴파일 자체는 오류를 하나도 내지 않고 성공하지만, \cref{ex:one}의 출력은 ?? 1이 됩니다. .aux를 들여다보면 \newlabel{ex:one@cref}{{[xnumi][1][]1}...}가 있고, 로그에는 LaTeX Warning: cref reference format for label type 'xnumi' undefined가 남습니다. cleveref는 카운터 종류마다 부르는 이름을 갖고 있지만 gb4e의 예문 카운터 xnumi(하위 예문은 xnumii)는 모르므로 이름 자리에 ??를 넣어 버립니다. 오류가 아니라 경고이므로 빌드가 통과해 버린다는 점이 이 문제의 고약한 대목이고, ?? 1을 200개 안은 PDF가 제출되는 사고가 여기서 생깁니다. 위의 두 줄을 더하면 \cref{ex:one}example 1, \cref{ex:sub}example 1a로 나옵니다.

한편, 흔히 함께 거론되는 hyperref와의 충돌은 TeX Live 2024에서는 재현되지 않았습니다. \usepackage{hyperref}를 gb4e 앞에 두든 뒤에 두든, \gll이 든 예문은 오류 없이 조판되고 \ref(1)을 정확히 돌려줍니다. 인터넷의 “gb4e와 hyperref는 함께 쓸 수 없다”는 기술은 적어도 동봉판 조합에서는 오래된 정보로 보아도 좋겠습니다. 다만 불러오는 순서의 원칙 자체는 여전히 유효합니다. \noautomath를 쓰지 않는다면 _를 쓰는 다른 패키지보다 뒤에 gb4e를 두세요.

latex
\documentclass{article}
\usepackage{gb4e}
\usepackage{cleveref}
% Without these two lines \cref prints "?? 1" and the run still succeeds:
%   LaTeX Warning: cref reference format for label type `xnumi' undefined
\crefname{xnumi}{example}{examples}    % top-level examples: (1), (2), ...
\crefname{xnumii}{example}{examples}   % sub-examples: (1a), (1b), ...
\begin{document}
\begin{exe}
  \ex \label{ex:one} A top-level example.
  \begin{xlist}
    \ex \label{ex:sub} A sub-example.
  \end{xlist}
\end{exe}
See \cref{ex:one} and \cref{ex:sub}.   % -> "example 1 and example 1a"
\end{document}

expex의 참조 기구 — \getref, \getfullref, \nextx

expex에서는 라벨을 \label이 아니라 꺾쇠괄호로 예문 바로 뒤에 씁니다. \pex<top>, 하위 예문이면 \a<one>입니다. 참조는 \getref{top}으로 1을, 하위 예문은 부모를 앞에 붙여 \getref{top.one}으로 a를, 그리고 \getfullref{top.two}1b라는 상위 번호와 하위 기호를 합친 형태를 돌려줍니다. 전방 참조용으로 \nextx(다음 예문의 번호)와 \lastx(직전 예문의 번호)도 있어 “아래 (1)을 보라”를 숫자를 적지 않고 쓸 수 있습니다. 참조가 풀리지 않을 때는 출력에 [one]처럼 대괄호가 붙어 인쇄되고 로그에 ====> EXPEX WARNING: tag one is called but not defined.가 나옵니다. 정의되지 않은 참조를 조용히 통과시키지 않는다는 점에서 cleveref 조합보다 안전합니다.

latex
\documentclass{article}
\usepackage{expex}     % lives in tex/generic: works under plain TeX too
\begin{document}
Consider (\nextx).     % forward reference to the example below

\pex<top>
  \a<one> \begingl
    \gla Kore wa rei desu.//
    \glb this TOP example COP//
    \glft `This is an example.'//
  \endgl
  \a<two> A second sub-example.
\xe

% \getref{top} -> 1   \getref{top.one} -> a   \getfullref{top.two} -> 1b
See (\getref{top}), (\getref{top.one}) and (\getfullref{top.two}).
\end{document}

expex를 쓴 사람은 노스이스턴 대학의 존 프램프턴이고, README의 저작권 표시는 2006–2017년, 동봉판은 v5.1b, 사용자 안내서는 82쪽에 이릅니다. 기술적으로 흥미로운 것은 놓인 자리입니다. tex/generic/expex/에 있습니다. 곧 LaTeX 전용이 아니라 plain TeX에서도 동작하는 매크로 모음이고, expex.sty는 얇은 LaTeX 포장에 지나지 않습니다. 주석 표기도 gb4e와 달라서, \begingl\endgl 안에 \gla(원자료), \glb(낱말별 주석), \glft(자유 번역)를 늘어놓고 각 줄을 //로 닫습니다(\\가 아닙니다). 이 //가 expex를 처음 만지는 사람이 가장 먼저 틀리는 곳입니다.

Language Science Press의 도구 모음 — langsci-gb4e와 langsci-avm

지금 언어학 LaTeX 생태계에서 가장 활발히 갱신되는 구석은 오픈액세스 언어학 전문 출판사 Language Science Press가 내는 패키지 묶음입니다. langsci-gb4e.sty(2022-10-21자)는 gb4e를 손본 판으로, cglossjambox의 기능도 흡수했습니다. 파일은 tex/xelatex/langsci/에 놓여 있지만 kpsewhich는 엔진을 가리지 않고 찾아내고, 실제로 pdfLaTeX에서도 XeLaTeX에서도 오류 없이 통과합니다. 같은 디렉터리에는 langscibook.cls——출판사가 자사 책을 조판하는 데 쓰는 실물 클래스——도 들어 있습니다. 책을 무료로 공개하는 출판사가 그 책을 만드는 조판 클래스까지 CTAN에 올려 둔 것이어서, 저자는 출판사와 같은 PDF를 자기 컴퓨터에서 만들 수 있습니다.

자질 구조(속성-값 행렬)에 관해서는, 오래된 해설이 이름을 대는 Chris Manning의 avm은 TeX Live 2024에 들어 있지 않습니다. \usepackage{avm}이라고 쓰면 ! LaTeX Error: File 'avm.sty' not found.로 멈춥니다. 대신 쓰는 것이 langsci-avm(Felix Kopecky, v0.3.0, 2023년 2월 21일)이고, README는 “Christopher Manning의 avm 패키지와 같은 목적에 봉사하지만 코드는 전혀 공유하지 않는다”고 분명히 밝힙니다. 표기는 환경이 아니라 명령으로, \avm{ [ cat & [ head & noun \\ case & nom ] ] }처럼 &로 속성과 값을, \\로 행을 나눕니다. 대괄호·꺾쇠괄호·소괄호·중괄호를 가려 쓰면 그대로 대응하는 괄호가 조판됩니다. 매뉴얼에는 Manning의 avm에서 옮겨 오는 절이 있으니, 옛 원고를 가지고 있다면 거기서부터 읽는 것이 지름길입니다.

IPA 발음 기호를 어떻게 넣을까 — tipa·유니코드·tipauni의 세 갈래

pdfLaTeX이면 tipa, XeLaTeX·LuaLaTeX이면 유니코드를 직접, 그리고 그 중간이 tipauni입니다. tipa(후쿠이 레이 제작)는 \textipa{[tSi:z]}처럼 아스키 약기로 IPA를 씁니다. S가 ʃ, T가 θ, N이 ŋ, @가 ə, P가 ʔ입니다. 이 대응을 외우는 것이 첫 관문이지만, 외우고 나면 입력이 빠르고 pdfLaTeX만으로 끝납니다. 전사가 여럿 잇달아 나오는 곳은 \textipa{...}를 되풀이하는 대신 IPA 환경으로 한꺼번에 감쌀 수 있습니다. XeLaTeX이나 LuaLaTeX을 쓸 수 있다면, fontspec으로 IPA를 갖춘 글꼴을 고르고 편집기에서 [tʃiːz]를 그대로 치는 편이 자연스럽습니다. TeX Live 2024에는 Linguistics Pro(linguisticspro)가 들어 있는데, IPA 기호와 성조 기호를 갖춘 오픈타입 서체이므로 추가 설치 없이 이 길을 쓸 수 있습니다.

그런데 이 두 갈래는 나오는 PDF 자체가 다릅니다. tipa로 조판한 PDF에서 pdftotext로 텍스트를 뽑으면 돌아오는 것은 [tSi:z]입니다. IPA가 아니라 입력에 쓴 약기 쪽입니다. pdffonts로 보면 묻힌 글꼴은 TeX-tipa10이라는 Type 1 서체이고 인코딩은 Builtin입니다. 곧 PDF의 문자 층이 유니코드가 아니므로, 독자가 복사하거나 검색해도 IPA로는 나오지 않습니다. 같은 내용을 XeLaTeX과 Linguistics Pro로 조판하면 pdftotext[tʃiːz], [θɔːt], [sɪŋ], [ma˥˥]를 돌려줍니다. 심사자가 음성 표기를 검색하는 상황, 저자가 PDF에서 자기 자료를 다시 꺼내는 상황을 상상할 수 있다면 이 차이는 무시할 수 없습니다.

여기에 tipauni가 들어옵니다(작성자 निरंजन, v0.7a, 2023년 2월 13일, GPL v3+). TIPA 명령을 그대로 쓰면서 출력을 유니코드 문자로 바꿔 주는 패키지입니다. 문서의 \usepackage{tipa}\usepackage{tipauni}로 바꾸고 LuaLaTeX으로 조판한 뒤 pdftotext에 걸었더니 [tʃiːz], [θɔːt], [sɪŋ]이 돌아왔습니다. 곧 20년치 \textipa{...}를 고쳐 쓰지 않고도 검색 가능한 PDF로 옮겨 갈 수 있습니다. 함께 들어 있는 예제 문서는 Charis SIL을 전제하지만, 그 서체가 없는 환경에서도 New Computer Modern으로 대체되어 동작했습니다. tipa의 형제로 모음 사각도를 그리는 vowel(\putcvowel)도 같은 묶음에 있고, 음운 규칙을 조판하는 phonrule도 TeX Live 2024에 있습니다.

latex
% Three routes to IPA, and what pdftotext gets back from each PDF.

% 1. pdfLaTeX + tipa -> text layer is the shorthand, not IPA: "[tSi:z]"
\usepackage{tipa}
\textipa{[tSi:z]}   \textipa{[TO:t]}   \textipa{[sIN]}

% 2. LuaLaTeX + tipauni -> same commands, Unicode output: "[tSiz]" becomes IPA
\usepackage{tipauni}
\textipa{[tSi:z]}

% 3. XeLaTeX/LuaLaTeX + fontspec -> type the IPA directly
\usepackage{fontspec}
\setmainfont{LinguisticsPro-Regular.otf}[
  Path = /usr/local/texlive/2024/texmf-dist/fonts/opentype/public/linguisticspro/]
% then simply: [tʃiːz] [θɔːt] [sɪŋ] [ma˥˥]
입력엔진pdftotext가 돌려주는 것
tipapdfLaTeX[tSi:z] — 약기 그대로. 묻힌 글꼴은 TeX-tipa10
tipauniLuaLaTeX / XeLaTeX[tʃiːz] — 명령은 tipa와 그대로 동일
fontspecXeLaTeX / LuaLaTeX[tʃiːz]˥˥ 같은 성조 문자까지 그대로

최적성 이론의 tableau — ot-tableau*!의 자리

OT의 tableau는 ot-tableau 패키지가 제공하며 명령 셋만 있으면 됩니다. 입력, 제약, 후보입니다. \inp{/pat/}가 입력형을 주고, \const{NoCoda}를 늘어놓아 제약을 왼쪽부터 배치하며, 후보는 \cand{pa}{}{*}{}처럼 후보형과 각 제약에 대한 위반을 나열해 씁니다. 최적 후보에는 \cand[\Optimal]{...}로 표시하면 손가락 기호가 붙습니다. 치명적 위반은 *!라고 쓰면 그대로 인쇄됩니다. 여기서 중요한 것은 제약의 순위가 곧 \const를 쓴 순서라는 점입니다. 순위를 바꿔 보는 실험을 할 때 열을 손으로 옮길 필요 없이 \const 줄만 재배열하면 됩니다. TeX Live 2024 동봉판으로 tableau 환경은 오류 없이 조판되었습니다.

latex
\usepackage{ot-tableau}
...
\begin{tableau}{c|c|c}
  \inp{/pat/}
  \const{NoCoda}\const{Max}\const{Dep}
  \cand[\Optimal]{pa}{}{*}{}
  \cand{pat}{*!}{}{}
  \cand{pati}{}{}{*!}
\end{tableau}

구문 트리를 그리려면 — forest는 qtree의 점 표기를 조용히 오해합니다

구문 트리는 별도의 페이지(“트리 구조(forest / qtree)”)가 주인이므로, 여기서는 이전할 때만 무는 한 가지만 적습니다. qtreetikz-qtree\Tree [.S [.NP ] [.VP ] ]처럼 노드 이름 앞에 마침표를 찍지만, forest의 표기는 [S [NP] [VP]]이고 마침표를 쓰지 않습니다. 그런데 forest에 qtree의 표기를 넘겨도 오류가 나지 않습니다. [.S [.NP Kim ]].S라는 이름의 노드로 순순히 조판됩니다. 트리 모양은 맞는데 노드 이름 앞에 점이 붙은 이상한 그림이 나온다면 이것을 의심하세요. 자세한 비교와 forest의 자동 정렬은 related의 페이지로 가세요.

끝으로 이 페이지가 일부러 다루지 않은 것을 밝혀 둡니다. 화학식과 반응식(mhchem, chemfig)과 취미·오락 조판은 각각 별도의 페이지가 담당합니다. 언어학 쪽에서 남겨 둔 도구로는 covingtonlinguex를 고를 경우의 표기법, langsci-avm의 LFG용 의미 괄호(lfg 옵션, XeLaTeX 필수), 그리고 glossaries를 이용한 용어집이 있지만 어느 것도 본줄기는 아닙니다. 이 분야에서 가장 먼저 정할 것은 거듭 말하지만 예문 번호 기구를 무엇으로 할 것인가입니다. gb4e라면 \noautomath\crefname 세 줄을 맨 처음에 써 둡니다. expex라면 \getref 방식에 익숙해집니다. 원고가 예문 100개를 넘긴 뒤에 갈아타는 것은 생각보다 비쌉니다.