言語学(gb4e / tipa / avm)

言語学の論文で LaTeX が本当に必要になるのは、木や発音記号よりもまず 番号 のためです。「(1) を見よ」「(3b) と対照せよ」——例文に振られた番号は本文から何度も参照され、途中に一つ例を挿入すれば以降がすべてずれます。これを手でやるのは不可能なので、言語学者は gb4eexpex といった 番号付き例文とグロスのためのパッケージ に行き着きます。このページはその番号機構を中心に、行間グロス\gll\glt)、IPA(発音記号)tipa と Unicode)、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 が担当します。1 行目に原データ、2 行目に語ごとの注釈を書き、それぞれの行を \\ で閉じると、gb4e が 語を空白で切って対応する語どうしを縦にそろえます。3 行目の自由訳は \glt に渡します(3 行のグロスが要るときは \glll を使います)。ここで気をつけるのは、位置合わせの単位が「空白で区切られた語」であること。原文の 1 語を注釈の 2 語で説明したくなったら、注釈側を this.one のようにピリオドで繋いで 1 語にまとめます——これは Leipzig Glossing Rules の作法でもあり、leipzig パッケージ(TeX Live 同梱)が \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 を 1 行足すことです。\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

直し方はプリアンブルに 2 行、\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 が提出される事故はここから起きます。上の 2 行を足すと \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 ページあります。技術的に面白いのは、expex が 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 は「Manning の avm パッケージと同じ目的に仕えるが、コードは一切共有しない」と明言しています。記法は環境ではなく命令で、\avm{ [ cat & [ head & noun \\ case & nom ] ] } のように、& で属性と値を、\\ で行を区切ります。角括弧・山括弧・丸括弧・波括弧を使い分けると、そのまま対応する括弧が組まれます。マニュアルには Manning の avm からの移行の節がありますので、古い原稿を持っているならそこから読むのが早道です。

IPA(発音記号)をどう入れるか——tipa・Unicode・tipauni の三択

pdfLaTeX なら tipa、XeLaTeX / LuaLaTeX なら Unicode を直接、そしてその中間が tipauni です。tipa(福井玲 作)は \textipa{[tSi:z]} のように ASCII の略記 で IPA を書きます——S が ʃ、T が θ、N が ŋ、@ が ə、P が ʔ。この写像を覚えるのが最初の関門ですが、覚えてしまえば入力は速く、pdfLaTeX だけで完結します。長い転写がいくつも続く箇所は \textipa{...} を並べる代わりに IPA 環境でまとめて囲めます。XeLaTeX や LuaLaTeX を使えるなら、fontspec で IPA を持つフォントを選び、エディタで [tʃiːz] とそのまま打つのが素直です。TeX Live 2024 には Linguistics Pro(linguisticspro)が同梱されていて、これは IPA 記号と声調記号を持つ OpenType 書体なので、追加インストールなしにこの道が使えます。

ところが、この二つには出力の PDF そのものに差が出ます。tipa で組んだ PDF から pdftotext でテキストを抜くと、返ってくるのは [tSi:z]——IPA ではなく、入力に使った略記のほうです。pdffonts で見ると埋め込まれているのは TeX-tipa10 という Type 1 フォントで、エンコーディングは Builtin。つまり PDF の文字レイヤは Unicode ではない ので、読者がコピーしても検索しても IPA としては出てきません。同じ内容を XeLaTeX と Linguistics Pro で組むと、pdftotext[tʃiːz][θɔːt][sɪŋ][ma˥˥] を返します。査読者が音声表記を検索する、著者が PDF から自分のデータを取り出す——そういう場面が想定できるなら、この差は無視できません。

ここに tipauni(作者 निरंजन、v0.7a、2023 年 2 月 13 日、GPL v3+)が入ります。これは TIPA の命令をそのまま使いながら、出力を Unicode 文字にする パッケージです。\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 のページへ。

最後に、このページで扱わなかったものを明示しておきます。化学式・反応式mhchemchemfig)と 趣味・娯楽の組版は、それぞれ別ページの担当です。言語学の側で残る道具としては、covingtonlinguex を選ぶ場合の書き方、langsci-avm の LFG 用の意味論括弧(lfg オプション、XeLaTeX 必須)、そして glossaries による用語集がありますが、いずれも本筋ではありません。この分野で最初に決めるべきは、繰り返しになりますが 例文の番号機構をどれにするか です。gb4e なら \noautomath\crefname の 3 行を最初に書いておく。expex なら \getref の流儀に慣れる。原稿が 100 例を超えてからの乗り換えは、思っているより高くつきます。