3.5. 編集ツール

以下では、HOWTO の作成や編集、妥当性検査に使えるツールを紹介します。

3.5.1. Emacs (PSGML)

オプションです。 - http://www.lysator.liu.se/~lenst/about_psgml/

Emacs には、SGML や XML 文書の編集のために作られたメジャーモードとして、 SGML 文書作成用の psgml と呼ばれるモードがあります。これによる "構文強調 (syntax highlighting)""きれいな表示 (pretty printing)" 機能を使うと、SGML タグが強調されたり、手でタイプしなくてもタグを入れることが できたり、書きながら妥当性検査ができたりします。

Emacs ユーザにはうれしい機能ですし、他のどんな SGML 編集ツールよりも充実 した機能を備えていると、多くのユーザは思っています。DocBook や LinuxDoc、その他 の DTD でも使えます。

3.5.1.1. PSGML を使って SGML を書く方法

3.5.1.1.1. はじめに

最近のディストリビューションをインストールしているなら、Emacs で 使えるように既に PSGML がインストールされていると思います。確認のために、 Emacs を起動して、PSGML 文書を捜してみましょう。(C-himpsgml)

ここからは、比較的新しいバージョンの Emacs に PSGML がインストール されて使えるように なっているのを前提にします。話が早く進みすぎると思う方は、Bob Ducharme の SGML CD book のフリーで公開されている次の章をご覧ください。 http://www.snee.com/bob/sgmlfree/

3.5.1.1.2. .emacs をアップデートして PSGML を使う方法

.sgml ファイルを開いたときに GNU Emacs が PSGML モードに入って、SGML を編集できる準備が整うようにしたい場合は、PSGML が DocBook DTD を見つけられるようにしなければなりません。 GNU Emacs で PSGML が使える ようにディストリビューションで既に設定済みなら、何もしなくても多分うまく行く はずですが、そうでない場合は、環境変数を設定して、SGML カタログ (つまり DTD の リスト) を捜すべき場所を PSGML に教える必要があります。

たとえば、まず

bash$ export SGML_CATALOG_FILES=/usr/lib/sgml/catalog

と打って、次に、.emacs ファイルに次ぎのような内容の行を追加します。

;; *******************************************************************
;; set up psgml mode...
;; use psgml-mode instead of emacs native sgml-mode
;;

