File: m17nDBFormat.html

package info (click to toggle)
m17n-docs 1.8.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 53,736 kB
  • sloc: javascript: 7,609; sh: 1,256; makefile: 351; ansic: 206
file content (875 lines) | stat: -rw-r--r-- 69,551 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>m17n ライブラリ: M17N データベースのデータ・フォーマット</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">m17n ライブラリ
   &#160;<span id="projectnumber">1.8.4</span>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- 構築: Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'検索','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','検索');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

</div><!-- top -->
<div class="PageDoc"><div class="header">
  <div class="headertitle">
<div class="title">M17N データベースのデータ・フォーマット </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>ここでは、M17N データベースで提供される各データのフォーマットを解説す る。</p>
<ul>
<li>
<a class="el" href="m17nDBFormat.html#mdbGeneral">General</a> &ndash; 一般的なフォーマット </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbCharsetList">CharsetList</a> &ndash; 文字セット定義のリスト </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbCodingList">CodingList</a> &ndash; コード系定義のリスト </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbDir">Dir</a> &ndash; データベースディレクトリ中のデータのリスト </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbFLT">FLT</a> &ndash; フォントレイアウトテーブル </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbFontEncoding">FontEncoding</a> &ndash; フォントエンコーディング </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbFontset">Fontset</a> &ndash; フォントセット </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbIM">IM</a> &ndash; インプットメソッド </li>
</ul>
<h1><a class="anchor" id="mdbGeneral"></a>
一般的なフォーマット</h1>
<h2><a class="anchor" id="general-description"></a>
説明</h2>
<p>関数 <a class="el" href="group__m17nDatabase.html#ga62e5cf92d1b2836a9f6a988bcc20c26e" title="データベースからデータをロードする.">mdatabase_load()</a> は、第一タグが <code>Mchartable</code> か <code>Mcharset</code> で ない限り、タグで指定されたデータをプロパティリストの形で返す。返される プロパティリストのキーは<code>Minteger</code>, <code>Msymbol</code>, <code>Mtext</code>, <code>Mplist</code> に限る。値の型はキーによって曖昧性なく 決定される。キーが <code>Minteger</code> ならば値は整数値であり、キーが <code>Msymbol</code> なら値はシンボル、<code>Mtext</code> ならば M-text、 <code>Mplist</code> ならばプロパティリストである。</p>
<p>プロパティリストを示すためにはさまざまな表現形式が可能である。たとえば <code>(K1:V1, K2:V2, ..., Kn:Vn)</code> という形で、最初のK1 と V1、二つ目 のキーと値がK2 と V2 といったプロパティリストを表現することもできる。 しかし、m17n データベースで用いられるプロパティリストのタイプはかなり 限定されているので、もっと単純な表現形式を用いることができる。</p>
<p>これ以降、プロパティリストの示すためには S 式に類似した表現を用いる。 (実際 m17n ライブラリのデフォルトのデータベースローダはこの表現で書か れたデータファイルを読むように設計されている。)</p>
<p>この表現形式は 1 ないしそれ以上の <em>要素 (element)</em> からなる。個々 の要素はプロパティすなわちプロパティリストの一つの要素を表す。</p>
<p>要素間は 1 ないしそれ以上の <em> 空白 (whitespace)</em> すなわちスペース (code 32)、タブ (code 9)、改行 (code 10) のいずれかで区切られる。セミ コロン(<code>;</code>) で始まる行はコメントである。</p>
<p>各プロパティのキーと値は、要素のタイプに基づいて以下のように決定される。</p>
<ul>
<li>
<p class="startli">整数</p>
<p class="interli">正規表現<code>-?[0-9]+</code> または<code>0[xX][0-9A-Fa-f]+</code> に合致する 要素は、キーが<code>Minteger</code>であるプロパティを示す。最初の正規表現 と合致するものは 10 進の整数、後の正規表現と合致するものは 16 進の整数 と解釈し、その解釈の結果がプロパティの値である。</p>
<p class="interli">たとえば、要素 <code>0xA0</code> は10 進で 160 を値とするプロパティである。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli">シンボル</p>
<p class="interli">正規表現<code>[^-0-9(]</code><code>([^\()]|\.)+</code> に合致する要素は、キーが<code> Msymbol</code>であるプロパティを示す。要素中の <code>\t</code>, <code>\n</code>, <code>\r</code>, <code>\e</code> はそれぞれ、タブ (code 9)、改 行 (code 10)、復帰(code 13)、エスケープ (code 27) に置き換えられる。バッ クスラッシュに続く他の文字はそれ自身と解釈される。プロパティの値は、結 果として得られる文字列を名前として持つシンボルである。</p>
<p class="interli">たとえば、要素 <code>abc\ def</code> は "abc def" を名前として持つシンボル を値とするプロパティである。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli">MTEXT</p>
<p class="interli">正規表現 <code>"([^"]|\")*"</code> に合致する要素は、キー <code>Mtext</code> であるプロパティを示す。上記のバックスラッシュによるエスケープはここで も有効である。さらに、要素中の正規表現 <code>\[xX][0-9A-Fa-f][0-9A-Fa-f]</code> に合致する部分は、16進で解釈した 結果に置き換えられる。</p>
<p class="interli">バックスラッシュエスケープを処理した上で、ダブルクオートにはさまれたバ イト列をUTF-8 列として解釈し、M-text にデコードする。この M-text がプ ロパティの値である。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli">PLIST</p>
<p class="interli">対応する括弧にはさまれた 0 個以上の要素は<code>Mplist</code> をキーとする プロパティを示す。括弧の前後の空白は取り除かれる。プロパティの値は、プ ロパティリストであり、その括弧内の各要素を再帰的に解釈した結果である。</p>
<p class="endli"></p>
</li>
</ul>
<h2><a class="anchor" id="general-syntax"></a>
文法の表記</h2>
<p>データのプロパティリストフォーマットの説明では、BNF風の記法が用いられ る。この記法では、非終端は大文字(間に'-'が入ってもよい) で、終端は " で囲って表される。特別な非終端 INTEGER, SYMBOL, MTEXT, PLIST はそれぞれ対応するプロパティを意味する。</p>
<h2><a class="anchor" id="general-example"></a>
例</h2>
<p>次の単純な形式のプロパティリストに読み込まれる、データベースのデータの 一例を示す:</p>
<pre class="fragment">DATA-FORMAT ::=
    [ INTEGER | SYMBOL | MTEXT | FUNC ] *

FUNC ::=
    '(' FUNC-NAME FUNC-ARG * ')'

FUNC-NAME ::=
    SYMBOL

FUNC-ARG ::=
    INTEGER | SYMBOL | MTEXT | '(' FUNC-ARG ')'
</pre><p>たとえば、次のテキストを含むデータファイルは上の文法に合致する:</p>
<pre class="fragment">abc 123 (pqr 0xff) "m\"text" (_\\_ ("string" xyz) -456)
</pre><p>そして次のようなプロパティリストとして読み込まれる:</p>
<pre class="fragment">第1要素: キー: Msymbol,  値: abc
第2要素: キー: Minteger, 値: 123
第3要素: キー: Mplist,   値: 次の要素からなるプロパティリスト
    第1要素: キー Msymbol,  値: pgr
    第2要素: キー Minteger, 値: 255
第4要素: キー: Mtext,    値: m"text
第5要素: キー: Mplist,   値: 次の要素からなるプロパティリスト
    第1要素: キー: Msymbol, 値: _\_
    第2要素: キー: Mplist,  値: 次の要素からなるプロパティリスト
        第1要素: キー: Mtext,    値: string
    第2要素: キー: Msymbol,  値: xyz
    第3要素: キー: Minteger, 値: -456
</pre><h1><a class="anchor" id="mdbCharsetList"></a>
文字セット定義のリスト</h1>
<h2><a class="anchor" id="cslist-description"></a>
説明</h2>
<p>m17n ライブラリは、m17nデータベースのタグ&lt;charset-list&gt;のついたデータ から、文字セット定義のリストをロードする。このデータは以下のフォーマッ トのプロパティリストとしてロードされる。</p>
<pre class="fragment">CHARSET-LIST ::= DEFINITION *

DEFINITION ::= '(' NAME ( KEY VALUE ) * ')'

NAME ::= SYMBOL

KEY ::= SYMBOL

