*** empty log message ***
authornisikimi <nisikimi>
Fri, 3 Apr 2009 00:27:53 +0000 (00:27 +0000)
committernisikimi <nisikimi>
Fri, 3 Apr 2009 00:27:53 +0000 (00:27 +0000)
FORMATS/IM.ja.txt
FORMATS/IM.txt

index 00d102a..82af29e 100644 (file)
-/* Copyright (C) 2003, 2004, 2005
+/* Copyright (C) 2003, 2004, 2005, 2009
      National Institute of Advanced Industrial Science and Technology (AIST)
      Registration Number H15PRO112
    See the end for copying conditions.  */
 
-/* sections for example found in English vesion omitted */
+/***en
 
-/***ja
+@page mdbIM インプットメソッド
 
-@page mdbIM ¥¤¥ó¥×¥Ã¥È¥á¥½¥Ã¥É
+@section im-description 説明
 
-@section im-description ÀâÌÀ
-
-m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤éưŪ¤Ë¥í¡¼¥É¤Ç¤­¤ëÆþÎϥ᥽¥Ã¥É
-¥É¥é¥¤¥Ð¤òÄ󶡤·¤Æ¤¤¤ë¡£(@ref m17nInputMethod »²¾È¡£ @latexonly
+m17n ライブラリは、m17n データベースから動的にロードできる入力メソッド
+ドライバを提供している。(@ref m17nInputMethod 参照。 @latexonly
 (P.\pageref{group__m17nInputMethod}) @endlatexonly).
 
-¤³¤³¤Ç¤ÏÆþÎϥ᥽¥Ã¥ÉÄêµÁ¤Î¥Ç¡¼¥¿¥Õ¥©¡¼¥Þ¥Ã¥È¤òÀâÌÀ¤¹¤ë¡£
+ここでは入力メソッド定義のデータフォーマットを説明する。
 
-@section im-format Ê¸Ë¡¤È°ÕÌ£
+@section im-format 文法と意味
 
-°Ê²¼¤Î¥Ç¡¼¥¿¥Õ¥©¡¼¥Þ¥Ã¥È¤Ë¤è¤Ã¤ÆÆþÎϥ᥽¥Ã¥É¤¬ÄêµÁ¤µ¤ì¤ë¡£¥É¥é¥¤¥Ð¤Ï¥Õ¥¡
-¥¤¥ë¤ä¥¹¥È¥ê¡¼¥à¤«¤éÄêµÁ¤ò¥í¡¼¥É¤·¡¢¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤Î·Á¼°¤ËÊÑ´¹¤¹¤ë¡£
+以下に RelaxNG で書かれた入力メソッド定義用スキーマを示す。(このスキー
+マファイルは m17n-db-xml/MIM/mim.rng にある。) ドライバはファイルやス
+トリームから定義をロードし、プロパティリストの形式に変換する。
 
 @verbatim
-INPUT-METHOD ::=
-    IM-DECLARATION ? DESCRIPTION ? TITLE ?
-     VARIABLE-LIST ? COMMAND-LIST ?  MODULE-LIST ?
-     MACRO-LIST ? MAP-LIST ? STATE-LIST ?
 
-IM-DECLARATION ::= '(' 'input-method' LANGUAGE NAME EXTRA-ID ? VERSION ? ')'
-VERSION ::= '(' 'version' VERSION-NUMBER ')'
-DESCRIPTION ::= '(' 'description' [ MTEXT-OR-GETTEXT | nil] ')'
-VARIABLE-LIST ::= '(' 'variable' VARIABLE-DECLARATION * ')'
-COMMAND-LIST ::= '(' 'command' COMMAND-DECLARATION * ')'
-TITLE ::= '(' 'title' TITLE-TEXT ')'
+<?xml version="1.0" encoding="utf-8"?>
+
+<grammar 
+        datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
+         xmlns:xi="http://www.w3.org/1999/XML/xinclude"
+        xmlns="http://relaxng.org/ns/structure/1.0"
+        ns="http://www.m17n.org/MIM">
+
+<start>
+  <element name="input-method">
+    <ref name="im-declaration"/>
+
+    <optional>
+       <element name="description">
+         <choice>
+           <text/>
+           <element name="get-text"><text/> </element>
+         </choice>
+       </element>
+    </optional>
+
+    <optional><element name="title"><data type="string"/></element></optional>
+    <optional><ref name="variable-list"/></optional>
+    <optional><ref name="command-list"/></optional>
+    <optional><ref name="module-list"/></optional>
+    <optional><ref name="macro-list"/></optional>
+    <optional><ref name="map-list"/></optional>
+    <optional><ref name="state-list"/></optional>
+  </element>
+</start>
+
+@endverbatim
 
-VARIABLE-DECLARATION ::=
-    '(' VAR-NAME [ MTEXT-OR-GETTEXT | nil ] VALUE VALUE-CANDIDATE * ')'
+入力メソッドのトップレベルノードは &lt;input-method&gt; というタグを持つ。
+
+&lt;description&gt; エレメントは、&lt;input-method&gt;,
+&lt;variable&gt;, &lt;command&gt; 中に現れることができ、その内容は親要
+素を説明するテキストである。&lt;get-text&gt; エレメントの内容は、現在の
+ロケールに従って "gettext" によって翻訳される(翻訳文が提供されている場
+合)。
+
+&lt;title&gt; エレメントの内容は、この入力メソッドが有効な時スクリーン
+上に表示されるテキストである。
+
+#if EXAMPLE_CODE
+<input-method xmlns="http://www.m17n.org/MIM">
+  <tags>
+    <language>bo</language>
+    <name>ewts</name>
+  </tags>
+  <description>Tibetan input method based on EWTS.
+This implementation is based on THDL Extended Wylie Transliteration Scheme
+Version 2.0 &lt;http://www.thdl.org/collections/langling/ewts/ewts.php&gt;.</description>
+  <title>ཀ</title>
+      :       :
+#endif
+
+&lt;variable-list&gt; はこの入力メソッドで使用される変数を宣言する。
+&lt;command-list&gt; はこの入力メソッドで使用されるコマンドを宣言する。
+&lt;module-list&gt; はこの入力メソッドで使用される外部モジュールを宣言
+する。&lt;macro-list&gt; はこの入力メソッドで使用されるマクロを宣言する。
+&lt;map-list&gt; はこの入力メソッドで使用されるマップを宣言する。 入力
+メソッドがそれ単体で利用されることがなく常に他の入力メソッドに読み込ま
+れて用いられる場合には省略できる。&lt;state-list&gt; はこの入力メソッド
+で使用されるステートを宣言する。 入力メソッドがそれ単体で利用されること
+がなく常に他の入力メソッドに読み込まれて用いられる場合には省略できる。
+    
+@subsection im-declarations 入力メソッドの宣言
 
-COMMAND-DECLARATION ::=
-    '(' CMD-NAME [ MTEXT-OR-GETTEXT | nil ] KEYSEQ * ')'
+@verbatim
 
-MTEXT-OR-GETTEXT ::=
-    [ MTEXT | '(' '_' MTEXT ')']
+<define name="im-declaration">
+
+  <element name="tags">
+    <element name="language">
+      <choice>
+       <value>t</value>
+       <data type="string"><param name="pattern">[a-z]{2,3}</param>
+       </data>
+      </choice>
+    </element>
+    <choice>
+      <group>
+       <element name="name"><value>nil</value></element>
+       <element name="extra-id"><data type="ID"/></element>
+      </group>
+      <group>
+       <element name="name">
+         <choice>
+           <data type="string"><param name="pattern">[^n][^i][^l]</param></data>
+           <data type="string"><param name="pattern">.{1,2}</param></data>
+           <data type="string"><param name="pattern">....+</param></data>
+         </choice>
+       </element>
+      <optional>
+       <element name="extra-id"><data type="ID"/></element>
+     </optional>
+   </group>
+  </choice>
+  </element>
+
+  <optional>
+    <element name="m17n-version">
+      <data type="string"><param name="pattern">[0-9]+\.[0-9]+\.[0-9]+</param></data>
+    </element>
+  </optional>
+</define>
 
-LANGUAGE ::= SYMBOL
-NAME ::= SYMBOL
-EXTRA-ID ::= SYMBOL
-VERSION ::= MTEXT
-IM-DESCRIPTION ::= MTEXT
-VAR-NAME ::= SYMBOL
-VAR-DESCRIPTION ::= MTEXT
-VALUE ::= MTEXT | SYMBOL | INTEGER
-VALUE-CANDIDATE ::= VALUE | '(' RANGE-FROM RANGE-TO ')'
-RANGE-FROM ::= INTEGER
-RANGE-TO ::= INTEGER
-CMD-NAME ::= SYMBOL
-CMD-DESCRIPTION ::= MTEXT
-TITLE-TEXT ::= MTEXT
 @endverbatim
 
-@c IM-DECLARATION ¤Ï¤³¤ÎÆþÎϥ᥽¥Ã¥É¤Î¸À¸ì¤È̾Á°¤ò»ØÄꤹ¤ë¡£
+&lt;tags&gt; エレメントは、この入力メソッドが対象とする言語や入力メソッ
+ド自体の名称を指定する。"global.mimx" という特別なファイルがあり、共通
+の変数やコマンドが定義されている。入力メソッドドライバは毎回このファイ
+ルをロードし、他の入力メソッドはここで定義された変数やコマンドを継承で
+きる。
+
+&lt;language&gt; エレメントの内容が @c t である場合、この入力メソッドは
+複数の言語で利用される。それ以外の場合には、エレメントの内容はISO639-1
+あるいは ISO639-2 に規定された言語の名称を表す2または3文字のコードで
+なくてはならない。
+
+&lt;name&gt; エレメントの内容が @c nil である場合、この入力メソッドは単
+独で用いられるものではなく、他の入力メソッドから利用することを想定して
+いる。この場合、入力メソッドを特定するために &lt;extra-id&gt; エレメン
+トが必須である。&lt;name&gt; エレメントの内容が @c nil でない場合、
+&lt;extra-id&gt; エレメントは任意(optional)である。
+
+#if EXAMPLE_CODE
+  <tags>
+    <language>bo</language>
+    <name>ewts</name>
+  </tags>
+#endif
+
+#if EXAMPLE_CODE
+  <tags>
+    <language>t</language>
+    <name>nil</name>
+    <extra-id>zh-util</extra-id>
+  </tags>
+#endif
+
+&lt;m17n-version&gt; エレメント(任意)は、この入力メソッドが必要とする
+m17n ライブラリの最小バージョンを指定する。フォーマットは "X.Y.Z" であ
+り、X はメジャーバージョン、 Y はマイナーバージョン、Z はパッチレベルを
+表す。
+
+@subsection im-setups 入力メソッドの設定
 
-@c LANGUAGE ¤¬ @c t ¤Î¾ì¹ç¡¢¤³¤ÎÆþÎϥ᥽¥Ã¥É¤ÏÊ£¿ô¤Î¸À¸ì¤ÇÍøÍѤµ¤ì¤ë¡£
+@verbatim
 
-@c NAME ¤¬ @c nil ¤Î¾ì¹ç¡¢¤³¤ÎÆþÎϥ᥽¥Ã¥É¤ÏñÆȤÇÍѤ¤¤é¤ì¤ë¤â¤Î¤Ç¤Ï¤Ê
-¤¯¡¢Â¾¤ÎÆþÎϥ᥽¥Ã¥É¤«¤éÍøÍѤ¹¤ë¤³¤È¤òÁÛÄꤷ¤Æ¤¤¤ë¡£¤³¤Î¾ì¹ç¡¢ÆþÎÏ¥á
-¥½¥Ã¥É¤òÆÃÄꤹ¤ë¤¿¤á¤Ë @c EXTRA-ID ¤¬É¬ÍפǤ¢¤ë¡£
+<define name="variable-list">
+  <element name="variable-list">
+      <zeroOrMore>
+      <element name="variable">
+       <attribute name="id"/>
+       <optional>
+         <element name="description">
+           <choice>
+             <text/>
+             <element name="get-text"><text/></element>
+           </choice>
+         </element>
+       </optional>
+       <optional>
+         <element name="value">                    
+           <choice>
+             <group>
+               <attribute name="type"><value>string</value></attribute>
+               <data type="string"/>
+             </group>
+             <group>
+               <attribute name="type"><value>symbol</value></attribute>
+               <data type="string"/>
+             </group>
+             <group>
+             <attribute name="type"><value>integer</value></attribute>
+             <data type="integer"/>
+             </group>
+           </choice>
+         </element>
+       </optional>
+
+       <optional>
+         <element name="variable-value-candidate">
+           <oneOrMore>
+             <choice>
+               <element name="c-value">                    
+                 <choice>
+                   <group>
+                     <attribute name="type"><value>string</value></attribute>
+                     <data type="string"/>
+                   </group>
+                   <group>
+                     <attribute name="type"><value>symbol</value></attribute>
+                     <data type="string"/>
+                   </group>
+                   <group>
+                     <attribute name="type"><value>integer</value></attribute>
+                     <data type="integer"/>
+                   </group>
+                 </choice>
+               </element>
+               <element name="c-range">
+                 <attribute name="from"><data type="integer"/></attribute>
+                 <attribute name="to"><data type="integer"/></attribute>
+               </element>
+             </choice></oneOrMore></element>
+         </optional>
+       </element>
+    </zeroOrMore>
+  </element>
+</define>
 
-@c VERSION ¤Ï¤³¤ÎÆþÎϥ᥽¥Ã¥É¤¬É¬ÍפȤ¹¤ë m17n ¥é¥¤¥Ö¥é¥ê¤ÎºÇ¾®¥Ð¡¼¥¸¥ç
-¥ó¤ò»ØÄꤹ¤ë¡£¥Õ¥©¡¼¥Þ¥Ã¥È¤Ï "XX.YY.ZZ" ¤Ç¤¢¤ê¡¢XX ¤Ï¥á¥¸¥ã¡¼¥Ð¡¼¥¸¥ç
-¥ó¡¢ YY ¤Ï¥Þ¥¤¥Ê¡¼¥Ð¡¼¥¸¥ç¥ó¡¢ZZ ¤Ï¥Ñ¥Ã¥Á¥ì¥Ù¥ë¤òɽ¤¹¡£
+@endverbatim
 
-@c DESCRIPTION ¤Ï¤³¤ÎÆþÎϥ᥽¥Ã¥É¤ÎÀâÌÀ¤ò @c MTEXT-OR-GETTEXT ¤Ç»ØÄꤹ
-¤ë¡£¤â¤·¤³¤ì¤¬£²ÈÖÌܤηÁ¼°¤ò¼è¤Ã¤Æ¤¤¤ì¤Ð¡¢ @c MTEXT ¤Ï¸½ºß¤Î¥í¥±¡¼¥ë¤Ë
-½¾¤Ã¤Æ "gettext" ¤Ë¤è¤Ã¤ÆËÝÌõ¤µ¤ì¤ë¡ÊËÝÌõʸ¤¬Ä󶡤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡Ë¡£
+&lt;variable-list&gt; はこの入力メソッドで使用される変数を宣言する。
+
+変数をデフォルト値に初期化したり、ユーザがカスタマイズしたりする場合に
+は、ここで宣言されなくてはならない。この宣言は二通りに利用される。一つ
+めは新しい変数を導入するためであり、この場合 &lt;variable&gt; 中の
+&lt;value&gt; エレメントは省略できない。もう一つは "global.mimx" で宣言
+された変数を継承し、違ったデフォルト値を指定したり、この入力メソッド用
+にカスタマイズ可能にしたりするためである。この場合には &lt;value&gt; は
+省略できる。
+
+各 &lt;variable&gt; は一つの変数を宣言し、変数は属性 "id" によって参照
+される。すべての変数は暗黙のうちに整数値0に初期化されている。
+&lt;insert&gt; アクションは M-text である &lt;value&gt; を参照する。シ
+ンボルである &lt;value&gt; は直接参照されず、ライブラリが暗黙的に使用す
+る。(e.g. candidates-charset).  整数値である &lt;value&gt; は、
+&lt;set&gt;, &lt;add&gt;, &lt;sub&gt;, &lt;mul&gt;, &lt;div&gt; アクショ
+ンによって設定、変更、参照され、&lt;insert&gt;, &lt;select&gt;,
+&lt;undo&gt;, &lt;if&gt;, &lt;cond&gt; アクションに参照される。
+
+&lt;variable-value-candidate&gt; は変数が取り得る値のリストである。
+&lt;c-value&gt; は可能な値の一つを表しており、M-text かシンボルか整数値
+である。
+
+&lt;c-range&gt; は変数が取り得る整数値の範囲を示すものであり、
+&lt;c-value&gt; と併用できる。属性 "from" は変数のとる最小値を、"to" が
+最大値を示す。
+
+#if EXAMPLE_CODE
+  <variable-list>
+    <variable id="precomposed">
+      <description>
+        <get-text>Flag to tell whether or not to generate precomposed characters.
+                  If 1, generate precomposed characters if available (e.g. "ྲྀ"(U+0F76).
+                  If 0, generate only decomposed characters (e.g. "ྲྀ" (U+0FB2 U+0F80).</get-text>
+      </description>
+      <value type="integer">0</value>
+      <variable-value-candidate>
+        <c-value type="integer">0</c-value>
+        <c-value type="integer">1</c-value>
+      </variable-value-candidate>
+    </variable>
+  </variable-list>
+#endif
+
+このコードは、変数 "precomposed" を宣言している。取り得る値は 0 か1 で
+あり、初期値は 0 である。
 
-@c TITLE-TEXT ¤Ï¤³¤ÎÆþÎϥ᥽¥Ã¥É¤¬Í­¸ú¤Ê»þ¡¢¥¹¥¯¥ê¡¼¥ó¾å¤Ëɽ¼¨¤µ¤ì¤ë¥Æ
-¥­¥¹¥È¤Ç¤¢¤ë¡£
+@verbatim
 
-"global.mim" ¤È¤¤¤¦ÆÃÊ̤ʥե¡¥¤¥ë¤¬¤¢¤ê¡¢¶¦Ä̤¹¤ëÊÑ¿ô¤ä¥³¥Þ¥ó¥É¤¬ÄêµÁ¤µ
-¤ì¤Æ¤¤¤ë¡£ÆþÎϥ᥽¥Ã¥É¥É¥é¥¤¥Ð¤ÏËè²ó¤³¤Î¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¡¢Â¾¤ÎÆþÎÏ¥á
-¥½¥Ã¥É¤Ï¤³¤³¤ÇÄêµÁ¤µ¤ì¤¿ÊÑ¿ô¤ä¥³¥Þ¥ó¥É¤ò·Ñ¾µ¤Ç¤­¤ë¡£
+<define name="predefined-variable">
+  <attribute name="type"><value>predefined</value></attribute>
+  <attribute name="id">
+    <choice>
+      <value>handled-keys</value>
+      <value>predefined-surround-text-flag
+      <data type="string"><param name="pattern">@.+</param></data>
+    </choice>
+  </attribute>
+</define>
 
-@c VARIABLE-DECLARATION ¤Ï¤³¤ÎÆþÎϥ᥽¥Ã¥É¤Ç»ÈÍѤµ¤ì¤ëÊÑ¿ô¤òÀë¸À¤¹¤ë¡£
-ÊÑ¿ô¤ò¥Ç¥Õ¥©¥ë¥ÈÃͤ˽é´ü²½¤·¤¿¤ê¡¢¥æ¡¼¥¶¤¬¥«¥¹¥¿¥Þ¥¤¥º¤·¤¿¤ê¤¹¤ë¾ì¹ç¤Ë
-¤Ï¡¢¤³¤³¤ÇÀë¸À¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤ÎÀë¸À¤ÏÆóÄ̤ê¤ËÍøÍѤµ¤ì¤ë¡£°ì¤Ä
-¤á¤Ï¿·¤·¤¤ÊÑ¿ô¤òƳÆþ¤¹¤ë¤¿¤á¤Ç¤¢¤ê¡¢¤³¤Î¾ì¹ç @c VALUE ¤Ï¾Êά¤Ç¤­¤Ê¤¤¡£
-¤â¤¦°ì¤Ä¤Ï "global.mim" ¤ÇÀë¸À¤µ¤ì¤¿ÊÑ¿ô¤ò·Ñ¾µ¤·¡¢°ã¤Ã¤¿¥Ç¥Õ¥©¥ë¥ÈÃͤò
-»ØÄꤷ¤¿¤ê¡¢¤³¤ÎÆþÎϥ᥽¥Ã¥ÉÍѤ˥«¥¹¥¿¥Þ¥¤¥º²Äǽ¤Ë¤·¤¿¤ê¤¹¤ë¤¿¤á¤Ç¤¢¤ë¡£
-¤³¤Î¾ì¹ç¤Ë¤Ï @c VALUE ¤Ï¾Êά¤Ç¤­¤ë¡£
+@endverbatim
 
-@c COMMAND-DECLARATION ¤Ï¤³¤ÎÆþÎϥ᥽¥Ã¥É¤Ç»ÈÍѤµ¤ì¤ë¥³¥Þ¥ó¥É¤òÀë¸À¤¹¤ë¡£
-¥³¥Þ¥ó¥É¤ò¥Ç¥Õ¥©¥ë¥È¥­¡¼¥·¡¼¥±¥ó¥¹¤Ë³ä¤êÅö¤Æ¤¿¤ê¡¢¥æ¡¼¥¶¤¬¥«¥¹¥¿¥Þ¥¤¥º
-¤·¤¿¤ê¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢¤³¤³¤ÇÀë¸À¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£@c
-VARIABLE-DECLARATION Æ±ÍÍ¡¢¤³¤ÎÀë¸À¤ÏÆóÄ̤ê¤ËÍøÍѤµ¤ì¤ë¡£°ì¤Ä¤á¤Ï¿·¤·¤¤
-¥³¥Þ¥ó¥É¤òƳÆþ¤¹¤ë¤¿¤á¤Ç¤¢¤ê¡¢¤³¤Î¾ì¹ç @c KEYSEQ ¤Ï¾Êά¤Ç¤­¤Ê¤¤¡£¤â¤¦°ì
-¤Ä¤Ï "global.mim" ¤ÇÀë¸À¤µ¤ì¤¿¥³¥Þ¥ó¥É¤ò·Ñ¾µ¤·¡¢°ã¤Ã¤¿¥­¡¼¥Ð¥¤¥ó¥Ç¥£¥ó
-¥°¤ò»ØÄꤷ¤¿¤ê¡¢¤³¤ÎÆþÎϥ᥽¥Ã¥ÉÍѤ˥«¥¹¥¿¥Þ¥¤¥º²Äǽ¤Ë¤·¤¿¤ê¤¹¤ë¤¿¤á¤Ç
-¤¢¤ë¡£¤³¤Î¾ì¹ç¤Ë¤Ï @c KEYSEQ ¤Ï¾Êά¤Ç¤­¤ë¡£
+Predefined-variable は属性 "type" の値が "predefiend" である変数である。
+属性 "id" の値が "handled-keys" であるとき、変数の値はその時点で処理さ
+れているキーの数である。属性 "id" の値が
+"predefined-surround-text-flag" であるとき、変数の値はサラウンドテキス
+トがサポートされていれば -1 、そうでなければ -2 である。
 
-@verbatim
-MODULE-LIST ::= '(' 'module' MODULE * ')'
 
-MODULE ::= '(' MODULE-NAME FUNCTION * ')'
+#if EXAMPLE_CODE
+<variable-reference id="handled-keys" type="predefined"/>
+#endif
+
+このコードはその時点で処理されているキーの数を参照する。
+@verbatim
 
-MODULE-NAME ::= SYMBOL
+<define name="command-list">
+  <element name="command-list">
+    <zeroOrMore>
+      <element name="command">
+       <attribute name="id">
+         <data type="ID"><param name="pattern">command-.*</param></data></attribute>
+       <optional>
+         <element name="description">
+           <choice><text/><element name="get-text"><text/></element></choice>
+         </element>
+       </optional>
+       <zeroOrMore><ref name="keyseq"/></zeroOrMore>
+      </element>
+    </zeroOrMore>
+  </element>
+</define>
 
-FUNCTION ::= SYMBOL
 @endverbatim
 
-³Æ @c MODULE ¤Ï³°Éô¥â¥¸¥å¡¼¥ë (ưŪ¥é¥¤¥Ö¥é¥ê) ¤Î̾Á°¤È¤½¤Î¥â¥¸¥å¡¼¥ë¤¬
-¸ø³«¤·¤Æ¤¤¤ë´Ø¿ô̾¤òÀë¸À¤¹¤ë¡£@c FUNCTION ¤¬ "init" ¤È¤¤¤¦Ì¾Á°¤Ç¤¢¤ì¤Ð¡¢
-¤³¤ÎÆþÎϥ᥽¥Ã¥ÉÍѤÎÆþÎÏ¥³¥ó¥Æ¥¯¥¹¥È¤¬À¸À®¤µ¤ì¤ëºÝ¤Ë¡¢¥Ç¥Õ¥©¥ë¥È¤Î°ú¿ô
-(@c CALL ¤ÎÀỲ¾È) ¤Î¤ß¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤ë¡£ @c FUNCTION ¤¬ "fini" ¤È¤¤¤¦
-̾Á°¤ò»ý¤Æ¤Ð, ÆþÎÏ¥³¥ó¥Æ¥¯¥¹¥È¤¬Ç˲õ¤µ¤ì¤ëºÝ¤Ë¡¢¥Ç¥Õ¥©¥ë¥È¤Î°ú¿ô¤Î¤ß¤È
-¤È¤â¤Ë¸Æ¤Ð¤ì¤ë¡£
+&lt;command-list&gt; は、この入力メソッドで使用されるコマンドを宣言する。
+コマンドをデフォルトキーシーケンスに割り当てたり、ユーザがカスタマイズ
+したりする場合には、ここで宣言されなくてはならない。@c
+&lt;variable-list&gt;, 同様、この宣言は二通りに利用される。一つめは新し
+いコマンドを導入するためであり、この場合 &lt;command&gt; 中の
+&lt;keyseq&gt; エレメントは省略できない。もう一つは "global.mimx" で宣
+言されたコマンドを継承し、違ったキーバインディングを指定したり、この入
+力メソッド用にカスタマイズ可能にしたりするためである。この場合には
+&lt;keyseq&gt; は省略可能である。
+
+各 &lt;command&gt; は一つのコマンドを宣言し、コマンドは属性 "id" によっ
+て参照される。
+
+#if EXAMPLE_CODE
+  <command-list>
+    <command id="command-commit">
+      <description>
+        <get-text>Commit
+                  Commit the preedit text</get-text>
+      </description>
+      <keyseq><key-event>Return</key-event></keyseq>
+      <keyseq><key-event>Linefeed</key-event></keyseq>
+    </command>
+  </command-list>
+#endif
 
 @verbatim
-MACRO-LIST ::=  MACRO-INCLUSION ? '(' 'macro' MACRO * ')' MACRO-INCLUSION ?
 
-MACRO ::= '(' MACRO-NAME MACRO-ACTION * ')'
+<define name="module-list">
+  <element name="module-list">
+    <zeroOrMore>
+      <element name="module">
+       <attribute name="id">
+         <data type="ID"><param name="pattern">module-.*</param></data>
+       </attribute>
+       <zeroOrMore>
+         <element name="function">
+           <attribute name="id">
+               <data type="ID">
+               <param name="pattern">function-.*</param></data>
+           </attribute>
+         </element>
+       </zeroOrMore>
+      </element>
+    </zeroOrMore>
+  </element>
+</define>
 
-MACRO-NAME ::= SYMBOL
+@endverbatim
 
-MACRO-ACTION ::= ACTION
+各 &lt;command&gt; エレメントは一つの外部モジュール (動的ライブラリ)を
+宣言し、属性 "id" は外部モジュールの名前を表す。
+
+&lt;function&gt; エレメントはモジュールによってエクスポートされている関
+数名を示す。
+
+属性 "id" の値が "function-init" であれば、その関数はこの入力メソッド用
+の入力コンテクストが生成される際に、デフォルトの引数 (&lt;call&gt; の節
+参照) のみとともに呼ばれる。 "function-fini" であれば、 入力コンテクス
+トが破壊される際に、デフォルトの引数のみとともに呼ばれる。
+
+#if EXAMPLE_CODE
+  <module-list>
+    <module id="module-libmimx-anthy">
+      <function id="function-convert"/>
+      <function id="function-resize"/>
+      <function id="function-change"/>
+      <function id="function-commit"/>
+      <function id="function-init"/>
+      <function id="function-fini"/>
+    </module>
+  </module-list>
+#endif
+
+このコードは外部モジュール "module-libmimx-anthy" を宣言する。この外部
+モジュール は6つの関数をエクスポートしている。
 
-TAGS ::= `(` LANGUAGE NAME EXTRA-ID ? `)`
+@verbatim
 
-MACRO-INCLUSION ::= '(' 'include' TAGS 'macro' MACRO-NAME ? ')'
+<define name="macro-list">
+  <element name="macro-list" ns="http://www.m17n.org/MIM">
+    <zeroOrMore>
+      <element name="macro">
+       <attribute name="id">
+         <data type="ID"><param name="pattern">macro-.*</param></data>
+       </attribute>
+       <zeroOrMore><ref name="action"/></zeroOrMore>
+      </element>
+    </zeroOrMore>
+  </element>
+</define>
 
 @endverbatim
 
-@c MACRO-INCLUSION ¤Ï¡¢@c TAGS ¤Ç»ØÄꤵ¤ì¤ë¾¤ÎÆþÎϥ᥽¥Ã¥É¤«¤é¥Þ¥¯¥í¤ò
-Æɤ߹þ¤à¡£@c MACRO-NAME ¤¬Í¿¤¨¤é¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢Á´¤Æ¤Î¥Þ¥¯¥í¤òÆɤࡣ
+&lt;macro-list&gt; はこの入力メソッドで使用されるマクロを宣言する。
+&lt;macro&gt; エレメントは複数の &lt;action&gt; をまとめてそれに名前を付ける。
+属性 "id" が &lt;macro&gt; の名前であり、この属性によってマクロを参照する。
+
+#if EXAMPLE_CODE
+  <macro-list>
+    <macro id="macro-forward">
+      <set id="cc3">
+        <predefined-nth-previous-or-following-character position="+3"/>
+      </set>
+      <conditional>
+                 :              :     ;; more <action>s
+    </macro>
+  </macro-list>
+#endif
+
+このコードはマクロ "macro-forward" を宣言する。
 
 @verbatim
-MAP-LIST ::= MAP-INCLUSION ? '(' 'map' MAP * ')' MAP-INCLUSION ?
 
-MAP ::= '(' MAP-NAME RULE * ')'
+<define name="marker">
+  <choice>
+    <ref name="predefined-marker"/>
+    <ref name="user-defined-marker"/>
+  </choice>
+</define>
 
-MAP-NAME ::= SYMBOL
+@endverbatim
 
-RULE ::= '(' KEYSEQ MAP-ACTION * ')'
+マーカは preediting テキスト中での文字位置を示すシンボルである。
+&lt;mark-current-position&gt; はマーカを特定の位置に設定する。
+&lt;move-to-marker&gt; と &lt;delete-to-marker&gt; はマーカの位置を参照
+する。
 
-KEYSEQ ::= MTEXT | '(' [ SYMBOL | INTEGER ] * ')'
+@verbatim
 
-MAP-INCLUSION ::= '(' 'include' TAGS 'map' MAP-NAME ? ')'
+<define name="predefined-marker">
+    <attribute name="position">
+      <choice>
+       <data type="string"><param name="pattern">@[0-9]</param>
+       </data>
+       <value>@first</value>
+       <value>@current</value>
+       <value>@last</value>
+       <value>@previous</value>
+       <value>@next</value>
+       <value>@previous_candidate_list
+       <value>@next_candidate_list
+      </choice>
+    </attribute>
+</define>
 
 @endverbatim
 
-ÆþÎϥ᥽¥Ã¥É¤¬¤½¤ìñÂΤÇÍøÍѤµ¤ì¤ë¤³¤È¤¬¤Ê¤¯¾ï¤Ë¾¤ÎÆþÎϥ᥽¥Ã¥É¤ËÆÉ
-¤ß¹þ¤Þ¤ì¤ÆÍѤ¤¤é¤ì¤ë¾ì¹ç¤Ë¤Ï¡¢@c MAP-LIST ¤Ï¾Êά¤Ç¤­¤ë¡£
+predefined-marker は @@ で始まるマーカである。 @@0, @@1, ... , @@9は、
+それぞれ 0番目, 1番目, ... , 9番目の位置を示す。
+@@previous_candidate_list 候補リストが変化する前の位置、
+@@next_candidate_list は候補リストが変化する際の次の位置を示す。
+
+#if EXAMPLE_CODE
+ <delete-to-marker position="@first"/>
+#endif
+
+このコードは、バッファの最初の位置と現在の位置の間の文字を削除する。
 
-@c MAP-NAME ÄêµÁÃæ¤Î @c SYMBOL ¤Ï¡¢ @c t ¤¢¤ë¤¤¤Ï @c nil ¤Ç¤¢¤Ã¤Æ¤Ï¤Ê
-¤é¤Ê¤¤¡£
+@verbatim
+
+<define name="user-defined-marker">
+      <attribute name="markerID">
+       <data type="string"><param  name="pattern">[^@].*</param></data>
+      </attribute>
+</define>
 
-@c KEYSEQ ÄêµÁÃæ¤Î @c MTEXT ¤Ï¡¢¥­¡¼¥Ü¡¼¥É¤«¤éÀ¸À®¤Ç¤­¤ëʸ»ú¤Ç¹½À®¤µ¤ì
-¤ë¡£¤¹¤Ê¤ï¤Á @c MTEXT ¤ÏÄ̾ï ASCII Ê¸»ú¤Î¤ß¤ò´Þ¤à¡£¤·¤«¤·¡¢ÆþÎϥ᥽¥Ã¥É
-¤¬¤¿¤È¤¨¤ÐÀ¾¥è¡¼¥í¥Ã¥ÑÍÑ¥­¡¼¥Ü¡¼¥É¤ò»È¤¦¤³¤È¤òÁÛÄꤷ¤¿¤â¤Î¤Ç¤¢¤ì¤Ð¡¢@c
-MTEXT ¤Ï Latin-1 Ê¸»ú¤ò´Þ¤ó¤Ç¤â¤è¤¤¡£
+@endverbatim
 
-@c KEYSEQ ÄêµÁÃæ¤Î @c SYMBOL ¤Ï¡¢´Ø¿ô minput_event_to_key () ¤ÎÌá¤êÃͤÇ
-¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Î¸µ¤Ç¤Ï¡¢ @c xev ¥³¥Þ¥ó¥É¤òÍѤ¤
-¤ÆÃͤò´Êñ¤Ë¥Á¥§¥Ã¥¯¤Ç¤­¤ë¡£¤¿¤È¤¨¤Ð¡¢ ¥ê¥¿¡¼¥ó¥­¡¼¡¢¥Ð¥Ã¥¯¥¹¥Ú¡¼¥¹¥­¡¼¡¢
-¥­¡¼¥Ñ¥Ã¥É¤Î0¤Î¥­¡¼¤Ê¤É¤Ï¡¢¤½¤ì¤¾¤ì@c (Return) , @c (BackSpace) , @c
-(KP_0) ¤È¤·¤Æ¤¢¤é¤ï¤µ¤ì¤ë¡£¥·¥Õ¥È¡¢¥³¥ó¥È¥í¡¼¥ë¡¢¥á¥¿¡¢¥¢¥ë¥È¡¢¥¹¡¼¥Ñ¡¼¡¢
-¥Ï¥¤¥Ñ¡¼¤â²¡¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ì¤¾¤ìS- , C- , M- , A- , s- , H- ¤¬
-Á°¤Ë¤³¤Î½ç¤ËÃÖ¤«¤ì¤ë¡£¤·¤¿¤¬¤Ã¤Æ "¥ê¥¿¡¼¥ó¥­¡¼¤ò¥·¥Õ¥È¤·¤Æ¥á¥¿¤·¤Æ¥Ï¥¤
-¥Ñ¡¼¤·¤¿¤â¤Î" ¤Ï@c (S-M-H-Return) ¤Ç¤¢¤ë¡£"a ¤ò¥·¥Õ¥È" ¤«¤é "z ¤ò¥·¥Õ¥È
-" ¤Þ¤Ç¤Ï¡¢Ã±¤Ë A ¤«¤é Z ¤È¤·¤Æɽ¤µ¤ì¤ë¤³¤È¤ËÃí°Õ¡£¤·¤¿¤¬¤Ã¤Æ¡¢ "a ¤ò¥·
-¥Õ¥È¤·¤Æ¥á¥¿¤·¤Æ¥Ï¥¤¥Ñ¡¼¤·¤¿¤â¤Î" ¤Ï @c (M-H-A) ¤È¤Ê¤ë¡£
+User-defined-marker は @@ で始まってはならない。
 
-@c KEYSEQ ÄêµÁÃæ¤Î @c INTEGER ¤Ï¡¢Í­¸ú¤Êʸ»ú¥³¡¼¥É¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+#if EXAMPLE_CODE
+ <move-to-marker position="T"/>
+#endif
 
-@c MAP-INCLUSION ¤Ï¡¢@c TAGS ¤Ç»ØÄꤵ¤ì¤ë¾¤ÎÆþÎϥ᥽¥Ã¥É¤«¤é¥Þ¥Ã¥×¤òÆÉ
-¤ß¹þ¤à¡£@c MAP-NAME ¤¬Í¿¤¨¤é¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢Á´¤Æ¤Î¥Þ¥Ã¥×¤òÆɤࡣ
+このコードは、マーカをユーザ定義の位置 T へ移動する。
 
 @verbatim
-MAP-ACTION ::= ACTION
 
-ACTION ::= INSERT | DELETE | SELECT | MOVE | MARK
-           | SHOW | HIDE | PUSHBACK | POP | UNDO 
-          | COMMIT | UNHANDLE | SHIFT | CALL
-          | SET | IF | COND | '(' MACRO-NAME ')'
+<define name="predefined-nth-previous-or-following-character">
+  <element name="predefined-nth-previous-or-following-character">
+    <attribute name="position">
+      <choice>
+       <data type="negativeInteger"/>
+       <data type="positiveInteger"/>
+      </choice>
+    </attribute>
+  </element>
+</define>
 
-PREDEFINED-SYMBOL ::=
-    '@0' | '@1' | '@2' | '@3' | '@4'
-    | '@5' | '@6' | '@7' | '@8' | '@9'
-    | '@<' | '@=' | '@>' | '@-' | '@+' | '@[' | '@]'
-    | '@@'
-    | '@-0' | '@-N' | '@+N'
 @endverbatim
 
-@verbatim
-STATE-LIST ::= STATE-INCUSION ? '(' 'state' STATE * ')'  STATE-INCUSION ?
+&lt;predefined-nth-previous-or-following-character&gt; エレメントは、プ
+リエデットバッファ中の1文字を指定する。
 
-STATE ::= '(' STATE-NAME [ STATE-TITLE-TEXT ] BRANCH * ')'
+属性 "position" の値が負の整数 @c -N である場合、
+&lt;predefined-nth-previous-or-following-character&gt; エレメントは、プ
+リエデット中の現在の位置から @c N 文字前の文字である。もしプリエディッ
+ト中で先行する文字がM (M<N) 文字しかなければ、その値は入力スポットから
+数えて (N-M) 文字前の文字となる。
 
-STATE-NAME ::= SYMBOL
+属性 "position" の値が正の整数 @c N である場合、この変数の値は、プリエ
+デット中の現在の位置から @c N 文字後の文字である。もしプリエディット中
+で後続する文字がM (M<N) 文字しかなければ、その値は入力スポットから数え
+て (N-M) 文字後の文字となる。
 
-STATE-TITLE-TEXT ::= MTEXT
+#if EXAMPLE_CODE
+<predefined-nth-previous-or-following-character position="-1"/>
+#endif
 
-BRANCH ::= '(' MAP-NAME BRANCH-ACTION * ')'
-          | '(' nil BRANCH-ACTION * ')'
-          | '(' t BRANCH-ACTION * ')'
+このコードは直前の文字を意味する。
+
+@verbatim
+<define name="predefined-selector">
+      <choice>
+       <data type="string"><param name="pattern">@[0-9]</param></data>
+       <value>@first</value>
+       <value>@current</value>
+       <value>@last</value>
+       <value>@previous</value>
+       <value>@next</value>
+       <value>@previous_candidate_list</value>
+       <value>@next_candidate_list</value>
+      </choice>
+</define>
 
-STATE-INCLUSION ::= '(' 'include' TAGS 'state' STATE-NAME ? ')'
 @endverbatim
 
-ÆþÎϥ᥽¥Ã¥É¤¬¤½¤ìñÂΤÇÍøÍѤµ¤ì¤ë¤³¤È¤¬¤Ê¤¯¾ï¤Ë¾¤ÎÆþÎϥ᥽¥Ã¥É¤ËÆÉ
-¤ß¹þ¤Þ¤ì¤ÆÍѤ¤¤é¤ì¤ë¾ì¹ç¤Ë¤Ï¡¢@c STATE-LIST ¤Ï¾Êά¤Ç¤­¤ë¡£
+Predefined-selector は候補グループ中での位置を示し、&lt;select&gt; エレ
+メント中で用いられる。@@0, @@1, ... , @@9は、それぞれ 0番目, 1番目,
+... , 9番目の位置を指す。@@previous は前の候補を指す。もし今の候補が今
+の候補グループ中での最初のものであれば、前の候補グループの最後の候補を
+指す。@@next は次の候補を指す。もし今の候補が今の候補グループ中での最後
+のものであれば、次の候補グループの最初の候補を指す。
+@@previous_candidate_list と@@next_candidate_list は、それぞれ前と後の
+候補グループ中で、今の候補と同じ候補インデックスを持つものを指す。
 
-@c STATE-INCLUSION ¤Ï¡¢@c TAGS ¤Ç»ØÄꤵ¤ì¤ë¾¤ÎÆþÎϥ᥽¥Ã¥É¤«¤é¥¹¥Æ¡¼¥È
-¤òÆɤ߹þ¤à¡£@c STATE--NAME ¤¬Í¿¤¨¤é¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢¤¹¤Ù¤Æ¤Î¥¹¥Æ¡¼¥È¤òÆÉ
-¤à¡£
+#if EXAMPLE_CODE
+<select selector="@previous"/>
+#endif
 
-@c STATE-TITLE-TEXT ¤Ï¡¢¤â¤·»ØÄꤵ¤ì¤Æ¤¤¤ì¤Ð¡¢ÆþÎϥ᥽¥Ã¥É¤¬¤³¤Î
-¾õÂ֤ˤ¢¤ë»þ¥¹¥¯¥ê¡¼¥ó¾å¤Ëɽ¼¨¤µ¤ì¤ë¥Æ¥­¥¹¥È¤Ç¤¢¤ë¡£¾Êά¤µ¤ì¤¿¾ì¹ç¤Ë¤Ï
-@c TITLE-TEXT ¤¬ÍѤ¤¤é¤ì¤ë¡£
+このコードは前の候補を選択する。
 
-@c BRANCH ¤ÎÂè°ì¤Î·Á¼°¤Ç¤Ï¡¢@c MAP-NAME ¤Ï @c MAP ¤Ë¸½¤ï¤ì¤ë¤â¤Î¤Ç¤Ê¤¯
-¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤Î¾ì¹ç¡¢@c MAP-NAME ¤Î @c KEYSEQ ¤Î°ì¤Ä¤Ë¹çÃפ¹¤ë¥­¡¼Îó
-¤¬¥¿¥¤¥×¤µ¤ì¤ì¤Ð¡¢ @c BRANCH-ACTION ¤¬¼Â¹Ô¤µ¤ì¤ë¡£
+@subsection immap 入力メソッドのマップとルール
 
-@c BRANCH ¤ÎÂèÆó¤Î·Á¼°¤Ç¤Ï¡¢¤½¤Î»þÅÀ¤Î¾õÂ֤Τ¤¤º¤ì¤Î @c BRANCH ¤Ë¤â¹çÃ×
-¤·¤Ê¤¤¥­¡¼Î󤬥¿¥¤¥×¤µ¤ì¤ì¤Ð¡¢@c BRANCH-ACTION¤¬¼Â¹Ô¤µ¤ì¤ë¡£
+@verbatim
+<define name="map-list">
+  <element name="map-list">
+  <zeroOrMore>
+    <element name="map">
+      <attribute name="id">
+       <data type="ID"><param name="pattern">map-.*</param></data>
+      </attribute>
+      <zeroOrMore>
+       <element name="rule">
+         <choice>
+           <ref name="keyseq"/>
+           <ref name="command-reference"/>
+         </choice>
+         <zeroOrMore><ref name="action"/></zeroOrMore>
+       </element>
+      </zeroOrMore>
+    </element>
+  </zeroOrMore>
+  </element>
+</define>
 
-@c nil ¤Ç»Ï¤Þ¤ë @c BRANCH ¤¬¤Ê¤¯¡¢ÆþÎϤµ¤ì¤¿¥­¡¼Î󤬤½¤Î»þÅÀ¤Ç¤Î¤¤¤º¤ì¤Î
-@c BRANCH ¤Ë¤â¹çÃפ·¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢ÆþÎϥ᥽¥Ã¥É¤Ï½é´ü¾õÂÖ¤ËÁ«°Ü¤¹¤ë¡£
+@endverbatim
 
-@c BRANCH ¤ÎÂè»°¤Î·Á¼°¤Ç¤Ï¡¢¤½¤Î¾õÂ֤˰ÜÆ°¤·¤¿»þÅÀ¤Ç @c BRANCH-ACTION
-¤¬¼Â¹Ô¤µ¤ì¤ë¡£¤â¤·½é´ü¾õÂ֤Ǥ¢¤ì¤Ð¡¢ÆþÎϥ᥽¥Ã¥É¤ÎÆþÎÏ¥³¥ó¥Æ¥¯¥¹¥È¤òÀ¸
-À®¤·¤¿»þÅÀ¤Ç @c BRANCH-ACTION ¤ò¼Â¹Ô¤¹¤ë¡£
+&lt;map-list&gt; はこの入力メソッドで使用されるマップを宣言する。
+&lt;map&gt; エレメントは類似のルールをまとめて名付け、入力メソッドの状
+態遷移を記述を容易にする。属性"id" が &lt;map&gt; の名前を示す。
+&lt;rule&gt; エレメントによって、入力シークエンス&lt;keyseq&gt; (または
+&lt;command&gt;) と入力メソッドドライバが実行する &lt;action&gt; との対
+応付けを記述する。たとえば&lt;action&gt; が適当な文字を挿入する
+&lt;insert&gt; である場合、&lt;rule&gt; がキーボード上の入力キーとスク
+リーンに現れる文字の対応付けを行う。
+
+
+#if EXAMPLE_CODE
+  <map-list>
+    <map id="map-consonant">
+      <rule><keyseq keys="k"/><insert string="ཀ"/></rule>
+      <rule><keyseq keys="kh"/><insert string="ཁ"/></rule>
+          :         :
+      <rule><keyseq keys="a"/><insert string="ཨ"/></rule>
+    </map>
+    <map id="map-standard-stack">
+           :         :
+    </map>
+           :         :
+  </map-list>
+#endif
 
 @verbatim
-BRANCH-ACTION ::= ACTION
+
+<define name="keyseq">
+  <element name="keyseq">
+    <choice>
+      <attribute name="keys"><data type="string"/></attribute>
+      <oneOrMore>
+       <choice>
+         <element name="key-event"><data type="string"/></element>
+         <element name="character-code">
+           <choice>
+             <data type="nonNegativeInteger"><param name="pattern">[0-9]{1,7}</param></data>
+             <data type="string"><param name="pattern">[0#]x[0-9A-F]{1,6}</param></data>
+             <data type="string"><param name="pattern">\?.</param></data>
+           </choice>
+         </element>
+       </choice>
+      </oneOrMore>
+    </choice>
+  </element>
+</define>
+
 @endverbatim
 
-ÆþÎϥ᥽¥Ã¥É¤Ï¥·¥ó¥Ü¥ë¤Î¥ê¥¹¥È¤òÆó¤Ä»ý¤Ä¡£
+&lt;keyseq&gt; エレメント中の属性 "keys" の値は、キーボードから生成でき
+る文字で構成される。すなわち通常 ASCII 文字のみを含む。しかし、入力メソッ
+ドがたとえば西ヨーロッパ用キーボードを使うことを想定したものであれば、
+Latin-1 文字を含んでもよい。
 
-<ul>
-<li> ¥Þ¡¼¥«¥ê¥¹¥È
+&lt;keyseq&gt; エレメントの内容は、関数 minput_event_to_key () の戻り値
+でなくてはならない。X ウィンドウシステムの元では、 @c xev コマンドを用
+いて値を簡単にチェックできる。たとえば、 リターンキー、バックスペース
+キー、キーパッドの0のキーなどは、それぞれ@c Return , @c BackSpace , @c
+KP_0 としてあらわされる。シフト、コントロール、メタ、アルト、スーパー、
+ハイパーも押されている場合には、それぞれS- , C- , M- , A- , s- , H- が
+前にこの順に置かれる。したがって "リターンキーをシフトしてメタしてハイ
+パーしたもの" は@c (S-M-H-Return) である。"a をシフト" から "z をシフト
+" までは、単に A から Z として表されることに注意。したがって、 "a をシ
+フトしてメタしてハイパーしたもの" は @c M-H-A となる。
 
-¥Þ¡¼¥«¤Ï preediting ¥Æ¥­¥¹¥ÈÃæ¤Ç¤Îʸ»ú°ÌÃÖ¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£@c
-MARK ¥¢¥¯¥·¥ç¥ó¤Ï¥Þ¡¼¥«¤òÆÃÄê¤Î°ÌÃÖ¤ËÀßÄꤹ¤ë¡£@c MOVE ¤È @c DELETE ¥¢
-¥¯¥·¥ç¥ó¤Ï¥Þ¡¼¥«¤Î°ÌÃÖ¤ò»²¾È¤¹¤ë¡£
+&lt;character-code&gt; エレメントの内容は、有効な文字コードでなくてはな
+らない。
 
-<li> ÊÑ¿ô¥ê¥¹¥È
+#if EXAMPLE_CODE
+<keyseq>
+   <character-code>0x6F</character-code>
+   <key-event>A-z</key-event>
+</keyseq>
 
-ÊÑ¿ô¤ÏÀ°¿ô¤ÎÃͤò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ÃͤÏ@c SET ¥¢¥¯¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀßÄꤵ
-¤ì¡¢@c SET, @c INSERT, @c IF ¤Ë»²¾È¤µ¤ì¤ë¡£¤¹¤Ù¤Æ¤ÎÊÑ¿ô¤Î½é´üÃͤϡʰÅÌÛ
-¤Ë¡Ë 0 ¤Ç¤¢¤ë¡£
+<keyseq keys="k"/>
+#endif
 
-</ul>
+これらは二つとも正しい入力シークエンスである。
 
-³Æ @c PREDEFINED-SYMBOL ¤Ï¥Þ¡¼¥«¤È¤·¤ÆÍѤ¤¤é¤ì¤¿¾ì¹çÆÃÊ̤ʰÕÌ£¤ò»ý¤Ä¡£
+@verbatim
 
-<ul>
-<li> @c @@0, @c @@1, @c @@2, @c @@3, @c @@4, @c @@5, @c @@6, @c @@7, @c @@8, @c @@9
+<define name="command-reference">
+  <element name="command-reference">
+     <attribute name="id"><data type="IDREF"/></attribute>
+  </element>
+</define>
 
-¤½¤ì¤¾¤ì 0 ÈÖÌܤ«¤é 9 ÈÖÌܤΰÌÃÖ
+@endverbatim
+
+&lt;command-reference&gt; エレメントは、参照された &lt;command&gt; 中の
+&lt;keyseq&gt; がその位置に現れた場合と同じ効果を持つ。
+
+#if EXAMPLE_CODE
+<command-reference id="command-start"/>
+#endif
+
+このコードはコマンド "commad-start" を呼ぶ。
 
-<li> @c @@<, @c @@=, @c @@>
+@verbatim
 
-ºÇ½é¤Î¡¢º£¤Î¡¢ºÇ¸å¤Î°ÌÃÖ
+<define name="action">
+  <choice>
+    <ref name="insert"/>
+    <ref name="delete"/>
+    <ref name="select"/>
 
-<li> @c @@-, @c @@+
+    <element name="show-candidates"><empty/></element>
+    <element name="hide-candidates"><empty/></element>
 
-Á°¤Î¡¢¼¡¤Î°ÌÃÖ
+    <ref name="move"/>
+    <ref name="mark"/>
+    <ref name="pushback"/>
 
-<li> @c @@[, @c @@]
+    <element name="pop"><empty/></element>
 
-¸õÊä¥ê¥¹¥È¤¬ÊѲ½¤¹¤ëºÝ¤ÎÁ°¤È¼¡¤Î°ÌÃÖ
-</ul>
+    <ref name="undo"/>
 
-@c PREDEFINED-SYMBOL ¤Î¤¤¤¯¤Ä¤«¤Ï¡¢ @c SELECT ¥¢¥¯¥·¥ç¥óÃæ¤Ç¸õÊä¤Î¥¤¥ó
-¥Ç¥Ã¥¯¥¹¤È¤·¤ÆÍѤ¤¤é¤ì¤¿ºÝÆÃÊ̤ʰÕÌ£¤ò»ý¤Ä¡£
+    <element name="commit"> <empty/></element>
+    <element name="unhandle"><empty/></element>
 
-<ul>
-<li> @c @@<, @c @@=, @c @@>
+    <ref name="call"/>
 
-¸½ºß¤Î¸õÊ䥰¥ë¡¼¥×Ãæ¤Ç¤ÎºÇ½é¤Î¡¢º£¤Î¡¢ºÇ¸å¤Î¸õÊä
+    <element name="set"><ref name="set-val"/></element>
+    <element name="add"><ref name="set-val"/></element>
+    <element name="sub"><ref name="set-val"/></element>
+    <element name="mul"><ref name="set-val"/></element>
+    <element name="div"><ref name="set-val"/></element>
 
-<li> @c @@-
+    <ref name="if"/>
+    <ref name="conditional"/>
 
-Á°¸õÊä¡£º£¤Î¸õÊ䤬º£¤Î¸õÊ䥰¥ë¡¼¥×Ãæ¤Ç¤ÎºÇ½é¤Î¤â¤Î¤Ç¤¢¤ì¤Ð¡¢Á°¤Î¸õÊ䥰
-¥ë¡¼¥×¤ÎºÇ¸å¤Î¸õÊä¡£
+    <element name="macro-reference">
+      <attribute name="id">
+       <data type="IDREF"/>
+      </attribute>
+    </element>
+  </choice>
+</define>
 
-<li> @c @@+
+@endverbatim
 
-¼¡¸õÊä¡£º£¤Î¸õÊ䤬º£¤Î¸õÊ䥰¥ë¡¼¥×Ãæ¤Ç¤ÎºÇ¸å¤Î¤â¤Î¤Ç¤¢¤ì¤Ð¡¢¼¡¤Î¸õÊ䥰
-¥ë¡¼¥×¤ÎºÇ½é¤Î¸õÊä¡£
+&lt;action&gt;s は &lt;rule&gt;s 中に現れる。
 
-<li> @c @@[, @c @@]
+エレメント &lt;show-candidates&gt; は、入力メソッドドライバに現在の位置
+の前にある文字列に付加されている候補リストを示すように指示する。
 
-¤½¤ì¤¾¤ìÁ°¤È¸å¤Î¸õÊ䥰¥ë¡¼¥×Ãæ¤Ç¡¢º£¤Î¸õÊä¤ÈƱ¤¸¸õÊ䥤¥ó¥Ç¥Ã¥¯¥¹¤ò»ý¤Ä
-¤â¤Î¡£
-</ul>
+エレメント &lt;hide-candidates&gt; は、入力メソッドドライバに現在示され
+ている候補リストを隠すように指示する。
 
-¤Þ¤¿¡¢¤³¤ì¤âÆÃÊ̤ʰÕÌ£¤ò»ý¤Ä¡£
+エレメント &lt;pop&gt; はまだ処理されていない最初のイベントをイベント
+キューから取り出し破棄する。
 
-<ul>
-<li> @c @@@
+エレメント &lt;commit&gt; は現在の preediting テキストをコミットする。
 
-¤½¤Î»þÅÀ¤Ç½èÍý¤µ¤ì¤Æ¤¤¤ë¥­¡¼¤Î¿ô¡£
+エレメント &lt;unhandle&gt; は現在の preediting テキストをコミットし、
+最新のキーを未処理として返す。
 
-</ul>
+エレメント &lt;set&gt;, &lt;add&gt;, &lt;sub&gt;, &lt;mul&gt;,
+&lt;div&gt; は変数の値をそれぞれ設定し、加減乗除する。
 
-°Ê²¼¤Ï¥µ¥é¥¦¥ó¥É¥Æ¥­¥¹¥È½èÍý¤ËÍѤ¤¤é¤ì¤ë¡£
+#if EXAMPLE_CODE
+<set id="MAX-COUNT">
+  <int-val>4</int-val>
+</set>
+#endif
 
-<ul>
-<li> @c @@-0
+このコードは変数 @c MAX-COUNT の値を 4 に設定する。
 
-¥µ¥é¥¦¥ó¥É¥Æ¥­¥¹¥È¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ì¤Ð -1 ¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -2 ¡£
+#if EXAMPLE_CODE
+<add id="C-AFTER-V">
+  <int-val>1</int-val>
+</add>
+#endif
 
-<li> @c @@-N
+このコードは変数 @c C-AFTER-V の値を1増やす。
 
-¤³¤³¤Ç @c N ¤ÏÀµ¤ÎÀ°¿ô¤Ç¤¢¤ë¡£¤³¤ÎÊÑ¿ô¤ÎÃͤϡ¢¥×¥ê¥¨¥Ç¥Ã¥ÈÃæ¤Î¸½ºß¤Î°Ì
-ÃÖ¤«¤é @c N Ê¸»úÁ°¤Îʸ»ú¤Ç¤¢¤ë¡£¤â¤·¥×¥ê¥¨¥Ç¥£¥Ã¥ÈÃæ¤ÇÀè¹Ô¤¹¤ëʸ»ú¤¬M
-(M<N) Ê¸»ú¤·¤«¤Ê¤±¤ì¤Ð¡¢¤½¤ÎÃͤÏÆþÎÏ¥¹¥Ý¥Ã¥È¤«¤é¿ô¤¨¤Æ (N-M) Ê¸»úÁ°¤Îʸ
-»ú¤È¤Ê¤ë¡£@c delete ¥¢¥¯¥·¥ç¥ó¤Î°ú¿ô¤È¤·¤ÆÍѤ¤¤é¤ì¤¿¾ì¹ç¡¢¤³¤ÎÊÑ¿ô¤Ïºï
-½ü¤¹¤ëʸ»ú¿ô¤ò»ØÄꤹ¤ë¡£
+&lt;macro-reference&gt; エレメントは、参照された &lt;macro&gt; 中の
+&lt;action&gt; がその位置に現れた場合と同じ効果を持つ。
 
-<li> @c @@+N
+@verbatim
 
-¤³¤³¤Ç @c N ¤ÏÀµ¤ÎÀ°¿ô¤Ç¤¢¤ë¡£¤³¤ÎÊÑ¿ô¤ÎÃͤϡ¢¥×¥ê¥¨¥Ç¥Ã¥ÈÃæ¤Î¸½ºß¤Î°Ì
-ÃÖ¤«¤é @c N Ê¸»ú¸å¤Îʸ»ú¤Ç¤¢¤ë¡£¤â¤·¥×¥ê¥¨¥Ç¥£¥Ã¥ÈÃæ¤Ç¸å³¤¹¤ëʸ»ú¤¬M
-(M<N) Ê¸»ú¤·¤«¤Ê¤±¤ì¤Ð¡¢¤½¤ÎÃͤÏÆþÎÏ¥¹¥Ý¥Ã¥È¤«¤é¿ô¤¨¤Æ (N-M) Ê¸»ú¸å¤Îʸ
-»ú¤È¤Ê¤ë¡£@c delete ¥¢¥¯¥·¥ç¥ó¤Î°ú¿ô¤È¤·¤ÆÍѤ¤¤é¤ì¤¿¾ì¹ç¡¢¤³¤ÎÊÑ¿ô¤Ïºï
-½ü¤¹¤ëʸ»ú¿ô¤ò»ØÄꤹ¤ë¡£
+<define name="set-val">
+    <attribute name="id"/>
+    <ref name="expr"/>
+</define>
 
-</ul>
+@endverbatim
 
-³Æ¥¢¥¯¥·¥ç¥ó¤Î°ú¿ô¤È¿¶Éñ¤¤¤Ï°Ê²¼¤ÎÄ̤ꡣ
+属性 "id" の値として指定された変数の値を&lt;expr&gt;に設定し、&lt;expr&gt;の値だけ加減乗除する。
 
 @verbatim
-INSERT ::= '(' 'insert' MTEXT ')'
-           | MTEXT
-          | INTEGER
-           | '(' 'insert' SYMBOL ')'
-           | '(' 'insert' '(' CANDIDATES * ')' ')'
-           | '(' CANDIDATES * ')' 
 
-CANDIDATES ::= MTEXT | '(' MTEXT * ')'
+<define name="insert">  
+    <element name="insert">
+      <choice>
+       <attribute name="string"><data type="string"/></attribute>
+       <attribute name="character">
+         <choice>
+           <data type="string"><param name="pattern">\?.</param></data>
+           <data type="string"><param name="pattern">[0#]x[0-9A-F]{1,6}</param></data>
+           <data type="nonNegativeInteger"><param name="pattern">[0-9]{1,7}</param></data>
+         </choice>
+       </attribute>
+       <group>
+         <attribute name="character-or-string"><value>variable</value></attribute>
+         <ref name="variable-reference"/>
+       </group>
+
+       <oneOrMore>
+         <element name="candidates">
+                <data type="string"/>
+              </element>
+       </oneOrMore> 
+        <oneOrMore>
+         <element name="list-of-candidates">
+           <list>
+                <zeroOrMore><data type="NMTOKEN"/></zeroOrMore></list>
+                </element></oneOrMore>
+      </choice>
+    </element>
+</define>
+
 @endverbatim
 
-Âè°ì¡¢ÂèÆó¤Î·Á¼°¤Ï @c MTEXT ¤ò¸½ºß¤Î°ÌÃÖ¤ÎÁ°¤ËÁÞÆþ¤¹¤ë¡£
+&lt;insert&gt; エレメントは、属性によって指定された文字または M-text を
+現在の位置の前に挿入する。挿入によってマーカの位置は自動的に変更される。
+
+属性 "string" は挿入する M-text を指定する。属性 "character" は挿入する
+文字のコードを指定する。属性 "character-or-string" の値は変数でなくては
+ならず、その値が正しい文字コードあるいはM-textであれば挿入する。
+
+#if EXAMPLE_CODE
+<insert string="á"/>
+<insert character="225"/>
+<insert character="0x00E1"/>
+#endif
+
+これらのコードは同じ文字 "á" を挿入する。
 
-Âè»°¤Î·Á¼°¤Ï¡¢Ê¸»ú @c INTEGER ¤ò¸½ºß¤Î°ÌÃÖ¤ÎÁ°¤ËÁÞÆþ¤¹¤ë¡£
+&lt;candidates&gt; エレメントが与えられた時には、その内容中の文字それぞ
+れが挿入される候補である。&lt;insert&gt; は現在の位置の直前に最初の候補
+を挿入する。挿入された文字列には、候補のリストと現在選択されている候補
+を指す情報が付加されている。
 
-Âè»Í¤Î·Á¼°¤Ï¡¢@c SYMBOL ¤òÊÑ¿ô¤È¤·¤Æ°·¤¤¡¢¤½¤ÎÃͤ¬Àµ¤·¤¤Ê¸»ú¥³¡¼¥É¤Ç¤¢
-¤ì¤Ð¸½ºß¤Î°ÌÃÖ¤ÎÁ°¤ËÁÞÆþ¤¹¤ë¡£
+&lt;list-of-candidates&gt; エレメントが与えられた時には、そのリスト中の
+項目それぞれが挿入される候補である。&lt;insert&gt; は現在の位置の直前に
+最初の候補を挿入する。挿入された文字列には、候補のリストと現在選択され
+ている候補を指す情報が付加されている。
 
-Âè¸Þ¡¢ÂèÏ»¤Î·Á¼°¤Ç¤Ï¡¢@c CANDIDATES ¤Ï¸õÊ䥰¥ë¡¼¥×¤òɽ¤·¡¢@c
-CANDIDATES ¤Î³ÆÍ×ÁǤ¬¸õÊä¤òɽ¤¹¡£¤Ä¤Þ¤ê@c CANDIDATES ¤¬ M-text ¤Ç¤¢¤ì¤Ð¡¢
-¸õÊä¤Ï¤½¤ÎM-text Ãæ¤Îʸ»ú¤Ç¤¢¤ê¡¢@c CANDIDATES ¤¬ M-text ¤Î¥ê¥¹¥È¤Ç¤¢¤ì
-¤Ð¡¢¸õÊä¤Ï¤½¤ì¤é¤Î M-text ¤Ç¤¢¤ë¡£
+#if EXAMPLE_CODE
+<insert>
+    <candidates>$¢£¥₩</candidates>
+</insert>
 
-¤³¤ì¤é¤Î·Á¼°¤Ï¸½ºß¤Î°ÌÃ֤ξÁ°¤ËºÇ½é¤Î¸õÊä¤òÁÞÆþ¤¹¤ë¡£ÁÞÆþ¤µ¤ì¤¿Ê¸»úÎó
-¤Ë¤Ï¡¢¸õÊä¤Î¥ê¥¹¥È¤È¸½ºßÁªÂò¤µ¤ì¤Æ¤¤¤ë¸õÊä¤ò»Ø¤¹¾ðÊó¤¬Éղ䵤ì¤Æ¤¤¤ë¡£
+<insert>
+     <list-of-candidates>a ā á ǎ à</list-of-candidates>
+</insert>
+#endif
 
-ÁÞÆþ¤Ë¤è¤Ã¤Æ¥Þ¡¼¥«¤Î°ÌÃ֤ϼ«Æ°Åª¤ËÊѹ¹¤µ¤ì¤ë¡£
+これらのコードはそれぞれ $ と a を挿入し、それに全体のリストを関係づける。
 
 @verbatim
-DELETE ::= '(' 'delete' SYMBOL ')'
-           | '(' 'delete' INTEGER ')'
+
+<define name="delete">  
+    <choice>
+      <element name="delete-to-marker"><ref name="marker"/></element>
+      <element name="delete-to-character-position"><data type="integer"/></element>
+      <element name="delete-n-characters">
+          <attribute name="n"><data type="integer"/></attribute>
+      </element>
+    </choice>
+</define>
+
 @endverbatim
 
-Âè°ì¤Î·Á¼°¤Ï @c SYMBOL ¤ò¥Þ¡¼¥«¤È¤·¤Æ¡¢¥Þ¡¼¥«¤È¸½ºß¤Î°ÌÃ֤δ֤Îʸ»ú¤ò
-ºï½ü¤¹¤ë¡£
+文字の削除のためには、3種類の &lt;action&gt; のどれかを用いることがで
+きる。削除によってマーカの位置は自動的に変更される。
 
-ÂèÆó¤Î·Á¼°¤Ï @c INTEGER ¤òʸ»ú°ÌÃ֤Ȥ·¤Æ¡¢¤½¤Îʸ»ú°ÌÃ֤ȸ½ºß¤Î°ÌÃ֤δÖ
-¤Îʸ»ú¤òºï½ü¤¹¤ë¡£
+&lt;delet-to-marker&gt; エレメントは、現在の位置と指定のマーカの間の文
+字を削除する。
 
-ºï½ü¤Ë¤è¤Ã¤Æ¥Þ¡¼¥«¤Î°ÌÃ֤ϼ«Æ°Åª¤ËÊѹ¹¤µ¤ì¤ë¡£
+#if EXAMPLE_CODE
+<delete-to-marker position="@first"/>
+#endif
 
-@verbatim
-SELECT ::= '(' 'select' PREDEFINED-SYMBOL ')'
-           | '(' 'select' INTEGER ')'
-          | '(' 'select' SYMBOL ')'
-@endverbatim
+このコードはバッファの最初から現在の位置までの文字を削除する。
+
+&lt;delete-to-character-position&gt; エレメントはその内容を文字位置とし
+て、その文字位置と現在の位置の間の文字を削除する。
 
-¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï¤Þ¤º¡¢¸½ºß¤Î°ÌÃ֤ξÁ°¤Îʸ»ú¤¬¡¢¸õÊä¥ê¥¹¥È¤¬Éղ䵤ì¤Æ
-¤¤¤ëʸ»úÎó¤Ë°¤¹¤«¤É¤¦¤«¤òÄ´¤Ù¤ë¡£¤½¤¦¤Ç¤¢¤ì¤Ð¡¢¤½¤Îʸ»úÎó¤ò°ú¿ô¤Ë¤è¤Ã
-¤Æ»ØÄꤵ¤ì¤¿¸õÊä¤ËÆþ¤ì´¹¤¨¤ë¡£
+#if EXAMPLE_CODE
+<delete-to-character-position>-3</delete-to-character-position>
+#endif
 
-Âè°ì¤Î·Á¼°¤Ç¤Ï @c PREDEFINED-SYMBOL ¤òÁ°½Ò¤Î¸õÊ䥤¥ó¥Ç¥Ã¥¯¥¹¤È¤·¤Æ°·¤¤¡¢
-¤½¤ì¤Ë¤è¤Ã¤Æ¸õÊä¥ê¥¹¥ÈÃæ¤Î¿·¤·¤¤¸õÊ䤬»ØÄꤵ¤ì¤ë¡£
+このコードは3つ前から現在の位置までの文字を削除する。
 
-ÂèÆó¤Î·Á¼°¤Ç¤Ï @c INTEGER ¤Ï¸õÊ䥤¥ó¥Ç¥Ã¥¯¥¹¤Ç¤¢¤ê¡¢¸õÊä¥ê¥¹¥ÈÃæ¤Î¿·¤·
-¤¤¸õÊä¤ò»ØÄꤹ¤ë¡£
+&lt;delete-n-characters&gt; エレメントは、属性"n" の値だけの数の文字を
+削除する。値 N が負であれば、現在の位置より前の N 文字を、正であれば後
+の N 文字を削除する。
 
-Âè»°¤Î·Á¼°¤Ç¤Ï @c SYMBOL ¤ÏÀ°¿ô¤ÎÃͤò»ý¤¿¤Ê¤±¤ì¤Ð¤Ê¤é¤º¡¢¤½¤ÎÃͤ¬¸õÊ䥤
-¥ó¥Ç¥Ã¥¯¥¹¤È¤·¤Æ¼è¤ê°·¤ï¤ì¤ë¡£
+#if EXAMPLE_CODE
+<delete-n-characters n="+1"/>
+#endif
+
+このコードは後の文字1つを削除する。
 
 @verbatim
-SHOW ::= '(show)'
+
+<define name="select">  
+  <element name="select">
+    <choice>
+      <attribute name="selector">
+       <ref name="predefined-selector"/>
+      </attribute>
+      <attribute name="index">
+        <data type="integer"/>
+      </attribute>
+      <group>
+       <attribute name="index"><value>variable</value></attribute>
+       <ref name="variable-reference"/>
+      </group>
+    </choice>
+  </element>
+</define>
+
 @endverbatim
 
-¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢ÆþÎϥ᥽¥Ã¥É¥É¥é¥¤¥Ð¤Ë¸½ºß¤Î°ÌÃÖ¤ÎÁ°¤Ë¤¢¤ëʸ»úÎó¤ËÉÕ
-²Ã¤µ¤ì¤Æ¤¤¤ë¸õÊä¥ê¥¹¥È¤ò¼¨¤¹¤è¤¦¤Ë»Ø¼¨¤¹¤ë¡£
+&lt;select&gt; エレメントはまず、現在の位置の直前の文字が、候補リストが
+付加されている文字列に属すかどうかを調べる。そうであれば、その文字列を
+属性によって指定された候補に入れ換える。属性"selector" の値はいずれかの
+predefined-selector であり、候補リスト中の新しい候補を指定する。属性
+"index" の値はリスト中の順番を示し、その順番の候補が選ばれる。値が
+"variable" であった場合には、参照される変数は整数の値を持たなければなら
+ず、その値の順番の候補が選ばれる。
+
+#if EXAMPLE_CODE
+<select selector="@previous"/>
+<select index="0"/>
+#endif
+
+これらのコードはそれぞれ前の候補と最初の候補を選択する。
 
 @verbatim
-HIDE ::= '(hide)'
+
+<define name="move"> 
+  <choice> 
+     <element name="move-to-marker"> <ref name="marker"/></element> 
+     <element name="move-to-character-position"> <data type="integer"/></element> 
+  </choice>
+</define>
+
 @endverbatim
 
-¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢ÆþÎϥ᥽¥Ã¥É¥É¥é¥¤¥Ð¤Ë¸½ºß¼¨¤µ¤ì¤Æ¤¤¤ë¸õÊä¥ê¥¹¥È¤ò±£
-¤¹¤è¤¦¤Ë»Ø¼¨¤¹¤ë¡£
+この2つの &lt;action&gt;s は現在の位置を移動する。
+&lt;move-to-marker&gt; エレメントは指定されたマーカの位置に現在の位置を
+移動する。&lt;move-to-character-position&gt; エレメントはその内容である
+整数値を文字位置として扱い、そこへ現在の位置を移動する。
+
+#if EXAMPLE_CODE
+<move-to-marker position="@previous"/>
+<move-to-character-position>0</move-to-character-position>
+#endif
+
+これらのコードはそれぞれ直前、最初の位置へ現在の位置を移動する。
 
 @verbatim
-MOVE ::= '(' 'move' SYMBOL ')'
-         | '(' 'move' INTEGER ')'
+
+<define name="mark">  
+      <element name="mark-current-position">
+       <ref name="user-defined-marker"/>
+      </element>
+</define>
+
 @endverbatim
 
-Âè°ì¤Î·Á¼°¤Ï @c SYMBOL ¤ò¥Þ¡¼¥«¤È¤·¤Æ¡¢¤½¤ì¤ò¿·¤·¤¤¸½ºß¤Î°ÌÃ֤Ȥ¹¤ë¡£
+&lt;mark-current-position&gt; エレメントは、指定のマーカを現在の位置に
+設定する。
 
-ÂèÆó¤Î·Á¼°¤Ï @c INTEGER ¤òʸ»ú°ÌÃ֤Ȥ·¤Æ¡¢¤½¤Î°ÌÃÖ¤ò¿·¤·¤¤¸½ºß¤Î°ÌÃÖ¤È
-¤¹¤ë¡£
+#if EXAMPLE_CODE
+<mark-current-position markerID="M"/>
+#endif
 
+このコードは現在の位置にマーカ "M" を置く。
 @verbatim
-MARK ::= '(' 'mark' SYMBOL ')'
+
+<define name="pushback">
+    <choice>
+      <element name="pushback-n-events">
+       <attribute name="n"><data type="nonNegativeInteger"/></attribute>
+      </element>
+      <element name="pushback-keyseq"><ref name="keyseq"/></element>
+   </choice>
+</define>
+
 @endverbatim
 
-¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï @c SYMBOL ¤ò¥Þ¡¼¥«¤È¤·¤Æ¡¢¤½¤ì¤ò¸½ºß¤Î°ÌÃÖ¤ËÀßÄꤹ¤ë¡£
-@c SYMBOL ¤Ï @c PREDEFINED-SYMBOL ¤Ç¤¢¤Ã¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+この2つの &lt;action&gt; はキーイベントをイベントキューに差し戻す。
+&lt;pushback-n-events&gt; エレメントは最新のキーイベントを差し戻す。属
+性"n" の値が正の整数ならば差し戻すイベントの数を示す。0ならばすべて差
+し戻す。&lt;pushback-keyseq&gt; エレメントは、&lt;keyseq;gt; で指定され
+たキーイベントを差し戻す。
+
+#if EXAMPLE_CODE
+<pushback-keyseq><keyseq keys="b"/></pushback-keyseq>
+#endif
+
+このコードはキー "b" を戻す。
 
 @verbatim
-PUSHBACK :: = '(' 'pushback' INTEGER ')'
-              | '(' 'pushback' KEYSEQ ')'
+
+<define name="undo">
+  <element name="undo">
+    <optional>
+      <choice>
+       <attribute name="target-of-undo">
+         <choice>
+           <data type="positiveInteger"/>
+           <data type="negativeInteger"/>
+         </choice>
+       </attribute>
+       <ref name="variable-reference"/>
+      </choice>
+    </optional>
+  </element>
+</define>
+
 @endverbatim
 
-Âè°ì¤Î·Á¼°¤Ï¡¢@c INTEGER ¤ÎÃͤ¬Àµ¤Ê¤é¤ÐºÇ¿·¤Î @c INTEGER ¸Ä¤Î¥­¡¼¥¤¥Ù¥ó
-¥È¤ò¥¤¥Ù¥ó¥È¥­¥å¡¼¤Ëº¹¤·Ì᤹¡£0 ¤Ê¤é¤Ð¤¹¤Ù¤Æ¤Î¥­¡¼¥¤¥Ù¥ó¥È¤òº¹¤·Ì᤹¡£
+&lt;undo&gt; エレメントは、属性が無いばあいには、最新の二つのキーイベン
+ト、すなわちこのコマンドによって引き起こされたものとその直前のもの、を
+キャンセルする。
+
+属性 "target-of-undo" が正の整数 NUM ならば、NUM個めから最新のものまで
+を キャンセルする。負の整数ならば最新の(- NUM) 個のイベントをキャンセル
+する。変数参照である場合には、それは0でない整数に帰着されなくてはなら
+ず、その値が上記の場合と同様に取り扱われる。
 
-ÂèÆó¤Î·Á¼°¤Ï¡¢@c KEYSEQ Ãæ¤Î¥­¡¼¤ò¥¤¥Ù¥ó¥È¥­¥å¡¼¤Ëº¹¤·Ì᤹¡£
+#if EXAMPLE_CODE
+<undo target-of-undo="-1"/>
+#endif
+
+このコードは最新のイベントのみをキャンセルする。
 
 @verbatim
-POP ::= '(' 'pop' ')'
+
+<define name="call">
+  <element name="call">
+    <attribute name="id"><data type="IDREF"/></attribute>
+    <element name="function-reference">
+      <attribute name="id"><data type="IDREF"/></attribute>
+    </element>
+    <zeroOrMore>
+      <element name="argument">
+       <choice>
+         <group>
+           <attribute name="type"><value>string</value></attribute>
+           <data type="string"/>
+         </group>
+         <group>
+           <attribute name="type"><value>integer</value></attribute>
+           <choice>
+             <data type="string"><param name="pattern">\?.</param></data>
+             <data type="string"><param name="pattern">[0#]x[0-9A-F]{1,6}</param></data>
+             <data type="nonNegativeInteger"><param name="pattern">[0-9]{1,7}</param></data>
+           </choice>
+         </group>
+         <group>
+           <attribute name="type"><value>plist</value></attribute>
+           <ref name="plistObject"/>
+         </group>
+         <group>
+           <attribute name="type"><value>symbol</value></attribute>
+           <ref name="variable-reference"/>
+         </group>
+       </choice>
+      </element>
+    </zeroOrMore>
+  </element>
+</define>
+
 @endverbatim
 
-¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï¤Þ¤À½èÍý¤µ¤ì¤Æ¤¤¤Ê¤¤ºÇ½é¤Î¥¤¥Ù¥ó¥È¤ò¥¤¥Ù¥ó¥È¥­¥å¡¼¤«¤é
-¼è¤ê½Ð¤·ÇË´þ¤¹¤ë¡£
+&lt;call&gt; エレメントは外部モジュールの関数を呼ぶ。 関数は NULL を返
+すか、または行うべきアクションのリストを表す (#MPlist *) 型の値を返さな
+くてはならない。
+
+属性 "id" の値が外部モジュールを指定する。この値は&lt;module-list&gt;
+エレメント中に現われるものでなくてはならない。.
+&lt;function-reference&gt; エレメントが呼ぶ関数を指定する。これもまた、
+&lt;module-list&gt; エレメント中に現われるものでなくてはならない。.
+
+関数は (#MPlist *) 型の引数とともに呼ばれる。最初の要素のキーは #Mt で
+あり、その値は#MInputContext 型のオブジェクトへのポインタである。第二の
+要素のキーは#Msymbol であり、値は現在の状態名である。&lt;argument&gt;
+エレメントの内容は三つ目以降の要素の値として用いられる。それらの要素の
+キーは属性 "type" の値によって決定する。integer ならば対応するキーは
+#Minteger であり、symbol ならば、対応するキーは #Msymbol、などのように。
+
+#if EXAMPLE_CODE
+<call id="module-libmimx-anthy">
+  <function-reference id="function-resize"/>
+    <argument type="symbol">
+      <variable-reference id="t"/>
+    </argument>
+</call>
+#endif
+
+このコードは外部モジュール module-libmimx-anthy の関数 function-resize
+をシンボルである引数 "t" と共に呼ぶ。
 
 @verbatim
-UNDO :: = '(' 'undo' [ INTEGER | SYMBOL ] ')'
+
+<define name="expr">
+    <choice>
+      <group>
+       <element name="expr">
+          <attribute name="operator"><ref name="operator"/></attribute>
+         <zeroOrMore><ref name="expr"/></zeroOrMore>
+       </element>
+      </group>
+      <element name="int-val">
+       <choice>
+         <data type="integer"/>
+         <data type="string"><param name="pattern">[0#]x[0-9A-F]{1,6}</param></data>
+         <data type="string"><param name="pattern">\?.</param></data>
+       </choice>
+      </element>
+      <ref name="predefined-nth-previous-or-following-character">     
+      </ref>    
+      <ref name="variable-reference">
+      </ref>
+    </choice>
+</define>
+
 @endverbatim
 
-°ú¿ô¤¬Ìµ¤¤¾ì¹ç¡¢¤³¤Î¥¢¥¯¥·¥ç¥ó¤ÏºÇ¿·¤ÎÆó¤Ä¤Î¥­¡¼¥¤¥Ù¥ó¥È¡¢¤¹¤Ê¤ï¤Á¤³¤Î
-¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ°ú¤­µ¯¤³¤µ¤ì¤¿¤â¤Î¤È¤½¤ÎľÁ°¤Î¤â¤Î¡¢¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë¡£
+&lt;expr&gt;ession とは、
+ @li 演算子で結ばれた0個以上の &lt;expr&gt;essions 
+ @li 整数値
+ @li 特定の位置の文字
+ @li 変数
+である。
 
-À°¿ôÃͤΰú¿ô NUM ¤¬¤¢¤ë¾ì¹ç¡¢¤½¤ì¤ÏÀµ¤«Éé¤Ç¤¢¤ê 0 ¤Ç¤¢¤Ã¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
-Àµ¤Ê¤é¤ÐºÇ¿·¤Î¤â¤Î¤«¤é¿ô¤¨¤Æ NUM ¸ÄÌܤΥ¤¥Ù¥ó¥È¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë¡£Éé¤Ê¤é
-¤ÐºÇ¿·¤Î(- NUM) ¸Ä¤Î¥¤¥Ù¥ó¥È¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë¡£
+#if EXAMPLE_CODE
+<expr operator="=">
+   <predefined-nth-previous-or-following-character position="-1"/>
+   <int-val>0x0D91</int-val>
+</expr>
+#endif
 
-¥·¥ó¥Ü¥ë¤Î°ú¿ô¤¬¤¢¤ë¾ì¹ç¡¢¤½¤ì¤ÏÀ°¿ô¤Ëµ¢Ã夵¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤º¡¢¤½¤ÎÃͤ¬
-¾åµ­¤ÎÀµ¿ôÃÍ°ú¿ô¤Î¾ì¹ç¤ÈƱÍͤ˼è¤ê°·¤ï¤ì¤ë¡£
+このコード全体が expression であり、2つのexpression (2行目と3行目)
+を含んでいる。
 
 @verbatim
-COMMIT :: = '(commit)'
+
+<define name="variable-reference">
+  <element name="variable-reference">
+    <choice>
+      <attribute name="id"/>
+      <ref name="predefined-variable"/>
+    </choice>
+  </element>
+</define>
+
 @endverbatim
 
-¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï¸½ºß¤Î preediting ¥Æ¥­¥¹¥È¤ò¥³¥ß¥Ã¥È¤¹¤ë¡£
+&lt;variable-reference&gt; エレメントは、参照された &lt;variable&gt; が
+その位置に現れた場合と同じ効果を持つ。
+
+#if EXAMPLE_CODE
+<variable-reference id="handled-keys" type="predefined"/> 
+<variable-reference id="KK"/>
+#endif
 
 @verbatim
-UNHANDLE :: = '(unhandle)'
+
+<define name="operator">
+  <choice>
+      <value>+</value> 
+      <value>-</value>
+      <value>*</value>
+      <value>/</value>
+      <value>|</value>
+      <value>&</value>
+      <value>!</value>
+      <value>=</value>
+      <value><</value>
+      <value>></value>
+      <value><=</value>
+      <value>>=</value>
+  </choice>
+</define>
+
 @endverbatim
 
-¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï¸½ºß¤Î preediting ¥Æ¥­¥¹¥È¤ò¥³¥ß¥Ã¥È¤·¡¢ºÇ¿·¤Î¥­¡¼¤ò̤
-½èÍý¤È¤·¤ÆÊÖ¤¹¡£
+これらは &lt;expr&gt;ession 中に現れ得る演算子である。演算子
+@c +, @c -, @c *, @c / は加減乗除を行う。@c |, @c &amp;, @c 
+! はそれぞれ OR, AND, NOT 演算子である。@c =, @c &lt;, @c &gt;,
+@c &lt;=, @c &gt;= は引数を二つとりそれらを比較する。
 
 @verbatim
-SHIFT :: = '(' 'shift' STATE-NAME ')'
+
+<define name="if">
+  <element name="if">
+    <attribute name="condition">
+      <choice>
+      <value>=</value>
+      <value><</value>
+      <value>></value>
+      <value><=</value>
+      <value>>=</value>
+    </choice></attribute>
+    <ref name="expr"/>
+    <ref name="expr"/>
+    <element name="if-true-action-list">
+    <zeroOrMore><ref name="saction"/></zeroOrMore></element>
+    <optional><element name="if-not-true-action-list">
+    <zeroOrMore><ref name="saction"/></zeroOrMore></element></optional>
+  </element>
+</define>
+
 @endverbatim
 
-@c STATE-NAME ¤¬ @c t ¤Ê¤é¤Ð¡¢¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï¸½ºß¤Î¾õÂÖ¤ò°ì¤ÄÁ°¤Î¾õÂÖ
-¤ËÁ«°Ü¤µ¤»¤ë¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c STATE-NAME ¤Çɽ¤µ¤ì¤ë¾õÂÖ¤ËÁ«°Ü¤µ¤»¤ë¡£
-¸å¼Ô¤Î¾ì¹ç¤Ë¤Ï¡¢@c STATE-NAME ¤Ï @c STATE-LIST ¤Ë¸½¤ï¤ì¤ë¤â¤Î¤Ç¤Ê¤¯¤Æ¤Ï
-¤Ê¤é¤Ê¤¤¡£
+&lt;if&gt; エレメントは、2つの&lt;expr&gt; 間の関係が属性 "condition"
+を満たす場合 &lt;if-true-action-list&gt; の内容である &lt;action&gt; を
+実行する。そうでなければ、&lt;if-not-true-action-list&gt; があればその
+内容を実行する。
+
+
+#if EXAMPLE_CODE
+<if condition="<">
+  <variable-reference id="C"/><int-val>0</int-val>
+  <if-true-action-list><shift-to id="state-init"/></if-true-action-list>
+</if>
+#endif
+
+このコードは変数@c C が負の時、&lt;shift-to&gt; を実行する。
 
 @verbatim
-CALL ::= '(' 'call' MODULE-NAME FUNCTION ARG * ')'
 
-ARG ::= INTEGER | SYMBOL | MTEXT | PLIST
+<define name="conditional">
+  <element name="conditional">
+    <zeroOrMore>
+      <group>
+       <element name="case">
+       <ref name="expr"/>
+       <zeroOrMore><ref name="saction"/></zeroOrMore>
+       </element>
+      </group>
+    </zeroOrMore>
+  </element>
+</define>
+
 @endverbatim
 
-¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï³°Éô¥â¥¸¥å¡¼¥ë @c MODULE-NAME ¤Î´Ø¿ô @c FUNCTION ¤ò¸Æ
-¤Ö¡£@c MODULE-NAME ¤È @c FUNCTION ¤Ï @c MODULE-LIST ¤Ë¸½¤ï¤ì¤ë¤â¤Î¤Ç¤Ê
-¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+&lt;conditional&gt; エレメントは、各&lt;case&gt;中の&lt;expr&gt;を一つ
+づつ調べ、それが0 でない値をとる最初の&lt;case&gt;中の&lt;saction&gt;を
+実行する。
+
+#if EXAMPLE_CODE
 
-´Ø¿ô¤Ï (#MPlist *) ·¿¤Î°ú¿ô¤È¤È¤â¤Ë¸Æ¤Ð¤ì¤ë¡£ºÇ½é¤ÎÍ×ÁǤΥ­¡¼¤Ï #Mt ¤Ç
-¤¢¤ê¡¢¤½¤ÎÃͤÏ#MInputContext ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£ÂèÆó
-¤ÎÍ×ÁǤΥ­¡¼¤Ï#Msymbol ¤Ç¤¢¤ê¡¢Ãͤϸ½ºß¤Î¾õÂÖ̾¤Ç¤¢¤ë¡£ @c ARGs ¤Ï»°¤Ä
-ÌܰʹߤÎÍ×ÁǤÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¤ë¡£¤½¤ì¤é¤ÎÍ×ÁǤΥ­¡¼¤Ï¼«Æ°Åª¤Ë·èÄꤵ¤ì
-¤ë¡£@c ARG ¤¬À°¿ôÃͤʤé¤ÐÂбþ¤¹¤ë¥­¡¼¤Ï #Minteger ¤Ç¤¢¤ê¡¢@c ARG ¤¬¥·
-¥ó¥Ü¥ë¤Ê¤é¤Ð¡¢Âбþ¤¹¤ë¥­¡¼¤Ï #Msymbol¡¢¤Ê¤É¤Î¤è¤¦¤Ë¡£
+<conditional>
+  <case>
+    <expr operator="=">
+      <predefined-nth-previous-or-following-character position="-2"/>
+      <int-val>0x0E24</int-val>
+    </expr>
+  </case>
+  <case>
+    <int-val>1</int-val>
+    <delete-n-characters n="-1"/>
+        :            :
+  </case>
+</conditional>
+#endif
 
-´Ø¿ô¤Ï NULL ¤òÊÖ¤¹¤«¡¢¤Þ¤¿¤Ï¹Ô¤¦¤Ù¤­¥¢¥¯¥·¥ç¥ó¤Î¥ê¥¹¥È¤òɽ¤¹ (#MPlist
-*) ·¿¤ÎÃͤòÊÖ¤µ¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+このコードは、2つ前の文字の文字コードが0x0E24 (Thai character RU)でな
+い限り、二番めの&lt;case&gt; 中のactionを実行する。
+
+
+@subsection imstate 入力メソッドの状態
 
 @verbatim
-SET ::= '(' CMD SYMBOL1 EXPRESSION ')'
+      
+<define name="state-list">
+  <element name="state-list">
+    <zeroOrMore>
+      <element name="state">
+       <attribute name="id">
+         <data type="ID"><param name="pattern">state-.*</param></data>
+       </attribute>
+       <optional><element name="state-title-text"><data type="string"/></element></optional>
+       <interleave>
+       <optional>
+         <element name="state-hook"><oneOrMore><ref name="saction"/></oneOrMore></element>
+       </optional>
+       <optional>
+         <element name="catch-all-branch">
+                <zeroOrMore><ref name="saction"/></zeroOrMore>
+         </element>
+       </optional>
+       <zeroOrMore>
+         <element name="branch">
+           <attribute name="branch-selecting-map">
+               <data type="IDREF"/>
+           </attribute>
+           <zeroOrMore><ref name="saction"/></zeroOrMore>
+         </element>
+       </zeroOrMore>
+       </interleave>
+      </element>
+    </zeroOrMore>
+  </element>
+</define>
 
-CMD ::= 'set' | 'add' | 'sub' | 'mul' | 'div'
+@endverbatim
 
-EXPRESSION ::= INTEGER | SYMBOL2 | '(' OPERAND EXPRESSION * ')'
+入力メソッドドライバは常に一つの &lt;state&gt; にあり、入力を処理するこ
+とによって別の &lt;state&gt; に遷移することがある。異なる
+&lt;state&gt; では、同じ入力でも異なる&lt;saction&gt; を引き起こし、異
+なる結果を得ることがある。入力コンテクストが生成される、すなわち入力メ
+ソッドが起動された時点では入力メソッドドライバは&lt;state-list&gt; エレ
+メント中の最初の &lt;state&gt; にある。
+
+属性 "id" が &lt;state&gt; の名前を示す。&lt;state-title-text&gt; エレ
+メントの内容は、入力メソッドがこの状態にある時スクリーン上に表示される
+テキストである。省略されている場合には &lt;title&gt; エレメントの内容が
+用いられる。
+
+各 &lt;state&gt; は0以上の &lt;branch&gt;を持つ。各&lt;branch&gt; は
+&lt;map-list&gt; 中の各 &lt;map&gt に対応する。 属性
+"branch-selecting-map" の値が&lt;map&gt; の属性 "id" の値を示す。入力シー
+クエンスがある&lt;map&gt; 中の &lt;rule&gt; の &lt;keyseq&gt; (or
+&lt;command-reference&gt;) 部分に合致すると、対応する &lt;branch&gt; が
+選ばれ、その &lt;rule&gt; の &lt;action&gt; に続いてその
+&lt;branch&gt; の&lt;saction&gt; が実行される。
+
+&lt;state-hook&gt; エレメント (省略可能) は、入力メソッドドライバがこの
+&lt;state&gt; に遷移した時点で実行される&lt;sactions&gt; を指定する。
+
+入力メソッドの入力コンテクストを生成した時点で、入力メソッドは
+&lt;state-list&gt; の最初の &lt;state&gt; に遷移するため、その
+&lt;state&gt; の &lt;state-hook&gt; 中の &lt;saction&gt; が実行される。
+
+入力シークエンスが、その時点の &lt;state&gt; のいずれの &lt;branch&gt;
+にも合致しない場合には、
+
+   @li &lt;catch-all-branch&gt; エレメントが存在すれば、
+      &lt;catch-all-branch&gt;中の&lt;saction&gt;を実行する。
+   @li &lt;catch-all-branch&gt; がなければ、
+       入力メソッドは初期状態に遷移する。     
+
+#if EXAMPLE_CODE
+
+<state-list>
+  <state id="state-init">
+    <branch branch-selecting-map="map-consonant">
+      <move-to-marker position="@first"/>
+              :             :
+    </branch>
+    <branch branch-selecting-map="map-misc"/>
+    <branch branch-selecting-map="map-join">
+      <shift-to id="state-join"/>
+    </branch>
+  </state>
+  <state id="state-join">
+    <branch branch-selecting-map="map-consonant">
+      <move-to-marker position="@first"/>
+              :             :
+      <shift-to id="state-init"/>
+    </branch>
+    <catch-all-branch>
+      <shift-to id="state-init"/>
+    </catch-all-branch>
+  </state>
+</state-list>
+#endif
+
+このコードはある入力メソッドでの状態遷移を定義している。&lt;state&gt;
+は"state-init" と "state-join" の2つがある。"state-init" には3つの
+&lt;branche&gt;がある。"map-consonant", "map-misc" and "map-join" に属
+す入力シークエンスが与えられれば、対応する &lt;branche&gt;が選択され、
+その&lt;saction&gt;が実行される。"map-join" の&lt;branche&gt;が選ばれた
+場合には "state-join" への状態遷移が起こる。"state-join" には、
+"map-consonant" に属す入力シークエンス用の &lt;branche&gt;と、それ以外
+全ての入力用の&lt;catch-all-branch&gt; があり、双方とも"state-init" へ
+遷移させる。
 
-OPERAND ::= '+' | '-' | '*' | '/' | '|' | '&' | '!'
-            | '=' | '<' | '>' | '<=' | '>='
+@verbatim
+
+<define name="saction">
+  <choice>
+    <element name="shift-to"><attribute name="id"><data type="IDREF"/></attribute></element>
+    <element name="shift-back"><empty/></element>
+    <ref name="action"/>
+  </choice>
+</define>
 
 @endverbatim
 
-¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï @c SYMBOL1 ¤È @c SYMBOL2 ¤òÊÑ¿ô¤È¤·¤Æ¡¢@c SYMBOL1 ¤Î
-Ãͤò°Ê²¼¤Î¤è¤¦¤ËÀßÄꤹ¤ë¡£
+&lt;saction&gt; (state-action) は &lt;action&gt; であるか状態遷移である。
 
-@c CMD ¤¬ 'set' ¤Ê¤é¤Ð¡¢@c SYMBOL1 ¤ÎÃͤò @c EXPRESSION ¤ÎÃͤËÀßÄꤹ¤ë¡£
+&lt;shift-to&gt; エレメントは現在の状態を属性 "id" の値で指示されたもの
+に遷移させる。属性の値は&lt;state-list&gt; に現れるものでなくてはならな
+い。&lt;shift-back&gt; エレメントは、現在の状態を一つまえのものに遷移さ
+せる。
 
-@c CMD ¤¬ 'add' ¤Ê¤é¤Ð¡¢@c SYMBOL1 ¤ÎÃͤò @c EXPRESSION ¤ÎÃͤÀ¤±Áý¤ä¤¹¡£
+@subsection implist Plist
 
-@c CMD ¤¬ 'sub' ¤Ê¤é¤Ð¡¢@c SYMBOL1 ¤ÎÃͤò @c EXPRESSION ¤ÎÃͤÀ¤±¸º¤é¤¹¡£
+&lt;call&gt; エレメントで用いられる plistObject は以下のように定義されている。
 
-@c CMD ¤¬ 'mul' ¤Ê¤é¤Ð¡¢@c SYMBOL1 ¤ÎÃͤò @c EXPRESSION ¤ÎÃͤò³Ý¤±¤¿¤â
-¤Î¤Ë¤¹¤ë¡£
+@verbatim
 
-@c CMD ¤¬ 'div' ¤Ê¤é¤Ð¡¢@c SYMBOL1 ¤ÎÃͤò @c EXPRESSION ¤ÎÃͤdzä¤Ã¤¿¤â
-¤Î¤Ë¤¹¤ë¡£
+  <define name="plistObject">
+    <element name="pListObject">
+    <choice>
+      <ref name="array"/>
+      <ref name="dict"/>
+      <group>
+       <attribute name="type"><value>string</value></attribute>
+       <data type="string"/>
+      </group>
+      <group>
+       <attribute name="type"><value>symbol</value></attribute>
+       <ref name="variable-reference"/>
+      </group>
+      <group>
+       <attribute name="type"><value>integer</value></attribute>
+       <choice>
+         <data type="string"><param name="pattern">\?.</param></data>
+         <data type="string"><param name="pattern">[0#]x[0-9A-F]{1,6}</param></data>
+         <data type="nonNegativeInteger"><param name="pattern">[0-9]{1,7}</param></data>
+       </choice>
+      </group>
+    </choice>
+    </element>
+  </define>
+
+
+  <!-- Collections -->
+  <define name="array">
+    <element name="array">
+      <zeroOrMore>
+        <ref name="plistObject"/>
+      </zeroOrMore>
+    </element>
+  </define>
+
+  <define name="dict">
+    <element name="dict">
+      <zeroOrMore>
+       <element name="dict-item">
+         <attribute name="key"/>
+         <ref name="plistObject"/>
+       </element>
+      </zeroOrMore>
+    </element>
+  </define>
+@endverbatim
 
 @verbatim
-IF ::= '(' CONDITION ACTION-LIST1 ACTION-LIST2 ? ')'
+</grammar>
+@endverbatim
+
+入力メソッド定義用の RelaxNG スキーマは、&lt;/grammar&gt; で終わる。
 
-CONDITION ::= [ '=' | '<' | '>' | '<=' | '>=' ] EXPRESSION1 EXPRESSION2
+@ifnot FOR-MAN
 
-ACTION-LIST1 ::= '(' ACTION * ')'
+@section im-example1 EXAMPLE 1
 
-ACTION-LIST2 ::= '(' ACTION * ')'
+This is a very simple example for inputting Latin characters with
+diacritical marks (acute and cedilla).  For instance, when you type:
+@verbatim
+    Comme'die-Franc,aise, chic,,
+@endverbatim
+you will get this:
+@if FOR-HTML
+@verbatim
+    Commédie-Française, chic,
 @endverbatim
+@endif
+@if FOR-LATEX
+@latexonly
+\hskip5mm\texttt{\footnotesize Comm\'{e}die-Fran\c{c}aise, chic,}
+@endlatexonly
+@endif
+
+The definition of the input method is very simple as below, and it is
+quite straight forward to extend it to cover all Latin characters.
 
-¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢ @c CONDITION ¤¬¿¿¤Ç¤¢¤ì¤Ð @c ACTION-LIST1 ¤ò¼Â¹Ô¤·¡¢
-¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c ACTION-LIST2 ¤ò (¤â¤·¤¢¤ì¤Ð) ¼Â¹Ô¤¹¤ë¡£
+@verbatim
+<?xml version='1.0'?>
+<input-method xmlns="http://www.m17n.org/MIM">
+  <tags>
+    <language>t</language>
+    <name>latn-post</name>
+  </tags>
+  <title>latin-postfix</title>
+  <map-list>
+    <map id="map-trans">
+      <rule><keyseq keys="A'"/><insert string="Á"/></rule>
+      <rule><keyseq keys="a'"/><insert string="á"/></rule>
+      <rule><keyseq keys="A''"/><insert string="A'"/></rule>
+      <rule><keyseq keys="a''"/><insert string="a'"/></rule>
+      <rule><keyseq keys="C,"/><insert string="Ç"/></rule>
+      <rule><keyseq keys="c,"/><insert string="ç"/></rule>
+      <rule><keyseq keys="C,,"/><insert string="C,"/></rule>
+      <rule><keyseq keys="c,,"/><insert string="c,"/></rule>
+      <rule><keyseq keys="E'"/><insert string="É"/></rule>
+      <rule><keyseq keys="e'"/><insert string="é"/></rule>
+      <rule><keyseq keys="E''"/><insert string="E'"/></rule>
+      <rule><keyseq keys="e''"/><insert string="e'"/></rule>
+      <rule><keyseq keys="I'"/><insert string="Í"/></rule>
+      <rule><keyseq keys="i'"/><insert string="í"/></rule>
+      <rule><keyseq keys="I''"/><insert string="I'"/></rule>
+      <rule><keyseq keys="i''"/><insert string="i'"/></rule>
+      <rule><keyseq keys="O'"/><insert string="Ó"/></rule>
+      <rule><keyseq keys="o'"/><insert string="ó"/></rule>
+      <rule><keyseq keys="O''"/><insert string="O'"/></rule>
+      <rule><keyseq keys="o''"/><insert string="o'"/></rule>
+      <rule><keyseq keys="U'"/><insert string="Ú"/></rule>
+      <rule><keyseq keys="u'"/><insert string="ú"/></rule>
+      <rule><keyseq keys="U''"/><insert string="U'"/></rule>
+      <rule><keyseq keys="u''"/><insert string="u'"/></rule>
+    </map>
+  </map-list>
+  <state-list>
+    <state id="state-init">
+      <branch branch-selecting-map="map-trans"/>
+    </state>
+  </state-list>
+</input-method>
+@endverbatim
 
-@c SYMBOL1 ¤È @c SYMBOL2 ¤ÏÊÑ¿ô¤È¤·¤Æ°·¤ï¤ì¤ë¡£
 
+@section im-example2 EXAMPLE 2
+
+This example is for inputting Unicode characters by typing C-u
+(Control-u) followed by four hexadecimal digits.  For instance, when
+you type ("^u" means Control-u):
+@verbatim
+    ^u2190^u2191^u2192^u2193
+@endverbatim
+you will get this (Unicode arrow symbols):
+@if FOR-LATEX
 @verbatim
-COND ::= '(' 'cond' [ '(' EXPRESSION ACTION * ') ] * ')'
+    $\leftarrow \uparrow \rightarrow \downarrow
 @endverbatim
+@endif
+@if FOR-HTML
+@verbatim
+    ←↑→↓
+@endverbatim
+@endif
+
+The definition utilizes <set> and <conditional> as below:
+@verbatim
+<?xml version='1.0'?>
+<input-method xmlns="http://www.m17n.org/MIM">
+  <tags>
+    <language>t</language>
+    <name>unicode</name>
+  </tags>
+  <title>UNICODE</title>
+  <map-list>
+    <map id="map-starter">
+      <rule><keyseq><key-event>C-U</key-event></keyseq><insert string="U+"/></rule>
+    </map>
+    <map id="map-hex">
+      <rule><keyseq keys="0"/><insert string="0"/></rule>
+      <rule><keyseq keys="1"/><insert string="1"/></rule>
+                   :                            :
+      <rule><keyseq keys="9"/><insert string="9"/></rule>
+      <rule><keyseq keys="A"/><insert string="A"/></rule>
+      <rule><keyseq keys="B"/><insert string="B"/></rule>
+                   :                             :
+      <rule><keyseq keys="f"/><insert string="F"/></rule>
+    </map>
+  </map-list>
+  <state-list>
+    <state id="state-init">
+      <branch branch-selecting-map="map-starter">
+        <set id="code"><int-val>0</int-val></set>
+        <set id="count"><int-val>0</int-val></set>
+        <shift-to id="state-uni-hex"/>
+      </branch>
+    </state>
+    <state id="state-uni-hex">
+      <branch branch-selecting-map="map-hex">
+        <set id="this"><predefined-nth-previous-or-following-character position="-1"/></set>
+        <conditional>
+          <case>
+            <expr operator="<">
+              <predefined-nth-previous-or-following-character position="-1"/>
+              <int-val>65</int-val> <!-- ?A -->
+            </expr>
+            <sub id="this"><int-val>48</int-val></sub>
+          </case>
+          <case>
+            <int-val>1</int-val>
+            <sub id="this"><int-val>55</int-val></sub>
+          </case>
+        </conditional>
+        <set id="code">
+          <expr operator="+">
+            <expr operator="*">
+              <variable-reference id="code"/>
+               <int-val>16</int-val>
+            </expr>
+            <variable-reference id="this"/>
+          </expr>
+        </set>
+        <set id="count">
+          <expr operator="+">
+            <variable-reference id="count"/>
+            <int-val>1</int-val>
+          </expr>
+        </set>
+        <conditional>
+          <case>
+            <expr operator="=">
+              <variable-reference id="count"/>
+              <int-val>4</int-val>
+            </expr>
+            <delete-to-marker position="@first"/>
+            <insert character-or-string="variable">
+              <variable-reference id="code"/>
+            </insert>
+            <shift-to id="state-init"/>
+          </case>
+        </conditional>
+      </branch>
+    </state>
+  </state-list>
+</input-method>
+
+@endverbatim
+
+@section im-example3 EXAMPLE 3
+
+This example is for inputting Chinese characters by typing PinYin key
+sequence.
+@if FOR-HTML
+For instance, when you type:
+@verbatim
+    nihaobei2jing2
+@endverbatim
+you will get:
+@verbatim
+    你好北京
+@endverbatim
+
+The definition utilizes <candidate> and <select> as below.
+Note that this is just an example, and it ignores such important key
+as Backspace.
+
+@verbatim
+<input-method> <tags>..</tags>
+<title>"拼"</title>
+
+<map-list>
+  <map id="map-starter"> 
+<!-- The initial character of Pinyin.-->
+     <rule><keyseq keys="a"/></rule>
+     <rule><keyseq keys="b"/></rule>
+          :                 :
+     <rule><keyseq keys="z"/></rule>
+  </map>
+  <map id="map-pinyon">
+<!-- Big table of Pinyin vs the corresponding Chinese characters.-->
+     <rule><keyseq keys="bei"/>
+           <insert><candidates>被北备背悲辈杯倍贝碑... </candidates>...</insert></rule>      
+     <rule><keyseq keys="hao"/>
+           <insert><candidates>好号毫豪浩耗皓嚎昊郝... </candidates>...</insert></rule>      
+     <rule><keyseq keys="jing"/>
+           <insert><candidates>经京精境警竟静惊景敬... </candidates>...</insert></rule>      
+     <rule><keyseq keys="ni"/>
+           <insert><candidates>你呢尼泥逆倪匿拟腻妮... </candidates>...</insert></rule>
+  </map>
+  <map id="map-choose">
+<!-- Typing 1, 2, ..., 0 selects the 0th, 1st, ..., 9th candidate.-->
+      <rule><keyseq keys="1"/><select index="0"/></rule>
+      <rule><keyseq keys="2"/><select index="1"/></rule>
+           :                     :
+      <rule><keyseq keys="9"/><select index="8"/></rule>
+      <rule><keyseq keys="0"/><select index="9"/></rule>
+  </map>
+</map-list>
+
+<state-list>
+   <state id="state-init">
+<!--  When an initial character of Pinyin is typed, re-handle it in 
+     "state-main" state.  Anything else is just produced as is. -->
+     <branch branch-selecting-map="map-starter">
+        <show-candidates/>
+        <pushback-n-events n="1"/>
+        <shift-to id="state-main"/>
+     </branch>
+   </state>
+
+   <state id="state-main">
+<!--   When a complete Pinyin sequence is typed, shift to "state-select" state
+       to allow users to select one from the candidates.   -->
+      <branch branch-selecting-map="map-pinyin">
+        <shift-to id="state-select"/>
+      </branch>
+<!--   When anything else is typed, produce the current candidate (if
+       any), and re-handle the last input in "state-init" state. -->
+      <catch-all-branch>
+        <hide-candidates/>
+        <shift-to id="state-init"/>
+      </catch-all-branch>
+   </state>
+
+   <state id="state-select">
+<!-- When a number is typed, select the corresponding canidate,
+     produce it, and shift to "init" state. -->
+       <branch branch-selectiong-map="map-choose">
+        <hide-candidates/>
+        <shift-to id="state-init"/>
+       </branch>
+
+<!-- When anything else is typed, produce the current candidate,
+     and re-handle the last input in "init" state. -->
+      <catch-all-branch>
+        <hide-candidates/>
+        <shift-to id="state-init"/>
+      </catch-all-branch>
+   </state>
+ </state-list>
+</input-method>
+
+@endverbatim
+
+@elseif FOR-LATEX
+@latexonly
+\begin{center}
+\fbox{This example is readable only in the documentation of HTML version.}
+\end{center}
+@endlatexonly
+@endif
 
-¤³¤Î¥¢¥¯¥·¥ç¥ó¤ÏÂбþ¤¹¤ë @c EXPRESSION ¤¬ 0 ¤Ç¤Ê¤¤Ãͤò¤È¤ëºÇ½é¤Î¥¢¥¯¥·¥ç
-¥ó @c ACTION ¤ò¼Â¹Ô¤¹¤ë¡£
+@endif
 
 @section im-seealso SEE ALSO
 
@@ -579,5 +1778,5 @@ Boston, MA 02110-1301, USA.
 */
 
 /* Local Variables: */
