MS-WordによるSGML入力


目次

はじめに ▼
 ブックマーク方式 ▼
 スタイル方式 ▼
 利用にあたって ▼
ブックマーク方式によるSGMLデータ入力 ▼
 テンプレートの作り方 ▼
 テンプレートを使った入力 ▼
 文書型定義 ▼
 保存された文書 ▼
スタイル方式によるSGMLデータ入力 ▼
 変換規則の骨組み生成 ▼
 変換規則 ▼
 文書実現値への変換 ▼
 変換された文書実現値 ▼
 文書型定義 ▼
RTFtoSGMLテストパッケージの配布 ▼

はじめに

 現在,SGMLデータの入力では専用のワープロやエディターが用いられていますが,それらの操作は今まで使い慣れたワープロやエディターと変わる場合が多いようで,使い勝手の面で導入には難があります。一番いいのは,現在使ってるワープロがSGMLに対応してくれることですが,そう都合よくはいきません。もっとも,SGMLの導入によって文書の様式が変わることがありますので,一概に操作面だけを問題にすることはないかもしれません。

 ここで私(岸 和孝)が提案するのは,MS-Windows95やMacOSといったプラットフォームで動くポピュラーなMicrosoft Word(以下,MS-Wordと表わします)を用いて,SGMLデータを簡単に作成する方法です。MS-Wordを使う理由は,単にポピュラーであるということだけでなく,文書作成に有用な,テンプレート(「鋳型」の意味),ブックマーク(「しおり」の意味),スタイル指定,RTF(Rich Text Format)形式での入出力などの機能を備えているからです。

 MS-WordにおけるSGMLデータの入力方法として,次の二つのアプローチを考えました。この二つを区別するために便宜上,ブックマーク方式とスタイル方式と呼びます。[表1を参照]

▼表1 MS-Wordによる入力方式

入力方法ブックマーク方式スタイル方式
適用に向いた文書申込書,伝票など論文,手紙など
文書型の指示ブックマークブックマーク
SGMLタグへの対応ブックマークスタイル
スタイル固定任意
SGMLデータの出力SAVESGMLマクロRTFtoSGMLプログラム
文書型の検証不要必要

ブックマーク方式

 ブックマーク方式では,文書型と同じ名前のブックマーク(ただ一つ)と,SGMLタグと同じ名前のブックマーク(複数)を付けたテンプレートを用意しておきます。このテンプレートを参照して執筆者は文書を入力します。

 できあがった文書は,テンプレートのプルダウンメニューに用意されているSAVESGMLマクロによってSGMLデータとして保存出力されます。

 このブックマーク方式は,申込書や伝票といった文書のレイアウトが固定している文書の入力に適しています。[表1を参照]


スタイル方式

 スタイル方式では,文書型と同じ名前のブックマーク(ただ一つ)と,文書作成に必要なスタイル(複数)を用意しておきます。そのスタイルは全く任意です。このテンプレートを参照して執筆者は文書を入力します。

 できあがった文書は,RTF形式で一旦保存します。スタイル名とタグ名の対応を定義した変換規則に基づいて,このRTF文書はRTFtoSGMLプログラムによってSGMLデータへ変換されます。その変換では,タグ付けが文書型に合っているかどうかは検証されませんので,変換したSGMLデータをパーザー(構文解析プログラム)に通す必要があります。

 このスタイル方式は,論文や手紙といった文書のレイアウトが可変の文書の入力に適しています。[表1を参照]

 スタイル方式でも,ブックマーク方式のようにマクロによってSGMLデータ保存出力ができればいいのですが,そうしたマクロをBasicコードで記述するのは私にとっては困難です。どなたか試みていただけたら幸いです。


利用にあたって

 この二つの方式は文書の種類によって使い分ける必要がありますが,文書作成の操作は同じですから,エンドユーザーが方式の違いによって混乱することはないと思われます。

 SAVESGMLマクロ(Basicコード)とRTFtoSGMLプログラム(Perlスクリプト)は,自由にご利用下さい。また,それらのコードの翻案は自由です。

 今回配布するSAVESGMLマクロとRTFtoSGMLプログラムは,次の環境で動作確認しました。

