Keywords: manued-j

# Manued Reference Manual

YAMAUCHI, Hitoshi (山内斉)
(yamauchi'' at''mpi-sb.mpg.de.night.spam)

2002-8-12(Mon)

### 概要:

真鵺道とは，文書の校正方法の一種である．この手法は第39回プログラミン グシンポジウムにおいて竹内郁雄により提案された．この方法はテキストデー タの校正一般に利用可能であるが，その開発の動機が電子的な文書の校正に あったので，遠隔地にて電子メイルを用いて編集者と校正作業を行うような 場合に特に有効である．まず本文書では，真鵺道方式による校正手法を紹介 する．そしてこの校正手法をサポートするemacs lispプログラムである `manued.el`の実装を紹介する．真鵺道による校正手法と `manued.el`が電子メールを利用した原稿，論文のやりとりに繁雑さ を感じている方々の手助けとなれば幸いである．

## 目次

- はじめに
  - 真鵺道の概要
  - この文書の情報
- 真鵺道 Quick Start
  - About Manued
  - Installation
  - Starting Manued
  - Manual について
- 真鵺道(Manued)とは?
  - 真鵺道概要
  - 真鵺道の例
- 真鵺道の文法について
  - 真鵺道修正記号定義コマンドと真鵺道コマンド
  - manued.el ver.0.9 における修正記号定義コマンド
  - manued.el version 0.9 以降における真鵺道コマンド
  - 整形時修正出力 (pretty print)(after ver.0.9.5)
  - サンプル文書
- 真鵺道サポートツール manued.el
  - Download
  - manued.el とその作成経緯について
  - Install 方法
  - manued.elの使用法
  - manued-minor-modeのカスタマイズ方法
  - カスタマイズ可能な変数
  - Bugs
  - Copying
  - Manued ML
- 真鵺道 Tips
  - TeX と真鵺道
- Manued Links
  - 和田先生の manued.el の実装
  - その他の実装
  - Manuediff (by Suzuki)
- 謝辞
- 文献目録
- 索引
- この文書について...

# はじめに

## 真鵺道の概要

現在のところ，電子的な原稿を修正する際に紙に朱を入れるような容易さは期 待できない．特に電子メイルで原稿をやりとりするような環境では利用可能な 文字の種類などが限られるため，校正はさらに困難となる．現在のところ， Email では，以下のような方法で校正情報を伝えることがよく行なわれてい るようである．

        Azimuth のロボット3原則
        ^^^^^^^
          Asimov の間違いでしょう．それに第 0 法則はどうする?

        第一条 : ロボットは他のロボットに危害を加えてはならない．
                               ^^^^^^^^
                                 これは「人間」のはず．

