LuaTeXについて2(日本語の扱い)
LuaTeXについて2(日本語の扱い)
前回は所々はしょりつつLuaTeXの特徴をあげてみたが、今回は使ってみる。
この記事を書いているArchLinux上のtexlive2011にはLuaTeX 0.70.1が含まれている。
本家のsvnのtagsには0.70.2があるが、とりあえずこれでいいだろう。
LuaTeXではunicodeが使えるので、日本語はデフォルトで通る。
\documentclass{article}
\usepackage{fontspec}
\setmainfont{IPAGothic}
\begin{document}
てすと Lua\TeX
\end{document}
これで通る。しかしながら、改行してくれない。
LuaTeXは欧文と和文を区別せず(これによりフォントの問題もある)、
両者で改行の方針が違うので結局和文ではうまく改行できないのである。
LuaTeXはこの辺をパッケージレベルで実装する方針らしく、
日本語用のパッケージをどこかで見つけてこないといけない。
とりあえず次の2つがある。
・luajalayout
En toi Pythmeni tes TeXnopoleos [電脳世界の奥底にて] によると、とりあえず使う分にはこれが一番完成度が高いとのこと。luajalayout パッケージ ―LuaLaTeX による日本語組版―にて入手可能。
・LuaTeX-ja
他にもLuaTeX-jaというプロジェクトが進行中らしい。
とりあえず使えるものが最近完成したらしい。今後はこっちに移行するようだ。
さらにLuaTeXではjsarticle等、pTeX用のdocumentclassはそのままでは使えない。
En toi Pythmeni tes TeXnopoleos [電脳世界の奥底にて] にはjsarticleからpTeX用の部分を抜き出したdocumentclassが用意されている。BXjscls パッケージにて入手できる。
これで晴れてLuaTeXで日本語の文章がかける、と思う。
>>3に続く(予定)。
参考にしたHP:
En toi Pythmeni tes TeXnopoleos [電脳世界の奥底にて]
LuaTeX-ja(仮称)プロジェクト wiki
LuaTeXについて1(非常に基本的なこと)
台風で外出できないため、気になっていたことを調べる。
LuaTeXについて(非常に基本的なこと)
以前どこかで、En toi Pythmeni tes TeXnopoleos [電脳世界の奥底にて] で公開されているプレゼンを見てから気になっていたLuaTeXについて調べる。
どうやら日頃何気なく使っているlatexだが、どうも海外では国内より進んでいるらしい。
latexはとりあえず動かせる程度の知識しかなかったので、せっかくなので調べてみる。
まずはいつも使っているplatexコマンドがなんなのか確認する。
Fedora14に入っているのはyumでいれたtexlive2007のpTeX+LaTeX2e、
自宅のArchLinuxではtexlive2011のe-pTeX+LaTeX2eとなっている。
分けて書いた通り、前者はTeXのエンジン、
つまり.texを解釈して.dviなり.pdfを生成するプログラム、
後者はその上で解釈されるマクロの集合を表す。
pTeXというのはオリジナルのTeXの16bitの拡張でこれがあって初めて日本語が扱える。
これはさらに縦組もできる。このp-はPublishingの意味らしい。
もともとエンコーディングとしてsjis,jis,eucが対応していたが、最近utf-8のコードも扱えるようになった。
e-pTeXは所謂e-TeX拡張をpTeXにマージしたもので、どうやらtexlive2011になって標準に取り込まれるようだ(HPによるとまだ未解決のバグが放置とのこと)。
e-TeX拡張は基本的な機能の拡張で、使えるレジスタやプリミティブが増えたり、右から左に書けるようになった。
これだけ聞いても特に面白くないが、最近はこの拡張を必須とするマクロが増えているらしい。
LaTeX2eはTeX上で動くマクロの集合であって、数式の機能などもこのLaTeX2eによるものである。
どうもLaTeX3が開発中らしい。普段使っている機能は基本的にLaTeX2eのものである。
尚、LaTeXの他にもConTeXtというマクロパッケージがあるそうだ。そのうち調べよう。
さて、今回の本題であるLuaTeXに入る前に海外で主流のpdfTeXについて。
pdfTeXはe-TeX拡張をとりこみ、さらに.texから.pdfに.dviを解さず変換することで、いくつか品質が向上している。
このpdfTeXの後継として開発されているのがLuaTeXである。
LuaTeXでは大幅な改良が見込まれる。
・unicodeのサポート
・MetaPost
・Lua interpreterの導入
・フォントに関して
これは面白そう!ということで、これについて調査する。
>>2以降に続く。
参考にしたHP:
アスキー日本語TeX(pTeX)
e-pTeX についての wiki
En toi Pythmeni tes TeXnopoleos [電脳世界の奥底にて]
Headerの依存関係を自動処理
自動化は素晴らしい。適切に構築された自動化スクリプトは単調な作業からの開放を約束し、人為的ミスを事前に防ぐ。
ということでコンパイル時の依存関係の解決の自動化である。
結局は偉大な先人のあしあとをたどるだけなのだが、
http://d.hatena.ne.jp/ritchey/20070519/1179595462
ちょっとそのままでは問題が生じたので変更点をメモ。
上サイトから拝借した、
%.d: %.c
@set -e; $(CC) -MM $(CPPFLAGS) $< \
| sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; \
[ -s $@ ] || rm -f $@
が問題の部分。sedの所が問題で、もしファイル名に/が含まれる場合、それをsedコマンドが間違えて読んでしまうため、"「s」へのオプションが未知です"って怒られる。例えば一つ親のフォルダの.cppが必要なときはファイル名が../some.cppとなり/が含まれてしまう。
解決策1:$*を$(echo $* | sed 's/\//\\\//g')などとして、/を\/に置き換えてやる。こうするとsedは\/を文字の/として認識するのでのぞみの結果が得られる。
これならわざわざlogに残すまでもないことなのだが、その後とあることに気がついた。
解決策2:sedのパターンを区切る文字は「/」以外でも可。
参考HP:http://www.geocities.co.jp/geo_sunisland/filter_sed.html
なので例えば
sed 's%\($*\)\.o[ :]*%\1.o $@ : %g' > $@
とする。こうすれば$*に/が含まれていても問題なく処理できる。
なお、同様のことがvimのコマンドにも使える。つまり
:%s%before%after%g
とできる。これを使えば、基本的に特殊文字をエスケープする必要がなくなる。
使える文字としては、アルファベット[a-zA-Z]は不可能、バックスラッシュ\も不可能。他の文字は可能のようだ。
思っても見なかった知識を得た。
gnuplotで凡例分割
gnuplotについてTips:凡例を分割する方法について。
gnuplotの凡例というのは普通にgnuplotでグラフを出力したとき、右上にでる
"hoge.dat" -
x*sin(x) -
みたいなあれである。
これはgnuplot中ではkeyというキーワードで管理する。例えば左上に出したかったら
set key left
箱で囲みたかったら
set key box
などである。
ここまでわかれば、あとはhelp keyとすれば大概の情報は出てきそうなものだが、本題のこの凡例を分割する方法が見当たらない。なので場当たり的ではあるが、対処法を考えたので載せておく。
例によって大したことはないが、アイディアはmultiplotで複数のグラフを重ねる、というものである。
set xrange [-5:5]
set yrange [-5:5]
set multiplot
multiplot> plot x
multiplot> set key left
multiplot> plot x*x
とすればだいたいわかってもらえるだろう。こんな感じ
rangeを設定しないと面白いことになるので注意が必要である。あと、なんか周囲の枠が太くなっているような気がする。
なんかもっといい方法があるのかな?
Numpyでの行列の扱い2
前回に引き続きNumpyについて。
以下では
A = mat([[1,2,3],[4,5,6],[7,8,9]])
v = mat([1,2,3]).T
とする。
行列要素へのアクセス:
ここは注意が必要。C++のublas::matrix<double>のように
A[i][j]でのアクセスができない。これはちょっと演算子のかたちが変わって、
A[i,j]でアクセスしないといけない。
同じクラスなので当たり前だが、v[i]では要素は取り出せない。
なお、AやvにはメンパにA.A,v.Aが存在し、これはarrayのインスタンスだった。
このメンバに対してはA.A[i][j]のようなアクセスができるので、
array型を想定した関数に投げるときはこれを使うと便利。
Numpyでの行列の扱い
pythonの便利な数学ライブラリ、Numpy。
本家HP:http://numpy.scipy.org/
この中の行列の扱いにはまったのでメモ。
ipython -pylabで起動かもしくは
from numpy import * を想定。
numpyをimportして使うときは適宜読み替えること。
生成法:
A = mat([[1,2,3],[4,5,6],[7,8,9]])
のようにつくる。引数はリストでもタプルでも可。
ベクトルの生成:
v = mat([1,2,3])
で横ベクトルができる。縦ベクトルは
v = mat([[1],[2],[3]])
とすればできるが、
v = mat([1,2,3]).T
のように転置を取るほうが書きやすい。
ベクトルをこのように使うと、行列とベクトルの掛け算
A = mat([[1,2,3],[4,5,6],[7,8,9]])
v = mat([1,2,3]).T
A*v
とかける。
gnuplotでAA出力
ちょっとしたTipsをひとつ。
普段sshを使うとき、-Xオプションは付けないで起動することが多い。エディタは基本的にvimをつかうので端末のみで不便がないから、特に試したこともなかった。
しかし問題が発生。計算結果をプロットしようとし、gnuplotを起動してプロットを使用とするとエラーが。
Xを転送してないので当たり前か、と思いつつ解決法を模索したところ、gnuplotで出力結果をAAで出力できる、ということを思い出し、試してみた。ということでメモ。
大したことはなく、gnuplotで
set terminal dumb
とするだけ。出力結果はこんな感じ。
参考HP:MacWiki - gnuplot