XEmacs

PSGMLでSmartDoc文書を書く

SmartDocはXMLからHTMLとLaTexを生成できる素晴らしいアプリケーションで、文書作成用にemacs上でのsdoc-modeも付属しているが、これはsgml-modeの拡張であり、psgmlとの相性は悪いようで、これらのうち先に使ったモードは問題なく使えるが、そうでない方はエラーになって使えない。

psgml、sdoc-mode、sgml-modeのコードはざっと見てみたものの、どこを直せばいいのか、よくわからない。

使ってみるとSmartDoc用にはsdoc-modeの方が明らかに便利なのだが、psgmlは常用しているので、今はsdoc-modeを使わずに(ロードせずに)psgmlでSmartDoc文書を書くようにしている。

SmartDocには「妥当な」XML版の文書型定義PureSmartDoc.dtdが付属しているのでこれを利用するわけだが、ふつうのSmartDoc文書の編集には当然ながらエラーがかなり多く起こってうっとうしい。なので、文書の先頭を以下のようにする。もちろんこれでは、ふつうのsdoc文書のように柔軟な書き方はできないし、一部のタグは手入力する必要があり、文脈上エラーにもなるが、ある程度まではこれで、psgmlでの要素や属性の補完、文法チェックなどと、sdocの実行ができるようになる。

<?xml version="1.0" encoding="EUC-JP"?><!-- -*- xml -*- -->
<!DOCTYPE doc PUBLIC "-//Tomoharu Asami//DTD PureSmartDoc XML V0.6.9//EN"
	"/usr/local/lib/sdoc/etc/pure/PureSmartDoc.dtd" [
<!ENTITY % HTMLlat1 PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN"
   "/usr/local/share/xml/dtd/xhtml/xhtml-lat1.ent">
%HTMLlat1;
<!ENTITY % HTMLsymbol PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN"
   "/usr/local/share/xml/dtd/xhtml/xhtml-symbol.ent">
%HTMLsymbol;
<!ENTITY % HTMLspecial PUBLIC "-//W3C//ENTITIES Special for XHTML//EN"
   "/usr/local/share/xml/dtd/xhtml/xhtml-special.ent">
%HTMLspecial;
<!ATTLIST doc xml:lang NMTOKEN #IMPLIED>
<!ATTLIST div xml:lang NMTOKEN #IMPLIED>
<!ATTLIST div normalizer (none) #IMPLIED>
<!ATTLIST span xml:lang NMTOKEN #IMPLIED>
<!ATTLIST a href CDATA #IMPLIED>
<!ATTLIST native format (html|latex2e|plain) #IMPLIED>
<!ATTLIST native src CDATA #IMPLIED>
]>
Written: Sat Mar 10 JST 2001

XMLモードでのface

htmlモード(psgml-html)を除き、psgmlのsgmlモードとxmlモードはデフォルトではタグなどに色がつかない。

(setq sgml-set-face t)してfaceを定義すれば、ファイルを開いた直後は色はつかないがparseなどの操作後の数秒後には色がつくようになる。ただし、htmlモードのようにタグの種類や属性値の色分けはできないが。

また、sgmlモードで定義してしまうとpsgml-htmlでの設定が無効になってしまうので、sgml文書は滅多に書かない私の場合はxmlモードのフックとして定義する。しかし、html文書を開いてC-c C-oしたりすると、この定義が上書きでFontifyingされて色分けに統一感がなくなるので、デフォルトのhtmlモードに似せて、たとえば以下のように定義すればよい。

