数式処理 J.JSSAC (2004)

Vol. 11,No.

1,pp.

39

-43

特集「KNOPPIX/Math」

GNU TeXmacs
小原功任
金沢大学理学部∗

1

TeXmacs の概要
GNU TeXmacs ([1]) は Joris van der Hoeven によって書かれた, LaTeX 文書を見たままに(wysiwyg に) 編集できるエディタである. GPL に基づいたフリーソフトウェアとして配布され,2004 年 7 月現在のバージョンは 1.0.4 である. Knoppix/Math 2004 日本語版に収録のバージョンは 1.0.3 であり, 若干の差異があるが, その点については後述する.

TeXmacs とは TeX + Emacs を意味する. もちろん名称だけで, TeX や Emacs から派生したソフトウェアではないが, カーソル移動, 行編集, 文書の保存, エディタの終了といった単純なコマンドについては, Emacs と同じキーストロークになっているので, プレーンテキストの作成に限れば, UNIX (以下, Linux を含む) に慣れたユーザには取っつきやすいと思われる. また, GNU

Emacs に Emacs Lisp があるように, TeXmacs には, GNU Guile という Scheme 言語処理系がリンクされていて, Scheme 言語でプログラムを書くことで機能を拡張することができる.

UNIX 上で LaTeX 文書を wysiwyg に編集できるエディタは, TeXmacs 以外にもいくつかあるが, それらに対するアドバンテージとしては, TeXmacs が数式処理システムのフロントエンドとして動作することであろう. 数式処理システムのサポートは TeXmacs の plug-in を追加することで実現されているので, 拡張性が高い. TeXmacs が扱える数式処理システムには, Maxima, Maple,Axiom, Macaulay2 などがある (現在, 24 個の plug-in が用意されている). また, Knoppix/Mathには筆者らが作成した OpenXM (Risa/Asir, Kan/sm1) 用の plug-in も収録された.

2

TeXmacs で文書作成
ここでは簡単に TeXmacs での文書の処理を説明しよう. TeXmacs が編集できる文書は LaTeX

形式以外に, HTML 形式があり, 出力するだけならば Postscript や PDF も扱える. また, 欧米系の言語で記述された文書のみを編集でき, 日本語は利用できないことにも注意が必要である.

TeXmacs には Emacs とちがって coding-system の概念がないので, 文書で使われている文字集合の情報が欠落してしまう. たとえば ASCII で書かれたファイルを読み込んでも, 出力ではISO-8859-1 文字集合が用いられるので日本のユーザーは困るであろう.
∗ohara@air.s.kanazawa-u.ac.jp

c 2004 Japan Society for Symbolic and Algebraic Computation

40

数式処理 第 11 巻 第 1 号 2004

TeXmacs で LaTeX 文書を書くといっても内部では LaTeX 形式では管理していない. TeXmacsの内部形式は XML の一種である (拡張子 .tm). このことは InftyEditor など他のソフトウェアと同様である. 新規に作成した文書は内部形式で保存されるので, LaTeX ソースを得たい場合には,その時点で文書形式を変換する. これは TeXmacs のメニューから File → Export → LaTeX で行える. HTML の場合も同様である. なお, HTML で出力するときには数式は MathML に変換される. PDF での出力は ps2pdf に依存しているので Ghostscript も必要である.

<TeXmacs|1.0.4><style|article><\body><\align><tformat|<table|<row|<cell|x<rsup|2>-1 = cos t>|<cell|>>>></align>
I <with|font|ms-comic|love> TeXmacs.
</body>

図 1: TeXmacs で作った文書の例

HTML が出力できることから分かるように, TeXmacs の編集する文書は LaTeX とあまり関係ないのであるが, 「LaTeX 文書を見たままに編集できるエディタ」というのが建前であるためか,デフォルトのフォントは TeX と同じく Computer Modern である. Computer Modern には Type1 や TrueType のものもあるが, TeXmacs では何故か PK フォントを利用する. また, 必要なフォントやメトリックファイルが存在しない場合, METAFONT を用いて自動的に生成する. このため, TeXmacs は実行時に TeX システムを必要とする.
さて, TeXmacs で文書作成する際のいいところについては [1] にいろいろ書かれているので,ここではあまりよくないところについて述べたいと思う. まず, Emacs と対応していないキース
トロークは直感的でないものが多いので, 是非ともマニュアルを参照することをお勧めする. これらのキーストロークは数が多すぎて覚えきれないので, あまり役に立たないけれども, ある程度は知っていたほうがよい. Emacs に由来しないキーストロークは Alt キーと組み合わせるようである. TeXmacs の簡単なマニュアルは, メニューから Help → Manual → Browse で, 完全なマニュアルは Help → Full Manuals → User Manual で参照できる.

