日本語と英語の混じった文書を書いているといちいち日本語のフォントを指定しないといけないのか。いっそ全部日本語にしてしまおうと思うと、イタリックなどが指定できなくなる。面倒くさいなあ。それに、日本語の部分の改行が全然できないじゃないか。と思ったら、その解決方法があったので、
TeX Wikiに書いてあるとおりに、
\XeTeXlinebreaklocale "ja_JP"と書き込んで、戻すときには、
\XeTeXlinebreakskip=0em plus 0.1em minus 0.01em
\XeTeXlinebreakpenalty=0
\XeTeXlinebreaklocale ""としたら一定幅で改行されるようにはなった。でも、面倒くさいんですけど。
MacOSXにXeTeXをインストールしてみた。TeXでUTF8が簡単に使えるというから。参考にしたのは、XeLaTeXを利用したプレゼンテーションなど。インストールはMacTeXをダウンロードしてきて、ダブルクリックするだけ。簡単である。
コマンドラインでも操作できるように、/usr/texbinにパスを通す。そして、
xelatex --output-driver="xdvipdfmx -q -E" foo.texこんなふうにすればいいらしい。
TeXShopで使うためには、~/Library/TeXShop/Engines/XeLaTeX.engineを開いて、
set path= ($path /usr/texbin /usr/local/bin)
xelatex "$1"
この行を
xelatex --output-driver="xdvipdfmx -q -E" "$1"
とした。
日本語フォントは、
\def\minc{\fontspec[Scale=0.95]{HiraMinPro-W3}} \def\bmin{\fontspec[Scale=0.95]{HiraMinPro-W6}} \def\bgoth{\fontspec[Scale=0.96]{HiraKakuPro-W6}} \def\goth{\fontspec[Scale=0.96]{HiraKakuPro-W3}} \def\mgoth{\fontspec[Scale=0.95]{HiraMaruPro-W4}}こんなふうに指定した。
上記サイトで「fontspecのオプション cm-default は半角英数字として使うフォントをCM系にすることを意味しています」と書いてあったけれども、cm-defaultというオプションはエラーを発生させたのでやめた。
いろいろなフォントを使わないなら、TeXShopのXeLaTeXのTemplateにあるように、
\newfontfamily{\J}[Scale=0.85]{HiraMinPro-W3}だけでも大丈夫だった。
ほかは概ねこのtemplateの設定を利用してみた。そうして、
Großer Tag, große Worte: US-Präsident Bush betonte bei seinem Israel-Besuch zum 60. Jahrestag der Staatsgründung die Partnerschaft zwischen Washington und Jerusalem. Irans Präsident Ahmadinedschad war weniger freundlich. \\[1cm]と書いてコンパイルしてみると、下のようになった。
\J 日本語では、森鷗外と内田百閒が摑んだり冒瀆したりできる。
ウムラウトなどがそのまま入力していいとか、eucやShift-JISで使えず不愉快な思いをしていた漢字も何も考えずに書いても大丈夫だ。
以上は職場のMac-miniを使って。夜帰宅してから自宅のPowerMac G5を調べてみたら、半年くらい前から、これができる状態になっていたようだ。前にできたことを忘れてしまったのか、UTF8が簡単に使えることに気づいていなかったのか。どちらにしても間抜けである。
ubuntuを8.04にアップデート。アップデートマネージャでクリックするだけ。各種設定を問われたときは、すべて「そのまま」を選ぶ。再起動するとまったく問題なく起動できた。初めての経験かも知れない。Firefoxが3beta5になってGoogle Toolbarが使えなくなってしまったこと以外に今のところ不便は感じていない。
また青空文庫について。ブラウザ上でpdfに変換して縦書き表示するというのを考えてみた。まあ、この青空文庫ビューアはいろいろな人がいろいろなものを作っているので、あえて私が新しいものを考案する意味はほとんどないのだが。
<head>
<title>青空文庫縦書き表示</title>
</head>
<body>
<?php
$url = $_POST['url'];
if(empty($url)){
echo "<h3>青空文庫を縦書きで読む</h3>\n";
echo "<form method='post' action='index.php'>\n
<p>URL: <input type='text' name='url' size='50' /><br />\n
<input type='submit' value='送信' /></p>\n
</form>\n";
}else{
$fcont = file_get_contents($url);
exec("rm -rf ./tmp/output.*");
include("./tategaki.php");
echo "<iframe
src ='./tmp/output.pdf'
width='600' height='800'>
</iframe>";
echo "<p><a href='./index.php'>戻る</a>";
}
?>
</body>
</html>
includeで数日前に作った縦書き変換スクリプトをちょっと描き換えて取り込む。pdfはiframeにしてhtml画面に埋め込んでいる。大きさは600 x 800ピクセルで。毎回ファイルが溜まると嫌なので、新しいアクセスがあると前回のファイルを除去するようにしている。操作はtmpというディレクトリ下で行ない、output.pdfというファイルが作られる。pdf生成の部分は前とほとんど変わらないので、改めて示さない。変更点はファイルはPOSTで送られてきたurlを開くというところと、最後にadobe readerなどでpdfを開かないというようなところだけ。実際のこれを動かすサイトを設置してみた。青空文庫を縦書きで読むだが、ファイル容量の制限とか、簡単なurlの確認とかをしている。わざわざこれで読む人はいないだろうけど。使う人のブラウザに何らかのpdfプラグインがインストールされていないとiframeに表示されないのは当然のことである。面倒臭いので、その説明はしていない。うまくいくと下のような画面が表示される。
章の間などは、もっと間隔を空けた方がいいと思う。太字の設定が消えてしまうが(この例にはもともとないが)、反映できるようにした方がいいだろう。でも、そんなことをする元気は、多分ない。