VALUE ::= SYMBOL | INTEGER | MTEXT | PLIST
</pre><p><code>NAME</code> は定義する文字セットの名前である。</p>
<p><code>KEY</code> と <code>VALUE</code> のペアは、関数 <a class="el" href="group__m17nCharset.html#gaadbf43a8bb53d9056dd10a64e8424e30">mchar_define_charset()</a> に2番目の引 数 <b>plist</b> の各要素として与えられるプロパティである。</p>
<h2><a class="anchor" id="cslist-seealso"></a>
参照</h2>
<p><a class="el" href="m17nDBFormat.html#mdbGeneral">mdbGeneral(5)</a>, <a class="el" href="group__m17nCharset.html#gaadbf43a8bb53d9056dd10a64e8424e30">mchar_define_charset()</a></p>
<h1><a class="anchor" id="mdbCodingList"></a>
コード系定義のリスト</h1>
<h2><a class="anchor" id="coding-list-description"></a>
説明</h2>
<p>m17n ライブラリは、初期化の際 m17n データベースのタグ &lt;coding-list&gt; のついたデータからコード系定義のリストをロードする。このデータは以下の フォーマットのプロパティリストとしてロードされる。</p>
<pre class="fragment">CODING-LIST ::= DEFINITION *

DEFINITION ::= '(' NAME ( KEY VALUE ) * ')'
NAME ::= SYMBOL

KEY ::= SYMBOL

VALUE ::= SYMBOL | INTEGER | MTEXT | PLIST
</pre><p><code>NAME</code> は定義するコード系の名前である。</p>
<p><code>KEY</code> と <code>VALUE</code> のペアは、関数 mchar_define_coding() に2番目の引 数として与えられるプロパティである。</p>
<h2><a class="anchor" id="coding-list-seealso"></a>
参照</h2>
<p><a class="el" href="m17nDBFormat.html#mdbGeneral">mdbGeneral(5)</a>, <a class="el" href="group__m17nConv.html#gabbd4a423903d2c1e55030f59ea86c34c">mconv_define_coding()</a></p>
<h1><a class="anchor" id="mdbDir"></a>
データベースディレクトリ中のデータのリスト</h1>
<h2><a class="anchor" id="dir-description"></a>
説明</h2>
<p>m17n ライブラリは初期化の際、m17n データベース中のデータ定義のリストを 各データベースディレクトリ中の "mdb.dir" という名前を持つファイルからロー ドする。このファイルにおけるプロパティリストのフォーマットは以下である。</p>
<pre class="fragment">MDB-DIR ::= DEFINITION *

DEFINITION ::= '(' TAG0 [ TAG1 [ TAG2 [ TAG3 ] ] ] FILE [ VERSION ]')'

TAGn ::= SYMBOL

FILE ::= MTEXT

VERSION ::= MTEXT
</pre><p>TAG0 が &lsquo;charset&rsquo; でも &lsquo;char-table&rsquo; でもなく、TAGn (n &gt; 0) がシンボル &lsquo;*&rsquo; ならば、FILE にワイルドカードが含まれて良い。そしてシェルが用いる規 則によって FILE とマッチするすべてのファイルがデータベースファイルのター ゲットとなる。この際、各ファイルは実際の TAGn の値を与える SELF-DEFINITION を持たなくてはならない。SELF-DEFINITION は以下の形式の プロパティリストの要素である。</p>
<pre class="fragment">SELF-DEFINITION ::= '(' TAG0 TAG1 TAG2 TAG3 [ VERSION ] ')'
</pre><p>たとえば、データベースディレクトリが下のファイルを含むとしよう。</p>
<pre class="fragment">zh-py.mim:
(input-method zh py)
...

ko-han2.mim:
(input-method ko han2)
...
</pre><p>この時 "mdb.dir" 中の以下の行</p>
<pre class="fragment">(input-method zh py "zh-py.mim")
(input-method ko han2 "ko-han2.mim")
</pre><p>はこの一行に短縮できる。</p>
<pre class="fragment">(input-method * "*.mim")
</pre><p><code>VERSION</code> は 最低必要な m17n ライブラリのバージョン番号を示す。フォー マットは "XX.YY.ZZ" であり、XX はメジャーバージョン番号、YY はマイナー バージョン番号、ZZ はパッチレベルである。</p>
<h1><a class="anchor" id="mdbFLT"></a>
フォントレイアウトテーブル</h1>
<h2><a class="anchor" id="flt-description"></a>
説明</h2>
<p>単純なスクリプトの場合、表示エンジンは選択したフォントのエンコーディン グに応じて文字コードをグリフコードに一文字ずつ変換する。しかし、複雑な レイアウトを要求する文書、たとえばタイやインド系のスクリプトなどの場合、 1対1の変換では不十分である。複数の文字が一つのリガチャとして描かれたり、 2次元的にずらした位置に描かなくてはならないグリフがあったりする。</p>
<p>このような複雑なスクリプトを処理するため、m17n ライブラリはフォントレ イアウトテーブル (短縮して FLT と呼ぶことにする) を用いる。FLT ドライ バは FLT を解釈し、文字列を表示エンジンに渡すことのできるグリフ列に変 換する。</p>
<p>FLT は OpenType Layout Table に見られる情報 (CMAP, GSUB, and GPOS) に 加えて、文字列から書記素 (grapheme) クラスタを抽出したり、クラスタ内で 文字を並べ変えたりするための情報を持つことができる。</p>
<p>FLT は 1 つ以上の変換ステージが続いたものである。各ステージでコード列 は別のものに変換され、次のステージに読まれる。列の長さはステージ毎に異 なることがある。コード列の各要素は以下の整数値の属性を持つ。</p>
<ul>
<li>
<p class="startli">コード</p>
<p class="interli">変換の最初のステージでは、元の文字列の文字コード。最後のステージでは、 表示エンジンに渡されるグリフコード。それ以外では中間的なグリフコード。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli">カテゴリ</p>
<p class="interli">そのステージの <code>CATEGORY-TABLE</code> で定義されたか、以前のステージで定義さ れ上書きされていないカテゴリーコード。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli">結合規則</p>
<p class="interli">0 でなければ、この(中間)グリフを前のものとどう結合するかを指定する。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli">左パディングフラグ</p>
<p class="interli">0 でなければ、表示関数にこの(中間)グリフの前にスペースを挿入して、前 のグリフと重ならないようにするよう指示する。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli">右パディングフラグ</p>
<p class="interli">0 でなければ、表示関数にこの(中間)グリフの後にスペースを挿入して、後 のグリフと重ならないようにするよう指示する。</p>
<p class="endli"></p>
</li>
</ul>
<p>レイアウトエンジンがテキストを描く際には、まずテキストの各文字に対して それぞれフォントとFLT を決定する。同じフォントと FLT を用いる部分文字列 に関して、レイアウトエンジンは対応する中間的なグリフの列を生成する。中 間的なグリフコードの各要素は、コードの属性として対応する文字コード、他 の属性として 0 を持つ。この列はFLT の最初のステージで現行の <em>ラン</em> (部 分列) として処理される。</p>
<p>各ステージは以下のように働く。</p>
<p>まずこのステージに <code>CATEGORY-TABLE</code> があれば、現行のランのすべてのグ リフのカテゴリが更新される。カテゴリの無いグリフがあれば、ランはそのグ リフの前で終る。</p>
<p>次にこのステージのコードオフセット、結合規則、左パディングフラグが 0 に初期化される。</p>
<p>次いで、このステージの最初の変換規則が現行のランに適用される。</p>
<p>最後に現行のランは新しく作られた(中間)グリフ列に置き換えられる。</p>
<h2><a class="anchor" id="flt-syntax"></a>
文法と意味</h2>
<p>m17n ライブラリ は m17n データベースからタグ &lt;font, layouter, FLT-NAME&gt; を用いて FLT をロードする。FLT のデータのフォーマットは以下の通り:</p>
<pre class="fragment">FONT-LAYOUT-TABLE ::= FLT-DECLARATION ? STAGE0 STAGE *

FLT-DECLARATION ::= '(' 'font' 'layouter' NAME nil PROP * ')'
NAME ::= SYMBOL
PROP :: = VERSION | FONT
VERSION ::= '(' 'version' MTEXT ')'
FONT ::= '(' 'font' FONT-SPEC ')'
FONT-SPEC ::=
     '(' [[ FOUNDRY FAMILY
           [ WEIGHT [ STYLE [ STRETCH [ ADSTYLE ]]]]]
         REGISTRY ]
     [ OTF-SPEC ] [ LANG-SPEC ] ')'

