- From: Bert Bos <bert@w3.org>
- Date: Fri, 18 Jul 2008 21:05:57 +0200
- To: www-style@w3.org
On Friday 11 July 2008 13:46, Håkon Wium Lie wrote:
> Also sprach Bert Bos:
> > > > I support the idea of changing 'page' from being inherited to
> > > > not being inherited. If we do so, we can probably address the
> > > > issue that the named page lists in GCPM is (unsuccessfully)
> > > > trying to address; setting a different style on the first page
> > > > in a series of pages. For example, the chapter title is often
> > > > printed on the first page of the chapter and the chapter title
> > > > should therefore not be printed in the running header of that
> > > > first page.
> >
> > I've probably forgotten something, but I suddenly wondered why
> > there is a 'page' property at all. Why doesn't 'page-break-before'
> > accept the name of a named page? It already accepts 'left', it
> > could also accept 'my-foo-page'.
>
> How would you express that you want 'my-foo-page' to be a left or
> right page?
Here is another idea...
What if the @page itself says whether it is a left or right page? And
similarly, the @page itself can say what the name of the next page is:
@page chapter-start
{
... margins and stuff...
page-side: right; /* Force a right-hand page */
next-page: chapter /* Next page is of type chapter */
}
@page chapter
{
... margins and stuff...
page-side: auto; /* = Default */
next-page: chapter /* Next page is of same type */
}
H1 {page-break-before: chapter-start}
Furthermore:
1) Page selectors consisting of a name and a pseudo-class are possible
(with or without a space) and mean the following:
@page foo :first
A page of type foo that is either the first page of the document
or preceded by a page that is not of type foo.
@page foo :left
A page of type foo that falls on a left page
@page foo :right
A page of type foo that falls on a right page
2) Page selectors can be grouped:
@page chapter, chapter-start, :first
{
margin-top: 3cm
}
3) @page rules cascade in an analogous way to normal rules with element
names and pseudo-classes.
4) The 'page-side' property accepts: auto | left | right. Default
is 'auto'. It forces pages of the type it is applied to to be always on
the given side. If that causes an empty page, that empty page is of the
type that is given by the 'next-page' of the preceding page if that is
defined, or a nameless page otherwise.
E.g., if a page is defined as
@page foo {
page-side: right;
next-page: foo}
then the left-hand page after a foo page is not defined and thus
defaults to being a nameless page.
The 'page-side' property does not apply to @page rules with a
pseudo-class. I.e., the following rule
@page foo :left {
page-side: right
}
is interpreted as
@page foo :left {}
5) The 'next-page' property accepts: auto | <identifier>. Default
is 'auto'. Where 'auto' means the next page is unnamed and <identifier>
means the next page is of that type.
The next page is only of the given type if it is the result of an
implicit page break. If the page break was explicit (result of a
page-break-after/before other than 'auto'), then the next page type is
determined by those page-break-after/before properties (see next
section).
An <identifier> for which there is no @page rule is not an error. It
just means a page with the same properties as the nameless page, except
that it has a name.
6) The 'page-break-before' and 'page-break-after' accept: auto |
always | avoid | left | right | <identifier>
always: start a new *unnamed* page.
left: start a new *unnamed* left page (i.e., a ':left' page).
right: start a new *unnamed* right page (i.e., a ':right' page).
<identifier>: start a new page of that type.
As for 'next-page', an <identifier> doesn't need to be "declared" with
an @page rule.
7) A sequence of two or more page breaks without any intervening content
that all call for pages on the same side (left or right) or without a
side preference (auto), causes at most two page breaks and creates a
page of the type given by the last page break in the sequence. If any
page break in that sequence mentions a specific side, than the page is
on that side. Example:
Previous content... <!-- ends on a left "chapter" page -->
<div style="page-break-before: left">
<div style="page-break-before: right">
<div style="page-break-before: chapter-start">
<div style="page-break-before: always">
<!-- empty -->
</div>
</div>
</div>
</div>
<div style="page-break-before: chapter">
Some content here...
</div>
This gives two sequences of page breaks:
Sequence 1: left
Sequence 2: right chapter-start always chapter
The first sequence causes two page breaks and starts a nameless, left
page. The second sequence causes one page break and starts a right-hand
page of type "chapter." The result is
:left (Previous content...)
:right (empty)
:left (empty)
chapter (Some content here...)
In the same way as explained for 'page-side' (see 4): Any empty pages
created by forcing a left or right page are of the type that is given
by the 'next-page' of their preceding page, or are nameless if
that 'next-page' designates a page of the wrong page side.
In the example above, the first empty page was the result of forcing a
left page. Its preceding page is of type "chapter" and has
a 'next-page' property with value 'chapter' and thus this empty page is
of type chapter, too. The sequence of pages is thus
chapter :left (Previous content...)
chapter :right (empty)
:left (empty)
chapter :right (Some content here...)
8) There is no 'page' property.
Here is a bigger example: a document with several chapters that each
start with an H1 on a right-hand page with specific running headers,
and with occasional special pages that are printed in landscape mode.
By default, a nameless page is followed by another nameless page; a
chapter-start page is followed by a nameless page; and a special page
is followed by another special page.
@page {
... common properties and margin boxes of all pages...
}
@page chapter-start {
... overrides for the first page of a chapter...
page-side: right;
}
@page special {
size: landscape;
next-page: special
}
@page special :left {
margin-right: 1cm
}
@page special :right {
margin-left: 1cm
}
H1 {
page-break-before: chapter-start
}
DIV.special {
page-break-before: special;
page-break-after: chapter
}
Bert
PS. What I don't like about this proposal is that it requires you to
invent names. The 'page' property that this replaces (see
http://www.w3.org/TR/2007/WD-css3-gcpm-20070504/#named3) also requires
that, of course, but still I feel as if the best solution has not yet
been invented...
E.g., if I compare Template Layout
(http://www.w3.org/TR/2007/WD-css3-layout-20070809/) to Frame-based
Layout from 1996 (http://www.w3.org/TR/NOTE-layout), the big difference
is that the former doesn't require you to invent names, and, probably
as a result, is much shorter. (It still requires letters, but there is
not much to invent, a b c works fine.)
--
Bert Bos ( W 3 C ) http://www.w3.org/
http://www.w3.org/people/bos W3C/ERCIM
bert@w3.org 2004 Rt des Lucioles / BP 93
+33 (0)4 92 38 76 92 06902 Sophia Antipolis Cedex, France
Received on Friday, 18 July 2008 19:06:37 UTC