TOP > blog > インデザイン テキストフレームの溢れ処理を考える
インデザイン
2019/02/02

インデザイン テキストフレームの溢れ処理を考える

管理者用
blog

前回も、こに三栄NAVIでインデザインの溢れ処理スクリプトを紹介しました。
スクリプトは、VBSで記述したもので、溢れ処理したいインデザインファイルをドラックして実行するものでした。
この中で使用した溢れ処理は、フォントの形状に長体/平体をかける形で対応しました。

溢れ処理を考える時、単純には、フォントサイズを落として対応する事が多くあります。
しかし、レイアウトのバランスを考えると 長体/平体などの方がしっくりする場合も多いのです。
バリアブル印刷をお受けする中、いつも悩むところです。

今日は、自動組版の中でも、一番重要と思われる、テキストボックスの溢れ処理を考えて見たいと思います。

溢れ処理項目

溢れ処理対応を考えると、次のような項目が考えられます。

1、フォントサイズを小さくする

2、文字フォントを細くする

3、文字間隔を狭める

  ・トラッキング
  ・カーニング
  ・ツメ
  ・文字間モード

4、テキストボックスを広げる

溢れを調べる

テキストフレームに対する溢れは、テキストフレームの Overflows プロパティーで判断できます。


しかし、オーバーフローは、してないのですが、1行に収まらず、折り返しして2行に見える状況が有ります。
この様な場合にも、溢れ処理の対象として捉えるか否かは、考えておく必要があります。

次の図は、オーバーフローは起きてませんが、2行です。

 

 私は、項目によって、オーバーフローと同じと考えて、溢れ処理を行う場合があります。
最後のほうに、スクリプトを紹介してます。

文字間モード

インデザインでは、3つの文字間モードを設定可能です。

文字間モードを三栄NAVIで取り上げて事が有ったように思い、サイトを検索してみました。
有りましたので参考に見てください。

   ⇒ インデザインVBS文字間モード

文字間モードには

  • 和文等幅  ・・・ カーニング無し
  • オプティカル ・・・ 隙間なく自動カーニング
  • メトリクス ・・・ 文字の形状に合わせ自動的カーニング

これら各文字間モードでは、それぞれカーニングを自動調整します。 

しかし、フォントメーカ、種類のツメ情報や、縦書/横書・・・・等々によって文字間の詰めの事象が変わって来ます。
私的には、想像できない結果となり、良く分から良いと言う事になります。

次の図は、上から、和文・オプティカル・メトリクス の設定です。

モードを変えるだけで、溢れの解消される事も有りそうですが、
テキストボックスを作って、そこに文字を流し込む・・・・・・
オーバーフローしていない場合、どこまで入っているのかわかりません。
フォントサイズと文字数から算出出来そうですが、現実的に無理です。
私は、こんな時、テキストフレームをコンテンツにフィットさせて、座標を調べるようにしてます。

溢れ処理

現在、佐々木小次郎と流し込みましたが、オーバーフローしている状態です。

 

フォントサイズ

 フォントサイズを小さくして対応

 

実際に使っている、エクセル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


 

 

関連記事