STAGE0 ::= CATEGORY-TABLE GENERATOR

STAGE ::= CATEGORY-TABLE ? GENERATOR

CATEGORY-TABLE ::= '(' 'category' CATEGORY-SPEC + ')'

CATEGORY-SPEC ::= '(' CODE CATEGORY ')'
                  | '(' CODE CODE CATEGORY ')'

CODE ::= INTEGER

CATEGORY ::= INTEGER
</pre><p><code>CATEGORY-SPEC</code> の定義中で、 <code>CODE</code> はグリフコード <code>CATEGORY</code> は大 文字あるいは小文字の ASCII code、すなわち 'A', ... 'Z', 'a', .. 'z' の いずれかである。</p>
<p><code>CATEGORY-SPEC</code> の最初の形式は、<code>CATEGORY</code> をコード <code>CODE</code> を持つグ リフに割り当て、二つ目の形式は <code>CATEGORY</code> を二つの <code>CODE</code> の間のコー ドを持つグリフに割り当てる。</p>
<pre class="fragment">GENERATOR ::= '(' 'generator' RULE MACRO-DEF * ')'

RULE ::= REGEXP-BLOCK | MATCH-BLOCK | SUBST-BLOCK | COND-BLOCK
         FONT-FACILITY-BLOCK | DIRECT-CODE | COMBINING-SPEC | OTF-SPEC
         | PREDEFINED-RULE | MACRO-NAME

MACOR-DEF ::= '(' MACRO-NAME RULE + ')'
</pre><p>各 <code>RULE</code> は、消費するグリフと生成するグリフを指定する。「消費された」 グリフは現行のランから取り除かれる。ルールは状況によっては失敗する。明 示的に失敗と書かれている場合をのぞき、成功とみなす。</p>
<pre class="fragment">DIRECT-CODE ::= INTEGER
</pre><p>このルールはグリフを消費せず、以下の属性を持つグリフを生成する。</p>
<ul>
<li>
コード : <code>INTEGER</code> にデフォルトのコードオフセットを足したもの </li>
<li>
結合規則 : デフォルト値 </li>
<li>
左パデイングフラグ : デフォルト値 </li>
<li>
右パデイングフラグ : 0 </li>
</ul>
<p>グリフ生成後、デフォルトのコードオフセット、結合規則, 左パディングフラ グ はすべて 0 にリセットされる。</p>
<pre class="fragment">PREDEFINED-RULE ::= '=' | '*' | '&lt;' | '&gt;' | '|' | '[' | ']'
</pre><p>これらは以下のように働く。</p>
<ul>
<li>
<p class="startli"><code>=</code> </p>
<p class="interli">現行のランの最初のグリフを消費し、同じグリフを生成する。現行のランが空 ならば失敗する。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>*</code> </p>
<p class="interli">前のルールを繰り返し実行する。前のルールが失敗すれば、何もせず失敗する。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>&lt;</code> </p>
<p class="interli">書記素クラスタの始めを示す。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>&gt;</code> </p>
<p class="interli">書記素クラスタの終りを示す。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>@</code>[</p>
<p class="interli">この規則はデフォルトの左パディングフラグを 1 にする。グリフの消費や生 成はしない。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>@</code>]</p>
<p class="interli">この規則は最近生成されたグリフの右パディングフラグを 1 にする。グリフ の消費や生成はしない。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code></code>|</p>
<p class="interli">グリフを消費せず、カテゴリが ' ' で他の属性が 0 である特別なグリフを生 成する。この規則だけがこの特別なグリフを生成する。</p>
<p class="endli"></p>
</li>
</ul>
<pre class="fragment">REGEXP-BLOCK ::= '(' REGEXP RULE * ')'

REGEXP ::= MTEXT
</pre><p><code>MTEXT</code> は現行のランのカテゴリ列に合致すべき正規表現である。合致すれ ば、この規則は一時的に現行のランを合致した部分だけに限定した上で、<code>RULE</code> を実行する。合致した部分はこの規則によって消費される。</p>
<p>括弧のついた部分表現があれば、<code>RULE</code> の中に出現するかもしれない <code>MATCH-BLOCK</code> によって使用するために記録される。</p>
<p>合致する部分が無ければ、この規則は失敗する。</p>
<pre class="fragment">MATCH-BLOCK ::= '(' MATCH-INDEX RULE * ')'

MATCH-INDEX ::= INTEGER
</pre><p><code>MATCH-INDEX</code> は直前の <code>REGEXP-BLOCK</code> によって記録された部分表現を指 定する整数である。このような部分表現があれば、この規則は一時的に現行の ランを合致した部分表現だけに限定した上で、<code>RULE</code> を実行する。合致した 部分はこの規則によって消費される。</p>
<p>合致する部分が無ければ、この規則は失敗する。</p>
<p>この規則がステージの最初の規則である場合は、<code>MATCH-INDEX</code> は 0 でなく てはならない。この場合ラン全体に合致することになる。</p>
<pre class="fragment">SUBST-BLOCK ::= '(' SOURCE-PATTERN RULE * ')'

SOURCE-PATTERN ::= '(' CODE + ')'
                   | (' 'range' CODE CODE ')'
</pre><p>現行のランのコード列が <code>SOURCE-PATTERN</code> と合致すれば、この規則は一時 的に現行のランを合致した部分だけに限定した上で、<code>RULE</code> を実行する。 合致した部分は消費される。</p>
<p><code>SOURCE-PATTERN</code> の最初の形式は、合致するグリフコードの列を指定する。 この場合、この規則はデフォルトのコードオフセットを 0 にリセットする。</p>
<p>二つめの形式は、コード列の最初のグリフコードの範囲を指定する。この場合、 この規則はデフォルトのコードオフセットを最初のグリフコードから範囲を指 定する初めの <code>CODE</code> を引いたものに設定する。</p>
<p>合致する部分が無ければ、この規則は失敗する。</p>
<pre class="fragment">FONT-FACILITY-BLOCK ::= '(' FONT-FACILITY RULE * ')'
FONT-FACILITY = '(' 'font-facility' CODE * ')'
            | '(' 'font-facility' FONT-SPEC ')'
</pre><p>現在のフォントが <code>CODE</code> のグリフを持っているか、<code>FONT-SPEC</code> と合致す れば、この規則は成功し、<code>RULE</code> を実行する。そうでなければ、この規則は 失敗する。</p>
<pre class="fragment">COND-BLOCK ::= '(' 'cond' RULE + ')'
</pre><p>この規則は <code>RULE</code> を順に、どれかが成功するまで実行する。どのルールも 成功しなければ、この規則は失敗する。そうでなければ成功である。</p>
<p><a class="anchor" id="OTF-SPEC"></a></p><pre class="fragment">OTF-SPEC ::= SYMBOL
</pre><p><code>OTF-SPEC</code> は、OTF ドライバへの指示を指定する名前を持つシンボルである。 名前は以下の文法に従う。</p>
<pre class="fragment">  OTF-SPEC-NAME ::= ':otf=' SCRIPT LANGSYS ? GSUB-FEATURES ? GPOS-FEATURES ?

  SCRIPT ::= SYMBOL

  LANGSYS ::= '/' SYMBOL

  GSUB-FEATURES ::= '=' FEATURE-LIST ?

  GPOS-FEATURES ::= '+' FEATURE-LIST ?

  FEATURE-LIST ::= ( SYMBOL ',' ) * [ SYMBOL | '*' ]</pre><p>各 <code>SYMBOL</code> は OpenType specification 中でのタグ名を指定する。</p>
<p><code>SCRIPT</code> については、<code>SYMBOL</code> はスクリプトタグ名を表す。(Devanagari は deva など。)</p>
<p><code>LANGSYS</code> の場合は、<code>SYMBOL</code> は言語システムタグ名を指定する。<code>LANGSYS</code> が省略されれば、デフォルトの言語システムテーブルが使用される。</p>
<p><code>GSUB-FEATURES</code> では、 <code>FEATURE</code> LIST 中の各 <code>SYMBOL</code> は 適用する GSUB feature タグ名を指定する。'*' は残りすべての feature を指定するた めに最後の要素として用いることができる。 <code>SYMBOL</code> の前に'~' がついて おり、最後の要素が '*' ならば、<code>SYMBOL</code> は適用するfeature から除かれ る。<code>SYMBOL</code> が指定されていなければ、GSUB feature は適用されない。<code>GSUB-FEATURES</code> 自体が省略されればすべての GSUB feature が適用される。</p>
<p><code>GPOS-FEATURES</code> の指定は <code>GSUB-FEATURES</code> の場合と同様である。</p>
<p>全てのタグ名は ASCII の表示可能文字4つからなること。</p>
<p>OpenType の指定方法については次のページを参照のこと。<br  />
 <a href="http://www.microsoft.com/typography/otspec/default.htm">http://www.microsoft.com/typography/otspec/default.htm</a></p>
