以下、本発明の実施形態について図面を参照して詳細に説明する。図1は、本発明の実施形態に係る文書生成装置1の機能ブロック図である。文書生成装置1は、文書に含まれる単語や連語にルビを付すことによりルビ付き文書を生成する装置である。ルビとは、単語や連語の読み方や意味などを示す注釈(例えば、読み仮名や発音記号、ピンイン記号、訳語、専門用語や難解な語句の説明)であり、その単語や連語の近傍に単語や連語との対応関係が分かるように配置されるものである。
なお、以下では、単語や連語にルビとして単語や連語の訳語を付す場合を例に挙げて、文書生成装置1についての説明を行う。また、以下では、ルビを付す対象である単語や連語の下部にルビを付す場合について説明するが、これに限られず、単語や連語の上部に付すこととしてもよいし、縦書きの文書の場合は、単語や連語の左側あるいは右側にルビを配置することとしてもよい。
図1に示すように、文書生成装置1は、入力部2、表示部3、画像読取部4、印刷処理部5、記憶部6、制御部7を備える。入力部2は、キーボードやマウスなど、ユーザから情報の入力を受け付ける入力装置である。表示部3は、ディスプレイなど、各種の情報を表示する表示装置である。画像読取部4は、紙の文書をスキャンして、文書の画像を読み取るスキャナ装置である。印刷処理部5は、文書などを紙に印刷する印刷装置である。記憶部6は、メモリやハードディスク装置などの記憶装置である。この記憶部6は、翻訳用辞書データ6a、ルビ文字データ6b、文書画像データ6c、文字認識結果データ6d、文書レイアウトデータ6e、ルビ付き文書データ6fを記憶する。
翻訳用辞書データ6aは、翻訳対象である言語の文法や、単語や連語の訳などが登録されたデータである。ここで、連語とは、2つ以上の単語が連結し、1つのまとまった意味を示す語句(例えば、名詞句、動詞句、熟語、慣用句など)のことである。ルビ文字データ6bは、ルビとして用いられる文字や文字間隔の情報を登録したデータである。文書画像データ6cは、画像読取部4により読み取られた文書の画像データである。文字認識結果データ6dは、文書画像データ6cに対して文字認識処理が行われた結果得られた文字のデータである。
図2は、文字認識結果データ6dの一例を示す図である。図2に示すように、この文字認識結果データ6dは、文字番号、認識結果、左側X座標、上側Y座標、右側X座標、下側Y座標、領域番号、行内位置情報、サイズの情報を登録している。
文字番号は、認識した各文字に割り当てられた番号である。認識結果は、文字認識の結果得られた文字である。ここでは空白も文字として認識される(文字番号622を参照)。左側X座標、上側Y座標、右側X座標、下側Y座標は、それぞれ文字に外接する矩形の左側の辺のX座標、上側の辺のY座標、右側の辺のX座標、下側の辺のY座標である。領域番号は、文書に対して領域ごとに文字認識が行われる場合に、各文字が属する領域を特定するために用いられる識別番号である。行内位置情報は、各文字の行内での位置を示す情報である。行頭の文字には番号「1」が、行末の文字には番号「2」が、行中の文字には番号「0」が割り当てられる。サイズは、ポイントで表した各文字のフォントサイズの情報である。
図1の説明に戻ると、文書レイアウトデータ6eは、レイアウト解析により得られた文書中の文字領域のレイアウトの情報を含むデータである。図3は、文書レイアウトデータ6eの一例を示す図である。図3に示すように、この文書レイアウトデータ6eは、領域番号、左側X座標、上側Y座標、右側X座標、下側Y座標、開始文字番号、文字数、行数、平均原文文字サイズ、平均行間の情報を登録している。
領域番号は、認識された各文字領域に割り当てられた番号である。左側X座標、上側Y座標、右側X座標、下側Y座標は、矩形状の各文字領域の左側の辺のX座標、上側の辺のY座標、右側の辺のX座標、下側の辺のY座標である。開始文字番号は、各文字領域に含まれる文字の範囲を示す情報である。この番号は、図2に示した文字認識結果データ6dの文字番号と対応している。例えば、領域番号「1」の開始文字番号が「1」であり、領域番号「2」の開始文字番号が「26」である場合には、文字認識結果データ6dにおいて「1」から「25」までの文字番号に対応する文字が領域番号「1」の文字領域に含まれることになる。文字数は、各文字領域に含まれる文字の数である。行数は、各文字領域に含まれる行の数である。平均原文文字サイズは、各文字領域に含まれる文字の文字サイズの平均値である。平均行間は、各文字領域に含まれる行の行間の平均値である。なお、図3の例では、各領域の原文文字サイズの代表値として平均原文文字サイズを、各領域の行間の代表値として平均行間を採用しているが、原文文字サイズや行間の平均値を求める方法以外の方法で、各領域の原文文字サイズや行間の代表値を設定することとしてもよい。
ルビ付き文書データ6fは、文書データに含まれる単語や連語の近傍に、その単語や連語の訳がルビとして付されたPDF(Portable Document Format)形式の文書のデータである。
制御部7は、文書生成処理を制御する制御部である。制御部7は、読取制御部7a、文字領域抽出部7b、文字認識処理部7c、翻訳処理部7d、統一度判定部7e、ルビ設定部7f、画像形式変換処理部7g、ルビ付き文書データ生成部7h、印刷制御部7iを有する。
読取制御部7aは、画像読取部4を制御して、紙の文書の画像を読み取り、読み取った画像の画像データを生成する制御部である。読取制御部7aは、生成した画像データを記憶部6に文書画像データ6cとして記憶する。
文字領域抽出部7bは、記憶部6から文書画像データ6cを読み出して、読み出した文書画像データ6cのレイアウト解析を行い、文字がある領域を抽出する処理部である。文字認識処理部7cは、文字領域抽出部7bにより抽出された領域に含まれる文字を認識する処理部である。この文字認識処理部7cは、文字認識の結果を文字認識結果データ6dとして記憶部6に記憶する。また、文字認識処理部7cは、文字領域抽出部7bにより抽出された各文字領域について、文字サイズの平均値や行間隔の平均値を算出し、算出した結果を各文字領域の座標、開始文字番号、文字数、行数の情報とともに、文書レイアウトデータ6eとして記憶部6に記憶する。なお、上述したように、文字認識処理部7cは、文字領域抽出部7bにより抽出された各文字領域について、文字サイズや行間隔の平均値を求める方法以外の方法で文字サイズや行間隔の代表値を設定し、その結果を各文字領域の座標、開始文字番号、文字数、行数の情報とともに、文書レイアウトデータ6eとして記憶部6に記憶することとしてもよい。
翻訳処理部7dは、文字認識結果データ6dとして記憶された文字認識結果の情報を記憶部6から読み出し、読み出した情報を用いて、画像データに含まれる単語や連語の翻訳を実行する処理部である。この翻訳処理部7dは、記憶部6に記憶された翻訳用辞書データ6aを読み出し、読み出した翻訳用辞書データ6aに登録されている言語の文法や、単語や連語の訳などの情報を参照して、翻訳を実行する。
統一度判定部7eは、記憶部6に記憶された文字認識結果データ6dを読み出し、読み出した文字認識結果データ6dを用いて、ルビを付す文書のレイアウトの統一度を判定する処理部である。具体的には、統一度判定部7eは、文字認識結果データ6dに含まれる文字サイズの情報を用いて、ルビを付す文書が、文字の大きさがほぼ揃った文書か否かを判定する。
図4は、文字の大きさがほぼ揃った文書10の一例を示す図である。図5は、文字の大きさが揃っていない文書20の一例を示す図である。図4に示す文書10には、3つの文字領域10a〜10cが、図5に示す文書20には、7つの文字領域20a〜20gがある。この場合、図3に示した文書レイアウトデータ6eには、各文字領域10a〜10c、20a〜20gについての情報が記憶される。また、図4、5において、「○」は文書10、20に含まれる文字を表し、「○」の大きさは各文字の大きさを表す。図4に示す文書10では、各文字領域10a〜10cの文字の大きさがほぼ揃っている。一方、図5に示す文書20では、各文字領域20a〜20gの文字の大きさが揃っていない。
統一度判定部7eは、文字の大きさの分散値を算出することにより、文字の大きさがほぼ揃った文書か否かを判定する。この分散値は文書のレイアウトの統一度に対応するものであり、分散値が所定の値よりも小さいことは、統一度が所定の値よりも高いことに相当し、分散値が所定の値よりも小さくないことは、統一度が所定の値よりも高くないことに相当する。
図1の説明に戻ると、ルビ設定部7fは、文字認識結果データ6dや文書レイアウトデータ6eを参照して、単語や連語の近傍にルビとして表示される訳の文字の大きさや配置を設定する処理部である。図4に示す文書10では文字の大きさがほぼ揃っているので、ルビ設定部7fは、文書に付すルビの文字の大きさを統一し、文字の大きさを一定の大きさに設定する。一方、図5に示す文書20では文字の大きさが揃っていないので、ルビ設定部7fは、単語あるいは連語に含まれる文字の大きさと行間隔に応じてルビの文字の大きさを変化させる。
図1の説明に戻ると、画像形式変換処理部7gは、画像データのファイル形式を所定の形式に変換する処理部である。例えば、画像形式変換処理部7gは、画像データのファイル形式をJPEG(Joint Photographic Experts Group)形式に変換する。
ルビ付き文書データ生成部7hは、画像読取部4により読み取られた文書の画像データに含まれる単語や連語にルビとして訳を付した文書データを、PDF形式で生成する処理部である。具体的には、ルビ付き文書データ生成部7hは、ルビ設定部7fにより設定されたルビのサイズや配置の情報に基づいてルビの画像を生成し、生成したルビの画像と画像形式変換処理部7gによりファイル形式が変換された画像データとを合成することにより、文書データを生成する。このルビ付き文書データ生成部7hは、生成した文書データを記憶部6にルビ付き文書データ6fとして記憶する。
このように、ルビ付き文書データ生成部7hは、読み取られた文書の画像データにルビの画像を合成するので、読み取られた文書のレイアウトが損なわれることがなく、文書に含まれる単語や連語にルビを適切に付すことができる。また、広く普及しているPDF形式でルビ付き文書を生成することにより、紙媒体への印刷やさまざまなOS(Operating System)の下で稼働するコンピュータでの閲覧ができるようになり、適切なサイズおよび配置でルビが付されたルビ付き文書を容易に利用することができる。
印刷制御部7iは、記憶部6eからルビ付き文書データ6fを読み出し、印刷処理部5を制御して、読み出したルビ付き文書データ6fの印刷を行う処理部である。
つぎに、本発明の実施形態に係る文書生成処理の処理手順について説明する。図6は、本発明の実施形態に係る文書生成処理の処理手順の一例を示すフローチャートである。
図6に示すように、まず、文書生成装置1の画像読取部4は、文書画像の読み取りを実行する(ステップS101)。そして、読取制御部7aは、画像読取部4が読み取った画像の画像データを生成する(ステップS102)。
その後、文字領域抽出部7bは、読取制御部7aにより生成された画像データから文字を含む文字領域を抽出する(ステップS103)。そして、文字認識処理部7cは、文字領域抽出部7bにより抽出された文字領域に含まれる文字を認識する文字認識処理を実行する(ステップS104)。続いて、翻訳処理部7dは、文字認識処理部7cにより認識された文字により構成される単語や連語の訳を生成する翻訳処理を実行する(ステップS105)。
そして、ルビ設定部7fは、翻訳処理により得られた訳をルビとして表示する際の、文字の大きさや配置を設定する処理を行う(ステップS106)。この設定処理については後に詳しく説明する。
その後、ルビ設定部7fは、ルビとして付される文字の文字コード、文字の大きさ、配置、文字の傾き、文字フォントの種類などのルビの設定情報を所定のデータ形式で生成する(ステップS107)。ここで、所定のデータ形式とは、ルビ付き画像データを生成するために適したデータ形式である。たとえば、ルビ付き画像データをPDF形式で生成する場合には、ルビの設定情報もPDF形式に適合するデータ形式で生成される。また、文字の傾きや文字フォントの種類は、ユーザからそれらの情報の入力を受け付けることにより設定される。
続いて、画像形式変換処理部7gは、ルビが付される画像データのファイル形式を所定の形式に変換する(ステップS108)。ここで、所定のデータ形式とは、例えば、JPEG形式である。
その後、ルビ付き文書データ生成部7hは、ルビ設定部7fにより生成されたルビ設定情報を用いて、画像形式変換処理部7gによりファイル形式が変換された画像データにルビを付し、ルビ付き画像データをPDF形式で生成する(ステップS109)。そして、印刷処理部5は、ルビ付き文書データ生成部7hにより生成されたルビ付き画像データを印刷し(ステップS110)、この文書生成処理を終了する。
つぎに、図6に示したルビ設定処理の処理手順について説明する。図7は、図6に示したルビ設定処理の処理手順の一例を示すフローチャートである。
図7に示すように、まず、文書生成装置1の統一度判定部7eは、文字サイズの分散値の算出用パラメータを取得する(ステップS201)。具体的には、統一度判定部7eは、各文字のサイズの情報、文字数の情報、行数の情報を記憶部6に記憶された文字認識結果データ6dから取得する。ここで、行数の情報は、図2に示した文字認識結果データ6dの行内位置情報において、行頭の文字を表す番号「1」の数を数えることにより得ることができる。統一度判定部7eは、文書レイアウトデータ6eに記憶された各文字領域における行数を足し合わせることにより、行数の情報を取得することとしてもよい。
そして、統一度判定部7eは、行ごとに平均化された文字サイズの分散値を算出する(ステップS202)。具体的には、統一度判定部7eは、行i(1≦i≦n、nは行数)の平均文字サイズSiを、
Si=sum(Sji)/mi
により算出する。ここで、Sjiは行iに含まれる文字j(1≦j≦mi)のサイズであり、miは行iに含まれる文字の個数であり、sum(Sji)は、行iに含まれる各文字のサイズSji(1≦j≦mi)の総和である。
また、統一度判定部7eは、各行iの平均文字サイズSiの平均値Savを
Sav=sum(Si)/n
により算出する。ここで、sum(Si)は、各行iの平均文字サイズSiの総和(1≦i≦n)である。
そして、統一度判定部7eは、各行iの平均文字サイズSiの分散値Vsを、
Vs=sum((Sav−Si)^2)/n
により算出する。ここで、(Sav−Si)^2は、Sav−Siの2乗を示し、sum((Sav−Si)^2)は、値(Sav−Si)^2の総和(1≦i≦n)である。
その後、統一度判定部7eは、分散値Vsが所定の閾値VsT以上であるか否かを調べる(ステップS203)。図8は、分散値Vsが所定の閾値VsT以上である場合の文字サイズ分布の一例を示す図であり、図9は、分散値Vsが所定の閾値VsT未満である場合の文字サイズ分布の一例を示す図である。
図8に示すように、分散値Vsが所定の閾値VsT以上である場合(ステップS203においてYESの場合)、ルビ設定部7fは、ルビサイズを統一しない場合のルビサイズ・配置設定処理を実行し(ステップS204)、このルビ設定処理を終了する。ルビサイズを統一しない場合のルビサイズ・配置設定処理については後に詳しく説明する。
図9に示すように、分散値Vsが所定の閾値VsT以上でない場合(ステップS203においてNOの場合)、ルビ設定部7fは、ルビサイズを統一する場合のルビサイズ・配置設定処理を実行し(ステップS205)、このルビ設定処理を終了する。ルビサイズを統一する場合のルビサイズ・配置設定処理についても後に詳しく説明する。このように分散値を用いると、文書のレイアウトの統一度の判定を容易におこなうことができるようになる。また、分散値Vsを算出するのに各行i(1≦i≦n)の平均文字サイズSiを用いることとしたので、各行の特徴を重視してレイアウトの統一度の判定を行うことができる。
なお、ここでは、統一度判定部7eが、平均文字サイズSiを一旦算出し、算出した平均文字サイズSiを用いて分散値Siを算出することとしたが、平均文字サイズSiを算出することなく、文字サイズの分散値を算出することとしてもよい。これにより、分散値の算出を容易に行うことができる。
具体的には、統一度判定部7eは、文字サイズの分散値Vs1を
Vs1=sum((Sav1−Sq)^2)/p
により算出する。ここで、pは、文書に含まれる文字の総数であり、Sq(1≦q≦p)は、各文字のサイズであり、Sav1は、文字サイズSq(1≦q≦p)の平均値であり、(Sav1−Sq)^2は、Sav1−Sqの2乗であり、sum((Sav1−Sq)^2)は、値(Sav1−Sq)^2の総和(1≦q≦p)である。
また、文書中に複数の文字領域がある場合には、文字領域ごとに平均文字サイズを算出し、算出した平均文字サイズの分散値を算出することとしてもよい。これにより、各文字領域の特徴を重視してレイアウトの統一度の判定を行うことができる。
具体的には、統一度判定部7eは、文字サイズの分散値Vs2を
Vs2=sum((Sav2−St)^2)/s
により算出する。ここで、sは、文書に含まれる文字領域の数であり、St(1≦t≦s)は、各文字領域sにおける文字サイズの平均値であり、Sav2は、値St(1≦t≦s)の平均値であり、(Sav2−St)^2は、Sav2−Stの2乗であり、sum((Sav2−St)^2)は、値(Sav2−St)^2の総和(1≦t≦s)である。
そして、ルビ設定部7fは、分散値Vs1あるいはVs2が所定の閾値以上である場合に、ルビサイズを統一しない場合のルビサイズ・配置設定処理を実行し、分散値Vs1あるいは分散値Vs2が所定の閾値以上でない場合に、ルビサイズを統一する場合のルビサイズ・配置設定処理を実行する。
さらに、ここでは、統一度判定部7eが、文字サイズの分散値を算出することにより、ルビサイズを統一するか否かの判定をすることとしたが、統一度判定部7eが、文書の行間隔や各行に含まれる文字の数の分散値を算出することにより、ルビサイズを統一するか否かの判定をすることとしてもよい。
この場合、文書の行間隔の分散値VIは
VI=sum((Iav−Ii)^2)/(n−1)
を用いて算出される。ここで、Iiは、行i(1≦i≦n−1)と行i+1との間の間隔であり、Iavは、行間隔Iiの平均値
Iav=sum(Ii)/(n−1)
(ここで、sum(Ii)は、行間隔Iiの総和(1≦i≦n−1))であり、(Iav−Ii)^2は、Iav−Iiの2乗であり、sum((Iav−Ii)^2)は、値(Iav−Ii)^2の総和(1≦i≦n−1)である。
また、各行に含まれる文字の数の分散値VNは
VN=sum((Nav−Ni)^2)/n
を用いて算出される。ここで、nは、文書に含まれる行の数であり、Niは、各行i(1≦i≦n)に含まれる文字の数であり、Navは、文字の数Niの平均値
Nav=sum(Ni)/n
(ここで、sum(Ni)は、文字の数Niの総和(1≦i≦n))であり、(Nav−Ni)^2は、Nav−Niの2乗であり、sum((Nav−Ni)^2)は、値(Nav−Ni)^2の総和(1≦i≦n)である。
そして、ルビ設定部7fは、分散値VIあるいはVNが所定の閾値以上である場合に、ルビサイズを統一しない場合のルビサイズ・配置設定処理を実行し、分散値VIあるいは分散値VNが所定の閾値以上でない場合に、ルビサイズを統一する場合のルビサイズ・配置設定処理を実行する。このように、文書の行間隔や各行に含まれる文字の数などの分散を用いることにより、文書のレイアウトの統一度の判定を柔軟に行うことができる。
また、図7では、統一度判定部7eは、文字サイズの分散値を算出することにより文書に含まれる文字の大きさがほぼ揃っているか否かを判定したが、文書に含まれる文字の大きさがほぼ揃っているか否かについての情報の入力をユーザから受け付けることにより上記判定を行うこととしてもよい。これにより、ルビの表示にユーザの意図をより的確に反映することができる。
さらに、ここでは、文書が1ページの文書である場合について説明したが、文書が複数のページからなる文書であっても、複数のページ全体に対して文字サイズや各行の間隔、各行の文字数の平均値を算出し、複数のページ全体に対する文字サイズや各行の間隔、各行の文字数の分散値を算出することにより、複数のページからなる文書のレイアウトの統一度を判定し、ルビサイズを統一するか否かを判定することとしてもよい。
つぎに、図7に示したルビサイズを統一しない場合のルビサイズ・配置設定処理の処理手順について説明する。図10〜図17は、ルビサイズを統一しない場合のルビサイズ・配置設定処理の処理手順の一例を示すフローチャートである。また、図18は、以降の説明で用いられる各種の変数について説明する図である。
図18には、単語「color」の訳としてルビ「色」が付され、連語「identified as」の訳としてルビ「〜が〜であると認識する」が付され、単語「vermilion」の訳としてルビ「橙」が付された状態が示されている。単語あるいは連語には、番号が割り振られる。以下では、k番目の単語あるいは連語を単語kあるいは連語kと呼び(1≦k≦N,Nは、ルビのサイズおよび配置が設定される単語あるいは連語の数)、単語kあるいは連語kに付されるルビをルビr(k)と呼ぶ。
ここで、X(k−1)、X(k)、X(k+1)は、それぞれ単語k−1あるいは連語k−1、単語kあるいは連語k、単語k+1あるいは連語k+1の最初の文字に外接する矩形領域の左端のX座標である(以下、単語あるいは連語の左端のX座標と呼ぶ。)。L(k−1)、L(k)、L(k+1)は、それぞれ単語k−1あるいは連語k−1、単語kあるいは連語k、単語k+1あるいは連語k+1の最初の文字に外接する矩形領域の左端のX座標と、最後の文字に外接する矩形領域の右端のX座標との差(以下、単語あるいは連語の長さと呼ぶ。)である。Lgは、単語間、連語間、あるいは単語と連語との間に設けられる空白の幅である。
また、Xr(k−1)、Xr(k)、Xr(k+1)は、それぞれ単語k−1あるいは連語k−1、単語kあるいは連語k、単語k+1あるいは連語k+1に対応するルビの最初の文字に外接する矩形領域の左端のX座標(以下、ルビの左端のX座標と呼ぶ。)である。Lr(k−1)、Lr(k)、Lr(k+1)は、それぞれ単語k−1あるいは連語k−1、単語kあるいは連語k、単語k+1あるいは連語k+1に対応するルビの最初の文字に外接する矩形領域の左端のX座標と、最後の文字に外接する矩形領域の右端のX座標との差(以下、ルビの長さと呼ぶ。)である。
図10に示すように、まず、文書生成装置1のルビ設定部7fは、ルビの文字サイズを設定する(ステップS301)。具体的には、ルビ設定部7fは、単語あるいは連語の行間隔と、単語あるいは連語に含まれる文字のフォントの縦方向の長さとを比較する。
そして、行間隔が文字のフォントの縦方向の長さの40%に満たないときは、ルビ設定部7fは、ルビとして付される文字のフォントの縦方向の長さが、単語あるいは連語に含まれる文字のフォントの縦方向の長さの40%となるよう、ルビとして付される文字のサイズを設定する。行間間隔が文字のフォントの縦方向の長さの80%を超えるときは、ルビ設定部7fは、ルビとして付される文字のフォントの縦方向の長さが、単語あるいは連語に含まれる文字のフォントの縦方向の長さの80%となるよう、ルビとして付される文字のサイズを設定する。また、行間隔が文字のフォントの縦方向の長さの40〜80%であるときは、ルビ設定部7fは、ルビとして付される文字のフォントの縦方向の長さが行間隔と同じ長さとなるよう、ルビとして付される文字のサイズを設定する。なお、この設定方法において、40%、80%とは別の閾値が用いられることとしてよい。
続いて、ルビ設定部7fは、ルビの左端のX座標Xr(k)(1≦k≦N)を設定する(ステップS302)。具体的には、ルビ設定部7fは、ルビの左端のX座標Xr(k)を単語あるいは連語の左端のX座標X(k)に設定する。
そして、ルビ設定部7fは、ルビの長さLr(k)(1≦k≦N)を算出する(ステップS303)。具体的には、ルビ設定部7fは、ルビr(k)に含まれる文字の幅と、文字間に設けられる空白の幅、文字の数の情報から、ルビr(k)の長さLr(k)を算出する。その後、ルビ設定部7fは、単語あるいは連語の識別番号kを1に設定する(ステップS304)。
続いて、ルビ設定部7fは、単語kあるいは連語kの長さL(k)が、ルビr(k)の長さLr(k)よりも短いか否かを判定する(ステップS305)。長さL(k)が長さLr(k)よりも短くない場合(ステップS305においてNOの場合)、単語kあるいは連語kの下部にルビr(k)を横方向に縮小することなく配置することが可能であるので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS306)。ここで、圧縮率c(k)とは、ルビr(k)を配置する十分なスペースが無い場合に、ルビを横方向に縮小するために用いられる値である。ルビr(k)を配置する十分なスペースが無い場合、ルビr(k)は、長さがLr(k)/c(k)に修正され、修正された長さで配置される。
その後、図17に示されるように、ルビ設定部7fは、ルビr(k)の下端のY座標を設定する(ステップS1007)。具体的には、ルビ設定部7fは、行間の中央部分にルビr(k)が配置されるように、ルビr(k)の下端のY座標を設定する。単語kあるいは連語kが最下行である場合には、ルビ設定部7fは、単語kあるいは連語kとルビr(k)との間の間隔が、その上にある行における間隔と同じ間隔となるようルビr(k)の下端のY座標を設定する。行が1行しかない場合は、ルビ設定部7fは、単語kあるいは連語kとルビr(k)との間に所定の間隔が空くように、ルビr(k)の下端のY座標を設定する。
あるいは、ルビ設定部7fは、単語kあるいは連語kの下端のY座標からルビr(k)を表示するフォントの高さ方向のサイズの分だけ下にずれた位置をルビr(k)の下端のY座標として設定することとしてもよい。
そして、ルビ設定部7fは、kがNであるか否かを調べる(ステップS1008)。kがNである場合(ステップS1008においてYESの場合)、ルビサイズを統一しない場合のルビサイズ・配置設定処理を終了する。kがNでない場合(ステップS1008においてNOの場合)、ルビ設定部7fは、kを1だけ増やし(ステップS1009)、図10のステップS305に移行して、その後の処理を継続する。
図10のステップS305において、長さL(k)が長さLr(k)よりも短い場合(ステップS305においてYESの場合)、単語あるいは連語kの下部にルビr(k)を配置するにはルビr(k)を横方向に縮小する必要があるので、ルビ設定部7fは、ルビの圧縮率c(k)を単語kあるいは連語kの長さに対するルビr(k)の長さの比Lr(k)/L(k)に設定する(ステップS307)。
そして、ルビ設定部7fは、圧縮率c(k)が所定の閾値よりも大きいか否かを判定する(ステップS308)。この閾値は、ルビr(k)の文字サイズが必要以上に小さくなり、ルビr(k)の読み易さが悪化するのを抑制するために設定される値である。圧縮率c(k)が所定の閾値よりも大きくない場合(ステップS308においてNOの場合)、図17のステップS1007に移行し、ルビ設定部7fは、それ以降の処理を継続する。
図10のステップS308において、圧縮率c(k)が所定の閾値よりも大きい場合(ステップS308においてYESの場合)、ルビ設定部7fは、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)が無いか否かを判定する(ステップS309)。
単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)が無い場合(ステップS309においてYESの場合)、ルビ設定部7fは、単語kあるいは連語kの長さL(k)と、単語k+1あるいは連語k+1の長さL(k+1)と、空白の幅Lgとの和L(k)+L(k+1)+Lgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS310)。
和L(k)+L(k+1)+Lgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS310においてNOの場合)、単語kあるいは連語kの下部にある部分に加えて、単語k+1あるいは連語k+1の下部にある空白部分を利用することにより、ルビr(k)を横方向に縮小することなく配置することが可能であるので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定し(ステップS306)、図17のステップS1007に移行して、それ以降の処理を継続する。
和L(k)+L(k+1)+Lgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS310においてYESの場合)、たとえ単語k+1あるいは連語k+1の下部にある空白部分を利用したとしても、横方向に縮小することなくルビr(k)を配置することはできないので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k)+L(k+1)+Lg)に再設定する(ステップS311)。
そして、ルビ設定部7fは、圧縮率c(k)が所定の閾値よりも大きいか否かを判定する(ステップS312)。圧縮率c(k)が所定の閾値よりも大きくない場合(ステップS312においてNOの場合)、図17のステップS1007に移行して、ルビ設定部7fは、その後の処理を継続する。
図10のステップS312において、圧縮率c(k)が所定の閾値よりも大きい場合(ステップS312においてYESの場合)、図11に示すように、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無いか否かを判定する(ステップS401)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無い場合(ステップS401においてYESの場合)、ルビ設定部7fは、単語k−1あるいは連語k−1の長さL(k−1)と、単語kあるいは連語kの長さL(k)と、単語k+1あるいは連語k+1の長さL(k+1)と、2つの空白の幅2Lgとの和L(k−1)+L(k)+L(k+1)+2Lgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS402)。
和L(k−1)+L(k)+L(k+1)+2Lgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS402においてNOの場合)、単語kあるいは連語kの下部にある部分に加えて、単語k−1あるいは連語k−1の下部にある空白部分、および、単語k+1あるいは連語k+1の下部にある空白部分を利用することにより、ルビr(k)を横方向に縮小することなく配置することが可能であるので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS403)。
そして、ルビ設定部7fは、単語kあるいは連語kの中央の下部にルビr(k)が配置されるようにするため、A=X(k)+L(k)/2−Lr(k)/2を算出する(ステップS404)。ルビr(k)の左端のX座標Xr(k)をAに設定することにより、単語kあるいは連語kの中央のX座標と、ルビr(k)の中央のX座標とを一致させることができる。
その後、ルビ設定部7fは、Aの値に応じて、ルビr(k)の左端のX座標Xr(k)を設定する(ステップS405)。具体的には、ルビ設定部7fは、Aが単語k−1あるいは連語k−1の左端のX座標X(k−1)よりも小さい場合、Xr(k)をX(k−1)に設定する。また、ルビ設定部7fは、Aが、X(k−1)以上で、X(k+1)+L(k+1)−Lr(k)未満である場合、Xr(k)をAに設定する。また、ルビ設定部7fは、Aが、X(k+1)+L(k+1)−Lr(k)以上である場合、Xr(k)をX(k+1)+L(k+1)−Lr(k)に設定する。
その後、図17のステップS1007に移行し、ルビ設定部7fは、それ以降の処理を継続する。
図11のステップS402において、和L(k−1)+L(k)+L(k+1)+2Lgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS402においてYESの場合)、たとえ単語k−1あるいは連語k−1の下部にある空白部分、および、単語k+1あるいは連語k+1の下部にある空白部分を利用したとしても、ルビr(k)を横方向に縮小することなく配置することができないので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k−1)+L(k)+L(k+1)+2Lg)に設定する(ステップS406)。
そして、ルビ設定部7fは、ルビr(k)の左端のX座標Xr(k)をX(k−1)に設定する(ステップS407)。その後、図17のステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図11のステップS401において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無いという条件が満たされない場合(ステップS401においてNOの場合)、図12に示すように、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たすか否かを判定する(ステップS501)。
ここで、Lrgは、ルビの配置位置を設定する場合にルビ間に設けるべき空白の幅の最小値である。すなわち、式Lr(k−1)<L(k−1)−Lrgは、単語k−1あるいは連語k−1の下部に、ルビr(k−1)およびルビ間に設けるべき空白を配置したとしても、依然としてルビr(k)を配置するために使用可能な領域が残っているということを示している。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たす場合(ステップS501においてYESの場合)、ルビ設定部7fは、和L(k−1)+L(k)+L(k+1)+2Lgから、ルビr(k−1)の長さLr(k−1)、および、ルビ間に設けるべき空白の幅の最小値Lrgを差し引いた値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS502)。
値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS502においてNOの場合)、単語kあるいは連語kの下部にある部分に加えて、単語k−1あるいは連語k−1の下部の一部にある空白部分、および、単語k+1あるいは連語k+1の下部にある空白部分を利用することにより、ルビr(k)を横方向に縮小することなく配置することが可能であるので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS503)。
そして、ルビ設定部7fは、A=X(k)+L(k)/2−Lr(k)/2を算出する(ステップS504)。続いて、ルビ設定部7fは、Aの値に応じて、ルビr(k)の左端のX座標Xr(k)を設定する(ステップS505)。具体的には、ルビ設定部7fは、値Aが、X(k−1)+Lr(k−1)+Lrgよりも小さい場合、Xr(k)をX(k−1)+Lr(k−1)+Lrgに設定する。また、ルビ設定部7fは、値Aが、X(k−1)+Lr(k−1)+Lrg以上で、X(k+1)+L(k+1)−Lr(k)未満である場合、Xr(k)をAに設定する。また、ルビ設定部7fは、値Aが、X(k+1)+L(k+1)−Lr(k)以上である場合、Xr(k)をX(k+1)+L(k+1)−Lr(k)に設定する。
その後、図17のステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図12のステップS502において、値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS502においてYESの場合)、たとえ単語k−1あるいは連語k−1の下部の一部にある空白部分、および、単語k+1あるいは連語k+1の下部にある空白部分を利用したとしても、ルビr(k)を横方向に縮小することなく配置することができないので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lrg)に設定する(ステップS506)。
そして、ルビ設定部7fは、ルビr(k)の左端のX座標Xr(k)をX(k−1)+Lr(k−1)+Lrgに設定する(ステップS507)。その後、図17のステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図12のステップS501において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たさない場合(ステップS501においてNOの場合)、図17のステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図10のステップS309において、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)が無いという条件が満たされない場合(ステップS309においてNOの場合)、図13に示すように、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無いか否かを判定する(ステップS601)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無い場合(ステップS601においてYESの場合)、ルビ設定部7fは、単語k−1あるいは連語k−1の長さL(k−1)と、単語kあるいは連語kの長さL(k)と、空白の幅Lgとの和L(k−1)+L(k)+Lgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS602)。
和L(k−1)+L(k)+Lgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS602においてNOの場合)、単語kあるいは連語kの下部にある部分に加えて、単語k−1あるいは連語k−1の下部にある空白部分を利用することにより、ルビr(k)を横方向に縮小することなく配置することが可能であるので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS603)。
そして、ルビ設定部7fは、ルビr(k)の左端のX座標Xr(k)をX(k)+L(k)−Lr(k)に設定する(ステップS604)。その後、図17のステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図13のステップS602において、和L(k−1)+L(k)+Lgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS602においてYESの場合)、たとえ単語k−1あるいは連語k−1の下部にある空白部分を利用したとしても、ルビr(k)を横方向に縮小することなく配置することはできないので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k−1)+L(k)+Lg)に再設定する(ステップS605)。
そして、ルビ設定部7fは、圧縮率c(k)が所定の閾値よりも大きいか否かを判定する(ステップS606)。圧縮率c(k)が所定の閾値よりも大きくない場合(ステップS606においてNOの場合)、図17のステップS1007に移行して、ルビ設定部7fは、その後の処理を継続する。
図13のステップS606において、圧縮率c(k)が所定の閾値よりも大きい場合(ステップS606においてYESの場合)、ルビ設定部7fは、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たすか否かを判定する(ステップS607)。式Lr(k+1)<L(k+1)−Lrgは、単語k+1あるいは連語k+1の下部に、ルビr(k+1)およびルビ間に設けるべき空白を配置したとしても、依然としてルビr(k)を配置するために使用可能な領域が残っているということを示している。
単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たす場合(ステップS607においてYESの場合)、図14に示すように、ルビ設定部7fは、和L(k−1)+L(k)+L(k+1)+2Lgから、ルビr(k+1)の長さLr(k+1)、および、ルビ間に設けるべき空白の幅の最小値Lrgを差し引いた値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS701)。
値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS701においてNOの場合)、単語kあるいは連語kの下部にある部分に加えて、単語k−1あるいは連語k−1の下部にある空白部分、および、単語k+1あるいは連語k+1の下部の一部にある空白部分を利用することにより、ルビr(k)を横方向に縮小することなく配置することが可能であるので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS702)。
そして、ルビ設定部7fは、A=X(k)+L(k)/2−Lr(k)/2を算出する(ステップS703)。続いて、ルビ設定部7fは、Aの値に応じて、ルビr(k)の左端のX座標Xr(k)、および、ルビr(k+1)の左端のX座標Xr(k+1)を設定する(ステップS704)。
具体的には、ルビ設定部7fは、値Aが、X(k−1)よりも短い場合、Xr(k)をX(k−1)に設定し、Xr(k+1)をXr(k)+Lr(k)+Lrgに設定する。また、ルビ設定部7fは、値Aが、X(k−1)以上で、X(k+1)+L(k+1)−Lr(k+1)−Lrg−Lr(k)未満である場合、Xr(k)をAに設定し、Xr(k+1)をXr(k)+Lr(k)+Lrgに設定する。また、ルビ設定部7fは、値Aが、X(k+1)+L(k+1)−Lr(k+1)−Lrg−Lr(k)以上である場合、Xr(k)をX(k+1)+L(k+1)−Lr(k+1)−Lrg−Lr(k)に設定し、Xr(k+1)をXr(k)+Lr(k)+Lrgに設定する。
その後、図17のステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図14のステップS701において、値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS701においてYESの場合)、たとえ単語k−1あるいは連語k−1の下部にある空白部分、および、単語k+1あるいは連語k+1の下部の一部にある空白部分を利用したとしても、ルビr(k)を横方向に縮小することなく配置することができないので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k−1)+L(k)+L(k+1)+2Lg−Lr(k+1)−Lrg)に設定する(ステップS705)。
そして、ルビ設定部7fは、ルビr(k)の左端のX座標Xr(k)をX(k−1)に設定し、ルビr(k+1)の左端のX座標Xr(k+1)をXr(k)+Lr(k)+Lrgに設定する(ステップS706)。その後、図17のステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図13のステップS601において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無いという条件が満たされない場合(ステップS601においてNOの場合)、図15に示すように、ルビ設定部7fは、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たすか否かを判定する(ステップS801)。
単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たす場合(ステップS801においてYESの場合)、ルビ設定部7fは、和L(k)+L(k+1)+Lgから、ルビr(k+1)の長さLr(k+1)、および、ルビ間に設けるべき空白の幅の最小値Lrgを差し引いた値L(k)+L(k+1)+Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS802)。
値L(k)+L(k+1)+Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS802においてNOの場合)、単語kあるいは連語kの下部にある部分に加えて、単語k+1あるいは連語k+1の下部の一部にある空白部分を利用することにより、ルビr(k)を横方向に縮小することなく配置することが可能であるので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS803)。
そして、ルビ設定部7fは、ルビr(k+1)の左端のX座標Xr(k+1)をX(k)+Lr(k)+Lrgに設定する(ステップS804)。その後、図17のステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図19は、単語k+1あるいは連語k+1の下部の一部にある空白部分を利用するルビの配置の一例について説明する図である。図19は、図15のステップS802においてNOと判定された場合のルビr(k)の配置例であり、ルビr(k)は横方向に縮小されることなく配置され、ルビr(k+1)はルビr(k)とLrgの間隔を空けて配置される。
図15のステップS802において、値L(k)+L(k+1)+Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS802においてYESの場合)、たとえ単語k+1あるいは連語k+1の下部の一部にある空白部分を利用したとしても、ルビr(k)を横方向に縮小することなく配置することができないので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k)+L(k+1)+Lg−Lr(k+1)−Lrg)に設定する(ステップS805)。
そして、ルビ設定部7fは、圧縮率c(k)が所定の閾値よりも大きいか否かを判定する(ステップS806)。圧縮率c(k)が所定の閾値よりも大きくない場合(ステップS806においてNOの場合)、ルビ設定部7fは、ルビr(k+1)の左端のX座標Xr(k+1)をX(k+1)+L(k+1)−Lr(k+1)に設定する(ステップS807)。その後、図17のステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図20は、単語k+1あるいは連語k+1の下部の一部にある空白部分を利用するルビの配置の一例について説明する図である。図20は、図15のステップS802においてYESと判定され、ステップS806においてNOと判定された場合のルビr(k)の配置例であり、ルビr(k)は圧縮率c(k)だけ横方向に縮小されて配置され、ルビr(k+1)は左端のX座標が単語k+1あるいは連語k+1の左端のX座標と一致するよう配置される。
図15のステップS806において、圧縮率c(k)が所定の閾値よりも大きい場合(ステップS806においてYESの場合)、図16に示すように、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たすか否かを判定する(ステップS901)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たす場合(ステップS901においてYESの場合)、ルビ設定部7fは、和L(k−1)+L(k)+L(k+1)+2Lgから、ルビr(k−1)の長さLr(k−1)、ルビr(k+1)の長さLr(k+1)、および、ルビ間に設けるべき2つの空白の幅の最小値2Lrgを差し引いた値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lr(k+1)−2Lrgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS902)。
値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lr(k+1)−2Lrgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS902においてNOの場合)、単語kあるいは連語kの下部にある部分に加えて、単語k−1あるいは連語k−1の下部の一部にある空白部分、および、単語k+1あるいは連語k+1の下部の一部にある空白部分を利用することにより、ルビr(k)を横方向に縮小することなく配置することが可能であるので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS903)。
そして、ルビ設定部7fは、A=X(k)+L(k)/2−Lr(k)/2を算出する(ステップS904)。続いて、ルビ設定部7fは、Aの値に応じて、ルビr(k)の左端のX座標Xr(k)、および、ルビr(k+1)の左端のX座標Xr(k+1)を設定する(ステップS905)。
具体的には、ルビ設定部7fは、値Aが、X(k−1)+Lr(k−1)+Lrgよりも小さい場合、Xr(k)をX(k−1)+Lr(k−1)+Lrgに設定し、Xr(k+1)をXr(k)+Lr(k)+Lrgに設定する。また、ルビ設定部7fは、値Aが、X(k−1)+Lr(k−1)+Lrg以上で、X(k+1)+L(k+1)−Lr(k+1)−Lrg−Lr(k)未満である場合、Xr(k)をAに設定し、Xr(k+1)をXr(k)+Lr(k)+Lrgに設定する。また、ルビ設定部7fは、値Aが、X(k+1)+L(k+1)−Lr(k+1)−Lrg−Lr(k)以上である場合、Xr(k)をX(k+1)+L(k+1)−Lr(k+1)−Lrg−Lr(k)に設定し、Xr(k+1)をXr(k)+Lr(k)+Lrgに設定する。
その後、図17のステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図21は、単語k−1あるいは連語k−1の下部の一部にある空白部分、および、単語k+1あるいは連語k+1の下部の一部にある空白部分を利用するルビの配置の一例について説明する図である。図21は、図16のステップS902においてNOと判定された場合のルビr(k)の配置例であり、ルビr(k)は横方向に縮小されることなく配置され、ルビr(k+1)はルビr(k)とLrgの間隔を空けて配置される。
図16のステップS902において、値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lr(k+1)−2Lrgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS902においてYESの場合)、たとえ単語k−1あるいは連語k−1の下部の一部にある空白部分、および、単語k+1あるいは連語k+1の下部の一部にある空白部分を利用したとしても、ルビr(k)を横方向に縮小することなく配置することができないので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lr(k+1)−2Lrg)に設定する(ステップS906)。
そして、ルビ設定部7fは、ルビr(k)の左端のX座標Xr(k)をX(k−1)+Lr(k−1)+Lrgに設定し、ルビr(k+1)の左端のX座標Xr(k+1)をX(k+1)+L(k+1)−Lr(k+1)に設定する(ステップS907)。その後、図17のステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図16のステップS901において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たさない場合(ステップS901においてNOの場合)、図17のステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図15のステップS801において、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たさない場合(ステップS801においてNOの場合)、図17に示すように、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たすか否かを判定する(ステップS1001)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たす場合(ステップS1001においてYESの場合)、ルビ設定部7fは、和L(k−1)+L(k)+Lgから、ルビr(k−1)の長さLr(k−1)、および、ルビ間に設けるべき空白の幅の最小値Lrgを差し引いた値L(k−1)+L(k)+Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS1002)。
値L(k−1)+L(k)+Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS1002においてNOの場合)、単語kあるいは連語kの下部にある部分に加えて、単語k−1あるいは連語k−1の下部の一部にある空白部分を利用することにより、ルビr(k)を横方向に縮小することなく配置することが可能であるので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS1003)。
そして、ルビ設定部7fは、ルビr(k)の左端のX座標Xr(k)をX(k)+L(k)−Lr(k)に設定する(ステップS1004)。続いて、ステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図22は、単語k−1あるいは連語k−1の下部の一部にある空白部分を利用するルビの配置の一例について説明する図である。図22は、図17のステップS1002においてNOと判定された場合のルビr(k)の配置例であり、ルビr(k)は横方向に縮小されることなく配置され、ルビr(k)はルビr(k−1)とLrg以上の間隔を空けて配置される。
図17のステップS1002において、値L(k−1)+L(k)+Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS1002においてYESの場合)、たとえ単語k−1あるいは連語k−1の下部の一部にある空白部分を利用したとしても、ルビr(k)を横方向に縮小することなく配置することができないので、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k−1)+L(k)+Lg−Lr(k−1)−Lrg)に設定する(ステップS1005)。
そして、ルビ設定部7fは、ルビr(k)の左端のX座標Xr(k)をX(k−1)+Lr(k−1)+Lrgに設定する(ステップS1006)。続いて、ステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
図23は、単語k−1あるいは連語k−1の下部の一部にある空白部分を利用するルビの配置の一例について説明する図である。図23は、図17のステップS1002においてYESと判定された場合のルビr(k)の配置例であり、ルビr(k)は圧縮率c(k)だけ横方向に縮小されて配置され、ルビr(k)はルビr(k−1)とLrgの間隔を空けて配置される。
図17のステップS1001において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たさない場合(ステップS1001においてNOの場合)、ステップS1007に移行し、ルビ設定部7fは、その後の処理を継続する。
以上のように、ルビ設定部7fは、圧縮率c(k)(1≦k≦N)が所定の閾値よりも大きい場合であって、単語kあるいは連語kの左隣または右隣にある単語k−1、k+1あるいは連語k−1、k+1に対してルビr(k−1)、r(k+1)を付す必要がないか、単語kあるいは連語kの左隣または右隣にある単語k−1、k+1あるいは連語k−1、k+1に対して付されるルビr(k−1)、r(k+1)の長さLr(k−1)、Lr(k+1)にルビ間に設けられる空白の幅Lrgを加えた値が、単語kあるいは連語kの左隣または右隣にある単語k−1、k+1あるいは連語k−1、k+1の長さL(k−1)、L(k+1)に比べて小さい場合に、単語kあるいは連語kの左隣または右隣にある単語k−1、k+1あるいは連語k−1、k+1の近傍の領域をルビr(k)を配置する領域として設定する。これにより、ルビr(k)の文字を極端に圧縮することなく、ルビを読み易く配置することができる。
つぎに、図7に示したルビサイズを統一する場合のルビサイズ・配置設定処理の処理手順について説明する。図24は、ルビサイズを統一する場合のルビサイズ・配置設定処理の処理手順の一例を示すフローチャートである。図24に示すように、まず、文書生成装置1のルビ設定部7fは、各文字領域の平均文字サイズの情報を、記憶部6に記憶された文書レイアウトデータ6eから取得する(ステップS1101)。
そして、ルビ設定部7fは、取得した各文字領域の平均文字サイズの平均値を算出する(ステップS1102)。続いて、ルビ設定部7fは、文書中に含まれる各単語や各連語に付されるルビの文字サイズを平均文字サイズの平均値に設定する(ステップS1103)。これにより、文書中のすべてのルビの文字サイズが統一される。その後、ルビ設定部7fは、各ルビの配置位置を設定する(ステップS1104)。
具体的には、ルビ設定部7fは、行間の中央部分にルビが配置されるように、ルビの下端のY座標を設定する。単語あるいは連語が最下行である場合には、ルビ設定部7fは、単語あるいは連語とルビとの間の間隔が、その上の行における間隔と同じ間隔となるようルビの下端のY座標を設定する。行が1行しかない場合は、ルビ設定部7fは、単語あるいは連語とルビとの間に所定の間隔が空くように、ルビの下端のY座標を設定する。あるいは、ルビ設定部7fは、単語あるいは連語の下端のY座標からルビを表示するフォントの高さ方向のサイズの分だけ下にずれた位置をルビの下端のY座標として設定することとしてもよい。
また、ルビ設定部7fは、ルビの左端のX座標を、そのルビを付す単語あるいは連語の左端のX座標と同じになるように設定する。そして、例えば、図18のように、ルビ「〜が〜であると認識する」の長さがそのルビを付す単語あるいは連語「identified as」の長さよりも長い場合であって、かつ、その前後の単語あるいは連語「color」、「vermilion」に対してルビ「色」、「橙」を付したとしても、まだルビを配置するスペースに余裕がある場合には、ルビ「〜が〜であると認識する」の左端のX座標を左右にずらす処理を行う。ステップS1104の処理の後、ルビ設定部7fは、このルビサイズ・配置設定処理を終了する。
なお、ここでは、各文字領域の平均文字サイズの平均値にルビの文字サイズを設定することとしたが、ルビの文字サイズの設定方法はこれに限定されるものではなく、他の方法によりルビの文字サイズの代表値を算出し、その代表値にルビの文字サイズを設定することとしてもよい。例えば、各文字領域に含まれる文字の数を重みとして、各文字領域の平均文字サイズの加重平均値を算出し、算出した加重平均値にルビの文字サイズを設定することとしてもよい。また、各文字領域の平均文字サイズのうち、他の平均文字サイズから所定の値以上離れた統計的な外れ値を除外して、平均値あるいは加重平均値を算出することとしてもよい。
また、文字領域ごとに算出した平均文字サイズを用いずに、改めて文章全体に含まれる文字の文字サイズの平均値を算出するなどして、ルビの文字サイズの代表値を算出し、その代表値にルビの文字サイズを設定することとしてもよい。
なお、ルビの文字サイズを統一する対象となる文書は、1ページの文書に限られるものではなく、複数のページからなる文書であってもかまわない。すなわち、複数のページ全体に対して文字サイズの分散値を算出し、その分散値が所定の閾値未満であると判定された場合に、文字サイズの平均値や加重平均値を算出し、算出した平均値あるいは加重平均値に複数のページに含まれる文字に対して付されるルビの文字サイズを設定することとしてもよい。
また、文書中のすべてのルビの文字サイズを統一する際、一旦ルビの文字サイズを単語あるいは連語の長さに合わせて設定し、設定された文字サイズの中から最小の文字サイズを選択し、すべてのルビの文字サイズをその最小の文字サイズに設定することとしてもよい。以下に、この変形例について説明することとする。
図25〜図33は、ルビサイズを統一する場合のルビサイズ・配置設定処理の処理手順の変形例を示すフローチャートである。このルビサイズ・配置設定処理では、すべてのルビr(k)(1≦k≦N)に対する圧縮率c(k)が算出され、その圧縮率で圧縮した後の文字のサイズのうち最小のものが検出される。そして、そのサイズでルビの文字サイズが統一される。これにより、文書に付されるルビが読み易いものとなる。
図25に示すように、まず、文書生成装置1のルビ設定部7fは、ルビの文字サイズを設定する(ステップS1201)。具体的には、ルビ設定部7fは、単語あるいは連語の行間隔と、単語あるいは連語に含まれる文字のフォントの縦方向の長さとを比較する。
そして、行間隔が文字のフォントの縦方向の長さの40%に満たないときは、ルビ設定部7fは、ルビとして付される文字のフォントの縦方向の長さが、単語あるいは連語に含まれる文字のフォントの縦方向の長さの40%となるよう、ルビとして付される文字のサイズを設定する。行間間隔が文字のフォントの縦方向の長さの80%を超えるときは、ルビ設定部7fは、ルビとして付される文字のフォントの縦方向の長さが、単語あるいは連語に含まれる文字のフォントの縦方向の長さの80%となるよう、ルビとして付される文字のサイズを設定する。また、行間隔が文字のフォントの縦方向の長さの40〜80%であるときは、ルビ設定部7fは、ルビとして付される文字のフォントの縦方向の長さが行間隔と同じ長さとなるよう、ルビとして付される文字のサイズを設定する。なお、この設定方法において、40%、80%とは別の閾値が用いられることとしてよい。
続いて、ルビ設定部7fは、ルビの左端のX座標Xr(k)(1≦k≦N)を設定する(ステップS1202)。具体的には、ルビ設定部7fは、ルビの左端のX座標Xr(n)を単語あるいは連語の左端のX座標X(k)に設定する。
そして、ルビ設定部7fは、ルビの長さLr(k)(1≦k≦N)を算出する(ステップS1203)。具体的には、ルビ設定部7fは、ルビr(k)に含まれる文字の幅と、文字間に設けられる空白の幅、文字の数の情報から、ルビr(k)の長さLr(k)を算出する。その後、ルビ設定部7fは、単語あるいは連語の識別番号kを1に設定する(ステップS1204)。
続いて、ルビ設定部7fは、単語あるいは連語の長さL(k)が、ルビr(k)の長さLr(k)よりも短いか否かを判定する(ステップS1205)。長さL(k)が長さLr(k)よりも短くない場合(ステップS1205においてNOの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS1206)。
そして、図29に示されるように、ルビ設定部7fは、kがNであるか否かを調べる(ステップS1605)。kがNでない場合(ステップS1605においてNOの場合)、ルビ設定部7fは、kを1だけ増やし(ステップS1606)、図25のステップS1205に移行して、その後の処理を継続する。
図25のステップS1205において、長さL(k)が長さLr(k)よりも短い場合(ステップS1205においてYESの場合)、ルビ設定部7fは、ルビの圧縮率c(k)を比Lr(k)/L(k)に設定する(ステップS1207)。そして、ルビ設定部7fは、圧縮率c(k)が所定の閾値よりも大きいか否かを判定する(ステップS1208)。
圧縮率c(k)が所定の閾値よりも大きくない場合(ステップS1208においてNOの場合)、図29のステップS1605に移行し、ルビ設定部7fは、それ以降の処理を継続する。
図25のステップS1208において、圧縮率c(k)が所定の閾値よりも大きい場合(ステップS1208においてYESの場合)、ルビ設定部7fは、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)が無いか否かを判定する(ステップS1209)。
単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)が無い場合(ステップS1209においてYESの場合)、ルビ設定部7fは、単語kあるいは連語kの長さL(k)と、単語k+1あるいは連語k+1の長さL(k+1)と、空白の幅Lgとの和L(k)+L(k+1)+Lgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS1210)。
和L(k)+L(k+1)+Lgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS1210においてNOの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定し(ステップS1206)、図29のステップS1605に移行して、ルビ設定部7fは、それ以降の処理を継続する。
図25のステップS1210において、和L(k)+L(k+1)+Lgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS1210においてYESの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k)+L(k+1)+Lg)に再設定する(ステップS1211)。
そして、ルビ設定部7fは、圧縮率c(k)が所定の閾値よりも大きいか否かを判定する(ステップS1212)。圧縮率c(k)が所定の閾値よりも大きくない場合(ステップS1212においてNOの場合)、図29のステップS1605に移行して、ルビ設定部7fは、それ以降の処理を継続する。
図25のステップS1212において、圧縮率c(k)が所定の閾値よりも大きい場合(ステップS1212においてYESの場合)、図26に示すように、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無いか否かを判定する(ステップS1301)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無い場合(ステップS1301においてYESの場合)、ルビ設定部7fは、単語k−1あるいは連語k−1の長さL(k−1)と、単語kあるいは連語kの長さL(k)と、単語k+1あるいは連語k+1の長さL(k+1)と、2つの空白の幅2Lgとの和L(k−1)+L(k)+L(k+1)+2Lgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS1302)。
和L(k−1)+L(k)+L(k+1)+2Lgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS1302においてNOの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS1303)。そして、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図26のステップS1302において、和L(k−1)+L(k)+L(k+1)+2Lgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS1302においてYESの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k−1)+L(k)+L(k+1)+2Lg)に設定する(ステップS1304)。そして、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図26のステップS1301において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無いという条件が満たされない場合(ステップS1301においてNOの場合)、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たすか否かを判定する(ステップS1305)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たす場合(ステップS1305においてYESの場合)、ルビ設定部7fは、和L(k−1)+L(k)+L(k+1)+2Lgから、ルビr(k−1)の長さLr(k−1)、および、ルビ間に設けるべき空白の幅の最小値Lrgを差し引いた値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS1306)。
値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS1306においてNOの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS1303)。そして、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図26のステップS1306において、値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS1306においてYESの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lrg)に設定する(ステップS1307)。そして、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図26のステップS1305において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たさない場合(ステップS1305においてNOの場合)、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図25のステップS1209において、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)が無いという条件が満たされない場合(ステップS1209においてNOの場合)、図27に示すように、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無いか否かを判定する(ステップS1401)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無い場合(ステップS1401においてYESの場合)、ルビ設定部7fは、単語k−1あるいは連語k−1の長さL(k−1)と、単語kあるいは連語kの長さL(k)と、空白の幅Lgとの和L(k−1)+L(k)+Lgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS1402)。
和L(k−1)+L(k)+Lgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS1402においてNOの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS1403)。そして、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図27のステップS1402において、和L(k−1)+L(k)+Lgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS1402においてYESの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k−1)+L(k)+Lg)に再設定する(ステップS1404)。
そして、ルビ設定部7fは、圧縮率c(k)が所定の閾値よりも大きいか否かを判定する(ステップS1405)。圧縮率c(k)が所定の閾値よりも大きくない場合(ステップS1405においてNOの場合)、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図27のステップS1405において、圧縮率c(k)が所定の閾値よりも大きい場合(ステップS1405においてYESの場合)、ルビ設定部7fは、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たすか否かを判定する(ステップS1406)。
単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たす場合(ステップS1406においてYESの場合)、ルビ設定部7fは、和L(k−1)+L(k)+L(k+1)+2Lgから、ルビr(k+1)の長さLr(k+1)、および、ルビ間に設けるべき空白の幅の最小値Lrgを差し引いた値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS1407)。
値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS1407においてNOの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS1403)。そして、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図27のステップS1406において、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たさない場合(ステップS1406においてNOの場合)、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図27のステップS1407において、値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS1407においてYESの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k−1)+L(k)+L(k+1)+2Lg−Lr(k+1)−Lrg)に設定する(ステップS1408)。そして、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図27のステップS1401において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無いという条件が満たされない場合(ステップS1401においてNOの場合)、図28に示すように、ルビ設定部7fは、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たすか否かを判定する(ステップS1501)。
単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たす場合(ステップS1501においてYESの場合)、ルビ設定部7fは、和L(k)+L(k+1)+Lgから、ルビr(k+1)の長さLr(k+1)、および、ルビ間に設けるべき空白の幅の最小値Lrgを差し引いた値L(k)+L(k+1)+Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS1502)。
値L(k)+L(k+1)+Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS1502においてNOの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS1503)。そして、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図28のステップS1502において、値L(k)+L(k+1)+Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS1502においてYESの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k)+L(k+1)+Lg−Lr(k+1)−Lrg)に設定する(ステップS1504)。
そして、ルビ設定部7fは、圧縮率c(k)が所定の閾値よりも大きいか否かを判定する(ステップS1505)。圧縮率c(k)が所定の閾値よりも大きくない場合(ステップS1505においてNOの場合)、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図28のステップS1505において、圧縮率c(k)が所定の閾値よりも大きい場合(ステップS1505においてYESの場合)、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たすか否かを判定する(ステップS1506)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たす場合(ステップS1506においてYESの場合)、ルビ設定部7fは、和L(k−1)+L(k)+L(k+1)+2Lgから、ルビr(k−1)の長さLr(k−1)、ルビr(k+1)の長さLr(k+1)、および、ルビ間に設けるべき2つの空白の幅の最小値2Lrgを差し引いた値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lr(k+1)−2Lrgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS1507)。
値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lr(k+1)−2Lrgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS1507においてNOの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS1503)。そして、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図28のステップS1507において、値L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lr(k+1)−2Lrgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS1507においてYESの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k−1)+L(k)+L(k+1)+2Lg−Lr(k−1)−Lr(k+1)−2Lrg)に設定する(ステップS1508)。そして、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図28のステップS1506において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たさない場合(ステップS1506においてNOの場合)、図29のステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
図28のステップS1501において、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たさない場合(ステップS1501においてNOの場合)、ルビ設定部7fは、図29に示すように、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たすか否かを判定する(ステップS1601)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たす場合(ステップS1601においてYESの場合)、ルビ設定部7fは、和L(k−1)+L(k)+Lgから、ルビr(k−1)の長さLr(k−1)、および、ルビ間に設けるべき空白の幅の最小値Lrgを差し引いた値L(k−1)+L(k)+Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS1602)。
値L(k−1)+L(k)+Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS1602においてNOの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を1に設定する(ステップS1603)。そして、ステップS1605に移行し、ルビ設定部7fは、それ以後の処理を継続する。
ステップS1602において、値L(k−1)+L(k)+Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS1602においてYESの場合)、ルビ設定部7fは、ルビr(k)の圧縮率c(k)を比Lr(k)/(L(k−1)+L(k)+Lg−Lr(k−1)−Lrg)に設定する(ステップS1604)。そして、ステップS1605に移行し、ルビ設定部7fは、それ以後の処理を継続する。
図29のステップS1601において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たさない場合(ステップS1601においてNOの場合)、ステップS1605に移行し、ルビ設定部7fは、その後の処理を継続する。
ステップS1605において、kがNである場合(ステップS1605においてYESの場合)、ルビ設定部7fは、圧縮後の各ルビr(k)(1≦k≦N)の文字サイズSr(k)を算出する(ステップS1607)。具体的には、ルビ設定部7fは、もとの文字サイズを圧縮率c(k)で除することにより、文字サイズSr(k)を算出する。
そして、ルビ設定部7fは、文字サイズSr(k)(1≦k≦N)の最小値Srminを抽出し(ステップS1608)、すべての文字のサイズSr(k)(1≦k≦N)をSrminに再設定する(ステップS1609)。以上の処理により、文書に含まれるルビr(k)(1≦k≦N)の文字サイズがSrminに統一される。文字サイズが変更されると、ルビr(k)、r(k+1)の左端のX座標を再調整する必要が生じる。よって、以下では、ルビ設定部7fは、ルビr(k)、r(k+1)の左端のX座標の再調整を行う。
ここでは、文書をレイアウト解析して得られる文字領域単位ではなく、文書単位で文字サイズの分散値を算出し、その分散値が所定の閾値以上である場合に、ルビの文字サイズを統一しないこととし、その分散値が所定の閾値よりも小さい場合に、すべてのルビの文字サイズを最小値Srminに統一することとしている。
先に示した特許文献3や特許文献4は、文書を複数の領域に分割し、文字サイズや行間隔が類似する領域を同一のグループとして分類し、同一のグループに含まれる領域間で、文字列に付される翻訳文の文字サイズを統一するものである。しかし、これらは文字サイズや行間隔が類似する領域間で文字サイズを統一するものであるため、文書全体で見れば文字サイズや行間隔の分散が大きい場合でも、その文書内に文字サイズや行間隔が類似する領域があれば、それらの領域内の文字サイズが統一されてしまう。よって、文字サイズや行間隔の文書単位で算出した分散が大きい場合に、ルビの文字サイズを統一しないという処理には、特許文献3や特許文献4の技術は利用することが難しい。
しかし、本実施形態によれば、文書単位で文字サイズや行間隔の分散値を算出した上で、その分散値の大きさに基づいて、ルビの文字サイズを最小値Srminに統一するか否かを判定しているので、たとえその文書内に文字サイズや行間隔が類似する領域があったとしても、それらの領域内のルビの文字サイズが統一されてしまうことなく、ルビを文書に配置することができる。
図29のステップS1609の処理の後、ルビ設定部7fは、ルビの長さLr(k)(1≦k≦N)を再度算出する(ステップS1610)。具体的には、ルビ設定部7fは、ステップS1609において算出された文字のサイズSr(k)により定まる文字の幅と、文字間に設けられる空白の幅、文字の数の情報から、ルビr(k)の長さLr(k)を再度算出する。その後、ルビ設定部7fは、単語あるいは連語の識別番号kを1に設定する(ステップS1611)。
続いて、図30に示すように、ルビ設定部7fは、単語あるいは連語の長さL(k)が、ルビr(k)の長さLr(k)よりも短いか否かを判定する(ステップS1701)。長さL(k)が長さLr(k)よりも短くない場合(ステップS1701においてNOの場合)、図33のステップS2005に移行し、ルビ設定部7fは、ルビr(k)の下端のY座標を設定する(ステップS2005)。
具体的には、ルビ設定部7fは、行間の中央部分にルビr(k)が配置されるように、ルビr(k)の下端のY座標を設定する。単語kあるいは連語kが最下行である場合には、ルビ設定部7fは、単語kあるいは連語kとルビr(k)との間の間隔が、その上にある行における間隔と同じ間隔となるようルビr(k)の下端のY座標を設定する。行が1行しかない場合は、ルビ設定部7fは、単語kあるいは連語kとルビr(k)との間に所定の間隔が空くように、ルビr(k)の下端のY座標を設定する。
あるいは、ルビ設定部7fは、単語kあるいは連語kの下端のY座標からルビr(k)を表示するフォントの高さ方向のサイズの分だけ下にずれた位置をルビr(k)の下端のY座標として設定することとしてもよい。
その後、ルビ設定部7fは、kがNであるか否かを調べる(ステップS2006)。kがNである場合(ステップS2006においてYESの場合)、ルビサイズを統一する場合のルビサイズ・配置設定処理を終了する。kがNでない場合(ステップS2006においてNOの場合)、ルビ設定部7fは、kを1だけ増やし(ステップS2007)、図30のステップS1701に移行して、その後の処理を継続する。
図30のステップS1701において、長さL(k)が長さLr(k)よりも短い場合(ステップS1701においてYESの場合)、ルビ設定部7fは、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)が無いか否かを判定する(ステップS1702)。
単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)が無い場合(ステップS1702においてYESの場合)、ルビ設定部7fは、単語kあるいは連語kの長さL(k)と、単語k+1あるいは連語k+1の長さL(k+1)と、空白の幅Lgとの和L(k)+L(k+1)+Lgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS1703)。
和L(k)+L(k+1)+Lgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS1703においてNOの場合)、図33のステップS2005に移行して、ルビ設定部7fは、それ以降の処理を継続する。
図30のステップS1703において、和L(k)+L(k+1)+Lgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS1703においてYESの場合)、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無いか否かを判定する(ステップS1704)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無い場合(ステップS1704においてYESの場合)、ルビ設定部7fは、A=X(k)+L(k)/2−Lr(k)/2を算出する(ステップS1705)。
続いて、ルビ設定部7fは、Aの値に応じて、ルビr(k)の左端のX座標Xr(k)を設定する(ステップS1706)。具体的には、ルビ設定部7fは、Aが単語k−1あるいは連語k−1の左端のX座標X(k−1)よりも小さい場合、Xr(k)をX(k−1)に設定する。また、ルビ設定部7fは、Aが、X(k−1)以上で、X(k+1)+L(k+1)−Lr(k)未満である場合、Xr(k)をAに設定する。また、ルビ設定部7fは、Aが、X(k+1)+L(k+1)−Lr(k)以上である場合、Xr(k)をX(k+1)+L(k+1)−Lr(k)に設定する。
その後、図33のステップS2005に移行し、ルビ設定部7fは、それ以降の処理を継続する。
図30のステップS1704において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無いという条件が満たされない場合(ステップS1704においてNOの場合)、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たすか否かを判定する(ステップS1707)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たす場合(ステップS1707においてYESの場合)、ルビ設定部7fは、A=X(k)+L(k)/2−Lr(k)/2を算出する(ステップS1708)。
続いて、ルビ設定部7fは、Aの値に応じて、ルビr(k)の左端のX座標Xr(k)を設定する(ステップS1709)。具体的には、ルビ設定部7fは、値Aが、X(k−1)+Lr(k−1)+Lrgよりも小さい場合、Xr(k)をX(k−1)+Lr(k−1)+Lrgに設定する。また、ルビ設定部7fは、値Aが、X(k−1)+Lr(k−1)+Lrg以上で、X(k+1)+L(k+1)−Lr(k)未満である場合、Xr(k)をAに設定する。また、ルビ設定部7fは、値Aが、X(k+1)+L(k+1)−Lr(k)以上である場合、Xr(k)をX(k+1)+L(k+1)−Lr(k)に設定する。
その後、図33のステップS2005に移行し、ルビ設定部7fは、それ以降の処理を継続する。
図30のステップS1707において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たさない場合(ステップS1707においてNOの場合)、図33のステップS2005に移行し、ルビ設定部7fは、それ以降の処理を継続する。
図30のステップS1704において、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)が無いという条件が満たされない場合(ステップS1702においてNOの場合)、図31に示すように、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無いか否かを判定する(ステップS1801)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無い場合(ステップS1801においてYESの場合)、ルビ設定部7fは、単語k−1あるいは連語k−1の長さL(k−1)と、単語kあるいは連語kの長さL(k)と、空白の幅Lgとの和L(k−1)+L(k)+Lgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS1802)。
和L(k−1)+L(k)+Lgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS1802においてNOの場合)、ルビ設定部7fは、ルビr(k)の左端のX座標Xr(k)をX(k)+L(k)−Lr(k)に設定する(ステップS1803)。その後、図33のステップS2005に移行し、ルビ設定部7fは、その後の処理を継続する。
図31のステップS1802において、和L(k−1)+L(k)+Lgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS1802においてYESの場合)、ルビ設定部7fは、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たすか否かを判定する(ステップS1804)。
単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たす場合(ステップS1804においてYESの場合)、ルビ設定部7fは、A=X(k)+L(k)/2−Lr(k)/2を算出する(ステップS1805)。続いて、ルビ設定部7fは、Aの値に応じて、ルビr(k)の左端のX座標Xr(k)、および、ルビr(k+1)の左端のX座標Xr(k+1)を設定する(ステップS1806)。
具体的には、ルビ設定部7fは、Aが、X(k−1)よりも小さい場合、Xr(k)をX(k−1)に設定し、Xr(k+1)をXr(k)+Lr(k)+Lrgに設定する。また、ルビ設定部7fは、Aが、X(k−1)以上で、X(k+1)+L(k+1)−Lr(k+1)−Lrg−Lr(k)未満である場合、Xr(k)をAに設定し、Xr(k+1)をXr(k)+Lr(k)+Lrgに設定する。また、ルビ設定部7fは、Aが、X(k+1)+L(k+1)−Lr(k+1)−Lrg−Lr(k)以上である場合、Xr(k)をX(k+1)+L(k+1)−Lr(k+1)−Lrg−Lr(k)に設定し、Xr(k+1)をXr(k)+Lr(k)+Lrgに設定する。
その後、図33のステップS2005に移行し、ルビ設定部7fは、その後の処理を継続する。
単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たさない場合(ステップS1804においてNOの場合)、図33のステップS2005に移行し、ルビ設定部7fは、その後の処理を継続する。
図31のステップS1801において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)が無いという条件が満たされない場合(ステップS1801においてNOの場合)、図32に示すように、ルビ設定部7fは、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たすか否かを判定する(ステップS1901)。
単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たす場合(ステップS1901においてYESの場合)、ルビ設定部7fは、和L(k)+L(k+1)+Lgから、ルビr(k+1)の長さLr(k+1)、および、ルビ間に設けるべき空白の幅の最小値Lrgを差し引いた値L(k)+L(k+1)+Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS1902)。
値L(k)+L(k+1)+Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS1902においてNOの場合)、ルビ設定部7fは、ルビr(k+1)の左端のX座標Xr(k+1)をX(k)+Lr(k)+Lrgに設定する(ステップS1903)。そして、図33のステップS2005に移行し、ルビ設定部7fは、その後の処理を継続する。
図32のステップS1902において、値L(k)+L(k+1)+Lg−Lr(k+1)−Lrgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS1902においてYESの場合)、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たすか否かを判定する(ステップS1904)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たす場合(ステップS1904においてYESの場合)、ルビ設定部7fは、A=X(k)+L(k)/2−Lr(k)/2を算出する(ステップS1905)。続いて、ルビ設定部7fは、Aの値に応じて、ルビr(k)の左端のX座標Xr(k)、および、ルビr(k+1)の左端のX座標Xr(k+1)を設定する(ステップS1906)。
具体的には、ルビ設定部7fは、値Aが、X(k−1)+Lr(k−1)+Lrgよりも小さい場合、Xr(k)をX(k−1)+Lr(k−1)+Lrgに設定し、Xr(k+1)をXr(k)+Lr(k)+Lrgに設定する。また、ルビ設定部7fは、値Aが、X(k−1)+Lr(k−1)+Lrg以上で、X(k+1)+L(k+1)−Lr(k+1)−Lrg−Lr(k)未満である場合、Xr(k)をAに設定し、Xr(k+1)をXr(k)+Lr(k)+Lrgに設定する。また、ルビ設定部7fは、値Aが、X(k+1)+L(k+1)−Lr(k+1)−Lrg−Lr(k)以上である場合、Xr(k)をX(k+1)+L(k+1)−Lr(k+1)−Lrg−Lr(k)に設定し、Xr(k+1)をXr(k)+Lr(k)+Lrgに設定する。
その後、図33のステップS2005に移行し、ルビ設定部7fは、それ以降の処理を継続する。
図32のステップS1904において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たさない場合(ステップS1904においてNOの場合)、図33のステップS2005に移行し、ルビ設定部7fは、それ以降の処理を継続する。
図32のステップS1901において、単語kあるいは連語kが行末でなく、かつ、右隣の単語k+1あるいは連語k+1にルビr(k+1)があり、Lr(k+1)<L(k+1)−Lrgという条件を満たさない場合(ステップS1901においてNOの場合)、図33に示すように、ルビ設定部7fは、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たすか否かを判定する(ステップS2001)。
単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たす場合(ステップS2001においてYESの場合)、ルビ設定部7fは、和L(k−1)+L(k)+Lgから、ルビr(k−1)の長さLr(k−1)、および、ルビ間に設けるべき空白の幅の最小値Lrgを差し引いた値L(k−1)+L(k)+Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さいか否かを判定する(ステップS2002)。
値L(k−1)+L(k)+Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さくない場合(ステップS2002においてNOの場合)、ルビ設定部7fは、ルビr(k)の左端のX座標Xr(k)をX(k)+L(k)−Lr(k)に設定する(ステップS2003)。続いて、ステップS2005に移行し、ルビ設定部7fは、その後の処理を継続する。
図33のステップS2002において、値L(k−1)+L(k)+Lg−Lr(k−1)−Lrgが、ルビr(k)の長さLr(k)よりも小さい場合(ステップS2002においてYESの場合)、ルビ設定部7fは、ルビr(k)の左端のX座標Xr(k)をX(k−1)+Lr(k−1)+Lrgに設定する(ステップS2004)。続いて、ステップS2005に移行し、ルビ設定部7fは、その後の処理を継続する。
図33のステップS2001において、単語kあるいは連語kが行頭でなく、かつ、左隣の単語k−1あるいは連語k−1にルビr(k−1)があり、Lr(k−1)<L(k−1)−Lrgという条件を満たさない場合(ステップS2001においてNOの場合)、ステップS2005に移行し、ルビ設定部7fは、その後の処理を継続する。
これまで文書生成装置1および文書生成方法の実施形態を中心に説明を行ったが、本発明はこれらの実施形態に限定されるものではなく、文書生成装置1の機能を実現するためのコンピュータプログラムとしての形態、あるいは、当該コンピュータプログラムが記録されたコンピュータ読み取り可能な記録媒体の形態として本発明が実施されることとしてもよい。
ここで、記録媒体としては、ディスク系(例えば、磁気ディスク、光ディスク等)、カード系(例えば、メモリカード、光カード等)、半導体メモリ系(例えば、ROM、不揮発性メモリ等)、テープ系(例えば、磁気テープ、カセットテープ等)等、さまざまな形態のものを採用することができる。
これら記録媒体に上述した本実施形態の文書生成装置1の機能を実現させるコンピュータプログラム、または、文書生成方法をコンピュータに実行させるコンピュータプログラムを記録して流通させることにより、コストの低廉化、及び可搬性や汎用性を向上させることができる。
そして、コンピュータに上記記録媒体を装着し、コンピュータにより記録媒体に記録されたコンピュータプログラムを読み出してメモリに格納し、コンピュータが備えるプロセッサ(CPU:Central Processing Unit、MPU:Micro Processing Unit)が当該コンピュータプログラムをメモリから読み出して実行することにより、本実施形態に係る文書生成装置1の機能を実現し、文書生成方法を実行することができる。
また、本発明は上述した実施形態に限定されず、本発明の要旨を逸脱しない範囲内で各種の変形、修正が可能である。