ふと思いついたときに気軽に調べられるPythonの本はないかと思っていたのだが、なかなか便利なものを見つけた。この頃は毎日この本を机の上において、一日に1200回ほどページを開いている(本当は12回くらい)。文庫本サイズで机の抽斗に入れておいても邪魔にならない。
大体は何をしたらいいのか解っているけれども、細かい書き方を忘れてしまった(あるいはまだ頭に入っていない)とき、ちょっと例文をいくつか見れば解決するということは多い。そんなときに役に立つ。しかし、込み入った説明だとちょっと解らない。それは私の能力の問題なのだが。Pythonの能力ではなく、ドイツ語力の問題である。この本はドイツ語なのだ。
先日mod_pythonを導入したのに、それを有効にしたディレクトリでMySQLとPythonが連携できないと書いたのだが、その原因が判ったような気がする。単なる私の勘違いだった。MySQLのデータを抜きだして表示させるだけなのに、エラーの表示にtime.pyがどうとか表示されるのだった。時間なんか調べていないのに。
よくよく調べてみると、mod_pythonの動作確認に作った時刻表示画面作成スクリプトtime.pyがいけなかったのだ。この名前で保存すると同じディレクトリで動かそうとするMySQLを利用したpythonスクリプトにモジュールとして読み込まれてしまってエラーが生じるようなのだ。よく理解できていないから書き方が変かも知れないけれど、こいつの名前をclock.pyと変えたらエラーが出なくなった。もちろん、今までと同様に時刻表示ページは生成できる。なんだ、そんなことだったのか。勘違いして、SQLite3を導入してしまったではないか。SQLite3に少し馴染んだからいいんだけど。
行頭の空白(2バイト)が削除できなかったのだが、
$txt = mb_ereg_replace("\n ","\n",$txt);
としたら、消えた。これも試したような気がしたんだけどな。とにかく、これでできあがったpdfの段落の頭が二文字下がることはなくなった。昨日の青空文庫のxhtmlファイルをpdfに変換するスクリプトのMacOSX版である。必要ないのだが、別の用事でMacでもLaTeXを動かしたくなり、いろいろやっているうちにいつの間にか使えるようになったので、ついでに青空文庫変換スクリプトも使えるようにしてみた。しかし、どうしてLaTeXのコンパイル時のエラーがなくなったのかよく解らない。TeX Tools for miとかJIS X0212 for pTeXなど見ながらいろいろインストールしていたらいつの間にか動いていたのである。まあ、動いたからいいやといつものように投遣りな態度である。
さて、変換スクリプトは以下のようにした。
#!/usr/bin/php
<?php
$fname = $argv[1];
$output = $argv[2];
if (empty($output)){
$output = "output";
}
$fcont = file_get_contents($fname);
$fenc = mb_detect_encoding($fcont);
$fcont = mb_convert_encoding($fcont,"UTF-8",$fenc);
$fcont = ereg_replace("\x0D\x0A|\x0A|\x0D","\n",$fcont);
$fcont = ereg_replace("\n","\n\n",$fcont);
$fcont = ereg_replace("\t","",$fcont);
$fcont = ereg_replace("<br >","<br />",$fcont);
$fcont = ereg_replace("<br /><br />","<br />\n<br />",$fcont);
$fcont = ereg_replace("\n ","\n",$fcont);
$fcont = ereg_replace("<ruby><rb>","\\ruby{",$fcont);
$fcont = ereg_replace("</rp><rt>","}{",$fcont);
$fcont = ereg_replace("</rt><rp>","}",$fcont);
$fcont = ereg_replace("(}","}",$fcont);
$fcont = ereg_replace("})","}",$fcont);
$fcont = preg_replace("/<title>.+?<\/title>/","",$fcont);
$ttl0 = strpos($fcont,"<h1 class=\"title\">");
$ttl1 = strpos($fcont,"</h1>",$ttl0);
$title = strip_tags(substr($fcont,$ttl0,$ttl1-$ttl0));
$au0 = strpos($fcont,"<h2 class=\"author\">");
$au1 = strpos($fcont,"</h2>",$au0);
$author = strip_tags(substr($fcont,$au0,$au1-$au0));
$fcont = preg_replace("/<title>.+?<\/title>/","",$fcont);
$fcont = preg_replace("/<h1 class=\"title\">.+?<\/h1>/","",$fcont);
$fcont = preg_replace("/<h2 class=\"author\">.+?<\/h2>/","",$fcont);
$fcont = strip_tags($fcont);
$txt = "\documentclass[a5j]{tarticle}\n";
$txt .= "\usepackage{okumacro}\n";
$txt .= "\begin{document}\n";
$txt .= "{\huge ".$title."}\n\n";
$txt .= "\begin{flushright}\n";
$txt .= "{\large ".$author." }\n";
$txt .= "\end{flushright}\n\n";
$txt .= $fcont;
$txt .= "\end{document}\n";
$txt = mb_convert_encoding($txt,"SJIS");
file_put_contents("./".$output.".tex",$txt);
exec("platex ".$output.".tex");
exec("dvipdfmx -p a5 ".$output.".dvi");
exec("open -a Preview ".$output.".pdf");
?>
昨日どうしてもうまくできなかった、行頭の(段落の最初の)空白が削除できた。出力は昨日はEUCだったのに対し、今日はShift-JIS。私の環境がそうだから。今日は/tmpフォルダは使っていないので、htmlファイルのあるところにいろいろなファイルが生成される。面倒臭いからそのままである。Macなので、最後にpdfファイルは「プレビュー」で開くようにした。exec("open -a Preview ".$output.".pdf"); というところ。昨日とほとんど変わらないけれど、下にできあがったpdfの第一ページを示す。
青空文庫で「トカトントン」など読んでゐると、ふと不安になった。MacOSXで読んでゐる今は、T-Timeで読んでいるのだが、Linuxで読みたいときはどうすればいいのかと考えると不安で仕方がなくなってきた。何かLinux用の縦書きビューアもあるらしいのだが、どうもいろいろ設定やら名にやら面倒臭いようだ。ということで、今日はPHPとLaTeXで即席青空文庫ビューアを作ってみた。
#!/usr/bin/php
<?php
$fname = $argv[1];
$output = $argv[2];
if (empty($output)){
$output = "output";
}
$fcont = file_get_contents($fname);
$fenc = mb_detect_encoding($fcont);
$fcont = mb_convert_encoding($fcont,"UTF-8",$fenc);
$fcont = ereg_replace("\x0D\x0A|\x0A|\x0D","\n",$fcont);
$fcont = ereg_replace("\n","\n\n",$fcont);
$fcont = ereg_replace("\t","",$fcont);
$fcont = ereg_replace("<br >","<br />",$fcont);
$fcont = ereg_replace("<br /><br />","<br />\n<br />",$fcont);
$fcont = preg_replace("/^ /","",$fcont);
$fcont = ereg_replace("<ruby><rb>","\\ruby{",$fcont);
$fcont = ereg_replace("</rp><rt>","}{",$fcont);
$fcont = ereg_replace("</rt><rp>","}",$fcont);
$fcont = ereg_replace("(}","}",$fcont);
$fcont = ereg_replace("})","}",$fcont);
$fcont = preg_replace("/<title>.+?<\/title>/","",$fcont);
$ttl0 = strpos($fcont,"<h1 class=\"title\">");
$ttl1 = strpos($fcont,"</h1>",$ttl0);
$title = strip_tags(substr($fcont,$ttl0,$ttl1-$ttl0));
$au0 = strpos($fcont,"<h2 class=\"author\">");
$au1 = strpos($fcont,"</h2>",$au0);
$author = strip_tags(substr($fcont,$au0,$au1-$au0));
$fcont = preg_replace("/<title>.+?<\/title>/","",$fcont);
$fcont = preg_replace("/<h1 class=\"title\">.+?<\/h1>/","",$fcont);
$fcont = preg_replace("/<h2 class=\"author\">.+?<\/h2>/","",$fcont);
$fcont = strip_tags($fcont);
$txt = "\documentclass[a5j]{tarticle}\n";
$txt .= "\usepackage{okumacro}\n";
$txt .= "\begin{document}\n";
$txt .= "{\huge ".$title."}\n\n";
$txt .= "\begin{flushright}\n";
$txt .= "{\large ".$author." }\n";
$txt .= "\end{flushright}\n\n";
$txt .= $fcont;
$txt .= "\end{document}\n";
$txt = mb_convert_encoding($txt,"EUC-JP");
file_put_contents("/tmp/".$output.".tex",$txt);
exec("platex -output-directory='/tmp/' ".$output.".tex");
if ($output == "output"){
exec("dvipdfmx -o /tmp/".$output.".pdf -p a5 /tmp/".$output.".dvi");
exec("acroread /tmp/".$output.".pdf &");
}else{
exec("dvipdfmx -p a5 /tmp/".$output.".dvi");
exec("acroread ".$output.".pdf &");
}
?>
ubuntu 7.04や7.10ではこれで動いた。PHPの内部文字コードがUTF8用なので、そうでない人は変えないと文字化けするかも知れない。ちなみに私のMacOSXでは動かなかった。出力ファイル(.tex)はEUC。これを例えば"tagegaki.php"という名前で保存して、php tategaki.php ファイル名 という感じで入力してやると/tmpディレクトリ内に、ルビのタグをLaTeX用に変換したり、htmlタグを除去したりしたtexファイルを保存し、そこでplatexを実行してから、できたdviファイルをdvipdfmxでpdfファイルに変換するという仕組みになっている。青空文庫のxhtmlファイル名に続いて出力ファイル名(拡張子なし)を入れれば最後のpdfファイルはカレント・ディレクトリに出力される。