<pre class="fragment">COMBINING ::= SYMBOL
</pre><p><code>COMBINING</code> は、 次のグリフを前のものとどう結合するかの指示を名前とし て持つシンボルである。このルールはデフォルトの結合規則をシンボル名固有 の整数コードにセットする。名前は以下の文法に従う。</p>
<pre class="fragment">  COMBINING-NAME ::= VPOS HPOS OFFSET VPOS HPOS

  VPOS ::= 't' | 'c' | 'b' | 'B'

  HPOS ::= 'l' | 'c' | 'r'

  OFFSET :: = '.' | XOFF | YOFF XOFF ?

  XOFF ::= ('&lt;' | '&gt;') INTEGER ?

  YOFF ::= ('+' | '-') INTEGER ?
</pre><p><code>VPOS</code> と <code>HPOS</code> は次のように垂直、水平位置を指定する。</p>
<pre class="fragment">                                POINT VPOS HPOS
                                ----- ---- ----
    0----1----2 &lt;---- top       0     t    l
    |         |                 1     t    c
    |         |                 2     t    r
    |         |                 3     B    l
    9   10   11 &lt;---- center    4     B    c
    |         |                 5     B    r
  --3----4----5-- &lt;-- baseline  6     b    l
    |         |                 7     b    c
    6----7----8 &lt;---- bottom    8     b    r
                                9     c    l
    |    |    |                10     c    c
  left center right            11     c    r
</pre><p>左の図はあるグリフの 12 の参照点を 0 から 11 までの数字で示している。 四角形 0-6-8-2 はグリフの表示領域であり、位置3, 4, 5 はベースライン上 にある。 9 と 11 はそれぞれ線0-6 と 2-8 の中心である。1, 10, 4, 7 はそ れぞれ線1-2, 3-5, 9-11, 6-8 の中心である。</p>
<p>右の表は、各参照点が<code>VPOS</code> と <code>HPOS</code> の組合せによってどのように指定 されるかを示している。</p>
<p><code>COMBINING-NAME</code> の定義中の最初の <code>VPOS</code> と <code>HPOS</code> は、前のグリフの 参照点を、二つ目の <code>VPOS</code> と <code>HPOS</code> は次のグリフの参照点を指定する。 次のグリフはこの二個の参照点が重なるように描かれる。</p>
<p><code>OFFSET</code> は重なりか他の詳細を指定する。'.' であれば、参照点二つは同じ 位置にある。</p>
<p><code>XOFF</code> は、次のグリフの参照点の X 座標を、前の参照点からどれほど右 ('&lt;') あるいは左 ('&gt;') へずらすか指定する。</p>
<p><code>YOFF</code> は、次のグリフの参照点の Y 座標を、前の参照点からどれほど上 ('+') あるいは下 ('-') へずらすか指定する。</p>
<p>どちらの場合にも、<code>INTEGER</code> はフォントサイズの何%ずらすかを示す値で ある。すなわち、もし <code>INTEGER</code> が 10 ならばフォントサイズの10% (1/10) ずらすことになる。 <code>INTEGER</code> が省略された場合には、5 が指定されたもの とする。</p>
<p>次のグリフが前のグリフに結合されると、それらは一つの結合グリフとして扱 われる。</p>
<pre class="fragment">MACRO-NAME ::= SYMBOL
</pre><p><code>MACRO-NAME</code> は <code>MACRO-DEF</code> のいずれかに現われるシンボルであり、対応 する<code>RULE</code> の列に展開される。</p>
<h2><a class="anchor" id="flt-context-dependent"></a>
文脈に依存する振舞</h2>
<p>ここまでは、特定のフォントで描かれる各文字/グリフ列が文脈自由であるこ と、すなわち前後のグリフに影響されないことを前提としてきた。これは、列 S1 がフォントF1 によって描かれ、先行する列 S0 が常にフォント F0 を要求 する場合には正しい。</p>
<pre class="fragment">  列                            S0      S1
  現行のフォント                F0      F1
  利用可能なフォント            F0      F1
</pre><p>しかし時には、列を明確に区切ることができない場合もある。先行する列 S0 が F0 だけでなく F1 でも描けるとしよう。</p>
<pre class="fragment">  列                            S0      S1
  現行のフォント                F0      F1
  利用可能なフォント            F0,F1   F1
</pre><p>この場合、先行する S0 を描くために使われたグリフが S1 のグリフの生成に 影響を与えることもある。そこで S1 の処理の際にすでに処理の終った S0 に 関する情報にアクセスする必要がある。最初のステージ(このステージのみ) の生成規則は、処理済みの部分へアクセスする特別な正規表現を許している。</p>
<pre class="fragment">  "RE0 RE1"
</pre><p><code>RE0</code> と <code>RE1</code> は先行の列 S0 と後続の列 S1 にそれぞれ対応する正規表 現である。</p>
<p>二つの正規表現の間のスペースに注意。これは特別なカテゴリ ' ' を示して いる (上記参照) 。この正規表現はフォント F1 を使用するグリフ生成規則に 属しており、したがって RE1 だけでなくRE0 も F1 用のカテゴリを用いて表 現されなければならない。つまり、先行する列S0 が F1 用のカテゴリで表せ ない場合には(上の最初の例のように) このパターンを持つ生成規則には合致 しない。</p>
<h2><a class="anchor" id="flt-seealso"></a>
参照</h2>
<p><a class="el" href="m17nDBFormat.html#mdbGeneral">mdbGeneral(5)</a>, <a class="el" href="m17nDBData.html#flt-list">FLTs provided by the m17n database</a></p>
<h1><a class="anchor" id="mdbFontEncoding"></a>
フォントエンコーディング</h1>
<h2><a class="anchor" id="font-encoding-description"></a>
説明</h2>
<p>m17n ライブラリは、m17n データベースから &lt;font, encoding&gt; タグによっ て個々のフォントのエンコーディングに関する情報をロードする。このデータ は以下のフォーマットのプロパティリストとしてロードされる。</p>
<pre class="fragment">FONT-ENCODING ::= PER-FONT *

PER-FONT ::= '(' FONT-SPEC ENCODING [ REPERTORY ] ')'

FONT-SPEC ::=
    '(' [ FOUNDRY FAMILY
          [ WEIGHT [ STYLE [ STRETCH [ ADSTYLE ]]]]]
    REGISTRY ')'

ENCODING ::= SYMBOL
</pre><p><code>FONT-SPEC</code> はフォントのプロパティを指定する。<code>FOUNDRY</code> から <code>REGISTRY</code> はフォントの <a class="el" href="group__m17nFont.html#gaaf47ff596e3d9768b214a039014b6ea5" title="開発元を指定するフォントプロパティのキー.">Mfoundry</a> から <a class="el" href="group__m17nFont.html#gab8c5e8d3685a530e2ae45f3b8a21ae76" title="レジストリを指定するフォントプロパティのキー.">Mregistry</a> プロパティに対応するシ ンボルである。各プロパティの意味については <a class="el" href="group__m17nFont.html">フォント</a> 参照。</p>
<p>たとえばこの <code>FONT-SPEC</code>:</p>
<pre class="fragment">    (nil alice0\ lao iso8859-1)
</pre><p>はフォントのファミリ名が "alice0 lao" でレジストリが "iso8859-1" であ るすべてのフォントに適用できる。</p>
<p><code>ENCODING</code> は文字セットを示すシンボルである。<code>FONT-SPEC</code> に合致する フォントは、その文字セットの全文字をサポートし、その文字セットによって 文字コードはそのフォントの対応するグリフコードにマップされる。</p>
<p><code>REPERTORY</code> は文字セットを示すシンボルか "nil" である。省略した場合は、 <code>ENCODING</code> を <code>REPERTORY</code> に指定したのと同じ意味になる。"nil" でなけ れば、文字セットはフォントのレパートリ、すなわちサポートする文字を示す。 そうでなければ、特定の文字がそのフォントでサポートされているかどうかは 個々のフォントドライバに問い合わせる。</p>
<p>いわゆるユニコードフォント (レジストリは "iso10646-1") については、普 通ユニコード文字の一部しかサポートしていないため、<code>REPERTORY</code> を "nil" にすることが望ましい。</p>
<h1><a class="anchor" id="mdbFontSize"></a>
Font Size</h1>
<h2><a class="anchor" id="font-size-description"></a>
DESCRIPTION</h2>
<p>In some case, a font contains incorrect information about its size (typically in the case of a hacked TrueType font), which results in a bad text layout when such a font is used in combination with the other fonts. To overcome this problem, the m17n library loads information about font-size adjustment from the m17n database by the tags &lt;font, resize&gt;. The data is loaded as a plist of this format.</p>
<pre class="fragment">FONT-SIZE-ADJUSTMENT ::= PER-FONT *