-/* coding: euc-jp */
+/* coding: utf-8 */
 /* End: */
index 465f5db..85cd28d 100644 (file)
@@ -674,15 +674,15 @@ value may contain Latin-1 characters.
 
 The content of the element &lt;key-event&gt; must be the return value of the
 minput_event_to_key () function.  Under the X window system, you can
-quickly check the value using the xev command.  For example, the
+quickly check the value using the @c xev command.  For example, the
 return key, the backspace key, and the 0 key on the keypad are
-represented as Return, BackSpace, KP_0 respectively.  If the shift,
+represented as @c Return, @c BackSpace, @c KP_0 respectively.  If the shift,
 control, meta, alt, super, and hyper modifiers are used, they are
 represented by the S- , C- , M- , A- , s-, and H- prefixes
 respectively in this order.  Thus, "return with shift with meta with
-hyper" is S-M-H-Return.  Note that "a with shift" .. "z with shift"
+hyper" is @c S-M-H-Return.  Note that "a with shift" .. "z with shift"
 are represented simply as A .. Z .  Thus "a with shift with meta with
-hyper" is M-H-A.  
+hyper" is @c M-H-A.  
 
 The content of the element &lt;character-code&gt; must be a valid character code. 
 
@@ -759,7 +759,7 @@ This code calls command "command-start".
 
 @endverbatim
 
