Emacs による構造化編集技法

Emacs の構造化編集技法による DocBook や他の SGML/XML 標準の初心者向けの入門

Imass Alejandro [FAMILY Given]

作者:

SATOH Satoru [FAMILY Given]


目次

1. はじめに
2. ワープロという幻想
3. テキスト処理について
3.1. なぜ SGML なのか?
3.2. SGML in a Nutshell
4. Emacs による SGML 文書の編集
4.1. システム要件
4.2. Hello World
5. さらに深く
5.1. 文書を複数のファイルに分ける
5.2. 文書を検証する
5.3. 文書を綺麗に保つ
5.4. 綴り
5.5. 出力の書式と画像
5.6. 相互参照、リンク、URL
5.7. 他の巧妙なテクニック
6. むすび

1. はじめに

この文書は Emacs で SGML マークアップやその派生(例えば、XML や HTML)を編集することに焦点をあてています。 もし Emacs を使ったことがなかったり、何らかの理由で嫌っていたとしても[1]、私もそうでしたから ;-) 心配することはありません。 私も常々こんな複雑であまり親しみやすくはないものを何で皆好きになれるのか不思議に思っていました。 けれども、DocBook を使って書きはじめるとすぐに、小綺麗でカラフルなエディタでは役不足で よりずっと洗練されたツールが必要だということがわかりました。最初ほとんどの作業をお気に入りのエディタの 一つの Nedit で行っていましたが、私の考えていた完璧な構造化エディタとしてあるべき姿 - 自動字下げ、段落を整理しておく機能、[タグを除いた]語句データのみの綴り検査機能、そして もっとも重要な、文脈に沿った、任意の与えられた DTD に対するリアルタイムの妥当性検証機能 - にはほど遠いものに感じました。この希望する機能のリストは、満足するには非常に困難なものに きこえるかもしれませんが、Emacs が容易にこれを満し、そしてさらにそれ以上のことをやってのけることを 私は発見しました。SGML 編集の作法に強い印象を受けることのなければ、Emacs の強力さと柔軟性を 想像することすらなかったでしょう。事実構造化文書の編集を通じて Emacs [の魅力]を発見してからは、 Emacs は私のアーミーナイフとなりましたし、この文書を読んだ後のあなたにとっても Emacs がそのような 存在になることを望んでいます。

私は最近 LyX で Docbook 編集を試してみて、こちらのアプローチも多くの将来性を持ち、 多くのユーザーの WYSIWYG から構造化文書の技法へ移行を容易にすることができると思いました。 しかしそれでもなお、LyX は Emacs + PSGML のようなツールを使うことで得られる自由、強力さ、 柔軟性を与えてくれませんし、これは特にあなたにプログラミングのバックグラウンドがあるなら 余計そうです。

この文書は SGML、Docbook、Emacs の入門を意図したものではありません。 そしてこの文書を通してそれらの考え方にまで少し展開してみますが、主な焦点は Emacs の PSGML メジャーモードと SGML および XML 文書を編集する際に出くわす であろうもっとも重要なタスクに当てていきたいと思います。すなわちこれは 自己従属的な入門であり、前述のトピックについてのより重要な知識なしで はじめるのに十分な情報を提供します。しかし、より深く知ろうと十分刺激する ようなものとなることを望んでいるので、いくつかの他の文書や本へのリンクや参照を 最後に載せておきます。

また Docbook、SGML そして XML は急速に変化していっていて、多くのトレンドがあります。 Docbook の現状と未来について説明している Eric Raymond の非常に優れた文書を読むことをお勧めします (リンクを入れておきました)。 また、この文書が より新しいトレンドである XML ではなく SGML Docbook に焦点を当てていることにも注意して下さい。 いずれにせよ、この文書で学んだことは本質的には同じである XML Docbook にもおそらく応用できるでしょう。 私が理解したところでは PSGML のメジャーモードは SGML と XML の DTD(XML の世界では schemaと呼ばれています)を解析できます。 従ってはじめに述べたようにこの文書で示されていることは SGML -> XML Docbook へ移行しても適用できるはずです。

2. ワープロという幻想

私はワープロの時代に生まれたので、5 年ぐらい前に Unix と troff を発見するまで組版について知る機会がまったくありませんでした。 信じられないかもしれませんが、タグを使って記述し、文書の体裁にではなくすべての筆者が主に注力すべき内容と構造に注意をはらえることが 非常に嬉しかったのです。そして後に Ispell の柔軟性と、他の Unix の哲学 - 小さな部品の組み合わせが実際には一緒になって完璧に仕事をこなす - を発見しました。

もしかしたら、プログラマとしての私には自然なことだったかもしれません。プログラムを書くのと同じ方法で 文書を書く(保守も!)ことができるということが好ましく思えたのです。まあとにかく、あなたを私のコンピュータの経験の 話で退屈させたいとは思わないので、長い話を必要な部分だけ端的にまとめると、コンピュータの歴史の中でも古い流儀である SGML と呼ばれるものを発見したということ [2] と、コンピューティングが WYSIWYM (このコンセプトは Lyx のページから [3] )ではなく WYSIWYG を発達させてきたということを信じてないということです。