PER-FONT ::= '(' FONT-SPEC ADJUST-RATIO ')'

FONT-SPEC ::=
    '(' [ FOUNDRY FAMILY
          [ WEIGHT [ STYLE [ STRETCH [ ADSTYLE ]]]]]
    REGISTRY ')'

ADJUST-RATIO ::= INTEGER
</pre><p><code>FONT-SPEC</code> is to specify properties of a font. <code>FOUNDRY</code> to <code>REGISTRY</code> are symbols corresponding to <a class="el" href="group__m17nFont.html#gaaf47ff596e3d9768b214a039014b6ea5" title="開発元を指定するフォントプロパティのキー.">Mfoundry</a> to <a class="el" href="group__m17nFont.html#gab8c5e8d3685a530e2ae45f3b8a21ae76" title="レジストリを指定するフォントプロパティのキー.">Mregistry</a> property of a font. See <a class="el" href="group__m17nFont.html">フォント</a> for the meaning of each property.</p>
<p><code>ADJUST-RATIO</code> is an integer number specifying by percentage how much the font-size must be adjusted. For instance, this <code>PER-FONT</code>:</p>
<pre class="fragment">    ((devanagari-cdac) 150)
</pre><p>instructs the font handler of the m17n library to open a font of 1.5 times bigger than a requested size on opening a font whose registry is "devanagari-cdac".</p>
<h1><a class="anchor" id="mdbFontset"></a>
フォントセット</h1>
<h2><a class="anchor" id="fontset-description"></a>
説明</h2>
<p>m17n ライブラリは、m17n データベースから &lt;fontset, FONTSET-NAME&gt; タ グによってフォントセットの定義をロードする。このデータは以下のフォーマッ トのプロパティリストとしてロードされる。</p>
<pre class="fragment">FONTSET ::= PER-SCRIPT * PER-CHARSET * FALLBACK *

PER-SCRIPT ::= '(' SCRIPT PER-LANGUAGE + ')'

PER-LANGUAGE ::= '(' LANGUAGE FONT-SPEC-ELEMENT + ')'

PER-CHARSET ::= '(' CHARSET FONT-SPEC-ELEMENT + ')'

FALLBACK ::= FONT-SPEC-ELEMENT

FONT-SPEC-ELEMENT ::= '(' FONT-SPEC [ FLT-NAME ] ')'

FONT-SPEC ::=
     '(' [ FOUNDRY FAMILY
           [ WEIGHT [ STYLE [ STRETCH [ ADSTYLE ]]]]]
         REGISTRY ')'
</pre><p><code>SCRIPT</code> はスクリプト名 (e.g. latin, han) を示すシンボルか <code>nilであ</code> る。<code>LANGUAGE</code> はISO 639 に定義された言語名コード (e.g. ja, zh) であ る2文字のシンボルか <code>nil</code> である。</p>
<p><code>FONT-SPEC</code> はフォントのプロパティを指定する。<code>FOUNDRY</code> から <code>REGISTRY</code> はフォントの <a class="el" href="group__m17nFont.html#gaaf47ff596e3d9768b214a039014b6ea5" title="開発元を指定するフォントプロパティのキー.">Mfoundry</a> から <a class="el" href="group__m17nFont.html#gab8c5e8d3685a530e2ae45f3b8a21ae76" title="レジストリを指定するフォントプロパティのキー.">Mregistry</a> プロパティに対応するシ ンボルである。各プロパティの意味については <a class="el" href="group__m17nFont.html">フォント</a> 参照。</p>
<p><code>FLT-NAME</code> はフォントレイアウトテーブルの名前である。(<a class="el" href="m17nDBFormat.html#mdbFLT">フォントレイアウトテーブル</a>).</p>
<h2><a class="anchor" id="fontset-example"></a>
例</h2>
<p>これは <code>PER_SCRIPT</code> の例である。</p>
<pre class="fragment">(han
  (ja
    ((jisx0208.1983-0)))
  (zh
    ((gb2312.1980-0)))
  (nil
    ((big5-0))))
</pre><p>これによってフォントセレクタは、"han" 文字 (つまり::Mscript プロパティ が 'han' である文字)のうち、文字の M-text 中での <a class="el" href="group__m17nMtext.html#ga32374f3750874ea0142af8dac831ab25">Mlanguage</a> テキストプ ロパティが "ja" でありその文字がフォントのレパートリーに含まれていれも のについては、レジストリが"jisx0208.1983-0" であるフォントを使うことを 指示される。そうでなければ、レジストリが "gb2312.1980-0" や"big5-0" で あるものが試される。"han" 文字に <a class="el" href="group__m17nMtext.html#ga32374f3750874ea0142af8dac831ab25">Mlanguage</a> テキストプロパティが無けれ ば、3つとも試される。</p>
<p>フォント選択の詳細については関数 <a class="el" href="group__m17nDraw.html#ga02f9efd2c5d1bdd9d7a6ab18475bbd08" title="ウィンドウに M-text を描画する.">mdraw_text()</a> 参照。</p>
<h1><a class="anchor" id="mdbIM"></a>
インプットメソッド</h1>
<h2><a class="anchor" id="im-description"></a>
説明</h2>
<p>m17n ライブラリは、m17n データベースから動的にロードできる入力メソッド ドライバを提供している。(<a class="el" href="group__m17nInputMethod.html">入力メソッド (基本部分)</a> 参照。).</p>
<p>ここでは入力メソッド定義のデータフォーマットを説明する。</p>
<h2><a class="anchor" id="im-format"></a>
文法と意味</h2>
<p>以下のデータフォーマットによって入力メソッドが定義される。ドライバはファ イルやストリームから定義をロードし、プロパティリストの形式に変換する。</p>
<pre class="fragment">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 ')'

VARIABLE-DECLARATION ::=
    '(' VAR-NAME [ MTEXT-OR-GETTEXT | nil ] VALUE VALUE-CANDIDATE * ')'

COMMAND-DECLARATION ::=
    '(' CMD-NAME [ MTEXT-OR-GETTEXT | nil ] KEYSEQ * ')'

MTEXT-OR-GETTEXT ::=
    [ MTEXT | '(' '_' MTEXT ')']

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
</pre><p><code>IM-DECLARATION</code> はこの入力メソッドの言語と名前を指定する。</p>
<p><code>LANGUAGE</code> が <code>t</code> の場合、この入力メソッドは複数の言語で利用される。</p>
<p><code>NAME</code> が <code>nil</code> の場合、この入力メソッドは単独で用いられるものではな く、他の入力メソッドから利用することを想定している。この場合、入力メ ソッドを特定するために <code>EXTRA-ID</code> が必要である。</p>
<p><code>VERSION</code> はこの入力メソッドが必要とする m17n ライブラリの最小バージョ ンを指定する。フォーマットは "XX.YY.ZZ" であり、XX はメジャーバージョ ン、 YY はマイナーバージョン、ZZ はパッチレベルを表す。</p>
<p><code>DESCRIPTION</code> はこの入力メソッドの説明を <code>MTEXT-OR-GETTEXT</code> で指定す る。もしこれが2番目の形式を取っていれば、 <code>MTEXT</code> は現在のロケールに 従って "gettext" によって翻訳される(翻訳文が提供されている場合)。</p>
<p><code>TITLE-TEXT</code> はこの入力メソッドが有効な時、スクリーン上に表示されるテ キストである。</p>
<p>"global.mim" という特別なファイルがあり、共通する変数やコマンドが定義さ れている。入力メソッドドライバは毎回このファイルをロードし、他の入力メ ソッドはここで定義された変数やコマンドを継承できる。</p>
<p><code>VARIABLE-DECLARATION</code> はこの入力メソッドで使用される変数を宣言する。 変数をデフォルト値に初期化したり、ユーザがカスタマイズしたりする場合に は、ここで宣言されなくてはならない。この宣言は二通りに利用される。一つ めは新しい変数を導入するためであり、この場合 <code>VALUE</code> は省略できない。 もう一つは "global.mim" で宣言された変数を継承し、違ったデフォルト値を 指定したり、この入力メソッド用にカスタマイズ可能にしたりするためである。 この場合には <code>VALUE</code> は省略できる。</p>
<p><code>COMMAND-DECLARATION</code> はこの入力メソッドで使用されるコマンドを宣言する。 コマンドをデフォルトキーシーケンスに割り当てたり、ユーザがカスタマイズ したりする場合には、ここで宣言されなくてはならない。<code>VARIABLE-DECLARATION</code> 同様、この宣言は二通りに利用される。一つめは新しい コマンドを導入するためであり、この場合 <code>KEYSEQ</code> は省略できない。もう一 つは "global.mim" で宣言されたコマンドを継承し、違ったキーバインディン グを指定したり、この入力メソッド用にカスタマイズ可能にしたりするためで ある。この場合には <code>KEYSEQ</code> は省略できる。</p>
<pre class="fragment">MODULE-LIST ::= '(' 'module' MODULE * ')'

