Re: [css3-page] Proposing @margin for marginalia

On Sat, Nov 1, 2014 at 3:53 AM, Tobias Herp <tobias.herp@gmx.de> wrote:
> Hello!
>
> I'm a web programmer and for quite some years now *using* CSS; I think I
> have found a use case where CSS could easily provide an elegant
> solution, but it currently doesn't:
>
> There currently seems to be no standard-conforming way to define a
> margin column on pages - a space for marginalia
> [https://en.wikipedia.org/wiki/Marginalia] which are very common for
> technical books. (I'm no English native speaker, so feel free to suggest
> a better wording.)
>
> Currently, e.g. for PDF generation, we need to use vendor-specific APIs
> to detect left and right pages and change styles accordingly by
> Javascript (which might or might not be available, and might or might
> not work correctly).
> In my opinion, this is a job for CSS.
>
> The following ruleset:
>
>   @page :left {
>     padding-left: 32mm;
>
>     .marginalia {
>       display: block;
>       float: left;
>       clear: both;
>       margin-left: -32mm;
>       width: 30mm;
>     }
>   }
>
>   @page :right {
>     padding-right: 32mm;
>
>     .marginalia {
>       float: right;
>       ...
>     }
>   }
>
> is *disallowed*, according to section 5.1 of the Paged Media Module:
> "The current level of this specification only allows margin at-rules
> inside ‘@page’."
>
> Thus, to allow for marginalia, we have two options:
>
> - Drop the restriction to only allow margin at-rules
>   (which would be misunderstood as an invitation to put
>   all kinds of stuff here),
>   or
> - Define a special area, inside the page margin-boxes.
>   This would be my choice.

If your only requirement is to have the ability to float something on
the inner/outer edge, depending on page placement, we've discussed
this in the past, and it'll go into the 'float' property when we add
'start' and 'end' keywords as well.

> My proposal has two components:
>
> - an at-rule to create the margin column,
>   e.g. "@margin";
> - a possibility to put elements there,
>   e.g. "position: margin".
>
> Using string-set like for @right-middle etc. would not be an option,
> IMO; it would be far more complicated in both definition and use, and
> less flexible; images, HTML <sub> elements and the like will certainly
> be needed in marginalia.
>
> Instead of many words, here is an example how the marginalia support
> could look like:
>
>   @margin {
>     width: 32mm;         /* stealing width from the @page box */
>     padding: 0 2mm;
>     font-size: smaller;
>   }
>
>   @page :left {
>     @margin {
>       text-align: right;  /* possible default for :left pages */
>     }
>   }
>
>   @page :right {
>     @margin {
>       text-align: left;  /* possible default for :right pages */
>     }
>   }
>
>   .marginalia {
>     position: margin;
>   }
>
> The @margin column would be on the right for :right pages, and on the
> left for :left pages.  (For ltr languages, the first page is supposed to
> be a :right page, which suits duplex printing nicely; section 4.3, "Page
> Progression".)
>
> If this can't be generally agreed on, it might be possible to extend the
> syntax, e.g. like so:
>
>   @page :left {
>     @margin-right {
>       ...
>     }
>   }
>
> or:
>
>   @margin-inner {
>     ...
>   }
>
> There can only be *one* margin column in every page.
> Unless explicitly specified for :left and :right pages:
>
> - In presence of @margin, @margin-right would modify
>   the existing @margin on :right pages
> - In presence of @margin, @margin-left would modify
>   the existing @margin on :left pages
> - If both @margin-left and @margin-right are present,
>   but not @margin,
>   @margin-left applies on :left pages, and
>   @margin-right applies on :right pages.
> - If no @margin is present, or with @margin {display: none},
>   @margin-right generates all margins
>   on the right side (*like* on :right pages),
>   e.g. for single-sided printing.
>
> If suppressed, the margin would not occupy any space, and thus give back
> it's width to the normal page content:
>
>   @page :first {
>     @margin {
>       display: none;
>     }
>   }
>
> Please tell me what you think.
> Thank you!

The Page Templates module <http://dev.w3.org/csswg/css-page-template/>
covers this already, in a more extensible way. It's still an
unofficial draft, as it's built on top of CSS Regions functionality,
and we're waiting for that to prove itself out in implementations.
But this should do everything you need, I think.

~TJ

Received on Saturday, 1 November 2014 19:02:34 UTC