研究で必要な雑多な知識をごった煮で
プロフィール

termoshtt

Author:termoshtt
大学院生
専攻:流体物理学
Editor: vim
Language: C++,python

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--/--/-- --:-- スポンサー広告 TB(-) CM(-)
今回はLuaTeXの機能を使ったパッケージを作成する。

LuaTeX用のパッケージを作るということはLuaが使えるということである。
これはだいぶ喜ばしい事だろう、多分。
というのも、普通のplatex用のパッケージもろくに作った事ないので、
嬉しさがピンとこない。

それはさておき、Luaの機能を使ってパッケージが作れる。
Luaにあって、TeX単体では難しい作業ということで、
今回は.csvファイルから表を作成するパッケージを作る事にする。
\csvToTable{"filename.csv"}と書くと、
filename.csvを読み込んで、tabular環境の表を作ってくれる関数をつくる。
TeX単体でできるとかできないとかは不明。
とりあえず奥村先生の本にはのってない。

Luaには標準のfile ioが備わっているので簡単にできるはずである。
csvをパースするのはLuaの公式HPから拝借する

function fromCSV (s)
-- 公式のHPより拝借
s = s .. ',' -- ending comma
local t = {} -- table to collect fields
local fieldstart = 1
repeat
-- next field is quoted? (start with `"'?)
if string.find(s, '^"', fieldstart) then
local a, c
local i = fieldstart
repeat
-- find closing quote
a, i, c = string.find(s, '"("?)', i+1)
until c ~= '"' -- quote not followed by quote?
if not i then error('unmatched "') end
local f = string.sub(s, fieldstart+1, i-1)
table.insert(t, (string.gsub(f, '""', '"')))
fieldstart = string.find(s, ',', i) + 1
else -- unquoted; find next comma
local nexti = string.find(s, ',', fieldstart)
table.insert(t, string.sub(s, fieldstart, nexti-1))
fieldstart = nexti + 1
end
until fieldstart > string.len(s)
return t
end

これでコンマで区切られたデータを分割できる。
次にファイルを読み込んで各行を上の関数に渡す関数を作る。
file ioに関してはこのあたりが詳しい。

function readCSV(filename)
local f = assert(io.open(filename,'r'))
data = {}
count = 1
while true do
line = f:read("*line")
if line == nil then break end
list = fromCSV(line)
data[count] = list
count = count + 1
end
return data
end

これでファイルを読み込んで、csvをパースする所までできた。
Luaの基本的な機能だけでごくごく簡単な作業だ。

さていよいよパースしたデータから表を作成する

function csvToSimpleTable(filename)
data = readCSV(filename)
-- とりあえず先頭のdataの要素にあわせておく
local len = #data[1]
local tab = '{'
for i = 1,len do
tab = tab .. "r"
end
tab = tab .. '}'
tex.print("\\begin{tabular}" .. tab)
for i,list in ipairs(data) do
local line = ""
for j,val in ipairs(list) do
if line == "" then
line = val
else
line = line .. '&' .. val
end
end
tex.print(line .. '\\\\')
end
tex.print("\\end{tabular}")
end

LuaからTeXの入力を行うにはtex.print(...)を用いる。
Luaでは文字列の合成は..で行うことと、#dataがデータの個数
(pythonでいえばlen(data))になっていること、
LaTeXの文字列をエスケープする必要がある事に注意すれば、
そう変なことはしていない。

これでLuaの方は完成である。
TeXの方は.dtxと.insファイルを作る。
これについては次回まとめる事にする。
特にLuaTeX用に工夫すべき点は、上記の関数の書いてある.luaをどこで読み込むかで、
.dtxの上の方でのように書くといいと思う。

%\directlua{dofile('csvReader.lua')}

あとは普通に

\newcommand\csvToSimpleTable[1]{\directlua{csvToSimpleTable(#1)}}

のように定義すれば使える。

>>4に続く。
2011/12/04 04:55 TeX TB(0) CM(2)
awesomeは便利だ。
しかしその便利さは、自分でカスタマイズできてこそである。

大方デフォルトの設定で問題はないのだが、所々気になることがある。
例えば、Gunuplotを起動する時。
基本的にfloat以外のlayoutを使っているときは、新しくでたGnuplotの図はlayoutに組み込まれる。
この挙動はちょっと気に入らない。
というのも
・図の大きさがwindowとあっていない
・foucsがGnuplotにとられる
一つ目は再描画すればいいし、後者にいたってはMod4-jを1回おせばいいだけだ。
さらにMod4-Ctrl-Spaceでfloatにするという選択肢もある。
とはいえ、この手の細かい挙動は操作性に大きく影響する。

そこで起動と同時にfloatにしたい。
それにはデフォルトでのruleを使うか、Shiftyを用いてもいい。
Shiftyのときは

shifty.config.apps = {
{
match = {"Gnuplot"},
nofocus = true,
float = true,
run = function (c) c.ontop = true end,
}
}

これで起動すると同時にfloatにしてfocusを移さずに、
さらに常に最前面(ontop)にできる。

これでそこそこ使いよいのだが、たまにwindowが邪魔だ。
Gnuplotならすぐ消す場合が多いのだが、windowを動かす方法が欲しい。


そんなに真面目に探してないのだが、見当たらなかったので、練習に作ってみることにした。
movyに行くとzipが落とせるはず。(github初めてなのでまだよくわからない)
中身はclientkeyに登録する用の関数群となっている。
movy.scaleがclientのサイズを変更する関数を提供し、
movy.moveがclientを移動させる関数を提供する。
rc.lua内でrequire("movy")として、clientkeyに登録して使う。

clientkeys = awful.util.table.join(clientkeys,
awful.key({modkey ,"Mod1"}, "s", function (c) movy.scale.rescale(c,1.1) end),
awful.key({modkey ,"Shift", "Mod1"}, "s", function (c) movy.scale.rescale(c,0.9) end),
awful.key({modkey , "Mod1"}, "c", function (c) movy.move.set_place(c,"center") end),
awful.key({modkey , "Mod1"}, "j", function (c) movy.move.down(c) end),
awful.key({modkey , "Mod1"}, "h", movy.move.left),
awful.key({modkey , "Mod1"}, "k", movy.move.up),
awful.key({modkey , "Mod1"}, "l", movy.move.right),
awful.key({modkey ,"Shift", "Mod1"}, "j", function (c) movy.move.move(c,0.0,1.0) end),
awful.key({modkey ,"Shift", "Mod1"}, "k", function (c) movy.move.move(c,0.0,-1.0) end),
awful.key({modkey ,"Shift", "Mod1"}, "l", function (c) movy.move.move(c,1.0,0.0) end),
awful.key({modkey ,"Shift", "Mod1"}, "h", function (c) movy.move.move(c,-1.0,0.0) end)
)

マニュアルはそのうち作ろう。(ちなみにMod1はAlt)
これでfloatになったclientを上下左右、自由に動かせるようになる。

とりあえず動くことは確認したけども、ほとんどテストとかしていないので、使うときは気をつけて。
2011/12/04 02:15 awesome TB(0) CM(0)
先月位からWindowManagerを完全にawesomeに乗り換えた。

いろいろ調べて、だいぶ情報がたまってきたので、ここらで少しまとめることにしよう。

まず情報源:
awesome wiki
公式のwiki。ほとんどここで得た情報をもとに話す。

awesomeとは?
awesomeはKDEのKWinや、GNOMEのcompizに対応するWindow Maneger。
タイル型とよばれるタイプで、ウインドウを画面にモザイク状に敷き詰める用に配置する。
なので、画面を効率的に使用できることが期待される。
デスクトップ環境ではないので、エディタやpdf viewer等のプログラムは別に自分で用意する必要がある。

とまぁ、awesomeの入門や他のタイル型WM(xmonad等)との比較は日本語でもたくさん記事があるので、
そっちを参照してもらうとしよう。

awesomeはCとLuaで書かれていて、カスタマイズもLuaで行う。
Luaは比較的とっつきやすい言語なので、
The Programming Language Lua
当たりをみればすぐにでも書ける。
LuaTeXもLuaな訳で個人的に今あつい言語である。多分。

今回Luaでawesome用のライブラリを作ってみたので次回紹介する。
2011/12/04 00:57 awesome TB(0) CM(0)
検索フォーム
ブロとも申請フォーム
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。