TeXmacs にはたくさんのアイコンやメニューから選べる項目がついてくるのだが、本気で文章を書くならば, マウスを使わずキーボードだけで済ませたい. 分数や根号の入力, 各種環境の挿J.JSSAC Vol. 11, No. 1, 2004

41

入など, キーストロークを覚えるのは大変だが, これらには回避法がある. TeXmacs ではバックスラッシュで始まるコマンドがいくつか用意されていて, こちらは通常の TeX コマンドに似たコマンドが利用できる. 例えば分数の入力は, \frac return と打ち込めば, 適当なフォームが用意されるので, そこに入力すればよい. TeXmacs を使う必然性があるのか疑問が生じるが, これは便利である. ただ, これらコマンドはそっくり同じと言うわけではなくて, 環境名を表すこともある. 実際, \quotation return で quotation 環境が入力される.
ところが, このようにして書いた文書を LaTeX 形式で出力しても, latex でコンパイルできないことが, 頻繁に起こる. 例えば, 例 1 の文書を LaTeX 形式に変換してもコンパイルには通らない.

TeXmacs で残念なことのひとつは, 通常のエディタなどで作成された LaTeX 文書を読み込んで編集することが, ほとんどできないことである. LaTeX 形式と XML 形式の相互変換で情報の欠落が発生するし, 仕方のないことではあるが変換自体も 1 体 1 に対応するものではないので,LaTeX 文書を読み込み, 意図通りに表示されたとしても, 再び LaTeX 形式で保存すると, もとのファイルとはまったく異なるものになるし, 一般的には壊れたファイルになってしまう. マクロなどを使っていると変換が難しいのは当然だが, 標準的なコマンドのみを使った文書でもうまく行かないことが多い. さらに文書の整形にも問題がある. 例えば, 以下のような極めて単純な LaTeX
文書を読み込んで実験してみたが, 改行の処理に問題があるらしく TeXmacs での表示は, latex による整形とは異なる.

\documentclass{article}\title{TITLE}\author{AUTHOR}\begin{document}\maketitle
I love TeXmacs.
\end{document}

図 2: 整形が乱れる文書の例
ところで, LaTeX に変換したときには必ずしも反映しないけれど, TeXmacs では編集中の文書の特定の部分のフォントや色を簡単に変更することができる. ただし変更できるのは地の文だけで数式などはダメである. X11 流のマウスで選択でも, Emacs 流の C-space, カーソル移動でもよいが, リージョンを指定してからメニューで Format → Name → X-windows → Helvetica な
どとすると該当部分のフォントが, X11 の Helvetica に変更される. ここでいう Helvetica とは$PREFIX/share/TeXmacs/progs/fonts/fonts-x.scm に具体的に XLFD (の一部) で埋め込まれている. 注意しなければならないことは, この操作をするときに要求するフォントがみつか42

数式処理 第 11 巻 第 1 号 2004

らないと, TeXmacs が落ちることである. このバグは最新版でも直っていないので, TeXmacs で文書を編集するときはできるだけ保存を行うように心掛けたい.

TeXmacs の最大の問題というと動作が遅いことに尽きるが, なぜ遅いかというと, 前述したように描画時に動的に PK フォントを生成しているからだろう. Type1 や TrueType を使えばいい
わけで, TeXmacs の将来の版では PK フォントを使わないように書き換えることが表明されている. その一環からか, 最近のバージョンでは部分的に Truetype フォントのサポートが加わった.
使用するフォント名はやはり埋め込まれて,$PREFIX/share/TeXmacs/progs/fonts/fonts-truetype.scm に記述されている. そこで指定されているフォントは Microsoft がフリーで配っていたもので, いまでもいくつかのサイト,例えば http://prdownloads.sourceforge.net/corefonts/ から入手できる. FreeBSD のユーザならば ports の x11-fonts/webfonts で取得してもよい.
いまのところ, TeXmacs をカスタマイズするには, Scheme 言語でプログラムを書くしか手がないし, それも Emacs Lisp で GNU Emacs のカスタマイズをするほどには簡便ではない. しかしながら, 起動時に$HOME/.TeXmacs/system/my-init-texmacs.scm が存在すれば, 読み込んで実行されるので, フォントを追加したい場合はこのファイルに適当なコードを書くことになるだろう.

