LaTeXの最近のブログ記事

MovableType5 移行

このお休み,國芳展に出かける以外はうちでずっと MovableType ブログ管理システム(以下 MT)のバージョンアップ作業をやっていた。これまで Ver. 4 を使っていたんだけど,記事数が 1000 を越えてからカテゴリアーカイブが更新されないなどの不具合が出て,記事を追加するたびに再構築するなどの面倒な対処をさせられていた。でも MT 版更新はデザインの移行がしち面倒くさくてならない。それでも,小さい面倒を毎回強いられるより,MT 5.12 へのバージョンアップという本格的な面倒を一回だけ受け容れることにした。

せっかくなのでデザインを新しくすることにした。Photoshop と Illustrator を用いてバナーやロゴなどの素材を自作した。MT4 のウィジェット設定をいちいち画面でコピーしてテキストファイルに格納して,これらを MT5 のデザイン設定に反映した。スタイルシートの調整がもっとも手間を要した。MT では,あるスタイル要素がいろんなスタイルシートで定義されているので,思うような効果が出ないとき悪さをしている定義を探すのがたいへんである。もっとラクな移行方法があるんだろうけど,MT をきちんと勉強するなんて気持ちはまったく起きない。

過去のブログ記事を MT4 環境でエクスポートし,Emacs や sed で必要な編集を施した。6 年も運用していると,引用などの表示様式に統一がなくなってしまったので,少しは改善しようと思ったのである。ついでに,先日インストールした SyntaxHighlighter をプログラム・コードの部分に全面的に適用した。

この過程で SyntaxHighlighter に Emacs-lisp,LaTeX,コマンドライン用のスクリプトがないのが気に入らなくなり,自作した。言語の追加は正規表現の扱い以外は極めて容易である。Emacs-lisp と LaTeX 用を以下に掲載しておく(コマンドライン用は Bash 用のものを少し訂正しただけなので割愛)。lisp 用は funcs 等の変数に指定したものが色づけされる。LaTeX 用はコメント行,コントロールシーケンスのみが色づけされる設定である。lisp 用,LaTeX 用のマークアップは brush に対してそれぞれ lisplatex を指定すればよい。

/**
 * SyntaxHighlighter Emacs-lisp
 */
;(function()
  { 
      typeof(require) != 'undefined' ?
          SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
 
      function Brush()
      {
          var funcs     = 'lambda list progn mapcar car cdr reverse ' +
                          'member append format';
          var keywords  = 'let while unless cond if eq t nil defvar ' +
                          'dotimes setq listp numberp not equal';
          var macros    = 'loop when dolist dotimes defun';
          var operators = '> < + - = * / %';
 
          this.regexList = [
              { regex: SyntaxHighlighter.regexLib.doubleQuotedString, 
                       css: 'string' },
              { regex: new RegExp('&\\w+;', 'g'), css: 'plain' },
              { regex: new RegExp(';.*', 'g'), css: 'comments' },
              { regex: new RegExp('\'(\\w|-)+', 'g'), css: 'variable' },
              { regex: new RegExp(this.getKeywords(keywords), 'gm'), 
                       css: 'keyword' },
              { regex: new RegExp(this.getKeywords(macros), 'gm'),
                       css: 'keyword' },
              { regex: new RegExp(this.getKeywords(funcs), 'gm'), 
                       css: 'functions' }
          ];
      };
   
      Brush.prototype = new SyntaxHighlighter.Highlighter();
      Brush.aliases   = ['lisp'];
      SyntaxHighlighter.brushes.Emacs = Brush;
      typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
  })();
/**
 * SyntaxHighlighter LaTeX
 */
;(function()
  { 
      typeof(require) != 'undefined' ? 
          SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
 
      function Brush()
      {
          this.regexList = [
              { regex: new RegExp('%.*','gm'),  css: 'comments' },
              { regex: new RegExp('\\\\\\w*','gm'), css: 'keyword' }
          ];
      };
   
      Brush.prototype = new SyntaxHighlighter.Highlighter();
      Brush.aliases   = ['latex', 'tex'];
      SyntaxHighlighter.brushes.Latex = Brush;
      typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
  })();