私はそれほど長くはない文書やマニュアルについての作業でMicrosoft Word™を使う受難に酷く苦しめられてきました。 次はそのいくつかの例です:

  • 文書の形式(スタイル)は統合が困難。幾人かの成果を統合しようとするとたいてい再度形式を定義するという 悪夢になってしまい、結局非常に多くの異なるスタイルを整理するのはほとんど無理であるとわかってしまう。 滅茶苦茶な MS-Word 文書を綺麗にするというのは、長く、手作業で、単調な雑役です。

  • スタイルは制御下から抜け出てしまい、形式を強制する方法は ありません。初心者は膨大な形式定義を使うはめになるか、あるいは単に全部無視してしまうでしょう。 例えば、初心者が MS-Word (か他の WYSIWYG なもの)を使うとき、適切なヘッダーやスタイルを使うのではなく おそらく単にフォントとその大きさを変更してしまうでしょう。

  • もし企業などで標準的な文書テンプレートを作ろうとすると、ぞんざいに強制するかすべて破るかしかありません。 全社的な標準を体系化するのは非常に困難であり、すべての部署で異なる膨大な数の"標準"を使うはめになるでしょう。 ロゴや他の会社関係の画像は時間とともに多くの異なる陰影、[縦横の]調和、大きさのものに変化していくでしょう。 各ユーザーがそれと知るまでは各自の考えているのが全社標準だと思いこんでいるので、結局誰も公式ロゴがどんなものか わからなくなってしまうでしょう。

  • ある程度の容量の文書を編集していると、プログラムは不安定になる傾向があり、特にそれは埋め込み画像やオブジェクトを含む場合に顕著です。 MS-Word での典型的なエラーは不明な何かと未知の理由に対する未知の X によってほとんどの画像が置き換えられてしまったというものです このエラーは修正不能であり、それぞれの画像を手作業で置き換えてやらなければなりません。

  • MS-Word 文書のファイル形式はバイナリなので中の情報を照会するには基本的にはまったく役立たずです。もし大学学位論文が このようなファイル形式(ここではすべての大学が MS-Word 形式を期待しているとする)だとしたら、論文と同等なレベルであっても、 情報データベースをつくるには良くないでしょう。一方、もし大学が賢ければ SGML で提出させるようにし、他の学生が効率的に検索 できる知識データベースを後でつくれるようにするでしょう。

  • .doc バイナリ形式はどうやら使っている以上に容量を手に負えないほど拡大してしまうようです。かつては文書を圧縮するオプションが ありましたが、新しい版では消えてしまったようです。普通の人はこんなことは知らないので会社のリソースが随分浪費されています。 この問題を解決する唯一の方法は新規文書をつくり、すべての内容を新しい方へコピーペーストすることです。

  • 会社のサーバは容易に混乱し、でたらめなものになってしまいます。そこで何か使うものを探すということはごみすて場で 代用部品を探すようなものです。何か価値のあるものをみつけるまで何時間もあちこち文書を開きまわることになります。

  • 再利用可能な部品は保守も再利用も非常に困難です。例えば、会社の標準のプレゼンテーションや章[のスタイル]を あなたが作業中の文書に統合するのはとても難しく、そういうわけで会社中の誰もがコピーし変更して使うようになります。

  • バイナリファイルが壊れる(これはしばしば起ります)と、あなたの情報はプロプライエタリな ファイル形式の中に閉じこめられているために救い出す手立てはありません。

  • 情報は異なるファイル形式にもできるけれど、そうするためには常にプロプライエタリなツールを使わなければなりません。 他のファイル形式に変換することは、情報や形式を失うために非推奨であり、オプションは故意にみつけにくく、実行しにくいように なっています。もしあなたがMS-Word を使っていてあなたのファイルを誰かに渡そうとすると、彼/彼女も それを開く、変換するためにプロプライエタリなツールを使わなければなりません [4]

とにかく、What You See Is What You Get(WYSIWYG)ツールが企業と人々に何年にもわたって強いてきたすべての問題について 述べてみました。私の場合、秘書として、十年前なら電気なしに一般的なタイプライターで 3 分間ほどでできたような雑用、つまり 簡単な手紙を書くのに、一時間あるいはそれ以上(適切なログをみつけ、ヴィールスや印刷、ネットワークの問題などに対処)かけた 経験があります。学生が何日もかけて異なる部分を統合しようとしているのを見たこともありますし、 たまに一箇月もの作業の成果をファイルの破損やヴィールスのために失なってしまうものまでいました。私の場合は長編のマニュアル あるいはシステム仕様の作業で数日、数週間失ったことがありますが、きっと誰もがこの部分を読んで悲しく 郷愁に満ちた笑みを浮べていることでしょう。

まとめると、WYSIWYG ``ワープロ''は非常に小さなオフィスや単純かつ私的な作業には素晴しいツールであるということです。 特定用途ではとても強力であり、何も問題なしに中程度の重さで使うことができます。実際の高負荷あるいはプロフェッショナルな 編集を意図したものではなく、企業での利用は決定的に適用外です。同様に表計算ソフトも現代の企業における共通認識である違法行為、 膨大な会社内データを保持しておくことを目的とはしていません。

WYSIWYG ツールは初心者には相対的には易しいけれども、高度な使い方をしようと思うと、学習曲線はとても険しいものとなり、 ツールに依存した標準を押し付けられることとなります。

これらのツールで非常に重要な文書を扱わなければならなくなった人ならきっと誰でも同意すると思いますが、 それは何か間違っていて、そういった仕事をこなすには何らかの代替手段があるべきなんです。また仮想的にであっても Britanica Encyclopedia [ブリタニカ大事典]を MS-Word や Adobe Page-Maker™でつくるのは 不可能であるということには誰もがきっと同意するでしょう。コンピュータの長い歴史を振り返ると常に代替が利用可能であっても 大方のユーザーには何らかの理由で広まらないできたということにも気づくでしょう。

3. テキスト処理について

私は ``テキストプロセッシング(処理)'' という言葉を ``ワードプロセッシング''とは区別し、Unix の最初の本から学んだのと同じ意味で使っています。 それはこの本の私が最初に Troff と(WYSIWYG に相対する)テキスト処理の背後にある哲学を発見した場所にありました。

テキスト処理は文書を要素に分けます:

  • 内容

  • 構造

  • スタイル

基本となる哲学は、筆者はスタイルよりもむしろ内容と構造に集中するべきであるということです。構造は大抵筆者の用途に合うように あらかじめ定義されている(または DocBook のように標準化されている)ので、結局一番関心を抱くべき内容にきっちりと集中することになります。

テキスト処理においては筆者はテキストエディタのような単純なツールか、LyX や Emacs のような特別な構造化テキストエディタを 使うことができます。いずれにせよ、それらの情報は常にコンピュータでもっとも自然なファイル形式 - テキストファイル - として保存されます。これは多くの問題点(その大部分については 項2. 「ワープロという幻想」で述べました)について 非常に理にかなった解決策を示しています。

3.1. なぜ SGML なのか?

簡単な歴史