このように校正位置を`'で示し，その下に校正案を示す方法が用いられるが， 通常，この入力には多くの労力を必要とする上，訂正指示を自然言語で行うた め，どの部分をどのように訂正するかについての曖昧さが残る．この方式の最 大の問題点はこの曖昧さである．曖昧さの存在のために電子的なものであるに もかかわらず機械的に校正後の文書を取得することができない．さらに，プロ ポーショナルフォントなどを利用する環境においては訂正位置の情報が正しく 伝わらない可能性がある．つまり，原稿をやりとりする各人の環境の違いによっ ては訂正箇所を特定することすら困難な場合がある．

真鵺道方式の校正はこれらの問題を解決する．校正の指示のための入力は比較 的容易であり，校正前と校正後の原稿の違いは厳密に定義される．したがって， 校正箇所の指示や，訂正の指示なのか単なるコメント文なのかを誤ることはな い．特に真鵺道方式の利点は環境を選ばないことであり，テキストを編集可能 なエディタであれば利用することができる．基本的には特殊な環境もエディタ も不要である．

真鵺道方式が仮定するのはテキストエディタだけであるが，さらに便利に利用 することを考えて Emacs 上に manued-minor-mode を実装した． manued-minor-mode では大きく分けて以下の機能を利用可能である．

- 校正前，校正後の文書の自動抽出
- 校正場所のサーチ
- 真鵺道方式の校正指示のための入力補助

真鵺道方式は環境を選ばないため，このような道具の実装は Emacs 上に限る ことではない．今回 Emacs 上に実装したのは筆者が良く利用する環境である という理由にすぎない．したがって，他の環境で実装を行なった方があればぜ ひお知らせ頂きたい．現在要望のある環境は以下の通りである．

- vi
- Microsoft Word
- 真鵺道文書整形のためのフィルタコマンド

## この文書の情報

- 著者
  Copyright (C) 1997-2002 山内 斉 (YAMAUCHI, Hitoshi)
- 連絡先
  yamauchi" at "mpi-sb.mpg.de.nicht.spam
  (メイルを送信される場合には最後の.nicht.spamを削り， ``at''を @ に変更して下さい)

# 真鵺道 Quick Start

## About Manued

真鵺道とは，第39回プログラミングシンポジウムにおいて竹内郁雄先生により 提案された電子メイルなどでの論文や文書のやりとり時の校正をより容易にす るための方法である．その方法を実践するための実装の一つとして `manued.el`をお届けする．`manued.el`が電子メールにおける 原稿，論文のやりとりに繁雑さを感じている方々の手助けとなれば幸いである．

## Installation

`manued.el`は Emacs Version 19.34 以降に依存している．Emacs Version 19.34 以降のものあるいは，それに基づいた Mule 等を利用されたい． 筆者の環境は GNU Emacs 19.34.1, Mule Version 2.3 (SUETSUMUHANA)である． Install は以下のように行う．

1. `manued.el`を load-path の通った場所に置く．
2. .emacs に次の行を追加する．

       (autoload 'manued-minor-mode "manued" "manuscript editing mode" t)

## Starting Manued

チュートリアルファイルを読み込み，指示に従うか，あるいは， manued-minor-mode に入って動作を確認する．

- チュートリアル
  manued.tut というファイルがアーカイブに付属しているはずなのでそれを emacs に読み込み，指示に従う．
- 手動の動作確認
  1. M-x manued-minor-mode で manued-minor-mode に入る．
  2. テキストを入力する．
  3. マークとカーソル移動を用いてリージョンを作成し， manued-insert-swap-command (C-c C-m C-s) により，リージョンを swap コマンドで囲んでみる． manued-show-newer-in-manued-buffer を実行す ることによって校正後の文書が抽出される．
  4. その他，メニューの項目を試す．M-n, M-p で前後の真鵺道コマンド の位置を探すことができるのでそれを試してみる．

## Manual について

manual は現在のところ，以下の形式で作成されている．

- `manued-j.html` : 日本語版，HTML format. Web browserを利 用して御覧になれます．英語版の `manued-e.html` もあります．
- `manued-j.ps` : 日本語版，PostScript format. この英語版は `manued-e.ps` です．

# 真鵺道(Manued)とは?

## 真鵺道概要

真鵺道とは，第39回プログラミングシンポジウムにおいて竹内郁雄先生により提案された電子メ イルなどのテキストデータを介した論文や文書のやりとり時の校正をより容易 にするための校正用言語 (Manuscript Editing Language) である [3]． 以下にこの論文の概要をまとめる．Web上には原文のテキストがあります．

電子メールによって原稿を修正する際には，

- 紙の上のような訂正記号が使えない．利用できる文字集合の種類が限ら れる．
- 色が利用できない．
- mail reader によっては文書の二次元情報を保存しないものがあり，編 集者や著者が異なる mail reader を用いている場合に情報が伝わらない(例 えば Eudora など)．もともと電子メイルでは二次元情報についての規定が ないのでそのような状況は常に発生しうる．
- 改行位置に依存したくない．エディタやワープロなどの行の折り返し機 能などによって訂正情報が失われることを避けたい．

という問題がある．このような問題に対して，紙に印刷して校正を朱で入れ， 郵送するという手が一般に行なわれてきたが，それでは間にあわないことが多 い．Fax という手もあるが，受信した紙から電子情報への変換時には人間が入 力する部分が存在し，手間がかかる上に誤りが混入する可能性が高くなる．手 書き文字の OCR 技術もあるがまだ成熟したとは言えない．さらに朱を入れた 原稿中の訂正記号を解釈して文書を編集することは現在のところ困難であると 思われる．結局，もともとの原稿は多くの場合電子情報であり，それを利用で きなくする手はあまり賢いとは言えまい．

そこで，文献 [3]では

- 修正前と修正後の文書を機械的に抽出できること(必須)
- 人間にとって読みやすいこと
- 訂正箇所の視認性が良いこと
- 修正に対するコメントが入れられること
- 修正情報の書き込みが容易なこと
- 繰り返される修正を抽象化すること

が提案されており，これを実現する原稿修正言語を Manued (Manuscript Editing language) と呼んでいる．今回はこの実装を行なった．

## 真鵺道の例

簡単な例題を示そう．

> 1月17, 18 日の両日には雪の残る中 共通一次 試験が行なわれた．この試験では 受検 者は時計を机上に置くことを許されている．その中の一人が大きな のっぽの古時計をどんと と 机の上 にいた時にはびっくりした．

環境(ブラウザなどの違い)によっては見えないかもしれないが，訂正する箇所 の付近を強調してある．これを次の文書のように訂正したいとしよう．

> 1月17, 18 日の両日には雪の残る中 センター 試験が行なわれた．この試験では 受験 者は時計を机上に置くことを許されている．その中の一人が大きな 目覚し時計をどんと机の上に 置いた時にはびっくりした．

たとえばこれまでは，

    １月１７，１８日の両日には雪の残る中共通一次試験が
    　　　　　　　　　　　　　　　　　　＾＾＾＾
    　　　　　　　　　　　　　　　　　　　センターに訂正（昔の話だねえ）
    行なわれた．この試験では受検者は時計を机上に置くことを許されて
    　　　　　　　　　　　　＾＾＾
    　　　　　　　　　　　　　　受験者
    いる．その中の一人が大きなのっぽの古時計をどん
    　　　　　　　　　　　　　＾＾＾＾＾
    　　　　　　　　　　　　　　　目覚し
    とと机の上にいた時にはびっくりした．
    　＾　　　＾＾
    ‘と’が余分　‘に’と‘い’の間に‘置’の抜けあり

のように訂正していた．このような文書をブラウザで表示するために，私は2 次元の表示が保存されるタグと全角のスペースを利用したが，もしも利用しな い場合には，この方法は役に立たないだろう．たとえば同じ情報を2次元情報 を保持するタグを利用せずに次に示してみる．ブラウザは通常2次元情報を保 存しない (たとえば空白や改行を無視する) ので，それぞれの環境で異なる表 示となるであろう．ある人は読めるが，ある人は読めないことになる．読めな い環境の方にはこの方法が役に立たないことが一目瞭然であろう．

１月１７，１８日の両日には雪の残る中共通一次試験が　　　　　　　　　 　　　　　　　　　　　　　　　　　　＾＾＾＾　　　　　　　　　　　　 　　　　　　　　　　　　　　　　　　　センターに訂正（昔の話だねえ） 行なわれた．この試験では受検者は時計を机上に置くことを許されて　　　 　　　　　　　　　　　　＾＾＾　　　　　　　　　　　　　　　　　　　 　　　　　　　　　　　　　　受験者　　　　　　　　　　　　　　　　　 いる．その中の一人が大きなのっぽの古時計をどん　　　　　　　　　　　 　　　　　　　　　　　　　＾＾＾＾＾　　　　　　　　　　　　　　　　 　　　　　　　　　　　　　　　目覚し　　　　　　　　　　　　　　　　 とと机の上にいた時にはびっくりした．　　　　　　　　　　　　　　　　 　＾　　　＾＾　　　　　　　　　　　　　　　　　　　　　　　　　　　 ‘と’が余分　‘に’と‘い’の間に‘置’の抜けあり

また，2次元情報を保存する環境であっても，コメントと訂正部分の区別がわ かりにくかったり，あるいは空白を入れて位置を示す努力したにもかかわらず， 後に文書の前方に修正を加えたために後方の位置関係が全体としてずれてしま うなどの不都合が発生することがある．また，文書のフォーマットの違いなど により，カットアンドペーストを行うと意味不明になることがある．真鵺道は 2次元情報を保存するしないにかかわらず，両方で利用可能な校正方法として 提案される．

真鵺道では基本的に次の2つの置き換えの規則を了解してもらい，校正の操作 を記号化する．

- `[A/B]` : A を B で置き換える このバリエーションとして
  1. `[A/]` : A を消す(A を空文字で置き換える．)
  2. `[/A]` : A を挿入する(空文字を A で置き換える．)
- `[A|B|C]` CBA の順に並べ換える このバリエーションとして
  1. `[A||C]` A と C を交換する

上の規則によって最初の文章を書き換えると次のようになる．

> 1月17, 18 日の両日には雪の残る中 [共通一次/センター;昔の話だねえ] 試験が行なわれた．この試験では [受検/受験] 者は時計を机上に置くことを許されている．その中の一人が大きな [のっぽの古/目覚し] 時計をどんと [と/] 机の上に [/置]いた時にはびっくりした．

これだけでもかなり強力であることがおわかりだろう．真鵺道がどのようなも のかの感じはだいたいつかんで頂けたであろうか．このような規則を処理して 校正後の文書を抽出するようなサポートを行うツールがあれば，この処理は更 に強力なものとなるだろう．その実装の一つが`manued.el`である．こ れは訂正文書中の訂正箇所の強調表示，訂正前(後)の文書を強調し，訂正後 (前)の部分やコメントを薄く表示する機能や，訂正前(後)の文書の抽出など を行うプログラムである．

# 真鵺道の文法について

## 真鵺道修正記号定義コマンドと真鵺道コマンド

真鵺道には，文書中で用いる記号を定義する「修正記号定義コマンド」とその 記号を用いて校正箇所・方法を示す「真鵺道コマンド」がある．真鵺道で用い る記号を定義するコマンド (修正記号定義コマンド) はdefで始まり，defコマ ンドとも呼ぶ．この修正記号定義コマンドが真鵺道コマンドを規定する．これ は，

- 電子メイルでは利用可能な記号が少いため文書ごとにどの文字を真鵺道 コマンドとして用いるかを文書ごとに変更させた方が都合が良い．これは文 書中の利用頻度が低い文字を校正記号として使わないと，校正部分について の混乱が発生するためである．それに対応するため．

- 上記とほとんど同義であるが，固定した記号を用いた場合にはエスケー プを多用しないといけない文書が発生し，可読性が下がる．これを避けるた め．

である．この修正記号定義コマンドは真鵺道コマンドを含む文書の冒頭に置か れる．行頭にない場合には修正記号定義コマンドとはみなされない．

真鵺道コマンドは修正記号定義コマンドから先頭のdefを除いた名前を持って いると考えれば良い．たとえば，真鵺道における置換(削除・挿入)を示すコマ ンドはdeleteコマンドである．このdeleteコマンドの記号を ★ にするには，

            defdelete ★

という行を文書の行頭に記す．すると，この定義のみが行なわれた場合には他 の記号はデフォルトの記号となり，

            [元の削除される文★修正後に挿入される文]

というコマンドによって「元の削除される文」が「修正後に挿入される文」に 置換される．

修正記号定義コマンドがない場合，真鵺道コマンドの記号として竹内郁雄先生 (と秘密結社大日本清談会)が提案したdefaut記号が使用される．

##
`manued.el` ver.0.9 における修正記号定義コマンド

修正記号定義コマンドは，通常，校正文書の冒頭に以下のように書かれる．

            defparentheses  [ ]
            defdelete       /
            defswap         |
            defcomment      ;
            defescape       ~
            deforder        newer-last
            defversion      0.9.5

以下，各行について説明する．また，各コマンドで定義されるデフォルトの文 字列は説明の最後に示す．

- defparentheses
  修正記号定義コマンドの範囲指定の文字列を指示する．(default値 ``[ ]`')

