/* ======================================================================
Hypothetical MathML StyleSheet
demonstrating how MathML might be handled by CSS3
Bruce Miller, Tim Boland,
Incorporating ideas from David Carlisle.
====================================================================== */
/* ======================================================================
General comments
NEED: attr(attname) to be allowed in ALL property values.
This is used pervasively here.
NEED: extensions to attr; at least: attr(../attname)
to get the attribute of parent.
NEED(?): access to properties from CSS.
Eg. A handy pseudo-class selector:
mfrac[property(mathdisplaystyle)='true']...
QUESTION: Is it `expensive' to add new properties that are inheritted
in simple ways? (ie. do display's that don't specifically
understand the property pass-them through?)
*/
math { display: inline; margin-left: 0.2em; margin-right: 0.2em;
font-family:serif; font-weight:normal; font-style:normal; }
math[display="block"] { display: block; margin: 1em; }
math[mode="display"] { display: block; margin: 1em; }
/************************************************************************
************************************************************************
** Section 3. Presentation Markup **
************************************************************************
************************************************************************/
/************************************************************************
************************************************************************
** Section 3.2. Token Elements **
************************************************************************
************************************************************************/
/* NOTE: We assume the UA handles whatever mappings are needed to get
full unicode coverage for all standard fonts.
NOTE: MathML-specific character entity names are NOT covered here.
*/
/* ======================================================================
3.2.2. Mathematics style attributes common to token elements
======================================================================
mathvariant = (normal | bold | italic | bold-italic | double-struck
| bold-fraktur | script | bold-script | fraktur
| sans-serif | bold-sans-serif | sans-serif-italic
| sans-serif-bold-italic | monospace)
mathsize = ( small | normal | big | number v-unit )
mathcolor = (#rgb | #rrggbb | html-color-name)
mathbackground = (#rgb | #rrggbb | html-color-name)
====================================================================== */
/* NEED: We need 3 additional fonts: double-struck, script and fraktur.
Should these be additional `generic' fonts?
For now, I assume you have the Mathematica 4.2 fonts are installed.
Mathematica5 => script
Mathematica6 => fraktur
Mathematica7 => double-struck
*/
/* I think we want to set the (equivalent to) `normal' mathvariant on math itself,
and NOT on any other token elements (with the exeption of mi special cases),
unless they explicitly request mathvariant; otherwise, they won't inherit style
from mstyle. Similarly, we shouldn't use the shorthand font property, so as not
to reset the inherited size. */
*[mathvariant='normal'] { font-family:serif; font-weight:normal; font-style:normal;}
*[mathvariant='bold'] { font-family:serif; font-weight:bold; font-style:normal; }
*[mathvariant='italic'] { font-family:serif; font-weight:normal; font-style:italic; }
*[mathvariant='bold-italic'] { font-family:serif; font-weight:bold; font-style:italic; }
*[mathvariant='double-struck'] { font-family:Mathematica7; font-weight:normal; font-style:normal;}
*[mathvariant='bold-fraktur'] { font-family:Mathematica6; font-weight:bold; font-style:normal;}
*[mathvariant='script'] { font-family:Mathematica5; font-weight:normal; font-style:normal;}
*[mathvariant='bold-script'] { font-family:Mathematica5; font-weight:bold; font-style:normal;}
*[mathvariant='fraktur'] { font-family:Mathematica6; font-weight:normal; font-style:normal;}
*[mathvariant='sans-serif'] { font-family:sans-serif; font-weight:normal; font-style:normal;}
*[mathvariant='bold-sans-serif'] { font-family:sans-serif; font-weight:bold; font-style:normal;}
*[mathvariant='sans-serif-italic'] { font-family:sans-serif; font-weight:normal; font-style:italic;}
*[mathvariant='sans-serif-bold-italic'] { font-family:sans-serif; font-weight:bold; font-style:italic;}
*[mathvariant='monospace'] { font-family:monospace; font-weight:normal; font-style:normal;}
/* NOTE: On sizing and scriptlevel.
The obvious means of approximating scriptlevel is to use relative
sizing (eg. font-size:71%). This makes incrementing/decrementing
scriptlevel easy (in both mstyle & script elements). But it gives
no means of setting scriptlevel to a specific level in mstyle
(how common is this?).
An alternative explored here, is to use the named absolute sizes
to handle both scriptlevel and other sizing attributes. The
correspondence with scriptlevel is:
0 => normal
1 => small
2 => x-small
3 => xx-small
* => xx-small (?)
and with mathsize is
small => small
normal => normal
big => large
and it is easy for mstyle to set both specific levels and increment
them (at least by one!)
The disadvantages are that there are effectively only 4 scriptlevels
(enough for TeX!), and that the size increments aren't quite what
the MathML spec anticipated (71%) (OTOH, the increments may be better
for screen readability).
Any alternative that doesn't end up setting font-size (eg, introducing
scriptlevel as a new property) would require ALL boxes appearing in Math
to use this alternative mechanism to set font-size!!
*/
*[mathsize='small'] { font-size:small; }
*[mathsize='normal'] { font-size:medium; }
*[mathsize='big'] { font-size:large; }
/* NOTE: Otherwise, it should be number v-unit
*[mathsize] { font-size: attr(mathsize); }
*/
/* NOTE: MathML specifies color consistent with the CSS model, but need attr()
*[mathcolor] { color: attr(mathcolor,color); }
*[mathbackground] { background-color: attr(mathbackground,color); }
*/
/* ======================================================================
3.2.2.1 Deprecated style attributes on token attributes */
/* NOTE: Deprecated attributes should be easily translatable, given attr().
*[fontsize] { font-size:attr(fontsize); }
*[fontweight]{ font-weight:attr(fontweight); }
*[fontstyle] { font-style:attr(fontstyle); }
*[fontfamily]{ font-family:attr(fontfamily); }
*[color] { color:attr(color,color); }
*/
/* ======================================================================
3.2.3. Identifier (mi).
======================================================================
pcdata
====================================================================== */
mi { display: inline; }
/* NEED: a selector which distinguishes mi that contains 1 vs many chars.
NOTE: contains can take a keyword; From what set?
Perhaps it can be extended to somehow cover this need?
mi:contains(single-char) { font-family:serif; font-weight:normal; font-style:italic; }
*/
/* ======================================================================
3.2.4. Number (mn)
======================================================================
pcdata
====================================================================== */
mn { display: inline; }
/* ======================================================================
3.2.5. Operator, Fence, Separator or Accent (mo)
======================================================================
pcdata
======================================================================
NOTE: How much of the operator dictionary can/needs to be covered?
NEED: IMHO, the most important feature is stretchy!
One possible model would require 2 `simple' extensions:
(1) A means to specify the size of a box saying that it would
grow to the height or width of it's parent.
(presumable depending on inline or block parent, resp?)
(2) A means to specify font-size such that it would stretch
to fill the containing box. In the simplest case,
the UA would use scalable fonts, but could assemble
the glyphs from pieces internally if it desired.
NOTE: Interaction between displaystyle, largeop, moveablelimits ??
*/
mo { display: inline; }
/* NOTE: Need generalized attr()
mo[lspace] { padding-left: attr(lspace); }
mo[rspace] { padding-right: attr(rspace); }
*/
/* NOTE: A simplistic Operator Dictionary could look like:
It would be preferable to say the content is exactly '(', not just that
it contains '('.
mrow>mo[contains('(')]:first-child { stretchy:true; }
mrow>mo[contains(')')]:last-child { stretchy:true; }
*/
/* ======================================================================
3.2.6. Text (mtext)
======================================================================
text
====================================================================== */
mtext { display:inline; }
/* ======================================================================
3.2.7. Space (mspace)
======================================================================
======================================================================
NOTE: How do we affect the baseline of a box?
NOTE: Can we guarantee space for empty element?
Generate content for it?
*/
mspace { display: inline; }
/* NOTE: Can we specify size of empty element? (uses attr() )
mspace[width] { width: attr(width); }
mspace[height] { height: attr(height); }
*/
/* NOTE: Can the proposed calc be used this way?
mspace[depth] { vertical-align: calc(- attr(depth)); }
*/
/* ======================================================================
3.2.8. String Literal (ms)
======================================================================
text
====================================================================== */
ms { display:inline; }
ms:before { content:open-quote; }
ms:after { content:close-quote; }
ms[lquote]:before { content:attr(lquote); }
ms[rquote]:after { content:attr(rquote); }
/* ======================================================================
3.2.9. Accessing glyphs for characters from MathML (mglyph)
======================================================================
======================================================================
NOTE: this one seems unreasonable to handle; just punt with alt? */
mglyph { content:attr(alt); }
/************************************************************************
************************************************************************
** Section 3.3. General Layout Schemata **
************************************************************************
************************************************************************/
/* ======================================================================
3.3.1. Horizontal group sub-expressions (mrow)
======================================================================
content...
====================================================================== */
mrow { display: inline; }
/* ======================================================================
3.3.2. Fractions (mfrac)
======================================================================
numerator denominator
====================================================================== */
/* NOTE: Worry about using border for significant things:
What if someone tries to outline the numerator?
Aha: Security by obscurity! Use the CSS3 generated content ::outside
to put the border in a somewhat less accessible place.
For example, something like:
mfrac>*:first-child::outside { display:table-row; border-bottom-style:solid; }
I also suspect that using ::outside to wrap children in a virtual element
with a specified display value would cause much fewer collisions.
*/
/* NOTE: I'm not entirely clear what's going on here; using display = inline-block/block
for frac & children, resp. would also seem to work, but in display contexts, seems
to make the frac full screen width.
NOTE: I'm not quite clear how to get a desirable vertical alignment of
the mfrac as a whole. It sounds like vertical-align:middle should
be in the ballpark (though not strictly correct)? Seems to be ignored?
Also, an inline-table should have it's baseline as baseline of 1st row,
so that vertical-align:0.5ex would be right...
*/
mfrac { display:inline-table; margin:0.1em; border-collapse:collapse;
text-align:center; vertical-align:middle;
}
/* Presumably for CSS3 we need:
vertical-align:0.6ex;
inline-box-align:1;
*/
mfrac>* { display:table-row!important; }
/* NOTE: Selectivity bug in Opera ???
The !important shouldn't be needed here, right???
(to overrule earlier rules like mn {display:inline; } ) */
mfrac>*:first-child { border-bottom-style:solid; border-bottom-width:1pt; }
mfrac[linethickness='0']>*:first-child { border-bottom-width: 0; }
mfrac[linethickness='thin']>*:first-child { border-bottom-width: 0.5pt; }
mfrac[linethickness='medium']>*:first-child { border-bottom-width: 1pt; }
mfrac[linethickness='thick']>*:first-child { border-bottom-width: 2pt; }
mfrac[linethickness='1']>*:first-child { border-bottom-width: 1pt; }
mfrac[linethickness='2']>*:first-child { border-bottom-width: 2pt; }
mfrac[linethickness='3']>*:first-child { border-bottom-width: 3pt; }
mfrac[linethickness='4']>*:first-child { border-bottom-width: 4pt; }
/* NOTE: For arbitrary lengths, need generalized attr()
mfrac[linethickness]>*:first-child { border-bottom-width: attr(../linethickness); }
*/
/* NOTE: For alignments, need generalized attr()
mfrac[numalign]>*:first-child { text-align: attr(numalign); }
mfrac[denomalign]>* + * { text-align: attr(denomalign); }
*/
/* NOTE: Possible treatment for displaystyle?
mfrac[property(mathdisplaystyle) != 'true'] { font-size: smaller; }
mfrac:first-child { mathdisplaystyle:false }
mfrac:last-child { mathdisplaystyle:false }
*/
/* NOTE: !important needed to override the unneeded !important in un-bevelled case! */
mfrac[bevelled='true'] { display:inline; }
mfrac[bevelled='true']>*:first-child { display:inline!important; position:relative; bottom:0.1em; border:none;}
mfrac[bevelled='true']>*:first-child + * { display:inline!important; position:relative; bottom:-0.1em; }
/* NOTE: should solidus be stretchy? */
mfrac[bevelled='true']>*:first-child + *:before { content: "\2044"; font-size:130%; padding-right:0.1em }
/* ======================================================================
3.3.3. Radicals (msqrt, mroot)
======================================================================
base
base index
======================================================================
NOTE: See also menclose, particularly: menclose[notation='radical']
NOTE: using borders, which are too easily overridden by author and,
worse, can clash with each other (eg mfrac>mroot )
NEED: Something! These and menclose are a bit ad-hoc and the pieces
don't necessarily fit well when surds are generated.
*/
msqrt { display: inline; }
msqrt>* { display:inline; border-top-style:solid; border-top-width:thin; padding: 0.2em;}
/* NOTE: stretchy would be nice. */
msqrt:before { content: "\221A"; font-size:120%; margin-right:-0.2em;}
/* David's concoction => (base)^(1/index). */
mroot { display: inline; }
mroot:before { content: "("; }
/* mroot>* { position:relative; top: -.5em; font-size:smaller; display:inline-block; overflow:visible;}*/
mroot>* { position:relative; top: -.5em; font-size:smaller; overflow:visible;}
mroot>*:before { content: "1/("; }
mroot>*:after { content: ")"; }
mroot>*:first-child:before { content: ""; }
mroot>*:first-child:after { content: ")"; }
mroot>*:first-child { display:inline; position:static; font-size: 100%; width: auto; }
/* NOTE: Experiment with how the CSS3 Generated and Replaced Content Module
http://www.w3.org/TR/css3-content/
could allow rearranging the elements
Something like this ? (yikes)
mroot>*:first-child { content:""; }
mroot>*:first-child::alternate { move-to:mroot-base; }
mroot>*:first-child + * { font-size:smaller; vertical-align:super; }
mroot>*:first-child + *::after { content pending(mroot-base); }
msqrt>*:first-child + *::after::outside { display:inline; border-top: thin solid; padding: .2em; }
msqrt>*:first-child + *::after::outside::before { content: "\221A"; font-size:120%; margin-right:-0.2em;}
NOTE: stretchy would be nice.
*/
/* ======================================================================
3.3.4. Style Change (mstyle)
======================================================================
content ...
====================================================================== */
/* NOTE: See comment about scriptlevel at Token Elements */
mstyle[scriptlevel='0'] { font-size:medium; }
mstyle[scriptlevel='1'] { font-size:small; }
mstyle[scriptlevel='2'] { font-size:x-small; }
mstyle[scriptlevel='3'] { font-size:xx-small; }
mstyle[scriptlevel='+1'] { font-size:smaller; }
mstyle[scriptlevel='-1'] { font-size:larger; }
/* NOTE: displaystyle ?? what's the model? */
/* NOTE: scriptsizemultiplier not possible w/o extensions? */
/* NOTE scriptminsize ? (other than a generic minimum font size) */
/* NOTE: background handled through general rule above */
/* NOTE: assignment to named spaces not possible w/o extensions? */
/* ======================================================================
3.3.5. Error Message (merror)
======================================================================
text
====================================================================== */
merror { display:inline; color: red; border-style:solid; }
/* ======================================================================
3.3.6. Adjust Space Around Content (mpadded)
======================================================================
content
======================================================================
NOTE: problems with named units, and depth.
NOTE: the +/- indicates incrementing/decrementing the given value
otherwise it sets the given value!
*/
/*
mpadded[width] { width: attr(width); }
mpadded[lspace] { padding-left: attr(lspace); }
mpadded[height] { height: attr(height); }
mpadded[depth] { vertical-align: calc(- attr(depth)); } ???
*/
/* ======================================================================
3.3.7. Making Sub-Expressions Invisible (mphantom)
======================================================================
content ...
====================================================================== */
mphantom { display:inline; visibility:hidden; }
/* ======================================================================
3.3.8. Expressions Inside Pair of Fences (mfenced)
======================================================================
content ...
======================================================================
NOTE: random sequences of separators isn't possible in pure CSS
w/o introducing a special display solely to handle this element.
An XSLT would transform this into the equivalent mrow?
NOTE: the open & close MUST be stretchy!
*/
mfenced:before { content: "\("; margin-right:-0.2em; }
mfenced:after { content: "\)"; margin-left:-0.2em; }
mfenced[open]:before { content: attr(open); }
mfenced[close]:after { content: attr(close); }
mfenced>* + *:before { content: ", "; margin-left:-0.2em; }
/* Wrong!! Better, if we could at least check for single chars
mfenced[separators]>*+*:before { content: attr(separators); }
*/
mfenced[separators]>*+*:before { content: " ? "; color:red; }
mfenced[separators=""]>*+*:before { content: ""; margin-left:0; }
/* ======================================================================
3.3.9. Enclose Expression Inside Notation (menclose)
======================================================================
content ...
======================================================================
NOTE: This technique uses borders, which are too easily overridden by author,
or even colide w/ each other:
Eg. .....
Better would be something like borders, but separate from them?
NOTE: Potential extension: special border side types? (eg, like parens, surds,etc)
They'd presumably be stretchy. This could be used by mfenced as well.
*/
menclose[notation="longdiv"]:before { content: ")"; font-size:140%; margin-left:-0.1em;}
menclose[notation="longdiv"] { border-top: thin solid; padding: 0.2em; }
menclose[notation="actuarial"] { border-right: thin solid; border-top: thin solid; padding: 0.2em; }
menclose[notation="radical"]:before { content: "\221A"; font-size:120%; margin-right:-0.2em;}
menclose[notation="radical"]>* { border-top: thin solid; padding: .2em; }
menclose[notation="box"] { border: thin solid; padding: 0.2em; }
menclose[notation="roundedbox"] { border: thin solid; padding: 0.2em; }
menclose[notation="circle"] { border: thin solid; padding: 0.2em; }
menclose[notation="top"] { border-top: thin solid; padding: 0.2em; }
menclose[notation="bottom"] { border-bottom: thin solid; padding: 0.2em; }
menclose[notation="left"] { border-left: thin solid; padding: 0.2em; }
menclose[notation="right"] { border-right: thin solid; padding: 0.2em; }
menclose[notation="updiagonalstrike"] { text-decoration: line-through; padding: 0.2em; }
menclose[notation="downdiagonalstrike"] { text-decoration: line-through; padding: 0.2em; }
menclose[notation="verticalstrike"] { text-decoration: line-through; padding: 0.2em; }
menclose[notation="horizontalstrike"] { text-decoration: line-through; padding: 0.2em; }
/************************************************************************
************************************************************************
** Section 3.4. Script and Limit Schemata **
************************************************************************
************************************************************************/
/* NOTE: Is a new display-model called for?
display-roles would be: (superscript | subscript | presuperscript |
presubscript | overscript | underscript)
NOTE: Use relative sizes: larger|smaller to cooperate better w/ mstyle.
NOTE: Vertical alignment of vertical-align:sub|super doesn't seem
to reliably take the base heights into account (maybe Opera 7.51 bug?)
NOTE: I'm experimented with relative positioning, instead of the more
obvious vertical-align, and also inline-table. These all seem to
lead to chaotic vertical alignment problems. Eg. establishing the
baseline of the composite object doesn't seem to work.
NOTE: I think, ultimately, CSS3 needs a way to assert where the baseline
of a box is.
NOTE: OTOH, it would seem that some kind of inline-table model is needed
for the over/under cases.
NOTE: The effect of setting displaystyle to false is NOT incorporated.
*/
/* ======================================================================
3.4.1. Subscript (msub)
======================================================================
base subscript
====================================================================== */
msub>*:first-child + * { display:inline; vertical-align:sub; font-size:smaller; }
/* ======================================================================
3.4.2. Superscript (msup)
======================================================================
base superscript
====================================================================== */
/*msup { display:inline-block; }*/
msup { display:inline-block; line-height:2em; }
msup>*:first-child + * { display:inline; vertical-align:super; font-size:smaller; }
/* ======================================================================
3.4.3. Subscript-superscript pair (msubsup)
======================================================================
base subscript superscript
====================================================================== */
msubsup>*:first-child + * { display:inline; vertical-align:sub; font-size:smaller; }
msubsup>*:first-child + * + * { display:inline; vertical-align:super; font-size:smaller; }
/* ======================================================================
3.4.4. Underscript (munder)
======================================================================
base underscript
======================================================================
NOTE: displaystyle issues not handled.
NOTE: accent issues not handled.
NOTE: Horizontal stretchiness?
*/
/* NOTE: the shift to left is AD-HOC!!
munder>*:first-child + * { vertical-align:-100%; font-size:smaller; position:relative; right:0.8em; }
*/
/* NOTE: Using inline-table is probably better, but vertical positioning is bad */
munder { display:inline-table; }
munder>* { display:table-row!important; }
munder>*:first-child + * { font-size:smaller; }
/* munder>*:nth-child(2) { font-size:smaller; }*/
/* ======================================================================
3.4.5. Overscript (mover)
======================================================================
base overscript
====================================================================== */
/*
mover>*:first-child + * { vertical-align:100%; font-size:smaller; position:relative; right:0.8em; }
*/
/* NOTE: Use inline-table, but delay the base
Vertical alignment is bad.
mover { display:inline-table; }
mover>* { display:table-row; }
mover>*:nth-child(1)::alternate { move-to:mover; }
mover>*:nth-child(2) { font-size:smaller; }
mover>*:nth-child(2)::after { content:pending(mover); }
*/
/* Infered by George's suggestion on munderover */
mover {display:inline-table; }
mover > * {display:table-row; }
mover > * + * {display:table-caption; caption-side:top; }
/* ======================================================================
3.4.6. Underscript-overscript pair (munderover)
======================================================================
base underscript overscript
====================================================================== */
/*
munderover>*:first-child + * { vertical-align:-100%; font-size:smaller; position:relative; right:0.8em; }
munderover>*:first-child + * + * { vertical-align:100%; font-size:smaller; position:relative; right:1.6em; }
*/
/* Suggested by George Chadvanidze: */
munderover { display:inline-table; }
munderover > * {display:table-row; }
munderover > * + * + * {display:table-caption; caption-side:top; }
/* NOTE: Use inline-table, but delay the base
Vertical alignment is bad.
munderover { display:inline-table; }
munderover>* { display:table-row; }
munderover>nth-child(2+n) { font-size:smaller; }
munderover>*:nth-child(1)::alternate { move-to:munderover; }
munderover>*:nth-child(2)::alternate { move-to:munderover; }
munderover>*:nth-child(3)::after { content:pending(munderover); }
*/
/* ======================================================================
3.4.7. Prescripts and tensor indices (mmultiscripts)
======================================================================
base (subscript superscript)*
[ (presubscript presuperscript)*]
======================================================================
NOTE: Hmm, are current selectors sufficient? no...
NOTE: See comments on mroot. Can CSS3 generated content module help?
*/
mmultiscripts>* { display:inline; vertical-align:super; font-size:smaller; }
mmultiscripts>*:first-child+* { vertical-align:sub; font-size:smaller; }
mmultiscripts>*:first-child+*+*+* { vertical-align:sub; font-size:smaller; }
mmultiscripts>*:first-child+*+*+*+*+* { vertical-align:sub; font-size:smaller; }
mmultiscripts>*:first-child+*+*+*+*+*+*+* { vertical-align:sub; font-size:smaller; }
mmultiscripts>*:first-child { vertical-align:baseline; font-size: 100%; }
mprescripts:before { color: red; content: " not supported"; }
/* NOTE: Speculative coding using CSS3 generated content.
Is this consistent with the model??
mmultiscripts>*:first-child::alternate { display:inline; move-to:mmultiscripts; }
mmultiscripts>*:nth-child(2+n) { font-size:smaller; }
mmultiscripts>*:nth-child(2+2n)::alternate {
move-to:mmultiscripts; vertical-align: sub; }
mmultiscripts>*:nth-child(3+2n)::alternate {
move-to:mmultiscripts; vertical-align: super; }
mprescripts ~ * { move-to(here); }
mprescripts ~ *:nth-child(1+2n) { vertical-align: sub; font-size:smaller; }
mprescripts ~ *:nth-child(2+2n) { vertical-align: super; font-size:smaller; }
mmultiscripts::after { content:pending(mmultiscripts); }
*/
/************************************************************************
************************************************************************
** Section 3.5. Tables and Matrices **
************************************************************************
************************************************************************/
/* Lots here to sort out, but hopefully most of it can be leveraged
off of the normal table module (?) */
/* ======================================================================
3.5.1. Table or Matrix (mtable)
======================================================================
rows ...
======================================================================
NOTE: All the attributes that allow repeated specifications for rows|columns
(rowalign, columnalign, groupalign, alignmentscope, columnwidth, rowspacing,
columnspacing, rowlines & columnlines) suffer the same problem as mfenced,
namely: There isn't a practical way, within CSS, to parse these attributes
and assign the appropriate properties values.
*/
mtable { display:inline-table;
border-collapse:collapse; }
mtable>* { display:table-row; }
mtable[frame='solid'] { border: solid 1pt; }
mtable[frame='dashed'] { border: dashed 1pt; }
mtable>mtr:first-child>mtd:first-child {padding:0; }
mtr>* {padding:0.5em 0 0 0.5em; }
/*
mtable[columnspacing]>*>* { padding-left:attr(../../columnspacing); }
mtable[rowspacing]>*>* { padding-top:attr(../../columnspacing); }
mtable[width] { width:attr(width); }
*/
mtr>* { text-align:center; }
mtable[columnalign='left']>*>* { text-align:left;}
mtable[columnalign='right']>*>* { text-align:right;}
mtr>* { vertical-align:baseline; }
mtable[rowalign='top']>*>* { vertical-align:top;}
mtable[rowalign='bottom']>*>* { vertical-align:bottom;}
mtable[rowalign='center']>*>* { vertical-align:middle;}
mtable[rowalign='baseline']>*>* { vertical-align:baseline;}
/* ======================================================================
3.5.2. Row in Table or Matrix (mtr)
======================================================================
columns ...
====================================================================== */
mtr { display:table-row; }
mtr>* { display:table-cell; }
/* ======================================================================
3.5.3. Labeled Row in Table or Matrix (mlabeledtr)
======================================================================
columns ...
====================================================================== */
/* ======================================================================
3.5.4. Entry in Table or Matrix (mtd)
======================================================================
content ...
====================================================================== */
mtd { display:table-cell; white-space: nowrap; padding:0.2em; }
/* ======================================================================
3.5.5. Alignment Markers
======================================================================
====================================================================== */
/************************************************************************
************************************************************************
** Section 3.6. Enlivening Expressions **
************************************************************************
************************************************************************/
/* Hmm, not sure this is doable -- or worth doing specially?
Probably would require some JavaScript. */
/* ======================================================================
3.6.1. Bind Action to Sub-Expression (maction)
======================================================================
various ...
======================================================================
NOTE: Here's some hacky imitations of some of the actiontypes. (except toggle!)
*/
maction>*:first-child { display:inline; }
maction>* { display:none; }
/* Doubtful this would work anyway, since color is in _some_ other namespace:
maction[actiontype='highlight'] > *:first-child:hover{
background-color:attr(color); }
*/
maction[actiontype='highlight'] > *:first-child:hover{
background-color:red; }
maction[actiontype='statusline'] > *:first-child:hover + * {
display:block; position:absolute; background:#C0C0C0; }
maction[actiontype='tooltip'] > *:first-child:hover + * {
display:block; position:absolute; background:#C0C000; }
/* ====================================================================== */