MODULE ::= '(' MODULE-NAME FUNCTION * ')'

MODULE-NAME ::= SYMBOL

FUNCTION ::= SYMBOL
</pre><p>各 <code>MODULE</code> は外部モジュール (動的ライブラリ) の名前とそのモジュールが 公開している関数名を宣言する。<code>FUNCTION</code> が "init" という名前であれば、 この入力メソッド用の入力コンテクストが生成される際に、デフォルトの引数 (<code>CALL</code> の節参照) のみとともに呼ばれる。 <code>FUNCTION</code> が "fini" という 名前を持てば, 入力コンテクストが破壊される際に、デフォルトの引数のみと ともに呼ばれる。</p>
<pre class="fragment">MACRO-LIST ::=  MACRO-INCLUSION ? '(' 'macro' MACRO * ')' MACRO-INCLUSION ?

MACRO ::= '(' MACRO-NAME MACRO-ACTION * ')'

MACRO-NAME ::= SYMBOL

MACRO-ACTION ::= ACTION

TAGS ::= `(` LANGUAGE NAME EXTRA-ID ? `)`

MACRO-INCLUSION ::= '(' 'include' TAGS 'macro' MACRO-NAME ? ')'</pre><p><code>MACRO-INCLUSION</code> は、<code>TAGS</code> で指定される他の入力メソッドからマクロを 読み込む。<code>MACRO-NAME</code> が与えられていなければ、全てのマクロを読む。</p>
<pre class="fragment">MAP-LIST ::= MAP-INCLUSION ? '(' 'map' MAP * ')' MAP-INCLUSION ?

MAP ::= '(' MAP-NAME RULE * ')'

MAP-NAME ::= SYMBOL

RULE ::= '(' KEYSEQ MAP-ACTION * ')'

KEYSEQ ::= MTEXT | '(' [ SYMBOL | INTEGER ] * ')'

MAP-INCLUSION ::= '(' 'include' TAGS 'map' MAP-NAME ? ')'</pre><p>入力メソッドがそれ単体で利用されることがなく常に他の入力メソッドに読 み込まれて用いられる場合には、<code>MAP-LIST</code> は省略できる。</p>
<p><code>MAP-NAME</code> 定義中の <code>SYMBOL</code> は、 <code>t</code> あるいは <code>nil</code> であってはな らない。</p>
<p><code>KEYSEQ</code> 定義中の <code>MTEXT</code> は、キーボードから生成できる文字で構成され る。すなわち <code>MTEXT</code> は通常 ASCII 文字のみを含む。しかし、入力メソッド がたとえば西ヨーロッパ用キーボードを使うことを想定したものであれば、<code>MTEXT</code> は Latin-1 文字を含んでもよい。</p>
<p><code>KEYSEQ</code> 定義中の <code>SYMBOL</code> は、関数 <a class="el" href="group__m17nInputMethodWin.html#ga58715c630a04fd33f12394e9c93f1bad" title="イベントを入力キーに変換する.">minput_event_to_key()</a> の戻り値で なくてはならない。X ウィンドウシステムの元では、 <code>xev</code> コマンドを用い て値を簡単にチェックできる。たとえば、 リターンキー、バックスペースキー、 キーパッドの0のキーなどは、それぞれ<code></code>(Return) , <code></code>(BackSpace) , <code></code>(KP_0) としてあらわされる。シフト、コントロール、メタ、アルト、スーパー、 ハイパーも押されている場合には、それぞれS- , C- , M- , A- , s- , H- が 前にこの順に置かれる。したがって "リターンキーをシフトしてメタしてハイ
パーしたもの" は<code></code>(S-M-H-Return) である。"a をシフト" から "z をシフト
" までは、単に A から Z として表されることに注意。したがって、 "a をシ
フトしてメタしてハイパーしたもの" は <code></code>(M-H-A) となる。</p>
<p><code>KEYSEQ</code> 定義中の <code>INTEGER</code> は、有効な文字コードでなくてはならない。</p>
<p><code>MAP-INCLUSION</code> は、<code>TAGS</code> で指定される他の入力メソッドからマップを読 み込む。<code>MAP-NAME</code> が与えられていなければ、全てのマップを読む。</p>
<pre class="fragment">MAP-ACTION ::= ACTION

ACTION ::= INSERT | DELETE | SELECT | MOVE | MARK
           | SHOW | HIDE | PUSHBACK | POP | UNDO 
       | COMMIT | UNHANDLE | SHIFT | CALL
       | SET | IF | COND | '(' MACRO-NAME ')'

PREDEFINED-SYMBOL ::=
    '@0' | '@1' | '@2' | '@3' | '@4'
    | '@5' | '@6' | '@7' | '@8' | '@9'
    | '@&lt;' | '@=' | '@&gt;' | '@-' | '@+' | '@[' | '@]'
    | '@@'
    | '@-0' | '@-N' | '@+N'
</pre><pre class="fragment">STATE-LIST ::= STATE-INCUSION ? '(' 'state' STATE * ')'  STATE-INCUSION ?

STATE ::= '(' STATE-NAME [ STATE-TITLE-TEXT ] BRANCH * ')'

STATE-NAME ::= SYMBOL

STATE-TITLE-TEXT ::= MTEXT

BRANCH ::= '(' MAP-NAME BRANCH-ACTION * ')'
       | '(' nil BRANCH-ACTION * ')'
       | '(' t BRANCH-ACTION * ')'