3

TeXmacs と数式処理システム
TeXmacs は数式処理システムのフロントエンドとして使用することができる. 例えば, メニューから Insert → Session → Maxima とすれば Maxima が起動する (ただし Maxima がインストールされている場合). それぞれの数式処理システムについては Knoppix/Math で試していただくとして, ここではソフトウェアとしての仕組みを説明しよう.

TeXmacs では plug-in を用いて InftyEditor や Mathematica の Notebook のような操作性を実現しているのだが, plug-in の実現方法には二種類あり, ひとつは共有ライブラリとして実装しメモリ上にロードする方法, もうひとつはプロセスを分けて TeXmacs とプロセス間通信を行う方法である. ここでは汎用性が高い後者の方法を説明する.
この場合, plug-in は Scheme プログラムと外部プログラムの二つのプログラムからなる. Scheme
プログラムは TeXmacs の起動時に読み込まれて, TeXmacs の一部として実行される. 外部プログラムは, セッション開始時に起動されて, TeXmacs とは別のプロセスを形成し, TeXmacs とはプロセス間通信を行う. プロセス間通信とは外部プログラムからみて標準入出力の読み書きに他ならない. TeXmacs plug-in の仕様を満たすならば, 外部プログラムは数式処理システムそのものであってもよいし, 数式処理システムのラッパーであってもよい. 外部プログラムは独立したプログラムなので, どんな言語で作成してもよい. TeXmacs のソースには C++ 言語でのサンプルが付属しているが, もっとも楽なのは, もちろん C 言語であろう. また, Scheme プログラムのほうはほとんど何でも書けるので, TeXmacs のメニューの拡張などの処理も書くのもよい.

TeXmacs (Scheme プログラム) と外部プログラムとの通信は対話的に進行し, メッセージの形式が非対称, 文字列ベース, 行単位で行われるのが特徴である. TeXmacs から外部プログラムに送るデータは, 改行文字 (LF) で終端する文字列である. さらに, 外部プログラムから TeXmacs

J.JSSAC Vol. 11, No. 1, 2004

43に送るメッセージは「型:データ」の形式の文字列を特定の文字で挟んだものである. 例えば

latex:$x^2-1$ や scheme:(insert-string "Hello") といった文字列が送られる. TeXmacs
は受け取るメッセージの型によって動作を変える. 例えば latex 形式ならば, LaTeX の文字列だと思って内部形式に変換し画面に描画する. scheme 形式ならば, Scheme の式として TeXmacsが評価する. これはつまり, 外部プログラムから TeXmacs を制御することもできるということであり, plug-in は単純な下請ではない.
さて TeXmacs の plug-in は仕組みが単純なので, 最初の実装は容易であるが, プロトコルの設計が不十分なので, ちょっと変わったことをしようとするとややこしくなる. 例えば, 外部プログラムに送るデータは改行文字を終端とするので, そのままでは複数の行を含むデータを渡せない.
さて, そういうときには Scheme プログラムと外部プログラムとの間でやり取りするデータを加工するよう両方のプログラムに手を入れればよい. そのような追加の Scheme の関数は serializerと呼ばれ, $PREFIX/share/TeXmacs/plugins/r/progs/init-r.scm に例がある.

参 考 文 献[1] The TeXmacs.org, http://www.TeXmacs.org/[2] The TeXmacs-dev archives, http://lists.gnu.org/archive/html/texmacs-dev/[3] The Guile Reference Manual,
http://www.gnu.org/software/guile/docs/guile-ref/[4] Knoppix/Math Wiki,
http://geom.math.metro-u.ac.jp/wiki/index.php?[[KNOPPIX/Math]]