一般に信じられているのとは違って SGML (XML の父)は非常に古い原語であり、中には、かつて多くのコンピュータエンスーが 20 年前に SGML のようなオープンな標準を押し進め、しかし市場によって無視され、あるいは商業的な意図から存在を隠されてきたことを ふまえて、それを ``四十年来の復讐''[the fourty'ers って何?]と読んでいる人さえいます。いずれにせよ、SGML は重要な企業、産業界で 何年も使われています。実際、多くの巨大で重要な企業は長いこと企業情報を SGML として保存しています。

次は SGML の歴史を知るのに良いリンクです:

http://xml.coverpages.org/general.html#faq

XML は単に SGML の単純化されたサブセットであり、すなわち任意の XML 文書は妥当な SGML ですが逆は真ではありません。 XML は最近押し進めらてきていますが、基本的には 90年代に web の爆発的に普及した HTML [5]の上位、後にくるものとしてとらえられています。これら言語の話についてはウェブ上のいたるところでみつけることができるので 詳細についてはここではふれないでおきます。とにかく、この文書の残りの部分で私は SGML について言及するつもりですが、 おそらく XML も大体同じであり、単により単純になっただけだとわかるでしょう。SGML と XML の間にはその変換に関する部分で大きな違いが あります。SGML では Lisp の方言の一つ、Scheme で書かれた DSSSL スタイルシートを使います。[一方、]XML ではより記述と保守を大幅に 簡便にするために XML で記述された XSLT というより単純な変換のための標準が開発されてきました。これはこの文書の焦点ではないので、 Eric Raymond の非常に優れた記事を参照することをお勧めします:

http://www.tldp.org/HOWTO/DocBook-Demystification-HOWTO/

最後に、この節の題目で示された疑問に対する答えとしては、主に、SGML (または XML)は拡張可能な言語であり 他の標準が使えるようになったとしても容易に変換できるので良い考えだということです。これはもし文書を SGML 形式で記述し、 保守すればそれらは技術や標準が変化しても生き抜くことができ、簡単に他の任意の標準へ変換できるので安心であるということを 意味しています。さらに言うと、SGML は古く安定な ISO 8879:1986 標準です。

3.2. SGML in a Nutshell

SGML は Standard Generalized Mark-up Language (標準汎用マークアップ言語)の略記です。一方、XML は eXtensible Mark-up Language (拡張可能なマークアップ言語)の略記であり、単に単純化された SGML のサブセット(実装ではありません。前節を参照のこと)です。 コンピュータ言語の一種ですが、手続き型ではなく(すなわち、命令はその並び順で実行されたりはしません)、むしろ宣言的な言語です。

マークアップ言語は<タグ>の利用を基礎に置いています。タグはデータベースのように構造を定義し、 SGML 用語集の中で言及されているようにタグ以外のすべては内容か文字データ(CDATA)です。標準としての SGML は 使用上の基本的なルールとタグの入れ子関係を定義するだけです。例えば、すべてのタグは終端タグを持たなければ ならず、その入れ子は完全でなければならない、ようするに入れ子の(内側の)タグは外側のものより先に閉じなければ ならないということを言っています。もちろん SGML 定義はもっとずっと複雑ですが、これらが基本となるルールです。 XML は単純化された SGML のサブセットであり、タグの開始、終了については非常に厳格です。例外的なタグとして 終了タグを持たないものがあり、<タグ /> という形式です [6]。 またタグは HTML の BODYタグでページの背景色をパラメータBGCOLOR="WHITE"で指定できるように パラメータを持つこともできます。

これらの基本ルールを与えられると残りのすべてはユーザーに託されます。これはつまりタグの名前、パラメータ、そして実装依存の 入れ子のルールは SGML で記述者がつくることができるということです。これが SGML の美しさであり、誰もが自身のタグ標準を創造できる ようにしています。これを考慮すると、実際には SGML は、標準かつ、パーザーと呼ばれる既成のツールによって簡単に操作したり 変換したりできる柔軟なデータ構造を記述するための言語です。SGML データ構造は RDBMS (SQL)テーブルよりもずっと柔軟であり、 本のような複雑なものも保持でき、しかし本や文書に限定されるものでもありません。実際、SGML と今の XML は多くの旧式の オブジェクト指向の DBMS 実装が行ってきた汎用のデータベースストレージとしても使われています。

さあ、誰でも独自のマークアップ言語を SGML でつくれるなら、あなたの発明したルールを強制する方法がなければなりません。 これが DTD (文書型定義)と呼ばれるものです。DTD は SGML 実装のためのタグの名前、パラメータ、発現する順番、入れ子のルールを 定義します。DTD もまた SGML で記述され、システム上の他のファイルとなっているだけです。DocBook は DTD であり、 bookarticleなどを定義するのに使われています。

DTD は様々な方法で強制されています。第一に文書の筆者によって、つまり、その形式で書こうとする前にその DTD についてその人はいくつか重要な点について知っているべきです。また文脈上の妥当性検証の能力を持つ構造化エディタを使うことも できます。これらのエディタは文書内の任意の個所で挿入できるタグを示してくれます。さらには、システム上の DTD に対してあなたの 文書が妥当なものかどうかパーザにかけて検証できますし、もし何らかの矛盾点があれば警告してくれるでしょう。

OK、SGML をはじめるにあたって知っておくべき基本的なことについてはこれですべてです。これらのコンセプトすべてに ついては次節に進んで Emacs で SGML を作成するようになるとずっと明らかになることでしょう。

4. Emacs による SGML 文書の編集

(もし Emacs を前に使ったことがないのなら...) Emacs という語句を見ただけでこの記事を読むのをやめてしまわせるかもしれませんし、 それはよくわかります。私はなぜ地球上にこのように複雑で曖昧模糊としたものが存在し得るのか理解できませんでしたし、そういうわけで 修得しようと努力することもありませんでした。私は単純で怠惰な男で、Nedit のような単純で強力なエディタが大好きだし、今でもなお 偉大なエディタだと思っています。それでもなお、どうか信じて下さい、SGML 編集のために Emacs をみつけ、 願わくばこの記事で学習すれば、本当に魅了されることでしょう。実際、魅了されるあまりすべての編集用途で Emacs を使うようになることさえ あるかもしれません。あなたは直接に、いつも Emacs を避けていたものの今やあなたの考えられる すべてのことに Emacs を使っているある男からきいているのですから。

Emacs の学習は長い旅となりますが、それほど苦痛なものとはならないでしょう ;-) 理解しなくてはならないのは Emacs はテキストエディタではなく完全な環境だということです。だから少しずつ慣れていけば 結局は愛するようになるでしょう。

