毎日もくもく

毎日もくもく

日記,そして備忘録

LuaLaTeX でギリシャ文字小文字の太字ローマン体を出す方法

私は TeX でベクトルを太字ローマン体にしている.
なのでギリシャ文字もそうしたい.
私は数式のために amsmathnewtxmath を使っているので,ギリシャ文字ローマン体太字は例えば

\boldsymbol{\alphaup}

とすれば望みどおりの出力を得ることができる(以下では α をギリシャ文字の一例として使う).
ギリシャ文字末尾に up をつけることでそのギリシャ文字がローマン体になり(newtxmath),\boldsymbol{} でその中身を太字にしている(amsmath).
これで解決......なのだが,もしベクトルを太字イタリック体で表そうってなったときに,上述の方法でギリシャ文字を太字ローマン体にしていると,書き換えづらくなる.
ギリシャ文字の太字イタリック体は普通に

\bm{\alpha}

で出せるが(要 bm),\boldsymbol{\alphaup} から \bm{\alpha} に書き換えるのは非常にややこしい.
なぜならベクトル中のギリシャ文字のコマンドから up を消さないといけないからだ.
なので今回,新たに \lgvec{} というコマンドを作り,\lgvec{\alpha}ギリシャ文字の太字ローマン体を出せるようにした.
また,せっかく LuaLaTeX を使っているので,Lua を使ってみた.
もしかしたらもっと楽な方法があるかもしれないが,まあ Lua を使ってみたかったので良しとする.

以下をプリアンブルに書く.
ちなみに 1 文字ずつしか対応していない(数文字まとめてベクトルにはあまりしない気がする)し,大文字にも対応していない(デフォルトでギリシャ文字大文字ってローマン体っぽい(\varDelta とかでイタリックになる).大文字はそのまま \boldsymbol{} で)

\newcommand*{\greekrm}[1]{\directlua{
gc = [[#1]]
gc_len = string.len(gc)
tex.print(string.sub(gc, 1, gc_len - 1) .. 'up')
}}
\newcommand*{\lgvec}[1]{\boldsymbol{\greekrm{#1}}}

\greekrm{} でその引数 \alpha\alphaup に変更し,それを受け取って \lgvec{} で太字にしている.
\greekrm{}Lua で書いていて,まず引数 #1 を受け取って,そのまま文字列として gc に格納している.
ここで #1[[]] で囲っているのは,Luaエスケープシーケンス(\n\t など)を無視してそのまま格納するためである(例えば \theta を入れたときに \tLua でタブと解釈されると悲惨である).
ただしこうすると gc\alphaとスペースが格納される(Writing Lua in TeX - LuaTeXWiki 参照)ので,次にその文字列の長さを取得して(string.len(gc)),最後に tex.print()gc から最後の文字(つまりスペース)を除いたもの(string.sub(gc, 1, gc_len - 1)) + ローマン体のための upTeX 側,\lgvec{}に渡している.

以上のようにややこしい方法となったし,ラテン文字のときと方法が異なるが,ギリシャ文字の太字ローマン体を出せるようになったし,簡単に太字イタリック体にも変更できるので良い.
ちなみにもっとエレガントな方法があれば教えてほしい.

また Lua については Lua 入門 - 計算数学実習資料集 を参考にした.

f:id:xartaky:20171106000426p:plain