ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
From: Hans Hagen <pragma@wxs.nl>
Cc: mailing list for ConTeXt users <ntg-context@ntg.nl>,
	Bruce D'Arcus <bdarcus@fastmail.fm>
Subject: Re: mag-0008
Date: Wed, 15 Dec 2004 18:14:00 +0100	[thread overview]
Message-ID: <41C070D8.7060601@wxs.nl> (raw)
In-Reply-To: <20041213180232.18842@news.comp.lancs.ac.uk>

Adam Lindsay wrote:
> h h extern said this at Fri, 10 Dec 2004 22:38:27 +0100:
> 
> 
>>>Also, what's the status of contml? I like the idea of it as a simple,
>>>structural, basic markup that ConTeXt handles with zero effort, but is
>>>anyone actually using it?
>>
>>we sometimes mix it into other xml docs; i have no problem with
> 
> extending it; 
> 
>>actualy, (see mag-0008.pdf), i want to map most context directly onto xml so 
>>that we have a rather complete xml input syntax
> 
> 
> Yes, indeed. I took a look at the magazine again last night, and it was
> put in an entirely new light. I'm very curious to work with x-fx now...

see below

> I've been working on a general-ish conversion script from a new Mac
> application. I'd like to offer most of ContML as basic level constructs,
> but it should be possible for a user to add their own tags. If they can
> tap into fx:anything tags, it should make people (hi, Bruce!) fairly happy.
> 
> My first reaction/critique of the approach was: why not fix at least one
> of the problems of TeX: that it's "a mixture between typesetting and
> programming features" as you say? 

indeed, but, it al depends on the 'to be written' manuals then:

- code in xml and then
- use xslt to generate an (structured) instance that
- calls templates that implement typographical solutions
- using the xml interface to context

in practice it means trading in some context funtionality by xslt functionality

the interesting thing is that the whole machinery is still there

> What I propose is clearly a debatable XML-design issue, but it seemed
> strange that fx:definelayout and fx:p were put into the same namespace.
> Why do the formatting definitions share the same (theoretical) schema as
> markup? Your documents keep these categories separate, as one would
> expect. Why not encourage people to put them in separate files, as with
> "normal" ConTeXt workflows? The designer and author are more clearly
> divorced when you don't assume an XSLT-centric flow, right?
> (or, is this already planned with this tidbit from foxet: fs = setup)

sure, definitions should become 'styles' but that's hard to demo in a magazine -)

in principle it could also mean that one could predefine page masters and have 
multiple variants instead of the five-area-fo-thing

> I'm curious about how the namespacing would work, though, because I want
> to use (and enable the use of) these nice fs:setuphead -like
> configurations with my hybrid ContML++ documents. Will:

context\high{fx}

>  <fs:setuphead label='section' />
> correctly (in my mind) affect a ContML element like this?
>  <context:section>something</context:section>

indeed, or

<context:head label='section'>something</context:head>

a matter of taste; i'm open to any suggestion (more a discussion for the foxet 
list)

> Curious,

well, here 's an <experimental/> version of x-fx. It demonstrates that it's 
relaively easy to map the context interface to xml; actually, if things get 
dirty i can provide a more low level context support which then makes the 
mapping clean -)