とは言っても、例を試してみたいのならこの入門の実用的な部分に進む前に以下に述べるものをすべてインストールしなければなりません。

4.1. システム要件

あなたはシステムを調べて以下に述べるすべてのツールがインストール済みであり、使えることを確かめる必要があるでしょう。

  • 何らかの Unix の香り漂う、あるいは Unix-like な OS。申し訳ありませんが、この記事は Windows ユーザ向けではありません。 差別しているわけではなく、Windows でどうやって機能させるか手がかりもないし調べようとする興味もないからです。私の場合は Linux カーネルを用いた Debian システムを使っています。 [7].

  • どれかのバージョンの GNU Emacs が必要でしょう。すべてがおそらく XEmacs でも機能するでしょうし、私は 卒直にいうとこれら二つの間の違いについては知りません。とにかくあなたが XEmacs ユーザーならおそらくどうやったら機能するか知っているでしょう。 私は 美しい X メニューとツールチップ付きの X のアクションバーとすべてを備えた Emacs 21 を使っています。 この最新版は多分初心者には最適でしょう。

  • PSGML: (PSGML の文書から引用) ``これは SGML と XML 文書の編集のためのメジャーモードです。 GNU Emacs 19.34、20.3 以降および XEmacs 19.9 以降で動作します。PSGML は簡単な SGML パーザを含んでいて、 任意の DTD と一緒に使うことができます。提供されるのはメニュー、文脈的に妥当なタグだけについてタグを 挿入するコマンド、構造上のエラーについて識別する機能、種類と既定値の情報を別ウィンドウで表示しつつ 属性値を編集する機能、そして構造に基づいた編集機能です。

    この文章では、このことと、なぜ Emacs が SGML や HTML のような構造化された文書の編集についてこれほど強力なのか ということに焦点をあてるつもりです。実際、HTML モードは非常に強力でウェブページの作成、編集が楽々できます。 この記事を通して読むことであなたがこのメジャーモードを試してみようと励ますようなものとするつもりです。 怠惰でビジュアルな形式の HTML エディタを好む人もいます。もちろんそれらのエディタは非常に使うのが簡単ですが、 ウェブページをより動的なものと望んでいるなら非常に実用性に欠けています。それらが生成するコードは通常 とても汚い(とりわけ MS-FrontPage が吐くコードは酷いものです)か不要なものでごちゃごちゃしていて Perl/CGI、PHP などで いうような動的なページをつくるためにあちこち断片を切り貼りするのを難しくしてしまいます。それに加えて、もしあなたが 自分をプログラマだと考えていて、かつ HTML 編集にビジュアルなツールが必要であると認めているなら、おそらく あなたの職業は間違っていて、グラフィカルデザイナーに転業することを考えるべきでしょう。

  • SGML Base および SGML data: Debian ではこれらはこのように呼ばれています。 あなたのディストリビューションでも同等の環境を用意してやらなければならないでしょう。 いずれにせよ、これは基本的な SGML カタログファイルと基本的な DTD (これについては後でより詳しく述べます)を インストールするはずです。強く推奨するのはシステム識別子 [8] の代りに公開識別子を使うべきであるということで、そうすればあなたの SGML は完全にポータブルなものとなります。

  • SGML Tools、SGML Tools Lite、DocBook Tools、Debian Doc、あるいは Linux Doc Tools。これはディストリビューションとあなたが 何をしたいかに依ります。これらのパッケージはほとんどのディストリビューションで異なる名前で呼ばれていますが、同じことをします。 インストールされるのは変換スクリプトで、SGML から御望みのもの (HTML、PS、PDF、RTF、TeX など)に変換するのを容易にします。 これらのスクリプトはおそらく Jade や TeX のような他のパッケージへの何らかの依存関係を持っているでしょう。 また DocBook DTD、DocBook DSSSL、XML と XSL (もしゆくゆくは DocBook XML を使いたいと望むなら)、DocBook ユーティリティも インストールする必要があります。いずれにせよ、これらユーティリティを一度インストールしてしまえば db2ps、db2html、db2rtf なども 利用できるようになるでしょう。

    これは Debian でのパッケージの情報から私が把握したいくつかの依存関係のリストです:

    • テキストへの変換には groff-base が必要となります

    • LaTeX への変換には tetex-base、tetex-bin、tetex-extra が必要となります

    • Info への変換には texinfo が必要です

    • SGML Docbook の変換には一般に jade が必要となります

    • Postcript への変換には TeX、DVI、GhostView と他の PS ツール、そしてもし生成された Postcript ファイルを閲覧したいなら GhostView か同等なものが必要となります

    上のリストは代表的なものであり、各々のシステム、ディスリビューション、バージョンによって変わることでしょう。 しかし SGML と Docbook は多くのフリーソフトウェア OS において十分な標準となっているので、おそらくあなたのシステムで 必要なものすべてを簡単にインストールするマクロパッケージ(task install)か何かが用意されていることでしょう。

4.2. Hello World

ここでコマンドプロンプトから emacs とするかデスクトップマネージャのメニューから選択して Emacs を起動します。 X で起動しようとキャラクタシェルで起動しようと同じ Emacs であるということに注意して下さい。違いはキャラクタモードではマウスでの クリックの代わりにキーストロークでメニューを選択しなければならないというだけだと思います。実際私はピュアなコンソールモードで 使ったことがないのでこれ以上はわかりません [9]

Emacs を起動すると *scratch* バッファになっているはずです [10]。コマンド C-x C-fで新規ファイルを作成できます。

[Note] 注意

C-xCtrl キーを押した後で xを押すということに注意して下さい。 コマンド M-xAltx を同時に押します。Emacs では Alt キーはまず Esc を押して離してから対応するキーで続けるのと同じです。 実際設定によっては Alt キーが使えず Esc の方法を強いられる場合があります。