-The element &lt;action&gt;s appear in &lt;rule&gt;s.
+&lt;action&gt;s appear in &lt;rule&gt;s.
 
 The element &lt;show-candidates&gt; instructs the input method driver to
 display a candidate list associated with the string before the current
@@ -924,7 +924,7 @@ position and the character position.
 <delete-to-character-position>-3</delete-to-character-position>
 #endif
 
-This code deletes 3 characters before the current position in the buffer.
+This code deletes 3 characters before the current position.
 
 The element &lt;delete-n-characters&gt; treats the value of the attribute
 "n" as the number of characters to be deleted, and executes the
@@ -947,7 +947,7 @@ This code deletes one following character.
        <ref name="predefined-selector"/>
       </attribute>
       <attribute name="index">
-      <data type="integer"/>
+        <data type="integer"/>
       </attribute>
       <group>
        <attribute name="index"><value>variable</value></attribute>
@@ -988,17 +988,20 @@ These code selects the previous or the first candidate respectively.
 
 @endverbatim
 
-These two &lt;action&gt;s moves marker positions.  The element
-&lt;move-to-marker&gt; makes the marker position to be the new current
-position.  The element &lt;move-to-character-position&gt; treats its
-content integer value as a character position, and makes that position
-to be the new current position.
+These two &lt;action&gt;s move the current position.  The element
+&lt;move-to-marker&gt; moves the current position to the position of
+the specified marker.  The element &lt;move-to-character-position&gt;
+treats its content integer value as a character position, and moves
+the current position there.
 
 #if EXAMPLE_CODE
 <move-to-marker position="@previous"/>
 <move-to-character-position>0</move-to-character-position>
 #endif
 
