Markdown → LaTeXで単語帳

Posted: 2015-09-16 (Modified: 2019-03-26)

単語帳を作る作業は簡略化したいものの、ラテン文字以外の文字を正確に表示してくれる環境はなかなかないものです。そこでLaTeXの機能で表示を頑張りつつ、単語のリストの作成はMarkdownで簡略化するという方法で作成することにしました。依存するツールが増えるとインストールが大変なので、PandocとTeX Live、そして表示したい言語のフォント以外は準備しなくても大丈夫な方法を考えてみました。以下は中国語、ロシア語、アラビア語の単語で実際に作ってみた例です。

単語帳の例

文法用語の省略記法はList of glossing abbreviationsを使っています。

1. フォントの取得

単語帳を作成したい言語や発音記号で使われている文字を含むフォントを持っているか確認します。Windowsの場合はWin fontsで、Linuxの場合はfc-listコマンドでインストール済みのフォントの一覧が表示されます。

多くの文字を含み、かつ入手しやすいフォントとして以下のようなものがあります。

発音記号用のフォントとしては以下が入手しやすいです。

2. テンプレートの作成

各言語に対応したフォントが自動で割り当てられるようにbabelなどのパッケージの設定を書いたテンプレートを準備しておきます。これをvocabulary.texなどの名前で保存します。

\documentclass[12pt,a4paper]{ltjsarticle}
\usepackage[no-math]{luatexja-fontspec}
\usepackage{babel}
\babelprovide{russian}
% \babelprovide{polutonikogreek}
\ltjsetparameter{%
    jacharrange={%
        -2, % Exclude Greek and Cyrillic letters.
        -3  % Punctuations and Miscellaneous symbols.
    },
    alxspmode={`/,allow}
}
\babelfont[russian]{sf}[Script=Cyrillic]{OpenSans}
\usepackage{arabluatex}
\setmainfont[Ligatures=TeX]{Free Serif}
\setmainjfont[BoldFont={RyuminPro-Regular}]{RyuminPro-Light}
\newjfontfamily\chinesefont{Hiragino Sans GB}
\newfontfamily\phonetic{Doulos SIL}
\newfontfamily\translitfont{Free Serif}
\newfontfamily\arabicfont[%
    Script=Arabic,     % enable ligatures
    RawFeature={%
        +anum,         % use eastern arabic numerals
        +ss05}        % put kasrah below shadda
]{Scheherazade-Bold}
\SetTranslitFont{\translitfont}
\SetTranslitStyle{\upshape}  % \upshape, \itshape
\SetTranslitConvention{dmg}  % dmg, loc, arabica
\newcommand\tightlist{\relax}
\newcommand\ArabicWord[1]{\mbox{\arb[novoc]{#1}} \arb[trans]{#1}}
\newcommand\ChineseWord[1]{\begin{chinesefont}#1\end{chinesefont}}
\newcommand\RussianWord[1]{\foreignlanguage{russian}{\textsf{#1}}}
\pagestyle{empty}
\begin{document}
  $body$
\end{document}

次にPandocの「フィルター」と呼ばれるものを書きます。これを使ってMarkdownからLaTeXに変換する方法を指定し、少しでも入力が楽になるようにします。ここでは頻繁に入力するスモールキャピタルはアンダースコア2つ__で入力できるようにしました。またロシア語アルファベットが使われている部分は、自動でロシア語とマークアップされるようにしました。

function isrussian (s)
  i = utf8.offset(s, 1)
  j = utf8.offset(s, 2) - 1
  uchar = string.sub(s, i, j)
  return uchar >= 'А' and uchar <= 'я'
end

function isphonetic (s)
  return string.sub(s, 1, 1) == '/'
end

function Strong (elem)
  return pandoc.SmallCaps(elem.content)
end

function Str (elem)
  if isrussian(elem.text) then
    return pandoc.RawInline('latex', '\\RussianWord{' .. elem.text .. '}')
  elseif isphonetic(elem.text) then
    return pandoc.RawInline('latex', '{\\phonetic ' .. elem.text .. '}')
  else
    return pandoc.Str(elem.text)
  end
end

3. 単語のリスト作成

Markdown形式で単語のリストを書いていきます。テキストエディタを使い、以下のような単語のリストを作ってwords.mdのような名前で保存します。アラビア文字の入力の仕方は「LaTeXでRTL(右横書き)の文書をつくる」を、発音記号の入力の仕方はHow to type phonetic symbolsをご参照ください。

* \ChineseWord{狐狸} húli /xʷuu˥lʲii/ 狐
* \ChineseWord{春节} chūnjié /ʈʂʰʷən˥tɕee˧˥/ 春節
* \ChineseWord{近日} jìnrì /tɕin˥˩ʐʐʐ˥˩/ このごろ
* убивать /ʊbʲɪˈvatʲ/ __impf__ __[+ acc]__ 殺す
* воздух /ˈvozdʊx/ __m__ 大気
* \ArabicWord{rI.huN} __f__ 風
* \ArabicWord{^samAluN} __m__ 北
    * \ArabicWord{rI.hu 'l-^samAli} 北風
* \ArabicWord{tatajAdalu} (\arb[novoc]{fI} + etw.) bestreiten __3sg f impf__
    ← \ArabicWord{tajadala}

タイプセットする際にLuaLaTeXを使いたいのでlatexmkrcを作ります。

#!/usr/bin/perl
$pdflatex = 'lualatex %O %S';
$bibtex = 'upbibtex %O %B';
$pdf_mode = 1;
$bibtex_use = 2;
$clean_ext .= '%R.bbl %R.ltjruby %R.nav %R.snm %R.vrb';

以下のコマンドを実行して最終的にPDFファイルを得ます。

pandoc --from=markdown --to=latex \
  --template=vocabulary.tex --lua-filter=filter.lua \
  --standalone --output=words.tex words.md
latexmk words.tex