Emacs は画面下(ミニバッファと呼ばれます)でファイル名の入力を待ちます。そのディレクトリ(通常は ~/)に存在しないファイル名を 入力すると、emacs は新規ファイルを作成します。ここではただ hello.sgml と入力し、enter を押して下さい。

[Note] 注意

Emacs 初心者はこのフレームの切替に少々混乱させられるかもしれませんが、Emacs はほとんどの切替を自動で行いますし、 もし迷ってしまっても、ただミニバッファをクリックして C-g を数回押せば良いです。このコマンドは Emacs に前のコマンド群を中止するように指示します。

もし何らかの理由で画面を分割してしまったら、任意のフレームをクリックし、C-x 1 とすれば (親しみやすい用語を使えば) ``最大化'' することができます。C-x 2, 3 か何か数字 を試しに入力してみて下さい。 [画面が分割されたら] ``最大化'' したいフレームを選んで C-x 1 とします。マウスでどこでもクリックして フレーム選択できるので、初心者は X で Emacs を使う方が良いでしょう。

PSGML が適切にインストールされていればミニバッファ内に Loading psgml...done と 表示されるはずです。またステータスバー(ミニバッファのすぐ上の行)に SGML メジャーモードにいることを示す (SGML) という表示が出るはずです。

[Note] 注意

Emacs にはメジャーモードとマイナーモードがあります。メジャーモードは一度に一つだけアクティブになれます。 私達が作業する SGML モードはメジャーモードです。マイナーモードは特定の作業を行うモードで、一つのメジャーモード内で 複数のマイナーモードを実行できます。例えば、SGML モードで作業中にいろいろ手助けしてくれる auto-fill-mode や ispell-mode といったとても便利なマイナーモードがあります。ispell マイナーモードは実時間で綴りを検査してくれますし、 auto-fill マイナーモードは段落を巧みに調整してくれます。

次は hello world 文書の完全なリストです:

例 1. Hello World Code Example

<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" []>
<book lang="ja">
 <title>はじめての本</title>
 <chapter>
   <title>はじめての章</title>
   <sect1>
     <title>はじめての節</title>
     <para
     	>はじめての段落<
     /para>
   </sect1>
 </chapter>
</book>

この一連のキー操作は他の(LyX を除く)エディタの場合のようにして行うこともできますし、Emacs PSGML メジャーモードの 構造化編集の能力の特長を活用して行うこともできます。さてここから刺激的な部分がはじまります...

4.2.1. 最初の一歩: 文書型宣言

最初にまずやらなくてはならないのは文書型宣言を入力することで、これは手動でやります。 The very first thing you must do is type the Document Type Declaration and this has to be done manually.

<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" []>
	

この文書の最初の行は Emacs に必要なときにパーズするための DTD をどこからみつけてくるかを指示します。DTD は DocBook の すべてのルールを含んでいて、PSGML が何をどこに置くか、そして字下げルールをみつけだせるようにします。

4.2.2. PSGML ではじめてみよう

さてでは DOCTYPE 行にちょうど下図のようにカーソルを移動し、C-c C-e と入力して下さい。 ミニバッファを見ると、Emacs がこの一での妥当な要素として bookを選択していることがわかるでしょう。 これはここでは他にここに置ける妥当な要素がないからです。それでは enter を押し、何が起きるか見てみるとしましょう。 すべてが上手くいっていれば次のようなコードになるはずです:

<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" []>
<book>
</book>
	

再度 enter を押して C-c C-e とします。複数の選択肢があるために Emacs がどのタグを置くか決定できないでいるのを 見ることができるでしょう。ちょうどシェルと同じように タブを押して自動補完できますが、沢山選択肢があるので ここでの妥当なタグのリストを含む分割画面が表示されます:

選択を中止するにはただ C-g とするか、タグの最初の数文字を入力(ここでは ti)し、タブEnterと入力します。するとタイトルがつくられ、Emacs が 必要な個所にカーソルを合わせています! タイトルを入力し、行末に移動(多くのエディタのように Enter を押す)し、 EnterC-c C-eとします。さらに chタブとします。 さあ最初の章[chapter]ができました! 例 1. 「Hello World Code Example」にリストされた hello-world.sgml コード全体が得られるまで 続けて下さい。

これで構造化テキストエディタというのが何を意味するのかわかりはじめたと思います。そしてこれは始まりにすぎません、 というのは PSGML の機能は Emacs の多くの他の面白い特徴と結びつき、まさにそれが Emacs を仕事をこなすための最良の道具に 仕立て上げているからです。もちろんここではまだ Emacs がとても風変りで動作が鈍いために好きになれないでいるでしょうから、 いくつか拡張してみることにしましょう....

4.2.3. とっかかりは最高、でもやっぱり Emacs はまだ好きになれない

私のようにとても親切で色鮮かなエディタから移ってきた多くのユーザにとっては Emacs はおそらく退屈で複雑でしょうから、 この節では普通のエディタのように動作させるにはどうしたらよいか説明してみることにします。ほんのちょっとのカスタマイズで Emacs は少くともあなたの今使っているエディタよりも不親切ではなくなります。

4.2.3.1. フォントの色

私が Emacs を使いだしたときに欲しかった重要なものが構文強調表示であり、これを有効にするオプションをみつけることが まったくできませんでした。さあ、けれども心配はいりません、Emacs ではこれは Global Font Look と 呼ばれています。今でもこれがなぜそのように呼ばれているのかは私にとっては謎ですが、とにかく次のようにして有効にすることができます:

M-x global-font-look

もちろん全部入力する必要はなく、ただ global-fタブ と入力します。

4.2.3.2. 何が選択されているか見たい!

他の気に障る Emacs の標準の設定は選択個所を見ることができないということです。既定の設定では Emacs は無効にされたマークモードを 持ち、次のようにして有効にできます:

M-x transient-mark-mode

4.2.3.3. 神様! この馬鹿な文字の回り込みをオフにできないの!

