インデザイン テキストフレームの溢れ処理を考える
管理者用
前回も、こに三栄NAVIでインデザインの溢れ処理スクリプトを紹介しました。
スクリプトは、VBSで記述したもので、溢れ処理したいインデザインファイルをドラックして実行するものでした。
この中で使用した溢れ処理は、フォントの形状に長体/平体をかける形で対応しました。
溢れ処理を考える時、単純には、フォントサイズを落として対応する事が多くあります。
しかし、レイアウトのバランスを考えると 長体/平体などの方がしっくりする場合も多いのです。
バリアブル印刷をお受けする中、いつも悩むところです。
今日は、自動組版の中でも、一番重要と思われる、テキストボックスの溢れ処理を考えて見たいと思います。
溢れ処理項目
溢れ処理対応を考えると、次のような項目が考えられます。
1、フォントサイズを小さくする
2、文字フォントを細くする
3、文字間隔を狭める
・トラッキング
・カーニング
・ツメ
・文字間モード
4、テキストボックスを広げる
溢れを調べる
テキストフレームに対する溢れは、テキストフレームの Overflows プロパティーで判断できます。
しかし、オーバーフローは、してないのですが、1行に収まらず、折り返しして2行に見える状況が有ります。
この様な場合にも、溢れ処理の対象として捉えるか否かは、考えておく必要があります。
次の図は、オーバーフローは起きてませんが、2行です。
私は、項目によって、オーバーフローと同じと考えて、溢れ処理を行う場合があります。
最後のほうに、スクリプトを紹介してます。
文字間モード
インデザインでは、3つの文字間モードを設定可能です。
文字間モードを三栄NAVIで取り上げて事が有ったように思い、サイトを検索してみました。
有りましたので参考に見てください。
文字間モードには
- 和文等幅 ・・・ カーニング無し
- オプティカル ・・・ 隙間なく自動カーニング
- メトリクス ・・・ 文字の形状に合わせ自動的カーニング
これら各文字間モードでは、それぞれカーニングを自動調整します。
しかし、フォントメーカ、種類のツメ情報や、縦書/横書・・・・等々によって文字間の詰めの事象が変わって来ます。
私的には、想像できない結果となり、良く分から良いと言う事になります。
次の図は、上から、和文・オプティカル・メトリクス の設定です。
モードを変えるだけで、溢れの解消される事も有りそうですが、
テキストボックスを作って、そこに文字を流し込む・・・・・・
オーバーフローしていない場合、どこまで入っているのかわかりません。
フォントサイズと文字数から算出出来そうですが、現実的に無理です。
私は、こんな時、テキストフレームをコンテンツにフィットさせて、座標を調べるようにしてます。
溢れ処理
現在、佐々木小次郎と流し込みましたが、オーバーフローしている状態です。
フォントサイズ
フォントサイズを小さくして対応
実際に使っている、エクセルVBAでのスクリプトです。
どこまでフォントサイズを下げるか、設定して実行する。
長体/平体
横書きの場合、長体を書けます
実際に使っている、エクセルVBAでのスクリプトです。
どこまで長体をかけても良いか設定して実行する。
縦書きの時は、平体で対応する
文字間
オーバーフローが解消するまで、トラッキングの調整をしました。
これはやりすぎですね_!
文字間には、トラッキングとカーニング、字ツメ の三種類の方法で設定可能です。
元のデータと比べて見てください。
・元のデータ
・字ツメは、0~100% の間で設定します。 例では、50%にしました。
トラッキングは、字送りと言う事から次の文字の間の設定となります。
それに比べ、字ツメ は、両サイドの文字間を調整します。
100%近くに設定しても文字間で重ならないなどの設定が可能です。
ただし、フォントの種類によって大きく変わります。
・トラッキングは、±0~ プラス/マイナスに設定可能です。
例は、 -100の設定です。
トラッキングの値は、1000で1文字分相当の文字間が設定されます。
+1000 を設定した場合、1文字分スペースを空けたことと同じように見えます。
したがって、文字間を詰めていく場合、使用する値は、-100程度でしょう。
これもフォントの種類によって変わります。
・カーニングは、トラッキングと同様、±0~ プラス/マイナスの両方に設定可能です。
トラッキングと同じようですが、特定文字に対して設定する使い方となります。
私は、トラッキングの方だけを使うようにしてます。
文字パレットの調整箇所を見て頂ければ、文字間調整との関連がわかるとおもいますので図にしてみました。
フレームサイズ
フレームサイズを広げるのも溢れ対策の一つです。
実際の、自動組版仕様に組み入れると幅広いレイアウトが可能となります。
字際に宛名印刷の中で、肩書の配置の部分で使ってます。
組み合わせる
フォントサイズ、長体、文字間・・・・などの設定で、溢れの解消を行う事が出来ます。
どの方法で、対応したらよいでしょうか。
その対象により対応方法も違って来ますが、色々組み合わせるのが良いように思います。
まず最初に実施するのが、文字間の調整です。
文字ツメ 50%を最大に文字間を調整します。
次は、トラッキング ー100 まで
それでも、溢れが解消されない場合、長体をかけます。 70%を限度に実施します。
最後にフォントサイズを小さくしていって溢れを解消します
・・・・・溢れ処理を、どの順番で行っていくか、どこまで行うのか、目的に合わせた組み合わせが有りそうです。
スクリプト
溢れ処理に使用するスクリプトをそれぞれ紹介します。
エクセルVBAで使用していたスクリプトです。
関数としてますので、テキストフレームを使用する場合に、参考になると思います。
コピー及び書き直して使用してください。
オーバーフロー監視 スクリプト
'オーバーフローチェック テキストフレームの行数でもチェック
Function FrameOvf(myTextFrame)
Font_OVF = 0
If myTextFrame.Overflows Then
Font_OVF = 1
Else
L_cunt = myTextFrame.ParentStory.Paragraphs.Count
G_cunt = myTextFrame.Lines.Count
If L_cunt < G_cunt Then
Font_OVF = 1
End If
End If
FrameOvf = Font_OVF
End Function
フレームのサイズを調査する・・・座標を返す関数
'テキストフレーム内コンテンツの座標を調べる
Function FrameLeng(myTextFrame)
haichi_zahyo1 = myTextFrame.GeometricBounds
myTextFrame.Fit (1718906723) '(idFrameToContent) 1718906723
haichi_zahyo = myTextFrame.GeometricBounds
FrameLeng = Array(haichi_zahyo(0), haichi_zahyo(1), haichi_zahyo(2), haichi_zahyo(3))
myTextFrame.GeometricBounds = Array(haichi_zahyo1(0), haichi_zahyo1(1), haichi_zahyo1(2), haichi_zahyo1(3))
End Function
溢れ処理の関数、各溢れ処理の順番
Function frameOVF_ADJ_All(myTextFrame, TRK, Vct, Hoz, Tum, Fnt)
'溢れ処理 全て
If TRK = "" Then
TRK = -50
End If
TRK = frameOVF_ADJ_Tr(myTextFrame, TRK)
If Vct = "" Then
Vct = 80
End If
' Vct = frameOVF_ADJ_Vtc(myTextFrame, Vtc)
If Vct = "" Then
Hoz = 80
End If
Hoz = frameOVF_ADJ_Hoz(myTextFrame, Hoz)
If Tum = "" Then
Tum = 50
End If
Tum = frameOVF_ADJ_Tum(myTextFrame, Tum)
If Fnt = "" Then
Fnt = 10
End If
Fnt = frameOVF_ADJ_Font(myTextFrame, Fnt)
frameOVF_ADJ_All = Array(TRK, Vct, Hoz, Tum, Fnt)
End Function
フォントサイズ 溢れ処理
'フォントサイズの調整
Function frameOVF_ADJ_Font(myTextFrame, Fnt)
'
FrFont = myTextFrame.ParentStory.PointSize
If FrFont > Fnt Then
Font_OVF = 0
Font_OVF = FrameOvf(myTextFrame)
'ポイントサイズを小さく
If Font_OVF = 1 Then
For cuntHSC = FrFont To Fnt Step -0.2
If myTextFrame.Overflows Then
font_p = cuntHSC
myTextFrame.ParentStory.PointSize = CStr(font_p)
'myTextFrameKAISYA.ParentStory.Leading = font_p '行送りの設定
Else
Font_OVF = 0
End If
Next
End If
End If
frameOVF_ADJ_Font = myTextFrame.ParentStory.PointSize
End Function
長体 溢れ処理
Function frameOVF_ADJ_Hoz(myTextFrame, Hoz)
'長体
FrHorizontal = myTextFrame.ParentStory.HorizontalScale
If FrHorizontal > Hoz Then
Font_OVF = 0
Font_OVF = FrameOvf(myTextFrame)
Rem 長体を設定値までかける
If Font_OVF = 1 Then
cunt_HS = FrHorizontal - Hoz
For cuntHSC = 0 To cunt_HS Step 2
moji_Horizontal = FrHorizontal - cuntHSC
myTextFrame.ParentStory.HorizontalScale = moji_Horizontal
If Not myTextFrame.Overflows Then
cuntHSC = cunt_HS
Font_OVF = 0
End If
Next
End If
End If
frameOVF_ADJ_Hoz = myTextFrame.ParentStory.HorizontalScale
End Function
平体 溢れ処理
Function frameOVF_ADJ_Vtc(myTextFrame, Vtc)
'平体
FrVertical = myTextFrame.ParentStory.VerticalScale
If FrVertical > Vtc Then
Font_OVF = 0
Font_OVF = FrameOvf(myTextFrame)
If Font_OVF = 1 Then
cunt_HS = FrVertical - Vtc
For cuntHSC = 0 To cunt_HS Step 2
moji_Vertical = FrVertical - cuntHSC
myTextFrame.ParentStory.VerticalScale = moji_Vertical
If Not myTextFrame.Overflows Then
cuntHSC = cunt_HS
Font_OVF = 0
End If
Next
End If
End If
frameOVF_ADJ_Vtc = myTextFrame.ParentStory.VerticalScale
End Function
トラッキング 溢れ処理
Function frameOVF_ADJ_Tr(myTextFrame, TRK)
'トラッキング
FrmTr = myTextFrame.ParentStory.Tracking
If FrmTr > TRK Then
If myTextFrame.Overflows Then
Font_OVF = 1
Else
Font_OVF = 0
End If
'設定のトラッキング数値まで文字間を詰めて行く
If Font_OVF = 1 Then
cunt_TRK = -TRK
For cuntTrac = 0 To cunt_TRK Step 5
moji_Trac = -cuntTrac
myTextFrame.ParentStory.Tracking = moji_Trac
If Not myTextFrame.Overflows Then
cuntTrac = cunt_TRK
Font_OVF = 0
End If
Next
End If
End If
frameOVF_ADJ_Tr = myTextFrame.ParentStory.Tracking
End Function
字ツメ 溢れ処理
Function frameOVF_ADJ_Tum(myTextFrame, Tum)
'詰め
Font_OVF = 0
Font_OVF = FrameOvf(myTextFrame)
If Font_OVF = 1 Then
Set st = myTextFrame.ParentStory.Paragraphs.Item(1)
Set en = myTextFrame.ParentStory.Paragraphs.Item(-1)
myTextFrame.Texts.ItemByRange(st, en).Item(1).KerningMethod = "オプティカル"
'"和文等幅"
'"メトリクス"
End If
FrmYum = myTextFrame.ParentStory.Tsume
If FrmYum < Tum Then
If myTextFrame.Overflows Then
Font_OVF = 1
Else
Font_OVF = 0
End If
'設定のトラッキング数値まで文字間を詰めて行く
If Font_OVF = 1 Then
For cuntTum = FrmYum To Tum Step 5
myTextFrame.ParentStory.Tsume = cuntTum / 100
'myTextFrame.ParentStory.Tsume = 0.5
If Not myTextFrame.Overflows Then
Font_OVF = 0
End If
Next
End If
End If
frameOVF_ADJ_Tum = cuntTum
End Function