This page documents the changes between the WD and the current (Sep 2013) ED of GCPM, links to test pages, and describes observed differences in implementations. It is work in progress, and not complete. However, it should show a trained reader that many parts of the specification has been interoperably supported.

Another example that documents interoperability is this document, which has been formatted by AntennaHouse (AH) and Prince (PR), as discussed here.
SectionImplemen-tationsTestsChanges between latest WD and latest EDObserved differences in implementationsNext in line

Running headers and footers (ED) (WD)


Names strings test (AH) (PR)

Running elements test (AH) (PR)

  • removed 'contents' shorthand; no implementations
  • dropped 'env(); no implementations
  • added 'content(text)' as equvalent to 'content()' to better match before/after/first-letter values
  • change definition of 'start' keyword so that the first assignment is used if the string has not been assigned a value; this corresponds to 'first-including-carryover' in XSL-FO
  • PR does not support setting strings from pseudo-elements
  • basic support for running elements interoperable, but test case expose bugs for more advanced use

Leaders (ED) (WD)

AH, PR leaders test (AH) (PR)
  • removed second value of leader(); no implementations
  • PR does not support visible leaders over two lines.
Cross-references AH, PR cross-references test (AH) (PR)
  • PR does not support 'target-text', but 'target-content'

Footnotes (ED) (WD)

AH, PR footnotes test (AH) (PR)
  • removed 'target-pull'; no implementations
  • removed prose describing magic; no implementations
  • PR supports an additional property, similar to 'list-style-position':
    .footnote { 
      footnote-style-position: inside }
  • AH supports the super-decimal list style :
    ::footnote-call { 
      content: counter(footnote, super-decimal) }
Issues to be resolved:
  • how do we make footnotes appear in one column only? AH does:
    @footnote {
      float: column bottom;

Sidenotes (ED) (WD)

AH sidenote test (AH)

Page marks and bleed area (ED) (WD)

AH, PR marks & bleed test (AH) (PR) none
  • AH supports negative leaders, PR does not
  • clarify that negative bleeding should be allowed?

Bookmarks (ED) (WD)

AH, PR bookmarks test (AH) (PR) The 'bookmark-target' property called into question and subsequently removed
  • AH does not support multiple arguments to bookmark-level
  • PR does not support using pseudo-elements in labels

CMYK colors (ED) (WD)

AH, PR CMYK test (AH) (PR) none none none

Paged presentations

(ED) (WD)
OP, OW demo none none

Spatial layout of pages

(ED) (WD)
OP, OW demo
  • link-rel() -> go()
  • go(back) -> back

Page floats (ED) (WD)

«Give me a floating point and I will move the world»

pagefloat top & bottom test (AH) (PR)

pagefloat & multicol test (AH) (PR)

use cases & demos

Based on implementation experience and encoding use cases, some properties and and keywords have been changed. Most notably, the idea of using multiple keywords as "modifiers" to specify that floats should appear at, say, the next page, has been replaced with new properties: 'defer-column' and 'defer-page'. Float references, as found in (WD 2010), is expressed with 'column-span: page'. Wrapping around page floats is suppoted with 'float-wrap: wrap' (as implemented by AH).
top, bottom no change
top-corner, bottom-corner replaced by 'defer-column' property
snap added 'snap(<length>)' to describe reach of snap
next-page replaced by 'defer-page' property
next-column replaced by 'defer-column' property
unless-room replaced by 'snap(<length>)'
inside, outside no change

See table at the bottom of this page for an overview of proposals and implementations for page floats.

Selecting columns and pages (ED) (WD)

PR Page selector test (PR)
  • selecting certain named paged with CSS 2.1 :nth-child grammar added
  • only integer values are supported by PR, not the "2n+1" kind
AH = AntennaHouse
PR = Prince 9.0
OP = Opera with Presto rendering engine
OW = Opera with Webkit rendering engine

The table below lists many use cases for page floats and how they can be achieved using the current ED as well as current implementation. The table is not complete, but gives an overview of the various syntaxes. Documentation on the various implementations are here:

float left in columnfloat: leftfloat: leftfloat: leftfloat: leftfloat: left
float right in columnfloat: rightfloat: rightfloat: rightfloat: rightfloat: right
float insidefloat: insidefloat: insidefloat: inside
float outsidefloat: outsidefloat: outsidefloat: outside
float to footnotefloat: footnotefloat: footnotefloat: footnote
make inline footnotefloat: inline-footnote
make footnote area be in one/first column@footnote { float: bottom }@footnote { float: column bottom }float: column-footnote
make footnote area be in one/first column, make footnotes inlinefloat: column-inline-footnote
float to sidenotefloat: sidenotefloat: sidenote
float to top of columnfloat: topfloat: top columnfloat: top-columnfloat: topfloat: top
float to bottom of columnfloat: bottomfloat: bottom columnfloat: bottom-columnfloat: bottomfloat: bottom
float to top of next columnfloat: top; float-defer-column: 1float-move: next; float-reference: column;
float-y: top
OR, in shorthand:
float: top next column
float: next column-top
float to top of last columnfloat: top; float-defer-column: lastfloat: top-cornerfloat: top-corner
float to top of next-to-last columnfloat: top; float-defer-column: -1
float to top of first column on next pagefloat: top; float-defer-page: nextfloat: top-next-pagefloat: top-next-page
float to top of last column on next pagefloat: top; float-defer-page: next; float-defer-column: lastfloat: top-corner-next-pagefloat: top-corner-next-page
float to the bottom of the next columnfloat: bottom; float-defer-column: 1float-move: next; float-reference: column; float-y: bottom
OR, in shorthand:
float: bottom next column
float: next column-bottom
float to bottom of pagefloat: bottom; column-span: pagefloat-reference: page; float-y: bottomfloat: bottom
snap elements to top/bottom when they naturally appear closefloat: snapfloat: prince-snap (?)float: snap
float elements that otherwise would cause a column breakfloat: snap(0)float: top unless-fitfloat: snap(0)
float elements that otherwise would cause a column break to bottomfloat: snap(0, bottom)
float elements that appear within 3em from a column breakfloat: snap(3em)
ensure that element is the only page float at top of columnclear: topclear: top
ensure that element is the only page float at bottom of columnclear: bottomclear: bottom
ensure that element is the only page float in columnclear: columnclear: column
ensure that element is the only page float on pageclear: page
float top, span two columnsfloat: top; column-span: 2
float bottom, span all columnsfloat: bottom; column-span: all
float top right corner, span two columnsfloat: top; float-defer-column: last; column-span: 2