+These codes moves the current position to the previous position and
+the first position in the buffer respectively.
+
 @verbatim
 
 <define name="mark">  
@@ -1124,14 +1127,14 @@ appear in the element &lt;module-list&gt;. The element
 &lt;function-reference&gt; specifies a function to be called.  It must
 appear in the element &lt;module-list&gt;.
 
-The function can be called with an argument of the type (#MPlist
-*).  The key of the first element of the list is #Mt and its value is 
-a pointer to an object of the type #MInputContext.  The key of the second
-element of the list is #Msymbol and its value is the current state name.  
-The element &lt;argument&gt; specifies the value of the third element or later.
-Their keys are determined automatically; if the value of the attribute "type"
-is "integer",  the corresponding key is #Minteger; if it is a symbol, the
-corresponding key is #Msymbol, etc. 
+The function can be called with an argument of the type (#MPlist *).
+The key of the first element of the list is #Mt and its value is a
+pointer to an object of the type #MInputContext.  The key of the
+second element of the list is #Msymbol and its value is the current
+state name.  The element &lt;argument&gt; specifies the value of the
+third element or later.  Their keys are determined by the "type"
+argument; if its value is "integer", the corresponding key is
+#Minteger; if it is "symbol", the corresponding key is #Msymbol, etc.
 
 #if EXAMPLE_CODE
 <call id="module-libmimx-anthy">
@@ -1258,7 +1261,7 @@ operators @c +, @c -, @c *, @c / does arithmetics.  @c |, @c &amp;, @c
 @endverbatim
 
 The element &lt;if&gt; performs actions in &lt;if-true-action-list&gt; if the
-relation between its two &lt;expr>essions meets the attribute
+relation between its two &lt;expr&gt;essions meets the attribute
 "condition".  If not, &lt;if&gt; performs actions in the element
 &lt;if-not-true-action-list&gt; (if it exists.)
 
@@ -1308,9 +1311,9 @@ and performs &lt;saction&gt;s in the first &lt;case&gt; whose &lt;expr&gt; has a
 </conditional>
 #endif
 
-This code performs the &lt;delete-n-characters n="-1"/&gt; and
-following actions unless the second previous character is Thai
-character RU (whose character code is 0x0E24).
+This code performs the actions in the second &lt;case&gt; unless the
+second previous character is Thai character RU (whose character code
+is 0x0E24).
 
 @subsection imstate Input Method States
 
@@ -1354,8 +1357,8 @@ The input method driver is always in one of the &lt;state&gt;s of an
 processing an input.  The same input sequence can trigger different
 &lt;saction&gt;s and produce different results in different
 &lt;state&gt;s.  When an input context is created, i.e. the input
-method is invoked, it is in the first &lt;state&gt; of the
-&lt;state-list&gt;.
+method is invoked, the input method driver is in the first
+&lt;state&gt; of the &lt;state-list&gt;.
 
 The attribute "id" gives the name of a &lt;state&gt;.  The element
 &lt;state-title-text&gt; specifies a title text displayed on the
@@ -1382,7 +1385,7 @@ will be executed.
 When an input sequence does not match with any of the &lt;branch&gt;s in the current &lt;state&gt;,
    @li If the &lt;catch-all-branch&gt; element exists,
       &lt;saction&gt;s in the &lt;catch-all-branch&gt; is executed.
-   @li If the &lt;catch-all-branch&gt; is omitted,
+   @li If &lt;catch-all-branch&gt; is omitted,
      the input method transits to the initial state.
 
 #if EXAMPLE_CODE
@@ -1415,7 +1418,7 @@ This code defines state transitions in an input method.  It has two
 states "state-init" and "state-join".  The state "state-init" has
 three branches.  When an input sequence belonging to "map-consonant",
 "map-misc" and "map-join" is given, the corresponding branch is
-selected and its &lt;saction&gt;s are executed.  When "map-join" is
+selected and its &lt;saction&gt;s are executed.  When the branch with "map-join" is
 selected, the state is shift to "state-join".  The state "state-join"
 has one branch for input sequences from "map-consonant" and one
 catch-all-branch for everything else, both shifting the state to