(add-hook 'xml-mode-hook
  (function (lambda()
    (make-face 'sgml-comment-face)
    (make-face 'sgml-start-tag-face)
    (make-face 'sgml-end-tag-face)
    (make-face 'sgml-doctype-face)

    (set-face-foreground 'sgml-comment-face "blue4")
    (set-face-foreground 'sgml-start-tag-face "steelblue")
    (set-face-foreground 'sgml-end-tag-face "steelblue")
    (set-face-foreground 'sgml-doctype-face "blue4")

    (setq sgml-set-face t)
    (setq sgml-markup-faces
      '((comment   . sgml-comment-face)
        (start-tag . sgml-start-tag-face)
        (end-tag   . sgml-end-tag-face)
        (doctype   . sgml-doctype-face)))
    )))
Written: Sun Jan 14 JST 2001

かんな版21.1.12でのC-o

FreeBSD 4.1-RELEASEから4.2-RELEASEに上げて、21.1.9からja-xemacs-canna-21.1.12に上げたら、なぜか(昔のように)C-oも日本語入力のオンオフに割り当てられるようになっていた。

4.1-RELEASEのときに入れていたja-emacs20-dl-canna-1.4(Gnu Emacs 20.7.1)も、(require 'canna-leim) (set-input-method "japanese-canna")で使っていたのに、いつの間にか同じようになっている(?)。

これはうっとうしいので、入力メソッドのトグルがC-¥だけになるようにするには、.canna(global-unbind-key-function 'japanese-mode)を追加する。

Written: Sun Jan 7 JST 2001

XHTML文書の編集

現在21.1.9だが、XHTML文書の文書型定義(DTD)をsgml-catalog-filesなどで指定しても、拡張子が.htmlだと、なぜかPSGMLはDTDファイルを読み込めず、以下のようなエラーになってしまう。

/usr/local/share/xml/dtd/xhtml/xhtml-special.ent line 2 col 5 entity i18n
/usr/local/share/xml/dtd/xhtml/xhtml1-strict.dtd line 238 col 8 entity HTML
/home/harunaga/public_html/fragment/index.html line 3 col 62 
Name expected; at: :lang    NMT

何か変だが、XHTML文書を編集するときにはhtmlモードではうまくいかず、xmlモードにする必要がある。拡張子が.htmlのファイルはデフォルトではhtmlモードになってしまうので、これをxmlモードで開くためには文書の1行目に<!-- -*- xml -*- -->を入れればよい。もちろんXML宣言が最初になければならないので、1行目は例えば<?xml version="1.0" encoding="iso-2022-jp"?><!-- -*- xml -*- -->のようにする。

Written: Sun Dec 17 JST 2000

初期設定ファイル、カスタマイズ保存ファイルの変更

GNU Emacs 19のグラフィカルな拡張版XEmacs(http://www.xemacs.org/)だが、version 21.1.9現在ではcustomizeメニューによる設定変更が‾/.emacsに保存されてしまうので、MuleやGNU Emacsと併用する場合にはそれらの起動時にエラー・メッセージが表示されて美しくない。

そこで、β版に合わせてカスタマイズ保存ファイルを‾/.xemacs/options.elに変更するために、以前は‾/.emacsの冒頭に以下のように指定していた。

(cond ((featurep 'xemacs)
       (setq custom-file "‾/.xemacs/options.el")
       (load custom-file)
       ))

しかし、それでも、‾/.emacsはGNU Emacs 20とXEmacs(とMule 2.3)の条件分岐だらけで汚くなってきたので、XEmacsだけに関する初期設定を‾/.xemacs/init.elに移し、両者に関連する初期設定は‾/.emacsに条件分岐で書くようにするため、‾/.emacsには以下のように設定することにした。

(cond ((featurep 'xemacs)
       (setq custom-file "‾/.xemacs/options.el"
            user-init-file "‾/.xemacs/init.el")
       (load user-init-file)
       (load custom-file)
       )
)

なお、GNU Emacsは、version 20.4あたり(?)から最優先される初期設定ファイルは‾/.emacsではなく、‾/.emacs.elc‾/.emacs.elになっているようなので、これらを使えば、GNU EmacsとXEmacsの初期設定を完全に分けることもできるはずだが、似たようなことを両者に書くのも面倒なため(笑)、今は上記のようにして使っている。

Modified: Sat Jun 17 JST 2000

シェル・モードでのプロセス・コードの指定

Muleは標準でprocess-coding-system (input)*autoconv*unixになっているが、XEmacs 20.4ではjunetになっているため、シェル・モードを日本語EUCで使う場合にはC-x C-m pで指定する必要があり、面倒になる。

Muleのように起動時に自動判別にするためには、初期設定ファイル(‾/.emacs)に以下のように指定する。

(if (featurep 'xemacs)
    (add-hook 'shell-mode-hook 
    '(lambda () (set-buffer-process-coding-system 'automatic-conversion 'nil) t))
    )

PSGMLパッケージのアップグレード

XEmacsではHTMLファイルを編集するときにPSGMLモードになり、メニューやショート・カットを使うとDTDに基づいて文脈上「正しい」タグしか入力できなくなるし、また、文法チェックも簡単(C-c C-o)なので、かつてのhtml-helper-modeよりも便利なのだが、20.4に含まれているヴァージョン(1.0.1?)にはHTML 4.0のDTDがない。

そこで新しいヴァージョンを探してみるとpsgml-1.10-pkg.tar.gzが見つかったが、これは21.0用のパッケージなので20.4で使うためにはソースをコンパイルし直す必要があるのだが、ソース・アーカイヴは見つけられなかった。

各Lispソースをバイトコンパイルし直してインストールすればいいのだと思ったが、手を抜いて以下のようにしても、とりあえず20.4のPSGMLで新しいDTDを使えるようになる。

LaTeXモード、HTMLモードのアウトライン化

LaTeXモードを使うとき、.emacsに以下のように追加で設定すると、「見出し」以下を階層的に隠したりする「アウトライン・モード」を併用できる(infoを参考に修正した)。

(add-hook 'LaTeX-mode-hook
         '(lambda ()
            (outline-minor-mode 1)
            (setq outline-regexp "¥¥¥¥part¥¥|¥¥¥¥chapt¥¥|¥¥¥¥¥¥(sub¥¥)*section")
            )
         )

同様に、HTMLモードもアウトライン化できるが、<h[1-6]>はどれも2文字なので、残念ながらLaTeXの場合のように階層化はできない。とりあえず<html><head><body>、<h[1-6]>を「見出し」としてそれ以下を隠したりするためには、以下のようにすればよい。

(add-hook 'html-mode-hook
         '(lambda ()
            (outline-minor-mode 1)
            (setq outline-regexp "[ ¥t]*< *¥¥([Hh][TtEe1-6]¥¥|[Bb][Oo]¥¥)")
            )
         )
Written: Fri Apr 16 JST 1999

FreeBSD目次 | トップページ