|
|
||||||||||||||||||||||||||||||||||||||||||||||
11月の後半は電通大の 脇さん, 厚木の音声の 亀岡さん @ベイズ勉強会, TTI Chicagoの Livescuさん と, 凄い人が次々とCS研で話してくれました。
一般的に使われているTeXがASCIIの platex になってから後,
platex のデフォルトの文書デザインが悪すぎなのがずっと気になっていた。
具体的には, \sectionや\subsection等のフォントがやたら大きく, また上下に
無意味にスペースが空いてしまう (下の左と中を比較のこと)。
また, 普通に \documentstyle[a4paper] とすると, 下の一番右のようにやたら幅が狭く
なってしまい, \textwidth等をいちいち自分で設定しなければならない。[a4j]を
使うと中のように横幅に関しては改善されるが, フォントの問題は直らない。
学部生の時は大学のデフォルトがNTT JLaTeXで, 家でもEPSONのPC98にDOS Extender版の
NTT-JTeX on MSDOS
を入れて使っていたのですが
*1
, その時はこんなことはなく, 文書のデザインはスマートでとても気に入っていた。
ATRに入った時は, ATRはNTTの兄弟機関なので皆,
(今下の階にいる磯崎さんが開発した)NTT JLaTeXを使っているのかと思ったら全然
そんなことはなく, みんなASCII pLaTeX を使っていたわけですが(w
(CS研でも同じだった), 普段ちょっとした文章を作る時に一々\sectionや\subsection
を再定義するのは嫌なので, 何とかならないかとずっと思っていた。
![]() | ![]() | ![]() |
| NTT JLaTeX | platex a4j | platex a4paper |
ハッと気がついたのですが, NTT JLaTeXのデザインを使うにはスタイルがそうで
あればよく, 別にNTT jlatex自体を入れる必要はない (NTT JTeXはフォント等の
システムが異なっている上, 開発が止まっているので, 今使うのは躊躇がある)。
調べてみると, NTT JTeXの jarticle.cls 等は, JTeXの置いてある千葉大の
ftp://ftp.math.s.chiba-u.ac.jp/tex/
の中の texfam-1.4 にある
texfam-texmf-j2.1.tar.gz
に含まれている模様。
このファイルを展開した後, texmf/tex/jlatex/base を $TEXINPUTS の指定している
適当なディレクトリにコピーして, mktexlsr を実行しておけばこちらが先に使われる。
具体的には, 僕の場合は
% cp -r texmf/tex/jlatex/base ~/share/texmf/inputs/ntt/として, ~/share/texmf/inputs/ で mktexlsr . を実行しておくと, 上の左のように jarticle が何も指定しなくても瀟洒なNTT版のデザインになります。素晴らしい。
"ECL"という名前は学部生の頃から何度か目にしたことはあったものの,
http://www.ecl.ntt.co.jp/ は内部向けのサイトで外からは見れないため
*2
, 何のことか全く分からなかった。
正解はNTTの電気通信研究所(通研)のことで, CS研のドメインの "kecl.ntt.co.jp" とは
「関西ECL」または「京都ECL」のことなのだと思う。ちなみに, eclepsf.sty の中を
見ると磯崎さんの名前が入っていたりして愉快です。
わかりにく杉ですよパパン..。(笑)
class logging {
logging (char *argv[], char *file);
~logging ();
};
のようなクラスを定義しておくと, mainで
#include "log.h"
int main (int argc, char *argv[])
{
while ((c = getopt(argc, argv, opts)) != -1)
何とか..
logging start (argv, model);
学習本体;
}
のようにするだけで, model.log にコンストラクタでargv,起動時刻,ホスト名
*2
などの情報が
書き込まれ, デストラクタで終了時刻が自動的に記録される。以下のような感じ。
init : ./spylm -n 1 -e 1e-8 -a 4 -b 1 -N 2 ../data/genji.txt genji.model host : samurai5.cslab.kecl.ntt.co.jp start : Mon Dec 29 00:06:56 2008 -------- iter[0] char height = 9 iter[0] char height = 9 -------- finish : Mon Dec 29 00:10:39 2008start というのはただの名前ですが, こうやって使うといかにも記録をスタート したかのように見えると思います。
#include <cstdio>
#include <cstdlib>
#include <cstdarg>
#include <unistd.h>
#include <ctime>
static FILE *lp = NULL;
logging::logging (char *argv[], char *file)
{
char *s, hostname[BUFSIZ];
time_t timer;
if ((lp = fopen (strconcat(file, ".log"), "w")) == NULL)
{
perror("fopen");
exit(1);
}
time(&timer);
gethostname(hostname, BUFSIZ);
fprintf(lp, "init :");
while (s = *argv++) fprintf(lp, " %s", s);
fprintf(lp, "\n");
fprintf(lp, "host : %s\n", hostname);
fprintf(lp, "start : %s", ctime(&timer));
fprintf(lp, "--------\n");
fflush(lp);
}
logging::~logging ()
{
time_t timer;
time(&timer);
fprintf(lp, "--------\n");
fprintf(lp, "finish : %s", ctime(&timer));
fclose(lp);
}
void
init_log ()
{
if ((lp = fopen (DEFAULT_LOG_FILE, "w")) == NULL)
{
perror("fopen");
exit(1);
}
}
int
lprintf (const char *fmt, ...)
{
int n;
va_list ap;
if (lp == NULL) init_log ();
va_start(ap, fmt);
n = vfprintf(lp, fmt, ap);
va_end(ap);
fflush(lp);
return n;
}
中で lprintf() という関数を定義してあるので,
これを使うと他の情報もログファイルに自動的に書き込める。
学習の途中で尤度等を記録しておくのによさげです。
もしかするとこういうテクは既に知られているのかも知れないですが,
lprintf()みたいなものを絡めたものは多分ないと思うので, 書いてみました。