MS-Windows95
ver.4.00.950
ThinkPad230Cs (Am5x86-P75)
Microsoft Word 97 SR-1
Perl ver.5.001 for Win32 Build 110 Japanization patch 4
MacOS
ver.J1-7.5.5
PowerBook4300cs
Microsoft Word 6.0
MacJPerl ver.5.1.5r4 J
注1)SAVESGMLマクロについて
MS-WordのバージョンによってBasicコードの文法は異なります。MS-Word 97ではVisual Basicですが,それ以前はWordBasicです。SAVESGMLマクロは,その二通りを用意してありますので,使い分けて下さい。
注2)MS-Word(RTF)文書の行末符号について
MS-Word(RTF)文書の行末符号は,OSによって異なります。したがって,例えば,MacOSでのMS-Wordで作成したRTF文書をWindows95で処理する場合は,その行末符号を変更する必要があります。これはスクリプトでは対応していませんので,注意して下さい。
注3)RTF規格について
Microsoft社のRTF規格は,安定した交換形式ではなく,MS-Wordのバージョンが上がると,変更が生じることがあります。そうした場合,このプログラムを変更しなければならないかもしれません。

なお,現在の版では画像データや表データの取り扱いはできませんので,注意して下さい。画像データや表データの取り扱い,解析検証機能の追加,二つの方式の併用などについては現在研究中です。


ブックマーク方式によるSGMLデータ入力

 MS-Wordのブックマーク方式によるSGMLデータ入力で用いるテンプレートは,レイアウトが固定している文書において,エンドユーザーが入力しやすい様式に入力項目を割り付けたものです。

 このテンプレート内の入力項目の一つ一つにブックマークを付けて項目の意味を表わします。それらのブックマークには,一つの文書内で重複のない名前を持たせますが,ディスプレイには表示されませんので,エンドユーザーが入力時に混乱することはありません。

 文書型定義の仕組みとMS-Wordのテンプレートに関する,ある程度の知識があれば,プログラムを知らなくても簡単にSGML用テンプレートが作成できるでしょう。

 ここで,誤解がないようにしておきたいことがあります。ブックマーク方式では,SAVESGMLマクロという「部品」を提供するだけで,具体的なテンプレート作成ツールを提供するわけではありません。言い換えれば,個々のSGML用テンプレートを制作することに付加価値が生じることになります。


テンプレートの作り方

 テンプレートは次のような手順で作ります。

  1. 文書の文書型を定義します。
  2. その文書型を反映するテンプレートを新規に作成します。
  3. 文書型を表わすブックマーク(“DTD”という名前のブックマーク)をテンプレートに含め,その値として文書型名を定義します。[図1を参照]
  4. 文書型に合わせて入力項目をブックマークとして定義します。この定義では,文書型定義よりも具体的にデータの型と最大桁数などを決めることができます。文書の上から下へ向かってブックマークが走査されますので,グループを表わすブックマークも含めて順序よく定義します。[図1を参照]
  5. 書き出しを行う専用のマクロ(“SAVESGML”という名前のマクロ)をテンプレートにコピーします。
  6. ユーザー指定を使って専用のメニュー(例えば,“SGML”という名前のメニューバー)を定義し,その中に,“SAVESGML”という名前のマクロを呼び出すメニュー項目(例えば,“保存”という名前のメニュー項目)を追加します。[図2を参照]
  7. テンプレートに文書保護の指定をします。ここでは「定型文書フィールド」のみの入力を指定します。
  8. テンプレートをMS-Wordのテンプレート用のディレクトリへ置きます。

以上で,SGML用テンプレートは出来上がりです。

図1 SGML用テンプレート

▲図1 SGML用テンプレート(矢印はブックマークを表わす)

図2 MS-Wordに追加されたSGML保存のためのメニュー

▲図2 MS-Wordに追加されたSGML保存のためのメニュー

注)テストパッケージではSGMLメニューに「保存」の下に「読み取り」が表示されていますが,その機能はまだ実装されていません。


テンプレートを使った入力

 このSGML用テンプレートを使った入力は,次のような手順で行います。

  1. 文書を新規作成する段階でSGML用テンプレートを指定します。テンプレートが適切なディレクトリに置かれていないと,テンプレート名が表示されないことに注意して下さい。[図3を参照]
  2. これによって新規文書はSGML用テンプレートに誘導されて入力できるようになります。項目の入力終了時点で改行キーやタブキーを押すと,次の項目へ進みます。[図4を参照]
  3. 入力が終了した時点でSGML形式で保存するために,SGML用テンプレートで設定したメニューを選びます。[図2を参照]
  4. 保存処理では,開始のダイアログが表示されます。[図5を参照]
  5. 保存が終了すると,完了確認のダイアログが表示されます。[図6を参照]
