[css3-page] Proposing @margin for marginalia

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.

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!

Tobias Herp

Received on Saturday, 1 November 2014 10:54:09 UTC