mb_language("uni"); mb_internal_encoding("utf-8"); mb_http_input("auto"); mb_http_output("utf-8"); ?>
前回は,OpenOfficeのXMLボキャブラリであるOpenDocument Format(ODF)の仕様書を和訳する作業で訳語の確認に用いている手法についてお話ししました。先ずテキスト文書から訳語データをエクスポート(輸出)し,次にそれをスプレッドシート文書へインポート(輸入)しました。その処理を行うフィルターでは,意味を持たせたスタイルの名前を参照してODF要素を扱いました。今回は,いよいよスタイルそのものの話です。
OpenOfficeのWriterでは,スタイルの指定は既存のスタイルをメニューから選んで指定するか,任意のスタイルを段落または文字の単位で指定するか,のいずれかです。つまり,その操作は従来のオフィス・スイートとほとんど変わりません。そうした操作を前提として,ODFにおけるスタイルの種類は,共通スタイルと自動的スタイルに大別されます。
共通スタイルは,あらかじめODFの要素の中で定義されたものです。参照した共通スタイルのフォントやインデントなどが変更された際は,その共通スタイルは変更されないで,その共通スタイルに上書きされるスタイルとして要素が生成されます。それが自動的スタイルです。
既存の共通スタイルで指定した文書の例を図1に示します。そのスタイルと内容の関係を表1に示します。ここで,すべてのスタイルを説明することは紙面の関係からできませんので,図1の5行目にある「本文(2)」に注目することにします。これは,要素の共通スタイル「Text body」のフォント寸法を変更しましたので,自動的スタイル「T1」が生成されています。図1の8行目にある「リストの内容(2)」も同様です。ODFにおけるこの部分を図2に示します。ここで,共通スタイル「Text body」と自動的スタイル「T1」は,図3のようになります。なお,OpenOfficeのユーザーインターフェースとして,共通スタイルの名前は表示されますが,生成された自動的スタイルの名前は表示されません。
▼図1 共通スタイルで指定した文書の例
▼表1 スタイルと内容
スタイル名 | 内容 | ODF要素 |
---|---|---|
Title | タイトル | p |
Subtitle | 副題 | p |
Contents Heading | (目次)目次 | index-body/index-title/p |
Contents 1→P1 | (目次)見出し1 | index-body/p |
Contents 2→P2 | (目次)見出し2 | index-body/p |
Contents 3→P3 | (目次)見出し3 | index-body/p |
Heading 1 | 見出し1 | h |
Text body | 本文(1) | p |
Text body→T1 | 本文(2) | p |
Footnote | 脚注(1) | note |
List Heading | リストの見出し | p |
List Contents | リストの内容(1) | p |
List Contents→T2 | リストの内容(2) | p |
Heading 2 | 見出し2 | h |
Text body | 本文(3) | p |
Text body | 本文(4) | p |
Footnote | 脚注(2) | note |
Table | 図表番号 | p |
Table Contents | 表の内容(1) | table/table-row/table-cell/p |
Table Contents | 表の内容(2) | table/table-row/table-cell/p |
Text body | 本文(5) | p |
▼図2 共通スタイルが変更された部分(ODF)
<text:h text:style-name="Heading 1" text:outline-level="1">見出し1</text:h>
<text:p text:style-name="Text body">本文
<text:note text:id="ftn1" text:note-class="footnote">
<text:note-citation>1</text:note-citation>
<text:note-body>
<text:p text:style-name="Footnote">脚注(1)</text:p>
</text:note-body>
</text:note>
(1)
</text:p>
<text:p text:style-name="Text body">
<text:span text:style-name="T1">本文</text:span>
(2)
</text:p>
<text:p text:style-name="List Heading">リストの見出し</text:p>
<text:p text:style-name="List Contents">リストの内容(1)</text:p>
<text:p text:style-name="List Contents">
<text:span text:style-name="T2">リストの内容</text:span>
(2)
</text:p>
▼図3 共通スタイルと自動的スタイルを表す部分(ODF)
<office:styles>
(略)
<style:style style:name="Standard" style:family="paragraph" style:class="text"/>
<style:style style:name="Text body" style:display-name="Text body"
style:family="paragraph" style:parent-style-name="Standard" style:class="text">
<style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.212cm"/>
<style:text-properties style:font-name="MS Mincho" style:font-size-asian="10.5pt"/>
</style:style>
(略)
</style:style>
<office:automatic-styles>
(略)
<style:style style:name="T1" style:family="text">
<style:text-properties fo:font-size="16pt" style:font-size-asian="16pt"
style:font-size-complex="16pt"/>
</style:style>
(略)
</office:automatic-styles>
このようにして,ODFでは内容とスタイルが分離された形で表されます。この方法は,HTMLにおける段階スタイルシート(CSS)に似ています。CSSは,図4のように独特の構文で表されるのに対して,ODFのスタイルはXML構文で表されます。ちなみにXSLのフォーマッティング・オブジェクト(XSL FO)では内容とスタイルは,図5のように一体化した形で表されます。ODFがスタイルが動的に変更されることに対応するようになっているのに対して,XSL FOは最終出力を表すためにスタイルが固定的であることから,こうした違いになったのでしょう。CSSが独特の構文になったのもスタイルが動的に変更されないせいかもしれません。
▼図4 段階スタイルシートにおけるスタイル指定
<STYLE TYPE="text/css">
(略)
P.T1 { margin-top:0cm;margin-bottom:0.212cm;font-family:"MS 明朝";font-size:16pt; }
(略)
</STYLE>
▼図5 図1の「本文(2)」を表す部分(XSL FO)
<fo:block margin-top="0cm" margin-bottom="0.212cm" font-family="MS 明朝" font-size="10.5pt">
<fo:inline font-size="16pt">本文</fo:inline>
(2)
</fo:block>
ODFにおけるスタイル指定の属性はきわめて多く,現在,ODF仕様書を訳しながら,どのように整理すべきか思案しているところです。とりわけ仕様書におけるスタイルの説明には図解が少なく,あるスタイルがどのように表示されるかを想像することが実際に困難です。そこで(英語版ですが)文書作成者のための操作説明書を参考にしています。その操作説明書はOpenOfficeのヘルプよりも詳しいので参考になると思います。
さて,前々回と前回にお話しした脚注の取り出しと同様に,ODFを定義するRelax-NGスキーマをODFの仕様書からスタイル名を参照して取り出すBasicマクロ[図6を参照]を作りましたので,参考までに掲載します。なお,この処理はエクスポート・フィルターに比べてかなり遅く,マクロとフィルターの使い分けの一指針となるでしょう。ちなみに,ODFのRelax-NGスキーマは単独ではサイト上にはなく,仕様書の中に含まれているものだけのようです。それは何と約1万8000行もあります。マクロやフィルターの役割が実感できる一例です。
▼図6 指定したスタイルを持つ段落の内容を取り出すためのBasicマクロ
Sub ExportDataWithStyle
Dim Path As String
Dim Style As String
Dim FA As Object
Dim O As Object
Dim OS As Object
Dim Doc As Object
Dim Cursor As Object
Dim Proceed As Boolean
Path = "odf.xsd" ' この場合は,ルートの「odf.xsd」へ出力する
Style = "RelaxNG" ' この場合は「RelaxNG」を検出する
FA = createUnoService("com.sun.star.ucb.SimpleFileAccess")
O = createUnoService("com.sun.star.io.TextOutputStream")
OS = FA.openFileWrite(Path)
OS.truncate()
O.setOutputStream(OS)
Doc = ThisComponent
Cursor = Doc.Text.createTextCursor
Cursor.gotoStart(True)
Do
Cursor.gotoStartOfParagraph(false)
Cursor.gotoEndOfParagraph(true)
If (Cursor.ParaStyleName = Style) Then
O.writeString(Cursor.getString() & chr(10))
End IF
Proceed = Cursor.gotoNextParagraph(False)
Loop While Proceed
O.closeOutput()
End Sub
▲このページのTOPへ