図3 SGML用テンプレートの指定

▲図3 SGML用テンプレートの指定

図4 テンプレートに誘導される入力

▲図4 テンプレートに誘導される入力

図5 保存の開始

▲図5 保存の開始

図6 保存完了の確認

▲図6 保存完了の確認


文書型定義

 この事例における文書型定義は,図7のとおりです。

<!DOCTYPE meishi [
<!ENTITY % fname    "family, name">
<!ENTITY % cstatus  "company, org?, div1?, div2?, status?">
<!ENTITY % adr      "post, address, bil?">
<!ENTITY % tel      "(telcity, telno)?">
<!ENTITY % fax      "(faxcity, faxno)?">
<!ELEMENT  meishi   - -  (%fname;, %cstatus;, %adr;, %tel;, %fax;, email?, type)>
<!ELEMENT  family   - O  (#PCDATA)>
<!ELEMENT  name     - O  (#PCDATA)>
<!ELEMENT  company  - O  (#PCDATA)>
<!ELEMENT  org      - O  (#PCDATA)>
<!ELEMENT  div1     - O  (#PCDATA)>
<!ELEMENT  div2     - O  (#PCDATA)>
<!ELEMENT  status   - O  (#PCDATA)>
<!ELEMENT  post     - O  (#PCDATA)>
<!ELEMENT  address  - O  (#PCDATA)>
<!ELEMENT  bil      - O  (#PCDATA)>
<!ELEMENT  telcity  - O  (#PCDATA)>
<!ELEMENT  telno    - O  (#PCDATA)>
<!ELEMENT  faxcity  - O  (#PCDATA)>
<!ELEMENT  faxno    - O  (#PCDATA)>
<!ELEMENT  email    - O  (#PCDATA)>
<!ELEMENT  type     - O  (#PCDATA)>
]>

▲図7 文書型定義

 一枚の名刺データが一つの文書実現値となります。名刺(meishi)は,氏名(fname),所属(cstatus),住所(adr),電話番号(tel),FAX番号(fax),メールアドレス(email),区分(type)から構成されているものとします。ここでは,それらをパラメータ実体名として,それを更に細かい要素名で定義しています。例えば,氏名(fname)は姓(family)と名(name)に分けています。他も同様な定義になっています。


保存された文書

 この事例においてSGML形式で保存出力されたデータ(文書実現値)は,図8のようになります。

<!DOCTYPE MEISHI SYSTEM []>
<MEISHI>
<FAMILY>岸
<NAME>和孝
<COMPANY>
<ORG>
<DIV1>
<DIV2>
<STATUS>
<POST>966
<ADDRESS>喜多方市松山町鳥見山4608
<BIL>
<TELCITY>0241
<TELNO>22-3981
<FAXCITY>0241
<FAXNO>21-1581
<EMAIL>NAG00251@niftyserve.or.jp
<TYPE>団体関係
</MEISHI>

▲図8 保存されたSGML文書


スタイル方式によるSGMLデータ入力

 MS-Wordのスタイル方式によるSGMLデータ入力で用いるプログラムは,RTF2SGMLとRTFSTYLEです。RTF2SGMLはRTF形式で表わされたMS-Word文書(RTF文書)を変換規則に従ってSGMLの文書実現値へ変換します。RTFSTYLEは変換規則を作るための骨組み生成を行います。[図9参照]

図9 スタイル方式によるSGMLデータ入力と変換

▲図9 スタイル方式によるSGMLデータ入力と変換

 これらのプログラムはPerlスクリプトで,その実行には,Perlインタプリタが必要です。

 プログラムの起動方法はOSによって少々異なります。

 引き数なしでプログラムを起動すると,簡単な説明が表示されます。通常はファイル名を引き数としてプログラムを起動します。

MS-Windows95における起動方法
コマンドラインで“PERL スクリプト名 [ ファイル名 ] …”を指示すると,
ファイル名 …の順に処理されます。
より簡単にするために,
スクリプトを起動するための次のようなバッチファイルを作成して下さい。
例えば,“RTF2SGML.BAT”と“RTFSTYLE.BAT”という名前にしておきます。
 CD ファイルの格納されたディレクトリへのパス
 PERL スクリプト名 %1 %2 %3 %4 %5
ここで,引き数の参照は,コマンドラインが長くなりすぎますので,5個程度にします。
そのバッチファイルのアイコンへファイル …をドラッグ・アンド・ドロップすると,
ファイル名 …の順に処理されます。

 

MacOSにおける起動方法
Perlインタプリタを起動し,スクリプトをDroplet形式で保存します。
例えば,“RTF2SGML”と“RTFSTYLE”という名前にしておきます。
そのアプリケーションのアイコンへファイル …をドラッグ・アンド・ドロップすると,
ファイル …の順に処理されます。
単なるラウンチでは引き数なしの起動となります。
ちなみに,ScriptメニューからRun Scriptでスクリプトを指示しても
「引き数なしの起動」となってしまいますので,注意して下さい。

 以下の説明では,Windows95でのコマンドラインによる指示方法で説明します。


変換規則の骨組み生成

 先ず,RTFSTYLEを使って変換規則の骨組みを生成します。処理対象となるRTF文書のファイル名には拡張子“RTF”が必要です。[図10参照]

図10 RTF文書の例

▲図10 RTF文書の例(矢印はスタイルを表わす)

 例えば,コマンドラインで“PERL RTFSTYLE.PL SAMPLE.RTF”を指示すると,図11のような処理経過が表示されます。

RTFSTYLE version : 1.0
 RTF文書ファイル :MyDisk:MyFolder:SAMPLE.RTF
 使用テンプレート:MyDisk:MicrosoftWord:Templates:LETTER.DOT
 変換規則ファイル:MyDisk:MyFolder:LETTER.R2S
 文書型名:LETTER
処理が完了しました。

▲図11 RTFSTYLEの処理経過表示

 生成される変換規則ファイル(骨組み)は,RTF文書に含まれているブックマーク“DTD”で指定された文字列(文書型名)に拡張子“R2S”を付けて表わされます。例えば,“SAMPLE.DOT”というテンプレートには,“LETTER”のブックマークがあらかじめ含まれています。そのテンプレートを使って作成した“SAMPLE.RTF”というRTF文書ファイルをRTFSTYLEで処理すると,“LETTER.R2S”という名の変換規則ファイルが生成されます。


変換規則

 RTFSTYLEによって生成される変換規則の骨組みは,図12のような内容です。

# RTFtoSGMLのための変換規則
# 次の行の右辺を各スタイル名に対応する適切な要素名(タグ名)を定義して下さい。
heading 1  heading 1
heading 2  heading 2
heading 3  heading 3
 (略)

▲図12 変換規則の骨組み

 この変換規則において,“#”の行は注釈です。定義の行は,“スタイル名 タブ タグ名 改行”の形式です。文書型定義に従って,各行の右辺を具体的なタグ名に書き換えます。

 例えば,“LETTER.R2S”という名の変換規則ファイルは,図13のように書き換えます。

# RTFtoSGMLのための変換規則
# 文書型名:LETTER
本文      TEXT
挨拶文    GREETING
会社名    COMPANY
結び      CLOSING
署名      SIGN
署名 部署 SIGNDIV
日付      DATE
返送先    RETURN
本文宛先  ADDRESS
要件      TITLE

▲図13 書き換えた変換規則


文書実現値への変換

 次に,RTF2SGMLを使ってRTF文書から文書実現値へ変換します。

 例えば,コマンドラインで“PERL RTF2SGML.PL SAMPLE.RTF”を指示すると,図14のように処理経過が表示されます。

RTF2SGML version : 1.0
 RTF文書ファイル :MyDisk:MyFolder:SAMPLE.RTF
 SGML文書実現値 :MyDisk:MyFolder:SAMPLE.SGM
 使用テンプレート:MyDisk:MicrosoftWord:Templates:LETTER.DOT
 変換規則ファイル:MyDisk:MyFolder:LETTER.R2S
処理が完了しました。

▲図14 RTF2SGMLの処理経過表示


変換された文書実現値

 変換された文書実現値ファイル名は,そのファイル名に拡張子“SGM”が付きます。変換規則ファイルは,RTF文書のブックマーク“DTD”で指定された文字列(文書型名)に拡張子“R2S”を付けたファイルとしてRTF文書と同じディレクトリー内に格納されているものとします。

 例えば,“SAMPLE.RTF”というRTF文書ファイルをRTF2SGMLで処理すると,“LETTER.R2S”という変換規則ファイルの参照によって,図15のような“SAMPLE.SGM”という文書実現値ファイルが出力されます。

<!DOCTYPE LETTER SYSTEM []>
<LETTER>
<COMPANY> 飯豊山書林
<RETURN>喜多方市松山町鳥見山字下堰下4608
0241-22-3981 0241-21-1581
<DATE>1997年11月25日
<ADDRESS>各位
<SIGNDIV>飯豊山書林
<note>編集長
<SIGN>岸 和孝
<TITLE>
<note> No.2発刊のご案内
<GREETING>拝啓 
<TEXT>時下ますますご清栄のこととお慶び申し上げます。
さて この度<note> No.2を発行致しましたので,ご案内申し上げます。今回は,SGMLデータの入力を特集しました。SGMLデータの入力は,エンドユーザーとSGMLシステムとの接点に当たり,多くの難しい問題を抱えておりますが,実現可能な幾つかの解決法を<note> No.2で発表しました。
つきましては,是非ご購読賜わりたくお願い申し上げる次第です。
<CLOSING>敬具
</LETTER>

▲図15 変換出力された文書実現値


文書型定義

 この事例における文書型定義は,図16のとおりです。

<!DOCTYPE letter [
<!ENTITY % heading    "company, return">
<!ENTITY % signature  "signdiv, sign">
<!ENTITY % body       "greeting, text, closing">
<!ELEMENT letter     - -  (%heading;, date, address, %signature;, title, %body;)>
<!ELEMENT  company   - O  (#PCDATA)>
<!ELEMENT  return    - O  (#PCDATA)>
<!ELEMENT  date      - O  (#PCDATA)>
<!ELEMENT  address   - O  (#PCDATA)>
<!ELEMENT  signdiv   - O  (#PCDATA)>
<!ELEMENT  sign      - O  (#PCDATA)>
<!ELEMENT  title     - O  (#PCDATA)>
<!ELEMENT  greeting  - O  (#PCDATA)>
<!ELEMENT  text      - O  (#PCDATA)>
<!ELEMENT  closing   - O  (#PCDATA)>
]>

▲図16 文書型定義

 一通の手紙が一つの文書実現値となります。手紙(letter)は,頭書き(heading),日付(date),本文宛先(address),署名(signature),要件(title),本文(body)から構成されているものとします。ここでは,それらをパラメータ実体名として,それを更に細かい要素名で定義しています。例えば,頭書き(heading)は会社名(company)と返送先(return)に分けています。他も同様な定義になっています。

 スタイル方式では,執筆者は文書の文書型を意識しながらスタイルを指定しなければなりませんので,それが負担にならないように,テンプレート内にガイドとなるスタイル名,例えば,“[表題]”とか“[要約]”といった文字列を含めておく工夫が必要です。MS-Wordのテンプレート集にある各種のサンプルのガイドを参考にするといいでしょう。


RTFtoSGMLテストパッケージの配布

 “RTFtoSGMLテストパッケージ”を次のパッケージで配布します。不都合がありましたら,ご一報下さい。

 RTFtoSGMLテストパッケージ

 パッケージには,次のデータが収録されています。

MANUALマニュアル(この文書)
RTF2SGML.PLRTFからSGMLへの変換プログラム
RTFSTYLE.PL変換規則の骨組み生成プログラム
RTF2SGMLRTF2SGML.PLのDroplet(MacOS用)
RTFSTYLERTFSTYLE.PLのDroplet(MacOS用)
SAVESGML.1SAVESGMLマクロ(WordBasic用)
SAVESGML.2SAVESGMLマクロ(Visual Basic用)
TEGAMI.DOCLETTER.DTDに基づくMS-Word文書の例
LETTER.DOTLETTER.DTDに基づくテンプレート
LETTER.R2SLETTER.DTDに基づく変換規則
LETTER.DTDLETTERの文書型定義
WATASHI.DOCLETTER.DTDに基づくMS-Word文書の例
MEISHI.DOTMEISHI.DTDに基づくテンプレート
MEISHI.DTDMEISHIの文書型定義

(1997年11月記,1998年9月改訂)


(c)1998 JAGAT