- defdelete
  修正記号定義コマンド中でこのコマンドで指定された文字列の前後を置換す る (削除と挿入)．(default値 ``/`') e.g. [A/B] は AをB に置換 する．

- defswap
  修正記号定義コマンド中でこのコマンドで指定された文字列の前後の入れ換 えを行う．(default値 ``|`') e.g. `[A|B|C]` はABCをCBAとな るよう入れ換えを行なう．

- defescape
  修正記号定義コマンド中において修正記号定義コマンドをエスケープする．
  (default値 ``~`')
  たとえば，[This is `~`[foo`~`]/These are `~`[bars`~`]] とすると，This is [foo] を These are [bars] に置き換える． しかし，このようなものが多数あるようならばdefparentheses 『 』 のよ うに定義し，『This is [foo]/These are [bars]』とした方が良いだろう．
  ここで一つ注意することがある．真鵺道コマンドに入っていない時，つまり， 平文中ではエスケープされるものはdefparenthesesで指定する最初の文字列 だけである．これはTEXの文中などで

              ここで $a_n/b_n$ という比を考えてみよう．
              ~[\lim_{n \to \infty} \frac{a_n}{b_n} \]

  のような場合に真鵺道コマンドと関係ない部分の真鵺道コマンド文字列をい ちいちエスケープしないためである．ここでは 中の / や，] な どが真鵺道コマンドに一致している．しかしこれは真鵺道のコマンド中にあ るわけではない．このようなものを全てエスケープするのは繁雑であるため， この必要がないよう，平文中であればコマンドの始まりである文字列 (ここ では``~`[') 以外は真鵺道コマンドとみなさないことにしている．

- defcomment
  修正定義コマンド中でこの記号から後をコメントみなす．この記号から後の 文字は整形後は削除される．(default値 `;')

- deforder
  deleteコマンドによって文を置換する際，defdelete記号の前後どちらを新しい 文書とみなすかを示す．(default値 `newer-last')コマンド内部の並びは `[`first/last`]` として順序づけられる．ここで first の部分を修 正後の文と新しいみなすか，あるいは first 部分を訂正前の文とみなすかを決 定する．この指定は，(newer older) と(first last) の組み合わせによる．そ の組み合わせは
  - newer-first
  - newer-last
  - older-first
  - older-last
  の4つとなる．このdeforder修正記号定義コマンドはdeleteコマンドの並び を決定するだけで真鵺道の記号を決めるものではない．

- defversion
  `manued.el`のバージョン情報を示す．(default値 `(manued-version-num)')

修正記号定義コマンドは訂正文書の最初に書いておく．また各コマンドは行頭 から初まるものとする．もし書いていない場合には default 値が利用される． このとき，異なるdefコマンドで定義される記号が同一の場合など，記号の区 別ができないとプログラムがみなす場合，`manued.el`はそれを検査し て警告を出す．そのまま同一の定義を用いた場合の`manued.el`の挙動 は定義されていない．

##
manued.el version 0.9 以降における真鵺道コマンド

ここでは真鵺道コマンドをdefaultの記号を用いて説明する．

- `[`A/B`]`
  Aを消去し，Bを挿入する．
  このバリエーション
  1. `[A/]` : A を消す(A を空文字で置き換える．)
  2. `[/A]` : A を挿入する(空文字を A で置き換える．)

- `[A|B|C]`
  AとCの位置を入れ換え，CBAの並びで出力する．
  このバリエーション
  1. `[A||C]` AとCを入れ換える．

- `[`; comment `]`
  ; から `]` まではコメントとなる．

- 補足
  エスケープ文字の直後は解釈されない．コマンド文字を書きたい場合，例え ば ``[`' を書きたい場合には ``~[`' とすると， ``[`' が書ける

これらのコマンドのネストは可能であり，処理は内側から行なわれる．ただし， 解釈できないような並びはエラーである．たとえば真鵺道コマンド範囲の始ま りの文字列に対応する終了文字列が存在しない場合や， `[A|B/C|]` のように解釈できないものはエラーである．

## 整形時修正出力 (pretty print)(after ver.0.9.5)

真鵺道で新しい文書を抽出する際，その部分に何かしらの修正を施したい場合が ある．たとえば，Markup言語を使って文書を書いている場合，校正箇所をその Markup言語によって強調するなどである．これを行いたい場合には，

      M-x manued-set-pretty-print-on

を行い，文書の抽出を行えば良い．これを例1を用いて説明する．

例 1: `[A/B;C]` を整形して， `\colortext{blue}{A}\colortext{red}{B}\colortext{green}{C}` とした い．つまり，TeXの出力にて，校正箇所に色をつけたい場合．

    (setq manued-pretty-print-format-delete-list
      '("\\colortext{blue}{%s}" "\\colortext{red}{%s}" "\\colortext{green}{%s}"))

と `.emacs` あるいは `.manued.el` に記しておく．このリスト の意味は次のように消去コマンド(deleteコマンド)の各部分に対応する．

    (setq manued-pretty-print-format-delete-list
      '("First Element Format" "Second Element Format" "Comment Element Format"))

なお各要素の文字列はEmacs の format 関数の引数となる．

### 整形時修正出力例

例 2: `[A/B;C]` でオリジナル文字部分(A)とコメント部分(C)は表示せず， 校正によって訂正された部分をTeXの `Large` 文字で出力したい場合．

     (setq manued-pretty-print-format-delete-list
       '("" "{\\Large %s}" ""))

例 3: 真鵺道コマンドを他の形式に変更したい場合．たとえば， `[A/B;C]` を `{A*B@C}` に変更したい場合．

    (setq manued-pretty-print-format-delete-list
      '("{%s*" "%s" "@%s}"))

また，真鵺道ではコメントは optional なものである．そのため，コメント部分 が存在しない場合，デフォルトではコメントの format 文字も出力しない．しか し，これは `manued-pretty-print-null-comment-out-p` によって制御で きる．また，スワップ(swap)コマンドでもこのような整形時修正出力のカスタマ イズが可能である．詳しくは 5.6.4 を参照のこと．

##
サンプル文書

### サンプル1

defparenthesesとして利用可能なものは空白のない任意の文字列なので，以下 のような記号も可能である．

        defparentheses ^_^[  ]^_^

        真鵺道は^_^[/，]^_^^_^[【/『;この括弧にするべきだろうか]^_^
        Manuscript Editing Language』に由来する．

修正後:

        真鵺道は，『Manuscript Editing Language』に由来する．

### サンプル2

2バイト文字が利用可能な環境ではこの形が利用しやすいと思われる．

        defparentheses 【 】

        受験生の一人が受験写真を撮った後にイメチェンをしたらしく，試験監督
       【間/官】の間で「あれは別人ではないか」という【教義/協議】があった．
        【/結局別人ではないらしいということに落ち着いた．】

修正後:

        受験生の一人が受験写真を撮った後にイメチェンをしたらしく，試験監督
        官の間で「あれは別人ではないか」という協議があった．結局別人ではな
        いらしいということに落ち着いた．

### サンプル3

SGML, HTML, XML 風のもの

        defparentheses      <manued> </manued>
        defdelete   /

        「原稿は残っているんです．<manued>/ここに．</manued>」
        「我に<manued>市場/至上</manued>の歌声を届けよ．」
        「<manued>何時/汝</manued>のあるべき姿に戻れ．」

修正後:

        「原稿は残っているんです．ここに．」
        「我に至上の歌声を届けよ．」
        「汝のあるべき姿に戻れ．」

### サンプル4:おまけ

これは私の友人の楯岡氏からどうであろうかと提案されたものである．sed の コマンドに似ているため，ある種の人にはなじみやすいであろうが，個人的に は可読性が低いのではないかと思う．

        defparentheses s/ /g
        defdelete //
        defescape ~

        電子メイルにおいて2次元情報が保存されないためにs/Email//電子メイ
        ル/gにs/よ///gよる編集が円滑に行なわれないことを嘆いた竹内郁雄先生
        によってs/まぬえs/うど//どう;こんなコメントは?/g//真鵺道/gs///が/g
        提案された．

修正後:

    電子メイルにおいて2次元情報が保存されないために電子メイルによる編集が
    円滑に行なわれないことを嘆いた竹内郁雄先生によって真鵺道が提案された．

# 真鵺道サポートツール `manued.el`

真鵺道をサポートするツールとして，`manued.el`を提供する．

## Download

以下のWeb Siteに最新版の`manued.el`とドキュメントがある．

- http://www.mpi-sb.mpg.de/~hitoshi/otherprojects/manued/index-j.shtml
- http://www.archi.is.tohoku.ac.jp/~yamauchi/otherprojects/manued/index-j.shtml
- http://ne.cs.uec.ac.jp/(ミラーサイト)

##
manued.el とその作成経緯について

`manued.el`は真鵺道をサポートする Emacs Lisp プログラムである． 真鵺道自体は，電子メイルで原稿の校正を容易にするための方法である．これ をサポートするツールとしては，コマンド部分に色をつけるものから，整形前 と後の文書を元に真鵺道形式に変換するものなど様々な形態が考えられる．今 回提供する`manued.el`は Emacs 上で真鵺道コマンド部分の色付け， コマンドのサーチ，整形 (修正前あるいは修正後の文章の取り出し)，また真 鵺道文書作成補助機能などを提供する．

私は大学院生時代に佐藤雅彦先生の授業を受けた時からLispという言語に興味 を持っていた．しかし，一度もLispプログラムを書いたことがなかった．実は Lispに興味を持ってから何度かLispに挑戦したのだが，まわりに気軽にLispに ついて聞けるLisp使いがいなかったことや，Lispで本当に書きたいものという ものがわからず，挫折していた．研究室にはHCL(Hokkaido Common Lisp)とい う処理系がOmronのLuna 68Kというマシン上にあり，興味からほんの少し触っ た程度であった．

大学院を離れてから電子メイルにて論文の原稿を何度かやりとりする必要が生 じたが，修正事項を上手く伝えられないことと，その手間の多さに辟易してい た．そんな頃，プログラミングシンポジウムに参加し，真鵺道の発表を聞いて いるうちにたちまち魅かれた．これこそEmacs Lispで書くべきものだ．そう思っ た．プロシンの会場に居た方々の中にはこの考えに共感して頂ける方もきっと いらっしゃると思う．竹内先生が「これはLispの例題としては，4年生が卒論 に入る前準備程度のレベルのものだろう」とおっしゃったことから，私はこの 真鵺道プログラムは私にとって良いLispの勉強の例題になるだろうと考え， Lispの勉強からはじめた．幸い今回はその点に関してはすばらしい先生にめぐ まれ，ここに`manued.el`を提供することができる．

##
Install 方法

`manued.el`はEmacs Version 19.34以降に依存している．Emacs Version 19.34以降のものあるいは，それに基づいたMuleを利用すること．作 者が `manued.el`を開発した環境はGNU Emacs 19.34.1(mule Version 2.3 (SUETSUMUHANA)) である．

1. manued.el を load-path の通っている directory に置く
2. .emacs に次の行を追加

       (autoload  'manued-minor-mode "manued" "manuscript editing mode" t)

##
`manued.el`の使用法

真鵺道文書をバッファに読み込み，M-x manued-minor-mode で真鵺道モードに 入る．以下のコマンドが利用可能となっている．キーのデフォルトのバインド などは今後の検討課題である．もちろんカスタマイズ可能である．

- モード開始とその他
  - M-x manued-mode
    これはmanued-minor-modeのaliasである．次の manued-minor-modeの項を参照．

  - M-x manued-minor-mode
    真鵺道minor modeに入る．version 0.9.0以降の `manued.el`には基本的にminor modeしか存在しない．作 者はLaTeX-modeや，indented-text-modeなどと併用する以外の利 用法が見い出せなかったため，保守の容易さも考慮して minor-modeのみの実装に簡略化した．

  - M-x manued-show-version
    真鵺道のバージョンを知らせる

  - M-x manued-insert-headder
    修正記号定義のためのヘッダを挿入する

- hilit関係
  - M-x manued-hilit-older
    元文書部分を hi-light する
  - M-x manued-hilit-newer 校正後の文書部分を hi-light する
  - M-x manued-recenter-hilit
    現在のポイントを画面の中央に移動し，re-hilit を行う．

- 整形コマンド
  - M-x manued-show-older-in-manued-buffer
    現在のバッファの内容から元文書を他のバッファに整形して出力する
  - M-x manued-show-newer-in-manued-buffer
    現在のバッファの内容から校正後の文書を他のバッファに整形し て出力する
  - M-x manued-show-older-region
    指定されたリージョンの内容から元文書を整形して出力する．リー ジョンは上書きされる．
  - M-x manued-show-newer-region
    指定されたリージョンの内容から校正後の文書を出力する．リー ジョンは上書きされる．
  - M-x manued-eval-last-manuexp
    直前の真鵺道コマンドを整形する
  - M-x manued-set-pretty-print-on
    文書整形時に修正出力(pretty print)モードにする
  - M-x manued-set-pretty-print-off
    文書整形時に修正出力(pretty print)モードを off にする

- 真鵺道コマンド挿入
  - M-x manued-insert-swap-command
    マークした所から現在のポイントを狭んで swap コマンドを挿入 する．manued-is-swap-command-with-comment-on が t にセット されている場合にはコメントも一緒に挿入する．
  - M-x manued-insert-swap-command-toggle-comment
    manued-insert-swap-command と同じであるが，コメント挿入の 条件が逆になり，manued-is-swap-command-with-comment-on が nil の場合にコメントを挿入する．
  - M-x manued-insert-delete-command
    マークした所から現在のポイントの範囲を消去する範囲として deleteコマンドを挿入する． manued-is-delete-command-with-comment-on がt にセットされ ている場合にはコメントも一緒に挿入する．
  - M-x manued-insert-delete-command-toggle-comment
    manued-insert-delete-command と同じであるが，コメント挿入 の条件が逆になり，manued-is-delete-command-with-comment-on が nil の場合にコメントも挿入する．
  - M-x manued-insert-comment-region
    マークした所から現在のポイントの範囲を囲むように comment コマンドを挿入する．
  - M-x manued-insert-comment-at-point
    現在のポイントにコメントコマンドを挿入する．

- 検索コマンド
  - M-x manued-next-l-parenthesis
    次の真鵺道コマンドの始まりをサーチし移動する
  - M-x manued-previous-l-parenthesis
    直前の真鵺道コマンドの始まりをサーチし移動する

##
`manued-minor-mode`のカスタマイズ方法

カスタマイズ方法は大きく分けて二種類ある．一つはemacs lisp変数の default 値を変更する方法である．変更可能な変数は後に示す．もう一つは hook 関数を用いる方法である．関数 `manued-minor-mode' は最後に

    (run-hooks 'manued-minor-mode-hook)

を実行する．そこでこのhookを利用して mode に依存したカスタマイズが可能 である．(が，現在は可能であるという程度である．)

また，筆者の薦める方法は `.manued.el`というファイルをホームディ レクトリに置き，その中で真鵺道関係の設定を行い，`.emacs`にて読 み込む方法である．そのためには，`.manued.el`というファイルを作 成し，`.emacs`に

    (load-file "~/.manued.el")

と書いておく方法である．

##
カスタマイズ可能な変数

###
修正記号定義コマンド

この真鵺道コマンド記号のデフォルト値は文章中に修正記号定義コマンド (def*)が出現すると上書きされる．それらの指定が無い場合に採用されるデフォ ルトの記号も示す．

- manued-l-parenthesis-str
  真鵺道コマンドの開始記号の default 値 (defalut ``[`')
- manued-r-parenthesis-str
  真鵺道コマンドの終了記号の default 値 (defalut ``]`')
- manued-delete-str
  置換コマンドの記号の default 値 (defalut `/')
- manued-swap-str
  交換コマンドの記号の default 値 (defalut ``|`')
- manued-comment-str
  コメントのはじまりの記号の default 値 (defalut `;')
- manued-escape-str
  エスケープ記号の default 値 (defalut ``~`')
- manued-order-str
  置換コマンドの適用順 (defalut `older-first') ``older-first'', ``newer-last'' あるいは ``older-last'', ``newer-first''．真鵺道の置 換コマンドは `[`first/last`]` の形をしており，どちらを元の 文書(older)とみなすかを指定する．4.2節の deforderの項を参照．

`manued.el`は起動時にこれらに同一の記号が割り当てられたかどうか をチェックする．そしてもし同一の記号が割り当たっているようであれば警告 出すので，正しい動作が可能なように def コマンドの定義を直す必要がある．

###
真鵺道文書の範囲指定

注意: 文書の範囲指定に関しては今後廃止の方向で検討している．

`manued.el`は真鵺道の文書の範囲を指定することができる．ただし， これらの文字列が存在しない場合には，真鵺道文書の初まりは文書の先頭に， 終わりは文書の最後とみなされる．

- manued-doc-begin-pat
  真鵺道文書の初まりを示す文字列を入れておく (defalut `-*-*- BEGINMANUED -*-*-')
- manued-doc-end-pat
  真鵺道文書の終わりを示す文字列を入れておく(defalut `-*-*- ENDMANUED -*-*-')

###
Hi-Light の色

色の使用に関しては3つの選択肢がある．それぞれ， `manued-use-color-hilit`を以下の括弧の中の値にセットする．

- 可能な場合には常に使用する場合．(`t`)
- 常に使用しない場合．(`nil`)
- font-lock-modeに追従して利用する場合．(`'follow-font-lock-mode`)

例

    (setq manued-use-color-hilit 'follow-font-lock-mode)

色の指定には，emacs の色指定名を 6 つ並べたリストを用いる．どのような 色があるかは M-x list-colors-display にて見ることができる．色のリスト の各要素の意味は次のようになっている．

    '(delete-first-color delete-last-color
      swap-alpha-color swap-beta-color swap-gamma-color
      comment-color command-color)

それぞれの意味を以下に示す

- delete-first-color, delete-last-color
  次のように delete コマンド中の色を指定する． `[`delete-first-color/delete-last-color`]`
- swap-alpha-color, swap-beta-color, swap-gamma-color
  次のように swap コマンド中の色を指定する． `[`swap-alpha-color | swap-beta-color | swap-gamma-color`]`
- comment-color
  `[`;comment`]` の comment 部分の色を指定する．
- command-color
  コマンドの記号(default では ``[`',`/',`;',``]`' ) の色を指定する．

たとえば，デフォルトでは

     '(red gray60 blue red green4 BlueViolet gray60)

のようなリストとなっている．また，デフォルト値のリストを保持している変 数は次の通りである．

- manued-first-hilit-color-list
  first 部分を hi-light する場合の色リスト
- manued-last-hilit-color-list
  last 部分を hi-light する場合の色リスト

###
整形時修正出力 (pretty print) のカスタマイズ

- manued-pretty-print-format-delete-list
  消去コマンド用の整形出力(pretty print)の際に利用される format の リスト． (default `'("\\textnormal{%s}" "\\textbf{%s}" "\\textit{%s}")`)

- manued-pretty-print-format-swap-list
  交換コマンド用の整形出力(pretty print)の際に利用される format の リスト．(default `'("\\textbf{%s}---" "\\textbf{%s}" "---\\textbf{%s}" "(\\textit{%s})")`

- manued-pretty-print-on-p
  整形コマンドの実行時に修正出力(pretty print)を行うか．(default `nil`) この値はコマンド (`M-x manued-set-pretty-print-on`, `M-x manued-set-pretty-print-off`) でも変更できるが，常に 修正出力を行いたい場合には `t` とすることができる．

- manued-pretty-print-null-comment-out-p
  真鵺道コマンドでコメント部分が存在しない場合，format 文字列そのも のも出力されないが，この変数を `t` にすると空のコメントがあ るとして出力される．注意: この変数は buffer local ではない．

### その他のカスタマイズ

- manued-mode-syntax-table
  syntax-table の default 値 (default : text-mode-syntax-table)
- manued-mode-abbrev-table
  abbrev-table の default 値 (default : text-mode-syntax-table)
- manued-mode-map, manued-minor-mode-map
  キーマップの default 値
- manued-is-delete-command-with-comment-on
  manued-insert-delete-command において，deleteコマンド内部にコメント 文字を挿入するかしないかを制御する．t で挿入．
- manued-is-swap-command-with-comment-on
  manued-insert-swap-command において，swapコマンド内部にコメント文字 を挿入するかしないかを制御する．t で挿入．
- manued-is-auto-insert-headder
  この変数の値は '(auto-insert query-when-insert insert-point) というリストである．バッファ に def コマンドが存在しない場合に def コマンドをヘッダとして挿入するか，挿入する場合にはどのように挿入するか を制御する．
  - auto-insert : t の時，manued-minor-mode に入った時にそのバッ ファに defcommand が存在しない場合に defcommand を挿入する．
  - query-when-insert (auto-insert が t の時有効) : t の場合にはヘッダの挿入時にユーザに可否を尋ねる．
  - insert-point (auto-insert が t の時有効) : 値により以下の3つの場合がある．
    - t : 現在のカーソル位置にヘッダを挿入する
    - nil : バッファ先頭(point-min)にヘッダを挿入する
    - number (数値) : その数をpointとしてその位置にヘッダを挿入する
- manued-ask-if-formatted-buffer-is
  整形時，既に整形済みの buffer が存在した場合に上書きを尋ねるかどうか． t で尋ねてくる
- manued-defcommand-head-str-list
  真鵺道定義コマンドの先頭につけることが可能な文字列のリスト．TeX のコ メント中でも def コマンドを認識できるよう default 値として ``%'' と ``%%'' が定義されている．他に行頭に付加したい文字列があれば，この リストにその文字列を付加する．

##
Bugs

- 英語のドキュメントの質の不良．しかし，直すだけの英語力が当方に不 足しています．コメントなどは歓迎します．
- 現在のバージョン(0.9.5)では `font-lock-mode` を使っていません．そのため，環境によっては訂正箇所のハイライトに問題が あります．これは色の表示に関してのみの問題です．

##
Copying

`manued.el`(C) Copyright 1998-2002 YAMAUCHI Hitoshi (山内 斉)

本ソフトウェアはフリー (自由な) ソフトウェアです．本プログラムを使用し て生じたいかなる結果に対しても作者は責任を負いません．Free Software Foundation から配布されている GNU General Public License の最新版の制 約のもとで自由に改変，再配布が可能です．

本プログラムは，可能な限り上手く動作するように努力して作成されています が，完全に無保証です．

バグの報告，感想等は Email (yamauchi" at "mpi-sb.mpg.de.nicht.spam) にて歓迎いたします． (メイルを送信される場合には最後の.nicht.spamを削り，``at''を @ に変更して下さい．) manued メイリングリストも御利用下さい．

##
Manued ML

真鵺道のメイリングリストが開設されました．真鵺道に関する議論を行なえれ ばと思います．MLに登録するには，

> manued-ml-subscribe" at "takopen.cs.uec.ac.jp.nicht.spam

(メイルを送信される場合には最後の.nicht.spamを削り，``at''を @ に変更して下さい．) に空のメイルを送付すればconfermメイルが来ますので，それに従って登録をお願 いします．

#
真鵺道 Tips

- TeX と真鵺道(show newer の出力をそのまま TeX でコンパイルするには)
  - defコマンドが邪魔でコンパイルに失敗する場合
  - TeX のオプションが消えてしまう

## TeX と真鵺道

show-newer の出力をそのまま TeX でコンパイルするには

### defcommand が邪魔でコンパイルに失敗する場合

show newer 後の *manued* buffer を M-x write-file で *.tex ファイルに し，そのままコンパイルできれば良いのですが，manued の def コマンドヘッ ダが邪魔になることがあります．この解決方法としては，defコマンドを記し たヘッダ部分を真鵺道文書中に書かずに，変数定義するという方法があります． しかし，このヘッダには，離れた環境での真鵺道文書の一貫性をとるために付 属するという目的もありますから，電子メイルでファイルをやりとりする際に， ヘッダの情報が抜けるのは好ましくありません．

そこで，manued.el では真鵺道定義コマンドの頭に付けることのできる文字列 を指定可能になっています．manued-defcommnd-head-str-list には，例えば TeX のコメント `%', `%%' などがデフォルトで登録されており，下のよう に書いても解釈されます．ただし，真鵺道コマンドは必ず行頭になくてはいけ ません．また，manued-defcommnd-head-str-list の文字列と真鵺道コマンド 間には空白を入れてはいけません．

            %%defparentheses 【 】

###
TeX のオプションが消えてしまう

default の真鵺道コマンドは ``[ ]`' でくくることになっており，こ れが TeX のコマンドと競合します．私は日本語を使うことが多いためデフォ ルトの真鵺道コマンドの括弧を `【 】' に変更しています．このようにあま り使わない記号をわりあてるのが良いでしょう．この場合，.emacs には次の ように書いておきます．

            (setq manued-l-parenthesis-str "【")
            (setq manued-r-parenthesis-str "】")

ただし，これは2バイト文字の利用可能な環境の話です．このような環境でな い場合には各自で工夫が必要かと思います．TeX + ASCII 環境のみでなにか良 いと考えられる方法があるという方は御一報下さい．

#
Manued Links

##
和田先生の manued.el の実装

1999 年の 12 月号の bit でも紹介したが，`manued.el`には他の実装 も存在する．それは emacs 上でなされている．emacs 上の実装が他にもある というのは emacs におけるこのようなものに対するプログラミングの容易さ か，あるいは，このような環境に depend しない手法というものを望む人が emacs をよく利用するからか，たまたまなのかは私にはわからない．

ここでは，和田先生による実装を紹介する．以下は和田先生が真鵺道方式で校 正をやりとりした時のメイルの抜粋である．このメイルには，真鵺道方式で校 正した文書本体，`manued.el`の説明(抜粋部分)，`(manued)` 本体が含まれていた．

この実装は真鵺道方式で校正した文書を「見る」ということを目的として作成 されており，山内の実装に比べてコンパクトである．コンパクトゆえに山内の `manued.el`をinstall していない人に対して送るメイルに付属させて 利用してもらうことも容易である．

### 和田先生の`manued.el`

    ;;
    ;; manued : editing manuscripts for Emacs
    ;; 1998 Eiiti Wada 和田 英一
    ;; manued.el, Copyright (C) 1999 Eiiti Wada．
    ;;
    ;;[α\β]はαをβで置き換える
    ;;[α\]  はαを削除
    ;;[\β]  はβを挿入
    ;;[α|γ|β]はαγβをβγαに並び換える
    ;;[α||β]  はαβをβαに並び換える
    ;;[★δ]    はコメント
    ;;
    ;; しかしこれは目がチラチラして見難いという意見もあると思いますので,
    ;; 色つきで眺めるツールを急いで用意しました. おためしください. Muleエ
    ;; ディタのWindowで動作します.
    ;;
    ;;まず次のemacs lispのプログラム部分をmuleのwindowにおきます. esc esc
    ;;とやると minibuffer に Eval: というプロンプトがでます. そこで
    ;;(eval-current-buffer)
    ;;とやると, プログラム全体が評価出来ます.
    ;;
    ;;次にmanuedのコメントの入ったメイルの本文をmuleのwindowにおき, esc
    ;;esc でeval:の状態にし, (manued)と打ち込みます. するとα, β, γの部
    ;;分がそれぞれの色で表示されます.
    ;;
    ;;もし, これらの色が気に入らない場合は, muleでesc escでeval:状態に
    ;;し, (list-faces-display)を実行すると, 使える色の名前の一覧がで
    ;;ます.  それを参考にして, 添付のプログラムの先頭の色定義の定数を
    ;;変更すれば好きな色に変えられます.
    ;;

    (make-face 'alpha)
    (set-face-foreground 'alpha "blue")
    (make-face 'beta)
    (set-face-foreground 'beta "red")
    (make-face 'gamma)
    (set-face-foreground 'gamma "green4")
    (setq facealpha 'alpha)
    (setq facebeta  'beta)
    (setq facegamma 'gamma)

    (defun proc-range (beg end)
     (let* (p0 p1 p2 ch)
           (goto-char beg)
           (setq beg (search-forward "[" end t))
           (while beg (proc-sec) (setq beg (search-forward "[" end 0)))))

    (defun proc-sec nil
     (setq p0 (re-search-forward "[]|\[{]" end t))
     (setq ch (string-to-char (buffer-substring (1- p0) p0)))
     (cond ((= ch ?[) (skip) (proc-sec))
           ((= ch ?\\) (findrsb) (alpha beg p0) (beta p0 p2))
           ((= ch ?|) (findvl) (findrsb) (alpha beg p0) (gamma p0 p1) (beta p1 p2))
           ((= ch ?]) (gamma beg p0))
           ((= ch ?{) (skipcb) (proc-sec))))

    (defun skip nil
     (let* (p ch)
           (setq p (re-search-forward "[][{]" end t))
           (while p
                  (setq ch (string-to-char (buffer-substring (1- p) p)))
                  (cond ((= ch ?]) (setq p nil))
                        ((= ch ?[)
                         (skip)
                         (setq p (re-search-forward "[][]" end t)))
                        ((= ch ?{) (skipcb))   ))))
    (defun skipcb nil
     (let* (p ch)
           (setq p (re-search-forward "[}{]" end t))
           (while p
                  (setq ch (string-to-char (buffer-substring (1- p) p)))
                  (cond ((= ch ?}) (setq p nil))
                        ((= ch ?{)
                         (skipcb)
                         (setq p (re-search-forward "[}{]" end t)))))))

    (defun findrsb nil
     (setq p2 (re-search-forward "[][{]" end t))
     (setq ch (string-to-char (buffer-substring (1- p2) p2)))
     (cond ((= ch ?[) (skip) (findrsb))
           ((= ch ?]))
           ((= ch ?{) (skipcb) (findrsb))))

    (defun findvl nil
     (setq p1 (re-search-forward "[|[{]" end t))
     (setq ch (string-to-char (buffer-substring (1- p1) p1)))
     (cond ((= ch ?[) (skip) (findvl))
           ((= ch ?|))
           ((= ch ?{) (skipcb) (findvl))))

    (defun alpha (l r)
     (put-text-property l (1- r) 'face facealpha)
     (proc-range l (1- r)))

    (defun beta  (l r)
     (put-text-property l (1- r) 'face facebeta)
     (proc-range l (1- r)))

    (defun gamma (l r)
     (put-text-property l (1- r) 'face facegamma)
     (proc-range l (1- r)))

    (defun manued nil (proc-range 1 (point-max)))

この `manued.el` の公開を快く承諾して頂いた和田英一先生に感謝します．

## その他の実装

Windowsの秀丸というエディタ上に実装された`manued`が存在するようです．

## Manuediff (by Suzuki)

Manuediff は diff プログラムですが，その出力を真鵺道フォーマットにします．例:

      manuediff file1 file2 > diff.with.manued.format

# 謝辞

文献[3], ``電子メールで原稿を修正する方法 -- Manuscript Editing (Manued, 真鵺道)を目指して --''の電子的原稿の提供 と，このような素晴しいアイデアを発表して下さった竹内郁雄先生に感謝いた します．真鵺道を知ってから現在までの私の論文は全て真鵺道なしには提出で きなかったものばかりです．

真鵺道の簡潔な実装により知的な驚きを下さった和田英一先生に感謝いたしま す．

また，全く Lisp を知らなかった私にLispを教えて下さり，つまらない質問に も丁寧に答えて下さった前田敦司氏にも感謝いたします．前田氏なくして，こ の実装はありえませんでした．

以下の方々がこれまで`manued.el`に関してバグフィックス，有益なコ メントなどの形で貢献して下さいました．感謝いたします．(Alphabetical order)

- 川村尚生 : KAWAMURA, Takao (bug fix etc. for version 0.9.3)
- 中島幹夫 : NAKAJIMA, Mikio (bug fix etc. for version 0.9.3)
- Stefan Monnier (comments for version 0.9.1)
- 鈴木健一 : Suzuki, Ken-ichi (manuediff)

## 文献目録

1
  Emacs and its Info (Emacs 20, XEmacs).

2
  竹内郁雄.
  初めての人のための LISP.
  サイエンス社, 1986.

3
  竹内郁雄.
  電子メールで原稿を修正する方法 -- manuscript editing (manued, 真鵺道)を目指して --.
  第 39 回プログラミングシンポジウム, pp. 61-68, January 1998.
  原文 manuscriptediting.txt.gz.

4
  広瀬雄二.
  やさしいEmacs-Lisp講座.
  カットシステム, 1999.

5
  青柳龍也.
  UNIX 短編シリーズ Emacs Lisp.
  工学図書, 1997.

## 索引

# この文書について...

Manued Reference Manual

この文書はLaTeX2`HTML` 翻訳プログラム Version 2K.1beta (1.57)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds,
Copyright © 1997, 1998, 1999, Ross Moore, Mathematics Department, Macquarie University, Sydney.

を日本語化したもの( 版)

Copyright © 1998, 1999, Kenshi Muto, Debian Project.

Copyright © 2000, Jun Nishii, Project Vine.

を用いて生成されました。

コマンド行は以下の通りでした。:
latex2html `-html_version 4.0 -split 0 manued-j.tex`.

翻訳は Yamauchi Hitoshi によって 平成14年8月12日 に実行されました。