43825


XSL-FOで行間を制御したいと考えています。  
どのように制御すれば宜しいでしょうか？

  * 行間を制御する方法を教えてください。
  * 縦組と横組で制御する方法が違う場合、その違いを教えてください。


CC BY-SA 4.0
2018-05-02T01:44:25.620
43713
2018-05-06T14:59:10.180
2018-05-06T14:59:10.180
76
25399
question
xsl xsl-fo
行間を制御したい


「行間」という用語は極めてあいまいに使用されています．FOの出力結果のに対し、お客さんから「もう少し行間を広げてくれ」と言われた場合、どのようにするでしょうか？

実はXSL-FOには

  * 文字の配置される行の領域
  * それらの間の隙間としての行間

という一般的な行間を直接制御するプロパティはありません．お客さんの要望を実現する場合、「行の高さ」を調整することによっておこなっています．XSL-
FOにはそのプロパティline-heightがあります．

さて、XSL-
FOのモデルでは、組版結果はエリアの集合です．ブロックエリアは、ラインエリアがスタックされて生成されます．ラインエリアは、それを構成するインラインエリアからビルドされます．ラインエリア（行）を考える場合、インラインのフォントサイズが一定で、インライン画像を含まないような一番単純なモデルを考えてみましょう．この場合、インラインエリアは次のような図で表現されます．

[![ Nominal-requested-line-
rectangle](https://i.stack.imgur.com/OjQv6.png)](https://i.stack.imgur.com/OjQv6.png)

ここで、

  * text-altitude of parent areaは、fo:blockのtext-altitudeプロパティを、text-depth of parent areaは、fo:blockのtext-depthプロパティを、参照します．
  * 一般的には、text-alititudeとtext-depthの値は、"use-font-metrics"です．結果としてtext-alititude+text-depth = fo:blockに指定されたfont-sizeの値となります．
  * half-leadingの値は、fo:blockに指定されたline-heightの計算値によって決定されます．half-leading = (line-height of fo:block - font-size) / 2

fo:blockの各プロパティの説明は以下を参照ください．

[XSL 1.1 6.5.2 fo:block](https://www.w3.org/TR/xsl11/#fo_block)

つまり行の高さは、font-size + half-leading * 2 という計算になります．これを、fo:blockのline-
heightプロパティで指定することにより行の高さが決定されます．

[XSL 1.1の 7.16.4 "line-height"](https://www.w3.org/TR/xsl11/#line-height)

重要なことはここに書いてあるように

> In XSL the "line-height" property is used in determining the half-leading
> trait.

で、上下に平等に分配されるhalf-leadingの値を決める役割を持つという事です．様々な値が指定できますが、line-
height="1.2"とすれば、上下に0.1emのhalf-leadingが取られます．

従って、「行間を調整する」のはline-heightプロパティの値を適切に調整することに他なりません．

参考までにフォントファイル自身は、様々なメトリクス情報を持っています．以下はWindows Platform
SDKの図に若干の加筆をしたものです．（相当古い）

[![Windows
GDIのモデル](https://i.stack.imgur.com/LPDuP.png)](https://i.stack.imgur.com/LPDuP.png)

XSL-FOではこの図にあるような様々なフォントのメトリクス情報を使用せず、フォントサイズの上下にhalf-
leadingを配置するという簡単なモデルを採用しているという事になります．

この行の高さの考え方は縦書きでも同じことです．一般の横書き行がtopからbottomへスタックされてゆくわけですが、縦書き（writing-
mode="tb-rl"）は、行がrightからleftへスタックされてゆきます．ともにline-
heightが行の高さとして使用されることに変わりはありません．

なおこの分野は専門家ではありませんので、不正確な表現、誤り等ありましたらご指摘ください．


CC BY-SA 4.0
2018-05-06T14:49:36.350
43825
2018-05-06T14:49:36.350
9503
43713
answer