margin-left

実はこの数ヶ月間、ずっとDITAから離れて独自スキーマの文書モデルのもとで仕事をやっていました.そこで始めて経験したのが「縦書き」です.今までほとんど製品マニュアル関連の仕事だったため全部writing-mode="lrtb"の世界で「縦書き」(writing-mode="tbrl")のスタイルシートはやったことがありませんでした.
 
ここでも仕様書に基づいて、既存のスタイルシートを参考に新たにスタイルシートを作って行くわけですが、非常に驚いたことがあります.それはインデントの指定です.
 
今まで横書きではstart-indentが当たり前だったのですけれど、そこのお客さんの仕様はmargin-*でした.つまり段落の先頭のインデントを指定するのに縦書きだったらmargin-topを使い、横書きだったらmargin-leftを指定するというやりかたです.もちろん、縦横両方にも対応できるように、writing-modeを判断して切り替えるというものでした.
 
でも良く考えると、段落(fo:block)の先頭位置のインデントを決めるだけですから、start-indentをつかってやればいちいち縦書き、横書きを意識することなくできるはずです.
 
私の方で提案して早速start-indentに切り替えようとしたのですが、お客さんのいうには、margin-top、margin-leftの方がうまく行く場合があるというお話なのです.どうにもにわかに信じがたかったのですが、これには結構根拠があることがわかりました.
 
普通に文字を並べている分にはあまり関係ないのですが、ボーダーや背景色をつけるときに手間が違うのです.一般的にボーダーをfo:blcokに指定すると、そのままでは文字とボーダーがくっついてしまうので、パディングを指定します.また背景色をつけるときもすこしパディングを取った方が見栄えが良くなります.
 
でも単にパディングを指定しただけだと、ボーダーや背景色が外側にはみ出してしまうのです.これはMicrosoft Wordでも同じです.
 
<fo:block start-indent="0mm" border="2pt solid maroon" padding ="2mm" background-color="#FFDDFF" space-after="2mm">① 四季の花</fo:block>
<fo:block margin-left="0mm" border="2pt solid maroon" padding ="2mm" background-color="#FFDDFF" space-after="2mm">② 春の花</fo:block>
 
イメージ 1
 
ここで②margin-left="0mm"とした場合は①start-indent="0mm"とした場合に比べて自動的にpadding分がインデントされて表示されます.これは楽チンです.
なぜこのようになるかというと、ちゃんと次のように計算されているからです.
 
 
start-indent = inherited_value_of(start-indent) + margin-corresponding + padding-corresponding + border-corresponding-width
 
つまりXSL-FOでは基本的にstart-indentベースであり、margin-*が指定されるとこのようにpaddingとボーダー幅も考慮されて計算されるということになります.
 
これをstart-indentでやるためには、start-indent = inherited-property-value(start-indent) + 2pt + 2mmとしてやらなければなりません.
 
どうもお客さんがstart-indentを採用しなかったのはこのような指定をする手間を省きたかったのでしょう.
また、start-indentは継承されますが、margin-leftは継承されません.
 
ですから10mmインデントの異なる2つのブロックを作るにしても、margin-leftを使えば、個々のブロックにmargin-left="10mm"と指定してやることになります.
 
<fo:block margin-left="0mm" border="2pt solid maroon" padding ="2mm" background-color="#FFDDFF" space-after="2mm">
① 四季の花 margin-left="0mm"
  <fo:block margin-left="10mm" >
    ② 春の花 margin-left="10mm"
    <fo:block margin-left="10mm">
        ③ 夏の花 margin-left="10mm"
    </fo:block>
  </fo:block>
</fo:block>
 
イメージ 2
 
start-indentだと、最初がstart-indent=inherited-property-value(start-indent) + 10mmで、2つめもstart-indent=inherited-property-value(start-indent) + 10mmになります.
 
イメージ 3
 
ここでmargin-leftは継承されないと書きましたが、実際は計算されたstart-indentは継承されます.なのでmargin-leftを指定したときも階段状にfo:blockが配置されるわけです.
 
なにかmargin-leftを使う方が簡単にも思えます.でも継承されないが故に、例えば深いネストレベルで、表だけはインデント="0mm"で配置するというような指定はmargin-leftではできません.start-indentだったらinherited-property-value(start-indent)を使わない限り絶対指定になるので、このようなことは容易です.
 
さて私の作ったスタイルシートではすべてmargin-leftはstart-indentに置き換わりました.縦書きの次のプロジェクトが横書きだったので、スタイルシートがすぐ流用できたことはいうまでもありません.やはりCSS互換のためだけにXSL-FOに残っているプロパティは使うべきではないように思われます.(それでもページレイアウトのマージン指定だけはmargin-*が必須です.)