XSL-FO: space/border/paddings and conditionality

Dear XSL authors,

I have still question about the conditionality of space/border/paddings.

The section [4.3 Spaces and Conditionality] of XSL CR says about this 
but it seems insufficient. There is no description about the condition 
of is-first and is-last traits, although such description is found in 
each section of border/paddings.

    7.6.9 "border-before-width"
    ...... The .conditionality component may be set to 
    "discard" or "retain" to control if the border should be 0 
    or retained if its associated edge is a leading-edge in a 
    reference-area for areas generated from this formatting 
    object that have an is-first value of "false". 

    7.6.34 "padding-end"
    ...... The .conditionality component may be set to 
    "discard" or "retain" to control if the padding should be 0 
    or retained if its associated edge is a trailing-edge in a 
    line-area for areas generated from this formatting object 
    that have an is-last value of "false".

    (etc.)

But in section 4.3.1:

    The border or padding at the before-edge or after-edge of a 
    block-area may be specified as conditional. If so, then it is 
    set to zero if its associated edge is a leading or trailing edge 
    in a reference-area. In this case, the border or padding is 
    taken to be zero for purposes of the stacking constraint 
    definitions.

    The border or padding at the start-edge or end-edge of an 
    inline-area may be specified as conditional. If so, then it is 
    set to zero if its associated edge is a leading or trailing edge 
    in a reference-area or line-area. In this case, the border or 
    padding is taken to be zero for purposes of the stacking 
    constraint definitions.

(BTW in the last paragraph why "reference-area or" ?)

If the condition "is-first/last value of false" is missing, the 
conditional border/padding has different behavior. For example:

  <fo:block>
    <fo:inline border-style="solid"
         border-start-width="1mm"
         border-start-width.conditionality="discard"
         border-end-width="1mm"
         border-end-width.conditionality="discard">
This inline begins a line, has conditional border-start/end, and 
continues to the next line.
    </fo:inline>
    <fo:inline>Here is another inline.</fo:inline>
  </fo:block>

(of course .conditionality="discard" need not to be specified since it 
is the default)

The expected result is:

  +-------------------------------------------------------------
  | This inline begins a line, has conditional border-start/end,
  +-------------------------------------------------------------
  --------------------------------+
  and continues to the next line. | Here is another inline.
  --------------------------------+

The border-start of the first inline-area is not discarded because this 
inline-area has the is-first value of "true".


The is-first/last problem is not only about border/paddings but also 
about spaces. However the problem is different.

Example of conditional spaces:

  <fo:block>
    <fo:inline space-start="1cm"
               space-start.conditionality="discard"
               space-end="1cm"
               space-end.conditionality="discard">
This inline begins a line, has conditional space-start/end, and 
continues to the next line.
    </fo:inline>
    <fo:inline>Here is another inline.</fo:inline>
  </fo:block>

The expected result is:  (here [SPACE-*] represents spaces)

  This inline begins a line, has conditional space-start/end,
  and continues to the next line.[SPACE-END]Here is another inline.


Note that the space-before of the first inline-area is discarded 
(different from conditional padding/borders). Spaces are normally used 
as separator and should be descarded at the first and last.

Example of non-conditional spaces:

  <fo:block>
    <fo:inline space-start="1cm"
               space-start.conditionality="retain"
               space-end="1cm"
               space-end.conditionality="retain">
This inline begins a line, has non-conditional space-start/end, and 
continues to the next line.
    </fo:inline>
    <fo:inline>Here is another inline.</fo:inline>
  </fo:block>

A possible result is:

  [SPACE-START]This inline begins a line, has non-conditional[SPACE-END]
  [SPACE-START]space-start/end, and continues to the next[SPACE-END]
  [SPACE-STAET]line.[SPACE-END]Here is another inline.

According to the current XSL CR spec this seems to be correct, but 
probably the following is more reasonable.

  [SPACE-START]This inline begins a line, has non-conditional space-
  start/end, and continues to the next line.[SPACE-END]Here is another 
  inline.

An important point is that the latter is compatible with CSS margins and 
the former is not.

Therefore, I think the rule should be changed.

Any space-before and space-start should not have effect on areas that 
have an is-first value of "false".
Any space-after and space-end should not have effect on areas that have 
an is-last value of "false".
(i.e., when an area is split, spaces have no effect where the split 
occurs.)


Best regards,

Shinyu Murakami
Antenna House XSL Formatter team
http://www.antennahouse.com

Received on Monday, 2 July 2001 03:15:25 UTC