Scribus での pt と mm の関係

Scribus での pt と mm の関係が気になったので調べてみた。

フォントのサイズ指定には pt しか使用できない

  • 最近の商業レイアウトソフトでは、フォントのサイズ指定で「級(Q)」が使用できる
  • なので、デザイン作業においてフォントサイズは Q で指定する場合が多い
  • しかし、Scribus では pt でしか使用できない
  • でも、フォントサイズ入力欄に単位つきで入力できる (例)3.25mm
  • だが、単位つきで入力した場合でも結局 pt に変換されてしまう。(しかも、小数点第一位以下は切り捨てられる)
    • 2.75mm (11Q) と入力すると、7.8pt になる。


ptに変換されてしまっているためか、文字サイズ13Q一行35文字詰めのテキストフレームをつくろうとしてテキストフレームの横幅を 2.75mm * 35 = 96.25mm に指定しても、34文字しか入らない事態に陥る。

どういう計算式なんだ?


ということで、ソースを調べてみました。


scribus-1.3.3.12/scribus/units.cpp より抜粋。

/*!
 * @brief Returns the ratio to points for the selected unit of measure. Ratios are for: PT, MM, IN, P, CM, C
 */
const double unitGetRatioFromIndex(const int index)
{
        //PT, MM, IN, P, CM, C (Cicero)
        //NOTE: Calling functions that divide by this value will crash on divide by 0. They shouldnt be getting
        // a zero value if they are accessing here with a correct index.
        if (index<UNITMIN || index>UNITMAX)
                return 0;
        double ratio[] = { 1.0, 25.4/72.0, 1.0/72.0, 1.0/12.0, 2.54/72.0, 25.4/72.0/4.512 };
        return ratio[index];
}

/*!
 * @brief Returns the mm value from the pt value supplied
 */
const double pts2mm(double pts)
{
        return pts * unitGetRatioFromIndex(SC_MM);
}

/*!
 * @brief Returns the pts value from the mm value supplied
 */
const double mm2pts(double mm)
{
        return mm / unitGetRatioFromIndex(SC_MM);
}

ようするに、mm から pt に変換する際に、 mm / (25.4/72.0) とやってるみたい。


フォントのサイズ指定は pt でやるのが吉


いろいろためしてみた結論としては、以下のようにやるといいということになった。

  1. フォントのサイズは pt で指定する (例) 8pt
  2. 任意の文字詰数におけるテキストフレームの幅を mm で指定したい場合は、まず フォントのポイント数 * (25.4/72.0) * 文字詰数 という式を使用して mm に変換する (例) 8 * (25.4/72.0) * 35 = 98.7777778
  3. 変換結果の数字を小数点第3位で四捨五入する (例) 98.778
  4. 四捨五入した数値をテキストフレームの横幅として指定してあげると、ちゃんと文字数ぴったりでおさまる