STATE-INCLUSION ::= '(' 'include' TAGS 'state' STATE-NAME ? ')'
</pre><p>入力メソッドがそれ単体で利用されることがなく常に他の入力メソッドに読 み込まれて用いられる場合には、<code>STATE-LIST</code> は省略できる。</p>
<p><code>STATE-INCLUSION</code> は、<code>TAGS</code> で指定される他の入力メソッドからステート を読み込む。<code>STATE&ndash;NAME</code> が与えられていなければ、すべてのステートを読 む。</p>
<p><code>STATE-TITLE-TEXT</code> は、もし指定されていれば、入力メソッドがこの 状態にある時スクリーン上に表示されるテキストである。省略された場合には <code>TITLE-TEXT</code> が用いられる。</p>
<p><code>BRANCH</code> の第一の形式では、<code>MAP-NAME</code> は <code>MAP</code> に現われるものでなく てはならない。この場合、<code>MAP-NAME</code> の <code>KEYSEQ</code> の一つに合致するキー列 がタイプされれば、 <code>BRANCH-ACTION</code> が実行される。</p>
<p><code>BRANCH</code> の第二の形式では、その時点の状態のいずれの <code>BRANCH</code> にも合致 しないキー列がタイプされれば、<code>BRANCH-ACTIONが実行される。</code> </p>
<p><code>nil</code> で始まる <code>BRANCH</code> がなく、入力されたキー列がその時点でのいずれの <code>BRANCH</code> にも合致しない場合には、入力メソッドは初期状態に遷移する。</p>
<p><code>BRANCH</code> の第三の形式では、その状態に移動した時点で <code>BRANCH-ACTION</code> が実行される。もし初期状態であれば、入力メソッドの入力コンテクストを生 成した時点で <code>BRANCH-ACTION</code> を実行する。</p>
<pre class="fragment">BRANCH-ACTION ::= ACTION
</pre><p>入力メソッドはシンボルのリストを二つ持つ。</p>
<ul>
<li>
<p class="startli">マーカリスト</p>
<p class="interli">マーカは preediting テキスト中での文字位置を示すシンボルである。<code>MARK</code> アクションはマーカを特定の位置に設定する。<code>MOVE</code> と <code>DELETE</code> ア クションはマーカの位置を参照する。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli">変数リスト</p>
<p class="interli">変数は整数の値を持つシンボルである。値は<code>SET</code> アクションによって設定さ れ、<code>SET</code>, <code>INSERT</code>, <code>IF</code> に参照される。すべての変数の初期値は(暗黙 に) 0 である。</p>
<p class="endli"></p>
</li>
</ul>
<p>各 <code>PREDEFINED-SYMBOL</code> はマーカとして用いられた場合特別な意味を持つ。</p>
<ul>
<li>
<p class="startli"><code>@0</code>, <code>@1</code>, <code>@2</code>, <code>@3</code>, <code>@4</code>, <code>@5</code>, <code>@6</code>, <code>@7</code>, <code>@8</code>, <code>@9</code> </p>
<p class="interli">それぞれ 0 番目から 9 番目の位置</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>@&lt;</code>, <code>@=</code>, <code>@&gt;</code> </p>
<p class="interli">最初の、今の、最後の位置</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>@-</code>, <code>@+</code> </p>
<p class="interli">前の、次の位置</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>@</code>[, <code>@</code>]</p>
<p class="endli">候補リストが変化する際の前と次の位置 </p>
</li>
</ul>
<p><code>PREDEFINED-SYMBOL</code> のいくつかは、 <code>SELECT</code> アクション中で候補のイン デックスとして用いられた際特別な意味を持つ。</p>
<ul>
<li>
<p class="startli"><code>@&lt;</code>, <code>@=</code>, <code>@&gt;</code> </p>
<p class="interli">現在の候補グループ中での最初の、今の、最後の候補</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>@-</code> </p>
<p class="interli">前候補。今の候補が今の候補グループ中での最初のものであれば、前の候補グ ループの最後の候補。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>@+</code> </p>
<p class="interli">次候補。今の候補が今の候補グループ中での最後のものであれば、次の候補グ ループの最初の候補。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>@</code>[, <code>@</code>]</p>
<p class="endli">それぞれ前と後の候補グループ中で、今の候補と同じ候補インデックスを持つ もの。 </p>
</li>
</ul>
<p>また、これも特別な意味を持つ。</p>
<ul>
<li>
<p class="startli"><code>@@</code> </p>
<p class="interli">その時点で処理されているキーの数。</p>
<p class="endli"></p>
</li>
</ul>
<p>以下はサラウンドテキスト処理に用いられる。</p>
<ul>
<li>
<p class="startli"><code>@-0</code> </p>
<p class="interli">サラウンドテキストがサポートされていれば -1 、そうでなければ -2 。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>@-N</code> </p>
<p class="interli">ここで <code>N</code> は正の整数である。この変数の値は、プリエデット中の現在の位 置から <code>N</code> 文字前の文字である。もしプリエディット中で先行する文字がM (M&lt;N) 文字しかなければ、その値は入力スポットから数えて (N-M) 文字前の文 字となる。<code>delete</code> アクションの引数として用いられた場合、この変数は削 除する文字数を指定する。</p>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>@+N</code> </p>
<p class="interli">ここで <code>N</code> は正の整数である。この変数の値は、プリエデット中の現在の位 置から <code>N</code> 文字後の文字である。もしプリエディット中で後続する文字がM (M&lt;N) 文字しかなければ、その値は入力スポットから数えて (N-M) 文字後の文 字となる。<code>delete</code> アクションの引数として用いられた場合、この変数は削 除する文字数を指定する。</p>
<p class="endli"></p>
</li>
</ul>
<p>各アクションの引数と振舞いは以下の通り。</p>
<pre class="fragment">INSERT ::= '(' 'insert' MTEXT ')'
           | MTEXT
       | INTEGER
           | '(' 'insert' SYMBOL ')'
           | '(' 'insert' '(' CANDIDATES * ')' ')'
           | '(' CANDIDATES * ')' 

CANDIDATES ::= MTEXT | '(' MTEXT * ')'
</pre><p>第一、第二の形式は <code>MTEXT</code> を現在の位置の前に挿入する。</p>
<p>第三の形式は、文字 <code>INTEGER</code> を現在の位置の前に挿入する。</p>
<p>第四の形式は、<code>SYMBOL</code> を変数として扱い、その値が正しい文字コードであ れば現在の位置の前に挿入する。</p>
<p>第五、第六の形式では、<code>CANDIDATES</code> は候補グループを表し、<code>CANDIDATES</code> の各要素が候補を表す。つまり<code>CANDIDATES</code> が M-text であれば、 候補はそのM-text 中の文字であり、<code>CANDIDATES</code> が M-text のリストであれ ば、候補はそれらの M-text である。</p>
<p>これらの形式は現在の位置の直前に最初の候補を挿入する。挿入された文字列 には、候補のリストと現在選択されている候補を指す情報が付加されている。</p>
<p>挿入によってマーカの位置は自動的に変更される。</p>
<pre class="fragment">DELETE ::= '(' 'delete' SYMBOL ')'
           | '(' 'delete' INTEGER ')'
</pre><p>第一の形式は <code>SYMBOL</code> をマーカとして、マーカと現在の位置の間の文字を 削除する。</p>
<p>第二の形式は <code>INTEGER</code> を文字位置として、その文字位置と現在の位置の間 の文字を削除する。</p>
<p>削除によってマーカの位置は自動的に変更される。</p>
<pre class="fragment">SELECT ::= '(' 'select' PREDEFINED-SYMBOL ')'
           | '(' 'select' INTEGER ')'
       | '(' 'select' SYMBOL ')'
</pre><p>このアクションはまず、現在の位置の直前の文字が、候補リストが付加されて いる文字列に属すかどうかを調べる。そうであれば、その文字列を引数によっ て指定された候補に入れ換える。</p>
<p>第一の形式では <code>PREDEFINED-SYMBOL</code> を前述の候補インデックスとして扱い、 それによって候補リスト中の新しい候補が指定される。</p>
<p>第二の形式では <code>INTEGER</code> は候補インデックスであり、候補リスト中の新し い候補を指定する。</p>
<p>第三の形式では <code>SYMBOL</code> は整数の値を持たなければならず、その値が候補イ ンデックスとして取り扱われる。</p>
<pre class="fragment">SHOW ::= '(show)'
</pre><p>このアクションは、入力メソッドドライバに現在の位置の前にある文字列に付 加されている候補リストを示すように指示する。</p>
<pre class="fragment">HIDE ::= '(hide)'
</pre><p>このアクションは、入力メソッドドライバに現在示されている候補リストを隠 すように指示する。</p>
<pre class="fragment">MOVE ::= '(' 'move' SYMBOL ')'
         | '(' 'move' INTEGER ')'
</pre><p>第一の形式は <code>SYMBOL</code> をマーカとして、それを新しい現在の位置とする。</p>
<p>第二の形式は <code>INTEGER</code> を文字位置として、その位置を新しい現在の位置と する。</p>
<pre class="fragment">MARK ::= '(' 'mark' SYMBOL ')'
</pre><p>このアクションは <code>SYMBOL</code> をマーカとして、それを現在の位置に設定する。 <code>SYMBOL</code> は <code>PREDEFINED-SYMBOL</code> であってはならない。</p>
<pre class="fragment">PUSHBACK :: = '(' 'pushback' INTEGER ')'
              | '(' 'pushback' KEYSEQ ')'
