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 ライブラリ
 <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&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&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> – 一般的なフォーマット </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbCharsetList">CharsetList</a> – 文字セット定義のリスト </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbCodingList">CodingList</a> – コード系定義のリスト </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbDir">Dir</a> – データベースディレクトリ中のデータのリスト </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbFLT">FLT</a> – フォントレイアウトテーブル </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbFontEncoding">FontEncoding</a> – フォントエンコーディング </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbFontset">Fontset</a> – フォントセット </li>
<li>
<a class="el" href="m17nDBFormat.html#mdbIM">IM</a> – インプットメソッド </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データベースのタグ<charset-list>のついたデータ から、文字セット定義のリストをロードする。このデータは以下のフォーマッ トのプロパティリストとしてロードされる。</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 データベースのタグ <coding-list> のついたデータからコード系定義のリストをロードする。このデータは以下の フォーマットのプロパティリストとしてロードされる。</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 が ‘charset’ でも ‘char-table’ でもなく、TAGn (n > 0) がシンボル ‘*’ ならば、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 データベースからタグ <font, layouter, FLT-NAME> を用いて 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 ::= '=' | '*' | '<' | '>' | '|' | '[' | ']'
</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><</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">この規則はデフォルトの左パディングフラグを 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 ::= ('<' | '>') INTEGER ?
YOFF ::= ('+' | '-') INTEGER ?
</pre><p><code>VPOS</code> と <code>HPOS</code> は次のように垂直、水平位置を指定する。</p>
<pre class="fragment"> POINT VPOS HPOS
----- ---- ----
0----1----2 <---- top 0 t l
| | 1 t c
| | 2 t r
| | 3 B l
9 10 11 <---- center 4 B c
| | 5 B r
--3----4----5-- <-- baseline 6 b l
| | 7 b c
6----7----8 <---- 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 座標を、前の参照点からどれほど右 ('<') あるいは左 ('>') へずらすか指定する。</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 データベースから <font, encoding> タグによっ て個々のフォントのエンコーディングに関する情報をロードする。このデータ は以下のフォーマットのプロパティリストとしてロードされる。</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 <font, resize>. 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 データベースから <fontset, FONTSET-NAME> タ グによってフォントセットの定義をロードする。このデータは以下のフォーマッ トのプロパティリストとしてロードされる。</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'
| '@<' | '@=' | '@>' | '@-' | '@+' | '@[' | '@]'
| '@@'
| '@-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–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>@<</code>, <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="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>@<</code>, <code>@=</code>, <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> </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<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<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=""t" を名前として持つシンボル.">Mt</a> で あり、その値は::MInputContext 型のオブジェクトへのポインタである。第二 の要素のキーは::Msymbol であり、値は現在の状態名である。 <code>ARGs</code> は三つ 目以降の要素の値として用いられる。それらの要素のキーは自動的に決定され る。<code>ARG</code> が整数値ならば対応するキーは <a class="el" href="group__m17nPlist.html#ga0ce08eb57aa339db4d4745e75e80fdd8" title=""integer" を名前として持つシンボル.">Minteger</a> であり、<code>ARG</code> がシ ンボルならば、対応するキーは <a class="el" href="group__m17nSymbol.html#ga6592d4eb3c46fe7fb8993c252b8fedeb" title=""symbol" を名前として持つシンボル.">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 ::= '+' | '-' | '*' | '/' | '|' | '&' | '!'
| '=' | '<' | '>' | '<=' | '>='</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 ::= [ '=' | '<' | '>' | '<=' | '>=' ] 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 @-)
(< this ?A
((sub this 48))
((sub this 55)))
(mul code 16) (add code this)
(add count 1)
(= count 4
((delete @<) (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".
-->
|