Copyright Philippe Martin 1998
You may redistribute and/or modify this document as long as you
comply with the terms of the GNU General Public Licence, version 2 or
later.
このドキュメントは GNU General Public Licnce(GPL) Version 2 以降に 従う限り再配布や修正を行ってもかまいません。
Se'bastien Blondeelに感謝します。彼は意地悪で、何度も Emacs の セットアップについて質問してきました。彼のするどい質問によって Emacs についてより知る事ができ、そしてその知識はこのドキュメントと してあなたに伝える事ができます。
このドキュメントをより良くするための物であれば、どんなことでも私に聞い てください。あなたの意見全てに目を通します。同じくこのドキュメントの トピックについての質問にも躊躇しないでください。このドキュメントをより 良くするための質問に答える事は嬉しい事です。
(フランス語から英語の翻訳者注:英語に自信が無ければ、私に送ってください!)
(英語から日本語の翻訳者注:英語に自信が無くても、私に送らないで下さい :)
この文書は以下のバージョンのソフトを対象としています。
SGML(Standard Generalised Mark-up Language) は 文書の型を定義する言語です。
例えば文書の型をレシピと定義すると、一番目の部分で材料、二番目で付属品、 三番目でケーキの焼き方の手順を、そして最後に素敵な絵で出来上がりを示します。
これは文書型定義(Document Type Definition 又はDTD)と 呼ばれます。これは最終的にどのように見えるかと言うことを定義するのではなく、 何を含んでいるかということだけを表現します。
同じ例をもう一度使ってみましょう。私のレシピのアイデアを読むと、あなたは 自分が書いたレシピやあなたの好きな料理とそっくり、あるいはアイデアを盗用 されたと思うかもしれませんが、実際には私のアイデアとあなたのアイデアは違っ たことから思いついたものです。私のレシピは浴室の戸棚の左上のすみっこを見 ていて思いついたもので、材料は、プールとバーベキュー調理台の間にある裏庭 を歩いている時にみつけたものです。あなたの場合はどうでしょうか?
標準化定義(SGML)によって、最終的に読者にどのように見えるかということを意識 せずにドキュメントを書くことができます。
この型はあなたの想像通り、Linux に関係するドキュメントを書くために 使用されます。
そのようなドキュメントは通常以下のように構成されます。−タイトルで 始まり、著者名、(翻訳者名)、バージョン、そして日付です。 次に概要(ですから、自分が探している情報が含まれているかどうかを判断す る為にすべてを読む必要はありません)それから目次が来ますので、急いでい る場合には直接読みたい部分へと飛べます。
つぎに章、節(セクション)、段落(パラグラフ)のリストが来ます。これら の中にプログラムやリストの挿入を行ったり、フォントを変更して単語や文 (センテンス)を強調したり、ドキュメント中の他の部分を参照する事などが 可能です。
そのようなドキュメントを書く為に必要なのは単に、タイトル、著者名、日付、 ドキュメントのバージョン、章、節などを正しく指定することとその要素は 何であるかといった事です。
SGML-Tools は、ドキュメント内の指示(タグ)をあなたが目的とする最終的な 形に変換するものです。もしあなたがそのドキュメントを個人用のライブラリ とするのであれば、PostScript を選択するでしょうし、世界中と Web で共有 したいのであれば HTML になるでしょう。もし Windows 上でも読まなければ ならないのであれば(どうしてもそうしたいのであれば)RTF 形式に変換して、 どんなワープロソフトからでも読めるようにすることもできますし、もしくは 気分を変えるために上記の3つのフォーマットすべてを使うこともあるでしょう。
SGML-Toolは anonymous FTP で ftp://ftp.lip6.fr/pub/sgml-tools/ より入手できます。
テキスト形式のドキュメントを、(他のフォーマットにする為に)SGML 形式に 変換したい場合、このように行います。
<!doctype linuxdoc system> <article> <title>ここにタイトルを入れます</title> <author>著者名、著者のe-maiアドレスなどです</author> <date>バージョンと日付です</date>
<abstract>
と </abstract>
タグで囲んでください。
<toc>
タグを挿入して下さい。これは
Table Of Contents(目次)の略です。
<sect>章のタイトルそして、
</sect>
タグを章の最後に追加して下さい。
注意:自動的に行われますので、章番号を付ける必要はありません。
<sect1>
と </sect1>
で
タグ付けする必要があります。
<sectn>
と </sectn>
(n=
2,3,4) を
使う事によって、セクション内で4レベルのネストを定義出来ます。
<p>
タグを挿入して下さい。
<it>
と </it>
(イタリック)、
<bf>
と </bf>
(ボールド)、
<tt>
と </tt>
(タイプライタースタイル)
といったタグを使って下さい。
これは4行のリストです: - ここは1行目です - 2行目です - 3行目です - 最後の行ですこれはこのように表示します。
これは4行のリストです: <itemize> <item>ここは1行目です <item>2行目です <item>3行目です <item>最後の行です </itemize>
<verb> 10 REM おぉ神よ、この言語はいったい何なんでしょうか? 20 REM 永く失われし物のように見受けられますが 30 PRINT "私は戻ってきた"; 40 PRINT "世界を救う為に。" 50 INPUT "あなたはその時誰を頼りますか? ",M$ 60 IF M$="Bill" THEN PRINT "汝は賢人である。":GOTO PARADISE 70 ELSE PRINT "汝は何も分かっておらぬ…":GOTO RICHMOND </verb>
もしドキュメントをフランス語や他の西ヨーロッパの言語で書きたい場合、 8-bit 文字が必要になります。ここではそのような文字を扱うには どのように Emacs をセットアップするかについて説明します。
Emacs
に 8-bit 文字を表示させるためには、以下のような行が .emacs
ファイルの中に必要となります。
(standard-display-european 1) (load-library "iso-syntax")
(訳注: mule も同様です。ただし対応するフォントが必要になります)
Emacs を使用しているターミナルが 8-bit をサポートしていない場合、
iso-ascii
ライブラリーを使用することができます。これは Emacs に
8-bit 文字を表示させる為の最も近い指定です。
iso-ascii ライブラリーを使う場合、
(load-library "iso-ascii")
使っているキーボードでアクセント付き記号の入力が入力できる場合、 何の問題もありません。もしそうでない場合は以下が助けになるでしょう。
Emacs の iso-acc
ライブラリーは、7-bit キーボードから 8-bit 文字を入力
できるようにします。
使用するには、次の行を .emacs
ファイルに入れてください。
(load-library "iso-acc")
それからエディットしたいファイルを実行中の Emacs 上でオープンし、
Meta-x iso-accents-mode
を入力してください。
そうすれば、例えばフランス語の単語である café の
é を、' に続けて e
をタイプすることにより、
入力することができます。
一般的にはアクセント付き文字は、はじめにアクセント記号(')を、
次にアクセントの付けられる文字(大文字、小文字)を入力することに
よって行えます。以下にアクセントの例を挙げます。
'
: Acute`
: Grave グラーブ^
: Circumflex シルコンフレックス"
: Dieresis ディエレーズ~
: Tilde ティルデ, cedilla セディーユ,
およびその他の特定の記号 (iso-acc.el を参照)/
: 文字に斜線を引く、など。アクセント付き記号ではなく、上記の記号自体を入力したい場合、
記号の次にスペースを押してください。例えば、l'éléphant は
l ' spc ' e l ' e ...
と入力します。
全ての使用可能なコンビネーションは iso-acc.el
ファイルの
中で見つける事ができます。
いくつかのターミナルでは、Meta (もしくは Alt)キーで 8-bit 文字を 入力できます。例えば、Meta-i で é 文字を 入力できます。
しかし Emacs では Meta キーは他の機能で使われています。また、アクセント 付き記号の入力を<Meta>キーで行うライブラリーを私は知りません。
このような解決方法があります。
(global-set-key "\ei" '(lambda () (interactive) (insert ?\351))) _ ___
(訳注:上記の意味は、次のようになります。
このような行を .emacs
ファイルに入れると、é を
Meta-i で入力できるようになります。同じようにして必要な
キーコンビネーションを、i や 351 を変更することによって
再定義することができます。(コードは ISO-8859-1 キャラクターセットのものです)
注意! いくつかのローカルモードでキーコンビネーションを 再定義しているかもしれません。
SGML では、アクセント付き記号をマクロで入力できます。例えば、é は é です。− 一般的には、SGML を読む必要のあるアプリケーションは 8-bit 文字を読む事ができますので、このようなマクロを使用する必要はありませんが、 読むことのできないものもあるかもしれません。その場合はマクロを使うことによって、 この問題を解決することができます。
iso-sgml
ライブラリーもおなじように Emacs 上でアクセント付き記号の入力を
可能にしますが、これはファイルをディスクにセーブするときに、これらの
8-bit 文字を SGML の相当するものに変換します。
このライブラリーのおかげでEmacs 上でのドキュメントの入力や編集作業は 簡単です、また 8-bit 対応ではないアプリケーションでもあなたのドキュメントを 扱う事ができるようになります。
このライブラリーを使う為には、次の行を .emacs
に追加するだけです。
(setq sgml-mode-hook '(lambda () "Defaults for SGML mode." (load-library "iso-sgml")))
(訳注: hook については、 auto-fill modeの訳注 でメジャー/マイナーモードと共に説明しています)
.sgml という拡張子を持ったファイルをロードすると、Emacs は自動的に
sgml モードになります。もし自動でならなかった場合、
Meta-x sgml-mode
として手動で行えます。その場合、次の行を
.emacs
ファイルに追加することによって、自動的にモードが
切り変わるようにできます。
(setq auto-mode-alist (append '(("\.sgml$" . sgml-mode)) auto-mode-alist))
(訳注:autoc-mode-alist 変数には、読みこんだ拡張子によって自動的に変更 するモードがリスト形式で入っています。上記の例では .sgml という 拡張子のファイルを読みこんだ場合、sgml-mode というモードに自動的に 変わるように設定しています。同様にして他の拡張子の他のモードも追加できます)
このモードは、例えばどのように 8-bit 文字を入力するかを選択できるように
します。Meta-x sgml-name-8bit-mode
(またはメニューの
SGML/Toggle 8-bit insertion)で、8-bit 文字をいつものように入力するか、
または SGML フォームで、\マクロ を記述します。
このモードでは、sgml-tags-invisible
(またはメニューから
SGML/Toggle Tag Visibility
)で SGML タグの表示/非表示を行えます。
PSGML モードは、Emacs 上での SGML ドキュメントの編集を楽にしてくれます。
psgml-linuxdoc ドキュメントに、このモードのインストール方法と LinuxDoc での使い方についてが説明されています。
通常のモードでは、パラグラフの入力時には行の最後で Return キーを 押して改行する必要があります。改行をしなかった場合、パラグラフの全体が一つ に(一行)になってしまいます。改行するために Return を使用した場合、 右マージンがでこぼこなパラグラフになってしまうでしょう。
適切な長さ以上の行は、エディターによっては見えなくなってしまうかも しれません。
auto-fill モードは、このような面倒な作業を自動化してくれます。 指定のカラム(デフォルトでは 70)を越えた場合、自動的に改行されます。
このモードを使用するには、このように行います。例ではカラムを80に設定しています。
(setq sgml-mode-hook '(lambda () "SGML モードのデフォルト" (auto-fill-mode) (setq fill-column 80)))
(訳注:Emacs/Mule には、メジャーモードとマイナーモードの2つがあり、 sgml-mode はメジャーモード、auto-fill-mode はマイナーモードです。 マイナーモードはどのメジャーモードとも同時に設定できます(できるはずです)。 ですから、上記の例だと sgml-mode になった時に同時に auto-fill-mode マイナーモードにもなるように指定していますが、他のモード (例えば text-mode など)で auto-fill-mode を指定することも 可能です。hook は、(通常)そのモードになる直前に実行されるルーチンの 事です。上記では sgml-mode-hook で記述してる為、sgml-mode に なった時のみ80カラムの auto-fill-mode になるようになっていますが、 コマンドとして実行したり .emacs などに記述する事によって 全モード共通/標準の設定を行う事も可能です)
Emacs上でドキュメントのスペルチェックを行いたい場合、 Ispell パッケージ自身とそれの Emacs モードを使用する事ができます。
ファイルの読み込み時に、辞書を自動的に選択するように(複数の辞書も可能) Emacs をセットアップすることができます。まず一番目の、最も重要なものは Ispell と同時に配布されているメイン辞書です。複数の言語(の辞書)を選択 することもできます。二番目はあなた個人用の辞書で、メイン辞書になく、 あなたが登録した単語の格納先です。
Ispell と同時に配布されているフランス語の辞書をデフォルト辞書、
ホームディレクトリの .ispell-dico-perso
ファイルを個人用辞書として
使用したい場合、.emacs
ファイルに以下の行を追加してください。
(訳注:この文書のオリジナルはフランス語で書かれています。dico は dictionnaire(辞書)、perso は personnel(個人)の 略です。ですから、dico-perso は、個人用辞書という意味になります)
(setq sgml-mode-hook '(lambda () "SGML モードのデフォルト" (setq ispell-personal-dictionary "~/.ispell-dico-perso") (ispell-change-dictionary "francais") ))
複数の言語でのスペルチェックを行う場合、多少の問題があるかもしれません。 例えばドキュメントの翻訳など、言語(及び辞書)を頻繁に切り替える時などです。
私には Lisp で自動的に、もしくはマウスクリック一回で、使用中の言語の メイン辞書・個人辞書を切り替える方法はわかりません(もし御存じでしたら ぜひ教えて下さい!)
けれども、現在のファイルでどの辞書を使用するか(またその辞書のみ使用す ること)をファイルの末尾で指示する事が可能です。コメントとして指定を 追加する事によって、spell-check の起動時に Ispell はそれを読みこむ事が できます。
<!-- Local IspellDict: english --> <!-- Local IspellPersDict: ~/emacs/.ispell-english -->
例えば .emacs
ファイルにデフォルトの辞書としてフランス語の辞書を
指定している場合に、英語で書かれたファイルの末尾にこの行を追加する事が
できます。(追加することによって、英語の辞書を使用することができます)
文書全体をスペルチェックする場合、文書のどこからでも Meta-x ispell-buffer
コマンドを使用できます。また次のようにして、文書のリージョンのみを
チェックすることも可能です。
(訳注:リージョンとは、指定された範囲全体のことです)
Ctrl-Spc
(mark-set-command)で指定Meta-x ispell-region
コマンドを実行そうすると Emacs は Ispell を起動します。未知の単語を見つけた時、 (通常ハイライト表示で)その単語を表示し、以下のようなキー入力を待ちます。
Meta-x ispell-continue
コマンドを実行することによって、スペルチェックを
続行することもできます。ispell が未知の単語に近い単語を見つけた場合、小さなウィンドウを開いて そこに通番を付けて表示します。ミススペルした単語を置き換えるには その番号を単に押すだけでできます。
i キーは単語を個人用辞書に、対して A は単語を ローカルファイル辞書に登録します。
ローカルファイル辞書は、ファイルの末尾にコメントとして挿入された単語の 集まりで、そのファイルを扱う時に Ispell により再度読みこまれます。 これにより、このファイルでのみその単語を既知とする事ができます。
私自身の考えでは個人用辞書には、使用している言語のメイン辞書に無く(例 えばハイフンのついた単語など)、Linux のような固有名詞や造語のような 単語を登録すべきだと思います。ミススペルした単語を既知の単語として扱って しまうかもしれないので、名前などを個人用辞書に大量に登録することは危険 かもしれません。例えば、次のような場合、Ispell は惑わされてしまいます (訳注:未知の単語を既知と扱ってしまいます)。 `When the going gets tof, the tof get going'
(Tof は、名字(フランス語)を略したものです)
Ispell は入力と同時にスペルチェックすることができます。そのためには、
ispell-minor-mode を使用します。モードの開始終了は、
Meta-x ispell-minor-mode
コマンドを実行します。Ispell は未知の単語が
入力されるとビープ音を鳴らします。
もしビープ音がわずらわしい(うたた寝しているルームメイトがいる時とか)
場合、Meta-x set-variable リターン visible-bell リターン t リターン
を
入力して、ビープを鳴らす代わりに画面をフラッシュさせることができます。
次の行を .emacs
に記述する事によって、常にビープ音を鳴らさないように
することもできます。
(setq visible-bell t)
Emacs ではファイルのオープン、セーブ、新しいモードの起動など、 イベントに対するアクションをフックすることができます。
autoinsert ライブラリーはこの機能を使用します。たとえば Emacs 上で ファイルを起動した場合、ファイルのタイプによりこのライブラリーは 標準のヘッダーを挿入します。
私たちのケースの場合、この標準のヘッダーとは LinuxDoc 型のタイトル、 著者、日付のことです。
ここではヘッダーを挿入する方法を、2つ解説します。挿入する情報を含んだ テンプレートファイルを追加する方法と、elisp のルーチンを 実行する方法の2つです。
ファイルをオープンしてまず始めに、Emacs 上で auto-insert
を実行する
必要があります。それから、auto-insert-alist
リストを持っている
autoinsert ライブラリを読みこみます。このリストはファイルの種類別の
ヘッダーを定義していますので、これを修正する必要があります。
デフォルトでは ~/insert/
ディレクトリに、挿入するヘッダーの含まれた
ファイルがありますが、auto-insert-directory
変数を変更することによって
ファイルの場所を再定義することができます。
SGML ファイルをオープンする度に ~/emacs/sgml-insert.sgml
ファイルを
挿入するには、次の行を .emacs
ファイルに追加してください。
(add-hook 'find-file-hooks 'auto-insert) (load-library "autoinsert") (setq auto-insert-directory "~/emacs/") (setq auto-insert-alist (append '((sgml-mode . "sgml-insert.sgml")) auto-insert-alist))
(訳注: alist は連想リストの事です。例えば、
'(pine . cones)
の場合、pine というキーは cones と
いう値に関連づけられます(真ん中の . を忘れずに!)。
またリストの先頭に ' が付いてない場合、リストの初めの
要素は関数名を表します。(foo bar)
は foo 関数に
bar という引数を渡しています。'(foo bar)
は単に
foo と bar という要素の入ったリストです)
これで ~/emacs/sgml-insert.sgml
に好きなヘッダーを記述できます。
Emacs を再起動して(訳注:.emacs
を開いて
Meta-x eval-current-buffer
でもよい)適当な .sgml
ファイルを
起動してみてください。すると Emacs は自動挿入の確認を表示します。
yes と答えるとあなたの作成したヘッダーが挿入されます。
これはファイルを挿入する場合と同じように動作しますが、
auto-insert-alist
に挿入するヘッダーのファイルを追加する代りに、
実行する関数を追加します。
ここではどのように準備するかという事のみを扱います。当然この関数の名前は
~/emacs/sgml-header.el
にしたい事でしょう。(非常に
長くなってしまうと思われる、関数の定義は .emacs
ファイルの中に
記述する必要はありません)
(add-hook 'find-file-hooks 'auto-insert) (load-library "autoinsert") (add-to-list 'load-path "~/emacs") (load-library "sgml-header") (setq auto-insert-alist (append '(((sgml-mode . "SGML Mode") . insert-sgml-header)) auto-insert-alist))
insert-sgml-header
関数の例は、
appendix にあります。
この関数は、ユーザーの利便の為に Linux Documentation Projetct ドキュメ ントをファイルに挿入します。この関数はファイルをオープンした時に自動的、 もしくはユーザーが明示的に指定する事によって呼び出されます。
この関数は mini-buffer からユーザーにいくつかの情報の入力を促しますが、 入力必須の物と、そうでないものがあります。
始めにタイトルの入力を促します。何も入力されなかった場合、何も挿入せずに 関数の実行を終了します。次に日付、著者、著者の e-mail、そして ホームページです(e-mail と home page の入力はオプションです)。
その次は翻訳者の名前の入力ですが、関係が無い場合は単に Return を押せば、翻訳者に関係する情報の入力はこれ以上促されません。 名前を入力した場合、e-mail と home page の入力をするように表示されます (同様にこの2つはオプションです)。
入力が終わるとカレントのバッファに、入力した情報と abstract, toc, sect タグが挿入されます。最後にカーソルを、概要を入力する場所(訳注:つまり <abstract> と </abstract> の間)に 移動して実行を終了します。
(defun insert-sgml-header () "Inserts the header for a LinuxDoc document" (interactive) (let (title author email home translator email-translator home-translator date starting-point) (setq title (read-from-minibuffer "Title: ")) (if (> (length title) 0) (progn (setq date (read-from-minibuffer "Date: ") author (read-from-minibuffer "Author: ") email (read-from-minibuffer "Author e-mail: ") home (read-from-minibuffer "Author home page: http://") translator (read-from-minibuffer "Translator: ")) (insert "<!doctype linuxdoc system>\n<article>\n<title>") (insert title) (insert "</title>\n<author>\nAuthor: ") (insert author) (insert "<newline>\n") (if (> (length email) 0) (progn (insert "<htmlurl url=\"mailto:") (insert email) (insert "\" name=\"") (insert email) (insert "\"><newline>\n"))) (if (> (length home) 0) (progn (insert "<htmlurl url=\"http://") (insert home) (insert "\" name=\"") (insert home) (insert "\">\n<newline>"))) (if (> (length translator) 0) (progn (setq email-translator (read-from-minibuffer "Translator e-mail: ") home-translator (read-from-minibuffer "Translator home page: http://")) (insert "Translator : ") (insert translator) (insert "<newline>\n") (if (> (length email-translator) 0) (progn (insert "<htmlurl url=\"mailto:") (insert email-translator) (insert "\" name=\"") (insert email-translator) (insert "\"><newline>\n"))) (if (> (length home-translator) 0) (progn (insert "<htmlurl url=\"http://") (insert home-translator) (insert "\" name=\"") (insert home-translator) (insert "\"><newline>\n"))))) (insert "</author>\n<date>\n") (insert date) (insert "\n</date>\n\n<abstract>\n") (setq point-beginning (point)) (insert "\n</abstract>\n<toc>\n\n<sect>\n<p>\n\n\n</sect>\n\n</article>\n") (goto-char point-beginning) ))))
日本語訳は Linux-JF プロジェクトの方々から多くのご助言を頂きました。 ありがとうございます。
日本語訳:早川 仁
1999年 2月27日