(autoload 'sgml-mode "psgml" "Major mode to edit SGML files." t )
(setq auto-mode-alist
  (append
  (list
    '("\\.sgm$" . sgml-mode)
    '("\\.sgml$" . sgml-mode)
    )
  auto-mode-alist))

;; set some psgml variables

(setq sgml-auto-activate-dtd t)
(setq sgml-omittag-transparent t)
(setq sgml-balanced-tag-edit t)
(setq sgml-auto-insert-required-elements t)
(setq sgml-live-element-indicator t)
(setq sgml-indent-step nil)

;; create faces to assign to markup categories

(make-face 'sgml-comment-face)
(make-face 'sgml-start-tag-face)
(make-face 'sgml-end-tag-face)
(make-face 'sgml-entity-face)
(make-face 'sgml-doctype-face) ; DOCTYPE data
(make-face 'sgml-ignored-face) ; data ignored by PSGML
(make-face 'sgml-ms-start-face) ; marked sections start
(make-face 'sgml-ms-end-face) ; end of marked section
(make-face 'sgml-pi-face) ; processing instructions
(make-face 'sgml-sgml-face) ; the SGML declaration
(make-face 'sgml-shortref-face) ; short references

;; view a list of available colors with the emacs-lisp command:
;;
;; list-colors-display
;;
;; please assign your own groovy colors, because these are pretty bad
(set-face-foreground 'sgml-comment-face "coral")
;(set-face-background 'sgml-comment-face "cornflowerblue")
(set-face-foreground 'sgml-start-tag-face "slateblue")
;(set-face-background 'sgml-start-tag-face "cornflowerblue")
(set-face-foreground 'sgml-end-tag-face "slateblue")
;(set-face-background 'sgml-end-tag-face "cornflowerblue")
(set-face-foreground 'sgml-entity-face "lavender")
;(set-face-background 'sgml-entity-face "cornflowerblue")
(set-face-foreground 'sgml-doctype-face "lavender")
;(set-face-background 'sgml-doctype-face "cornflowerblue")
(set-face-foreground 'sgml-ignored-face "cornflowerblue")
;(set-face-background 'sgml-ignored-face "cornflowerblue")
(set-face-foreground 'sgml-ms-start-face "coral")
;(set-face-background 'sgml-ms-start-face "cornflowerblue")
(set-face-foreground 'sgml-ms-end-face "coral")
;(set-face-background 'sgml-ms-end-face "cornflowerblue")
(set-face-foreground 'sgml-pi-face "coral")
;(set-face-background 'sgml-pi-face "cornflowerblue")
(set-face-foreground 'sgml-sgml-face "coral")
;(set-face-background 'sgml-sgml-face "cornflowerblue")
(set-face-foreground 'sgml-shortref-face "coral")
;(set-face-background 'sgml-shortref-face "cornflowerblue")

;; assign faces to markup categories

(setq sgml-markup-faces '
  (
  (comment . sgml-comment-face)
  (start-tag . sgml-start-tag-face)
  (end-tag . sgml-end-tag-face)
  (entity . sgml-entity-face)
  (doctype . sgml-doctype-face)
  (ignored . sgml-ignored-face)
  (ms-start . sgml-ms-start-face)
  (ms-end . sgml-ms-end-face)
  (pi . sgml-pi-face)
  (sgml . sgml-sgml-face)
  (shortref . sgml-shortref-face)
  ))

;; tell PSGML to pay attention to face settings
(setq sgml-set-face t)
;; ...done setting up psgml-mode.
;; *******************************************************************

あとは、Emacs を再起動してください。

3.5.1.1.3. SGML のちょっとしたテスト

ちょっとしたテストをしてみましょう。例として、新規ファイル /tmp/test.sgml を開いて、次のように 書き込みます。

<!DOCTYPE test [
<!ELEMENT test - - (#PCDATA)>
]>

そして、C-cC-p と入力します。 Emacs が DTD を読み込もうとしているなら、ミニバッファに Parsing prolog....done と表示されます。そしたら、C-c C-e RETURN と打って、<test> と入力してみましょう。正しく動いている場合は、 Emacs に次のように表示されます。

<!DOCTYPE test [
<!ELEMENT test - - (#PCDATA)>
]>
<test></test>

3.5.1.1.4. DocBook 形式で新規に HOWTO を書く方法

HOWTO 用に新規ファイルを開いて、次のように入力します。

<!DOCTYPE ARTICLE PUBLIC "-//OASIS//DTD DocBook V3.1//EN">

C-cC-p と打って、画面に注目。すべて予定通りなら、数秒間 Emacs が読み込み処理をして、 ミニバッファに Parsing prolog....done と表示されるのが 分かります。

ここで、C-cC-eRETURN と打ち、<article> エレメントを書き込んで、HOWTO の執筆に取りかかりましょう。

3.5.2. VIM

http://www.vim.org

Emacs についての話をしましたので、当然、次は vi のお話です。VIM (Vi IMproved) エディタは、vi の標準機能を持ちながら、タグの位置をスクリーン上で色分けして 教えてくれます SGML モードも持っています。

3.5.2.1. はじめに

vim プログラムは実際に複数の部分から出来ています。まず、素の vim プログラム があって、これは、vi プログラムやそのコマンドと互換性を持っています。Red Hat ユーザなら、vim-common と vim-minimal パッケージが必要です。次に、拡張機能を 持った vim で、これは標準の vi に対して、構文強調などの 機能があります。Red Hat ユーザなら、vim-enhanced が必要です。最後の見逃せない 機能 として、 X インターフェイスがあり、これは、グラフィカルインターフェイスや メニュー、マウス操作などを提供しています。vim や vi からこれを区別する場合、 グラフィカル操作でのコマンドは、gvim と呼ばれています。

3.5.2.2. 新規文書のロードもしくは作成

vimgvim モードでは、 .sgml ファイルは自動的に認識されて、"sgml モード" に入ります。あらかじめ分かっている一連の DocBook タグが vim に読み込まれると、認識されたタグは茶色で強調されます。認識されない 場合、ライトブルーで表示されます。認識されたタグの属性(attribute)もライトブルー になり、属性の値(value)は、ピンクになります。ここからは、通常の vi コマンドを使って、カーソル移動と編集ができます。

3.5.3. WordPerfect 9 (Corel Office 2000)

http://www.corel.com/

MS Windows プラットフォームの WordPerfect 9 は、SGML と DocBook 3.0 を サポートしています。Linux 用 WordPerfect 9 に SGML 機能はありません。

これは、SGML をサポートしている商用アプリケーションとしては一番安価な ものです。

3.5.4. sgedit

http://www.tksgml.de/

sgedit は、SGML ファイルをビジュアルに編集できるプログラムです。 このプログラムの長所は、あらかじめ Emacs や VI の使い方を知らなくても よい点と、クロスプラットフォームなので、Windows でも Linux でも動くという 点です。商用アプリケーションですが、値段は設定されていません。個人や教育 機関での利用については、フリーライセンス版が出るようです。

ビジュアル編集の他にも、sgedit は、ロード時や必要な時に、 Document->Validate コマンド を使って、文書の妥当性検査ができます。

Figure 3-1. sgedit のスクリーンショット

sgedit プログラムのスクリーンショット。左側には、階層を持った 
SGML 文書のツリー構造が表示され、右側には、文書自体が表示されている。
タグは、グレーの背景で表示される。

3.5.5. nedit

http://nedit.org

率直に言って、nedit は、プログラマ向けで、新規ユーザや特にプログラマで ないユーザにとってはちょっときついかもしれません。それを除けば、タグの色づけ が自由にできたりして、かなりパワフルです。sgedit と異なり、nedit では、タグを 自動で入れたり、文書の妥当性検査を自動的に行ったりはしません。そのかわり、 ウィンドウ の内容に対してシェルコマンドが使えるようになっています。(ファイルを保存した後 で、チェックします。) わたしは、SGML の妥当性検査のために nsgmls を設定し、スペルチェックのために aspell を 設定しましたが、だいたい数分で終わりました。

Figure 3-2. nedit のスクリーンショット

nedit では、画面の左端に行番号が表示されるので、nsgmls でエラーが出た場合に便利です。

3.5.5.1. nedit の使い方

新規文書を作るときは、LDP DocBook テンプレートをダウンロードして使う ことが推奨されています。そのファイルがあれば、nedit を起動してすぐ編集に 取りかかれます。ファイルに .sgml 拡張子を付けて保存しておけば、nedit は、 SGML/HTML タグ機能を有効にしてファイルをロードします。この機能は、 Preferences->Language Mode->SGML HTML コマンドを使って明示的に有効にすることもできます。

3.5.5.2. nedit の Tips とコツ

nedit では、ウィンドウの内容を外部プログラムに出力することができるので、 この機能を使って、普段使っている関数を実行できます。ここで取り上げる例題では、 nsgmls を使い、SGML の妥当性検査を行う方法を紹介します。

まず、 Preferences->Default Settings->Customize Menus->Shell Menu... を選択します。すると、Shell メニュー に登録されている全シェルコマンドを表示するダイアログボックスが出てくるので、 その Menu Entry の欄に "SGML validate" と書き込みます。このエントリーは、 スクリーン上で見ることができます。次に、Accelerator の欄で、 Alt-S を押して、 SGML の妥当性検査が自動で行われるようにします。Command Input の部分では、 window を選択して、Command Output の部分では、dialog を選択します。 Command to Execute では、nsgmls -sv と入力しましょう。これがうまく動くため には、 PATHnsgmls へのパスが設定されていないと いけないので注意してください。

Figure 3-3. nedit へのシェルコマンドの追加

シェルコマンドを追加する時のダイアログボックス。

OK をクリックして、これで元のメインスクリーン に戻ります。SGML ファイルをロードして、Shell+SGML Validate を選択するか、Alt-S を押すと、nsgmls が起動されて、ウィンドウの内容をチェックします。-sv を使う 理由は、-v を指定すると、nsgmls はプログラムのバージョン を出力するので、その出力を見れば nsgmls が実行されたこと が必ず分かるようになるからです。バージョン番号しか出力されない場合は、 文書にエラーがなかったことになります。エラーがあれば、そのエラーが分かる ように、 別のウィンドウが開いて表示されます。行番号機能を有効にしてあるなら (これには、 Preferences->Show Line Numbers を使います。)、nsgmls はエラーを 行番号で表示するので、エラーを見つけるのがずっと楽になります。

Figure 3-4. エラーがない場合の nsgml の出力

nsgmls がエラーを検出しなかった場合は、バージョン番号だけを報告します。