今回のブログ・デザイン変更でいちばん困ったのは,背景色変更に伴う画像の扱いである。背景色はこれまで白(RGB で示すと #ffffff)だったのを明灰色(#e8e5e1)に変えたのだが,すでにゴマンとある画像が白の背景色を前提としているためにドロップシャドウなどが白抜きになっていて,これを明灰色の背景に配置すると白の枠が大いに目立って醜いことこの上ない。例えばこんな感じになってしまう。

sample

この対策のために何百とある画像を作り直すのは現実的でない。背景色になじむ枠画像と重ね合わせる調整をスタイルシートで行うことなどを考えたが,ブラウザによっては配置がずれたりしてさらに醜くなるかも知れず,うまくない。結局,ImageMagick によって色の置換を行うことにした。

ImageMagick には convert ユーティリティが付属していて,各種画像変換が可能である。

convert -fill '#rgb-after' -opaque '#rgb-pre' prefile afterfile

とやると ファイル prefile の RGB 値 rgb-preの色を rgb-after に置き換えて afterfile に出力してくれるのである。しかも -fuzz nn% オプションを付加すれば,指定した度合いでファジーに中間色を置き換えてくれる。いくつかパーセンテージを変えて試したところ,-fuzz 10% くらいがよい感じであった。そこで,tcsh コマンドライン上で以下のようにして画像を一括変換した。もちろん,エクスポートしたブログ記事テキストの画像ファイル名拡張子を .png に置換しておかなければならない。

% foreach i (*.jpg)
foreach? set bn=`basename $i .jpg`
foreach? convert -fuzz 10% -fill '#e8e5e1' -opaque '#ffffff' $bn.jpg $bn.png
foreach? end
%

これで上の画像は以下のとおりとなり,背景色に対してごく自然になじむようになった。UNIX のコマンドライン・ユーティリティの文化は偉大である。ただし,白にごく近い色への変更でないとこの方法は通用しない。また,当然ながら画像の #ffffff の白がすべて #e8e5e1 に置き換わるので純白の画面がおとなしくなってしまうだけでなく,文字を含む画像では少し字が瘠せてしまうので,手放しでよいというわけではない。それでも私の目的には充分であった。Web に掲載する画像にドロップシャドウを付ける場合は,白抜きの部分をアルファチャンネル(透過)にして PNG で作成しておくべき — 今回の教訓。

sample

エクスポート・ブログ記事テキストの編集が終わったら,新 MT5 環境でインポートし,再構築して,過去の記事の取り込みは完了した。MT5 にバージョンアップして,1000 を超過した記事のカテゴリ処理もうまく行くようになっただけでなく,再構築がかなり高速になった。

下付ルビ

芭蕉俳句に関する文書を epLaTeX で作成していて,岩波文庫『芭蕉俳句集』p. 47 に出て来る「闇夜きつね下はふ玉眞桑」(妖気漂う闇の夜きつねが好物の真桑瓜に忍び寄る。男の少しおどろな夜這物語の風情がある句)をどう組むか悩んだ。この句は,「闇夜」の右側に「ヤミノヨト」,左側に「スゴク」とルビが振られていて,「やみのよとすごくきつねしたはふたままくは」と読む。「やみのよとすごく」と二度読みする(音で読んだものをさらに訓で読み下す)こういう漢文訓読法を「文選読み」というそうである。右側のルビは通常のルビ付けマクロを使えばよいが,左側に — 横書きスタイルなら下側に — ルビを付加する命令は,聞いたことがない。そんなに難しくなさそうなので,マクロを書いてみることにした。下付ルビ命令 \uruby の定義は以下のとおり。

\newcommand\uruby[3][0zw]{\leavevmode
  % 親文字とルビの寸法を取得
  \setbox0=\hbox{#2}\setbox1=\hbox{\tiny #3}%
  % 幅の大きいほうの寸法を \dimen0 に格納
  \ifdim\wd0>\wd1 \dimen0=\wd0\else\dimen0=\wd1\fi
  % \dimen1 に「ルビ高さ+深さ+間隔値」(下にずらす量)を設定
  \dimen1=\ht1 \advance\dimen1 \dp1 \advance\dimen1 #1\relax
  % \dimen0 の幅で親文字を出力し,ルビを \dimen1 寸法だけ下に下げる
  \hbox to\dimen0{\hfil#2\hfil}%
  \kern-\dimen0\raise-\dimen1\hbox{\vbox{\hbox to\dimen0{\tiny #3}}}}%
20110702-uruby.png

\uruby[間隔値]{親文字}{ルビ} の書式で使用する。「間隔値」とは,親文字の下へのルビの移動量「ルビ文字の高さ+深さ」をさらに増量させたいとき,その寸法値を指定する。通常のルビ命令は奥村先生の okumacro.sty に定義されており,これと併用すれば課題は解決できることになる。例を以下に示す。

% -*- coding: utf-8; -*-
\documentclass[12pt]{tarticle}% 縦書き
\usepackage{okumacro}% 奥村先生のマクロ集
% 下ルビ命令: \uruby[間隔値]{親文字}{ルビ}
\newcommand\uruby[3][0zw]{\leavevmode
  \setbox0=\hbox{#2}\setbox1=\hbox{\tiny #3}%
  \ifdim\wd0>\wd1 \dimen0=\wd0\else\dimen0=\wd1\fi
  \dimen1=\ht1 \advance\dimen1 \dp1 \advance\dimen1 #1\relax
  \hbox to\dimen0{\hfil#2\hfil}%
  \kern-\dimen0\raise-\dimen1\hbox{\vbox{\hbox to\dimen0{\tiny #3}}}}%
\makeatletter
\def\kanjistrut{\vrule \@height0.66zw \@depth0.12zw \@width\z@}
\makeatother
\begin{document}
% 『芭蕉俳句集』岩波文庫,p. 47.
\uruby[4pt]{\ruby{闇 }{ヤミノ}\ruby{夜}{ヨト}}{スゴク}きつね下はふ玉眞桑
\end{document}

奥村先生の \ruby 命令は,縦書きスタイルで使用するとルビが少し右に離れすぎてしまう。これは親文字とルビとの間に噛ませた箍 \kanjistrut を調整すればよい。また \uruby も縦書きのときは「間隔値」を指定して,もう少し左に(つまり,横書きスタイルでは下に)ずらずようにした方がよい。上記の原稿ではこの二点の調整を行っている。処理結果は右図のとおりである。

LaTeX Mahjong fonts package PIEMF

LaTeX でも麻雀牌を組版できるということで,ptexlive on Mac OS X Snow Leopard で試してみた。Takayuki Yamaizumi 氏作成の『METAFONT 用麻雀牌ソースパッケージ piemf』である。モノトーンの麻雀牌フォントではあるが,牌構成を文書で説明する用途には十分である。副露を示す横に寝た形の牌や赤牌,暗槓の裏地も用意されている。

METAFONT のソースとマクロファイルが添付されていて,もともと PK ビットマップフォントとして使うことが想定されている。私は mftrace でフォントを Type1 アウトライン化してインストールすることにした。さすが,j-TeX 時代に開発されたらしく,インストール説明は UNIX 向けになっている。マクロも EUC 文字コードでコーディングされているので,ptexlive UTF-8 で原稿を処理するためには,ISO-2022-JP (いわゆる JIS) に再エンコードしておくとよい。

インストールのオペレーションを以下に掲げておく。tcsh である。

[TEXDIR 環境変数に texmf を設定]
% setenv TEXDIR /usr/local/texlive/texmf-local
[作業ディレクトリ作成]
% mkdir -p ~/tmp/mahjong
% cd ~/tmp/mahjong
[package ダウンロード]
% wget -nH -nd http://www.yamaizumi.org:2481/piemf/piemf-2.0.2.tar.bz2
% tar jxvf piemf-2.0.2.tar.bz2
[マクロファイルを JIS に変換]
% cd piemf-2.0.2/macros
% mkdir -p work
% foreach i (*.sty)
foreach? nkf -j $i > work/$i
foreach? mv work/$i .
foreach? end
% cd ..
[マクロ,フォントソースを $TEXDIR にコピー]
% su -m
# mkdir -p $TEXDIR/{fonts/{source,tfm,type1,map/dvips},tex/latex}/piemf
# cp src/*.mf $TEXDIR/fonts/source/piemf/
# cp macros/*.{sty,fd} $TEXDIR/tex/latex/piemf/
# mktexlsr
# exit
[Type1 フォントの生成]
% mkdir -p type1
% cd type1
% mftrace --magnification=4000 --encoding=tex256.enc pie
% t1binary pie.pfa pie.pfb
[フォントマップの作成]
% cat > pie.map
pie pie <pie.pfb
^D (コントロール+D)
[リソースを $TEXDIR にコピー]
% su -m
# cp pie.pfb $TEXDIR/fonts/type1/piemf/
# cp pie.map $TEXDIR/fonts/map/dvips/piemf/
# mktexlsr
[マップ登録]
# updmap-sys --enable Map=pie.map
# exit

pie2e.sty をプリアンブルで読み込んでおく。個別の麻雀牌の出力命令等の詳細は,添付の README を参照のこと。以下,試験原稿と処理結果を掲載しておく。

% -*- coding: utf-8; -*-
% 麻雀牌の組版
\documentclass{jsarticle}
\usepackage{pie2e}
\usepackage[deluxe]{otf}
\begin{document}
\parindent=0pt%
純全帯\CID{14126}九・三色同順---私の好きな役!
 
\vspace{1zw}
{\Huge
  \suo{1}\suo{2}\suo{3}\tong{1}\tong{2}\tong{3}\wan{1}\wan{2}\wan{3}%
  \suo{7}\suo{8}\suo{9}\tong{9}\tong{9}
}
\end{document}

20110525-pie.png

PFonts Cyrillic LaTeX fonts package

CyrTeX-ru で PFonts の話題が上がっていた。キリル・ポストスクリプトフォントとしては PSCyr が有名であるが,「PSCyr はフリーでないし,品質がちょっと」という意見とともに,PFonts が紹介されていた。PFonts はフリー,かつ 16 種類のファミリ(書体)を揃えている。私も早速インストールして試してみた。

インストールは,http://narod.ru/disk/12251041001/PFonts.7z.html から PFonts.7z を落として来て,p7zip で解凍し,TeX ツリーにコピーし,マップ登録すればよい。ダウンロード後のオペレーションは以下の通り。

% mkdir -p PFonts
% 7za x -oPFonts ~/Downloads/PFonts.7z
% cd PFonts
% su -m
# setenv TEXDIR /usr/local/texlive/texmf-local
# tar cf - . | ( cd $TEXDIR; tar xvf - )
# mktexlsr
# updmap-sys --enable Map=pfonts.map

サンプル文書 (pfonts-test.tex) を以下に掲げておく。\usepackage[scale=スケール]{AcademyP} というような行が各書体の指定である。このマクロのなかで \rmdefault, \sfdefault, \ttdefault を再定義することにより書体が選択される仕組みである。複数の書体を切替えて使う場合,サンプルにあるとおり,\fontfamily{ファミリ名}\selectfont とする。書体に対応するファミリ名はサンプル文書に記してある。

% -*- coding: utf-8 -*-
% PFonts test sample, coded by Isao Yasuda, May 10, 2011. 
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T2A,T1]{fontenc}
\usepackage[russian]{babel}
\usepackage[scaled=1.00]{AcademyP}%
\usepackage[scaled=1.00]{BalticaP}%
\usepackage[scaled=1.00]{BodoniP}%
\usepackage[scaled=1.00]{CooperP}%
\usepackage[scaled=1.00]{CourierP}%
\usepackage[scaled=1.00]{JournalP}%
\usepackage[scaled=1.00]{JournalSansP}%
\usepackage[scaled=1.00]{LazurskiP}%
\usepackage[scaled=1.00]{LetterGothicP}%
\usepackage[scaled=1.00]{LiteraturnayaP}%
\usepackage[scaled=1.00]{NewStandardP}%
\usepackage[scaled=1.00]{NewtonP}%
\usepackage[scaled=1.00]{PetersburgP}%
\usepackage[scaled=1.00]{PragmaticaP}%
\usepackage[scaled=1.00]{QuantAntiquaP}%
\usepackage[scaled=1.00]{TextbookP}%
\renewcommand{\rmdefault}{tdy}%
\def\sample{%
Прежде всего откроем тайну которую Мастер не пожелал
открыть Иванушке.
Возлюбленную его звали Маргаритою Николаевной.
Все, что Мастер говорил о ней, было сущей правдой.
Он описал свою возлюбленную верно.
Она была красива и умна.}%
\long\def\chfam#1#2{%
  \vspace{11pt}%
  \bgroup\fontfamily{#1}\selectfont#2\par\sample\par\egroup}%
\pagestyle{empty}
\begin{document}
 
\begin{center}
\LARGE PFonts test
\end{center}
 
Font-name: Type Family-name;\qquad
Text: \textit{М. А. Булгаков} <<Мастер и Маргарита>>.
 
\chfam{tdy}{Academy: rm tdy}
\chfam{tl5}{Baltica: rm tl5}
\chfam{tbd}{Bodoni: rm tbd}
\chfam{tcb}{Cooper: sf tcb}
\chfam{tco}{Courier: tt tco}
\chfam{tjr}{Journal: rm tjr}
\chfam{tjs}{JournalSans: sf tjs}
\chfam{tla}{Lazurski: rm tla}
\chfam{tlg}{LetterGothic: tt tlg}
\chfam{tln}{Literaturnaya: rm tln}
\chfam{tns}{NewStandard: rm tns}
\chfam{tnw}{Newton: rm tnw}
\chfam{tp7}{Petersburg: rm tp7}
\chfam{tpg}{Pragmatica: sf tpg}
\chfam{tqa}{QuantAntiqua: rm tqa}
\chfam{ttx}{Textbook: sf ttx}
 
\end{document}

pdflatex による処理結果(一部)は次のようなものである。処理結果 PDF (pfonts-test.pdf) もリンクしておくので参照いただきたい。

20110509-pfonts.png

PFonts は T2A, T1, TS1 フォントエンコーディングしかサポートしていない。PSCyr-0.4-beta は一部フォントについて T2D をサポートしているのと比べると残念である。PFonts のポストスクリプトフォントのグリフ一覧を fontforge で確認すると ѣ Ѳ Ѵ のグリフがきちんと揃っているのに,LaTeX PFonts では使えないわけで,これはもったいない。CyrTeX-ru で作者に T2D サポートの要望を出しておいた。

The One Ring, Tengwar fonts

J. R. R. トールキンの『指輪物語』にテングワールという謎めいた文字が出て来る。架空の言語は謎めいたファンタスティックな世界の完結性をこの上もなく表わしている。あの恐ろしい力を持つ The One Ring にモルドール語で刻印された火文字を,LaTeX tengwarscript パッケージで組んでみた。

20110418-mordor.png

One ring to rule them all, one ring to find them,
One ring to bring them all and in the darkness bind them.
一つの指輪は,すべてを統べ,一つの指輪は,すべてを見つけ,
一つの指輪は,すべてを捕えて,くらやみのなかにつなぎとめる。
J. R. R. トールキン『指輪物語1』瀬田貞二・田中明子 訳,評論社,1992年,p. 112.

tengwarscript は CTAN: macros/latex/contrib/tengwarscript/ にある。バージョンは 1.3。フォントは何種類も出回っているが,私は AnnatarFormal だけを組込んで試してみた。上の画像は Annatar Italic である。流麗でなんとも美しい。原稿は以下のとおり。このモルドール語テクストはパッケージ添付 tengtest.tex にサンプルとして掲載されている。これを pdflatex で処理した。

% -*- coding: utf-8; -*-
% Tengwar on The One Ring from "The Load of the Ring" 
\documentclass[12pt]{article}
\usepackage[pdftex]{color}
\usepackage[T1]{fontenc}
\usepackage[all]{tengwarscript}
\definecolor{charc}{cmyk}{0,0.77,0.87,0}%
\begin{document}
\pagestyle{empty}
\color{charc}
\begin{center}
\tengwarannataritalic[2.0]
\tengwa{254}
\Textendedcalma\TTthreedots\Tnuumen\Tessenuquerna\TTthreedots%
\Tungwe\Tando\Toore\TTrightcurl\Tumbar\Ttinco\TTthreedots%
\Tlambealt\TTrightcurl\Tquesse\TTdoublerightcurl
\Tromanperiod\Ts
\Textendedcalma\TTthreedots\Tnuumen\Tessenuquerna\TTthreedots%
\Tungwe\Tungwe\Tumbar\TTnasalizer\TTdot\Ttinco\TTthreedots%
\Tlambe\TTrightcurl
\tengwa{255}\\
\Textendedcalma\TTthreedots\Tnuumen\Tessenuquerna\TTthreedots%
\Tungwe\Tthuule\Troomen\Tquesse\TTthreedots\Ttinco\TTthreedots%
\Tlambealt\TTrightcurl\Tquesse\TTdoublerightcurl
\Tromanperiod\Ts
\Textendedungwe\TTthreedots\Tumbar\Toore\TTrightcurl%
\Tesse\Tkern{-0.2}\Tmalta\TTrightcurl%
\Textendedcalma\TTdot\Ttelco\TTdot\Tquesse\Troomen\Tparma%
\TTnasalizer\TTdot\Ttinco\TTthreedots\Tlambe\TTrightcurl
\end{center}
\end{document}

tengwarscript のインストールは通常の LaTeX パッケージ組込となにも変わらない。ダウンロードした tengwarscript リソースを TDS に準拠して TeX ツリーに格納し,tengwarscript.mapupdmap-sys で登録する。フォントもほぼ同じだけれど,Formal については TrueType フォントファイル名を tengwarscript.map の記載に合わせてリネームする必要がある(もちろん map を訂正してもよい)。テングワール文字の出力命令については,ドキュメント tengwarscript.pdf を参照。
 

※ 4.20 付記

一応,端末上のインストール・オペレーションもメモっておく。端末操作は tcsh シェルである。TeX ツリーはローカル texmf とし,そのトップ・ディレクトリ名称を /usr/local/texlive/texmf-local としている。

まず,作業ディレクトリ(ここでは ~/tmp/tengwar)で tengwarscript パッケージをダウンロード,展開し,dtx, ins ファイルを latex 処理する。dtx はドキュメントでもあり,以下の操作ではリファレンス解決のため 2 回実行している。もとより PDF はすでに添付されているのできちんとした dvi ファイルが不要ならば,1 回の処理でもよい。

% mkdir -p ~/tmp/tengwar
% cd ~/tmp/tengwar
% set WGET="wget -nH -nd"
% set TEXDIR="/usr/local/texlive/texmf-local"
% $WGET http://mirror.ctan.org/macros/latex/contrib/tengwarscript.zip
% unzip tengwarscript.zip
% cd tengwartscript
% latex tengwarscript.dtx
% latex tengwarscript.dtx
% latex tengwarscript.ins

次に,Annatar 及び Formal フォントをダウンロード,解凍する。Formal フォントについては,map の記述に合うようにファイル名を変更する。

% $WGET http://home.student.uu.se/j/jowi4905/fonts/tngan120.zip
% unzip tngan120.zip
% $WGET http://tengwarformal.limes.com.pl/fonts/TengwarFormal-12c-ttf-pc.zip
% unzip TengwarFormal-12c-ttf-pc.zip
% cd TengwarFormal-12c-ttf-pc/fonts/
% mv TengwarFormal12b.ttf TengwarFormal12.ttf
% mv TengwarFormalA12b.ttf TengwarFormalA12.ttf

su -m で特権ユーザとなり,上で展開したリソースを TeX ツリーに格納し,フォントマップ登録を行う。

% cd ~/tmp/tengwar/tengwarscript
% su -m
# mkdir -p $TEXDIR/{doc/latex,tex/latex,fonts/\
{tfm,vf,type1,truetype,map/dvips,enc/dvips}}/tengwarscript
# cp -p *.pdf $TEXDIR/doc/latex/tengwarscript/
# cp -p *.cfg *.sty $TEXDIR/tex/latex/tengwarscript/
# cp -p tfm/* #$TEXDIR/fonts/tfm/tengwarscript/
# cp -p vf/* $TEXDIR/fonts/vf/tengwarscript/
# cp -p map/* $TEXDIR/fonts/map/dvips/tengwarscript/
# cp -p enc/* $TEXDIR/fonts/enc/dvips/tengwarscript/
# cp -p *.ttf $TEXDIR/fonts/truetype/tengwarscript/
# cp -p TengwarFormal-12c-ttf-pc/fonts/*.ttf \
$TEXDIR/fonts/truetype/tengwarscript/
# mktexlsr
# updmap-sys --enable Map=tengwarscript.map

以上。

後を囘顧みたれば

「ロト,ゾアルに至れる時日地の上に昇れり ヱホバ硫黃と火をヱホバの所より卽ち天よりソドムとゴモラに雨しめ 其邑と低地と其邑の居民および地に生ふるところの物を盡く滅ぼし給へり ロトの妻は後を囘顧みたれば鹽の柱となりぬ」。

『創世記』19 章 23−26,罪と頽廃の街・ソドムとゴモラが神の劫火に滅び,ただロトの家族のみが神の救済に与るくだりである。引用は日本聖書協会による文語訳からのものである(『舊新約聖書』日本聖書協会, 1991 年, p. 21)。クライシスとそこからの救済というモチーフ。震災ゆえかなにか心に迫るところがあり,読み返してみた(もちろん震災被災地はソドムでもゴモラでもない)。ロトの妻は,後ろを振返るなと天使から諭されていたにもかかわらず振返ってしまい「鹽の柱」と化す。これが恐ろしい象徴として胸を打つ。「後」とは過去のことを言うのだろうか。滅びて行くものに後ろ髪を引かれ,それゆえに己をも滅ぼす。私も振返って己を滅ぼすクチだと思う。それにしても,この後ろを振返ることで本意が遂げられないというモチーフは,オルフェウスとユーリディケーの逸話にもあって興味深い。

泉鏡花の怪異短編小説『黒壁』(明治二十七年)に「予も何となく後顧(うしろぐら)き心地して」という表現が出て来る。「後ろ暗い」が「後ろを顧みるような」と等価の関係で捉えられている。「後ろ暗い」とは「気掛かり,心配だ」のほかに「ふた心がある」という意味もある。つまり,心に覚悟がなく,信念に反する邪念があるの謂いである。神はロトの妻のそういう心の奥底を「振返るな」との命により試したのかも知れない。

『創世記』のこのくだりを教会スラヴ語訳聖書でも読んでみた。「鹽の柱」は «столпъ сланъ»「霜の柱」という訳になっている。拙作 OldSlav 教会スラヴ語 LaTeX パッケージ (See also OldSlav: An extension of SlavTeX for Old Church Slavonic typesetting) を使って,タイプセットしてみた。

bytie19-23-26.png

LaTeX の原稿は以下のとおり。

% -*- coding: utf-8; -*-
% Ветхая Библия 19:23-26
\documentclass[b5paper]{article}
\usepackage[pdftex]{color}
\usepackage[T2A,T1]{fontenc}
\usepackage[russian,oldchurchslavonic]{babel}
\languageattribute{oldchurchslavonic}{utf8,slavdate}
\setlength{\textwidth}{11cm}
\DeclareFontFamily{LST}{cmr}{}%
\DeclareFontShape{LST}{cmr}{m}{n}{<-> s * [1.12] fslavrm}{}%
\definecolor{bibc}{rgb}{0.40,0.44,0,20}%
\begin{document}
\color{bibc}
\Large
С'олнце вз'ыде над\ъ з'емлю,
л'ѡтъ же вн'иде въ си\-г'ѡръ.
\И г|сдь <ѡдожд`и на сод'омъ \и
гом'орръ ж'упелъ, \и "ѻгнь ѿ г|сда
съ небес`е.
\И преврат`и гр'ады сї^ѧ, \и вс`ю
<ѡкр'естную стран`у, \и вс'ѧ жив'ущыѧ
во град'ѣхъ, \и вс^ѧ прозѧб^ающаѧ
ѿ земл`и.
\И <ѡзр'ѣсѧ жен`а єг`ѡ всп'ѧть,
\и б'ысть ст'олпъ сл'анъ.
 
\vspace{.4em}
\hfill БЫТЇ`Е ГЛАВ`А \slnum(19).:
\slnum(23).{\selectlanguage{russian}--}\slnum(26).
\end{document}
 
* * *

震災の影響で国産煙草が品薄になっている。一週間ほど前,会社からの帰途にある煙草屋に寄るも,どこもハイライトが品切れだった。帰宅して,近所を探しまわったがやはり品切れ。しようがなく昔住んでいた平間の煙草屋に行ってみるとかろうじて自販機に残があり,店のオヤジにタスポを借りて4箱手に入れた。それ以後,もう入手できない。ま,煙草なんて生活必需品ではないのだから,どうでもいいことではある。
 

* * *

まったく関係ありませんが,麻雀ゲームで清老頭を上がってしまいました。
 
20110417-tinroto.png

Babelbib with ptexlive

ptexlive で多言語文献参照パッケージ Babelbib を使ってみた。

LaTeX のマルチリンガルインタフェースとして Babel はデファクトスタンダードになっている。文献参照機能 BibTeX の世界でも Babelbib という Babel の言語切替に対応したパッケージが公開されている。Babelbib 2009 年 10 月の版でロシア語もサポートされた。ptexlive には初期導入されていて,すぐ使いはじめることができる。

pLaTeX2e においては BibTeX は jBibTeX を用いるのが主流だったが,ptexlive における日本語対応版は pBibTeX (pbibtex コマンド) という名称になっている。しかしながら,Babelbib を ptexlive で使う場合,pBibTeX ではなく BibTeX (bibtex コマンド) を使う。pBibTeX で文献データベース処理を行うとロシア語などでエラーになるからである。ptexlive ではキリル文字を欧文として扱う場合エスケープ形式 (文字を十六進数で表現した形式。例えば Ю^^d0^^ae で表す) にしなければならないが,pbibtex がこれをうまく処理できない。本家 bibtex ならうまく通るのである。

Babel を用いて ptexlive で日本語と外国語を混植するとき,稲垣さんの japanese.ldf 日本語言語定義を使っている人は多いと思う。Babelbib でも同様に japanese 環境に応じて文献参照の言語を切替えたい場合,Babelbib 用の日本語言語定義ファイル japanese.bdf を準備しなくてはならない。これの作り方はそんな難しいものではなく,すでにある言語定義をコピーして "Volume" などの文献項目表示ラベルを UTF-8 日本語で書直せばよい。私が試験的に準備した japanese.bdf を置いておく。ただし,これ,英語用を複製して japanese で動くようにしただけのしろもので,まったくラベルの書換をしていない。(※ 4.18 付記: nippon.ldf でも動くようにした。)

Babelbib の使い方は,端末から texdoc babelbib と打ち込めば表示される Babelbib PDF ドキュメントを参照していただきたい。ごくごく簡単に記すと,プリアンブルに以下のように書いておく。

\usepackage[utf8x]{inputenc}
\usepackage[T2A,T1]{fontenc}
\usepackage[italian,german,french,russian,english,japanese]{babel}
\usepackage[japanese]{babelbib}% load japanese.bdf

japanese.bdf は Babelbib 標準言語ではないので,パッケージ・オプションに japanese を指定してロードするよう指示しておくことがポイントである。

日本語 BibTeX では \bibliographystyle として jplainjabbrv が用意されているが,Babelbib では babplain などを使う。ただし,私が試した範囲では,ptexlive との組み合わせで,babplain, babplai3, babunsrt スタイル以外は動作しなかった。

サンプルを以下に示す。LaTeX 原稿 (mlbibjp.tex):

% -*- coding: utf-8; -*-
% mlbibjp.tex: BibTeX Babelbib test
% coded by isao yasuda.
\documentclass[b5paper]{jsarticle}
\usepackage[utf8x]{inputenc}
\usepackage[T2A,T1]{fontenc}
\usepackage[italian,german,french,russian,english,japanese]{babel}
\usepackage[japanese]{babelbib}
\setlength{\textwidth}{30zw}
\begin{document}
\begin{center}
  \Large\bf ptexlive Babelbib試験
\end{center}
 
Bib\TeX{}は\texttt{pbibtex}ではなく\texttt{bibtex}で実行した。
 
\vspace{1em}
ロシア語:
\selectlanguage{russian}
Юрий Лотман написал это в лит.\cite[с. 256]{lotman1970}.
 
\vspace{1em}
\selectlanguage{japanese}
イタリア語:
\selectlanguage{italian}
Nel 1930 venne pubblicato ``\textit{La carne, la morte e 
il diavolo nella letteratura romantica}'' (\cite{mario1930}), 
un testo che tradotto in inglese nel 1933 contribuirà 
ad estendere la sua fama in Gran Bretagna e Stati Uniti, 
e provocherà invece forti reazioni contrarie in Italia, 
fra cui quella di Benedetto Croce.
 
\nocite*
%% Choose one BibTeX style:
\bibliographystyle{babplain}% OK
%\bibliographystyle{bababbrv}% NG
%\bibliographystyle{babalpha}% NG
%\bibliographystyle{babunsrt}% OK
%\bibliographystyle{babamspl}% NG
\bibliography{ml}% see ml.bib
\end{document}

文献データベースファイル例 (ml.bib) は以下のとおり。書誌情報 language に Babel 言語名を指定すると,その言語でのマナーで文献出力がなされる。例にあるとおり,著者名,書名の文字列は UTF-8 で直接入力ができる。ロシア語もキリル文字をそのまま書いてよいし,独・仏語もアクセント付き文字をそのまま入力できる。

% -*- coding: utf-8; -*-
% ml.bib: babelbib test
% coded by isao yasuda.
@book{curtius1961,
  author={Curtius, E. R.},
  title={Europäische Literatur und lateinisches Mittelalter},
  year={1961},
  address={Berlin},
  language={german}
}
@inBook{mario1930,
  author={Praz, M.},
  title={La carne, la morte e il diavolo nella letteratura romantica},
  year={1930},
  address={Milano},
  language={italian}
}
@book{lotman1970,
  author={Лотман, Ю. М.},
  title={Структуры художественного текста},
  year={1970},
  publisher={Искусство},
  address={Москва},
  language={russian}
}
@book{tynyanov1969,
  author={Тынянов, Ю. Н.},
  title={Пушкин и его современники},
  year={1969},
  publisher={Наука},
  address={Москва},
  language={russian}
}
@Book{gracq1938,
  author={Gracq, Julien},
  title={Au château d’Argol},
  publisher={José Corti},
  year={1938},
  address={Paris},
  language={french}
}
@Book{basho1970,
  author={松尾 芭蕉},
  editor={中村俊定},
  title={芭蕉句集},
  publisher={岩波書店},
  year={1970},
  address={東京},
  language={japanese}
}

上記原稿をコンパイルし,PDF を生成するには以下のようにする。

% eplatex mlbibjp.tex
% bibtex mlbibjp.aux
% eplatex mlbibjp.tex
% eplatex mlbibjp.tex
% dvipdfmx mlbibjp.dvi

このとき注意が必要なのは,ロシア語,ギリシア語が原稿,文献データベースに含まれている場合,エスケープ形式にしておかないといけない点である。PTEX_IN_FILTER 環境変数にここであげたフィルタを指定して実行すれば,利用者が意識しなくても ptexlive (UNIX 版) がこの処理を通してくれる。

組版結果は以下のとおり。ここでは文献一覧をイタリア語環境で出力してみた。

20110409-babelbib.png

Unicode msearch 導入メモ

私のメインサイトでは namazu 2 でサイト内全文検索ができるようになっている。namazu 2 は UNIX 環境日本語全文検索エンジンの定番になって久しいが,基本的に ISO-2022-JP, Shift_JIS, EUC-JP の日本語文字コードを前提としており,多国語文書には適さない。ロシア語に限って言えば,Unicode ロシア語文書も検索できるのだけど(JIS の智慧のおかげ)。

最近ではサイト内検索エンジンをブログ管理システムに任せるか,Google のドメイン指定の検索窓を設けることで,自らインデックス管理自体をしないですむようになっており,独自に検索エンジンを設置する必要性は薄くなって来ている。ちなみに,Google のドメイン指定で自分のサイト内だけを検索するための検索窓は,以下のようなコードを自サイトのページに埋め込めばよい。

<form method="get" action="http://www.google.com/search">
  <input type="text" name="q" size="30" maxlength="255" value="" />
  <input type="hidden" value="検索対象ドメイン" name="as_sitesearch" />
  <input type="hidden" name="hl" value="ja" />
  <input type="hidden" name="ie" value="UTF-8" />
  <input type="submit" value="Google 検索" />
</form>
このサイト内なら—

私は受信したメールを MHonArc でアーカイブし,パスワードで文書セキュリティを保護することで,Web でどこからでも自分のメールを見られるようにしている。このような用途では,Google を使うわけには行かず(非公開なんだから当然),どうしても独自に検索エンジンを設置しなければならない。

Katsushi Matsuda,毛流麦花両氏による msearch は Unicode 文書からインデキシングが可能である。よって多国語文書も本来の文字列で検索が可能である。そこで私も Unicode 版 msearch Ver. 1.52 を導入してみた。これで柔軟な多国語検索とメールアーカイブ検索が両立できるというわけだ。http://yasuda.homeip.net/msearch.html から私のサイト内の検索ができるようにしてみた(メール検索は当然ながら非公開)。検索結果画面は msearch のお仕着せをそのまま使っている。まだ画面右上の namazu 検索は生きている。そのうち整理するつもりである。

msearch は,茶筌で日本語検索対象語を抽出してインデキシングを行う namazu とは異なり,おそらく n-gram で全文インデックスを抽出している。これは検索モレを防ぎかつ高速化を実現するのに有効な方法である。ただし,msearch は多国語文字を取り扱うことができるとはいえ,いわゆる語形変化に追随できるようなインデキシング解析をしているわけではなさそうである。Google なら,нести (「携える」という意味のロシア語不規則変化動詞不定形) を入力すると,несут (三人称複数現在) などの変化形をも検索できる。さすがである。

msearch は PDF, Microsoft Word, Microsoft Excel, Microsoft PowerPoint をインデキシングするためのフィルタを持たないため,そのままでは原則 HTML 文書だけを扱うことになる。私自身は .doc, .xls, .ppt ファイルをプライベートで扱うことはないので,まったく困らないのだが,PDF だけはなんとしても検索できるようにしたい。以下,PDF も取り扱うことができるように msearch 環境を調整するメモをしるしておく。環境は Mac OS X Snow Leopard (インデックス作成) 及び FreeBSD 8.1-RELEASE (公開 Web 環境) である。掲載内容は無保証である。

Unicode 版 msearch インストール

Unicode msearch のダウンロード,インストールは『サイト内全文検索エンジン ― Unicode版msearch』に毛流麦花氏による懇切丁寧な解説があるので,そちらを参照する。アーカイブを解凍し,cgi-bin/msearch にリソースを格納するだけである。Perl 5 が必要である。/~user/ などの Web ユーザディレクトリ下で msearch を運用する場合は,public_html/cgi-bin/msearch のパーミッションが 644 あるいは 755 (他ユーザの書込権限なし) になっていないと,Premature end of script headers のエラーが出て動作しないので注意。

私の場合,PDF 処理その他でサイトのドキュメント・ツリーを書き換えてしまうオペレーションが発生するため,Apache22 の公開エリアとは別に ~/var/webindex ディレクトリ (以下「ワークツリー」) を作成し,そのなかにサイト・ドキュメント・ツリーをコピーするとともに,msearch リソース・ディレクトリをも設置した。ここで検索インデックスをローカル作成(msearch では,Web ブラウザからインデックス作成操作が可能であるが,これを使わず,サーバ・ローカルの端末でコマンド操作によりインデックス作成を行うことを「ローカル作成」と呼んでいる)し,できたものを Apache22 の公開エリア /usr/local/www/apache22/cgi-bin/msearch にコピーするという運用である。

msearch のサイト用独自設定は default.cfg で行う。本稿の試行では,とりあえず set $home= の右辺を私のサイト URL に書き換えただけである。

PDF インデキシング

msearch で PDF ファイルのインデックスを作成するには,いくつか注意事項があり,少し工夫が必要である。そのままで PDF をインデックス作成対象に指定すると,インデックス・ローカル作成プログラム genindex.pl (本稿で「インデクサ」とあるのはこれのこと) は異常終了する。

PDF はテキスト変換した上でインデクサに掛けるのが基本である。UNIX X11 PDF ビュア XPDF のユーティリティ pdftotext で PDF — テキスト変換を行った上でインデキシング実行すればよい。このときテキスト化されたファイルを元の PDF ファイルと同じ名称にしておかないと,検索結果のリンクで当該ファイルを参照できないので,テキスト変換結果で元 PDF ファイルを上書きしておく必要がある。PDF 以外でも wvWare (Microsoft Word 用),xlHtml (Microsoft Excel 用),pptHtml (Microsoft PowerPoint 用) の各 UNIX ソフトウェアを利用し HTML ないしテキスト形式に変換することで,msearch インデキシングが可能である。

第二の注意点として,HTML / XML 以外のファイルに対して msearch は BOM で Unicode エンコードを判断していることがある。BOM がないと,Web 検索結果画面上の当該ヒットエントリの文字が化けてしまうのである。普通,UTF-8 でテキストファイルを作成するとき,BOM を付けたりしないので,インデクサに掛ける前に UTF-8 BOM (十六進コード "EFBBBF") をワークツリーのテキスト変換後ファイルの先頭に書き込んでおく。これは echo, cat コマンドなどで簡単にできるのだけれども,私は,PDF に混在した不要な制御コード文字を取り除く目的と合わせて,これを行う簡単なプログラム chkucntlchr を書いた。PDF 以外のテキストファイルも同様の処置が必要である。

以上の処理を自動で行うシェルスクリプトのコード例を以下に示す。これを含んで,msearch インデックス作成の全体シェルスクリプト例を最後に掲げてある。

# PDF format conversion
$WRK=ワークツリー
$UCK=chkucntlchr # 制御コード削除・BOM 付加ツール
$STP=タイムスタンプファイル (前回実行時の日付属性をもつ空ファイル)
echo "*  Convert PDF to TEXT by pdftotext (XPDF)."
cd $WRK
for i in `find -L . -newer $STP -name "*.pdf"`
do
    pdftotext -enc UTF-8 -nopgbrk $i $i.txt
    if [ $? -eq 0 ]; then
        echo "**  pdftotext $i OK."
        $UCK < $i.txt > $i
        if [ $? -eq 2 ]; then
            echo "**  $i is empty. Ignore."
            rm -f $i
        fi
    else
        echo "**  pdftotext $i NG. Ignore."
        rm -f $i
    fi
    rm -f $i.txt
done

また,chkucntlchr ツールの Perl コードは以下の通りである。

#!/usr/bin/perl -w
# -*- coding: utf-8; mode: cperl; -*-
# chkucntlchr
# 2011(c) isao yasuda.
# - delete words including control characters (U+0001--U+0020, U+007F--U+00A0)
# - Add UTF-8 BOM (x'efbbbf') for msearch indexer
# - Return code 0: normal; 1: suppressed; 2: imput empty;
use strict;
use utf8;
binmode STDOUT, ":utf8";
my $flg = 0;
my $lc = 0;
my $utf8_bom = "\xEF\xBB\xBF";      # BOM for UTF-8
utf8::decode($utf8_bom);
print $utf8_bom;
while (<STDIN>) {
    chomp($_); $lc++;
    utf8::decode($_);
    my @line = split(/\s/, $_);
    foreach my $wd (@line) {
        if ($wd =~ /[\x{0001}-\x{0020}\x{007F}-\x{00A0}]/) {
            $flg = 1;
        } else {
            print "$wd ";
        }
    }
    print "\n";
}
if (! $lc) {
    print STDERR "*** $0: input empty.\n";
    exit 2;
}
if ($flg) {
    print STDERR "*** $0: suppressed control characters.\n";
} else {
    print STDERR "*** $0: no problem.\n";
}
exit $flg;


segmentation fault 対策

msearch インデクサに PDF を食わせるに際して,もっとも悩んだのはテキスト化した PDF でも,インデクサが segmentation fault エラーで異常終了する場合があることであった。インデクサからコールされる indexing.pl に罠を仕掛けて調査したところ,問題が二つ判明した。

まず第一には,サイトのインデックス対象ファイル数が多いと,UNIX の ulimit のファイルオープン数の制限に引っ掛かり,異常終了してしまう。ulimit -a で制限値を確認し,インデックス対象ファイル数よりも open files の設定値が小さければ,ulimit -n 数値 で値をファイル数よりも大きな値に設定する。

第二には,msearch インデクサは正規表現 s 演算子によって HTML タグの除去処理を行っているが,これをすべてのファイルに適用しており,テキスト変換された PDF ファイル中の文字列如何によっては誤動作してしまう。私のサイトの PDF は,LaTeX 多言語文書を dvipdfmx で処理した生成物が多い。LaTeX フォント・パッケージの enc ファイル(エンコーディング定義ファイル)によってはヘンな文字の羅列になることがあり,これでタグ判定の正規表現がぶっとんでしまったらしい。indexing.pl 791 行目を,HTML / XML でないときは実行しないように,以下の改変を行うと,アボートしないようになった。

#    $contents =~ s/<(?:[^"'>]|"[^"]*"|'[^']*')*>/ /g;  # オリジナル
    $contents =~ s/<(?:[^"'>]|"[^"]*"|'[^']*')*>/ /g if ($html_xml); # 対策

XPDF 多国語化

XPDF pdftotext の多国語対応について簡単にしるしておく。FreeBSD Ports,Mac OS X MacPorts では XPDF Japanese port が用意されており,これをインストールすれば日本語 PDF については扱うことが出来るようになる。しかし,多国語 PDF はダメ。

XPDF のサイトでは中国語,ギリシア語などいくつかの言語設定追加リソース・パッケージが公開されている。これらを用いて多国語対応設定ファイルを作成する。以下のシェルスクリプトを実行すれば,パッケージをダウンロード・展開した上で,カレントディレクトリに xpdfrc を生成する。これを $HOME/.xpdfrc として格納する。次に,パッケージのリソース xpdf-japanese 等を XPDF 管理ディレクトリ (FreeBSD なら /usr/local/share/xpdf) にコピーする。これで,pdftotext により,日本語のほか簡体中文,繁體中文,韓国語,ロシア語,ギリシア語,アラビア語,ヘブライ語などの Unicode テキストが出力できるようになる。ただし,この実行で生成された xpdfrc には PDF 表示の際に必要となるフォント定義がないので,あくまで pdftotext テキスト変換用途と理解いただきたい。表示も含めた設定は XPDF ドキュメントを参照して displayNamedCIDFontTT 定義に好みの TrueType, OpenType フォントを指定するなりして調整してほしい(私は UNIX 環境での PDF 表示は Adobe Reader を使っているのでこのへんは放置している)。

#!/bin/sh
# Download XPDF language packs
WGET="wget -nH -nd "
XPDFSITE="ftp://ftp.foolabs.com/pub/xpdf"
# XPDFETC は xpdfrc があるディレクトリに変更する
XPDFETC="/usr/local/etc"
$WGET $XPDFSITE/xpdf-arabic.tar.gz
$WGET $XPDFSITE/xpdf-chinese-simplified.tar.gz
$WGET $XPDFSITE/xpdf-chinese-traditional.tar.gz
$WGET $XPDFSITE/xpdf-cyrillic.tar.gz
$WGET $XPDFSITE/xpdf-greek.tar.gz
$WGET $XPDFSITE/xpdf-hebrew.tar.gz
$WGET $XPDFSITE/xpdf-japanese.tar.gz
$WGET $XPDFSITE/xpdf-korean.tar.gz
$WGET $XPDFSITE/xpdf-latin2.tar.gz
$WGET $XPDFSITE/xpdf-thai.tar.gz
$WGET $XPDFSITE/xpdf-turkish.tar.gz
# Expand archives
for i in *.tar.gz; do tar zxvf $i; done
# make xpdfrc
cp $XPDFETC/xpdfrc .
for i in `find . -name "add-to-xpdfrc"`
do cat $i >> xpdfrc; done

インデキシング用シェルスクリプト

最後に私が自サイト用に作成したインデキシング用シェルスクリプトを掲載しておく。Mac OS X Snow Leopard 環境である。HTML ソース Subversion 管理エリアからワークツリーに更新ファイルをコピーし,ワークツリーでインデキシングしたのち,Mac 上の Apache22 cgi-bin 試験環境にインデックスファイル default.idx をコピーする。これでできた Mac 上の default.idx をそのまま FreeBSD サーバの msearch 環境に転送して公開するという運用形態である。

私は自サイトの HTML 等公開コンテンツを Subversion でバージョン管理しており,ソースを commit すると Subversion の commit スクリプトが動作して,自動的に更新コンテンツを Apache22 のドキュメント・ツリーにコピーするようにしている。このスクリプトを変更し,commit のタイミングで msearch インデクス作成スクリプトを呼び出して,検索インデクスを自動的に更新することもできる。crontab に登録して定時自動実行するのもよいと思う。

上記の PDF テキスト変換以外にも,HTML の iso-2022-jp to UTF-8 変換なども実行内容に含まれている。シェル内の各パス設定,サイト設定は私の環境そのままなので,もしこれを活用する方がいらっしゃるのなら,自分の環境に応じて書き換えないといけない。もちろん,中味をよく確認し,私のいい加減なコードにヘンなところがあれば手直しいただいたほうがよい。

#!/bin/sh
# -*- coding: utf-8; -*-
# msearch index generator for ISOLDE
# - coded by isao yasuda, 1 Apr. 2011
#
# DESCRIPTION
# -----------
# 1.前回タイムスタンンプより新しいページをSRCからWRKに格納する。
# 2.JISコードのページをUTF-8に変換して格納する。(nkf, sed)
# 3.PDFをテキスト変換してWRKに格納する。
#     rc OK: .pdf の内容はテキストファイル 
#     rc NG: .pdf, .pdf.txt を削除する
# 5.テキスト変換 OK のものの制御コードを削除する。(chkucntlchr)
# 4.WRKでインデックスを生成する。(genindex.pl
# 5.インデックスをWRKからPUBに格納する。
#
# CAUTION
# -------
# 1.初期作成時はファイル数が多いのでWRKにsite treeをコピーしておく。
#
 
# SRC: ページソースエリア
# WRK: ワークエリア
# PUB: 公開エリア (ここでは触らない)
WWW=/usr/local/www/apache22
SRC=/home/isao/src/noxinsomniae
PUB=$WWW/data
CGI=$WWW/cgi-bin/msearch
WRK=/home/isao/var/webindex/website
MSE=/home/isao/var/webindex/msearch
STP=/home/isao/var/webindex/stamp
TMP=/home/isao/var/webindex/tmp
UCK=$MSE/chkucntlchr
NKF=/usr/local/bin/nkf
PDFTOTEXT=/usr/local/bin/pdftotext
 
echo "********************************************************"
echo "*  msearch Index Generation Start `date '+%Y/%m/%d %H:%M:%S.'`  *"
echo "********************************************************"
# Copy SRC to WRK
echo "*  New Files Archiving."
cd $SRC
find -L . -newer $STP -type f | grep -v '.svn' |\
xargs tar cf - | ( cd $WRK; tar xvf - )
cd $WRK
 
# Convert iso-2022-jp to utf-8
echo "*  Convert ISO-2022-JP pages to UTF-8 pages."
cd $SRC
for i in `find -L . -newer $STP -name "*.html"`
do
    $NKF -w $i |\
    sed -e 's|charset=[Ii][Ss][Oo]-2022-[Jj][Pp]|charset=UTF-8|g' > $WRK/$i
done
 
# PDF format conversion
echo "*  Convert PDF to TEXT by pdftotext (XPDF)."
cd $WRK
for i in `find -L . -newer $STP -name "*.pdf"`
do
    $PDFTOTEXT -enc UTF-8 -nopgbrk $SRC/$i $i.txt
    if [ $? -eq 0 ]; then
        echo "**  $PDFTOTEXT $i OK."
        $UCK < $i.txt > $i
        if [ $? -eq 2 ]; then
            echo "**  $i is empty. Ignore."
            rm -f $i
        fi
    else
        echo "**  $PDFTOTEXT $i NG. Ignore."
        rm -f $i
    fi
    rm -f $i.txt
done
 
# add BOM to text files
echo "*  Add BOM to TEXT files."
cd $WRK
for i in `find -L . -newer $STP -name "*.txt" -or -name "*.tex"`
do
    $UCK < $i > $i.tmp
    if [ $? -eq 2 ]; then
        echo "**  $i is empty. Ignore."
        rm -f $i
    fi
    mv $i.tmp $i
done
 
# rm svn control
cd $WRK
find . -name ".svn" -or -name ".#*" | xargs rm -fr
 
# Indexing
echo "*  Execute Indexing by genindex.pl. PARAM:"
echo "*   1 インデックス名前:        default"
echo "*   2 インデックス対象DIR:     $WRK"
echo "*   3 インデックス対象URL:     http://yasuda.homeip.net/"
echo "*   4 インデックス対象拡張子:   .html,.txt,.pdf,.tex"
echo "*   5 非インデックス対象DIR:   admin,common,css,archives"
echo "*   6 非インデックス対象拡張子: (指定無し)"
echo "*   7 非インデックス対象KWD:   (指定無し)"
echo "*   8 ランキング方法:         最終更新日時降順(1)"
echo "*   9 alt属性の文字:         指定しない(0)"
cd $MSE
./genindex.pl <<EOM
default
/home/isao/var/webindex/website
http://yasuda.homeip.net/
.html,.txt,.pdf,.tex
admin,common,css,archives
 
 
1
0
EOM
 
if [ $? -eq 0 ]; then
    echo "*  Index Generation Succeeded."
    ls -l $MSE/default.idx
    echo "*  Now Copy default.idx to $CGI."
    cp -p $MSE/default.idx $CGI
    # STAMP modify
    SDT=`ls -l $STP`
    echo "*  Previous Update: $SDT"
    touch $STP
    SDT=`ls -l $STP`
    echo "*  Now Updated:     $SDT"
else
    echo "*  Index Generation Something bad."
    ls -l $MSE/default.idx
fi
 
echo "*  Procedure Ended. `date '+%Y/%m/%d %H:%M:%S.'`"
# end of script

大手町,寄り道

午前中,とある顧客と会議があった。東京駅日本橋口すぐそばの日本ビルヂング。名前からして古いビジネスビルで,昔の丸ビルのように,高層ではないが広大な敷地を占有している。

会議のテーマはシステムの法改正対応について。省庁の公報に掲載されているが,現在の「不作為」菅内閣のあの体たらくのおかげで法審議がまったく進んでいないある案件について(「不作為」だけなら役人が政治家を鼻で嗤いながら頑張るんだろうけど,この内部抗争で法律を成立させる本来の仕事がガタガタなんである)。「どうも今年度成立は無理そうだ」—「時期を決められないので困りましたね」というような議論になった。同じような悩みに入っている企業は多いはずである。DB にある国コード・コンスタントについても,「中東のいまの状況じゃまた新しいコードが出て来る可能性大ですね」のようなホットな話題が出た。流動的な状況について,とりあえず顧客と方針だけは立てることができた。

打合せが終わって,この暖かい陽気にすぐ帰社する気にもなれず,飯を食ったあと丸の内 OAZO の丸善に寄り道した。サラリーマン風景としてよくニュースの背景映像で用いられる東京駅丸の内北口も,この暖かいお午時,なんとものどかであった。この本屋は開店当初から気にはなっていたんだけど,東京駅で立ち寄る本屋は八重洲ブックセンターと決まっていたこともあり,じつは今回はじめて覗いてみたんである。なかなかの品揃え。音楽関係のコーナーで『バッハの暗号』なる本を見つけ少し立ち読みし,次にコンピュータ関係の書架の間を歩いた。奥村先生の『改訂第 5 版 美文書作成入門』のできたてのほやほやの第二刷が並んでいて,おおさすがだと思った(川崎の丸善ではまだ第一刷が並んでいたから)。第一刷にあった誤植がきちんと訂正されていた。

本屋で一時間も時間を潰してしまった。勤務時間中の寄り道としてはさすがに自責の念に駆られた。通勤定期の経路上,もっとも安上がりの山手線・新橋経由で帰社。新橋駅ホームで,お茶を手に会社に急ぐガッキーの広告ポスターに目が止まった。もう春ですねぇ,とガッキーにご挨拶。いかん,急がなくっちゃ!
 

20110224-marunouti3.png

帰宅してニュースを見たら,ニュージーランドの不幸な地震災害の報道は当然としても,どこもかしこも小向美奈子・覚醒剤取締法違反のネタ。ついこの間までは海老蔵のケンカ,その前は朝青龍のケンカ,またその前はノリピー,押尾学裁判。この国の報道は狂っている。昔は芸能人のクスリや賭博ネタは下劣週刊誌の領域だったのである。新聞記者は,危ない職業人たちの淫微な「話題」と,国民に知らしめるべき事実とをきちんと峻別していたはずだ。それがいまやボーダレスになっている。こんな見識のない週刊アサヒ化した大マスコミは,そのうちインターネットの真のボーダレスによって取って代わられればよい。

先日,スポルト見たさでフジテレビを点けたら,滝クリのいなくなったニュース・ジャパンが放映中。菅内閣と民主党の混乱についてフジの解説委員が「いまの政治家はレベルが落ちた」と嘆じていた。「何言ってるんだ,小沢問題を焚き付けているのはいったい誰なんだ? 政治のくだらない側面ばかりを伝えるお前たちマスコミの質が地に落ちたことが,この政治レベル低下の元凶じゃねえか」と,唾を吐きかけたくなってしまった。

Old Standard Cyrillic Fonts

ロシアの LaTeX メーリングリスト CyrTeX-ru投稿 #9606 に Old Standard キリル・フォントを LaTeX で使う話題が上がっていた。興味深かったので,私もインストールして使ってみた。

Old Standard フォントは Шрифтовое семейство Old Standard サイトの説明によれば,古典文献学,聖書学,中世史学等の人文科学研究文献に適した多言語フォントとある。OpenType フォントはキリル文字のほか,古スラヴ文字,アクセント付きラテン文字,複式アクセント付きギリシア文字も含んでいる。つまりロシア語旧正書法の文字をも含んでいることになる。もともと Antiqua, New Standard 系のフォントのようである。

Old Standard フォントを LaTeX で使うには二つの方法がある。[1] autoinst による方法と,[2] CyrTeX-ru #9606 リンクにある OldStandard-source.7z を用いた方法である。ただし,いずれの方法においても,ギリシア文字の取扱いは考慮されていない。

[2] では T2A, T1, TS1 フォントエンコーディングが考慮されている。イタリック書体のとき ; (セミコロン) が出力できない問題がある(生成された Type1 フォントのエンコーディング・バグのようである)。これに対し,[1] の方法は T2A, T1, TS1 のほか,古スラヴ文字 T2D エンコーディングが利用可能だし,[2] のセミコロン問題がない。そういう意味で私は方法 [1] を推奨する。導入の手間は前提ツール次第であって,すでにツールが揃っていればどちらの方法もそれほど面倒ではない。[1] は autoinst 関連ツール(『Хартия, Эвристика フォント: Autoinst によるフォント組込み』にメモを残したので,そちらもご覧ください),[1], [2] ともに LCDF ツールを必要とする。

簡単に [1], [2] の UNIX 系システムでの導入方法をメモしておく。ptexlive-2009 環境である。端末操作は tcsh シェルである。私は Mac OS X Tiger, Snow Leopard で実施したが,Linux, FreeBSD でも同じ操作でよいはずである。

autoinst によるインストール

  1. Загрузка шрифтов (フォント・ダウンロード) サイトから oldstandard-2.0.2.otf.zip をダウンロードし,解凍する。
  2. 解凍したディレクトリで autoinst を実行する。--encoding オプションに T2D を指定するためには,t2d.enc エンコーディング・ファイルが予め TeX ツリーに格納されていなければならない。このファイルは PSCyr-0.4-beta フォント・パッケージなどで入手できる(ここにインストール・メモを記した)。
  3. % autoinst --encoding=T2A,T2D,T1,TS1 *.otf

  4. スーパユーザで以下を実行する。autoinst が生成した LaTeX リソースを TeX ツリーに格納しているだけである。これら一連のオペレーションを行うシェルスクリプト autoinst-install.sh を落として使っていただいてもよい。
  5. # setenv TEXDIR /usr/local/texlive/texmf-local
    # mkdir -p $TEXDIR/{fonts/map/dvips,tex/latex}/OldStandard
    # cp -p *.sty *.fd $TEXDIR/tex/latex/OldStandard
    # cp -p *.map $TEXDIR/fonts/map/dvips/OldStandard
    # cd $HOME/.texlive2009/texmf-var
    # find . -name lcdftools -type d | xargs tar cf - | ( cd $TEXDIR; tar xvf - )
    # mktexlsr
    # updmap-sys --enable Map=OldStandard.map

  6. 使い方は,通常のロシア語用 LaTeX 原稿のプリアンブルに \usepackage{OldStandard} を追加すればよい。ロシア語旧正書法テクストを直接入力する場合は,以下のように utf8x inputnec 及び T2D エンコーディングの設定が必要である。処理結果イメージをそのあとに掲げておく。原稿及び PDF もリンクしておく。古風な味わいのあるフォントである。
  7. % -*- coding: utf-8; -*-
    % OldStandard Cyrillic Fonts 
    \documentclass[b5paper]{article}
    \usepackage[T2D,T1]{fontenc}% T2D fontenc
    \usepackage[utf8x]{inputenc}% ucs
    \usepackage[russian]{babel}
    \usepackage{OldStandard}
    \pagestyle{empty}
    \setlength{\textwidth}{100mm}
    % 以下 T2D 用設定
    \def\cyrillicencoding{T2D}% russianb.ldf に T2D 指示
    \makeatletter% \cyrii 互換命令
    \def\@td{T2D}% 
    \let\CYRIItmp=\CYRII% upper case
    \let\cyriitmp=\cyrii% lower case
    \def\cyrii{\ifx\cf@encoding\@td\cyrizhe\else\cyriitmp\fi}%
    \def\CYRII{\ifx\cf@encoding\@td\CYRIZHE\else\CYRIItmp\fi}%
    \makeatother%
    \begin{document}
    Вопросъ о разрывѣ Татьяны съ Онѣгинымъ, несмотря на всю
    ясность. Пушкинскаго стиха, выросъ у насъ въ своего рода 
    \glqq гамлетовскую проблему\grqq,
    къ которой постоянно возвращается критическая мысль.
     
    Онъ, по выраженію Достоевскаго, имѣетъ въ нашей литературѣ
    \glqq своего рода исторію весьма характерную\grqq.
      
    Иначе говоря, вокругъ него сталкивались и боролись 
    различныя враждующія теченія соціально-политической мысли.
     
    И совсѣмъ не случайно выразителями двухъ наиболѣе 
    противоположныхъ взглядовъ на этотъ предметъ являются 
    представители враждующихъ міросозерцаній
    "---соціалистъ-радикалъ Бѣлинскій и 
    націоналистъ-славянофилъ Достоевскій.
     
    \vspace{1em}%
    \small%
    \hfill%
    \parbox[t]{.8\textwidth}{%
    \textit{А. И. Ванновский}~~Зерколо судьбы. (Сон Татьяны.)\\
    в кн.: \textit{С. А. Небольсин}~~Пушкин и европейская традиция. 
    Историко-теоретические работы. М. 1999.}%
     
    \end{document}

    20110210-oldstandard.png


OldStandard-source.7z によるインストール

  1. http://narod.ru/disk/4873172001/OldStandard-source.7z.html から OldStandard-source.7z をダウンロードする。解凍には 7-Zip 圧縮をサポートしたアーカイバが必要である。
  2. Windows MikTeX ユーザなら,添付の fos-FontLab.bat を実行すればよいはずである(私は未確認)。UNIX ユーザは仮想端末から以下を順次実行する。まず,解凍した OldStandard ディレクトリで以下を実行する。これでフォント・リソースが生成される。fos-fontgen.sh としてシェルスクリプトにしたので,これを使ってもよい。
  3. % latex fos-drv.tex
    % latex fos-map.tex
    % foreach i (*.pl)
    foreach? set BS=`basename -s .pl $i`
    foreach? pltotf $BS.pl $BS.tfm
    foreach? end
    % foreach i (*.vpl)
    foreach? set BS=`basename -s .vpl $i`
    foreach? vftovf $BS.vpl $BS.vf $BS.tfm
    foreach? end
    %

  4. スーパユーザでリソースを TeX ツリーにコピーし,マップ登録を実行する。fos-install.sh としてシェルスクリプトにしたので,これを使ってもよい。
  5. # setenv TEXDIR /usr/local/texlive/texmf-local
    # mkdir -p $TEXDIR/{fonts/{tfm,vf,afm,type1,map/dvips},tex/latex}/OldStandard
    # cp -p *.tfm $TEXDIR/fonts/tfm/OldStandard
    # cp -p *.vf $TEXDIR/fonts/vf/OldStandard
    # cp -p *.afm $TEXDIR/fonts/afm/OldStandard
    # cp -p *.pfb $TEXDIR/fonts/type1/OldStandard
    # cp -p fos.map $TEXDIR/fonts/map/dvips/OldStandard
    # cp -p *.fd $TEXDIR/tex/latex/OldStandard
    # mktexlsr
    # updmap-sys --enable Map=fos.map

  6. 以上でインストールは完了。使い方は通常のロシア語 LaTeX 原稿に \renewcommand{\rmdefault}{fos} を追加すればよい。ただしこの場合,T2D エンコーディングは使えない。また,dvipdfmx で PDF を生成する際,イタリックのセミコロンがエラーになるので注意。

誕生日・Xmas, Русская Икона

今日は今上陛下の御誕生日。うちの大学一年になる息子も今日が誕生日。可哀相に,誕生日とクリスマスが近接しているために,お祝いはいつも同時になってしまい,本人は少し損をした気になっているのかも知れない。

とういうわけで今夜は,これからお祝い,プレゼント交換をすることになっている。ところが,肝心の息子はこれからアルバイト。妻,娘と私の三人だけで川崎駅近くで焼き肉を食いに行くことになった。明日か明後日に家族皆でケーキでも食うか。

昨日,仕事の帰りに家族へのプレゼントを仕入れた。いつものように本,レコード。芸がないが,子供たちが自分ではまず買わないだろうものを選んだ。ラッピングは昨年買ったものが残っているはずだと思ったが,今日午,包装しようと探したけどどこにしまったのかまったく思い出せず。探すのをあきらめて,仕入れた Tower Records と丸善の袋を使うという体たらく。自作ロゴを印刷したシールを貼って取り繕った。

妻が来年のカレンダーを買って来てくれた。勤務先出版社のすぐ近くにあるナウカ神保町店で,Русская Икона (『ロシアのイコン』) を見つけて来たんである。Благовещение, XVII в. (『受胎告知』, 17 世紀),Андрей Рублев の描いた Сретение (『ハリストス迎接』, 1399 頃) など,美しいイコンを集めた 2011 カレンダーである。ロシアの祝日やロシア正教の聖日が載っている。

そんなわけで,友人の皆様,クリスマス,来る新年をお喜び申し上げます。イコンにちなんで教会スラヴ語風メッセージをお送りします。LaTeX OldSlav 教会スラヴ語パッケージで組んで,Ghostscript で EPS アウトラインを取ってから Adobe Illustrator CS で jpeg にしました。

% eplatex xmas.tex
% pdvips -Ppdf -E -D 10000 xmas.dvi -o tmp.eps
% gs -dNOPAUSE -dBATCH -sDEVICE=epswrite -r10000 -sOutputFile=xmas.eps tmp.eps
 

2010-xmas.png
 

20101223-xmas.png

URL encode in LaTeX

LaTeX でロシア語テクストを含む URL を出力しなければならないとき,url パッケージの \url 命令だと,キリル文字が出力できない。hyperref パッケージの \href{URL}{text} 命令を使って,text 部にロシア語テクストを記述すれば,これが可能となる。ところが,後者の場合でも,URL 部にロシア語 URL をそのまま指定しても,PDF にした際にそのリンクから当該リソースに飛んでくれない。この URL 部にはエンコード形式,つまり,ロシア文字を 1 オクテットずつ %xx の十六進数とした形式を指定しておかなければならないようである。

URL エンコードを行うツールはあちこちに転がっていて,Web なら http://www.tagindex.com/tool/url.html などの便利なサイトがある。Emacs 用の Elisp も探せばあるかも知れない。でも,LaTeX で,この URL エンコードを埋め込むとなると,% 文字が含まれるため,これをいちいちエスケープする手間が別途発生し,これまた面倒である。そこで,これくらいならツールを探す時間の間に出来てしまうと思い,自前で LaTeX 向け UTF-8 前提 URL エンコード・ツールを作ってみた。Perl である。U+0080 以上の UTF-8 文字を URL エンコードするので,ロシア語以外に日本語,ドイツ語などを含む URL にも適用できるはずである。同じ必要に駆られる方もいらっしゃると思うので,以下にそのコードを掲載しておく。ここにも置いておくので,ダウンロードして使っていただいてよい(無保証)。

#!/usr/bin/perl -w
# -*- coding: utf-8; mode: cperl; -*-
#  URL encoding: convert chars over U+0080 to format %hex.
#  Usage: urlenc [ -l ] < stdin (url text)
use strict;
use utf8;
use Getopt::Std;    # command line processing
use File::Basename; # get file basename
 
# command line
my %opts = ('l' => 0);
Getopt::Std::getopts('l', \%opts) ||
    die "Usage: " . basename($0) .
    " [ -l ] \< (stdin)\n  -l: insert \\ before % for LaTeX\n";
my $sfx = "%"; $sfx = "\\" . $sfx if ($opts{'l'});
 
# hex format
while (<STDIN>) {
    utf8::decode($_);
    my $enc = "";
    foreach my $chr (split(//, $_)) {
        if ($chr ge "\x{0080}") {
            utf8::encode($chr);
            foreach my $bchr (split(//, $chr)) {
                $enc .= $sfx . sprintf("%x", ord($bchr));
            }
        } else {
            $enc .= $chr;
        }
    }
    print $enc;
}

Perl コードはこれだけである。標準入力から読んだ URL 文字列のうち U+0080 以上を %xx 形式に変換して,標準出力に書き出す。オプション -l を指定すると LaTeX 向けに \%xx とエスケープした形で出力する。このプログラムを urlenc と名付けて,パスの通ったところにコピーして利用する。Mac OS X ターミナルでの実行例を以下に示す。

url-term.png

Emacs から利用する場合は,以下の内容を .emacs に記述し,関数定義を C-x C-e で Emacs に認識させるか,Emacs を再起動すれば,urlencode 命令が利用可能となる。ウラで上記 urlenc プログラムが動くので先きにこれを組込んでおくこと。urlenc の絶対パスは利用者の環境に応じて変更する必要がある。LaTeX 原稿において変換したいテクストをリージョン設定し,M-x urlencode RTN とすれば,当該リージョンが URL エンコード変換される。Emacs の set-default-coding-systems'utf-8 にセットしておかなければならない。

;;
;; URL encoding for LaTeX
;;
(set-default-coding-systems 'utf-8) ;; すでに設定されていれば不要
;;
(defun urlencode (start end)
  "URL encoding for LaTeX"
  (interactive "r")
  (call-process-region
   start end
   "/usr/local/bin/urlenc" ;; urlenc の絶対パスを指定
   t (list t nil) nil
   "-l") ;; urlenc LaTeX 用オプション
  )

Emacs 上での変換の様子を以下に示す。

url-emacs.png

藤田眞作先生の新刊マクロ本

藤田眞作先生の『LaTeX2e マクロ作法』が出た。私は LaTeX の魅力に憑かれたこの 15 年,藤田先生の『LaTeX マクロの八衢(やちまた)』,『LaTeX 本作りの八衢』に大いにお世話になって来た。これらは現在の LaTeX 3 よりも古い世代の LaTeX 2.09 に準拠しており,少し古色蒼然としたきらいがあり,すでに絶版となっていた。『LaTeX2e マクロ作法』は,これら『八衢』シリーズを襲う,文字通り新しい LaTeX2e に基づく待望の LaTeX マクロ本である。

私は本屋でざっと通読したレベルであるが,二冊の『八衢』で述べられていた内容をうまく統合して,より LaTeX 流マクロ作法に重点を置いた(『八衢』はどちらかというと TeX 流ではないだろうか)わかり易い解説だと思った。総 652 頁という大著である。LaTeX マクロを究めたい人で,『八衢』シリーズを持っていない方にぜひお勧めする。

『八衢』シリーズは確かに見た目に古びてしまったけれども,そもそも TeX の核は LaTeX2e になろうとも変わることがないので,記述は本質的に現在でも充分通用する。おまけに旧版の版形は新版の B5 変形版と比較すると A5 版であって,よりコンパクトなところが私の好みに合っていた。最新 LaTeX に照らして新参者が『八衢』シリーズに違和感を覚えるとしたら,\documentclass となることころが \documentstyle となっていることくらいではないだろうか。文字コードを直接指定するマクロ例があるけれども,これも upLaTeX では誤動作を引き起こしはしても(upTeX は内部 Unicode 化がなされているので),既存資産の継承にこだわって開発されている ptexlive なら,問題なく動作するはずである。そういうこともあり,私は新刊本をすぐ入手したいとはあんまり思っていない。後継の書籍がやっと出て,新しい読者にとって有益であることを確信するところである。

藤田先生の著書の特長は,もちろん何よりも,採り上げられたテーマの的確さ(超絶技巧よりも,出版文化に根ざした「使える」技術を目指しているところ)と,示された LaTeX マクロ・コード作法の巧とにある。でも,それだけではなくて,日本語の文章がじつにこなれていて,そこらへんのコンピュータ書籍を読んでいて感ずる理科系的独りよがりがまったくないところも,大いなる美点なのである。「年の功」などという失礼を口にしたくはないけれども,藤田先生の文章には若い技術者にない嗜みがある。

LaTeX のマクロを究めたい人に。私はロシアの LaTeX 関係の書籍もチェックしているけれども,この手の LaTeX マクロ本が脈々と出版される点で,日本の LaTeX 文化のレベルの高さを思い知るのである。
 


Khartiya, Heuristica LaTeX packages

先日書いた『Хартия, Эвристика フォント: Autoinst によるフォント組込み』で OpenType フォントから autoinst を用いて LaTeX タイプセットに必要な諸々のファイルを生成する方法を探ってみた。でもじつは,こんな面倒なことをしなくても,これらフォントのダウンロード・サイトには LaTeX 用のパッケージ一式が公開されていた。Хартия: http://code.google.com/p/khartiya/downloads/list から khartiya-0.2-tex.tar.xz を, Эвристика: http://code.google.com/p/evristika/downloads/list から heuristica-0.3-tex.tar.xz を取得して,TeX ツリーに展開すればよい。オペレーションは以下のとおり。$TEXDIR にはインストールしたい TEXMF トップディレクトリを指定する。~/Downloads は,アーカイブをダウンロードしたディレクトリを示す。

% mkdir -p ~/tmp/khartiya-heuristica
% xz -dc ~/Downloads/khartiya-0.2-tex.tar.xz |\
  tar xvf - -C ~/tmp/khartiya-heuristica/
% xz -dc ~/Downloads/heuristica-0.3-tex.tar.xz |\
  tar xvf - -C ~/tmp/khartiya-heuristica/
% su -m
# cd ~/tmp/khartiya-heuristica/
# tar cf - ./doc ./dvips ./fonts ./tex | ( cd $TEXDIR; tar xvf - )
# mktexlsr
# updmap-sys --nomkmap --enable Map=khartiya.map
# updmap-sys --enable Map=heuristica.map

フォントを使うには LaTeX 原稿に \usepackagekhartiya.sty, heuristica.sty を指定する。autoinst で自動生成した場合とは異なり,LaTeX パッケージではマクロファイル名の先頭が小文字になっている。

これら LaTeX パッケージは T2A キリルエンコーディングのほか,T1, TS1 用のフォント定義を含んでいる。autoinst によれば autoinst --encoding=T2A,T1,TS1 *.otf で生成した場合と同等になっている。textcomp パッケージと併用すると,\textcelsius などのマクロを Хартия, Эвристика フォントで出力することができる。ただし,これらフォントは textcomp のすべての文字を収録しているわけではない(例えば \textleaf やオールドスタイル数字: \text*oldstyle などは含まれない)ので注意が必要である。私がこの前書いた記事では,autoinst の --encoding オプションに TS1 を指定していないので,その場合,textcomp の出力は標準の TC あるいは Latin Modern フォントが拾われるはずである。どちらがよいかは利用者次第であろう。
 

* * *

今日の朝日新聞夕刊スポーツ面で『鄭大世 賛辞と批判』というコラムを読んだ。北朝鮮代表としてワールドカップに出場した彼は,川崎フロンターレからドイツ二部リーグのボッフムに移籍した。そこでチームの得点頭となる活躍をする一方で,警告で退場するなどの迷惑ぶりでも目立った選手になっている,そういう記事だった。ファイティング・スピリットに溢れる鄭大世らしいこの消息に,うれしくなってしまった。

南アフリカ・ワールドカップののち,海外に移籍する日本人選手がいきなり増えた。香川真司選手などドイツ・ブンデスリーガ・ドルトムントで大活躍している。内田篤人選手のアシストであの元スペイン代表ラウールがゴールした,なんていう話を聞くと,サッカーでもワールドクラスの話題に日本人が食い込んで来る時代が来たんだ,とうれしくなってしまう。70 年代,80 年代,日本がワールドカップ出場とはまったく無縁であった時代,日本人が指をくわえてワールドカップを観ていた時代を知っているだけに,感無量である。

こういうところからも,私たちの世代の日本人よりもいまの若い日本人のほうが優れているということを実感するのだ。そういう点がいちばんうれしい。

昨日,ロシアの LaTeX ユーザ・メーリングリスト CyrTeX-ru に,Хартия (Khartiya) 及び Эвристика (Heuristica) キリルフォントの新しいバージョンがリリースされたとの投稿があった(#9285: "Новые версии шрифтов Хартия и Эвристика" posted by Андрей Панов)。私はこのフォントを使ったことがなかった。ダウンロードして Mac OS X Snow Leopard 上の ptexlive で使用してみた。そのメモをしるしておく。

Хартия, Эвристика フォントの配布アーカイブは OpenType フォントを含むだけで,LaTeX で使うためのリソースを添付してはいない。すなわち,.fd (フォント定義ファイル), .tfm (tfm フォントファイル), .map (マップファイル), .sty (スタイルファイル) などの各種ファイルは,ユーザが自分で準備しなければならない。しかし,LaTeX コミュニティにはそのための便利なツールが用意されている。fontools パッケージがそれである。CTAN: fonts/utilities/fontools/ から入手可能である。autoinst は fontools プログラム群のフロントエンドとして各種 LaTeX リソースを一操作で生成してくれるプログラムである。

fontools は ptexlive ならはじめからインストールされている。もし,自分のシステムに組込まれていなければ,アーカイブを取って来て,bin/ ディレクトリ下にある perl プログラムをパスの通ったところにコピーすればよい(実行権限が付加されているか確認のこと)。fontools は Eddie Kohler 氏による LCDF TypeTools (otftotfm プログラム) を前提とするので,こちらを先にインストールしておく。ptexlive ならばこちらもすでに導入済みのはずである。これらのツールは W32TeX 用のアーカイブも用意されていると思う。

上記ツールの組込みが完了していれば,autoinst を用いたフォントインストールは次のように行う。

まず Хартия, Эвристика フォントパッケージをダウンロードする。それぞれ http://code.google.com/p/khartiya/, http://code.google.com/p/evristika/ から,khartiya-otf-0.2.tar.xz, heuristica-otf-0.3.tar.xz を取得する。その後,xz, tar で解凍する。ここでは $HOME/tmp/{khartiya, heuristica} に展開するものとしている。

% mkdir -p ~/tmp/{khartiya, heuristica}
% xz -dc ~/Downloads/khartiya-otf-0.2.tar.xz | tar xvf - -C ~/tmp/khartiya
% xz -dc ~/Downloads/heuristica-otf-0.3.tar.xz | tar xvf - -C ~/tmp/heuristica

それぞれのディレクトリにおいて autoinst を実行する。キリルフォントなので,T2A エンコーディングを指定する。

% cd ~/tmp/khartiya
% autoinst --encoding=T2A *.otf
% cd ../heuristica 
% autoinst --encoding=T2A *.otf

これが終了すると,それぞれのディレクトリに .sty, .map, .fd ファイルが生成されているはずである。そして同時に $HOME/.texlive2009/texmf-var/fonts/.../lcdftools/ 下に Type1 フォント,tfm フォント,vf フォント,.enc エンコーディングファイルといった LaTeX 用リソースが生成されているはずである。この段階で, autoinst を実行したユーザは .sty, .map, .fd ファイルを参照できるところなら LaTeX でこれらフォントを使ったタイプセットが可能になる。当該ユーザ以外にも LaTeX システム全体で使えるようにするため,次に,これらのリソースを TeX ツリーにコピーし,さらにマップ登録を行う。以下のオペレーション中の $TEXDIR は,インストールしたい TeX ツリーのトップディレクトリ(/usr/local/texlive/texmf-local 等)に読み替えていただきたい。

% cd ~/.texlive2009/texmf-var/
% find . -name lcdftools | xargs tar zcvf ~/tmpfonts.tar.gz
[ 自動生成されたリソース一式を "lcdftools" ディレクトリ名で探索し,抽出 ]
% su -m
# cd $TEXDIR
[ $TEXDIR は /usr/local/texlive/texmf-local 等に読み替えること ]
# tar zxvf ~/tmpfonts.tar.gz
# mkdir -p ./{fonts/map/dvips,tex/latex}/lcdftools/
# cp ~/tmp/khartiya/Khartiya.map ./fonts/map/dvips/lcdftools/
# cp ~/tmp/heuristica/Heuristica.map ./fonts/map/dvips/lcdftools/
# cp ~/tmp/khartiya/*.{fd,sty} ./tex/latex/lcdftools/
# cp ~/tmp/heuristica/*.{fd,sty} ./tex/latex/lcdftools/
# mktexlsr
# updmap-sys --nomkmap --enable Map=Khartiya.map
# updmap-sys --enable Map=Heuristica.map

以上で導入は終わりである。今回のような方法で OpenType フォントを LaTeX で手軽に使うことができると思う。ただし,日本語フォントへの適用は,jvf 等の関係で不可ではないかと思う。

Хартия, Эвристика フォントで LaTeX 文書を組むには,プリアンブルにそれぞれ \usepackage{Khartiya}, \usepackage{Heuristica} を指定する。あとは通常のロシア語のためのパッケージ指定を行えばよい。サンプルを以下に示す。このサンプルでは両方のフォントを使用するため,ファミリ切替え用独自マクロを定義している。

% -*- coding: utf-8; -*-
% Шрифты Хартия, Эвристика 
\documentclass[b5paper]{article}
\usepackage[T2A, T1]{fontenc}
\usepackage[utf8x]{inputenc}
\usepackage[russian]{babel}
\usepackage{Khartiya}%   Хартия fonts
\usepackage{Heuristica}% Эвристика fonts
% macros for change family
\def\famkhartiya{\fontfamily{Khartiya-TLF}\selectfont}%
\def\famheuristica{\fontfamily{Heuristica-TLF}\selectfont}%
\setlength{\textwidth}{240pt}
\begin{document}
\centering{\large Russian autoinst test}
 
\vspace{2em}
\famkhartiya
\noindent Хартия Khartiya
\begin{verse}
Ты проходишь без улыбки,\\
Опустившая ресницы,\\
И во мраке над собором\\
Золотятся купола. 
\end{verse}
\hfill{\it\famkhartiya Александр Блок}
 
\vspace{1.5em}
\famheuristica
\noindent Эвристика Heuristica
\begin{verse}
Ты проходишь без улыбки,\\
Опустившая ресницы,\\
И во мраке над собором\\
Золотятся купола. 
\end{verse}
\hfill{\it Александр Блок}
\end{document}

組版結果は以下のとおり。原稿: autoinst-test.tex, 結果 PDF: autoinst-test.pdf も掲載しておく。両フォントの違いはわかりにくいかも知れない。Хартия は,д と л の形に特徴がある。

autoinst-test.png

堕落した休日

中日ドラゴンズが日本シリーズ進出を決めた。なんでセ・リーグの CS ファイナルがテレビ中継されないのかといぶかしんでいたら,今夜フジが中継していた。麻雀ゲームをしながら,本を読みながら,横目でつらつら観た。

讀賣ジャイアンツは二連敗ののち昨日初日が出て,今夜はどんな闘いを見せてくれるのか,興味深かった。やはり投手力の差が出てしまった。8 回裏,四球で追加点を献上するなんざ,愚の骨頂である。今年の讀賣を象徴するようなシーンだった。それでも,9 回表,打ちあぐねていた中日浅尾投手から下位打線でチャンスを作ると,谷が送りバントでランナーを三進させ,松本が渋いセカンドゴロでランナーを返し,ジャイアンツは土壇場で同点に追い付いた。これを見て,私はさすがジャイアンツだと感心した。

あそこで送りバントを命じるところが,阪神真弓監督と大きく異なるまさに「采配」であって,私は原監督の腹の座り方の凄さに唸らされた。真弓監督なら,あそこで代打を送って強振させ,あわよくばタイムリーヒット,逆転ランナー出塁を期待するに違いないのである。ところがコントロールのよい投手を相手にすると打ち上げて,あるいは三振して終わりの可能性が高い。ここには,どうしてそれまで打ちあぐねていたのかというマネージャとしての分析も,反省もない。プロ・スポーツで神頼み,運頼みを見せつけられるとうんざりしてしまう。こういうところからも今夜は,「簡単には負けないぞ」というジャイアンツのプロの意地のようなものを見せてもらった。

結局,中日和田選手の目の覚めるようなサヨナラタイムリーで中日が勝利した。クリーンアップが攻撃のキーとなり,投手が守りきる。この基本に忠実だった落合監督の姿勢ゆえのタイトル獲得である。阪神ファンとしても見応えのある試合だった。
 

* * *

TBS『報道特集』を観た。TBS は『朝ズバッ!』捏造スキャンダルなど感心しないことも多いけれども,特許庁情報流出問題,野中広務・機密費スッパ抜きなど,なかなか大新聞が踏み込まない部分にメスを入れ,大新聞に踊らされない特集を組んだりすることがある。特許庁収賄事件も TBS の報道を受けて特許庁が内部調査を進めるうちにあぶり出された事件だという。結局,東芝ソリューションと政治家とのつながりなどは明るみにはならなかったけど。

今日の特集は検察審査会であった。小沢さんの「強制起訴」でがぜん話題になった,11 人の怒れるアマチュア集団についてである。この制度のよい面,悪い面ともあげていて,私の眼で見る限り偏向を帯びているようには思われなかった。審査員となった人々に直接話を聞く取材あり,国会での民主党議員による検察審査会の密室性に対する問題提起ありで,何も知らず「強制起訴」を普通の立件と同じように捉えている世間知らずにはよい特集だったと思う。議決過程が秘密であるにもかかわらず,どこから漏れたのか「全会一致で起訴相当議決」などという情報が新聞に載るなんて,気味の悪い制度運用にも触れていた(秘密情報を検察がマスコミにリークしているのは明らかなのである)。審査員経験者のひとりの言から,権力者の事案については厳しくなってしまうという「市民感覚」が浮き彫りになっていた。

「法のもとの平等」,「法に厳格に立つ裁定」,「推定無罪」という法の三原則が「市民感覚」によって危険にさらされないか,とキャスターが危惧の意見を述べているところが私には印象的であった。良識あるキャスターだと感心した。法のもとには権力者も弱い一般市民もない。何の罪か,法に基づいて厳格に定義されなければ人を罰するなどもってのほかである。起訴されても判決が出るまでは,無罪として被告人を扱うべきである。この原理はまさにその通りである。

なのに。11 人の怒れる男たちの安っぽい無責任な正義感で,罪状においてプロフェショナルがその立件を断念した「灰色」の人間を「起訴」に追い込み,被告席に立たせることができるようになった。「市民感覚」で権力者を叩くことができるようになった。そして検察がそれを見越して議決を誘導し,権力の奴隷・マスコミに「全会一致」をリークし,民意が起訴を正当化したことをアピールする。こういうのを「衆愚政」というのである。人を裁く一端を担っているという恐ろしさの自覚,判断に対する責任感がこのアマチュアたちにはないのだ(そもそも裁判官には皆これがあるとも言えないけど)。この『報道特集』を観て,私は基本的にアマチュアを信用しない質だからか,検察審査会制度に対していよいよ不信感を強めた。
 

* * *

野球観戦の合間に二畳庵主人・加地伸行『漢文法基礎』(講談社学術文庫,2010 年)を読む。朱川湊人『いっぺんさん』を読了して,ちょっと一休み。『漢文法基礎』は 1984 年に Z 会の受験参考書として出版された本である。なんでこんな学習参考書が講談社学術文庫から出るのか。じつは,最近,この手の昔の「学参もの」が相次いで文庫で再刊されている。小西甚一『古文の読解』(ちくま学芸文庫),高田瑞穂『新釈 現代文』(ちくま学芸文庫)など。

何故なんだろうか。もちろん,これらの書籍は高度な内容を高校生向けに説いた,確かによい本であるけれども,ちょっとこのブームは気味が悪い。最近の学参は質が悪くて昔を見習えとでもいう主張があるのだろうか。難しいことをさも易しく説いてくれるものへのブーム(『もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら』なんて俗流本に釣られる人があまりに多いようである)があって,これらもその一端なのだろうか。違うと思う。学参のレベルが落ちているとの声も聞かないし,高等学校の国語はピーター・ドラッカーの言説とは範疇の異なるテクニカルなものである。これらの本は私が大学受験のころにお世話になったものばかりである。「ああ懐かしい」なんである。となると,どうやら私たちの世代が懐古趣味につけ込まれて単に商品の経済的ターゲットになったに過ぎないのだ,と考えざるを得ない。ま,それもよし,である。

私は漢詩が好きである。大学のころはロシア語をはじめ外国語の文献渉猟に追い回されていたためか,漢詩は大学を出てからのほうが読む機会が多くなった。頼山陽や菅茶山などの日本人の漢詩人に触れるようにもなって,なんで漢籍という日本の素晴らしい伝統が廃れたのか大いに残念だと思うにつけても,高校時代それほど得意でなかった漢文も,社会人になってから岩波全書『漢文入門』(岩波書店,1957 年初版)でふたたび学ぶようになった。藤田先生による sfkanbun パッケージによって LaTeX で漢文訓点を組めると知って以来,親しい漢文を自分でもタイプセットして面白がっている。旧字・旧仮名遣い変換ソフトウェア misima を作ったとき LaTeX 漢文訓点命令変換機能を入れたのも,Adobe Japan1 の恐るべき漢字空間(JIS X 0208 じゃ高校漢文教科書の漢字すらレパートリーが足りないのに対し,Adobe Japan1 ならカバーできてしまう)とこれに基づく OpenType フォントに魅了されただけではなく,ひとえに漢籍の組版にも思い入れがあったゆえである。

『漢文法基礎』は,「やあ,諸君,お早う」なる書き出しではじまり,よい意味で上から目線丸出しのくだけた語り口で,取っ付きにくい漢文を手取り足取り教えてくれる。書き下し文の仮名遣いや送り仮名の考え方など,学校ではきちんと整理してくれない原理のキモを徹底的に掘り下げてくれる。漢文は,中国の古典に親しむためではなく,国語の一伝統を身につけることにこそその目的がある,との説明は説得力がある。かりがね点(レ点),一二点を押さえていれば訓点の九割方を身につけたも同然,といった知見も,教育現場の豊富な経験に裏打ちされており,眼を見張らさせるものがある。高校生にはお勧めの教材である。

『漢文法基礎』はやはり高校生が読むものであって,私などはただの懐かしさで接するばかりである。「ヲ・ニ・ト(鬼と)帰る」なんて「あったあった」である。こんな書物を講談社が何故にわざわざ文庫本として再刊するのか — やっぱり,昔を懐かしむオジン,オバン心情に訴えているとしか思われない。もう一度,高校生になった気分で高等学校漢文を復習したいと思う人には絶好の本である。大学教育を受けた人で中国古典を日本人として読み解きたいと思う人には,私は岩波全書『漢文入門』をお勧めする。
 

漢文入門 (岩波全書 233)
小川環樹,西田太一郎 共著
岩波書店
* * *

北朝鮮の『アリラン』写真,130万ポンドで落札』という記事をみた(中央日報)。ここまで値段が跳ね上がるのも凄い。私も一度実際にアリランを観てみたいと思っている口である。

アリランのようなスペクタクルを前にすると,私がまず抱く思いは恐怖である。それこそアリのようにわんさかいる人間たちが等質の動作でもって一糸乱れないなんて,北朝鮮という国の全体主義ぶり,洗脳ぶりを象徴しているように思われるのである(実際はそんなことはないのだろうが)。このアリランは,あの軍事パレード同様,怖い。こんなにたくさんの人々の振る舞いが皆同じだなんて,クレイジーの印象がもっとも適切である。

しかしながら,この記事に対して嘲りしか発せられない2ちゃんねらーや Yahoo! コメンターの自己満足も — 私はまず嗤ってしまうのであるが —,やはりこれもどいつもこいつも皆同じという意味で怖い。集団主義は日本人のお家芸である。日本人もアリランのような芸当は得意ではないかと思う。二個師団くらいの自衛隊員がアリランに類した規律デモンストレーションを皇居外苑あたりでやろうものなら,諸外国は震え上がるはずである。

土屋英明『中国艶本大全』

文藝春秋社・文春新書から出ている土屋英明著『中国艶本大全』を読了。この手の本を読んでいると,妻や娘から「ほんとお父さん,エッチなんだから。エロオヤジ」と腐される。私は「うるせぇ」の一言で終わらせる。こんな面白い本は,「読んだり観たりして楽しむことと,実際に行わないと気が済まないこととの間には,千里の懸隔がある」ということを理解できる人だけが読めばよいのである。

本書は漢から宋,明の時代にかけての中国の艶情小説の概観,その代表的作品の案内である。数ある版を子細に比較検討し,岩波文庫の『金瓶梅』などは性交場面の一部が削除ないし未訳出であることなど,日本での出版・翻訳事情などをも解説している。なにより私の感心したのは,著者が理屈抜きでこのジャンルを愛し,野にありながら — 大学などというお上品な制約にとらわれず — 丹念に古書を漁り,ヴァリアントを比較し,典故を確認し,表現のレアリア (Realia) に迫ろうとする態度である。しばらく前に,山口椿著『ロベルトは今夜』所収の光野桃による解説文を読んで,「女の自由な魂の発露」だの,「頽廃と倒錯,異端のサディズム文学!」だの,「アンダーグラウンド」だのといった根拠薄弱かつ陳腐なレッテルを貼って「正当化」(頽廃,倒錯,異端,アンダーグラウンドは日本のインテリの間では無邪気な褒め言葉だ)せずにはエロを楽しめない,そういう底の浅いナイーブな教条主義に,私は吐き気を催した(ここに読後メモを残してある)。土屋は,そんな西欧かぶれのお上品な御仁たちとはまったく無縁。エロをエロとして愛する姿勢こそが本物の文藝愛好家の証であると私には思われるんである。

エロ小説が禁書扱いになった中国の伝統がわかりやすく整理されている。それゆえに散逸の憂き目をみた作品の数は測り知れないだろうということもわかる。弾圧が激しかっただけにエロの劇しさは日本のそれを優に凌駕しているという印象があった。さすが中国である。日本は伝統的にエロに寛容であったことが幸いして,日本に写本が伝えられ散逸を免れた作品は『遊仙窟』に留まらない。エロに関し,内容の劇しさでは中国に,蓄積の豊かさと大らかさでは日本に軍配が上がる,と認識させられた。それにしても本書を読むと,この分野でも日本は中国の偉大な伝統に負うところ大だったことがよくわかり,私は中国古典文学に対する尊敬をしみじみと新たにするのであった。

政府による厳しい弾圧のあるところ,表現において典故を踏むなどの奥ゆかしい仄めかしの文学技法が発達する。それは帝政時代・ソ連時代のロシア文学でも大いに適用できるあり方である。研究者は,表現がいかなる現実を踏まえその目指すところは何だったのか,すなわち表現のレアリアを,膨大な文献の渉猟,生活様式・歴史背景の理解を通して明らかにしようとする。土屋もそういう文学背景への理解を踏まえ,「判じ読み」の必要性を説いている。その読みはたいへん興味深い。『遊仙窟』の唯一の「濡れ場」について,岩波文庫・今村与志雄訳と,本書の土屋訳とを比べると,その著しい違いに驚かされる。

口を吸うたびに快感がはしり,抱きしめるたびにうれしさがこみあげた。鼻がつんとし痺れ,胸がつまった。しばらくして,眼がちらつき,耳がほてり,血管がふくらみ,筋がゆるんだ。
張文成『遊仙窟』今村与志雄訳,岩波文庫,1990 年,p. 90。
[ 髀子(ほと=女陰)に:私註 ] ぐっと食い締められ,なんともいえない心地がしたので,押しつけて奥まで入れた。先がむずむずしてきた。まつわりついてくる。あっと言う間に鈴口がしびれて雁首が熱くなり,筋張ったとたんにいってしまった。
土屋英明『中国艶本大全』文春新書,2005 年,p. 79。

まったくレアリアの理解が違う。今村による意味不明の訳文も味がないわけではないが(「うれしさがこみあげた」なんてまるで小学生の作文じみたところが,却って陰湿な具体を想像させる),実際の情景はおそらく土屋の訳文のほうが的を得ているといえよう。「鼻」はペニスの先のことだというのが土屋の「判じ読み」なのだが,確かにそう解釈しないと「血管がふくらみ,筋がゆる」むことの何たるかというレアリアが活きて来ないことがはっきりとわかる。岩波文庫に今村が付した長大な解説は作品を理解するという意味においてはいったい何だったのだろうかと思われるくらい,土屋の解説・訳文には「目からウロコが落ちた」気にさせられる。見えないものを見えるようにしてくれるわけだ。とはいえ,張文成の仄めかしの奥ゆかしさも訳文で表すことができればよいのに,という気持ちも私にはある。こうも明け透けに訳しちゃあ,やっぱゲビてるよなと。

本書は,『遊仙窟』のほか,『如意君伝』,『痴婆子伝』,『金瓶梅』,『僧尼孽海(そうにげっかい)』,『春夢瑣言』について紹介している。いずれも,そのエロ表現の特徴や儒教・老荘思想・古典文学伝統との関係,日本文学との趣味の違いについて蒙を啓いてくれ,作品の触りの訳文で滅法楽しませてくれる。本書を読めばエロ小説も現代日本の官能小説よりも中国の古典のほうが毒がありかつイヤらしさも凄いと感ずることを,私は請け合う。まぁ,そういう次第で,ある人には下品な俗流文学解説本だと映るんだろうけど,私は本書を支持します。土屋英明は中国のエロ文学の訳書,房中術に関する著書をいくつも物している。私もちょっとハマりそうである。
 

Post Scriptum.

本書を読んだあと,晩ご飯のときに子供たちに教えてやった。「中国語で『チンポ』のことを『鶏巴=チーパ』というらしいよ。なんか日本語と似てるよね。女の子が恋人を『バカねん』と軽く罵るときも『チーパ』って言うんだって。だから,中国人は『千葉県』のことを耳にするとクスクス笑うらしいよ」。受けた。おかげで,私にとって LaTeX の TIPA(国際発声記号パッケージ)もただごとではなくなってしまった。そうそう,LaTeX だってラテックス・コンドームを連想してしまうんである。

大学の友人

昨日,大学時代の友人 T から電話をもらった。私の名前を奥村先生の『pLaTeX2e 美文書作成入門』で見つけて「まさか」と思ったという。彼の声を聞くのは,長期入院した私を彼が病院に見舞ってくれて以来であった。電話では私も忘れてしまっていたような学生時代の話が彼から出て来て,私もついつい夢中になって一時間以上の男らしからぬ長電話となってしまった。

T は青森県出身,函館ラ・サールから北大理学部数学科を出てドイツに留学したのち,東京電機大学の教員となった。早稲田でも教えているという。私の専攻はロシア文学だったので,T とはまったく畑違いなのだが,音楽という趣味を通して彼と知り合うことになり,長い付き合いになった。私の恥ずかしい過去を妻以上に知っているひとりである。彼はヘタなチェロを弾いた。トスカニーニのベートーヴェンに心酔していた彼は,私とは音楽の趣味がまったく合わなかった。彼の私との共通点といえば,クラシック音楽という枠組みを除くと,何の役にも立たない学問をしているところだけだった。解析(微分・積分)の教科書を目下執筆中という。その文房具である TeX についても,いろいろ調べていて,それで『美文書』を手に取った次第だという。数学関係の出版社は TeX 入稿が当たり前である。

彼は数学を先攻していることもあり,学生時代から TeX を使っていたという。いまでこそ LaTeX に親しむ私も,大学時代は電子計算機とはまったく無縁で,理科の友人たちの計算機話はチンプンカンプンでそのあたりのことが記憶から欠落している。T によれば,北大では 1980 年代後半には HTeX (Hokudai-TeX の略であろうか) なる独自のフォーマットファイル(AMS-TeX の独自改造版だったらしい)が学内で普及していて,理科学生の一部はこれを使って論文を書いていた。この HTeX は,Leslie Lamport によるいま主流の LaTeX ではなく,Knuth 教授による TeX82 に近いプリミティブなものであっただろうと想像すると,私など足下にも及ばない TeX 道を T は歩んでいたのだと,いまさらながらびっくりした。

学生時代の私の友人で計算機を学んだ者たちは,いまより遥かに性能の劣る計算機を使っていたわけだが,やっていることはいまよりずっと高度だったのではないかと思う。いまの学生は論文作成は Microsoft Word, Excel でこと足りるので,TeX なんてよほどのことがない限り選択肢とならない。私が二年前東大に論文を提出したときも Word 形式でないと受け付けてもらえなかった。いまでは PC で動作する研究者向け科学技術関連ソフトがいくつも出回っているが,当時は大型計算機のソフトウェアはコンパイラ以外は DB / DC,ソート・マージなどのファイルユーティリティ,数値計算ライブラリなどがあるばかりで,自分の研究のために必要なすべてのアプリケーション・ソフトウェアを自分で書かなければならなかった。さらに,その研究成果である論文を,TeX で「プログラミング」して書いた。Word が TeX よりも低級だというわけではないけれども,私がここで「高度だった」というのは,使う者よりもそれを作る者の方が技術的に高い位置にいる,くらいの意味である。さらに言うと,Word よりも TeX の出力のほうが遥かに美しいということである。しち面倒くさいことを原理から学んで身につけないとならないことがらがコンピュータリテラシーに付いてまわるだけに,Fortran とアセンブラのプログラミング素養がコンピュータと付き合う第一条件であり,計算機を使うことがプログラミングに直結した時代だったのである。

T とは違うが,私の理科の友人のひとりに,理学部の恐るべきハッカー A がいて,こんなことがあった。当時,北大大型計算機センターでは日立の HITAC S-810 というスーパコンピュータが稼働していた。A は通常はフラクタルだかなんだかの解析計算をこのマシンで走らせていたが,たまに遊びのプログラムを動かしていた。EBCDIC (ASCII のような英数字だけの IBM 汎用機コード) 文字だけでアスキーアートを描画するコードを書いて,大型計算機の 133 文字 30 行の文字しか打てないラインプリンターにアスキーアートを打ち出してくれた。ラインプリンターの出力した NIP 紙(連続紙)を一定の長さで切って貼り合わせると, 3 m × 3 m くらいはあっただろう,6 畳間の壁一面のどでかい中森明菜の美しいグレースケール写真が立ち現われて,皆で「おー」と拍手喝采した。大型計算機用の画像スキャナなんてとても望める時代ではなかったのである。どういうコード・テクニックで A がこれを実現したのか,私は計算機システムの専門家となったいまでも想像できない。

T と久しぶりに話をして,そういった往時の計算機事情にいまあらためて驚きを甦らせてしまった。

MusiXTeX in Russian

先日,楽譜組版 TeX パッケージ MusiXTeX の Mac OS X Snow Leopard への導入について書いたとき,ロシア語を出力することについて少し触れた。今日はもう少し詳細にその方法についてメモをしるしておく。

MusiXTeX は Plain TeX でコンパイルできるのだが,標準では 8 bit キリル文字の入力も出力も受け付けない。キリル組版用にフォーマットファイルを生成し,これを用いて MusiXTeX の .tex ファイルを処理する必要がある。このためには Cyrillic t2 パッケージ(CTAN:macros/latex/contrib/t2/)及び ec-plain パッケージ(CTAN:macros/ec-plain/)が必要である。前者は ptexlive には初期導入されている。これらを TeX ツリー(plain-TeX から参照できる $TEXMF/tex/generic/ あたり)にインストールしておく。

キリル組版用フォーマットファイル cyrtex.fmt を生成するわけであるが,使用するキリルフォントに応じて cyrtex.cfg を修正しておく。デフォルトだと LH LCY フォントを使用する設定になっているが,LCY はどうも Type1 フォントも見当たらないし,私は LH T2A 用のフォントを使うように変更した。つまり,cyrtex.cfg をカレントディレクトリにコピーして来て,これのはじめのほうにあるフォントエンコーディング選択の指定において,\c lh/lcy/lcydefs/cm/cyrcmfnt をコメントアウトし,かつ \c la/t2a/txxdefs/ex/cyrecfnt を活かすように訂正する。変更したら,cyrtex.fmt を生成する。

% cp `kpsewhich cyrtex.cfg` .  (cyrtex.cfg をカレントにコピー) 
% emacs cyrtex.cfg &  (Emacs で cyrtex.cfg を訂正)
% tex -ini -fmt=cyrtex cyrtex.ini  (フォーマットファイル生成)

MusiXTeX プリプロセス原稿 PMX ファイルには,以下のようなコードを冒頭のマクロ定義のところ(--- で囲んで定義するところ)に書いておく。

---
% font definitions for cyrillic
% 8pt roman, bold, and italic 
\font\eightrm=larm0800 % at 8pt\
\font\eightbf=labx0800 % at 8pt\
\font\eightit=lati0800 % at 8pt\
% 9pt
\font\ninerm=larm0900 % at 9pt\
\font\ninebf=labx0900 % at 9pt\
\font\nineit=lati0900 % at 9pt\
% 10pt
\font\tenrm=larm1000\
\font\tenbf=labx1000\
\font\tenit=lati1000\
% 12pt
\font\twelverm=larm1200 % scaled \magstep 1\
\font\twelvebf=labx1200 % scaled \magstep 1\
\font\twelveit=lati1200 % scaled \magstep 1\
% Large fonts for titles : normal shaped Times-Roman fonts are applied
\font\bigfont=labx1440 % scaled \magstep2, 14pt\
\font\Bigfont=labx1728 % scaled \magstep3, 17pt\
\font\BIgfont=labx2074 % scaled \magstep4, 20pt\
\font\BIGfont=labx2488 % scaled \magstep2, 25pt\
% inputenc
\input plainenc\relax\inputencoding{koi8-r}\
...
---

これは MusiXTeX が要求する文字組版用フォント一式を LH T2A cmr に割り当てる定義である。また,最後の \input 行は,原稿の文字コードを KOI8-R とすることを示す。ロシア語テキストを Windows CP1251 で作成するなら,\inputencoding の引数に cp1251 を指定しなければならない。UTF-8 は処理できない。

さて,以上のような前振りをした上で PMX 原稿の楽曲部分を準備する。今回,ロシア語を含む MusiXTeX 組版例として,ドミトリ・ショスタコーヴィチ作曲『弦楽四重奏曲第 13 番変ロ短調作品 138』第一楽章冒頭を作成してみた。この曲はショスタコーヴィチの弦楽四重奏曲のなかで私がもっとも愛するもの。ヴィオラのモノローグの悲痛な作曲者最晩年の作品である。ウェーベルンの楽譜と比べるとかなりシンプルなので,40 小節近くを結構ラクにコーディングできた。参照した市販のスコアは Dmitri Schostakowitsch STREICHQUARTETTE op. 138 / 142 / 144, Musikverlag Hans Sikorski, Hamburg, 1978 である。この市販スコアでは表題はドイツ語なんだけど,今回の例のために私はロシア語にして組んだ。PMX 原稿 shostako_op138.pmx を掲載しておく。これを次のようにして処理する。cyrtex.fmt がカレントディレクトリにあるものとする。

% ls
cyrtex.fmt              shostako_op138.pmx
% pmxab shostako_op138
% tex -fmt=cyrtex shostako_op138
% musixflx shostako_op138
% tex -fmt=cyrtex shostako_op138
% dvips -Ppdf shostako_op138.dvi -o
% ps2pdf -sPAPERSIZE=a4 shostako_op138.ps shostako_op138.pdf

組版結果の一部は図 1 のとおり。処理結果 PDF: shostako_op138.pdf も掲載しておく。

shostako_op138.png

図 1. MusiXTeX 組版結果

ショスタコーヴィチの弦楽四重奏曲第 13 番作品 138 を収録した CD も挙げておく。ロシア現代音楽を得意とするブロツキイ四重奏団による演奏である。
 

MusiXTeX 楽譜の組版

世の中には,己の好きなことのためにはどんな困難をも克服してしまう人がいるものである。ミュージック・スコア・タイプセット・パッケージ MusiXTeX をはじめて知ったとき思ったのは,まずこのことだった。TeX でオーケストラの総譜を組もうというのだから。しかも,組版品質がまったく美しいというほかないのだから。TeX の可能性に驚いてしまうのである。

MusiXTeX は大部の英文マニュアルをみてすぐわかるとおり,奇妙キテレツ・面倒な書法を習得しなければならない。少しでも簡単に,効率よく MusiXTeX コードを入力したいという目的で PMX や M-Tx といったプリプロセッサが開発されている。PMX は MIDI データを同時生成できるほか,scor2prt というパート譜生成のユーティリティをも備えている。M-Tx は MusiXTeX プリプロセッサ PMX のさらなるプリプロセッサであり(!),歌詞パートを効率よく記述できる。MusiXTeX, PMX, M-Tx の紹介,インストール方法,関連リンクについては,『TeX wiki 楽譜』が手頃な解説である。しかしながら MusiXTeX のマニュアルをきちんと読んでその仕様を理解していないと,少し特殊なことをやろうとすれば PMX, M-Tx の記法だけではまったく対処できない。

Mac OS X Snow Leopard に MusiXTeX T.114, PMX-2.5.15, M-Tx-0.60 をインストールした。コンパイルしてバイナリを生成する以外は,通常の LaTeX パッケージの設置と変わらない。マクロ関連ファイルは $TEXMF/tex/generic/musixtex/ ディレクトリに集めておくのがよい。バイナリ生成がいちばんやっかいなので少しだけ触れておく。コンパイルで,PMX は Fortran77 (gfortran, g77, f77) を,M-Tx は Free Pascal (fpc) を要求する。私は Mac OS X 用の gfortran を『High Performance Computing for Mac OS X』から,Free Pascal を『Free Pascal - Advanced open source Pascal compiler for Pascal and Object Pascal』から入手して組み込んだ。Fortran, Pascal を使うあたり,かつてコンピュータで音楽をやろうとした人の個性が偲ばれる。PMX は,アーカイブ展開ディレクトリ直下で make FC=gfortran,M-Tx は prepmx ディレクトリ下で make とすればコンパイルが実行される。MusiXTeX 付属のフォーマッタ musixflx は MusiXTeXDistribution/system/musixflx/c-source ディレクトリにおいて,C/C++ コンパイラを用いて cc -g -o musixflx musixflx.c としてバイナリを生成すればよい。こうして生成した実行形式 pmx, pmxab, scor2prt (以上 PMX), prepmx (M-Tx), musixflx (MusiXTeX) をパスの通った場所にコピーしておく。

アントン・ウェーベルンが 1909 年に書いた Der deutsche Expressionismus の傑作『弦楽四重奏のための五つの楽章作品 5』第 1 楽章冒頭を,PMX - MusiXTeX で組んでみた。参照したスコアは,ANTON WEBERN Fünf Sätze für Streichquartett OP.5, Philharmonia Partituren No. 358, Universal Edition, Wien である。"col legno" をどうコーディングするかマニュアルにはなかったので,オクターブ記号出力マクロを少し手直しした。ドイツ語は Latin-1 で直接書いて,Cyrillic t2 パッケージ添付 plainenc.tex を \input して 8 bit 処理した。cyrtex.ini を用いてダンプした plain TeX フォーマットファイル (cyrtex.cfg を適切に編集し,tex -ini -fmt=cyrtex cyrtex.ini で生成した cyrtex.fmt) を使えば,ロシア語入りスコアも作成できる。t2 パッケージは ptexlive に初期導入されている。UTF-8 なら日本語混在でも組めると思うけれども,その方法は調査中である。日本語だけの UTF-8 原稿なら,ptex -kanji=utf8 でコンパイルすればよい。ウェーベルン弦楽四重奏の組版では,フォントはデフォルトのコンピュータモダンを使用したが,\font\ninerm=ptmr7t at 9pt\ のように PMX 原稿のはじめのほうで(--- の間に)宣言しておけば,Times 等別の書体で出力できる(MusiXTeX T.114 マニュアル pp. 61-2 を参照)。以下のようなオペレーションで PMX 原稿 (webern_op5.pmx) から PDF を生成した。dvipdfmx だとスラーで PostScript エラーが出て出力できなかったので,dvips, ghostscript (ps2pdf) を使った。

% pmxab webern_op5
% tex webern_op5
% musixflx webern_op5
% tex webern_op5
% dvips -Ppdf webern_op5.dvi -o
% ps2pdf -sPAPERSIZE=a4 webern_op5.ps webern_op5.pdf

PMX 原稿 webern_op5.pmx 及び組版結果 webern_op5.pdf を掲載しておく。組版結果は図 1 のとおり。図 2 市販スコア(墺 PHILHARMONIA PARTITUREN)と比べると,私の調整がまだまだ足りないわけだけれども,なかなかの出来ではないだろうか。

webern_op5.png

図 1. MusiXTeX 組版結果

webern_op5_scan.png

図 2. 市販スコア

私は最初の 3 小節でくたびれた。MusiXTeX で総譜を組むのは,よほどの熟練と根気が必要である。Rosegarden などの楽譜専用エディタには MusiXTeX のコードをエクスポートするものもあり,そちらを使うのがよさそうである。トレモロやハーモニクス等の特殊奏法の記述は MusiXTeX マクロを熟知しないと実現できないだろう。一方,MusiXTeX は,現代音楽の凝った記法を含めると,プロフェショナルな業界ではグローバルスタンダードになっているミュージック・エディタ Sibelius には機能的にも劣るだろう。それでも,楽曲の主題を論文に引用するために使う程度なら,MusiXTeX の機能で充分であり,譜表のコーディングも PMX, M-Tx を活用すればそれほど難しくないはずである。

PMX, M-Tx のマニュアルは,それぞれ,pmx250.pdf, mtx060.pdf を参照。また,Cornelius Noack 氏による "Typesetting music with PMX" は,PMX のチュートリアル,テクニックを豊富なサンプルとともに解説した手引書であって,必携のドキュメントである。

Moon Calendar

Profile

ISAO YASUDA。システムエンジニア。神奈川県在住。昭和 30 年代を懐かしむオヤジ。ロシアに興味があります。
[more], [About our site]

Notice

この文書はフィクションであり,実在する個人,団体等とは一切関係ありません。

R-18 指定サイトです。そのうち「18 歳以上ですか」の認証を入れる予定です。

文書の記述内容は無保証です。不適切な表現があればコメントにてご指摘ください。

コメント,トラックバックは,現在,運用を停止しています。ご意見等ありましたら isao@yasuda.homeip.net 宛電子メールにてお願いします。

Links

Entries

About this archive

All Entries of Category LaTeX

Previous: Emacs

Next: UNIX

Recent Entries in Main Index.
All Entries in Archive Index.

March 2012

Sun Mon Tue Wed Thu Fri Sat
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Powered by Movable Type 5.12 Powered by FreeBSD 8.2-RELEASE
blog counter