SmartDocはXMLからHTMLとLaTexを生成できる素晴らしいアプリケーションで、文書作成用にemacs上でのsdoc-modeも付属しているが、これはsgml-modeの拡張であり、psgmlとの相性は悪いようで、これらのうち先に使ったモードは問題なく使えるが、そうでない方はエラーになって使えない。
Loading sdoc-mode... File mode specification error: (error "invalid prefix keys in sequence" ?\^S "^C^S^P")
Loading psgml... invalid prefix keys in sequence: ?\^F, "^C^F^E"
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> ]>
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))) )))
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)
を追加する。
現在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 -*- -->のようにする。
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の初期設定を完全に分けることもできるはずだが、似たようなことを両者に書くのも面倒なため(笑)、今は上記のようにして使っている。
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)) )
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を使えるようになる。
psgml-1.10-pkg.tar.gz
を解凍/usr/local/lib/xemacs-20.4/etc/sgml/
をバックアップpsgml-1.10/etc/psgml/
を/usr/local/lib/xemacs-20.4/etc/sgml/
としてコピー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]\\)") ) )