%D \module
%D   [      file=x-fx,
%D        version=2004.11.12,
%D          title=\FOXET,
%D       subtitle=Style Processor,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\chardef\XMLtokensreduction = 2
\chardef\XMLcdatamethod     = 2

\usemodule[mathml]

\setupcolors[state=start]

% these will be speed up by few step expansion

\def\foxarguments {\theXMLarguments{fox}}
\def\initializefox{\expanded{\getrawparameters[fox][\theXMLarguments{fox}]}}
\def\foxaction  #1{\expanded{#1[\theXMLarguments{fox}]}}

% layers

\defineXMLcommand
   [fx:definelayer] [fox] [label=default]
   {\initializefox
    \expanded{\definelayer[\foxlabel]}%
    \expanded{\setuplayer[\foxlabel][\foxarguments]}}

\defineXMLcommand
   [fx:setuplayer] [fox] [label=default]
   {\initializefox
    \expanded{\setuplayer[\foxlabel][\foxarguments]}}

\defineXMLenvironment
   [fx:setlayer] [fox] [label=default]
   {\initializefox
    \expanded{\setlayer[\foxlabel][\foxarguments]}\bgroup\ignorespaces}
   {\removeunwantedspaces\egroup}

\defineXMLcommand
   [fx:flushlayer] [fox] [label=default]
   {\initializefox
    \tightlayer[\foxlabel]}

% framed

\defineXMLenvironment
   [fx:framed] [fox] []
   {\initializefox
    \expanded{\framed[\foxarguments]}\bgroup\ignorespaces}
   {\removeunwantedspaces\egroup}

% layout

\defineXMLcommand
   [fx:definelayout] [fox] [label=default]
   {\initializefox
    \expanded{\definelayout[\foxlabel][\foxarguments]}}

\defineXMLcommand
   [fx:setuplayout] [fox] [label=default]
   {\initializefox
    \expanded{\setuplayout[\foxlabel][\foxarguments]}
    }% \expanded{\setuplayout[\foxlabel]}} % todo: only when no further arguments

\defineXMLcommand
   [fx:enablelayout] [fox] [label=default]
   {\initializefox
    \expanded{\setuplayout[\foxlabel]}}

% heads / we need a stupid, not list/ref variant

\defineXMLcommand
   [fx:definehead] [fox] [label=default,level=1]
   {\initializefox
 
\expanded{\definehead[fx:head:\foxlabel][section=section-\foxlevel,incrementnumber=no]}%
    \expanded{\setuphead[fx:head:\foxlabel][\foxarguments,alternative=command]}}

\defineXMLcommand
   [fx:setuphead] [fox] [label=default]
   {\initializefox
    \expanded{\setuphead[fx:head:\foxlabel][\foxarguments,alternative=command]}}

\defineXMLenvironmentsave
   [fx:head] [fox] [label=default]
   {\bgroup}
   {\initializefox
    \expanded{\setuphead[fx:head:\foxlabel][\foxarguments,alternative=command]}%
    \getvalue{fx:head:\foxlabel}{\vbox{\forgetall\XMLflush{fx:head}}}%
    \egroup}

% page

\defineXMLcommand
   [fx:page] [fox] [command=yes]
   {\initializefox
    \expanded{\page[\foxcommand]}}

% tabulate / todo: in context preamble also definable this way, then direct map

\setuptabulate[before=,after=]

\startsetups fox:tabulate

     \defineXMLenvironment
         [fx:preamble]
         {\scratchtoks\emptytoks}
         {\appendetoks|\to\scratchtoks}

     \defineXMLpickup
         [fx:tbody]
         {\expanded{\starttabulate[\the\scratchtoks]}}
         {\stoptabulate}

     \defineXMLcommand
         [fx:e] [fox] [width=,align=,type=line,style=] % line|paragraph
         {\initializefox
          \appendetoks|\to\scratchtoks
          \doifelse{\foxtype}{paragraph}{\appendetoks 
p\to\scratchtoks}{\appendetoks w\to\scratchtoks}%
          \doifsomething{\foxwidth}{\appendetoks(\foxwidth)\to\scratchtoks}%
          \appendetoks\XMLval{fox:tab:style}{\foxstyle}{}\to\scratchtoks
          \appendetoks\XMLval{fox:tab:align}{\foxalign}{}\to\scratchtoks}

     \defineXMLenvironment [fx:r]  {}    {\NC \NR}
     \defineXMLenvironment [fx:c]  {\NC} {}
     \defineXMLenvironment [fx:tr] {}    {\NC \NR}
     \defineXMLenvironment [fx:td] {\NC} {}

\stopsetups

\mapXMLvalue {fox:tab:align} {flushleft}  {l}
\mapXMLvalue {fox:tab:align} {flushright} {r}
\mapXMLvalue {fox:tab:align} {center}     {c}

\mapXMLvalue {fox:tab:style} {italic}     {I}
\mapXMLvalue {fox:tab:style} {bold}       {B}
\mapXMLvalue {fox:tab:style} {slanted}    {S}

