2011年6月23日

OpenTypeフォントって組版情報てんこ盛り

大阪DTPの勉強部屋主催の「InDesign組版教室」を受講しはじめました。
大石十三夫さんのよい組版への蘊蓄とこだわりがたっぷりの講義がとても面白いのです。(http://www.osakadtp.com/

その第1回(6/17)はAdobe Illustratorの文字組版の不自由さが検討されたのですが、その中に、サイズが異なる文字を1行に混植する場合などで、個々のフォントの欧文ベースラインが分からないと、文字の並び具合や行間をきれいに揃えられないという話がでてきました。

大石さんのblog『なんでやねんDTP』だとこのあたりの話:
http://d.hatena.ne.jp/works014/20110623

そこで、欧文ベースライン位置を調べる方法をちょいと調べてみました。

フォントの仕様書を読む

まずは、OpenTypeフォントの仕様を勉強。仕様書の在処はもちろん、開発元Microsoft社です;
『OpenType specification』
http://www.microsoft.com/typography/otspec/

うわっ、といいたいぐらい、OpenTypeフォントには組版のための情報が盛り込まれてますね。

他の情報はおいおい勉強することにして、まずは、ベースラインについての項目は?と探してみると、「BASE表」あたりのようです。
「BASE - Baseline Table」
http://www.microsoft.com/typography/otspec/BASE.htm
「Baseline tags」
http://www.microsoft.com/typography/otspec/baselinetags.htm

ideo
これが欧文ベースライン位置を示すもの。ベースラインから仮想ボディの地(下辺)までの距離で示してあります(単位は1/1000)。
icfb
平均字面の地の位置。
icft
平均字面の天の位置。

これらをフォントファイルから読み出せばいい訳です。実際、InDesignにしてもIllustratorにしてもこうした組版情報をフォントから読み出して文字を並べているのです。人間にできない訳はありません。

たしかに、フォントファイルをxxdやhexdumpで16進ダンプして、仕様書と首っ引きで、読んでいけば読めます。

AFDKOTのインストール

でも、もっと楽な方法はないのか? いろいろ試してみたところ、Adobe提供のフォント開発ツールに含まれているものが使い易そうです。Mac・Windows両版が用意されています。

「Adobe Font Development Kit for OpenType」
http://www.adobe.com/devnet/opentype/afdko.html

インストールは、配布物をunzipして出てきた「FDK」フォルダを適当な場所(恒常的に置いておける場所:私は自分のホームディレクトリ下のライブラリフォルダに置きました)に移動して、フォルダ中のシェルスクリプトFinishInstallOSXをTerminalにドロップして実行するだけ。FDKフォルダへのリンクが~/bin/内に作られ、シェルの設定ファイルに必要な環境変数設定が追加記入されます。詳しくは、Read_Me_First.htmlに書いてあります。

spotコマンドをつかってBASE表を読み出し

AFDKOはフォントをつくるためのキットなので、こちらにも沢山の機能・コマンドが入ってます。

組版のための情報はその中の「spot」コマンドで読み出せます。Terminal上での操作になります。

使用法は「-h」オプションで表示されます。


moria: tac$ spot -h
Usage: spot [-u|-h|-ht|-r] [-n|-nc|-G|-T|-F] [-f] [-V] [-m] [-d][-i] [-o] [-t|-P] [-p] [-@ ]  +
OR: spot  -X 

Options:
    -u  print usage information
    -h  print usage and help information
    -ht print table-specific usage information
    -r  dump Macintosh resource map
    -n  dump glyph id/name mapping (also see '-m' below)
    -nc dump glyph id/name mapping, one per line (also see '-m' below)
    -T  list table-directory in sfnt table
    -F  list features in GPOS,GSUB tables
    -G  proof glyph synopsis
    -f  proof GPOS features in font order instead of GID order
    -V  proof glyphs in Vertical writing mode (same as -p6 below)
    -m  map glyph names into Adobe 'friendly' names, not AGL/Unicode names
    -d  suppress header info from proof
    -br proof glyph synopsis one per page
    -i  sfnt resource id list (see help)
    -o  TTC directory offsets list (see help)
    -t  table dump list (see help)
    -P  , e.g 'P cswh,frac,kern'  (use '-Proof' for all)
    -p  set proofing policies: 
        1=No glyph name labels
        2=No glyph numeric labels
        4=Show KanjiStandardEMbox on glyph
        5=Show GlyphBBox on glyph
        6=Show Kanji in Vertical writing mode
        7=Don't show Kanji 'kern','vkrn' with 'palt','vpal' values applied
    -@  set proofing glyph point-size (does not apply to certain synopses)
    -X  execute a series of complete command-lines from  [default: OTFproof.scr ]


BASE表を表示するには、オプションを「-tBASE=5」とすると見やすい表になります。(実行結果は左の図の前半)

moria: tac$ spot -tBASE=5 KozMinPro-Regular.otf 





































BASE表を持たないフォント

ところが、OpenTypeフォントでもBASE表をもたないものがあります。例えばダイナフォントの平成明朝など。

そういうフォントの場合、ベースライン位置についてはHHEAD表に記載されています。それを表示するにはオプションを「-thhea」とします。

moria: tac$ spot -thhea DFHSMinchoStd-W3.otf

descenderとascenderが分かります。



なお、縦組みの場合のベースライン位置などもBASE表に記載されています。しかし、縦組みの場合、たいていは「仮想ボディの中央揃え」でしょうから欧文ベースライン位置は欧文混植の場合以外は問題になることは少ないと思います。spotコマンドの出力には縦組の場合も出ていますがご参考まで。


2011年6月14日

複数のテキストフレームをひとつずつ別文書にコピー

わたしがつくっている新聞では「新年あいさつ」と「暑中見舞い」、年2回の名刺広告を掲載してます。

1枠の料金は年間購読料よりも高く、全体でけっこうな収入になるのですが、募集事務の手間がたいへんなのです。かつては編集部に4人もいて、財政部門も手伝ってくれていたのですが、ここ10年ぐらいはわたしひとりで作業をしています。
  1. 前回の降版データから、個々の名刺広告(ひとつひとつがテキストフレームに入っています)をコピーし、
  2. 1枚の募集要綱にひとつずつペースト(内容の確認や今回の掲載に向けての変更を広告主にしてもらうためです)、
  3. 広告主を照合しながら、募集要綱を宛名ラベルを貼った封筒に詰めて発送しています。
これをなんとか省力化しようと、大組ゲラ上の前回データを募集要綱(小組ゲラ)へコピー&ペーストするという作業をInDesignで自動化させてみました。

CS2なので複数文書の取り扱いに不便なところがあります。CS2ではcopy()とpaste()でしか文書間のコピー&ペーストができないようなのです。しかも、copy()とpaste()は前面のlayoutWindowにしか作用しない。

そこでlayoutWindowを切り替えてやらねばならないのですが、その際、documents[0]とdocuments[1]とが指し示す文書まで入れ替わってしまいます(そのためオブジェクト名の表記を変数をもちいて簡略化できません)。

CS4だとduplicateでコピー元やペースト先が明確に指示できるし、layaoutWindowを切り替える必要もないので、もっと楽にできそうです。

とりあえず動くようになったスクリプトはこんな具合です(エラー処理その他は未実装)。

var ohgumi = File.openDialog ("大組ゲラを開く");
app.open(ohgumi);
var kogumi = File.openDialog ("小組ゲラを開く");
app.open(kogumi);
 /*document[1]は大組ゲラ*/
var numTF = app.documents[1].textFrames.length;
for (i=0; i<numTF; i++){
 /*前面を大組ゲラに切り替え*/
 app.layoutWindows[1].bringToFront();
 app.select(NothingEnum.nothing);
 /*documents[0]は大組ゲラ*/
 app.documents[0].textFrames[i].select();
 app.copy();
 /*前面を小組ゲラに切り替え*/
 app.layoutWindows[1].bringToFront();
 app.paste();
 app.select(NothingEnum.nothing);
 /*documents[0]は小組ゲラ*/  
 app.documents[0].pages[i].textFrames[0].move(["0mm","0mm"]);
 if (i<numTF-1){
 /*documents[0]は小組ゲラ*/
  app.documents[0].pages.add(1701733408);
  }
 }