これは私にとって間違いなく Emacs でもっともいらつくことでした。つまり、GNU コーディング標準が好むと好まざるによらず 沢山の状況があり、それに合せて適切なマージンをとっていかなければならないということです。さて、ハッカー達はこの馬鹿げた機能を 無効にするのを非常に難しくしていましたが、次のようにすれば無効できます:

M-x hscroll-mode

次のはそれほど簡単ではありません。*scratch* バッファに移る(Buffers メニューから選択して *scratch* をクリックするだけです)必要があります。これは Lisp 評価バッファ(これは単にこのバッファのメジャーモードが 標準で Lisp の評価に使われるということです。これはステータス行に表示されているのを見ることができます)です。そして 次の行を入力します。

	    (setq-default truncate-lines 1)
	  

続けて C-j とします。これでこの Lisp コード行が実行されます。

4.2.3.4. カスタマイズを保存しよう

実際には、これを行う方法について私は知らないのでこの節のタイトルの目的とは違っています。カスタマイズを保存するには、 .emacs というファイルをホームディレクトリにつくれば、Emacs が起動する度に毎回実行されるようになります。 次はこうしてできた私の .emacs です:

	    (global-font-lock-mode)
	    (transient-mark-mode 1)
	    (hscroll-mode)
	    (setq-default truncate-lines 1)
	  

5. さらに深く

さて、Emacs を使った構造化文書の編集技法の基本については大丈夫としても、まださらに学ぶべきことが沢山あります。ここからは文章編集を楽にするいくつかの巧妙なトリックやこつについて見ていきましょう。

5.1. 文書を複数のファイルに分ける

ワープロよりテキスト処理が優れている主要な利点の一つに、ファイルを分割して好きなように作業を体系化できるということがあげられます。実際にはプログラムによって文書をより柔軟に体系化することができます。

実体(Entity)は文書の先頭の文書型 (DOCTYPE) 宣言内で宣言しなければなりません。そして典型的な実体宣言は次のようになります:

<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
<!ENTITY presDeLaCompania SYSTEM "presDeLaCompania.sgml">
]>
      

この例を見ればわかるように、実体は四角括弧 [] 内で宣言します。また実体へのシステム識別子があるので、パーザが文書を処理する際にそのファイルをみつけることができるということもわかるでしょう。実体名はこの文書の中で実体を識別し、好きなように名前を付けることができます。

アンパサンド & と実体名を次のように指定するだけでいつでもこの実体を使うことができます:

	&presDeLaCompania;
      

[Important] 重要項目

実体を連携させているときに実体内に文書型(DOCTYPE)宣言を含めることはできません。そうすると Emacs がこの文書をどうやって検証するか知ることができなくなってしまいます。しかしこれについては打開する方法をみつけたので以下で説明します。

5.2. 文書を検証する

この節で後で見るように Emacs/PSGML は妥当な文書を書くのを手助けするだけでなく、思いがけなく手動で(例えばカットアンドペーストで)節を 含めたとしても、必要に応じて妥当性を検証することができます。それでは構造化文書の編集作業を手助けするような(PSGML に加えて)他の Emacs の標準機能についても見ていきましょう。

5.2.1. 妥当性の検証(単一の文書)

あなたはいつでもC-c C-vと打ってミニバッファ内にnsgmlsコマンド行を表示し、ただEnterを押すだけで文書の妥当性を検証できます。もし何らかのエラーがあれば下の画面のようにプロンプトが表示されます:

そしてすぐわかるように、エラーの一つをクリックしEnterを押すと直接エラー個所にジャンプします。もしそれが異なるファイルであっても、Emacs はそのファイルを開き、エラー個所にカーソルを移動します! これは Emacs の標準機能であり、システムの他のツールと統合されています。gdb、make、java コンパイラなどで同じように使うことができます。

5.2.2. 妥当性の検証(文書の一部分, 実体)

文書の部分(SGML では 実体 と呼ばれます)にまつわる主な問題は、その中に DOCTYPE 宣言行を含めることが できないということです。このために Emacs がどこの DTD を見に行けばよいのか知ることができません。[これを解決するために]私が やったことは次のとおりです。

  1. DOCTYPE 宣言行を持つ主文書を開き、DTD->Save Parsed DTD[パーズ済みの DTD を保存]メニューを クリックします。そのファイルに docbook.ced あるいは main.cedといった簡単な 名前を付け、通常主ファイルと同じディレクトリ内に保存しておきます。

  2. 文書の部分を開くと、Example entity XXXXX not found (XXXXX は最初のタグがみつかる場所)というようなエラーメッセージが表示されるでしょう。これを無視し、単に C-x 1を押して作業フレームを最大化します。そしてメニューから DTD->Load Parsed DTD を選択し、この filename.ced を前のステップで付けたファイル名で置き換えてやります。

この通り! 主文書と同じようにして文書の部分でも作業することができます。

5.3. 文書を綺麗に保つ

字下げと調整

PSGML メジャーモードは他の多くの Emacs メジャーモードと同じように適切な字下げを保つように手助けしてくれます。

5.3.1. タブキー

私が見てきたエディタとは違い、タブキーは Emacs では実に知的なものとなっています。一つ例を あげると、テキストのどこでもこのキーを叩くと、他のエディタのようにテキストの間に空白を入れてしまうテキストモード とはならず、適切にその行を字下げしてくれます。

5.3.2. 字下げ

さて Sect2 を Sect1 にすると決め、正しくこの節を字下げしたいとしましょう。次のようにします:

  1. その領域を選択し(C-space でその節のブロックがアクティブになります)、 タグを置き換えます。もしその領域にいないなら外側のタグを検索し、置き換えることからはじめます。 その領域内にいても同様です。

  2. タグに正しい名前をつけると、 Emacs は自動的にその領域を字下げすることができるはずです。 ただその領域を選択し、M-x indent-regionを押すだけで終り!

5.3.3. 字下げについてさらに詳しく

これはさらにはスタイルとコード可読性の問題となります。私は個人的にはタグがあってその後に CDATA(文字データ)があるよりもタグの間に挟まれている方が好みです。段落は完璧な例です:

<para>
 This is more a question of style and code readability. I
 personally prefer to have <emphasis>CDATA</emphasis>
 (character data) between the tags rather than having the tags
 at the beginning and end of the CDATA. Paragraphs are
 perfect examples:
</para>
      

<para>This is more a question of style and code readability. I
personally prefer to have <emphasis>CDATA</emphasis>
(character data) between the tags rather than having the tags at the
beginning and end of the CDATA. Paragraphs are perfect
examples:</para>
      

こうすると、Emacs はこれを理解し、CDATA とタグを適切に調整した状態に正しく保つようにします。CDTADA については Emacs はその領域での最初の行の字下げに従います。つまり、それを最初に字下げすると残りの行はそのスタイルに従うようになります。

5.3.4. 段落の調整

私が Emacs でみつけた一つの興味深い特長は段落埋め、もしくは段落調整(ほとんどの人にはこちらの方がずっと親しみやすい用語でしょう)です。 調整は自動的に(マイナーモードとして)、あるいは手動でM-q 打鍵でいつでも行うことができます。調整マイナーモードでは テキストは自動的に埋められ、字下げされメジャーモードのルールに従って折り返しがなされるので、あなたがしなければならないのは入力することだけ です。調整マイナーモードにするには単にM-x auto-fill-modeと入力します。

また、領域を選択しM-x fill-region と入力して調整することもできます。

5.4. 綴り

Emacs がその下の OS とツールを滑らかに統合しているのと同じ方法で、ispell と spell が完璧に統合されています。 これは ispell メジャーモードを有効にすることで ad-hoc になされるか、あるいはマイナーモードとして動作させられます。 これは MS-Word の赤線に似ていて、文書全体の綴りを検査します。次はいくつかのチップスです:

  • 文書の綴りを検査するには単に M-x ispell と入力します。

  • 辞書を変えるには M-x ispell-change-dictionary と入力します (利用可能な辞書については /usr/lib/ispell を参照して下さい)。

  • ispell マイナーモードを有効にするには単に M-x ispell-minor-mode とします。

  • 綴りの間違っている語句に赤い下線を引くようにしたければ、M-x flyspell-mode とします。

  • ispell マイナーモードを有効にしていてビープ音が鳴ったら、それは語句の綴りを間違っているということを意味します。 これを修正するにはすぐに入力をやめ M-$ とするとちょうど ispell メジャーモードのように画面の上部に オプションが表示されます。

5.5. 出力の書式と画像

SGML 自体は任意の他の形式に手際良く変換できるけれども、実際に異なる媒体で配布するつもりなら考慮に入れなくてはならない いくつかの注意点があります。例えば、保守したい文書を Postscript と HTML の両方で配布するとしましょう。もし文書に画像が 含まれていなければ大きな問題はありません。しかし、もし画像があると、二つのこと - 双方の媒体に対する画像の大きさとファイル形式 - を考慮に入れる必要があります。800x600 のスクリーンショットはおそらく HTML なら完璧に表示されますが、A4 サイズの PDF では 見栄えが良くありません。また PNG は Postscript ファイルの中で直接表示させることはできませんし、EPS 画像を HTML ファイル内で 表示させることもできません。

おそらく SGML でもこれをプリプロセッサのようにしてやってしまう方法があるでしょうから、もしみつけたら この文書を更新することにします。しかしここでは私のみつけたこの仕事を十分よくなしとげる簡単な方法をあげておきます:

  • すべての画像を保存する graphicサブディレクトリをつくります。このディレクトリ内に それぞれの媒体形式に対するサブディレクトリをつくります。私の場合は Gimp を使い主に PS と HTML で配布しているので、 三つのサブディレクトリ(XCF、EPS、PNF)をつくっています。

  • 画像をつくったら各々のサブディレクトリに異なるファイル形式で保存しておきます。XCF と EPS では 拡張子をつけておきますが、PNG にはつけません(つまり私の PNG ファイルには拡張子がありません)。

  • 文書内ではファイルの種類を指定してはいけません、というのは逐語的に解釈する HTML への変換を 除けば、各々の変換ルーティンは異なる拡張子を期待しているからです。こういうわけで前述のように PNG ファイルには .png 拡張子をつけないようにといったわけです。ブラウザはファイルの種類を何とか判別することができます。次はスクリーンショットの 例です:

    <screenshot>
    <screeninfo>Emacs 21 Graphical Menus in X</screeninfo>
    <graphic fileref="graphic/emacs-21-graphic-menu"></graphic>
    </screenshot>
    

  • 変換する前に正しいファイルが graphicディレクトリ内に存在していることを確かめておいて下さい。 PS 変換では .eps 拡張子を持つファイルを期待するので、文書内で画像の種類を指定する必要はありません。

  • HTML 変換では画像ファイルは新規作成ディレクトリに複製されません。手動でそれらを複製し、画像ディレクトリをつくらなければ なりません。PNG ファイルには拡張子がないので、HTML の中の IMG パラメータには理想的なパスと SGML から受けついだファイル名が 入ることになります。

5.6. 相互参照、リンク、URL

SGML ではすべての要素がユーザー定義の ID を持つことができます。この ID で異なる目的、媒体出力にでもこの要素を 参照することができます。HTML や他のハイパーリンク可能な媒体で配布しようとしているなら、文書の異なる節へのハイパーリンク させるのにとても便利です。これらリンクについては Docbook ではいくつかの異なる方法で定義されていますが、そのいくつかの 興味深いものをここであげてみます。

5.6.1. XRef

私は XRef がとても多芸多才で、紙の出力(PostScript)でも HTML 出力でも同様に機能することをみつけました (さらに HTML ではハイパーリンクも付け加えられます)。

XRef を使うには最初に link-end ノード(指し示すノード)を指定しなければなりません。それにはただその指定したい 要素の開始タグに移動し、C-c +とし、パラメータ IDを選択し、名前を付けます:

<sect1 id="wpf">
<title>The Word Processing Fantasy</title>
	

この要素(この場合は節)を参照したいと思ったらいつでもただ次のようなタグを使うだけで良いのです:

which where listed in <xref linkend="wpf">.
	

5.6.2. URL

URL の宣言は非常に簡単で、単に ULink 要素を次の例のようにして使うだけです:

<para>
<ulink
  url="http://xml.coverpages.org/general.html#faq">
  http://xml.coverpages.org/general.html#faq
</ulink>
</para>

5.7. 他の巧妙なテクニック

ここでは私が Emacs と PSGML モジュールの利用を通して発見した他の巧妙なテクニックについてふれてみようと思います。この節はおそらく 時間とともに内容が増えていくはずですので引き続き注意していて下さい...

5.7.1. とりあえずマークアップ

この節はもっと良いタイトルをみつけられなかったのでこれで我慢して下さい。文書を校正していて何かを強調したいとします。 C-c C-eではじめたものの終了タグは期待していなかったとします。この場合使うべきなのは C-< であり、開始タグを選択でき、終了タグは生成しません。開いているタグを閉じたければ、ただ C-/と入力するだけでよく、こうすると自動的に適切な終了タグを得ることができます!

5.7.2. タグパラメータ

Docbook や HTML を書いているとタグは非常に様々な異なるパラメータを持っていて覚えるのも既定値を使うのも難しいということが わかるでしょう。このような場合、開始タグのどこでもカーソルを合わせて単に C-c +とします。するとパラメータ リストが表示され、異なるパラメータと(定義済みならば)すべての可能で正当な値を示してくれます。この機能は実に素晴しく、 すべてのマークアップ編集に不可欠であるとわかります。つまり、ほとんどのものについては自動補完から推測できるので Docbook あるいは HTML のリファレンスは必要ないということです。もちろんこれは使っているマークアップの標準について学ばなくても 良いという言い訳にはなりませんが、しかし、単にこれらを覚えておくためのリファレンスの必要性をなくしてくれます。

5.7.3. 必要なもの各種

  • GNU Emacs マニュアル。私は FSF の印刷されたマニュアルを買い、それが非常に完成度が高く、一般に信じられているのとは 違って、とても簡単で読むのが楽しいということを発見しました。FSF 版とは違ったアプローチの O'Reily の GNU Emacs 本も 持っていますが、こちらもとても好きです。

  • Debian の linuxdoc-tools パッケージについてきた LinuxDoc-Tools ユーザーガイド。これは SGML とそしてもちろん linuxdoc の非常に優れたガイドです。

  • Docbook DTD のガイド。これはほとんどの Linux ディストリビューションでは通常は /usr/share/doc/ にインストールされます。もちろんこれには Docbook 文書を インストールしなければなりません。また Docbook の本は沢山ありますが、中でも特に O'Reily の非常に優れた本は GPL です! これは O'Reily の本の中で唯一の GPL なものだと思います。

  • PSGML メジャーモードをインストールするとついてくるガイド。大抵のものと同様に通常は /usr/share/doc/psgml にインストールされます。このガイドはあなたが知りたいであろう残りの PSGML の技について教えてくれることでしょう。

6. むすび

まず読んでくれてありがとう。この文書があなたの役に立つことを願っています。また Linux-guru か私までフィードバック [11] 頂ければ幸いです。

すべての文書はむすびを持つべきだと思うけれど、この節はもう四回も書き直したのでもうこのままにしておきます。このむすびについてもフィードバック頂けると助かります。アイデア、コメント歓迎です。



[1] 訳者も Emacs はその巨大さゆえにあまり好きではありませんし、この訳自体も vim で編集していますが、 一般には SGML/XML 文書は Emacs を使った方が圧倒的に楽であり、生産性が高いと思います。

[2] "実際には最初に XML をみつけ、その歴史を読んで SGML について調べだし、文筆というものが実に正しく 行なわれていた太古の世界を再発見したのです。"

[3] LyX - What is LyX?を参照のこと。

[4] 幸いなことにこれも今や事実とは異なることになってきています。私(訳者)が使っているかぎりでは OpenOffice.orgの MS-Office ファイルへの 対応度は驚異的です。

[5] "HTML は実際には SGML の実装の一つです。SGML 実装とは DTD (文書型定義; 基本的にはタグの名前とパラメータ、出現する順番、そして入れ子のルールなどを記述する)と 呼ばれるものでなります。SGML 実装であるマークアップ言語は数多くありますが、最近のほんの数年ばかりで XML の創生に伴う より多くの標準化の動きが台頭してきています。SGML の素晴しい点は、任意の文書を簡単に他の任意の形式に、単に宣言型の 変換シートを定義するだけで(すなわち、手続きプログラミングなしで!)変換できるということです。"

[6] これは実は対となるタグの間に挟む要素がない場合の単なる短縮表記(空タグ)です。

[7] "この言い回しの微妙な正確さは Linux vs. GNU/Linux ジレンマの両方の側とも対立することを避けることを意図してのことです。"

[8] "すべての SGML 文書は最初の行に SGML 宣言あるいは次の形式の DOCTYPE 宣言を持たなければなりません:

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [

この行はパーザ(文書を解釈するプログラム)にそれがどんな種類の文書で妥当性を検証するのにどの DTD を 使うべきなのかを指示します。上述の例では文書は DocBook DTD で定義された ``article'' です。セットアップが 適切になされていればそのファイルに対する物理的なパスを指定することなしにシステムは DTD をみつけることが できるはずです。上手くいかないようならパーザが DTD をみつけられるように ``システム識別子を付加的に 追加する必要があるでしょう。システム識別子は次のような感じです:

<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook
  V4.1//EN" "/usr/lib/sgml/dtd/docbook-3.1/docbook.dtd"[

私がインストールするように書いた SGML カタログファイルではきっと公開識別子 (文書をよりポータブルにします)だけを使うようになっているはずです。これについては 補足するコメントを誰か寄稿してくれるなどフィードバックを待っています。"

[9] 素のコンソールでは日本語は表示できませんが、これは kon (Kanji ON Linux console) や jfbterm を利用すれば問題ありません。

[10] この記事は Emacs を使うための段階を追った入門であることに注意して下さい。このことについては沢山の情報があります。 この記事では PSGML メジャーモードと Docbook DTD を使うことに焦点をあてますが、完全な初心者が実行するに十分な最小限の 段階的なことだけを説明するつもりです。残りの部分については読者自身が調べて下さい。

[11] この訳そのものに対するフィードバックは私 - まで。