- From: Håkon Wium Lie <howcome@opera.com>
- Date: Fri, 12 Sep 2008 12:24:31 +0200
- To: "Grant, Melinda" <melinda.grant@hp.com>
- Cc: www-style@w3.org
Also sprach Grant, Melinda:
> > Consider this markup:
> >
> > <div>...</div>
> > <div>...</div>
> >
> > combined with this style sheet:
> >
> > div { page: foo }
> > @page foo { ... }
> > @page foo:first { ... }
> >
> > Let's assume that a page break is not generated and that the
> > second element starts on the page where the first element
> > ends. If so, will that page be a :first page?
>
> Maybe yes, maybe no... (depending on content and page area size, etc, etc...)
Right.
> > If the anwser
> > is yes, the formatter may have to go back and change the
> > margins/headers/footers of a page that has already been
> > (partially) laid out.
>
> I don't see why... If it falls on the :first page generated for the
> first div, the page already has been formatted with the desired
> layout. What am I missing?
If the start of the second div falls on the :first page generated for
the first div, there is no problem. However, if the start of the
second div falls on any subsequent pages (defined by @page foo), a
problem occurs: does ther formatter have to go back and change the
layout of that page (defined by @page foo:first)?
> > If not, :first doesn't live up to its promises.
>
> I think that depends on how we define :first and what promises we
> want it to live up to. Obviously the presence of a 'foo:first' page
> context should cause elements with a 'page' property of 'foo' to
> get 'foo:first' styling for the first of a sequence of 'foo' pages.
> We could additionally say that whenever the scope for such an
> element is opened (that is, an element with a 'page' property other
> than 'auto' for which there exists a :first page context), a page
> break is generated and :first styling applied to the ensuing page.
> In our example above, that would imply that the second div would
> necessarily be on a (new) :first page.
>
> That would support our chapter/section use case nicely, but it
> precludes using :first to style the first of a set of pages if you
> *don't* want breaks between the elements when they already happen
> to fall on a :first page. (Probably not a huge loss, but an
> annoying consequence of overloading :first to control page
> breaking.)
The solution is neat, but I don't like the overloading; the presence
of a pseudo-class style rule should not add page breaks.
> Adding 'page-group' with values of 'scoped', 'auto', and 'start' (as previously suggested in http://www.w3.org/2002/02/mid/763AE400FE923441B74861D534DF25494E4DDC9D26@GVW0433EXB.americas.hpqcorp.net;list=www-style) would I think provide the greatest flexibility along with a simple use model.
>
> Use case 1:
> @page chapter { @top-center { content: "Header" }}
> @page chapter :first { @top-center { content: none }}
> div { page: chapter; page-group: scoped; }
> ...
> <div>Chapter 1</div>
> <div>Chapter 2</div>
>
> would put each div on its own chapter:first page.
>
> Use case 2:
> I'm not yet convinced any of our identified options can handle this cleanly (and still behave reasonably for other scenarios). But we might consider adding a 'first' value to page-break-before and -after, which would cause :first styling for the 'page' property value in effect (if it exists) to be applied to the ensuing page:
>
> @page chapter { @top-center { content: "Header" }}
> @page chapter :first { @top-center { content: none }}
> h1 { page: chapter; page-group: start; page-break-before: first }
> ...
> <h1>The beginning, on a 'chapter:first' page</h1>
> <p>The content, continues on the 'chapter:first' page and subsequently a 'chapter' page.</p>
> <h1>The conclusion, on a new 'chapter:first' page</h1>
> <p>More content, same as prev p.</p>
>
>
> Use case 3:
> @page rotated { size: landscape }
> table { page: rotated }
> ...
> <div>o blah dee</div>
> <table>...</table>
> <p>o blah dah</p>
>
> would generate breaks before and after the 'rotated' table page.
>
> Use case 4:
> @page rotated { size: landscape }
> table { page: rotated }
> ...
> <div>stuff</div>
> <table>...</table>
> <table>...</table>
> <div>more stuff</div>
>
> would generate a break before and after the tables, and would put both of them on the same page if they fit.
>
> Use case 4a:
> @page rotated { size: landscape }
> table { page: rotated; page-group: scoped }
> ...
> <div>stuff</div>
> <table>...</table>
> <table>...</table>
> <div>more stuff</div>
>
> would generate a break before *each* table, putting them on 'rotated' pages.
>
> > I think adding a page break there is simpler, cleaner and I
> > don't think it affects many pages.
>
> I'd be happy with 'page-group'; ok with overloading :first to
> always generate a page-break-before upon an open scope; but I don't
> want to lose UC4 in order to enable UC1. I want it all. ;-)
>
> Also I'm admittedly very resistant to changing the specification of
> functionality that has been shipping for years and for which we
> have interoperable implementations and test cases unless absolutely
> necessary. I think we have other good options here.
I understand your resistance. I think there are two simpler option
that preserves the behavior from CSS2:
1) We can say that foo:first doens't create a page break, but if there
is an explicit page break there alsory, foo:first will apply. So, you
could say:
@page chapter { ... }
@page chapter:first { ... }
div.chapter { page-break-before: always; page: foo }
2) We remove foo:first altogether and use page lists instead. For
example, instead of styling the first page of all chapters with:
@page chapter { ... }
@page chapter:first { ... }
div.chapter { page: chapter }
you write:
@page chapter { ... }
@page chapter-first { ... }
div.chapter { page: chapter-first chapter }
The page definitions could become longer since we're now defining two
independent pages, not just one subclass of another page.
-h&kon
Håkon Wium Lie CTO °þe®ª
howcome@opera.com http://people.opera.com/howcome
Received on Friday, 12 September 2008 10:25:25 UTC