\defineXMLenvironment
   [fx:tabulate] [fox] []
   {}
   {}

\defineXMLenvironment
   [fx:tabulate] [fox] []
   {\bgroup
    \directsetup{fox:tabulate}}
   {\egroup}

% itemize

\defineXMLcommand
   [fx:defineitemize] [fox] [label=default] % maybe also \defineitemgroup as synonym
   {\initializefox
    \expanded{\defineitemgroup[\foxlabel]}%
    \expanded{\setupitemgroup[\foxlabel][\foxarguments]}}

\defineXMLcommand
   [fx:setupitemize] [fox] [label=default]
   {\initializefox
    \expanded{\setupitemgroup[\foxlabel][\foxarguments]}}

\defineXMLenvironment
   [fx:itemize] [fox] [label=default]
   {\initializefox
    \expanded{\startitemgroup[\foxlabel]}\ignorespaces}
   {\stopitemgroup}

\defineXMLenvironment
   [fx:item] [fox] [type=normal,symbol=]
   {\initializefox
    \XMLval{fox:item:type}{\foxtype}{normal}}
   {\par}

\mapXMLvalue {fox:item:type} {normal} {\item}
\mapXMLvalue {fox:item:type} {margin} {\mar{\foxsymbol}}
\mapXMLvalue {fox:item:type} {symbol} {\sym{\foxsymbol}}

% table

% first last odd even row column header each <n> <m>

\startsetups fox:table

     \defineXMLprocess
         [fx:preamble]

     \defineXMLcommand [fx:c] [fox] [r=each]
         {\initializefox\expanded{\setupTABLE[r][\foxr][\foxarguments]}}

     \defineXMLcommand
         [fx:r] [fox] [c=each]
         {\initializefox\expanded{\setupTABLE[c][\foxc][\foxarguments]}}

     \defineXMLcommand
         [fx:h] [fox] [c=each]
         {\initializefox\expanded{\setupTABLE[header][\foxc][\foxarguments]}}

     \defineXMLcommand
         [fx:e] [fox] [type=,c=each,r=each]
         {\initializefox
          \doifelse{\foxtype}{row}
            {\expanded{\setupTABLE[r][\foxr][\foxarguments]}}
            {\doifelse{\foxtype}{column}
               {\expanded{\setupTABLE[c][\foxc][\foxarguments]}}
               {\expanded{\setupTABLE[\foxc][\foxr][\foxarguments]}}}}

     \defineXMLnested [fx:thead] [fox] [] 
{\expanded{\bTABLEhead[\foxarguments]}} {\eTABLEhead}
     \defineXMLnested [fx:tfoot] [fox] [] 
{\expanded{\bTABLEfoot[\foxarguments]}} {\eTABLEfoot}
     \defineXMLnested [fx:tnext] [fox] [] 
{\expanded{\bTABLEnext[\foxarguments]}} {\eTABLEnext}
     \defineXMLnested [fx:tbody] [fox] [] 
{\expanded{\bTABLEbody[\foxarguments]}} {\eTABLEbody}
     \defineXMLnested [fx:tr]    [fox] [] {\expanded{\bTR[\foxarguments]}} 
   {\eTR}
     \defineXMLnested [fx:td]    [fox] [] {\expanded{\bTD[\foxarguments]}} 
   {\eTD}

\stopsetups

\defineXMLnested
   [fx:table] [fox] []
   {\bgroup
    \directsetup{fox:table}
    \expanded{\bTABLE[\foxarguments]}}
   {\eTABLE
    \egroup}

% misc

\defineXMLenvironment
   [fx:narrower] [fox] [left=0em,right=0em]
   {\expanded{\setupnarrower[\foxarguments]}%
    \startnarrower[middle]}
   {\stopnarrower}

\defineXMLenvironment
   [fx:text] [fox] []
   {\starttext}
   {\stoptext}

% paragraphs

\newcount \paragraphdepth