</pre><p>第一の形式は、<code>INTEGER</code> の値が正ならば最新の <code>INTEGER</code> 個のキーイベン トをイベントキューに差し戻す。0 ならばすべてのキーイベントを差し戻す。</p>
<p>第二の形式は、<code>KEYSEQ</code> 中のキーをイベントキューに差し戻す。</p>
<pre class="fragment">POP ::= '(' 'pop' ')'
</pre><p>このアクションはまだ処理されていない最初のイベントをイベントキューから 取り出し破棄する。</p>
<pre class="fragment">UNDO :: = '(' 'undo' [ INTEGER | SYMBOL ] ')'
</pre><p>引数が無い場合、このアクションは最新の二つのキーイベント、すなわちこの コマンドによって引き起こされたものとその直前のもの、をキャンセルする。</p>
<p>整数値の引数 NUM がある場合、それは正か負であり 0 であってはならない。 正ならば最新のものから数えて NUM 個目のイベントをキャンセルする。負なら ば最新の(- NUM) 個のイベントをキャンセルする。</p>
<p>シンボルの引数がある場合、それは整数に帰着されなくてはならず、その値が 上記の正数値引数の場合と同様に取り扱われる。</p>
<pre class="fragment">COMMIT :: = '(commit)'
</pre><p>このアクションは現在の preediting テキストをコミットする。</p>
<pre class="fragment">UNHANDLE :: = '(unhandle)'
</pre><p>このアクションは現在の preediting テキストをコミットし、最新のキーを未 処理として返す。</p>
<pre class="fragment">SHIFT :: = '(' 'shift' STATE-NAME ')'
</pre><p><code>STATE-NAME</code> が <code>t</code> ならば、このアクションは現在の状態を一つ前の状態 に遷移させる。そうでなければ <code>STATE-NAME</code> で表される状態に遷移させる。 後者の場合には、<code>STATE-NAME</code> は <code>STATE-LIST</code> に現われるものでなくては ならない。</p>
<pre class="fragment">CALL ::= '(' 'call' MODULE-NAME FUNCTION ARG * ')'

ARG ::= INTEGER | SYMBOL | MTEXT | PLIST
</pre><p>このアクションは外部モジュール <code>MODULE-NAME</code> の関数 <code>FUNCTION</code> を呼 ぶ。<code>MODULE-NAME</code> と <code>FUNCTION</code> は <code>MODULE-LIST</code> に現われるものでな くてはならない。</p>
<p>関数は (<a class="el" href="structMPlist.html" title="プロパティリスト・オブジェクトの型宣言.">MPlist</a> *) 型の引数とともに呼ばれる。最初の要素のキーは <a class="el" href="group__m17nSymbol.html#ga8769a573efbb023b4d77f9d03babc09f" title="&quot;t&quot; を名前として持つシンボル.">Mt</a> で あり、その値は::MInputContext 型のオブジェクトへのポインタである。第二 の要素のキーは::Msymbol であり、値は現在の状態名である。 <code>ARGs</code> は三つ 目以降の要素の値として用いられる。それらの要素のキーは自動的に決定され る。<code>ARG</code> が整数値ならば対応するキーは <a class="el" href="group__m17nPlist.html#ga0ce08eb57aa339db4d4745e75e80fdd8" title="&quot;integer&quot; を名前として持つシンボル.">Minteger</a> であり、<code>ARG</code> がシ ンボルならば、対応するキーは <a class="el" href="group__m17nSymbol.html#ga6592d4eb3c46fe7fb8993c252b8fedeb" title="&quot;symbol&quot; を名前として持つシンボル.">Msymbol</a> などのように。</p>
<p>関数は NULL を返すか、または行うべきアクションのリストを表す (<a class="el" href="structMPlist.html" title="プロパティリスト・オブジェクトの型宣言.">MPlist</a> ) 型の値を返さなくてはならない。</p>
<pre class="fragment">SET ::= '(' CMD SYMBOL1 EXPRESSION ')'

CMD ::= 'set' | 'add' | 'sub' | 'mul' | 'div'

EXPRESSION ::= INTEGER | SYMBOL2 | '(' OPERAND EXPRESSION * ')'

OPERAND ::= '+' | '-' | '*' | '/' | '|' | '&amp;' | '!'
            | '=' | '&lt;' | '&gt;' | '&lt;=' | '&gt;='</pre><p>このアクションは <code>SYMBOL1</code> と <code>SYMBOL2</code> を変数として、<code>SYMBOL1</code> の 値を以下のように設定する。</p>
<p><code>CMD</code> が 'set' ならば、<code>SYMBOL1</code> の値を <code>EXPRESSION</code> の値に設定する。</p>
<p><code>CMD</code> が 'add' ならば、<code>SYMBOL1</code> の値を <code>EXPRESSION</code> の値だけ増やす。</p>
<p><code>CMD</code> が 'sub' ならば、<code>SYMBOL1</code> の値を <code>EXPRESSION</code> の値だけ減らす。</p>
<p><code>CMD</code> が 'mul' ならば、<code>SYMBOL1</code> の値を <code>EXPRESSION</code> の値を掛けたも のにする。</p>
<p><code>CMD</code> が 'div' ならば、<code>SYMBOL1</code> の値を <code>EXPRESSION</code> の値で割ったも のにする。</p>
<pre class="fragment">IF ::= '(' CONDITION ACTION-LIST1 ACTION-LIST2 ? ')'

CONDITION ::= [ '=' | '&lt;' | '&gt;' | '&lt;=' | '&gt;=' ] EXPRESSION1 EXPRESSION2

ACTION-LIST1 ::= '(' ACTION * ')'

ACTION-LIST2 ::= '(' ACTION * ')'
</pre><p>このアクションは、 <code>CONDITION</code> が真であれば <code>ACTION-LIST1</code> を実行し、 そうでなければ <code>ACTION-LIST2</code> を (もしあれば) 実行する。</p>
<p><code>SYMBOL1</code> と <code>SYMBOL2</code> は変数として扱われる。</p>
<pre class="fragment">COND ::= '(' 'cond' [ '(' EXPRESSION ACTION * ') ] * ')'
</pre><p>このアクションは対応する <code>EXPRESSION</code> が 0 でない値をとる最初のアクショ ン <code>ACTION</code> を実行する。</p>
<h2><a class="anchor" id="im-example1"></a>
EXAMPLE 1</h2>
<p>この例はダイアクリティカルマーク(アキュートやセディラ)付きのラテン文 字を入力するためものである。例えば以下のようにタイプすることで: </p><pre class="fragment">    Comme'die-Franc,aise, chic,,
</pre><p> 以下が入力できる。</p>
<p>入力メソッドの定義は以下のようにとても単純で、すべてのラテン文字をサポー トとするように変更するのも簡単である。</p>
<h2><a class="anchor" id="im-example2"></a>
EXAMPLE 2</h2>
<p>この例は C-u に続けて4桁の16進コードをタイプすることでユニコード文字 を入力するもである。たとえば以下のようにタイプすると ("^u" は Control-u): </p><pre class="fragment">    ^u2190^u2191^u2192^u2193
</pre><p> 以下(矢印シンボル)が入力できる:</p>
<p>以下がその入力メソッドの定義である。コマンド <code>SET</code> と <code>IF</code> を利用し ている。 </p><pre class="fragment">(title "UNICODE")
(map
 (starter
  ((C-U) "U+"))
 (hex
  ("0" ?0) ("1" ?1) ... ("9" ?9) ("a" ?A) ("b" ?B) ... ("f" ?F)))
(state
 (init
  (starter (set code 0) (set count 0) (shift unicode)))
 (unicode
  (hex (set this @-)
       (&lt; this ?A
      ((sub this 48))
      ((sub this 55)))
       (mul code 16) (add code this)
       (add count 1)
       (= count 4
      ((delete @&lt;) (insert code) (shift init))))))
</pre><h2><a class="anchor" id="im-example3"></a>
EXAMPLE 3</h2>
<p>この例は、ピンインをタイプして中国語を入力するものである。</p>
<h2><a class="anchor" id="im-seealso"></a>
SEE ALSO</h2>
<p><a class="el" href="m17nDBData.html#mim-list">Input Methods provided by the m17n database</a>, <a class="el" href="m17nDBFormat.html#mdbGeneral">mdbGeneral(5)</a> </p>
</div></div><!-- contents -->
</div><!-- PageDoc -->
<!-- -*- coding: utf-8; -*- -->
<hr>
<ADDRESS>
<a href="http://www.m17n.org/m17n-lib-ja/index.html" target="mulewindow"><img src="parrot.png" align=bottom alt="m17n-lib Home" border=0></a>
</ADDRESS>
</body>
</HTML>
<!-- Copyright information
Copyright (C) 2001 Information-technology Promotion Agency (IPA)
Copyright (C) 2001-2011
  National Institute of Advanced Industrial Science and Technology (AIST)
This file is part of the m17n library documentation.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no
Invariant Section, no Front-Cover Texts,
and no Back-Cover Texts.  A copy of the license is included in the
appendix entitled "GNU Free Documentation License".
-->