\defineXMLenvironment
     [fx:p] [fox] [strut=no]
     {\advance\paragraphdepth\plusone
      \initializefox
      \doifelse{\foxstrut}{yes}
        {\setvalue{fx:p:strut:\the\paragraphdepth}{1}}
        {\setvalue{fx:p:strut:\the\paragraphdepth}{0}}%
      \ifcase\getvalue{fx:p:strut:\the\paragraphdepth}\or\begstrut\fi}
     {\ifcase\getvalue{fx:p:strut:\the\paragraphdepth}\or\endstrut\fi
      \endgraf
      \advance\paragraphdepth\minusone}

% fonts

\def\startfont[#1]{\bgroup\getvalue{#1}}
\def\stopfont     {\egroup}

\defineXMLcommand
   [fx:definefont] [fox]
   [label=fallbackfont,spec=lmtt10] % todo: more efficient (no spec/label in 
third arg)
   {\initializefox
    \expanded{\definefont[fx:font:\foxlabel][\foxspec][spec=,label=,\foxarguments]}}

\defineXMLnested
   [fx:font] [fox]
   [label=fallbackfont]
   {\initializefox
    \startfont[fx:font:\foxlabel]}
   {\stopfont}

% color

\defineXMLcommand
   [fx:definecolor] [fox]
   [label=fallbackcolor]
   {\initializefox
    \expanded{\definecolor[fx:color:\foxlabel][\foxarguments]}}

\defineXMLnested
   [fx:color] [fox]
   [label=fallbackfont]
   {\initializefox
    \startcolor[fx:color:\foxlabel]}
   {\stopcolor}

% margin things

\setupinmargin[style=,color=]

\defineXMLargument
   [fx:margintext] [fox] [label=default]
   {\margintext}

% so far

\doifnotmode{demo}{\endinput}

% test

\startbuffer[demo]
<fx:definelayout label='main' backspace='2cm' cutspace='2cm' topspace='2cm' 
bottomspace='2cm'/>

<fx:enablelayout label='main'/>

<fx:defineitemize label='mine'/>

<!-- test layer -->

<fx:definelayer label='test'/>

<fx:setuplayer label='test' width='10cm' height='10cm'/>

<fx:setlayer label='test' preset='lefttop'>
     <fx:framed width='4cm' height='5cm'>
         Left Top
     </fx:framed>
</fx:setlayer>

<fx:setlayer label='test' preset='rightbottom'>
     <fx:framed width='3cm' height='4cm'>
         Right Bottom
     </fx:framed>
</fx:setlayer>

<fx:flushlayer label='test'/>

<fx:narrower>
A bit of text!
     <fx:narrower left='1em'>
     A bit of text!
         <fx:narrower left='3em'>
             A bit of text!
             <fx:narrower right='1em'>
                 A bit of text!
             </fx:narrower>
         </fx:narrower>
     </fx:narrower>
</fx:narrower>

<!-- chapter head -->

<fx:definehead label='chapter'/>

<fx:definelayer label='chapter' width='10cm' method='fit'/>

<fx:page command='yes'/>

<fx:head label='chapter'>
     <fx:setlayer label='chapter' preset='lefttop' hoffset='0cm'>
         <fx:framed>12</fx:framed>
     </fx:setlayer>
     <fx:setlayer label='chapter' preset='lefttop' hoffset='2cm'>
         <fx:framed>The Title</fx:framed>
     </fx:setlayer>
     <fx:flushlayer label='chapter'/>
</fx:head>

<p>Some text!</p>

<fx:tabulate>
     <fx:preamble>
         <fx:e width='1cm' align='flushleft'/>
         <fx:e width='2cm' align='flushright'/>
         <fx:e width='3cm' align='center'/>
         <fx:e width='4cm'/>
     </fx:preamble>
     <fx:body>
         <fx:tr><fx:td>test   1</fx:td><fx:td>test   2</fx:td><fx:td>test 
3</fx:td><fx:td>test   4</fx:td></fx:tr>
         <fx:tr><fx:td>test  11</fx:td><fx:td>test  22</fx:td><fx:td>test 
33</fx:td><fx:td>test  44</fx:td></fx:tr>
         <fx:tr><fx:td>test 111</fx:td><fx:td>test 222</fx:td><fx:td>test 
333</fx:td><fx:td>test 444</fx:td></fx:tr>
     </fx:body>
</fx:tabulate>

<fx:tabulate>
     <fx:preamble>
         <fx:e style='bold'/>
         <fx:e type='paragraph' style='normal'/>
         <fx:e style='italic'/>
         <fx:e type='paragraph' style='slanted'/>
     </fx:preamble>
     <fx:tbody>
         <fx:tr><fx:td>test   1</fx:td><fx:td>test   2</fx:td><fx:td>test 
3</fx:td><fx:td>test   4</fx:td></fx:tr>
         <fx:tr><fx:td>test  11</fx:td><fx:td>test  22</fx:td><fx:td>test 
33</fx:td><fx:td>test  44</fx:td></fx:tr>
         <fx:tr><fx:td>test 111</fx:td><fx:td>test 222</fx:td><fx:td>test 
333</fx:td><fx:td>test 444</fx:td></fx:tr>
     </fx:body>
</fx:tabulate>

<fx:itemize>
     <fx:item>first</fx:item>
     <fx:itemize>
         <fx:item>first</fx:item>
         <fx:item type='symbol' symbol='+'>second</fx:item>
         <fx:item>third</fx:item>
     </fx:itemize>
     <fx:item type='margin' symbol='+'>second</fx:item>
     <fx:item>third</fx:item>
</fx:itemize>

<fx:table>
     <fx:preamble>
         <fx:r           c='2' background='color' backgroundcolor='red'   />
         <fx:h           c='3' background='color' backgroundcolor='yellow'/>
         <fx:c r='odd'         background='color' backgroundcolor='green' />
         <fx:c r='last'        background='color' backgroundcolor='green' />
         <fx:e r='3'     c='2' background='color' backgroundcolor='blue'  />
     </fx:preamble>
     <fx:thead>
         <fx:tr> <fx:td>a</fx:td> <fx:td>b</fx:td> <fx:td>c</fx:td> </fx:tr>
         <fx:tr> <fx:td>a</fx:td> <fx:td>b</fx:td> <fx:td>c</fx:td> </fx:tr>
     </fx:thead>
     <fx:tbody>
         <fx:tr> <fx:td>a</fx:td> <fx:td>b</fx:td> <fx:td>c</fx:td> </fx:tr>
         <fx:tr> <fx:td>a</fx:td> <fx:td>b</fx:td> <fx:td>c</fx:td> </fx:tr>
         <fx:tr> <fx:td>a</fx:td> <fx:td>b</fx:td> <fx:td>c</fx:td> </fx:tr>
         <fx:tr> <fx:td>a</fx:td> <fx:td>b</fx:td> <fx:td>c</fx:td> </fx:tr>
         <fx:tr> <fx:td>a</fx:td> <fx:td>b</fx:td> <fx:td>c</fx:td> </fx:tr>
     </fx:tbody>
</fx:table>
\stopbuffer

\starttext

\showframe

\typebuffer[demo]

\processXMLbuffer[demo]

\relax

\stoptext



-----------------------------------------------------------------
                                           Hans Hagen | PRAGMA ADE
               Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
      tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com
                                              | www.pragma-pod.nl
-----------------------------------------------------------------

      parent reply	other threads:[~2004-12-15 17:14 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-12-09 21:10 XML & <formula>s Adam Lindsay
2004-12-10 21:38 ` h h extern
2004-12-10 23:02   ` Adam Lindsay
2004-12-12 21:34     ` h h extern
2004-12-13 18:02   ` mag-0008 (was: XML & <formula>s) Adam Lindsay
2004-12-13 21:23     ` Bruce D'Arcus
2004-12-15 17:16       ` mag-0008 Hans Hagen
2004-12-15 17:53         ` mag-0008 Bruce D'Arcus
2004-12-15 17:14     ` Hans Hagen [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=41C070D8.7060601@wxs.nl \
    --to=pragma@wxs.nl \
    --cc=bdarcus@fastmail.fm \
    --cc=ntg-context@ntg.nl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).