ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
* \page inside a block
@ 2006-03-15 23:53 frantisek holop
  2006-03-16 10:38 ` Hans Hagen
  0 siblings, 1 reply; 23+ messages in thread
From: frantisek holop @ 2006-03-15 23:53 UTC (permalink / raw)


hi there,

the following is a minimal example of the layout i am working on.


-----------------------%<-------------------------
% output=pdftex

\enableregime[latin2]

\setuppapersize
  [A5][A5]

\defineparagraphs
  [poem][n=2]
\setupparagraphs
  [poem][1][width=.35\textwidth]
\setupparagraphs
  [poem][2][rule=on]

\starttext

\startpoem
\section{poem}
\poem\startlines
line 1
line 2
\page
line 3
line 4
\stoplines\stoppoem
\stoptext
-----------------------%<-------------------------


when the poem gets long, i need to start a new page obviously.
but page is not working.  what am i missing here?

also, using \page is one thing, good for me, so i could tell,
flush the page right here, but i thought i'll get an automatic
pagebreak when the text gets to the bottom....

sorry if this is a very silly question, just getting my feet wet
with context....  thanks

-f
-- 
bungee diving - living it up when you're going down!

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \page inside a block
  2006-03-15 23:53 \page inside a block frantisek holop
@ 2006-03-16 10:38 ` Hans Hagen
  2006-03-16 21:50   ` frantisek holop
  2006-03-16 22:57   ` frantisek holop
  0 siblings, 2 replies; 23+ messages in thread
From: Hans Hagen @ 2006-03-16 10:38 UTC (permalink / raw)


frantisek holop wrote:
> hi there,
>
> the following is a minimal example of the layout i am working on.
>
>
> -----------------------%<-------------------------
> % output=pdftex
>
> \enableregime[latin2]
>
> \setuppapersize
>   [A5][A5]
>
> \defineparagraphs
>   [poem][n=2]
> \setupparagraphs
>   [poem][1][width=.35\textwidth]
> \setupparagraphs
>   [poem][2][rule=on]
>
> \starttext
>
> \startpoem
> \section{poem}
> \poem\startlines
> line 1
> line 2
> \page
> line 3
> line 4
> \stoplines\stoppoem
> \stoptext
> -----------------------%<-------------------------
>
>
> when the poem gets long, i need to start a new page obviously.
> but page is not working.  what am i missing here?
>   
that it's unbreakable stuff (vbox)
> also, using \page is one thing, good for me, so i could tell,
> flush the page right here, but i thought i'll get an automatic
> pagebreak when the text gets to the bottom....
>
> sorry if this is a very silly question, just getting my feet wet
> with context....  thanks
>   
actually, this is a rather complex situation; one could use a tabulate

the complication is in the line and in the fact that you want to use a 
section command

\setuppapersize[A5][A5]

\starttext

\setupcolors[state=start]

\definetextbackground
  [poem]
  [state=start,
   location=paragraph,
   background=color,
   backgroundcolor=red]

\definehead[Poem][section]
\setuphead[Poem][alternative=poemtitle,before={\blank[2*big]},after={\vskip-\lineheight},page=,style=\bfa]

% works, but may not be that robust)
%
% \defineheadplacement[poemtitle][horizontal]#1#2%
%   {\margintitle{\hskip\measure{SavedLeftSkip}#1\enspace#2}}

\defineheadplacement[poemtitle][vertical]#1#2%
  {\setupparagraphintro[first][{\llap{\hbox to 
\leftskip{#1\enspace#2\hss}}}]}

\setuplines[before=,after=]

\def\StartPoem#1%
  {\startnarrower[5*left]
   % \expanded{\definemeasure[SavedLeftSkip][\the\leftskip]}
   \Poem{#1}
   \starttextbackground[poem]
   \startlines}

\def\StopPoem
  {\stoplines
   \stoptextbackground
   \stopnarrower}

\showframe

\StartPoem{xxx}
line 1
line 2
\StopPoem

\setuptextbackground
  [poem]
  [mp=mpos:par:poem]

\startuseMPgraphic{mpos:par:poem}
  for i = 1 upto nofmultipars :
    draw leftboundary multipars[i]
        shifted (-.5EmWidth,0)
        dashed evenly
        withpen pencircle scaled 1pt
        withcolor .8red ;
  endfor ;
\stopuseMPgraphic

\StartPoem{zzz}
line 1
line 2
\StopPoem

\startuseMPgraphic{mpos:par:poem}
  for i = 1 upto nofmultipars :
    draw multipars[i]
        enlarged .5ExHeight
        rightenlarged -.5ExHeight
        dashed evenly
        withpen pencircle scaled 1pt
        withcolor .8red ;
  endfor ;
\stopuseMPgraphic

\StartPoem{qqq}
line 1
line 2
line 3
\dorecurse{100}{line 4:\recurselevel\par}
\StopPoem

\stoptext

I leave it up to you (or others) to wikify this example. It looks more 
complex than it is. By using a mp graphic you have more options

watch what happens if you add

\page

\startuseMPgraphic{mpos:par:poem}
  for i = 1 upto nofmultipars :
    multipars[i] := multipars[i]
        enlarged .5ExHeight
        rightenlarged -.5ExHeight;
    drawoptions (
        dashed evenly
        withpen pencircle scaled 1pt
        withcolor .8red
    ) ;
    if multilocs[i] = 1 :
        draw
            llcorner multipars[i] --
            ulcorner multipars[i] --
            urcorner multipars[i] --
            lrcorner multipars[i] ;
    elseif multilocs[i] = 3 :
        draw
            ulcorner multipars[i] --
            llcorner multipars[i] --
            lrcorner multipars[i] --
            urcorner multipars[i] ;
    else :
        draw leftboundary multipars[i] ;
        draw rightboundary multipars[i] ;
    fi ;
  endfor ;
\stopuseMPgraphic

\StartPoem{hhh}
\dorecurse{200}{line \recurselevel\par}
\StopPoem


-----------------------------------------------------------------
                                          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
-----------------------------------------------------------------

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \page inside a block
  2006-03-16 10:38 ` Hans Hagen
@ 2006-03-16 21:50   ` frantisek holop
  2006-03-16 22:17     ` Aditya Mahajan
  2006-03-16 22:27     ` Thomas A. Schmitz
  2006-03-16 22:57   ` frantisek holop
  1 sibling, 2 replies; 23+ messages in thread
From: frantisek holop @ 2006-03-16 21:50 UTC (permalink / raw)



black magic, all of it!  i tell you! :)))

well, Hans, i guess your middle name is \T for \TeX :)


> > when the poem gets long, i need to start a new page obviously.
> > but page is not working.  what am i missing here?
> >   
> that it's unbreakable stuff (vbox)

> > also, using \page is one thing, good for me, so i could tell,
> > flush the page right here, but i thought i'll get an automatic
> > pagebreak when the text gets to the bottom....
> >   
> actually, this is a rather complex situation; one could use a tabulate

i myself had this feeling that the columns will not behave
if longer than a page.  but i had my fingers crossed, because
they are set up as "paragraphs" (\setupparagraphs), and paragraphs
don't have problems with page break, do they?

but after sending the mail, it just occured to me, that in this
special case, poems, static text, don't need much flexibility or
automagic, so doing a

\startpoem
\section{poem}
\poem\startlines
line 1
line 2
\stoplines\stoppoem

\page\startpoem
\poem\startlines
line 3
line 4
\stoplines\stoppoem
\stoptext

does exactly what i want :)))




nevertheless what you just did there was very impressive....
i will study it in details, but i am not a great tex master.
i'd like to do context/books for a living, but until it's
only a hobby, it just needs too much effort learning all
the stuff, and to "keep in shape".


my biggest problem with starting context is the lack of examples.
it is not hard to find .tex files for latex, but context is different...

i think it would certainly help heaps if the manual source was
released, just like the \TeXbook's...  at least the old manual's
sources...

i think i have read something about this issue, but i don't remember
where or when :)

i know it must be an awful lot of work to make impressive manuals like
that, but they are not sold commercionally, are they?  is it not the
aim to make context more widespread?  so when we post a question here
about a silly layout problem, hundreds and hundreds of people would
answer :)))

i will certainly try to put more examples into the wiki, after i
understand them :)

-f
-- 
one family builds a wall, two families enjoy it.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \page inside a block
  2006-03-16 21:50   ` frantisek holop
@ 2006-03-16 22:17     ` Aditya Mahajan
  2006-03-16 22:27     ` Thomas A. Schmitz
  1 sibling, 0 replies; 23+ messages in thread
From: Aditya Mahajan @ 2006-03-16 22:17 UTC (permalink / raw)


On Thu, 16 Mar 2006, frantisek holop wrote:
> my biggest problem with starting context is the lack of examples.
> it is not hard to find .tex files for latex, but context is different...
>
> i think it would certainly help heaps if the manual source was
> released, just like the \TeXbook's...  at least the old manual's
> sources...
>
> i think i have read something about this issue, but i don't remember
> where or when :)

You can check out the manual sources from the svn respository 
svn://ctx.pragma-ade.nl/manuals

If you prefer to browse them online they are available at
http://context.aanhet.net/svn/

Aditya

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \page inside a block
  2006-03-16 21:50   ` frantisek holop
  2006-03-16 22:17     ` Aditya Mahajan
@ 2006-03-16 22:27     ` Thomas A. Schmitz
  1 sibling, 0 replies; 23+ messages in thread
From: Thomas A. Schmitz @ 2006-03-16 22:27 UTC (permalink / raw)



On Mar 16, 2006, at 10:50 PM, frantisek holop wrote:

> i think it would certainly help heaps if the manual source was
> released, just like the \TeXbook's...  at least the old manual's
> sources...
>

It is, in fact: have a look at http://context.aanhet.net/svn/ and  
enjoy...

Thomas

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \page inside a block
  2006-03-16 10:38 ` Hans Hagen
  2006-03-16 21:50   ` frantisek holop
@ 2006-03-16 22:57   ` frantisek holop
  2006-03-17 18:49     ` Willi Egger
  1 sibling, 1 reply; 23+ messages in thread
From: frantisek holop @ 2006-03-16 22:57 UTC (permalink / raw)


so,

lo and behold, a beginner \TeX{}er's "solution":

-----------------------%<-------------------------
\defineparagraphs
  [poem][n=2]
\setupparagraphs
  [poem][1][width=.35\textwidth]
\setupparagraphs
  [poem][2][rule=on]

\def\StartPoem#1{%
  \startpoem
  \ifx#1\undefined\else\section{#1}\fi
  \poem\startlines}
\def\StopPoem{%
  \stoplines\stoppoem\page}
\def\PoemPage{%
  \StopPoem
  \StartPoem{}}

\starttext

\StartPoem{poem1}
line 1
line 2
\StopPoem

\StartPoem{poem2}
line 1
line 2
\PoemPage
line 3
line 4
\StopPoem

\stoptext
-----------------------%<-------------------------

as the poems are quite static, and in this case it is
actually better if i can "cut" the page at a convinient
point, i think this is an easier "hack"
(at the moment for me definitely) :))))))

and it also takes care of the \startlines \stoplines
i asked about earlier.  not that Taco's solution
did not work, but this is much more primitive,
and so better at the moment.


i have another question.  how can i modify how the "rule"
will look like?  the closest thing i have found in the
manual was \setupmarginrules but \setupmarginrules[thickness=5]
did nothing.


thanks to everyone for pointing out where the manual sources are.

-f
-- 
a fool searches for a greater fool to find admiration.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \page inside a block
  2006-03-16 22:57   ` frantisek holop
@ 2006-03-17 18:49     ` Willi Egger
  2006-03-26 19:42       ` \setupmarginrules (was: Re: \page inside a block) frantisek holop
  0 siblings, 1 reply; 23+ messages in thread
From: Willi Egger @ 2006-03-17 18:49 UTC (permalink / raw)


Hi Frantisek

The correct command is \setupmarginrules[rulethickness=2pt]. The option 
is rulethickness and it takes a dimension.

Willi

frantisek holop wrote:

>i have another question.  how can i modify how the "rule"
>will look like?  the closest thing i have found in the
>manual was \setupmarginrules but \setupmarginrules[thickness=5]
>did nothing.
>
>
>thanks to everyone for pointing out where the manual sources are.
>
>-f
>  
>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* \setupmarginrules (was: Re:  \page inside a block)
  2006-03-17 18:49     ` Willi Egger
@ 2006-03-26 19:42       ` frantisek holop
  2006-03-26 20:12         ` \setupmarginrules Vit Zyka
  0 siblings, 1 reply; 23+ messages in thread
From: frantisek holop @ 2006-03-26 19:42 UTC (permalink / raw)


hmm, on Fri, Mar 17, 2006 at 07:49:57PM +0100, Willi Egger said that
> Hi Frantisek
> 
> The correct command is \setupmarginrules[rulethickness=2pt]. The option 
> is rulethickness and it takes a dimension.

i have tried this and it doesn't seem to work.

\defineparagraphs       [poem][n=2]
\setupparagraphs        [poem][1][width=.25\textwidth]
\setupparagraphs        [poem][2][rule=on]

\setupmarginrules       [rulethickness=5pt]

the rule in front of the 2nd column (poem[2]) still
has the default thickness.

-f
-- 
strength of mind: person who can eat one salted peanut.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-26 19:42       ` \setupmarginrules (was: Re: \page inside a block) frantisek holop
@ 2006-03-26 20:12         ` Vit Zyka
  2006-03-26 20:41           ` \setupmarginrules frantisek holop
  0 siblings, 1 reply; 23+ messages in thread
From: Vit Zyka @ 2006-03-26 20:12 UTC (permalink / raw)


frantisek holop wrote:
> hmm, on Fri, Mar 17, 2006 at 07:49:57PM +0100, Willi Egger said that
> 
>>Hi Frantisek
>>
>>The correct command is \setupmarginrules[rulethickness=2pt]. The option 
>>is rulethickness and it takes a dimension.
> 
> 
> i have tried this and it doesn't seem to work.
> 
> \defineparagraphs       [poem][n=2]
> \setupparagraphs        [poem][1][width=.25\textwidth]
> \setupparagraphs        [poem][2][rule=on]
> 
> \setupmarginrules       [rulethickness=5pt]

Hi,

this sets rules for margins. I guess the solution

\setupparagraphs        [poem][2][rule=on,rulethickness=5pt]

Vit

> the rule in front of the 2nd column (poem[2]) still
> has the default thickness.
> 
> -f

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-26 20:12         ` \setupmarginrules Vit Zyka
@ 2006-03-26 20:41           ` frantisek holop
  2006-03-27 20:54             ` \setupmarginrules Vit Zyka
  0 siblings, 1 reply; 23+ messages in thread
From: frantisek holop @ 2006-03-26 20:41 UTC (permalink / raw)


hmm, on Sun, Mar 26, 2006 at 10:12:01PM +0200, Vit Zyka said that
> > \defineparagraphs       [poem][n=2]
> > \setupparagraphs        [poem][1][width=.25\textwidth]
> > \setupparagraphs        [poem][2][rule=on]
> > 
> > \setupmarginrules       [rulethickness=5pt]
> 
> this sets rules for margins. I guess the solution
> 
> \setupparagraphs        [poem][2][rule=on,rulethickness=5pt]

sorry, i forgot to add, that i tried this one also :)
seemed logical, but the result is the same.

-f
-- 
it is better to be hated than to be ignored.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-26 20:41           ` \setupmarginrules frantisek holop
@ 2006-03-27 20:54             ` Vit Zyka
  2006-03-28 14:49               ` \setupmarginrules Willi Egger
  0 siblings, 1 reply; 23+ messages in thread
From: Vit Zyka @ 2006-03-27 20:54 UTC (permalink / raw)


frantisek holop wrote:
> hmm, on Sun, Mar 26, 2006 at 10:12:01PM +0200, Vit Zyka said that
> 
>>>\defineparagraphs       [poem][n=2]
>>>\setupparagraphs        [poem][1][width=.25\textwidth]
>>>\setupparagraphs        [poem][2][rule=on]
>>>
>>>\setupmarginrules       [rulethickness=5pt]
>>
>>this sets rules for margins. I guess the solution
>>
>>\setupparagraphs        [poem][2][rule=on,rulethickness=5pt]
> 
> 
> sorry, i forgot to add, that i tried this one also :)
> seemed logical, but the result is the same.
> 
> -f

OK, there is a patch (with minor correction):

-----------------------------------------------------------
\defineparagraphs       [poem][n=2,distance=20pt]
\setupparagraphs        [poem][1][width=.25\textwidth]
\setupparagraphs        [poem][2][rule=on,rulethickness=10pt]

\unprotected
\def\doalinealijn#1#2%
   {\doifelsevalue{\??al#2\the\alteller\c!rule}\v!on
      {\dimen2=#1\relax
       \hskip.5\dimen2
%      \hskip-\linewidth
       \hskip-.5\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
%      \vrule\!!width\linewidth
       \vrule\!!width\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
       \hskip-.5\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
       \hskip.5\dimen2}
      {\hskip#1}}

\starttext
\startpoem
\input knuth
\nextpoem
\input knuth
\stoppoem
\stoptext
-----------------------------------------------------------------

for distro it also should be accompanied by

       \c!rulethickness=\linewidth,

in \def\dodefineparagraphs[#1][#2]%

Vit

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-27 20:54             ` \setupmarginrules Vit Zyka
@ 2006-03-28 14:49               ` Willi Egger
  2006-03-28 15:05                 ` \setupmarginrules Taco Hoekwater
  2006-03-28 15:10                 ` \setupmarginrules Vit Zyka
  0 siblings, 2 replies; 23+ messages in thread
From: Willi Egger @ 2006-03-28 14:49 UTC (permalink / raw)


Hi Vit!

Thanks for this patch. Do you know why the rulethickness must be given 
in integer dimension. e.g. 2.5pt will cause an error, telling that a 
wrong dimension is used.

Willi

Vit Zyka wrote:

>frantisek holop wrote:
>  
>
>>hmm, on Sun, Mar 26, 2006 at 10:12:01PM +0200, Vit Zyka said that
>>
>>    
>>
>>>>\defineparagraphs       [poem][n=2]
>>>>\setupparagraphs        [poem][1][width=.25\textwidth]
>>>>\setupparagraphs        [poem][2][rule=on]
>>>>
>>>>\setupmarginrules       [rulethickness=5pt]
>>>>        
>>>>
>>>this sets rules for margins. I guess the solution
>>>
>>>\setupparagraphs        [poem][2][rule=on,rulethickness=5pt]
>>>      
>>>
>>sorry, i forgot to add, that i tried this one also :)
>>seemed logical, but the result is the same.
>>
>>-f
>>    
>>
>
>OK, there is a patch (with minor correction):
>
>-----------------------------------------------------------
>\defineparagraphs       [poem][n=2,distance=20pt]
>\setupparagraphs        [poem][1][width=.25\textwidth]
>\setupparagraphs        [poem][2][rule=on,rulethickness=10pt]
>
>\unprotected
>\def\doalinealijn#1#2%
>   {\doifelsevalue{\??al#2\the\alteller\c!rule}\v!on
>      {\dimen2=#1\relax
>       \hskip.5\dimen2
>%      \hskip-\linewidth
>       \hskip-.5\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
>%      \vrule\!!width\linewidth
>       \vrule\!!width\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
>       \hskip-.5\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
>       \hskip.5\dimen2}
>      {\hskip#1}}
>
>\starttext
>\startpoem
>\input knuth
>\nextpoem
>\input knuth
>\stoppoem
>\stoptext
>-----------------------------------------------------------------
>
>for distro it also should be accompanied by
>
>       \c!rulethickness=\linewidth,
>
>in \def\dodefineparagraphs[#1][#2]%
>
>Vit
>_______________________________________________
>ntg-context mailing list
>ntg-context@ntg.nl
>http://www.ntg.nl/mailman/listinfo/ntg-context
>  
>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-28 14:49               ` \setupmarginrules Willi Egger
@ 2006-03-28 15:05                 ` Taco Hoekwater
  2006-03-28 15:10                 ` \setupmarginrules Vit Zyka
  1 sibling, 0 replies; 23+ messages in thread
From: Taco Hoekwater @ 2006-03-28 15:05 UTC (permalink / raw)



Hi Willi (and Vit),

Willi Egger wrote:
> Hi Vit!
> 
> Thanks for this patch. Do you know why the rulethickness must be given 
> in integer dimension. e.g. 2.5pt will cause an error, telling that a 
> wrong dimension is used.

(I'll pretend to be Vit)

That is because in that case, it expands to  \hskip -.52.5pt

Try this:

   \unprotected
   \def\doalinealijn#1#2%
     {\doifelsevalue{\??al#2\the\alteller\c!rule}\v!on
       {\dimen2=#1\relax
        \dimen4=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
        \hskip.5\dimen2
        \hskip-.5\dimen4 % TH
        \vrule\!!width\dimen4 % TH
        \hskip-.5\dimen4 % TH
        \hskip.5\dimen2}
       {\hskip#1}}

Cheers, Taco

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-28 14:49               ` \setupmarginrules Willi Egger
  2006-03-28 15:05                 ` \setupmarginrules Taco Hoekwater
@ 2006-03-28 15:10                 ` Vit Zyka
  2006-03-28 15:14                   ` \setupmarginrules Taco Hoekwater
                                     ` (2 more replies)
  1 sibling, 3 replies; 23+ messages in thread
From: Vit Zyka @ 2006-03-28 15:10 UTC (permalink / raw)


Willi Egger wrote:
> Hi Vit!
> 
> Thanks for this patch. Do you know why the rulethickness must be given 
> in integer dimension. e.g. 2.5pt will cause an error, telling that a 
> wrong dimension is used.
> 
> Willi

Due to my fault. Sorry. This is a little bit better solution:

-----------------------------------------------
\defineparagraphs       [poem][n=2,distance=20pt]
\setupparagraphs        [poem][1][width=.25\textwidth]
\setupparagraphs        [poem][2][rule=on,rulethickness=5.5pt]

\unprotected
\def\doalinealijn#1#2%
   {\doifelsevalue{\??al#2\the\alteller\c!rule}\v!on
      {\dimen2=#1\relax
       \dimen3=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
       \hskip.5\dimen2
%      \hskip-\linewidth
       \hskip-.5\dimen3 % VZ
%      \vrule\!!width\linewidth
       \vrule\!!width\dimen3 % VZ
       \hskip-.5\dimen3 % VZ
       \hskip.5\dimen2}
      {\hskip#1}}

\starttext
\startpoem
\input knuth
\nextpoem
\input knuth
\stoppoem
\stoptext
----------------------------------------------------

Vit

> Vit Zyka wrote:
> 
> 
>>frantisek holop wrote:
>> 
>>
>>
>>>hmm, on Sun, Mar 26, 2006 at 10:12:01PM +0200, Vit Zyka said that
>>>
>>>   
>>>
>>>
>>>>>\defineparagraphs       [poem][n=2]
>>>>>\setupparagraphs        [poem][1][width=.25\textwidth]
>>>>>\setupparagraphs        [poem][2][rule=on]
>>>>>
>>>>>\setupmarginrules       [rulethickness=5pt]
>>>>>       
>>>>>
>>>>
>>>>this sets rules for margins. I guess the solution
>>>>
>>>>\setupparagraphs        [poem][2][rule=on,rulethickness=5pt]
>>>>     
>>>>
>>>
>>>sorry, i forgot to add, that i tried this one also :)
>>>seemed logical, but the result is the same.
>>>
>>>-f

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-28 15:10                 ` \setupmarginrules Vit Zyka
@ 2006-03-28 15:14                   ` Taco Hoekwater
  2006-03-28 16:58                     ` \setupmarginrules Vit Zyka
  2006-03-30 19:18                     ` \setupmarginrules Willi Egger
  2006-03-28 16:42                   ` \setupmarginrules Hans Hagen
  2006-03-28 17:12                   ` \setupmarginrules Hans Hagen
  2 siblings, 2 replies; 23+ messages in thread
From: Taco Hoekwater @ 2006-03-28 15:14 UTC (permalink / raw)




Vit Zyka wrote:
>        \dimen3=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ

Taco Hoekwater wrote:
>        \dimen4=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ

That's funny ;)

Cheers, Taco

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-28 15:10                 ` \setupmarginrules Vit Zyka
  2006-03-28 15:14                   ` \setupmarginrules Taco Hoekwater
@ 2006-03-28 16:42                   ` Hans Hagen
  2006-03-28 17:12                   ` \setupmarginrules Hans Hagen
  2 siblings, 0 replies; 23+ messages in thread
From: Hans Hagen @ 2006-03-28 16:42 UTC (permalink / raw)


Vit Zyka wrote:
> Willi Egger wrote:
>   
>> Hi Vit!
>>
>> Thanks for this patch. Do you know why the rulethickness must be given 
>> in integer dimension. e.g. 2.5pt will cause an error, telling that a 
>> wrong dimension is used.
>>
>> Willi
>>     
>
> Due to my fault. Sorry. This is a little bit better solution:
>
> -----------------------------------------------
> \defineparagraphs       [poem][n=2,distance=20pt]
> \setupparagraphs        [poem][1][width=.25\textwidth]
> \setupparagraphs        [poem][2][rule=on,rulethickness=5.5pt]
>
> \unprotected
> \def\doalinealijn#1#2%
>    {\doifelsevalue{\??al#2\the\alteller\c!rule}\v!on
>       {\dimen2=#1\relax
>        \dimen3=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
>        \hskip.5\dimen2
> %      \hskip-\linewidth
>        \hskip-.5\dimen3 % VZ
> %      \vrule\!!width\linewidth
>        \vrule\!!width\dimen3 % VZ
>        \hskip-.5\dimen3 % VZ
>        \hskip.5\dimen2}
>       {\hskip#1}}
>
> \starttext
> \startpoem
> \input knuth
> \nextpoem
> \input knuth
> \stoppoem
> \stoptext
> ----------------------------------------------------
>   
don't use dimen 3 locally (tex convention, has to do with stack build-up) 

Hans 

-----------------------------------------------------------------
                                          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
-----------------------------------------------------------------

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-28 15:14                   ` \setupmarginrules Taco Hoekwater
@ 2006-03-28 16:58                     ` Vit Zyka
  2006-03-28 17:13                       ` \setupmarginrules Hans Hagen
  2006-03-30 19:18                     ` \setupmarginrules Willi Egger
  1 sibling, 1 reply; 23+ messages in thread
From: Vit Zyka @ 2006-03-28 16:58 UTC (permalink / raw)


Taco Hoekwater wrote:
> 
> Vit Zyka wrote:
> 
>>       \dimen3=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
> 
> 
> Taco Hoekwater wrote:
> 
>>       \dimen4=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
> 
> 
> That's funny ;)
> 
> Cheers, Taco

Yes funny. Even line position is the same. But why 4? I know: why not.

Will be move to distro? (Indifferent which version.) Old code contained 
buggy space calculation and the rule position, I think.

Vit

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-28 15:10                 ` \setupmarginrules Vit Zyka
  2006-03-28 15:14                   ` \setupmarginrules Taco Hoekwater
  2006-03-28 16:42                   ` \setupmarginrules Hans Hagen
@ 2006-03-28 17:12                   ` Hans Hagen
  2006-03-28 18:55                     ` \setupmarginrules Vit Zyka
  2006-03-28 21:44                     ` \setupmarginrules frantisek holop
  2 siblings, 2 replies; 23+ messages in thread
From: Hans Hagen @ 2006-03-28 17:12 UTC (permalink / raw)


[-- Attachment #1: Type: text/plain, Size: 2057 bytes --]

Vit Zyka wrote:
> Willi Egger wrote:
>   
>> Hi Vit!
>>
>> Thanks for this patch. Do you know why the rulethickness must be given 
>> in integer dimension. e.g. 2.5pt will cause an error, telling that a 
>> wrong dimension is used.
>>
>> Willi
>>     
>
> Due to my fault. Sorry. This is a little bit better solution:
>
> -----------------------------------------------
> \defineparagraphs       [poem][n=2,distance=20pt]
> \setupparagraphs        [poem][1][width=.25\textwidth]
> \setupparagraphs        [poem][2][rule=on,rulethickness=5.5pt]
>
> \unprotected
> \def\doalinealijn#1#2%
>    {\doifelsevalue{\??al#2\the\alteller\c!rule}\v!on
>       {\dimen2=#1\relax
>        \dimen3=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
>        \hskip.5\dimen2
> %      \hskip-\linewidth
>        \hskip-.5\dimen3 % VZ
> %      \vrule\!!width\linewidth
>        \vrule\!!width\dimen3 % VZ
>        \hskip-.5\dimen3 % VZ
>        \hskip.5\dimen2}
>       {\hskip#1}}
>   
\def\doalinealijn#1#2%
  {\doifelsevalue{\??al#2\the\alteller\c!rule}\v!on
     {\linewidth\getvalue{\??al#2\the\alteller\c!rulethickness}%
      \scratchdimen#1%
      \advance\scratchdimen-\linewidth
      \divide\scratchdimen \plustwo
      \hskip\scratchdimen
      \vrule\!!width\linewidth
      \hskip\scratchdimen}
     {\hskip#1}}

btw, this feature is pretty old, and therefore a bit crappy; for 
instance, the spacing in this example poem is funny (topskip) so i 
wonder if the attached file works better (maybe optional); can those who 
use paragraphs this wau test the attached variant (for taco: raises the 
result by strutheight)

(beware: i un-dutched the file a bit)

Hans

-----------------------------------------------------------------
                                          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
-----------------------------------------------------------------


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: core-mis.tex --]
[-- Type: text/x-tex; name="core-mis.tex", Size: 81980 bytes --]

%D \module
%D   [       file=core-mis,
%D        version=1998.01.29,
%D          title=\CONTEXT\ Core Macros,
%D       subtitle=Miscelaneous,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / 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.

\writestatus{loading}{Context Core Macros / Misc Commands}

% todo: kleur in legenda + letter

% Obsolete
%
% \startmessages  dutch  library: systems
%   title: systeem
%       3: probeer LaTeX eens
% \stopmessages
%
% \startmessages  english  library: systems
%   title: system
%       3: try LaTeX
% \stopmessages
%
% \startmessages  german  library: systems
%   title: system
%       3: Versuche LaTeX
% \stopmessages
%
% \startmessages  czech  library: systems
%   title: system
%       3: zkuste LaTeX
% \stopmessages
%
% \startmessages  italian  library: systems
%   title: sistema
%       3: provare LaTeX
% \stopmessages
%
% \startmessages  norwegian  library: systems
%   title: system
%       3: forsøker LaTeX
% \stopmessages
%
% \startmessages  romanian  library: systems
%   title: sistem
%       3: incercati LaTeX
% \stopmessages
%

% %D You would not expect the next macro in \CONTEXT,
% %D wouldn't you? It's there to warn \LATEX\ users that
% %D something is wrong.
% %D
% %D Obsolete now:
% %
% % \def\documentstyle{\showmessage\m!systems3\empty\stoptekst}
% %
% % \let\documentclass=\documentstyle
% %D \macros
% %D   {simplifiedcommands, simplifycommands}
% %D
% %D I first needed this simplification in bookmarks. Users can
% %D add their own if needed.

\unprotect

%D Sometimes (for instance in bookmarks) we need to simplify macro
%D behaviour, so here is the hook.

\ifx\simplifiedcommands\undefined \newtoks\simplifiedcommands \fi

\def\simplifycommands{\the\simplifiedcommands}

%D A possibly growing list:

%appendtoks        \def\executesynonym#1#2#3#4{#3}\to\simplifiedcommands
%appendtoks             \def\executesort#1#2#3{#3}\to\simplifiedcommands

\appendtoks                                \def\ { }\to\simplifiedcommands
\appendtoks  \def\type#1{\string\\\strippedcsname#1}\to\simplifiedcommands
\appendtoks                            \def\TeX{TeX}\to\simplifiedcommands
\appendtoks                    \def\ConTeXt{ConTeXt}\to\simplifiedcommands
\appendtoks                  \def\MetaPost{MetaPost}\to\simplifiedcommands
\appendtoks                  \def\MetaFont{MetaFont}\to\simplifiedcommands
\appendtoks                    \def\MetaFun{MetaFun}\to\simplifiedcommands
%appendtoks                                \def||{-}\to\simplifiedcommands
\appendtoks  \def|#1|{\ifx#1\empty\empty-\else#1\fi}\to\simplifiedcommands

\appendtoks\let\buildtextaccent\secondoftwoarguments\to\simplifiedcommands
\f
% THIS WAS MAIN-002.TEX

%\def\checkinterlineskip
%  {\ifvmode
%     \ifdim\lastskip>\zeropoint
%       \nointerlineskip
%     \else\ifdim\lastkern>\zeropoint
%       \nointerlineskip
%     \fi\fi
%   \fi}

\def\horitems#1#2% #1=breedte #2=commandos
  {\scratchdimen#1%
   \divide\scratchdimen \nofitems
   \!!counta\zerocount
   \def\docommando##1%
     {\advance\!!counta \plusone
      \processaction
        [\@@isalign]
        [   \v!left=>\hbox to \scratchdimen{\strut##1\hss},
           \v!right=>\hbox to \scratchdimen{\hss\strut##1},
          \v!middle=>\hbox to \scratchdimen{\hss\strut##1\hss},
          \v!margin=>\ifnum\!!counta=\plusone\hss\else\hfill\fi
                     \strut##1%
                     \ifnum\!!counta=\nofitems\hss\else\hfill\fi,
         \s!default=>\hbox to \scratchdimen{\hss\strut##1\hss}, % midden
         \s!unknown=>\hbox to \scratchdimen{\strut##1\hss}]}%   % links
   \hbox to #1{\hss#2\hss}}

\def\veritems#1#2% #1=breedte #2=commandos
  {\scratchdimen#1%
   \def\docommando##1%
     {\ifdim\scratchdimen<\zeropoint % the - was a signal
        \hbox to -\scratchdimen{\hss\strut##1}%
      \else\ifdim\scratchdimen>\zeropoint
        \hbox to \scratchdimen{\strut##1\hss}%
      \else
        \hbox{\strut##1}%
      \fi\fi}%
   \vbox{#2}}

\def\dosetupitems[#1]%
  {\getparameters[\??is][#1]%
   \doif\@@iswidth\v!unknown
     {\def\@@iswidth{\hsize}}%
   \doifconversiondefinedelse\@@issymbol
     {\def\doitembullet##1{\convertnumber{\@@issymbol}{##1}}}
     {\doifsymboldefinedelse\@@issymbol
        {\def\doitembullet##1{\symbol[\@@issymbol]}}{}}}

\def\makeitemsandbullets#1%
  {\doifelse\@@isn\v!unknown
     {\getcommalistsize[#1]%
      \edef\nofitems{\commalistsize}}
     {\edef\nofitems{\@@isn}}%
   \setbox0\hbox
     {\doitems \@@iswidth
        {\processcommalist[#1]\docommando}}%
   \setbox2\hbox
     {\doitems \@@isbulletbreedte
        {\dorecurse\nofitems
           {\docommando{\strut\doitembullet\recurselevel}}}}}

\def\dostartitems#1#2#3%
  {\let\doitems#2%
   \def\@@isbulletbreedte{#3}%
   \makeitemsandbullets{#1}%
   \@@isbefore}

\def\dostopitems
  {\@@isafter
   \egroup}

\setvalue{doitems\v!top}#1%
  {\dostartitems{#1}\horitems\@@iswidth
   \noindent\vbox
     {\forgetall
      \doifsomething\@@issymbol
        {\doifnot\@@issymbol\v!none
           {\box2
            \@@isinbetween
            \nointerlineskip}}%
      \box0}%
   \dostopitems}

\setvalue{doitems\v!bottom}#1%
  {\dostartitems{#1}\horitems\@@iswidth
   \noindent\vbox
     {\forgetall
      \box0
      \doifsomething\@@issymbol
        {\@@isinbetween
         \nointerlineskip
         \box2}}%
   \dostopitems}

\setvalue{doitems\v!inmargin}#1%
  {\dostartitems{#1}\veritems{-1.5em}%  - is a signal
   \noindent\hbox{\llap{\box2\hskip\leftmargindistance}\box0}%
   \dostopitems}

\setvalue{doitems\v!left}#1%
  {\advance\hsize -1.5em%
   \dostartitems{#1}\veritems{1.5em}%
   \noindent\hbox{\box2\box0}%
   \dostopitems}

\setvalue{doitems\v!right}#1%
  {\dostartitems{#1}\veritems{0em}%
   \noindent\hbox{\box0\hskip-\wd2\box2}%
   \dostopitems}

\def\setupitems
  {\dosingleargument\dosetupitems}

\def\complexitems[#1]%
  {\bgroup
   \setupitems[#1]%
   \parindent\zeropoint
   \setlocalhsize
   \hsize\localhsize
   \dontcomplain
  %\doifundefined{doitems\@@islocation}%
  %  {\let\@@islocation\v!left}%
  %\getvalue{doitems\@@islocation}}
   \executeifdefined{doitems\@@islocation}{\let\@@islocation\v!left}}

\definecomplexorsimpleempty\items

\setupitems
  [\c!location=\v!left,
   \c!symbol=5,
   \c!width=\hsize,
   \c!align=\v!middle,
   \c!n=\v!unknown,
   \c!before=\blank,
   \c!inbetween={\blank[\v!medium]},
   \c!after=\blank]
\f
% Te zijner tijd [plaats=boven,onder,midden] implementeren,
% in dat geval moet eerst de maximale hoogte worden bepaald.
%
% Overigens kan een en ander mooier met \halign.

\def\dodefineparagraphs[#1][#2]%
  {\setvalue{\s!do\s!next#1}%
     {\def\\{\getvalue{#1}}}%
   \setvalue{#1}%
     {\getvalue{\s!do\s!next#1}%
      \dostartparagraphs{#1}}%
   \setvalue{\e!next#1}%
     {\getvalue{#1}}%
   \setvalue{\e!start#1}%
     {\bgroup
      \letvalue{\s!do\s!next#1}\empty
      \setvalue{\e!stop#1}%
        {\getvalue{#1}%
         \egroup}%
      \getvalue{#1}}%
   \getparameters[\??al#1]%
     [\c!n=3,
      \c!before=\blank,
      \c!after=\blank,
      \c!distance=1em,
      \c!height=\v!fit,
      \c!rule=\v!off,
      \c!command=,
      \c!align=,
      \c!tolerance=\v!tolerant,
      \c!style=,
      \c!color=,
      \c!top=,
      \c!top=\vss,
      \c!bottom=\vfill,
      #2]%
   \setvalue{\e!setup#1\e!endsetup}%
     {\setupparagraphs[#1]}%
   \dorecurse
      {\getvalue{\??al#1\c!n}}
      {\setupparagraphs[#1][\recurselevel]
         [\c!width=,
          \c!bottom=\getvalue{\??al#1\c!bottom},
          \c!top=\getvalue{\??al#1\c!top},
          \c!height=\getvalue{\??al#1\c!height},
          \c!style=\getvalue{\??al#1\c!style},
          \c!color=\getvalue{\??al#1\c!color},
          \c!rule=\getvalue{\??al#1\c!rule},
          \c!align=\getvalue{\??al#1\c!align},
          \c!tolerance=\getvalue{\??al#1\c!tolerance},
          \c!distance=\getvalue{\??al#1\c!distance}]}%
   \setupparagraphs[#1][1][\c!distance=0em]}

\def\defineparagraphs
  {\dodoubleargument\dodefineparagraphs}

\def\dosetupparagraphs[#1][#2][#3]%
  {\doifelse{#2}\v!each
     {\dorecurse
        {\getvalue{\??al#1\c!n}}
        {\getparameters[\??al#1\recurselevel][#3]}}
     {\ConvertToConstant\doifelse{#3}{}
        {\getparameters[\??al#1][#2]}
        {\def\docommando##1%
           {\getparameters[\??al#1##1][#3]}%
         \processcommalist[#2]\docommando}}}

\def\setupparagraphs
  {\dotripleempty\dosetupparagraphs}

\newcount\alcounter
\newcount\alnsize
\newdimen\alhsize

\def\doparagraphrule#1#2%
  {\doifelsevalue{\??al#2\the\alcounter\c!rule}\v!on
     {\linewidth\getvalue{\??al#2\the\alcounter\c!rulethickness}%
      \scratchdimen#1%
      \advance\scratchdimen-\linewidth
      \divide\scratchdimen \plustwo
      \hskip\scratchdimen
      \vrule\!!width\linewidth
      \hskip\scratchdimen}
     {\hskip#1}}

\def\dostartparagraph#1%
  {\doifelsevaluenothing{\??al#1\the\alcounter\c!width}
     {\!!widtha\alhsize
      \divide\!!widtha \alnsize}
     {\!!widtha\getvalue{\??al#1\the\alcounter\c!width}}%
   \dostartattributes
     {\??al#1\the\alcounter}\c!style\c!color
     \empty
   \doifelsevalue{\??al#1\the\alcounter\c!height}\v!fit
     {\setbox0\vtop}
     {\setbox0\vtop to \getvalue{\??al#1\the\alcounter\c!height}}%
   \bgroup
   \blank[\v!disable]%
   \forgetall
   \getvalue{\??al#1\the\alcounter\c!top}%
   \getvalue{\??al#1\c!inner}%
   \hsize\!!widtha  % setting \wd afterwards removed
   \getvalue{\??al#1\the\alcounter\c!inner}%
   \edef\!!stringa{\getvalue{\??al#1\the\alcounter\c!align}}%  nodig?
   \expandafter\setupalign\expandafter[\!!stringa]%
   \edef\!!stringa{\getvalue{\??al#1\the\alcounter\c!tolerance}}% nodig?
   \expandafter\setuptolerance\expandafter[\!!stringa]%
   \ignorespaces
   \endgraf
   \ignorespaces
   %
   % Nadeel van de onderstaande constructie is dat \everypar
   % binnen een groep kan staan en zo steeds \begstruts
   % worden geplaatst. Mooi is anders dus moet het anders!
   %
   % Hier is \Everypar niet nodig.
   %
   \everypar{\begstrut\everypar\emptytoks}%
   %
   \ignorespaces\geenspatie % dubbel: \ignorespaces
   \getvalue{\??al#1\the\alcounter\c!command}}

\def\dostopparagraph#1%
  {\ifvmode
     \removelastskip
   \else
     \unskip\endstrut\endgraf
   \fi
   \getvalue{\??al#1\the\alcounter\c!bottom}%
   \egroup
   \ifdim\wd0=\zeropoint % no data
     \wd0\!!widtha
   \fi
   \box0
   \dostopattributes
   %\ifnum\alcounter<\getvalue{\??al#1\c!n}\relax
   %  \def\next{\doparagraphcell{#1}}%
   %\else
   %  \def\next{\dostopparagraphs{#1}}%
   %\fi
   %\next}
   \ifnum\alcounter<\getvalue{\??al#1\c!n}\relax
     \@EA\doparagraphcell
   \else
     \@EA\dostopparagraphs
   \fi{#1}}

\def\doparagraphcell#1%
  {\global\advance\alcounter \plusone
   \doifelsevaluenothing{\??al#1\the\alcounter\c!distance}
     {\doifnot{\the\alcounter}{1}
        {\hskip\getvalue{\??al#1\c!distance}}}
     {\doifelse{\the\alcounter}{1}%
        {\hskip\getvalue{\??al#1\the\alcounter\c!distance}}
        {\doparagraphrule{\getvalue{\??al#1\the\alcounter\c!distance}}{#1}}}%
   \setvalue{#1}{\dostopparagraph{#1}}%
   \dostartparagraph{#1}}

\def\dostartparagraphs#1%
  {\global\alcounter\zerocount
   \parindent\zeropoint
   \setlocalhsize
   \alhsize\localhsize
   \alnsize\getvalue{\??al#1\c!n}\relax
   \dorecurse
     {\getvalue{\??al#1\c!n}}
     {\doifelsevaluenothing{\??al#1\recurselevel\c!distance}
        {\ifnum\recurselevel=\plusone\else
           \global\advance\alhsize -\getvalue{\??al#1\c!distance}\relax
         \fi}
        {\global\advance\alhsize -\getvalue{\??al#1\recurselevel\c!distance}\relax}%
      \doifvaluesomething{\??al#1\recurselevel\c!width}
        {\global\advance\alnsize \minusone
         \global\advance\alhsize -\getvalue{\??al#1\recurselevel\c!width}\relax}}%
   %\whitespace                 % gaat fout bij \framed
   \getvalue{\??al#1\c!before}%
   \leavevmode                 % gaat wel goed bij \framed, brrr
   \setbox\scratchbox\vbox\bgroup\hbox\bgroup\doparagraphcell{#1}}

\def\dostopparagraphs#1%
  {\egroup
   \egroup
   \iftrue
     \hbox{\raise\strutheight\box\scratchbox}% new
   \else
     \box\scratchbox % old
   \fi
   \par
   \getvalue{\??al#1\c!after}}%
\f
\def\dosetuptab[#1]%
  {\getparameters[\??ta]
     [\c!headstyle=\v!normal,
      \c!headcolor=,
      \c!style=\v!normal,
      \c!color=,
      \c!width=\v!broad,
      \c!sample={\hskip4em},
      \c!before=,
      \c!after=,
      #1]%
   \definedescription
     [tab]
     [\c!headstyle=\@@taheadstyle,
      \c!headcolor=\@@tacolor,
      \c!sample=\@@tasample,
      \c!width=\@@tawidth,
      \c!before=\@@tabefore,
      \c!after=\@@taafter]}

\def\setuptab
  {\dosingleargument\dosetuptab}

\setuptab
  [\c!location=\v!left]
\f
% The following macro's are derived from PPCHTEX and
% therefore take some LaTeX font-switching into account.

\newif\ifloweredsubscripts

% Due to some upward incompatibality of LaTeX to LaTeX2.09
% and/or LaTeX2e we had to force \@@chemieletter. Otherwise
% some weird \nullfont error comes up.

\doifundefined{@@chemieletter}{\def\@@chemieletter{\rm}}

\def\beginlatexmathmodehack
  {\ifmmode
     \let\endlatexmathmodehack\relax
   \else
     \def\endlatexmathmodehack{$}$\@@chemieletter
   \fi}

\def\setsubscripts
  {\beginlatexmathmodehack
   \def\dosetsubscript##1##2##3%
     {\dimen0=##3\fontdimen5##2%
      \setxvalue{@@\string##1\string##2}{\the##1##2\relax}%
      ##1##2=\dimen0\relax}%
   \def\dodosetsubscript##1##2%
     {\dosetsubscript{##1}{\textfont2}{##2}%
      \dosetsubscript{##1}{\scriptfont2}{##2}%
      \dosetsubscript{##1}{\scriptscriptfont2}{##2}}%
  %\dodosetsubscript{\fontdimen14}{?}%
   \dodosetsubscript{\fontdimen16}{.7}%
   \dodosetsubscript{\fontdimen17}{.7}%
   \global\loweredsubscriptstrue
   \endlatexmathmodehack}

\def\resetsubscripts
  {\ifloweredsubscripts
     \beginlatexmathmodehack
     \def\doresetsubscript##1##2%
       {\dimen0=\getvalue{@@\string##1\string##2}\relax
        ##1##2=\dimen0}%
     \def\dodoresetsubscript##1%
       {\doresetsubscript{##1}{\textfont2}%
        \doresetsubscript{##1}{\scriptfont2}%
        \doresetsubscript{##1}{\scriptscriptfont2}}%
    %\dodoresetsubscript{\fontdimen14}%
     \dodoresetsubscript{\fontdimen16}%
     \dodoresetsubscript{\fontdimen17}%
     \global\loweredsubscriptsfalse
     \endlatexmathmodehack
   \fi}

\let\beginlatexmathmodehack = \relax
\let\endlatexmathmodehack   = \relax

\def\chem#1#2#3%
  {\bgroup
   \setsubscripts
   \mathematics{\hbox{#1}_{#2}^{#3}}%
   \resetsubscripts
   \egroup}

\unexpanded\def\celsius   #1{#1\mathematics{^\circ}C}
\unexpanded\def\inch        {\mathematics{\prime\prime}} % was: \hbox{\rm\char125\relax}
\unexpanded\def\fraction#1#2{\mathematics{#1\over#2}}

% very dutch

\unexpanded\def\graden      {\mathematics{^\circ}}

\def\bedragprefix {\euro\normalfixedspace}
\def\bedragsuffix {}
\def\bedragempty  {\euro}

\unexpanded\def\bedrag#1%
  {\strut\hbox\bgroup
   \let\normalfixedspace~%
   \doifelsenothing{#1}
     {\bedragempty}
     {\bedragprefix\digits{#1}\bedragsuffix}%
   \egroup}

% \definieeralineas[test][n=3]
%
% \stelalineasin[test][3][breedte=4cm,uitlijnen=links]
%
% \startopelkaar
% \test hans \\ ton \\ \bedrag{1.000,--} \\
% \test hans \\ ton \\ \bedrag{~.~~1,--} \\
% \test hans \\ ton \\ \bedrag{~.~~1,~~} \\
% \test hans \\ ton \\ \bedrag{~.100,--} \\
% \test hans \\ ton \\ \subtot{1.000,--} \\
% \test hans \\ ton \\ \bedrag{1.000,--} \\
% \test hans \\ ton \\ \bedrag{1.000,--} \\
% \test hans \\ ton \\ \totaal{1.000,--} \\
% \test hans \\ ton \\ \bedrag{nihil,--} \\
% \test hans \\ ton \\ \totaal{nihil,--} \\
% \test hans \\ ton \\ \subtot{nihil,--} \\
% \stopopelkaar

\def\periodswidth  {.5em}
\def\periodsdefault{3}    % was 5, but now it's like \unknown

\unexpanded\def\periods
  {\dosingleempty\doperiods}

\def\doperiods[#1]%
  {\dontleavehmode
   \begingroup
   \scratchdimen\periodswidth
   \hbox to \iffirstargument#1\else\periodsdefault\fi \scratchdimen
     {\leaders\hbox to \scratchdimen{\hss.\hss}\hss}%
   \endgroup}

\unexpanded\def\unknown
  {\periods\relax} % relax prevents lookahead for []

% compatibility macros

\def\doorsnede
  {\hbox{\rlap/$\circ$} }

\unexpanded\def\ongeveer
  {\mathematics\pm}
\f
\chardef\boundarycharactermode\plusone

\def\midboundarycharacter#1#2%
  {\ifcase\boundarycharactermode
   \or
     %\nobreak
     \hskip\hspaceamount\currentlanguage{#2}%
     \languageparameter#1%
     %\nobreak
      \hskip\hspaceamount\currentlanguage{#2}%
   \or
     \languageparameter#1%
   \fi
   \chardef\boundarycharactermode\plusone}

\def\leftboundarycharacter#1#2%
  {\ifcase\boundarycharactermode
   \or
     \languageparameter#1%
     \nobreak
     \hskip\hspaceamount\currentlanguage{#2}%
   \or
     \languageparameter#1%
   \fi
   \chardef\boundarycharactermode\plusone}

\def\rightboundarycharacter#1#2%
  {\ifcase\boundarycharactermode
   \or
     \prewordbreak %\nobreak
     \hskip\hspaceamount\currentlanguage{#2}%
     \languageparameter#1%
   \or
     \languageparameter#1%
   \fi
   \chardef\boundarycharactermode\plusone}
\f
% actually this is pretty old, but temporary moved here
%
% obsolete:

\def\setuphyphenmark
  {\dodoubleargument\getparameters[\??kp]}

\setuphyphenmark
  [\c!sign=\composedhyphen]

\installdiscretionaries || \@@kpsign

% will become:
%
% \installdiscretionaries || \composedhyphen

\def\composedhyphen
  {\discretionary
     {\hbox{\directsymbol\empty\c!leftcompoundhyphen}}
     {\hbox{\directsymbol\empty\c!rightcompoundhyphen}}
     {\hbox{\directsymbol\empty\c!compoundhyphen}}}

\definesymbol[\c!leftcompoundhyphen]  [\languageparameter\c!leftcompoundhyphen]
\definesymbol[\c!rightcompoundhyphen] [\languageparameter\c!rightcompoundhyphen]
\definesymbol[\c!compoundhyphen]      [\languageparameter\c!compoundhyphen]

\definehspace [sentence]      [\zeropoint]
\definehspace [intersentence] [.250em]

\definesymbol
  [\c!midsentence]
  [\midboundarycharacter\c!midsentence{sentence}]

\definesymbol
  [\c!leftsentence]
  [\leftboundarycharacter\c!leftsentence{sentence}]

\definesymbol
  [\c!rightsentence]
  [\rightboundarycharacter\c!rightsentence{sentence}]

\definesymbol
  [\c!leftsubsentence]
  [\leftboundarycharacter\c!leftsubsentence{sentence}]

\definesymbol
  [\c!rightsubsentence]
  [\rightboundarycharacter\c!rightsubsentence{sentence}]

\newsignal \subsentencesignal
\newcounter\subsentencelevel

\def\midsentence
  {\symbol[\c!midsentence]}

\def\beginofsubsentence
  {\ifdim\lastkern=\subsentencesignal
     \unskip
     \kern\hspaceamount\currentlanguage{intersentence}%
   \fi
   \doglobal\increment\subsentencelevel
   \ifnum\subsentencelevel=\plusone
     \leaveoutervmode
   \fi
   \symbol[\ifodd\subsentencelevel\c!leftsentence   \else
                                  \c!leftsubsentence\fi]%
   \ignorespaces}

\def\beginofsubsentencespacing
  {\kern\subsentencesignal\ignorespaces}

\def\endofsubsentence
  {\symbol[\ifodd\subsentencelevel\c!rightsentence   \else
                                  \c!rightsubsentence\fi]%
   \doglobal\decrement\subsentencelevel
   \unskip
   \kern\subsentencesignal}

\def\endofsubsentencespacing
  {\ifdim\lastkern=\subsentencesignal
     \unskip
     \hskip\hspaceamount\currentlanguage{intersentence}%
     \ignorespaces
   \else
     \unskip
   \fi}

% test |<|test |<|test|>| test|>| test \par
% test|<|test|<|test|>|test|>|test     \par
% test |<||<|test|>||>| test           \par

\enableactivediscretionaries
\f
\definehspace [quotation]      [\zeropoint]
\definehspace [interquotation] [.125em]

%definehspace [quote]  [\zeropoint]
%definehspace [speech] [\zeropoint]

\definehspace [quote]  [\hspaceamount\currentlanguage{quotation}]
\definehspace [speech] [\hspaceamount\currentlanguage{quotation}]

\definesymbol
  [\c!leftquotation]
  [\leftboundarycharacter\c!leftquotation{quotation}]

\definesymbol
  [\c!rightquotation]
  [\rightboundarycharacter\c!rightquotation{quotation}]

\definesymbol
  [\c!leftquote]
  [\leftboundarycharacter\c!leftquote{quote}]

\definesymbol
  [\c!rightquote]
  [\rightboundarycharacter\c!rightquote{quote}]

\definesymbol
  [\c!leftspeech]
  [\leftboundarycharacter\c!leftspeech{speech}]

\definesymbol
  [\c!rightspeech]
  [\rightboundarycharacter\c!rightspeech{speech}]

\definesymbol
  [\c!middlespeech]
  [\leftboundarycharacter\c!middlespeech{speech}]
\f
% has been replaced by delimitedtext
%
% \def\leftquotationmark
%   {\setbox\scratchbox\hbox{\symbol[\c!leftquotation]}%
%    \doif\@@cilocation\v!margin{\hskip-\wd\scratchbox}%
%    \box\scratchbox}
%
% \def\rightquotationmark
%   {\hsmash{\symbol[\c!rightquotation]}}
%
% \newsignal\quotationsignal
%
% \def\setupquote
%   {\dodoubleargument\getparameters[\??ci]}
%
% \def\startquotation
%   {\bgroup\dosingleempty\dostartquotation}
%
% \def\dostartquotation[#1]%
%   {\@@cibefore
%    \doifelsenothing{#1}
%      {\let\dostopquotation\relax}
%      {\startnarrower[#1]%
%       \let\dostopquotation\stopnarrower}%
%    \dostartattributes\??ci\c!style\c!color\empty
%    \leftquotationmark
%    \ignorespaces}
%
% \def\stopquotation
%   {\removeunwantedspaces
%    \removelastskip
%    \rightquotationmark
%    \dostopattributes
%    \dostopquotation
%    \@@ciafter
%    \egroup}
%
% \def\dohandlequotation#1#2%
%   {\ifdim\lastskip=\quotationsignal
%      \unskip\hskip\hspaceamount\currentlanguage{interquotation}% hardcoded
%    \else
%      #2%
%    \fi
%    \ifhmode % else funny pagebeaks
%      \penalty\!!tenthousand\hskip\zeropoint      % == \prewordbreak
%    \fi
%    \strut % new, needed below
%    \symbol[#1]%
%    \penalty\!!tenthousand\hskip\quotationsignal} % +- \prewordbreak
%
% \def\handlequotation#1%
%   {\dohandlequotation{#1}\relax}
%
% \unexpanded\def\quotation
%   {\groupedcommand
%      {\dohandlequotation\c!leftquotation \relax}
%      {\dohandlequotation\c!rightquotation\removelastskip}}
%
% \unexpanded\def\quote
%   {\doifelse\@@cistyle\v!normal\doquotedcite\doattributedcite}
%
% \def\doquotedcite
%   {\groupedcommand
%      {\dohandlequotation\c!leftquote \relax}
%      {\dohandlequotation\c!rightquote\removelastskip}}
%
% \def\doattributedcite
%   {\groupedcommand
%      {\dostartattributes\??ci\c!style\c!color}
%      {\dostopattributes}}

%D The previous one fails in \placefloat[left]{}{}, so instead
%D we use the next alternative, where the first one is handled
%D outside group. Watch the strut.

% has been replaced by delimitedtext
%
% \unexpanded\def\quotation
%   {\dohandlequotation\c!leftquotation\relax
%    \groupedcommand \donothing
%      {\dohandlequotation\c!rightquotation\removelastskip}}
%
% \def\doquotedcite
%   {\dohandlequotation\c!leftquote\relax
%    \groupedcommand \donothing
%      {\dohandlequotation\c!rightquote\removelastskip}}
%
% \setupquote
%   [\c!location=\v!margin,
%    \c!style=\v!normal,
%    \c!color=,
%    \c!before=\startnarrower,
%    \c!after=\stopnarrower]

\appendtoks\def\quotation#1{"#1"}\to\simplifiedcommands
\appendtoks\def\quote    #1{'#1'}\to\simplifiedcommands

%D The next features was so desperately needed by Giuseppe
%D Bilotta that he made a module for it. Since this is a
%D typical example of core functionality, I decided to extend
%D the low level quotation macros in such a way that a speech
%D feature could be build on top of it. The speech opening and
%D closing symbols are defined per language. Italian is an
%D example of a language that has them set.

% has been be replaced by delimitedtext
%
% \newcounter\speechlevel \newconditional\insidespeech
%
% \def\startspeech
%   {\doglobal\increment\speechlevel\relax
%    \dohandlequotation\c!leftspeech\relax
%    \global\settrue\insidespeech
%    \ignorespaces}
%
% \def\stopspeech
%   {\dohandlequotation\c!rightspeech\removelastskip
%    \doglobal\decrement\speechlevel\relax
%    \ifcase\speechlevel\relax \global\setfalse\insidespeech \fi}
%
% \def\dohandlespeech % indirect since called in everypar
%   {\relax % still needed?
%    \ifcase\speechlevel\or\dodohandlespeech\fi}
%
% \def\dodohandlespeech
%   {\ifconditional\insidespeech
%      \dohandlequotation\c!middlespeech\relax
%    \else
%      \global\settrue\insidespeech
%    \fi}
%
% \unexpanded\def\speech
%   {\doglobal\increment\speechlevel\relax
%    \dohandlequotation\c!leftspeech\relax
%    \groupedcommand \ignorespaces
%      {\dohandlequotation\c!rightspeech\removelastskip
%       \doglobal\decrement\speechlevel\relax}}

% \appendtoks \dohandlespeech \to \everypar
\f
% this will replace the quotation and speed definitions

\newsignal\delimitedtextsignal

\def\delimitedtextparameter#1%
  {\csname\??ci
     \ifundefined{\??ci\currentdelimitedtext#1}\else\currentdelimitedtext\fi
   #1\endcsname}

\def\definedelimitedtext
  {\dodoubleempty\dodefinedelimitedtext}

\def\dodefinedelimitedtext[#1][#2]%
  {\doifassignmentelse{#2}
     {\getparameters
        [\??ci#1]
        [\c!location=\v!margin, % \v!text \v!paragraph
         \c!spacebefore=,
         \c!spaceafter=\delimitedtextparameter\c!spacebefore,
         \c!style=\v!normal,
         \c!color=,
         \c!leftmargin=\zeropoint,
         \c!rightmargin=\delimitedtextparameter\c!leftmargin,
         \c!indentnext=\v!yes,
         \c!before=,
         \c!after=,
         \c!left=,
         \c!right=,
         \c!level=0,
         \c!repeat=\v!no,
         \c!method=,
        #2]}%
     {\doifdefined{#2}
        {\copyparameters[\??ci#1][\??ci#2]
           [\c!location,\c!spacebefore,\c!spaceafter,\c!style,\c!color,
            \c!leftmargin,\c!rightmargin,\c!indentnext,
            \c!before,\c!after,\c!left,\c!right]}}%
   \doifsomething{#1}
     {\unexpanded\setvalue{#1}{\delimitedtext[#1]}%
      \setvalue{\e!start#1}{\startdelimitedtext[#1]}%
      \setvalue{\e!stop#1}{\stopdelimitedtext}}}

\def\setupdelimitedtext
  {\dodoubleargument\dosetupdelimitedtext}

\def\dosetupdelimitedtext[#1][#2]%
  {\ifsecondargument
     \getparameters[\??ci#1][#2]%
   \else
     \getparameters[\??ci][#1]%
   \fi}

\def\dorepeatdelimitedtext
  {\relax\ifcase\delimitedtextparameter\c!level\else
     \dohandledelimitedtext\c!middle
   \fi}

\let\dohandlerepeatdelimitedtext\relax

\def\startdelimitedtext[#1]%
  {\bgroup
   \def\currentdelimitedtext{#1}%
   \doifelse{\delimitedtextparameter\c!method}\s!font
     {\doglobal\decrementvalue{\??ci\currentdelimitedtext\c!level}%
      \def\dostopdelimitedtext{\removeunwantedspaces\ignoredelimitedtext\c!right}%
      \ignoredelimitedtext\c!left\ignorespaces}
     {\doifelse{\delimitedtextparameter\c!repeat}\v!yes
        {\let\dohandlerepeatdelimitedtext\dorepeatdelimitedtext}%
        {\let\dohandlerepeatdelimitedtext\relax}%
      \doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
        {\dosingleempty\dostartdelimitedtextpar}\dostartdelimitedtexttxt}}

\def\dostartdelimitedtextpar[#1]%
  {\let\dostopdelimitedtext\dostopdelimitedtextpar
   \doifsomething{\delimitedtextparameter\c!spacebefore}
     {\blank[\delimitedtextparameter\c!spacebefore]}%
   \delimitedtextparameter\c!before
   % nicer:
   % \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
   % \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
   % backward compatible:
   \doifelsenothing{#1}
     {\doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
      \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
      \let\dodostopdelimitedtextpar\endgraf}
     {\startnarrower[#1]\let\dodostopdelimitedtextpar\stopnarrower}%
   % so far
   \dochecknextindentation{\??ci\currentdelimitedtext}%
   \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
   \leftdelimitedtextmark
   \doglobal\incrementvalue{\??ci\currentdelimitedtext\c!level}%
   \ignorespaces}

\def\dostopdelimitedtextpar
  {\removeunwantedspaces
   \removelastskip
   \rightdelimitedtextmark
   \dostopattributes
   \dodostopdelimitedtextpar
   \delimitedtextparameter\c!after
   \doifsomething{\delimitedtextparameter\c!spaceafter}
     {\blank[\delimitedtextparameter\c!spaceafter]}}

\def\dostartdelimitedtexttxt
  {\let\dostopdelimitedtext\dostopdelimitedtexttxt
   \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
   \dohandledelimitedtext\c!left
   \ignorespaces}

\def\dostopdelimitedtexttxt
  {\removeunwantedspaces
   \dohandledelimitedtext\c!right
   \dostopattributes}

\def\stopdelimitedtext
  {\dostopdelimitedtext
   \doglobal\decrementvalue{\??ci\currentdelimitedtext\c!level}%
   \egroup}

\def\delimitedtext[#1]%
  {\pushmacro\currentdelimitedtext
   \def\currentdelimitedtext{#1}%
   \doifelse{\delimitedtextparameter\c!method}\s!font
     {\dofontdrivendelimited}
     {\doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
      \dodelimitedtextpar\dodelimitedtexttxt}}

% shortcuts

\def\startdelimited{\startdelimitedtext}
\def\stopdelimited {\stopdelimitedtext}  % no let, dynamically assigned
\def\delimited     {\delimitedtext}

\def\leftdelimitedtextmark
  {\dontleavehmode
   \setbox\scratchbox\hbox{\delimitedtextparameter\c!left}%
   \doif{\delimitedtextparameter\c!location}\v!margin{\hskip-\wd\scratchbox}%
   \box\scratchbox}

\def\rightdelimitedtextmark
  {\hsmash{\delimitedtextparameter\c!right}}

\def\dohandledelimitedtext#1#2%
  {\begingroup
   \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
   \ifdim\wd\scratchbox>\zeropoint
     \ifdim\lastskip=\delimitedtextsignal
       \unskip\hskip\hspaceamount\currentlanguage{interquotation}%
     \else
       #2%
     \fi
     \ifhmode % else funny pagebeaks
       \penalty\!!tenthousand\hskip\zeropoint % == \prewordbreak
     \fi
     \strut % new, needed below
     \delimitedtextparameter#1% unhbox\scratchbox
     \penalty\!!tenthousand\hskip\delimitedtextsignal % +- \prewordbreak
   \fi
   \endgroup}

\def\ignoredelimitedtext#1%
  {\delimitedtextparameter#1}

\def\handledelimitedtext#1%
  {\dohandledelimitedtext{#1}\relax}

\unexpanded\def\dodelimitedtextpar
  {\dohandledelimitedtext\c!left\relax
   \groupedcommand
     \donothing
     {\dohandledelimitedtext\c!right\removelastskip}}

\unexpanded\def\dodelimitedtexttxt
  {\doifelse{\delimitedtextparameter\c!style}\v!normal
     \doquoteddelimited\doattributeddelimited}

\def\doquoteddelimited
  {\dohandledelimitedtext\c!left\relax
   \groupedcommand
     \donothing
     {\dohandledelimitedtext\c!right
      \removelastskip
      \popmacro\currentdelimitedtext}}

\def\doattributeddelimited
  {\groupedcommand
     {\dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color}
     {\dostopattributes
      \popmacro\currentdelimitedtext}}

% \def\dofontdrivendelimited#1% thanks to Taco for sorting out the kerning interference
%   {\languageparameter{\c!left\currentdelimitedtext}%
%    #1% sorry, no verbatim support
%    \languageparameter{\c!right\currentdelimitedtext}%
%    \popmacro\currentdelimitedtext}

\def\dofontdrivendelimited
  {\simplegroupedcommand
     {\languageparameter{\c!left\currentdelimitedtext}}
     {\languageparameter{\c!right\currentdelimitedtext}%
      \popmacro\currentdelimitedtext}}
\f
\definedelimitedtext
  [\v!quotation]
  [\c!left={\symbol[\c!leftquotation]},
   \c!right={\symbol[\c!rightquotation]},
   \c!leftmargin=\v!standard]

\definedelimitedtext
  [\v!quote][\v!quotation]

\setupdelimitedtext
  [\v!quote]
  [\c!location=\v!text,
   \c!left={\symbol[\c!leftquote]},
   \c!right={\symbol[\c!rightquote]}]

\definedelimitedtext
  [\v!speech][\v!quotation]

\setupdelimitedtext
  [\v!speech]
  [\c!repeat=\v!yes,
   \c!left={\symbol[\c!leftspeech]},
   \c!middle={\symbol[\c!middlespeech]},
   \c!right={\symbol[\c!rightspeech]}]

% how do we call an tight quote
%
% \definedelimitedtext
%    [\v!quotation][\v!quotation]
%
% \setupdelimitedtext
%   [\v!quotation]
%   [\c!indentnext=\v!no,
%    \c!spacebefore=\v!nowhite]

\def\setupquotation{\setupdelimitedtext[\v!quotation]}
\def\setupquote    {\setupdelimitedtext[\v!quote]}
\f
% seldom used, move from kernel to run time module

\def\basegrid
  {\dosingleempty\dobasegrid}

\def\dobasegrid[#1]%
  {\begingroup
   \getparameters[\??rt]
     [\c!x=0,\c!y=0,
      \c!nx=10,\c!ny=10,
      \c!dx=.5,\c!dy=.5,
      \c!xstep=0,\c!ystep=0,
      \c!unit=\s!cm,
      \c!scale=1,
      \c!factor=1,
      \c!offset=\v!yes,
      \c!location=\v!left,
      #1]%
   \startpositioning
     \dimen0=\@@rtdx\@@rtunit\relax
     \dimen0=\@@rtscale\dimen0\relax
     \dimen0=\@@rtfactor\dimen0\relax
     \multiply\dimen0 \@@rtnx\relax
     \dimen2=\@@rtdy\@@rtunit\relax
     \dimen2=\@@rtscale\dimen2\relax
     \dimen2=\@@rtfactor\dimen2\relax
     \multiply\dimen2 \@@rtny\relax
     \def\horline
       {\vbox
          {\hrule
             \!!width \dimen0
             \!!height \linewidth
             \!!depth \!!zeropoint}}%
     \def\verline%
       {\vrule
          \!!width \linewidth
          \!!height \dimen2
          \!!depth \!!zeropoint}%
     \doglobal\newcounter\@@gridc
     \doglobal\newcounter\@@gridd
     \doglobal\newcounter\@@gride
     \def\setlegend##1##2##3%
       {\gdef\@@gridc{0}%
        \dimen0=2em\relax
        \dimen2=##2\@@rtunit\relax
        \dimen2=\@@rtscale\dimen2\relax
        \dimen2=\@@rtfactor\dimen2\relax
        \divide\dimen0 \dimen2\relax
        \xdef\@@gride{\number\dimen0}%
        \ifnum\@@gride>50
          \gdef\@@gride{100}%
        \else\ifnum\@@gride>10
          \gdef\@@gride{50}%
        \else\ifnum\@@gride>5
          \gdef\@@gride{10}%
        \else\ifnum\@@gride>1
          \gdef\@@gride{5}%
        \else
          \gdef\@@gride{1}%
        \fi\fi\fi\fi
        \gdef\@@gridd{0}%
        \def\legend
          {\ifnum\@@gridd=\zerocount
             \vbox
               {\increment(\@@gridc,##1)%
                \hbox to 2em{\hss\@@gridc\hss}}%
             \global\let\@@gridd=\@@gride
           \fi
             \doglobal\decrement\@@gridd
             \doglobal\increment(\@@gridc,##1)}}%
     \def\draw##1##2##3##4##5##6##7##8##9%
       {\setuppositioning
          [\c!state=##8,
           \c!xstep=\v!absolute,
           \c!ystep=\v!absolute,
           \c!unit=\@@rtunit,
           \c!scale=\@@rtscale,
           \c!factor=\@@rtfactor,
           \c!offset=\@@rtoffset,
           \c!xoffset=##6,
           \c!yoffset=##7]%
        \doifelse{##9}\v!middle
          {\scratchdimen##3pt\scratchdimen.5\scratchdimen
           \edef\@@psxx{\withoutpt\the\scratchdimen}%
           \scratchdimen##4pt\scratchdimen.5\scratchdimen
           \edef\@@psyy{\withoutpt\the\scratchdimen}%
           \scratchcounter##2\advance\scratchcounter -1
           \edef\@@pszz{\the\scratchcounter}}
          {\edef\@@psxx{0}\edef\@@psyy{0}\edef\@@pszz{##2}}%
        \position(\@@psxx,\@@psyy){##1}%
        \setuppositioning
          [\c!state=##8,
           \c!xstep=\v!relative,
           \c!ystep=\v!relative,
           \c!scale=\@@rtscale,
           \c!factor=\@@rtfactor,
           \c!offset=\@@rtoffset,
           \c!unit=\@@rtunit]%
        \dorecurse\@@pszz{\position(##3,##4){##5}}}%
     \draw
       \verline\@@rtnx\@@rtdx0\verline\!!zeropoint\!!zeropoint\v!start\empty
     \draw
       \horline\@@rtny0\@@rtdy\horline\!!zeropoint\!!zeropoint\v!start\empty
     \tfx
     \doifnot\@@rtxstep{0}
       {\setlegend\@@rtxstep\@@rtdx\@@rtx
        \draw\legend\@@rtnx\@@rtdx0\legend{-1em}{-1.5em}\v!overlay\@@rtlocation}%
     \doifnot\@@rtystep{0}
       {\setlegend\@@rtystep\@@rtdy\@@rty
        \draw\legend\@@rtny0\@@rtdy\legend{-2em}{-.75ex}\v!overlay\@@rtlocation}%
  \stoppositioning
  \endgroup}

\let\grid\basegrid
\f
% Dit wordt:
%
%   \doorverwijzen[naam][instellingen] enz.
%
% waarbij <naam> bijvoorbeeld publicatie is. Dit levert:
%
%   \start<naam>
%   \stop<naam>
%
%   \beginvan<naam>
%   \eindvan<naam>
%
%   \publicatie
%
%   \volledigelijstmetpublicaties
%
% eigenlijk kan ook door... zo worden uitgebreid!

% old, will become obsolete or module, replace by bib module

\defineenumeration
  [@publicatie]
  [\c!location=\v!left,
   \c!width=\@@pbwidth,\c!hang=,\c!sample=,
   \c!before=\@@pbbefore,\c!after=\@@pbafter,\c!inbetween=,
   \c!headstyle=\@@pbheadstyle,\c!style=,
   \c!headcolor=\@@pbheadcolor,\c!color=,
   \c!way=\@@pbway,\c!blockway=\@@pbblockway,
   \c!text=,\c!left=\@@pbleft,\c!right=\@@pbright]

\def\dosetuppublications[#1]%
  {\getparameters[\??pb][#1]}

\def\setuppublications%
  {\dosingleargument\dosetuppublications}

\def\apa@publicatie
  {\doifsomething\@@pb@naam    {\@@pb@naam,\space}%
   \doifsomething\@@pb@titel   {{\sl\@@pb@titel}.\space}%
   \doifsomething\@@pb@jaar    {(\@@pb@jaar).\space}%
   \doifsomething\@@pb@plaats  {\@@pb@plaats\doifelsenothing\@@pb@uitgever{.}{:\space}}%
   \doifsomething\@@pb@uitgever{\@@pb@uitgever.}}

\def\normaal@publicatie
  {\@@pb@naam, \@@pb@titel, \@@pb@jaar, \@@pb@pagina, \@@pb@plaats, \@@pb@uitgever.}

\def\complexstartpublicatie[#1]#2\stoppublicatie
  {\bgroup
   \def\dosetpublicatie
     {\processcommalist
        [naam,titel,jaar,plaats,pagina,uitgever]
        \setpublicatie
      \ignorespaces}%
   \def\setpublicatie##1%
      {\letvalue{\??pb @##1}\empty
       \setvalue{##1}####1{\setvalue{\??pb @##1}{####1}\ignorespaces}}%
   \def\getpublicatie%
     {\doifsomething\@@pbalternative{\getvalue{\@@pbalternative @publicatie}}}%
   \doifelse\@@pbnumbering\v!yes
      {\@publicatie[#1]\dosetpublicatie#2\getpublicatie\par}%
      {\@@pbbefore
       \dosetpublicatie\ignorespaces#2\getpublicatie
       \@@pbafter}%
   \egroup}

\definecomplexorsimpleempty\startpublicatie

\def\publication#1[#2]%
  {\@@pbleft\in{#1}[#2]\@@pbright}

\setuppublications
  [\c!numbering=\v!yes,
   \c!alternative=\c!apa,
   \c!width=2em,
   \c!hang=,
   \c!sample=,
   \c!before=,
   \c!after=,
   \c!inbetween=,
   \c!headstyle=,
   \c!headcolor=,
   \c!style=,
   \c!color=,
   \c!blockway=\v!by\v!text,
   \c!way=\v!by\v!text,
   \c!text=,
   \c!left={[},
   \c!right={]}]
\f
% only used at pragma, move from kernel to run time module

\def\referraldate
  {\currentdate[\v!referral]}

\def\doreferral[#1]%
   {\noheaderandfooterlines
    \bgroup
    \getparameters
      [\??km]
      [\c!bet=\unknown,\c!dat=\unknown,\c!ken=\unknown,
       \c!from=,\c!to=,\c!ref=,#1]%
    % moet anders, hoort niet in 01b
    \assigntranslation[\s!nl=referentie,\s!en=reference,\s!de=Referenz,\s!sp=referencia]\to\@@@kmref
    \assigntranslation[\s!nl=van,\s!en=from,\s!de=Von,\s!sp=de]\to\@@@kmvan
    \assigntranslation[\s!nl=aan,\s!en=to,\s!de=An,\s!sp=a]\to\@@@kmaan
    \assigntranslation[\s!nl=betreft,\s!en=concerns,\s!de=Betreff,\s!sp=]\to\@@@kmbet
    \assigntranslation[\s!nl=datum,\s!en=date,\s!de=Datum,\s!sp=fecha]\to\@@@kmdat
    \assigntranslation[\s!nl=kenmerk,\s!en=mark,\s!de=Kennzeichen,\s!sp=]\to\@@@kmken
    %
    \definetabulate[\s!dummy][|l|p|]
    \startdummy
      \NC\@@@kmbet\EQ\@@kmbet\NC\NR
      \NC\@@@kmdat\EQ\@@kmdat\NC\NR
      \NC\@@@kmken\EQ\expanded{\smallcapped{\@@kmken}}\NC\NR
      \doifsomething{\@@kmfrom\@@kmto}{\NC\NC\NC\NR}%
      \doifsomething \@@kmfrom         {\NC\@@@kmvan\EQ\@@kmfrom\NC\NR}%
      \doifsomething \@@kmto         {\NC\@@@kmaan\EQ\@@kmto\NC\NR}%
      \doifsomething \@@kmref         {\NC\NC\NC\NR\NC\@@@kmref\EQ\@@kmref\NC\NR}%
    \stopdummy
    \egroup}

\def\referral
  {\dosingleargument\doreferral}
\f
% FUZZY OLD STUFF: will be removed when not used in some manual;
% rows instead of columns, i'd forgotten that this code exist
%
% \definesystemvariable{ri}
%
% \def\setuprows
%   {\dodoubleargument\getparameters[\??ri]}
%
% \definecomplexorsimpleempty\startrows
%
% \def\complexstartrows[#1]%
%   {\bgroup
%    \setuprows[#1]%
%    \let\do@@ribottom\relax
%    \def\row
%      {\do@@ribottom
%       \egroup
%       \dimen0\vsize
%       \divide\dimen0 \@@rin
%       \advance\dimen0 -\lineskip
%       \vbox to \dimen0
%         \bgroup
%         \@@ritop
%         \let\do@@ribottom\@@ribottom
%         \ignorespaces}%
%    \bgroup
%    \row}
%
% \def\stoprows
%   {\do@@ribottom
%    \egroup
%    \egroup}
%
% \setuprows
%   [\c!n=2,
%    \c!top=,
%    \c!bottom=\vfill]
\f
% THIS WAS MAIN-003.TEX

\startmessages  dutch  library: systems
     41: externe file -- in groep -- bestaat niet
\stopmessages

\startmessages  english  library: systems
     41: external file -- in group -- does not exist
\stopmessages

\startmessages  german  library: systems
     41: Externe Datei -- in Gruppe -- existiert nicht
\stopmessages

\startmessages  czech  library: systems
     41: externi soubor -- ve skupine -- neexistuje
\stopmessages

\startmessages  italian  library: systems
     41: il file esterno -- del gruppo -- non esiste
\stopmessages

\startmessages  norwegian  library: systems
     41: ekstern fil -- i gruppe -- eksisterer ikke
\stopmessages

\startmessages  romanian  library: systems
     41: fisierul extern -- din grupul -- nu exista
\stopmessages

\startmessages  french  library: systems
     41: le fichier externe -- du groupe -- n'existe pas
\stopmessages
\f
\definetabulate
  [\v!legend]
  [|emj1|i1|mR|]

\setuptabulate
  [\v!legend]
  [\c!unit=.75em,\c!inner=\setquicktabulate\leg,EQ={=}]

\definetabulate
  [\v!legend][\v!two]
  [|emj1|emk1|i1|mR|]

\definetabulate
  [\v!fact]
  [|R|ecmj1|i1mR|]

\setuptabulate
  [\v!fact]
  [\c!unit=.75em,\c!inner=\setquicktabulate\fact,EQ={=}]

\unexpanded\def\xbox
  {\bgroup\aftergroup\egroup\hbox\bgroup\tx\let\next=}

\unexpanded\def\xxbox
  {\bgroup\aftergroup\egroup\hbox\bgroup\txx\let\next=}

% \def\mrm#1%
%   {$\rm#1$}
\f
%D \macros
%D   {definepairedbox, setuppairedbox, placepairedbox}
%D
%D Paired boxes, formally called legends, but from now on a
%D legend is just an instance, are primarily meant for
%D typesetting some text alongside an illustration. Although
%D there is quite some variation possible, the functionality is
%D kept simple, if only because in most cases such pairs are
%D typeset sober.
%D
%D The location specification accepts a pair, where the first
%D keyword specifies the arrangement, and the second one the
%D alignment. The first key of the location pair is one of
%D \type {left}, \type {right}, \type {top} or \type {bottom},
%D while the second key can also be \type {middle}.
%D
%D The first box is just collected in an horizontal box, but
%D the second one is a vertical box that gets passed the
%D bodyfont and alignment settings.

%D Today we would implement this using layers .... but for the
%D moment we keep it this way.

%  \startbuffer[test]
%  \test left   \test left,top    \test left,bottom  \test left,middle
%  \test right  \test right,top   \test right,bottom \test right,middle
%  \test top    \test top,left    \test top,right    \test top,middle
%  \test bottom \test bottom,left \test bottom,right \test bottom,middle
%  \stopbuffer
%
%  \def\showtest#1%
%    {\pagina
%     \typebuffer[demo]
%     \def\test##1
%       {\startlinecorrection[blank]
%        \getbuffer[demo]%
%        \ruledhbox\placelegend
%          [bodyfont=6pt,location={##1}]
%          {\framed[width=.25\textwidth]{\tttf##1}}
%          {#1}
%        \stoplinecorrection}
%     \getbuffer[test]}
%
%  \startbuffer[demo]
%  \setuplegend
%    [width=\hsize,maxwidth=\makeupwidth,
%     height=\vsize,maxheight=\makeupheight]
%  \stopbuffer
%
%  \showtest{These examples demonstrate the default settings.}
%
%  \startbuffer[demo]
%  \setuplegend
%    [width=\textwidth,
%     maxwidth=\textwidth]
%  \stopbuffer
%
%  \showtest{\input tufte }
%
%  \startbuffer[demo]
%  \setuplegend
%    [width=.65\textwidth]
%  \stopbuffer
%
%  \showtest{\input knuth }
%
%  \startbuffer[demo]
%  \setuplegend
%    [height=2cm]
%  \stopbuffer
%
%  \showtest{These examples demonstrate some other settings.}
%
%  \startbuffer[demo]
%  \setuplegend
%    [width=.65\textwidth,
%     height=2cm]
%  \stopbuffer
%
%  \showtest{These examples demonstrate some other settings.}
%
%  \startbuffer[demo]
%  \setuplegend
%    [n=2,align=right,width=.5\textwidth]
%  \stopbuffer
%
%  \showtest{\input zapf }

%D \macros
%D   {setuplegend, placelegend}
%D
%D It makes sense to typeset a legend to a figure in \TEX\
%D and not in a drawing package. The macro \type {\placelegend}
%D combines a figure (or something else) and its legend. This
%D command is just a paired box.
%D
%D The legend is placed according to \type {location}, being
%D \type {bottom} or \type {right}. The macro macro is used as
%D follows.
%D
%D \starttyping
%D \placefigure
%D   {whow}
%D   {\placelegend
%D      {\externalfigure[cow]}
%D      {\starttabulation
%D       \NC 1 \NC head \NC \NR
%D       \NC 2 \NC legs \NC \NR
%D       \NC 3 \NC tail \NC \NR
%D       \stoptabulation}}
%D
%D \placefigure
%D   {whow}
%D   {\placelegend
%D      {\externalfigure[cow]}
%D      {\starttabulation[|l|l|l|l|]
%D       \NC 1 \NC head \NC 3 \NC tail \NC \NR
%D       \NC 2 \NC legs \NC   \NC      \NC \NR
%D       \stoptabulation}}
%D
%D \placefigure
%D   {whow}
%D   {\placelegend[n=2]
%D      {\externalfigure[cow]}
%D      {\starttabulation
%D       \NC 1 \NC head \NC \NR
%D       \NC 2 \NC legs \NC \NR
%D       \NC 3 \NC tail \NC \NR
%D       \stoptabulation}}
%D
%D \placefigure
%D   {whow}
%D   {\placelegend[n=2]
%D      {\externalfigure[cow]}
%D      {head \par legs \par tail}}
%D
%D \placefigure
%D   {whow}
%D   {\placelegend[n=2]
%D      {\externalfigure[cow]}
%D      {\startitemize[packed]
%D       \item head \item legs \item  tail \item belly \item horns
%D       \stopitemize}}
%D
%D \placefigure
%D   {whow}
%D   {\placelegend[n=2,width=.8\hsize]
%D      {\externalfigure[cow]}
%D      {\startitemize[packed]
%D       \item head \item legs \item  tail \item belly \item horns
%D       \stopitemize}}
%D \stoptyping

\newbox\firstpairedbox
\newbox\secondpairedbox

\def\definepairedbox
  {\dodoubleempty\dodefinepairedbox}

\def\dodefinepairedbox[#1][#2]%
  {\getparameters
     [\??ld#1]
     [\c!n=1,
      \c!distance=\bodyfontsize,
      \c!before=,
      \c!after=,
      \c!color=,
      \c!style=,
      \c!inbetween={\blank[\v!medium]},
      \c!width=\hsize,
      \c!height=\vsize,
      \c!maxwidth=\textwidth,   % \makeupwidth,
      \c!maxheight=\textheight, % \makeupheight,
      \c!bodyfont=,
      \c!align=,
      \c!location=\v!bottom,
      #2]%
   \setvalue{\e!setup#1\e!endsetup}{\setuppairedbox[#1]}%
   \setvalue{\e!place#1}{\placepairedbox[#1]}}

\def\setuppairedbox
  {\dodoubleempty\dosetuppairedbox}

\def\dosetuppairedbox[#1]%
  {\getparameters[\??ld#1]}

\def\placepairedbox
  {\bgroup\dodoubleempty\doplacepairedbox}

\def\doplacepairedbox[#1][#2]% watch the hsize/vsize tricks
  {\setuppairedbox[#1][#2]%     % and don't change them
   \copyparameters % brrr
     [\??ld][\??ld#1]
     [\c!n,\c!distance,\c!inbetween,\c!before,\c!after,
      \c!width,\c!height,\c!maxwidth,\c!maxheight,
      \c!color,\c!style,\c!bodyfont,\c!align,\c!location]%
   \@@ldbefore\bgroup
   \global\setsystemmode{pairedbox}%
   \beforefirstpairedbox
   \dowithnextbox
     {\betweenbothpairedboxes
      \dowithnextbox
        {\afterbothpairedboxes
         \egroup\@@ldafter
         \egroup}
      \vbox\bgroup
        \insidesecondpairedbox
        \let\next=}
   \hbox}

\def\beforefirstpairedbox
  {\chardef\pairedlocationa1 % left
   \chardef\pairedlocationb4 % middle
   \getfromcommacommand[\@@ldlocation][1]%
   \processaction
     [\commalistelement]
     [  \v!left=>\chardef\pairedlocationa0,
       \v!right=>\chardef\pairedlocationa1,
         \v!top=>\chardef\pairedlocationa2,
      \v!bottom=>\chardef\pairedlocationa3]%
   \getfromcommacommand[\@@ldlocation][2]%
   \processaction
     [\commalistelement]
     [  \v!left=>\chardef\pairedlocationb0,
       \v!right=>\chardef\pairedlocationb1,
        \v!high=>\chardef\pairedlocationb2,
         \v!top=>\chardef\pairedlocationb2,
         \v!low=>\chardef\pairedlocationb3,
      \v!bottom=>\chardef\pairedlocationb3,
      \v!middle=>\chardef\pairedlocationb4]}

\def\betweenbothpairedboxes
  {\switchtobodyfont[\@@ldbodyfont]% split under same regime
   \setbox\firstpairedbox\flushnextbox
   \ifnum\pairedlocationa<2
     \hsize\wd\firstpairedbox % trick
     \hsize\@@ldwidth
     \scratchdimen\wd\firstpairedbox
     \advance\scratchdimen \@@lddistance
     \bgroup\advance\scratchdimen \hsize
     \ifdim\scratchdimen>\@@ldmaxwidth\relax
       \egroup
       \hsize\@@ldmaxwidth
       \advance\hsize -\scratchdimen
     \else
       \egroup
     \fi
   \else
     \hsize\wd\firstpairedbox
     \hsize\@@ldwidth % can be \hsize
     \ifdim\hsize>\@@ldmaxwidth\relax \hsize\@@ldmaxwidth \fi % can be \hsize
   \fi
   \ifnum\@@ldn>\plusone
     \setrigidcolumnhsize\hsize\@@lddistance\@@ldn
   \fi}

\def\afterbothpairedboxes
  {\setbox\secondpairedbox\vbox
     {% \localstartcolor[\@@ldcolor]% does not work yet
        \ifnum\@@ldn>1
          \rigidcolumnbalance\nextbox
        \else
          \flushnextbox
        \fi
      }% \localstopcolor}%
   \ifnum\pairedlocationa<2\hbox\else\vbox\fi\bgroup % hide vsize
   \forgetall
   \ifnum\pairedlocationa<2
     \scratchdimen\maxoftwoboxdimens\ht\firstpairedbox\secondpairedbox
     \vsize\scratchdimen
     \ifdim\scratchdimen<\@@ldheight\relax % can be \vsize
       \scratchdimen\@@ldheight
     \fi
     \ifdim\scratchdimen>\@@ldmaxheight\relax
       \scratchdimen\@@ldmaxheight
     \fi
     \valignpairedbox\firstpairedbox \scratchdimen
     \valignpairedbox\secondpairedbox\scratchdimen
   \else
     \scratchdimen\maxoftwoboxdimens\wd\firstpairedbox\secondpairedbox
     \halignpairedbox\firstpairedbox \scratchdimen
     \halignpairedbox\secondpairedbox\scratchdimen
     \scratchdimen\ht\secondpairedbox
     \vsize\scratchdimen
     \ifdim\ht\secondpairedbox<\@@ldheight\relax % can be \vsize
       \scratchdimen\@@ldheight\relax % \relax needed
     \fi
     \ifdim\scratchdimen>\@@ldmaxheight\relax % todo: totale hoogte
       \scratchdimen\@@ldmaxheight\relax % \relax needed
     \fi
     \ifdim\scratchdimen>\ht\secondpairedbox
       \setbox\secondpairedbox\vbox to \scratchdimen
         {\ifnum\pairedlocationa=3 \vss\fi %
          \box\secondpairedbox
          \ifnum\pairedlocationa=2 \vss\fi}% \kern\zeropoint
     \fi
   \fi
   \ifcase\pairedlocationa
     \box\secondpairedbox\hskip\@@lddistance\box\firstpairedbox \or
     \box\firstpairedbox \hskip\@@lddistance\box\secondpairedbox\or
     \box\secondpairedbox\endgraf \nointerlineskip \@@ldinbetween \box\firstpairedbox \or
     \box\firstpairedbox \endgraf \nointerlineskip \@@ldinbetween \box\secondpairedbox\else
   \fi
   \egroup}

\def\insidesecondpairedbox
  {\forgetall
   \setupalign[\@@ldalign]%
   \tolerantTABLEbreaktrue % hm.
   \blank[\v!disable]%
   \everypar{\begstrut}}

\def\maxoftwoboxdimens#1#2#3%
  {#1\ifdim#1#2>#1#3 #2\else#3\fi}

\def\valignpairedbox#1#2%
  {\setbox#1\vbox to #2
     {\ifcase\pairedlocationb\or\or\or\vss\or\vss\fi
      \box#1\relax
      \ifcase\pairedlocationb\or\or\vss\or\or\vss\fi}}

\def\halignpairedbox#1#2%
  {\setbox#1\hbox to #2
     {\ifcase\pairedlocationb\or\hss\or\or\or\hss\fi
      \box#1\relax
      \ifcase\pairedlocationb\hss\or\or\or\or\hss\fi}}

\definepairedbox[\v!legend]

%D Goody:

\newevery \everyinsidefloat \relax

\appendtoks
  \global\resetsystemmode{combination}%
  \global\resetsystemmode{pairedbox}%
\to \everyinsidefloat
\f
\newcount\horcombination  % counter
\newcount\totcombination

\def\definecombination
  {\dodoubleempty\dodefinecombination}

\def\dodefinecombination[#1][#2]%
  {\copyparameters
     [\??co#1][\??co]
     [\c!width,\c!height,\c!distance,\c!location,%
      \c!before,\c!inbetween,\c!after,\c!align,%
      \c!style,\c!color]%
   \getparameters
     [\??co#1][#2]}

\def\setupcombinations
  {\dodoubleempty\dosetupcombinations}

\def\dosetupcombinations[#1][#2]%
  {\ifsecondargument
     \getparameters[\??co#1][#2]%
   \else
     \getparameters[\??co][#1]%
   \fi}

\def\combinationparameter#1%
  {\csname\??co\currentcombination#1\endcsname}%

\def\startcombination
  {\bgroup % so we can grab a group
   \dodoubleempty\dostartcombination}

\def\dostartcombination[#1][#2]%
  {\global\setsystemmode{combination}%
   \ifsecondargument
     \def\currentcombination{#1}%
   \else
     \let\currentcombination\empty
   \fi
   \forgetall
   \doifelse{\combinationparameter\c!height}\v!fit
     \vbox {\vbox to \combinationparameter\c!height}%
   \bgroup
  %\doifelsenothing{#1}
  %  {\dodostartcombination[2*1*]}
  %  {\doifelsenothing{#2}
  %     {\dodostartcombination[#1*1*]}
  %     {\dodostartcombination[#2*1*]}}}
   \expanded{\dodostartcombination
     [\ifsecondargument#2\else\iffirstargument#1\else2\fi\fi*1*]}}

\long\def\dodostartcombination[#1*#2*#3]%
  {\setuphorizontaldivision
     [\c!n=\v!fit,\c!distance=\combinationparameter\c!distance]%
   \global\horcombination#1%
   \global\totcombination#2%
   \global\setbox\combinationstack\emptybox
   \xdef\maxhorcombination{\the\horcombination}%
   \multiply\totcombination\horcombination
   \tabskip\zeropoint
   \doifelse{\combinationparameter\c!width}\v!fit
     {\halign}{\halign to \combinationparameter\c!width}%
   \bgroup&%
   %\hfil##\hfil% now : location={left,top}
   \ExpandBothAfter\doifnotinset\v!left{\combinationparameter\c!location}\hfil
   ##%
   \ExpandBothAfter\doifnotinset\v!right{\combinationparameter\c!location}\hfil
   &\tabskip\zeropoint \!!plus 1fill##\cr
   \docombination}

\def\docombination % we want to add struts but still ignore an empty box
  {\dowithnextbox
     {\setbox0\flushnextbox
      \dowithnextbox
        {\setbox2\flushnextbox
         \dodocombination}%
      \vtop\bgroup
        \def\next
          {\futurelet\nexttoken\nextnext}%
        \def\nextnext
          {\ifx\nexttoken\egroup \else % the next box is empty
             \hsize\wd0
             \setupalign[\combinationparameter\c!align]%
             \dostartattributes{\??co\currentcombination}\c!style\c!color\empty
             \bgroup
             \aftergroup\endstrut
             \aftergroup\dostopattributes
             \aftergroup\egroup
             \begstrut
           \fi}%
        \afterassignment\next\let\nexttoken=}
  \hbox}

% stupid version, does not align top stuff when captions,
% keep as example
%
% \def\dodocombination
%   {\vbox
%      {\forgetall % \setupwhitespace[\v!none]%
%       \let\next\vbox
%       \ExpandFirstAfter\processallactionsinset
%         [\combinationparameter\c!location]
%         [   \v!top=>\let\next\tbox,
%          \v!middle=>\let\next\halfwaybox]%
%       \next{\copy0}%
%       \ifdim\ht2>\zeropoint % beter dan \wd2, nu \strut mogelijk
%         \combinationparameter\c!inbetween
%         %\vtop % wrong code
%         %  {\nointerlineskip  % recently added
%         %   \hsize\wd0
%         %   \setupalign[\combinationparameter\c!align]%  % \raggedcenter
%         %   \begstrut\unhbox2\endstrut}%
%         \box2
%       \fi}%
%    \ifnum\totcombination>\plusone
%      \global\advance\totcombination\minusone
%      \global\advance\horcombination\minusone
%      \ifnum\horcombination=\zerocount
%        \def\next
%          {\cr\noalign
%             {\forgetall % \setupwhitespace[\v!geen]% no
%              \nointerlineskip
%              \combinationparameter\c!before
%              \combinationparameter\c!after
%              \vss
%              \nointerlineskip}%
%           \global\horcombination\maxhorcombination\relax
%           \docombination}%
%      \else
%        \def\next
%          {&&&\hskip\combinationparameter\c!distance&\docombination}%
%      \fi
%    \else
%      \def\next
%        {\cr\egroup}%
%    \fi
%    \next}

% \def\dodocombination
%   {\vbox
%      {\forgetall % \setupwhitespace[\v!none]%
%       \let\next\vbox
%       \ExpandFirstAfter\processallactionsinset
%         [\combinationparameter\c!plaats]
%         [   \v!top=>\let\next\tbox,
%          \v!middle=>\let\next\halfwaybox]%
%       \next{\copy0}%
%       % we need to save the caption for a next alignment line
%       \saveoncombinationstack2}%
%    \ifnum\totcombination>\plusone
%      \global\advance\totcombination\minusone
%      \global\advance\horcombination\minusone
%      \ifnum\horcombination=\zerocount
%        \def\next
%          {\cr
%           \flushcombinationstack
%           \noalign
%             {\forgetall % \setupwhitespace[\v!none]% no
%              \global\setbox\combinationstack\emptybox
%              \nointerlineskip
%              \combinationparameter\c!after
%              \combinationparameter\c!before
%              \vss
%              \nointerlineskip}%
%           \global\horcombination\maxhorcombination\relax
%           \docombination}%
%      \else
%        \def\next
%          {&&&\hskip\combinationparameter\c!distance&\docombination}%
%      \fi
%    \else
%      \def\next
%        {\cr
%         \flushcombinationstack
%         \egroup}%
%    \fi
%    \next}

\def\depthonlybox
  {\dowithnextbox{\vtop{\hsize\wd\nextbox\kern\zeropoint\box\nextbox}}\vbox}

% \def\boxwithstrutheight
%   {\dowithnextbox
%      {\scratchdimen\strutheight
%       \advance\scratchdimen-\nextboxht
%       \hbox{\raise\scratchdimen\box\nextbox}}%
%      \vbox}

\def\dodocombination
  {\vbox
     {\forgetall % \setupwhitespace[\v!none]%
      \let\next\vbox
      \ExpandFirstAfter\processallactionsinset
        [\combinationparameter\c!location]
        [    \v!top=>\let\next\depthonlybox, % \tbox,
          \v!middle=>\let\next\halfwaybox]%
      \next{\copy0}%
      % we need to save the caption for a next alignment line
      \saveoncombinationstack2}%
   \ifnum\totcombination>\plusone
     \global\advance\totcombination\minusone
     \global\advance\horcombination\minusone
     \ifnum\horcombination=\zerocount
       \def\next
         {\cr
          \flushcombinationstack
          \noalign
            {\forgetall % \setupwhitespace[\v!none]% no
             \global\setbox\combinationstack\emptybox
             \nointerlineskip
             \combinationparameter\c!after
             \combinationparameter\c!before
             \vss
             \nointerlineskip}%
          \global\horcombination\maxhorcombination\relax
          \docombination}%
     \else
       \def\next
         {&&&\hskip\combinationparameter\c!distance&\docombination}%
     \fi
   \else
     \def\next
       {\cr
        \flushcombinationstack
        \egroup}%
   \fi
   \next}

\def\stopcombination
  {\egroup
   \egroup}

\newbox\combinationstack

\def\saveoncombinationstack#1%
  {\global\setbox\combinationstack\hbox
     {\hbox{\box#1}\unhbox\combinationstack}}

\def\flushcombinationstack
  {\noalign
     {\ifdim\ht\combinationstack>\zeropoint
\nointerlineskip % nieuw
        \combinationparameter\c!inbetween
        \global\horcombination\maxhorcombination
        \globallet\doflushcombinationstack\dodoflushcombinationstack
      \else
        \global\setbox\combinationstack\emptybox
        \globallet\doflushcombinationstack\donothing
      \fi}%
   \doflushcombinationstack\crcr}

\gdef\dodoflushcombinationstack
  {\global\setbox\combinationstack\hbox
     {\unhbox\combinationstack
      \global\setbox1\lastbox}%
   \box1% \ruledhbox{\box1}%
   \global\advance\horcombination\minusone\relax
   \ifnum\horcombination>\zerocount
     \def\next{&&&&\doflushcombinationstack}%
   \else
     \global\setbox\combinationstack\emptybox
    %\let\next\relax
     \@EA\gobbleoneargument
   \fi
   \next}

\setupcombinations
  [\c!width=\v!fit,
   \c!height=\v!fit,
   \c!distance=1em,
   \c!location=\v!bottom, % can be something {top,left}
   \c!before=\blank,
   \c!inbetween={\blank[\v!medium]},
   \c!style=,
   \c!color=,
   \c!after=,
   \c!align=\v!middle]
\f
% does not work
%
% \def\plaatsondernaastelkaar#1#2%
%   {\bgroup
%    \def\doplaatsondernaastelkaar%
%      {#2\cr\omit\bgroup#2%
%       \aftergroup#2%
%       \aftergroup\cr
%       \aftergroup\egroup
%       \aftergroup\egroup
%       \let\next=}%
%    #1\bgroup##\cr
%    \omit\bgroup#2%
%    \aftergroup\doplaatsondernaastelkaar
%    \let\next=}

\def\plaatsondernaastelkaar#1#2%
  {\bgroup
   \dowithnextbox
     {\bgroup
      \setbox0\box\nextbox
      \dowithnextbox
        {\setbox2\box\nextbox
         #1{#2#########2\cr\box0\cr\box2\cr}
         \egroup
         \egroup}
        \hbox}
     \hbox}

\def\placeontopofeachother
  {\plaatsondernaastelkaar\halign\hss}

\def\placesidebyside
  {\plaatsondernaastelkaar\valign\vss}
\f
\def\douseexternalfiles[#1][#2]%
  {\getparameters
     [\??fi#1]
     [\c!file=,
      \c!bodyfont=,
      \c!option=,
      #2]}

\def\useexternalfiles
  {\dodoubleargument\douseexternalfiles}

\def\dostelexternefilesin[#1][#2]%
  {\doifundefinedelse{\??fi#1\c!file}
     {\useexternalfiles[#1][#2]}
     {\getparameters[\??fi#1][#2]}}

\def\stelexternefilesin
  {\dodoubleargument\dostelexternefilesin}

\def\verwerkexternefile#1#2#3%
  {\bgroup
   \getparameters[\??fi#1][\c!file=,#3]%
   \doinputonce{\getvalue{\??fi#1\c!file}}%
   \ExpandFirstAfter\switchtobodyfont[\getvalue{\??fi#1\c!bodyfont}]%
   \readsysfile{#2}  % beter: loc of fix gebied
     \donothing
     {\showmessage\m!systems{41}{#2,#1}}%
   \egroup}

\def\douseexternalfile[#1][#2][#3][#4]%
  {\stelexternefilesin[#1][]%
   \doinputonce{\getvalue{\??fi#1\c!file}}%
   \doifelsenothing{#2}
     {\setvalue{#3}{\verwerkexternefile{#1}{#3}{#4}}}
     {\setvalue{#2}{\verwerkexternefile{#1}{#3}{#4}}}}

\def\useexternalfile
  {\doquadrupleargument\douseexternalfile}

\useexternalfiles
  [pictex]
  [\c!bodyfont=\v!small,
   \c!file=pictex]

\useexternalfiles
  [table]
  [\c!file=table]
\f
%D A couple of examples, demonstrating how the depth is
%D taken care of:
%D
%D \startbuffer
%D test\rotate[frame=on, rotation=0]  {gans}%
%D test\rotate[frame=on, rotation=90] {gans}%
%D test\rotate[frame=on, rotation=180]{gans}%
%D test\rotate[frame=on, rotation=270]{gans}%
%D test
%D \stopbuffer
%D
%D \typebuffer \getbuffer

% \presetlocalframed[\??ro]
%
% \def\setuprotate
%   {\dodoubleargument\getparameters[\??ro]}
%
% \def\dorotatebox#1% {angle} \hbox/\vbox/\vtop
%   {\bgroup
%    \hbox\bgroup % compatibility hack
%    \dowithnextbox
%      {\edef\@@rorotation{#1}%
%       \setbox\nextbox\vbox{\flushnextbox}%
%       \dostoprotate
%       \egroup}}
%
% \def\dodostoprotate#1#2#3#4#5#6%
%   {\dontshowcomposition
%    \scratchdimen\nextboxht\advance\scratchdimen\nextboxdp
%    \doif\@@rolocation\v!high
%      {\setbox\nextbox\vbox{\hbox{\raise\nextboxdp\flushnextbox}}}%
%    \setbox\nextbox\vbox to #1
%      {#2\relax
%       \hbox to #4
%         {#5\relax % \number removes leading spaces too
%          \edef\@@rorotation{\number\@@rorotation}%
%          \doifelsenothing\@@rorotation
%            {\dostartrotation{90}}
%            {\dostartrotation{\@@rorotation}}%
%          \nextboxwd\zeropoint
%          \nextboxht\zeropoint
%         %\nextboxdp\zeropoint
%          \flushnextbox
%          \dostoprotation
%          #6}
%       #3}%
%    \nextboxdp\zeropoint
%    \flushnextbox
%    \egroup}
%
% \def\dostoprotate
%   {\!!counta\@@rorotation
%    \divide\!!counta 90
%    \ifcase\!!counta
%      \dodostoprotate\nextboxht\relax\vfill\nextboxwd\relax\hfill
%    \or
%     %\dodostoprotate\nextboxwd\vfill\relax\nextboxht\relax\hfill
%      \dodostoprotate\nextboxwd\vfill\relax\scratchdimen\relax\hfill
%    \or
%      \dodostoprotate\nextboxht\vfill\relax\nextboxwd\hfill\relax
%    \or
%     %\dodostoprotate\nextboxwd\relax\vfill\nextboxht\hfill\relax
%      \dodostoprotate\nextboxwd\relax\vfill\scratchdimen\hfill\relax
%    \or
%      \dodostoprotate\nextboxht\relax\vfill\nextboxwd\relax\hfill
%    \else
%      \def\@@rotation{90}%
%      \dodostoprotate\nextboxht\relax\vfill\nextboxwd\relax\hfill
%    \fi}
%
% \def\complexrotate[#1]%
%   {\dowithnextbox
%      {\getparameters[\??ro][#1]%
%       \dostoprotate}%
%    \vbox\localframed[\??ro][#1]}
%
% \unexpanded\def\rotate % \bgroup: \rotate kan argument zijn
%   {\bgroup\complexorsimpleempty\rotate}
%
% \setuprotate
%   [\c!rotation=90,
%    \c!width=\v!fit,
%    \c!height=\v!fit,
%    \c!offset=\v!overlay,
%    \c!frame=\v!off]

% The previous implementation is replaced by one that supports
% rotation over arbitrary angles.
%
% When we rotate over arbitrary angles, we need to relocate the
% resulting box because rotation brings that box onto the negative
% axis. The calculations (mostly sin and cosine) need to be tuned for
% the way a box is packages (i.e. the refence point). A typical example
% of drawing, scribbling, and going back to the days of school math.
%
% We do a bit more calculations than needed, simply because that way
% it's easier to debug the code.

\def\dododorotatenextbox
  {\setbox\nextbox\vbox to \@@layerysiz
     {\vfill
      \hbox to \@@layerxsiz
        {\dostartrotation\@@rorotation
           \nextboxwd\zeropoint
           \nextboxht\zeropoint
           \flushnextbox
         \dostoprotation
         \hfill}%
      \kern\@@layerypos}%
  \setbox\nextbox\hbox
    {\kern\@@layerxpos
     \kern\@@layerxoff
     \lower\@@layeryoff\flushnextbox}}

\def\dodorotatenextbox#1#2% quite some trial and error -)
  {\dontshowcomposition
   \dontcomplain
   \ifnum#2=\plusfour
     % new, location=middle
     \!!widthb \nextboxwd
     \!!heightb\nextboxht
     \!!depthb \nextboxdp
     \setbox\nextbox\vbox{\vskip.5\nextboxht\hskip-.5\nextboxwd\flushnextbox}%
     \smashbox\nextbox
   \fi
   \!!widtha \nextboxwd
   \!!heighta\nextboxht
   \!!deptha \nextboxdp
   \!!doneafalse
   \!!donebfalse
   \ifcase#2\or
     % 1: fit
   \or
     % 2: depth, not fit
     \!!doneatrue
     \!!donebtrue
   \or
     % 3: depth, fit
     \!!donebtrue
   \fi
   \setbox\nextbox\vbox{\hbox{\raise\nextboxdp\flushnextbox}}%
   \!!dimena \nextboxht
   \calculatecos\@@rorotation\edef\cos{\calculatedcos\@@rorotation}%
   \calculatesin\@@rorotation\edef\sin{\calculatedsin\@@rorotation}%
   \@@layerxpos\zeropoint
   \@@layerypos\zeropoint
   \@@layerxoff\zeropoint
   \@@layeryoff\zeropoint
   \ifdim\sin\points>\zeropoint
     \ifdim\cos\points>\zeropoint
       \@@layerxsiz                    \cos\!!widtha
       \@@layerysiz                    \sin\!!widtha
       \advance\@@layerxsiz            \sin\!!dimena
       \advance\@@layerysiz            \cos\!!dimena
       \@@layerypos                    \cos\!!dimena
       \if!!donea
         \@@layerxoff          \negated\sin\!!dimena
         \advance\@@layerxoff          \sin\!!deptha
       \fi
       \if!!doneb
         \@@layeryoff                  \cos\!!deptha
       \fi
       \dododorotatenextbox
     \else
       \@@layerxsiz            \negated\cos\!!widtha
       \@@layerysiz                    \sin\!!widtha
       \advance\@@layerxsiz            \sin\!!dimena
       \advance\@@layerysiz    \negated\cos\!!dimena
       \@@layerxpos            \negated\cos\!!widtha
       \if!!donea
         \@@layerxoff                     -\@@layerxsiz
         \advance\@@layerxoff          \sin\!!deptha
       \fi
       \if!!doneb
         \@@layeryoff          \negated\cos\!!heighta
       \fi
       \dododorotatenextbox
       \wd\nextbox\if!!donea\sin\!!deptha\else\@@layerxsiz\fi
     \fi
   \else
     \ifdim\cos\points<\zeropoint
       \@@layerxsiz           \negated\cos\!!widtha
       \@@layerysiz           \negated\sin\!!widtha
       \advance\@@layerxsiz   \negated\sin\!!dimena
       \advance\@@layerysiz   \negated\cos\!!dimena
       \@@layerxpos                        \@@layerxsiz
       \@@layerypos            \negated\sin\!!widtha
       \if!!donea
         \@@layerxoff                     -\@@layerxsiz
         \advance\@@layerxoff  \negated\sin\!!heighta
       \fi
       \if!!doneb
         \@@layeryoff                      \@@layerysiz
         \advance\@@layeryoff          \cos\!!deptha
       \fi
       \dododorotatenextbox
       \wd\nextbox\if!!donea\negated\sin\!!heighta\else\@@layerxsiz\fi
     \else
       \@@layerxsiz                    \cos\!!widtha
       \@@layerysiz            \negated\sin\!!widtha
       \advance\@@layerxsiz    \negated\sin\!!dimena
       \advance\@@layerysiz            \cos\!!dimena
       \ifdim\sin\points=\zeropoint
         \@@layerxpos                       \zeropoint
         \@@layerxoff                       \zeropoint
         \@@layerypos                      \@@layerysiz
         \if!!doneb
           \@@layeryoff                     \!!deptha
         \fi
       \else
         \@@layerypos                       \@@layerysiz
         \@@layerxpos           \negated\sin\!!dimena
         \if!!donea
           \@@layerxoff                    -\@@layerxsiz
           \advance\@@layerxoff \negated\sin\!!heighta
         \fi
         \if!!doneb
           \@@layeryoff          \negated\sin\!!deptha
         \fi
       \fi
       \dododorotatenextbox
       \ifdim\sin\points=\zeropoint
       \else
         \wd\nextbox\if!!donea\negated\sin\!!heighta\else\@@layerxsiz\fi
       \fi
     \fi
   \fi
   % new, location=middle
   \ifnum#2=\plusfour
     \setbox\nextbox\vbox{\vskip-.5\!!heightb\hskip.5\!!heightb\flushnextbox}%
     \nextboxwd\!!widthb
     \nextboxht\!!heightb
     \nextboxdp\!!depthb
   \fi}

\def\dorotatenextbox#1#2%
  {\doifsomething{#1}
     {\edef\@@rorotation{\number#1}% get rid of leading zeros and spaces
      \setbox\nextbox\vbox{\flushnextbox}% not really needed
      \dodorotatenextbox\@@rorotation#2}%
   \hbox{\boxcursor\flushnextbox}}

\def\dodorotatebox#1% {angle} \hbox/\vbox/\vtop
  {\bgroup\hbox\bgroup % compatibility hack
     \dowithnextbox
       {\dorotatenextbox{#1}\plusone
        \egroup\egroup}}

\def\dorotatebox#1% {angle} \hbox/\vbox/\vtop
  {\ifcase#1\relax
     \expandafter\gobbleoneargument
   \else
     \expandafter\dodorotatebox
   \fi{#1}}

\unexpanded\def\rotate % \bgroup: \rotate kan argument zijn
  {\bgroup\complexorsimpleempty\rotate}

\def\complexrotate[#1]% framed met diepte !
  {\getparameters[\??ro][#1]%
   \processaction
     [\@@rolocation]
     [  \v!depth=>\!!counta\plusthree\donefalse,% depth   fit   - raw box
          \v!fit=>\!!counta\plustwo  \donefalse,% depth   tight - raw box
        \v!broad=>\!!counta\plusone  \donefalse,% nodepth fit   - raw box
         \v!high=>\!!counta\plusone  \donetrue ,% nodepth fit   - framed
       \v!middle=>\!!counta\plusfour \donefalse,% centered, keep dimensions
      \s!default=>\!!counta\plusthree\donetrue ,% depth   fit   - framed
      \s!unknown=>\!!counta\plusthree\donetrue ]% depth   fit   - framed
   \ifdone
     \def\docommand{\localframed[\??ro][#1,\c!location=]}%
   \else
     \let\docommand\relax
   \fi
   \dowithnextbox{\dorotatenextbox\@@rorotation\!!counta\egroup}\vbox\docommand}

\presetlocalframed[\??ro]

\def\setuprotate
  {\dodoubleargument\getparameters[\??ro]}

\setuprotate
  [\c!rotation=90,
   \c!location=\v!normal,
   \c!width=\v!fit,
   \c!height=\v!fit,
   \c!offset=\v!overlay,
   \c!frame=\v!off]

% \dostepwiserecurse{0}{360}{10}
%   {\startlinecorrection[blank]
%    \hbox
%      {\expanded{\setuprotate[rotation=\recurselevel]}%
%       \traceboxplacementtrue
%       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=depth] {\ruledhbox{\bfb  (depth)}}}}%
%       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=fit]   {\ruledhbox{\bfb    (fit)}}}}%
%       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=broad] {\ruledhbox{\bfb  (broad)}}}}%
%       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=normal]{\ruledhbox{\bfb (normal)}}}}%
%       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=high]  {\ruledhbox{\bfb   (high)}}}}}
%    \stoplinecorrection}
\f
% scale

\def\doscalelikeafigure % quite dirty and potential interference possible
  {\doifsomething{\@@xyscale\@@xyxscale\@@xyyscale
                  \@@xyfactor\@@xyhfactor\@@xywfactor
                  \@@xywidth\@@xyheight\@@xylines}
     {\let \@@efscale  \@@xyscale
      \let \@@efxscale \@@xyxscale
      \let \@@efyscale \@@xyyscale
      \let \@@effactor \@@xyfactor
      \let \@@efwfactor\@@xywfactor
      \let \@@efhfactor\@@xyhfactor
      \let \@@efwidth  \@@xywidth
      \let \@@efheight \@@xyheight
      \let \@@eflines  \@@xylines
      \let \@@efgrid   \@@xygrid
      \let \@@epx      \!!zeropoint
      \let \@@epy      \!!zeropoint
      \edef\@@epw     {\the\nextboxwd}%
      \edef\@@eph     {\the\nextboxht}%
      \figwid\zeropoint \figxsca\plusone % see note * (core-fig)
      \fighei\zeropoint \figysca\plusone % see note * (core-fig)
      \checkfiguresettings
      \setfactorfiguresize
      \setscalefiguresize
      \setdimensionfiguresize
      \convertfigureinsertscale\@@epx\figx\figxsca\scax
      \convertfigureinsertscale\@@epy\figy\figysca\scay
      \scratchdimen\scax\points \divide\scratchdimen \plushundred
      \edef\@@xysx{\withoutpt\the\scratchdimen}%
      \scratchdimen\scay\points \divide\scratchdimen \plushundred
      \edef\@@xysy{\withoutpt\the\scratchdimen}}}

\def\doscale[#1]% todo: xscale/yscale
  {\bgroup
   \forgetall
   \getparameters
     [\??xy]
     [\c!scale=,\c!xscale=,\c!yscale=,\c!width=,\c!height=,\c!lines=,
      \c!factor=,\c!hfactor=,\c!wfactor=,\c!grid=,
      \c!sx=1,\c!sy=1,#1]%
   \dowithnextbox
     {\dontshowcomposition
      \ifdim\nextboxht>\zeropoint \ifdim\nextboxwd>\zeropoint
        \doscalelikeafigure
        \dimen0=\@@xysy\nextboxht
        \dimen2=\@@xysy\nextboxdp
        \dimen4=\@@xysx\nextboxwd
        \dimen6=\dimen0\advance\dimen6 \dimen2
%        \setbox\nextbox\vbox to \dimen6
%          {\nextboxht\zeropoint
%           \nextboxdp\zeropoint
%           \vfill % erbij
%           \dostartscaling\@@xysx\@@xysy\flushnextbox\dostopscaling}%
        \setbox\nextbox\hbox
          {\smashbox\nextbox
           \dostartscaling\@@xysx\@@xysy\flushnextbox\dostopscaling}%
        \nextboxht\dimen0
        \nextboxdp\dimen2
        \nextboxwd\dimen4
      \fi \fi
      \flushnextbox
      \egroup}
   \hbox}

\def\scale
  {\dosingleempty\doscale}

% mirror

\def\domirrorbox % \hbox/\vbox/\vtop
  {\bgroup
   \dowithnextbox
     {\dontshowcomposition
      \scratchdimen\nextboxwd
      % better use an hbox (if no \forgetall, leftskip etc may creep in)
     %\setbox\nextbox\vbox{\forgetall\dostartmirroring\hskip-\nextboxwd\flushnextbox\dostopmirroring}%
      \setbox\nextbox\hbox{\dostartmirroring\hskip-\nextboxwd\flushnextbox\dostopmirroring}%
      \nextboxwd\scratchdimen
      \flushnextbox
      \egroup}}

\def\mirror
  {\domirrorbox\hbox}

%\setbox0=\hbox{gans}
%
%\ruledhbox{\copy0 \schaal[sx=2,sy=2]{\copy0}}
%
%\spiegel{\ruledhbox{\copy0 \schaal{\box0}}}
\f
% to be used in some other places! todo!
%
% divides \hsize in fractions, will be made a bit more
% clever and advanced when needed
%
% \horizontaldivision[n/m,elements,distance]
%
% \horizontaldivision[2/5,3,1em]
% \horizontaldivision[2/5,3,1em]
% \horizontaldivision[1/5,3,1em]
%
% \setuphorizontaldivision[afstand=,aantal=]  (passend,passend)

\def\??fr{@@fr}

\def\setuphorizontaldivision
  {\dodoubleargument\getparameters[\??fr]}

\def\horizontaldivision
  {\dosingleargument\dohorizontaldivision}

\def\dohorizontaldivision[#1]%
  {\dodohorizontaldivision[#1,,,,,,]}

\def\dodohorizontaldivision[#1/#2,#3,#4,#5]%
  {\doifelsenothing{#3}
     {\doifelse\@@frn\v!fit
        {\!!counta#2\relax}
        {\!!counta\@@frn\relax}}
     {\!!counta#3\relax}%
   \doifelsenothing{#4}
     {\doifelse\@@frdistance\v!fit
        {\!!widtha\zeropoint}
        {\!!widtha\@@frdistance}}
     {\!!widtha#4}%
   \advance\!!counta \minusone
   \multiply\!!widtha \!!counta
   \advance\hsize -\!!widtha
   \divide\hsize #2\relax
   \hsize#1\hsize}

\setuphorizontaldivision
  [\c!distance=\tfskipsize,
   \c!n=\v!fit]
\f
%D This one is for Daniel Pittman, who wanted tight
%D fractions. We show three versions. First the simple
%D one using \type {\low} and \type {high}:
%D
%D \startbuffer
%D \def\vfrac#1#2%
%D   {\hbox{\high{\tx#1\kern-.25em}/\low{\kern-.25em\tx#2}}}
%D
%D test \vfrac{1}{2} test \vfrac{123}{456} test
%D \stopbuffer
%D
%D \typebuffer {\showmakeup\getbuffer}
%D
%D A better way to handle the kerning is the following, here
%D we kind of assume that tye slash is symmetrical and has
%D nearly zero width.
%D
%D \startbuffer
%D \def\vfract#1#2%
%D   {\hbox{\high{\tx#1}\hbox to \zeropoint{\hss/\hss}\low{\tx#2}}}
%D \stopbuffer
%D
%D \typebuffer {\showmakeup\getbuffer}
%D
%D The third and best alternative is the following:
%D
%D {\showmakeup\getbuffer}\crlf\getbuffer
%D
%D This time we measure the height of the \type {/} and
%D shift over the maximum height and depths of this
%D character and the fractional digits (we use 57 as
%D sample). Here we combine all methods in one macros.

\chardef\vulgarfractionmethod=3

\definehspace[vulgarfraction][.25em] % [.15em]
\definesymbol[vulgarfraction][/]     % [\raise.2ex\hbox{/}]

\unexpanded\def\vulgarfraction#1#2%
  {\dontleavehmode
   \hbox
     {\def\vulgarfraction{vulgarfraction}%
      \ifcase\vulgarfractionmethod
        #1\symbol[\vulgarfraction]#2%
      \or
        \high{\tx#1\kern-\hspaceamount\empty\vulgarfraction}%
        \symbol[\vulgarfraction]%
        \low {\kern-\hspaceamount\empty\vulgarfraction\tx#2}%
      \or
        \high{\tx#1}%
        \hbox to \zeropoint{\hss\symbol[\vulgarfraction]\hss}%
        \low{\tx#2}%
      \or
        \setbox0\hbox{\symbol[\vulgarfraction]}%
        \setbox2\hbox{\txx57}%
        \raise\ht0\hbox{\lower\ht2\hbox{\txx#1}}%
        \hbox to \zeropoint{\hss\symbol[\vulgarfraction]\hss}%
        \lower\dp0\hbox{\raise\dp2\hbox{\txx#2}}%
      \fi}}

\ifx\vfrac\undefined \let\vfrac\vulgarfraction \fi

%D \starttabulate
%D \HL
%D \NC \bf method \NC \bf visualization \NC\NR
%D \HL
%D \NC 0 \NC \chardef\vulgarfractionmethod0\vulgarfraction{1}{2} \NC\NR
%D \NC 1 \NC \chardef\vulgarfractionmethod1\vulgarfraction{1}{2} \NC\NR
%D \NC 2 \NC \chardef\vulgarfractionmethod2\vulgarfraction{1}{2} \NC\NR
%D \NC 3 \NC \chardef\vulgarfractionmethod3\vulgarfraction{1}{2} \NC\NR
%D \HL
%D \stoptabulate
\f
%D Under construction:
%D
%D \starttyping
%D \commalistsentence[aap,noot,mies]
%D \commalistsentence[aap,noot]
%D \commalistsentence[aap]
%D \stoptyping

\let\handlecommalistsentence\firstofoneargument

\def\commalistsentence[#1]%
  {\bgroup
   \getcommalistsize[#1]%
   \ifcase\commalistsize\relax
     \def\serializedcommalist{#1}%
   \else
     \let\serializedcommalist\empty
     \scratchcounter\zerocount
     \def\docommando##1%
       {\advance\scratchcounter \plusone
        \ifnum\scratchcounter=\plusone
          \scratchtoks{\handlecommalistsentence{##1}}%
        \else
          \ifnum\scratchcounter=\commalistsize
            \appendtoks\labeltext{and-2}\handlecommalistsentence{##1}\to\scratchtoks
          \else
            \appendtoks\labeltext{and-1}\handlecommalistsentence{##1}\to\scratchtoks
          \fi
        \fi}%
     \processcommacommand[#1]\docommando
     \edef\serializedcommalist{\the\scratchtoks}%
   \fi
   \serializedcommalist
   \egroup}

\ifx\textcomma\undefined \def\textcomma{,} \fi

\setuplabeltext [\s!nl] [and-1=\textcomma\ , and-2= en ]
\setuplabeltext [\s!en] [and-1=\textcomma\ , and-2=\textcomma\ and ]
\setuplabeltext [\s!de] [and-1=\textcomma\ , and-2= und ]
\f
\protect \endinput

[-- Attachment #3: Type: text/plain, Size: 139 bytes --]

_______________________________________________
ntg-context mailing list
ntg-context@ntg.nl
http://www.ntg.nl/mailman/listinfo/ntg-context

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-28 16:58                     ` \setupmarginrules Vit Zyka
@ 2006-03-28 17:13                       ` Hans Hagen
  0 siblings, 0 replies; 23+ messages in thread
From: Hans Hagen @ 2006-03-28 17:13 UTC (permalink / raw)


Vit Zyka wrote:
> Taco Hoekwater wrote:
>   
>> Vit Zyka wrote:
>>
>>     
>>>       \dimen3=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
>>>       
>> Taco Hoekwater wrote:
>>
>>     
>>>       \dimen4=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
>>>       
>> That's funny ;)
>>
>> Cheers, Taco
>>     
>
> Yes funny. Even line position is the same. But why 4? I know: why not.
>
> Will be move to distro? (Indifferent which version.) Old code contained 
> buggy space calculation and the rule position, I think.
>
>   
well, this feature needs an overhaul anyway 

Hans 

-----------------------------------------------------------------
                                          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
-----------------------------------------------------------------

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-28 17:12                   ` \setupmarginrules Hans Hagen
@ 2006-03-28 18:55                     ` Vit Zyka
  2006-03-28 21:44                     ` \setupmarginrules frantisek holop
  1 sibling, 0 replies; 23+ messages in thread
From: Vit Zyka @ 2006-03-28 18:55 UTC (permalink / raw)


Hans Hagen wrote:
> Vit Zyka wrote:
> 
>> Willi Egger wrote:
>>  
>>
>>> Hi Vit!
>>>
>>> Thanks for this patch. Do you know why the rulethickness must be 
>>> given in integer dimension. e.g. 2.5pt will cause an error, telling 
>>> that a wrong dimension is used.
>>>
>>> Willi
>>>     
>>
>>
>> Due to my fault. Sorry. This is a little bit better solution:
>>
>> -----------------------------------------------
>> \defineparagraphs       [poem][n=2,distance=20pt]
>> \setupparagraphs        [poem][1][width=.25\textwidth]
>> \setupparagraphs        [poem][2][rule=on,rulethickness=5.5pt]
>>
>> \unprotected
>> \def\doalinealijn#1#2%
>>    {\doifelsevalue{\??al#2\the\alteller\c!rule}\v!on
>>       {\dimen2=#1\relax
>>        \dimen3=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
>>        \hskip.5\dimen2
>> %      \hskip-\linewidth
>>        \hskip-.5\dimen3 % VZ
>> %      \vrule\!!width\linewidth
>>        \vrule\!!width\dimen3 % VZ
>>        \hskip-.5\dimen3 % VZ
>>        \hskip.5\dimen2}
>>       {\hskip#1}}
>>   
> 
> \def\doalinealijn#1#2%
>  {\doifelsevalue{\??al#2\the\alteller\c!rule}\v!on
>     {\linewidth\getvalue{\??al#2\the\alteller\c!rulethickness}%
>      \scratchdimen#1%
>      \advance\scratchdimen-\linewidth
>      \divide\scratchdimen \plustwo
>      \hskip\scratchdimen
>      \vrule\!!width\linewidth
>      \hskip\scratchdimen}
>     {\hskip#1}}
> 
> btw, this feature is pretty old, and therefore a bit crappy; for 
> instance, the spacing in this example poem is funny (topskip) so i 
> wonder if the attached file works better (maybe optional); can those who 
> use paragraphs this wau test the attached variant (for taco: raises the 
> result by strutheight)
> 
> (beware: i un-dutched the file a bit)

Fine, you forgot to initialize rulethickness:

    \getparameters[\??al#1]%
      [\c!n=3,
       \c!before=\blank,
       \c!after=\blank,
       \c!distance=1em,
       \c!height=\v!fit,
       \c!rule=\v!off,
       \c!rulethickness=\linewidth, % <--------------------------------
       \c!command=,
       \c!align=,
       \c!tolerance=\v!tolerant,
       \c!style=,
       \c!color=,
       \c!top=,
       \c!top=\vss,
       \c!bottom=\vfill,
       #2]%
    \setvalue{\e!setup#1\e!endsetup}%
      {\setupparagraphs[#1]}%
    \dorecurse
       {\getvalue{\??al#1\c!n}}
       {\setupparagraphs[#1][\recurselevel]
          [\c!width=,
           \c!bottom=\getvalue{\??al#1\c!bottom},
           \c!top=\getvalue{\??al#1\c!top},
           \c!height=\getvalue{\??al#1\c!height},
           \c!style=\getvalue{\??al#1\c!style},
           \c!color=\getvalue{\??al#1\c!color},
           \c!rule=\getvalue{\??al#1\c!rule},
           \c!rulethickness=\getvalue{\??al#1\c!rulethickness},%<-----
           \c!align=\getvalue{\??al#1\c!align},
           \c!tolerance=\getvalue{\??al#1\c!tolerance},
           \c!distance=\getvalue{\??al#1\c!distance}]}%

Vit

> 
> Hans
> 
> -----------------------------------------------------------------
>                                          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
> -----------------------------------------------------------------
> 
> 
> ------------------------------------------------------------------------
> 
> %D \module
> %D   [       file=core-mis,
> %D        version=1998.01.29,
> %D          title=\CONTEXT\ Core Macros,
> %D       subtitle=Miscelaneous,
> %D         author=Hans Hagen,
> %D           date=\currentdate,
> %D      copyright={PRAGMA / 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.
> 
> \writestatus{loading}{Context Core Macros / Misc Commands}
> 
> % todo: kleur in legenda + letter
> 
> % Obsolete
> %
> % \startmessages  dutch  library: systems
> %   title: systeem
> %       3: probeer LaTeX eens
> % \stopmessages
> %
> % \startmessages  english  library: systems
> %   title: system
> %       3: try LaTeX
> % \stopmessages
> %
> % \startmessages  german  library: systems
> %   title: system
> %       3: Versuche LaTeX
> % \stopmessages
> %
> % \startmessages  czech  library: systems
> %   title: system
> %       3: zkuste LaTeX
> % \stopmessages
> %
> % \startmessages  italian  library: systems
> %   title: sistema
> %       3: provare LaTeX
> % \stopmessages
> %
> % \startmessages  norwegian  library: systems
> %   title: system
> %       3: fors�ker LaTeX
> % \stopmessages
> %
> % \startmessages  romanian  library: systems
> %   title: sistem
> %       3: incercati LaTeX
> % \stopmessages
> %
> 
> % %D You would not expect the next macro in \CONTEXT,
> % %D wouldn't you? It's there to warn \LATEX\ users that
> % %D something is wrong.
> % %D
> % %D Obsolete now:
> % %
> % % \def\documentstyle{\showmessage\m!systems3\empty\stoptekst}
> % %
> % % \let\documentclass=\documentstyle
> % %D \macros
> % %D   {simplifiedcommands, simplifycommands}
> % %D
> % %D I first needed this simplification in bookmarks. Users can
> % %D add their own if needed.
> 
> \unprotect
> 
> %D Sometimes (for instance in bookmarks) we need to simplify macro
> %D behaviour, so here is the hook.
> 
> \ifx\simplifiedcommands\undefined \newtoks\simplifiedcommands \fi
> 
> \def\simplifycommands{\the\simplifiedcommands}
> 
> %D A possibly growing list:
> 
> %appendtoks        \def\executesynonym#1#2#3#4{#3}\to\simplifiedcommands
> %appendtoks             \def\executesort#1#2#3{#3}\to\simplifiedcommands
> 
> \appendtoks                                \def\ { }\to\simplifiedcommands
> \appendtoks  \def\type#1{\string\\\strippedcsname#1}\to\simplifiedcommands
> \appendtoks                            \def\TeX{TeX}\to\simplifiedcommands
> \appendtoks                    \def\ConTeXt{ConTeXt}\to\simplifiedcommands
> \appendtoks                  \def\MetaPost{MetaPost}\to\simplifiedcommands
> \appendtoks                  \def\MetaFont{MetaFont}\to\simplifiedcommands
> \appendtoks                    \def\MetaFun{MetaFun}\to\simplifiedcommands
> %appendtoks                                \def||{-}\to\simplifiedcommands
> \appendtoks  \def|#1|{\ifx#1\empty\empty-\else#1\fi}\to\simplifiedcommands
> 
> \appendtoks\let\buildtextaccent\secondoftwoarguments\to\simplifiedcommands
> \f
> % THIS WAS MAIN-002.TEX
> 
> %\def\checkinterlineskip
> %  {\ifvmode
> %     \ifdim\lastskip>\zeropoint
> %       \nointerlineskip
> %     \else\ifdim\lastkern>\zeropoint
> %       \nointerlineskip
> %     \fi\fi
> %   \fi}
> 
> \def\horitems#1#2% #1=breedte #2=commandos
>   {\scratchdimen#1%
>    \divide\scratchdimen \nofitems
>    \!!counta\zerocount
>    \def\docommando##1%
>      {\advance\!!counta \plusone
>       \processaction
>         [\@@isalign]
>         [   \v!left=>\hbox to \scratchdimen{\strut##1\hss},
>            \v!right=>\hbox to \scratchdimen{\hss\strut##1},
>           \v!middle=>\hbox to \scratchdimen{\hss\strut##1\hss},
>           \v!margin=>\ifnum\!!counta=\plusone\hss\else\hfill\fi
>                      \strut##1%
>                      \ifnum\!!counta=\nofitems\hss\else\hfill\fi,
>          \s!default=>\hbox to \scratchdimen{\hss\strut##1\hss}, % midden
>          \s!unknown=>\hbox to \scratchdimen{\strut##1\hss}]}%   % links
>    \hbox to #1{\hss#2\hss}}
> 
> \def\veritems#1#2% #1=breedte #2=commandos
>   {\scratchdimen#1%
>    \def\docommando##1%
>      {\ifdim\scratchdimen<\zeropoint % the - was a signal
>         \hbox to -\scratchdimen{\hss\strut##1}%
>       \else\ifdim\scratchdimen>\zeropoint
>         \hbox to \scratchdimen{\strut##1\hss}%
>       \else
>         \hbox{\strut##1}%
>       \fi\fi}%
>    \vbox{#2}}
> 
> \def\dosetupitems[#1]%
>   {\getparameters[\??is][#1]%
>    \doif\@@iswidth\v!unknown
>      {\def\@@iswidth{\hsize}}%
>    \doifconversiondefinedelse\@@issymbol
>      {\def\doitembullet##1{\convertnumber{\@@issymbol}{##1}}}
>      {\doifsymboldefinedelse\@@issymbol
>         {\def\doitembullet##1{\symbol[\@@issymbol]}}{}}}
> 
> \def\makeitemsandbullets#1%
>   {\doifelse\@@isn\v!unknown
>      {\getcommalistsize[#1]%
>       \edef\nofitems{\commalistsize}}
>      {\edef\nofitems{\@@isn}}%
>    \setbox0\hbox
>      {\doitems \@@iswidth
>         {\processcommalist[#1]\docommando}}%
>    \setbox2\hbox
>      {\doitems \@@isbulletbreedte
>         {\dorecurse\nofitems
>            {\docommando{\strut\doitembullet\recurselevel}}}}}
> 
> \def\dostartitems#1#2#3%
>   {\let\doitems#2%
>    \def\@@isbulletbreedte{#3}%
>    \makeitemsandbullets{#1}%
>    \@@isbefore}
> 
> \def\dostopitems
>   {\@@isafter
>    \egroup}
> 
> \setvalue{doitems\v!top}#1%
>   {\dostartitems{#1}\horitems\@@iswidth
>    \noindent\vbox
>      {\forgetall
>       \doifsomething\@@issymbol
>         {\doifnot\@@issymbol\v!none
>            {\box2
>             \@@isinbetween
>             \nointerlineskip}}%
>       \box0}%
>    \dostopitems}
> 
> \setvalue{doitems\v!bottom}#1%
>   {\dostartitems{#1}\horitems\@@iswidth
>    \noindent\vbox
>      {\forgetall
>       \box0
>       \doifsomething\@@issymbol
>         {\@@isinbetween
>          \nointerlineskip
>          \box2}}%
>    \dostopitems}
> 
> \setvalue{doitems\v!inmargin}#1%
>   {\dostartitems{#1}\veritems{-1.5em}%  - is a signal
>    \noindent\hbox{\llap{\box2\hskip\leftmargindistance}\box0}%
>    \dostopitems}
> 
> \setvalue{doitems\v!left}#1%
>   {\advance\hsize -1.5em%
>    \dostartitems{#1}\veritems{1.5em}%
>    \noindent\hbox{\box2\box0}%
>    \dostopitems}
> 
> \setvalue{doitems\v!right}#1%
>   {\dostartitems{#1}\veritems{0em}%
>    \noindent\hbox{\box0\hskip-\wd2\box2}%
>    \dostopitems}
> 
> \def\setupitems
>   {\dosingleargument\dosetupitems}
> 
> \def\complexitems[#1]%
>   {\bgroup
>    \setupitems[#1]%
>    \parindent\zeropoint
>    \setlocalhsize
>    \hsize\localhsize
>    \dontcomplain
>   %\doifundefined{doitems\@@islocation}%
>   %  {\let\@@islocation\v!left}%
>   %\getvalue{doitems\@@islocation}}
>    \executeifdefined{doitems\@@islocation}{\let\@@islocation\v!left}}
> 
> \definecomplexorsimpleempty\items
> 
> \setupitems
>   [\c!location=\v!left,
>    \c!symbol=5,
>    \c!width=\hsize,
>    \c!align=\v!middle,
>    \c!n=\v!unknown,
>    \c!before=\blank,
>    \c!inbetween={\blank[\v!medium]},
>    \c!after=\blank]
> \f
> % Te zijner tijd [plaats=boven,onder,midden] implementeren,
> % in dat geval moet eerst de maximale hoogte worden bepaald.
> %
> % Overigens kan een en ander mooier met \halign.
> 
> \def\dodefineparagraphs[#1][#2]%
>   {\setvalue{\s!do\s!next#1}%
>      {\def\\{\getvalue{#1}}}%
>    \setvalue{#1}%
>      {\getvalue{\s!do\s!next#1}%
>       \dostartparagraphs{#1}}%
>    \setvalue{\e!next#1}%
>      {\getvalue{#1}}%
>    \setvalue{\e!start#1}%
>      {\bgroup
>       \letvalue{\s!do\s!next#1}\empty
>       \setvalue{\e!stop#1}%
>         {\getvalue{#1}%
>          \egroup}%
>       \getvalue{#1}}%
>    \getparameters[\??al#1]%
>      [\c!n=3,
>       \c!before=\blank,
>       \c!after=\blank,
>       \c!distance=1em,
>       \c!height=\v!fit,
>       \c!rule=\v!off,
>       \c!command=,
>       \c!align=,
>       \c!tolerance=\v!tolerant,
>       \c!style=,
>       \c!color=,
>       \c!top=,
>       \c!top=\vss,
>       \c!bottom=\vfill,
>       #2]%
>    \setvalue{\e!setup#1\e!endsetup}%
>      {\setupparagraphs[#1]}%
>    \dorecurse
>       {\getvalue{\??al#1\c!n}}
>       {\setupparagraphs[#1][\recurselevel]
>          [\c!width=,
>           \c!bottom=\getvalue{\??al#1\c!bottom},
>           \c!top=\getvalue{\??al#1\c!top},
>           \c!height=\getvalue{\??al#1\c!height},
>           \c!style=\getvalue{\??al#1\c!style},
>           \c!color=\getvalue{\??al#1\c!color},
>           \c!rule=\getvalue{\??al#1\c!rule},
>           \c!align=\getvalue{\??al#1\c!align},
>           \c!tolerance=\getvalue{\??al#1\c!tolerance},
>           \c!distance=\getvalue{\??al#1\c!distance}]}%
>    \setupparagraphs[#1][1][\c!distance=0em]}
> 
> \def\defineparagraphs
>   {\dodoubleargument\dodefineparagraphs}
> 
> \def\dosetupparagraphs[#1][#2][#3]%
>   {\doifelse{#2}\v!each
>      {\dorecurse
>         {\getvalue{\??al#1\c!n}}
>         {\getparameters[\??al#1\recurselevel][#3]}}
>      {\ConvertToConstant\doifelse{#3}{}
>         {\getparameters[\??al#1][#2]}
>         {\def\docommando##1%
>            {\getparameters[\??al#1##1][#3]}%
>          \processcommalist[#2]\docommando}}}
> 
> \def\setupparagraphs
>   {\dotripleempty\dosetupparagraphs}
> 
> \newcount\alcounter
> \newcount\alnsize
> \newdimen\alhsize
> 
> \def\doparagraphrule#1#2%
>   {\doifelsevalue{\??al#2\the\alcounter\c!rule}\v!on
>      {\linewidth\getvalue{\??al#2\the\alcounter\c!rulethickness}%
>       \scratchdimen#1%
>       \advance\scratchdimen-\linewidth
>       \divide\scratchdimen \plustwo
>       \hskip\scratchdimen
>       \vrule\!!width\linewidth
>       \hskip\scratchdimen}
>      {\hskip#1}}
> 
> \def\dostartparagraph#1%
>   {\doifelsevaluenothing{\??al#1\the\alcounter\c!width}
>      {\!!widtha\alhsize
>       \divide\!!widtha \alnsize}
>      {\!!widtha\getvalue{\??al#1\the\alcounter\c!width}}%
>    \dostartattributes
>      {\??al#1\the\alcounter}\c!style\c!color
>      \empty
>    \doifelsevalue{\??al#1\the\alcounter\c!height}\v!fit
>      {\setbox0\vtop}
>      {\setbox0\vtop to \getvalue{\??al#1\the\alcounter\c!height}}%
>    \bgroup
>    \blank[\v!disable]%
>    \forgetall
>    \getvalue{\??al#1\the\alcounter\c!top}%
>    \getvalue{\??al#1\c!inner}%
>    \hsize\!!widtha  % setting \wd afterwards removed
>    \getvalue{\??al#1\the\alcounter\c!inner}%
>    \edef\!!stringa{\getvalue{\??al#1\the\alcounter\c!align}}%  nodig?
>    \expandafter\setupalign\expandafter[\!!stringa]%
>    \edef\!!stringa{\getvalue{\??al#1\the\alcounter\c!tolerance}}% nodig?
>    \expandafter\setuptolerance\expandafter[\!!stringa]%
>    \ignorespaces
>    \endgraf
>    \ignorespaces
>    %
>    % Nadeel van de onderstaande constructie is dat \everypar
>    % binnen een groep kan staan en zo steeds \begstruts
>    % worden geplaatst. Mooi is anders dus moet het anders!
>    %
>    % Hier is \Everypar niet nodig.
>    %
>    \everypar{\begstrut\everypar\emptytoks}%
>    %
>    \ignorespaces\geenspatie % dubbel: \ignorespaces
>    \getvalue{\??al#1\the\alcounter\c!command}}
> 
> \def\dostopparagraph#1%
>   {\ifvmode
>      \removelastskip
>    \else
>      \unskip\endstrut\endgraf
>    \fi
>    \getvalue{\??al#1\the\alcounter\c!bottom}%
>    \egroup
>    \ifdim\wd0=\zeropoint % no data
>      \wd0\!!widtha
>    \fi
>    \box0
>    \dostopattributes
>    %\ifnum\alcounter<\getvalue{\??al#1\c!n}\relax
>    %  \def\next{\doparagraphcell{#1}}%
>    %\else
>    %  \def\next{\dostopparagraphs{#1}}%
>    %\fi
>    %\next}
>    \ifnum\alcounter<\getvalue{\??al#1\c!n}\relax
>      \@EA\doparagraphcell
>    \else
>      \@EA\dostopparagraphs
>    \fi{#1}}
> 
> \def\doparagraphcell#1%
>   {\global\advance\alcounter \plusone
>    \doifelsevaluenothing{\??al#1\the\alcounter\c!distance}
>      {\doifnot{\the\alcounter}{1}
>         {\hskip\getvalue{\??al#1\c!distance}}}
>      {\doifelse{\the\alcounter}{1}%
>         {\hskip\getvalue{\??al#1\the\alcounter\c!distance}}
>         {\doparagraphrule{\getvalue{\??al#1\the\alcounter\c!distance}}{#1}}}%
>    \setvalue{#1}{\dostopparagraph{#1}}%
>    \dostartparagraph{#1}}
> 
> \def\dostartparagraphs#1%
>   {\global\alcounter\zerocount
>    \parindent\zeropoint
>    \setlocalhsize
>    \alhsize\localhsize
>    \alnsize\getvalue{\??al#1\c!n}\relax
>    \dorecurse
>      {\getvalue{\??al#1\c!n}}
>      {\doifelsevaluenothing{\??al#1\recurselevel\c!distance}
>         {\ifnum\recurselevel=\plusone\else
>            \global\advance\alhsize -\getvalue{\??al#1\c!distance}\relax
>          \fi}
>         {\global\advance\alhsize -\getvalue{\??al#1\recurselevel\c!distance}\relax}%
>       \doifvaluesomething{\??al#1\recurselevel\c!width}
>         {\global\advance\alnsize \minusone
>          \global\advance\alhsize -\getvalue{\??al#1\recurselevel\c!width}\relax}}%
>    %\whitespace                 % gaat fout bij \framed
>    \getvalue{\??al#1\c!before}%
>    \leavevmode                 % gaat wel goed bij \framed, brrr
>    \setbox\scratchbox\vbox\bgroup\hbox\bgroup\doparagraphcell{#1}}
> 
> \def\dostopparagraphs#1%
>   {\egroup
>    \egroup
>    \iftrue
>      \hbox{\raise\strutheight\box\scratchbox}% new
>    \else
>      \box\scratchbox % old
>    \fi
>    \par
>    \getvalue{\??al#1\c!after}}%
> \f
> \def\dosetuptab[#1]%
>   {\getparameters[\??ta]
>      [\c!headstyle=\v!normal,
>       \c!headcolor=,
>       \c!style=\v!normal,
>       \c!color=,
>       \c!width=\v!broad,
>       \c!sample={\hskip4em},
>       \c!before=,
>       \c!after=,
>       #1]%
>    \definedescription
>      [tab]
>      [\c!headstyle=\@@taheadstyle,
>       \c!headcolor=\@@tacolor,
>       \c!sample=\@@tasample,
>       \c!width=\@@tawidth,
>       \c!before=\@@tabefore,
>       \c!after=\@@taafter]}
> 
> \def\setuptab
>   {\dosingleargument\dosetuptab}
> 
> \setuptab
>   [\c!location=\v!left]
> \f
> % The following macro's are derived from PPCHTEX and
> % therefore take some LaTeX font-switching into account.
> 
> \newif\ifloweredsubscripts
> 
> % Due to some upward incompatibality of LaTeX to LaTeX2.09
> % and/or LaTeX2e we had to force \@@chemieletter. Otherwise
> % some weird \nullfont error comes up.
> 
> \doifundefined{@@chemieletter}{\def\@@chemieletter{\rm}}
> 
> \def\beginlatexmathmodehack
>   {\ifmmode
>      \let\endlatexmathmodehack\relax
>    \else
>      \def\endlatexmathmodehack{$}$\@@chemieletter
>    \fi}
> 
> \def\setsubscripts
>   {\beginlatexmathmodehack
>    \def\dosetsubscript##1##2##3%
>      {\dimen0=##3\fontdimen5##2%
>       \setxvalue{@@\string##1\string##2}{\the##1##2\relax}%
>       ##1##2=\dimen0\relax}%
>    \def\dodosetsubscript##1##2%
>      {\dosetsubscript{##1}{\textfont2}{##2}%
>       \dosetsubscript{##1}{\scriptfont2}{##2}%
>       \dosetsubscript{##1}{\scriptscriptfont2}{##2}}%
>   %\dodosetsubscript{\fontdimen14}{?}%
>    \dodosetsubscript{\fontdimen16}{.7}%
>    \dodosetsubscript{\fontdimen17}{.7}%
>    \global\loweredsubscriptstrue
>    \endlatexmathmodehack}
> 
> \def\resetsubscripts
>   {\ifloweredsubscripts
>      \beginlatexmathmodehack
>      \def\doresetsubscript##1##2%
>        {\dimen0=\getvalue{@@\string##1\string##2}\relax
>         ##1##2=\dimen0}%
>      \def\dodoresetsubscript##1%
>        {\doresetsubscript{##1}{\textfont2}%
>         \doresetsubscript{##1}{\scriptfont2}%
>         \doresetsubscript{##1}{\scriptscriptfont2}}%
>     %\dodoresetsubscript{\fontdimen14}%
>      \dodoresetsubscript{\fontdimen16}%
>      \dodoresetsubscript{\fontdimen17}%
>      \global\loweredsubscriptsfalse
>      \endlatexmathmodehack
>    \fi}
> 
> \let\beginlatexmathmodehack = \relax
> \let\endlatexmathmodehack   = \relax
> 
> \def\chem#1#2#3%
>   {\bgroup
>    \setsubscripts
>    \mathematics{\hbox{#1}_{#2}^{#3}}%
>    \resetsubscripts
>    \egroup}
> 
> \unexpanded\def\celsius   #1{#1\mathematics{^\circ}C}
> \unexpanded\def\inch        {\mathematics{\prime\prime}} % was: \hbox{\rm\char125\relax}
> \unexpanded\def\fraction#1#2{\mathematics{#1\over#2}}
> 
> % very dutch
> 
> \unexpanded\def\graden      {\mathematics{^\circ}}
> 
> \def\bedragprefix {\euro\normalfixedspace}
> \def\bedragsuffix {}
> \def\bedragempty  {\euro}
> 
> \unexpanded\def\bedrag#1%
>   {\strut\hbox\bgroup
>    \let\normalfixedspace~%
>    \doifelsenothing{#1}
>      {\bedragempty}
>      {\bedragprefix\digits{#1}\bedragsuffix}%
>    \egroup}
> 
> % \definieeralineas[test][n=3]
> %
> % \stelalineasin[test][3][breedte=4cm,uitlijnen=links]
> %
> % \startopelkaar
> % \test hans \\ ton \\ \bedrag{1.000,--} \\
> % \test hans \\ ton \\ \bedrag{~.~~1,--} \\
> % \test hans \\ ton \\ \bedrag{~.~~1,~~} \\
> % \test hans \\ ton \\ \bedrag{~.100,--} \\
> % \test hans \\ ton \\ \subtot{1.000,--} \\
> % \test hans \\ ton \\ \bedrag{1.000,--} \\
> % \test hans \\ ton \\ \bedrag{1.000,--} \\
> % \test hans \\ ton \\ \totaal{1.000,--} \\
> % \test hans \\ ton \\ \bedrag{nihil,--} \\
> % \test hans \\ ton \\ \totaal{nihil,--} \\
> % \test hans \\ ton \\ \subtot{nihil,--} \\
> % \stopopelkaar
> 
> \def\periodswidth  {.5em}
> \def\periodsdefault{3}    % was 5, but now it's like \unknown
> 
> \unexpanded\def\periods
>   {\dosingleempty\doperiods}
> 
> \def\doperiods[#1]%
>   {\dontleavehmode
>    \begingroup
>    \scratchdimen\periodswidth
>    \hbox to \iffirstargument#1\else\periodsdefault\fi \scratchdimen
>      {\leaders\hbox to \scratchdimen{\hss.\hss}\hss}%
>    \endgroup}
> 
> \unexpanded\def\unknown
>   {\periods\relax} % relax prevents lookahead for []
> 
> % compatibility macros
> 
> \def\doorsnede
>   {\hbox{\rlap/$\circ$} }
> 
> \unexpanded\def\ongeveer
>   {\mathematics\pm}
> \f
> \chardef\boundarycharactermode\plusone
> 
> \def\midboundarycharacter#1#2%
>   {\ifcase\boundarycharactermode
>    \or
>      %\nobreak
>      \hskip\hspaceamount\currentlanguage{#2}%
>      \languageparameter#1%
>      %\nobreak
>       \hskip\hspaceamount\currentlanguage{#2}%
>    \or
>      \languageparameter#1%
>    \fi
>    \chardef\boundarycharactermode\plusone}
> 
> \def\leftboundarycharacter#1#2%
>   {\ifcase\boundarycharactermode
>    \or
>      \languageparameter#1%
>      \nobreak
>      \hskip\hspaceamount\currentlanguage{#2}%
>    \or
>      \languageparameter#1%
>    \fi
>    \chardef\boundarycharactermode\plusone}
> 
> \def\rightboundarycharacter#1#2%
>   {\ifcase\boundarycharactermode
>    \or
>      \prewordbreak %\nobreak
>      \hskip\hspaceamount\currentlanguage{#2}%
>      \languageparameter#1%
>    \or
>      \languageparameter#1%
>    \fi
>    \chardef\boundarycharactermode\plusone}
> \f
> % actually this is pretty old, but temporary moved here
> %
> % obsolete:
> 
> \def\setuphyphenmark
>   {\dodoubleargument\getparameters[\??kp]}
> 
> \setuphyphenmark
>   [\c!sign=\composedhyphen]
> 
> \installdiscretionaries || \@@kpsign
> 
> % will become:
> %
> % \installdiscretionaries || \composedhyphen
> 
> \def\composedhyphen
>   {\discretionary
>      {\hbox{\directsymbol\empty\c!leftcompoundhyphen}}
>      {\hbox{\directsymbol\empty\c!rightcompoundhyphen}}
>      {\hbox{\directsymbol\empty\c!compoundhyphen}}}
> 
> \definesymbol[\c!leftcompoundhyphen]  [\languageparameter\c!leftcompoundhyphen]
> \definesymbol[\c!rightcompoundhyphen] [\languageparameter\c!rightcompoundhyphen]
> \definesymbol[\c!compoundhyphen]      [\languageparameter\c!compoundhyphen]
> 
> \definehspace [sentence]      [\zeropoint]
> \definehspace [intersentence] [.250em]
> 
> \definesymbol
>   [\c!midsentence]
>   [\midboundarycharacter\c!midsentence{sentence}]
> 
> \definesymbol
>   [\c!leftsentence]
>   [\leftboundarycharacter\c!leftsentence{sentence}]
> 
> \definesymbol
>   [\c!rightsentence]
>   [\rightboundarycharacter\c!rightsentence{sentence}]
> 
> \definesymbol
>   [\c!leftsubsentence]
>   [\leftboundarycharacter\c!leftsubsentence{sentence}]
> 
> \definesymbol
>   [\c!rightsubsentence]
>   [\rightboundarycharacter\c!rightsubsentence{sentence}]
> 
> \newsignal \subsentencesignal
> \newcounter\subsentencelevel
> 
> \def\midsentence
>   {\symbol[\c!midsentence]}
> 
> \def\beginofsubsentence
>   {\ifdim\lastkern=\subsentencesignal
>      \unskip
>      \kern\hspaceamount\currentlanguage{intersentence}%
>    \fi
>    \doglobal\increment\subsentencelevel
>    \ifnum\subsentencelevel=\plusone
>      \leaveoutervmode
>    \fi
>    \symbol[\ifodd\subsentencelevel\c!leftsentence   \else
>                                   \c!leftsubsentence\fi]%
>    \ignorespaces}
> 
> \def\beginofsubsentencespacing
>   {\kern\subsentencesignal\ignorespaces}
> 
> \def\endofsubsentence
>   {\symbol[\ifodd\subsentencelevel\c!rightsentence   \else
>                                   \c!rightsubsentence\fi]%
>    \doglobal\decrement\subsentencelevel
>    \unskip
>    \kern\subsentencesignal}
> 
> \def\endofsubsentencespacing
>   {\ifdim\lastkern=\subsentencesignal
>      \unskip
>      \hskip\hspaceamount\currentlanguage{intersentence}%
>      \ignorespaces
>    \else
>      \unskip
>    \fi}
> 
> % test |<|test |<|test|>| test|>| test \par
> % test|<|test|<|test|>|test|>|test     \par
> % test |<||<|test|>||>| test           \par
> 
> \enableactivediscretionaries
> \f
> \definehspace [quotation]      [\zeropoint]
> \definehspace [interquotation] [.125em]
> 
> %definehspace [quote]  [\zeropoint]
> %definehspace [speech] [\zeropoint]
> 
> \definehspace [quote]  [\hspaceamount\currentlanguage{quotation}]
> \definehspace [speech] [\hspaceamount\currentlanguage{quotation}]
> 
> \definesymbol
>   [\c!leftquotation]
>   [\leftboundarycharacter\c!leftquotation{quotation}]
> 
> \definesymbol
>   [\c!rightquotation]
>   [\rightboundarycharacter\c!rightquotation{quotation}]
> 
> \definesymbol
>   [\c!leftquote]
>   [\leftboundarycharacter\c!leftquote{quote}]
> 
> \definesymbol
>   [\c!rightquote]
>   [\rightboundarycharacter\c!rightquote{quote}]
> 
> \definesymbol
>   [\c!leftspeech]
>   [\leftboundarycharacter\c!leftspeech{speech}]
> 
> \definesymbol
>   [\c!rightspeech]
>   [\rightboundarycharacter\c!rightspeech{speech}]
> 
> \definesymbol
>   [\c!middlespeech]
>   [\leftboundarycharacter\c!middlespeech{speech}]
> \f
> % has been replaced by delimitedtext
> %
> % \def\leftquotationmark
> %   {\setbox\scratchbox\hbox{\symbol[\c!leftquotation]}%
> %    \doif\@@cilocation\v!margin{\hskip-\wd\scratchbox}%
> %    \box\scratchbox}
> %
> % \def\rightquotationmark
> %   {\hsmash{\symbol[\c!rightquotation]}}
> %
> % \newsignal\quotationsignal
> %
> % \def\setupquote
> %   {\dodoubleargument\getparameters[\??ci]}
> %
> % \def\startquotation
> %   {\bgroup\dosingleempty\dostartquotation}
> %
> % \def\dostartquotation[#1]%
> %   {\@@cibefore
> %    \doifelsenothing{#1}
> %      {\let\dostopquotation\relax}
> %      {\startnarrower[#1]%
> %       \let\dostopquotation\stopnarrower}%
> %    \dostartattributes\??ci\c!style\c!color\empty
> %    \leftquotationmark
> %    \ignorespaces}
> %
> % \def\stopquotation
> %   {\removeunwantedspaces
> %    \removelastskip
> %    \rightquotationmark
> %    \dostopattributes
> %    \dostopquotation
> %    \@@ciafter
> %    \egroup}
> %
> % \def\dohandlequotation#1#2%
> %   {\ifdim\lastskip=\quotationsignal
> %      \unskip\hskip\hspaceamount\currentlanguage{interquotation}% hardcoded
> %    \else
> %      #2%
> %    \fi
> %    \ifhmode % else funny pagebeaks
> %      \penalty\!!tenthousand\hskip\zeropoint      % == \prewordbreak
> %    \fi
> %    \strut % new, needed below
> %    \symbol[#1]%
> %    \penalty\!!tenthousand\hskip\quotationsignal} % +- \prewordbreak
> %
> % \def\handlequotation#1%
> %   {\dohandlequotation{#1}\relax}
> %
> % \unexpanded\def\quotation
> %   {\groupedcommand
> %      {\dohandlequotation\c!leftquotation \relax}
> %      {\dohandlequotation\c!rightquotation\removelastskip}}
> %
> % \unexpanded\def\quote
> %   {\doifelse\@@cistyle\v!normal\doquotedcite\doattributedcite}
> %
> % \def\doquotedcite
> %   {\groupedcommand
> %      {\dohandlequotation\c!leftquote \relax}
> %      {\dohandlequotation\c!rightquote\removelastskip}}
> %
> % \def\doattributedcite
> %   {\groupedcommand
> %      {\dostartattributes\??ci\c!style\c!color}
> %      {\dostopattributes}}
> 
> %D The previous one fails in \placefloat[left]{}{}, so instead
> %D we use the next alternative, where the first one is handled
> %D outside group. Watch the strut.
> 
> % has been replaced by delimitedtext
> %
> % \unexpanded\def\quotation
> %   {\dohandlequotation\c!leftquotation\relax
> %    \groupedcommand \donothing
> %      {\dohandlequotation\c!rightquotation\removelastskip}}
> %
> % \def\doquotedcite
> %   {\dohandlequotation\c!leftquote\relax
> %    \groupedcommand \donothing
> %      {\dohandlequotation\c!rightquote\removelastskip}}
> %
> % \setupquote
> %   [\c!location=\v!margin,
> %    \c!style=\v!normal,
> %    \c!color=,
> %    \c!before=\startnarrower,
> %    \c!after=\stopnarrower]
> 
> \appendtoks\def\quotation#1{"#1"}\to\simplifiedcommands
> \appendtoks\def\quote    #1{'#1'}\to\simplifiedcommands
> 
> %D The next features was so desperately needed by Giuseppe
> %D Bilotta that he made a module for it. Since this is a
> %D typical example of core functionality, I decided to extend
> %D the low level quotation macros in such a way that a speech
> %D feature could be build on top of it. The speech opening and
> %D closing symbols are defined per language. Italian is an
> %D example of a language that has them set.
> 
> % has been be replaced by delimitedtext
> %
> % \newcounter\speechlevel \newconditional\insidespeech
> %
> % \def\startspeech
> %   {\doglobal\increment\speechlevel\relax
> %    \dohandlequotation\c!leftspeech\relax
> %    \global\settrue\insidespeech
> %    \ignorespaces}
> %
> % \def\stopspeech
> %   {\dohandlequotation\c!rightspeech\removelastskip
> %    \doglobal\decrement\speechlevel\relax
> %    \ifcase\speechlevel\relax \global\setfalse\insidespeech \fi}
> %
> % \def\dohandlespeech % indirect since called in everypar
> %   {\relax % still needed?
> %    \ifcase\speechlevel\or\dodohandlespeech\fi}
> %
> % \def\dodohandlespeech
> %   {\ifconditional\insidespeech
> %      \dohandlequotation\c!middlespeech\relax
> %    \else
> %      \global\settrue\insidespeech
> %    \fi}
> %
> % \unexpanded\def\speech
> %   {\doglobal\increment\speechlevel\relax
> %    \dohandlequotation\c!leftspeech\relax
> %    \groupedcommand \ignorespaces
> %      {\dohandlequotation\c!rightspeech\removelastskip
> %       \doglobal\decrement\speechlevel\relax}}
> 
> % \appendtoks \dohandlespeech \to \everypar
> \f
> % this will replace the quotation and speed definitions
> 
> \newsignal\delimitedtextsignal
> 
> \def\delimitedtextparameter#1%
>   {\csname\??ci
>      \ifundefined{\??ci\currentdelimitedtext#1}\else\currentdelimitedtext\fi
>    #1\endcsname}
> 
> \def\definedelimitedtext
>   {\dodoubleempty\dodefinedelimitedtext}
> 
> \def\dodefinedelimitedtext[#1][#2]%
>   {\doifassignmentelse{#2}
>      {\getparameters
>         [\??ci#1]
>         [\c!location=\v!margin, % \v!text \v!paragraph
>          \c!spacebefore=,
>          \c!spaceafter=\delimitedtextparameter\c!spacebefore,
>          \c!style=\v!normal,
>          \c!color=,
>          \c!leftmargin=\zeropoint,
>          \c!rightmargin=\delimitedtextparameter\c!leftmargin,
>          \c!indentnext=\v!yes,
>          \c!before=,
>          \c!after=,
>          \c!left=,
>          \c!right=,
>          \c!level=0,
>          \c!repeat=\v!no,
>          \c!method=,
>         #2]}%
>      {\doifdefined{#2}
>         {\copyparameters[\??ci#1][\??ci#2]
>            [\c!location,\c!spacebefore,\c!spaceafter,\c!style,\c!color,
>             \c!leftmargin,\c!rightmargin,\c!indentnext,
>             \c!before,\c!after,\c!left,\c!right]}}%
>    \doifsomething{#1}
>      {\unexpanded\setvalue{#1}{\delimitedtext[#1]}%
>       \setvalue{\e!start#1}{\startdelimitedtext[#1]}%
>       \setvalue{\e!stop#1}{\stopdelimitedtext}}}
> 
> \def\setupdelimitedtext
>   {\dodoubleargument\dosetupdelimitedtext}
> 
> \def\dosetupdelimitedtext[#1][#2]%
>   {\ifsecondargument
>      \getparameters[\??ci#1][#2]%
>    \else
>      \getparameters[\??ci][#1]%
>    \fi}
> 
> \def\dorepeatdelimitedtext
>   {\relax\ifcase\delimitedtextparameter\c!level\else
>      \dohandledelimitedtext\c!middle
>    \fi}
> 
> \let\dohandlerepeatdelimitedtext\relax
> 
> \def\startdelimitedtext[#1]%
>   {\bgroup
>    \def\currentdelimitedtext{#1}%
>    \doifelse{\delimitedtextparameter\c!method}\s!font
>      {\doglobal\decrementvalue{\??ci\currentdelimitedtext\c!level}%
>       \def\dostopdelimitedtext{\removeunwantedspaces\ignoredelimitedtext\c!right}%
>       \ignoredelimitedtext\c!left\ignorespaces}
>      {\doifelse{\delimitedtextparameter\c!repeat}\v!yes
>         {\let\dohandlerepeatdelimitedtext\dorepeatdelimitedtext}%
>         {\let\dohandlerepeatdelimitedtext\relax}%
>       \doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
>         {\dosingleempty\dostartdelimitedtextpar}\dostartdelimitedtexttxt}}
> 
> \def\dostartdelimitedtextpar[#1]%
>   {\let\dostopdelimitedtext\dostopdelimitedtextpar
>    \doifsomething{\delimitedtextparameter\c!spacebefore}
>      {\blank[\delimitedtextparameter\c!spacebefore]}%
>    \delimitedtextparameter\c!before
>    % nicer:
>    % \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
>    % \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
>    % backward compatible:
>    \doifelsenothing{#1}
>      {\doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
>       \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
>       \let\dodostopdelimitedtextpar\endgraf}
>      {\startnarrower[#1]\let\dodostopdelimitedtextpar\stopnarrower}%
>    % so far
>    \dochecknextindentation{\??ci\currentdelimitedtext}%
>    \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
>    \leftdelimitedtextmark
>    \doglobal\incrementvalue{\??ci\currentdelimitedtext\c!level}%
>    \ignorespaces}
> 
> \def\dostopdelimitedtextpar
>   {\removeunwantedspaces
>    \removelastskip
>    \rightdelimitedtextmark
>    \dostopattributes
>    \dodostopdelimitedtextpar
>    \delimitedtextparameter\c!after
>    \doifsomething{\delimitedtextparameter\c!spaceafter}
>      {\blank[\delimitedtextparameter\c!spaceafter]}}
> 
> \def\dostartdelimitedtexttxt
>   {\let\dostopdelimitedtext\dostopdelimitedtexttxt
>    \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
>    \dohandledelimitedtext\c!left
>    \ignorespaces}
> 
> \def\dostopdelimitedtexttxt
>   {\removeunwantedspaces
>    \dohandledelimitedtext\c!right
>    \dostopattributes}
> 
> \def\stopdelimitedtext
>   {\dostopdelimitedtext
>    \doglobal\decrementvalue{\??ci\currentdelimitedtext\c!level}%
>    \egroup}
> 
> \def\delimitedtext[#1]%
>   {\pushmacro\currentdelimitedtext
>    \def\currentdelimitedtext{#1}%
>    \doifelse{\delimitedtextparameter\c!method}\s!font
>      {\dofontdrivendelimited}
>      {\doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
>       \dodelimitedtextpar\dodelimitedtexttxt}}
> 
> % shortcuts
> 
> \def\startdelimited{\startdelimitedtext}
> \def\stopdelimited {\stopdelimitedtext}  % no let, dynamically assigned
> \def\delimited     {\delimitedtext}
> 
> \def\leftdelimitedtextmark
>   {\dontleavehmode
>    \setbox\scratchbox\hbox{\delimitedtextparameter\c!left}%
>    \doif{\delimitedtextparameter\c!location}\v!margin{\hskip-\wd\scratchbox}%
>    \box\scratchbox}
> 
> \def\rightdelimitedtextmark
>   {\hsmash{\delimitedtextparameter\c!right}}
> 
> \def\dohandledelimitedtext#1#2%
>   {\begingroup
>    \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
>    \ifdim\wd\scratchbox>\zeropoint
>      \ifdim\lastskip=\delimitedtextsignal
>        \unskip\hskip\hspaceamount\currentlanguage{interquotation}%
>      \else
>        #2%
>      \fi
>      \ifhmode % else funny pagebeaks
>        \penalty\!!tenthousand\hskip\zeropoint % == \prewordbreak
>      \fi
>      \strut % new, needed below
>      \delimitedtextparameter#1% unhbox\scratchbox
>      \penalty\!!tenthousand\hskip\delimitedtextsignal % +- \prewordbreak
>    \fi
>    \endgroup}
> 
> \def\ignoredelimitedtext#1%
>   {\delimitedtextparameter#1}
> 
> \def\handledelimitedtext#1%
>   {\dohandledelimitedtext{#1}\relax}
> 
> \unexpanded\def\dodelimitedtextpar
>   {\dohandledelimitedtext\c!left\relax
>    \groupedcommand
>      \donothing
>      {\dohandledelimitedtext\c!right\removelastskip}}
> 
> \unexpanded\def\dodelimitedtexttxt
>   {\doifelse{\delimitedtextparameter\c!style}\v!normal
>      \doquoteddelimited\doattributeddelimited}
> 
> \def\doquoteddelimited
>   {\dohandledelimitedtext\c!left\relax
>    \groupedcommand
>      \donothing
>      {\dohandledelimitedtext\c!right
>       \removelastskip
>       \popmacro\currentdelimitedtext}}
> 
> \def\doattributeddelimited
>   {\groupedcommand
>      {\dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color}
>      {\dostopattributes
>       \popmacro\currentdelimitedtext}}
> 
> % \def\dofontdrivendelimited#1% thanks to Taco for sorting out the kerning interference
> %   {\languageparameter{\c!left\currentdelimitedtext}%
> %    #1% sorry, no verbatim support
> %    \languageparameter{\c!right\currentdelimitedtext}%
> %    \popmacro\currentdelimitedtext}
> 
> \def\dofontdrivendelimited
>   {\simplegroupedcommand
>      {\languageparameter{\c!left\currentdelimitedtext}}
>      {\languageparameter{\c!right\currentdelimitedtext}%
>       \popmacro\currentdelimitedtext}}
> \f
> \definedelimitedtext
>   [\v!quotation]
>   [\c!left={\symbol[\c!leftquotation]},
>    \c!right={\symbol[\c!rightquotation]},
>    \c!leftmargin=\v!standard]
> 
> \definedelimitedtext
>   [\v!quote][\v!quotation]
> 
> \setupdelimitedtext
>   [\v!quote]
>   [\c!location=\v!text,
>    \c!left={\symbol[\c!leftquote]},
>    \c!right={\symbol[\c!rightquote]}]
> 
> \definedelimitedtext
>   [\v!speech][\v!quotation]
> 
> \setupdelimitedtext
>   [\v!speech]
>   [\c!repeat=\v!yes,
>    \c!left={\symbol[\c!leftspeech]},
>    \c!middle={\symbol[\c!middlespeech]},
>    \c!right={\symbol[\c!rightspeech]}]
> 
> % how do we call an tight quote
> %
> % \definedelimitedtext
> %    [\v!quotation][\v!quotation]
> %
> % \setupdelimitedtext
> %   [\v!quotation]
> %   [\c!indentnext=\v!no,
> %    \c!spacebefore=\v!nowhite]
> 
> \def\setupquotation{\setupdelimitedtext[\v!quotation]}
> \def\setupquote    {\setupdelimitedtext[\v!quote]}
> \f
> % seldom used, move from kernel to run time module
> 
> \def\basegrid
>   {\dosingleempty\dobasegrid}
> 
> \def\dobasegrid[#1]%
>   {\begingroup
>    \getparameters[\??rt]
>      [\c!x=0,\c!y=0,
>       \c!nx=10,\c!ny=10,
>       \c!dx=.5,\c!dy=.5,
>       \c!xstep=0,\c!ystep=0,
>       \c!unit=\s!cm,
>       \c!scale=1,
>       \c!factor=1,
>       \c!offset=\v!yes,
>       \c!location=\v!left,
>       #1]%
>    \startpositioning
>      \dimen0=\@@rtdx\@@rtunit\relax
>      \dimen0=\@@rtscale\dimen0\relax
>      \dimen0=\@@rtfactor\dimen0\relax
>      \multiply\dimen0 \@@rtnx\relax
>      \dimen2=\@@rtdy\@@rtunit\relax
>      \dimen2=\@@rtscale\dimen2\relax
>      \dimen2=\@@rtfactor\dimen2\relax
>      \multiply\dimen2 \@@rtny\relax
>      \def\horline
>        {\vbox
>           {\hrule
>              \!!width \dimen0
>              \!!height \linewidth
>              \!!depth \!!zeropoint}}%
>      \def\verline%
>        {\vrule
>           \!!width \linewidth
>           \!!height \dimen2
>           \!!depth \!!zeropoint}%
>      \doglobal\newcounter\@@gridc
>      \doglobal\newcounter\@@gridd
>      \doglobal\newcounter\@@gride
>      \def\setlegend##1##2##3%
>        {\gdef\@@gridc{0}%
>         \dimen0=2em\relax
>         \dimen2=##2\@@rtunit\relax
>         \dimen2=\@@rtscale\dimen2\relax
>         \dimen2=\@@rtfactor\dimen2\relax
>         \divide\dimen0 \dimen2\relax
>         \xdef\@@gride{\number\dimen0}%
>         \ifnum\@@gride>50
>           \gdef\@@gride{100}%
>         \else\ifnum\@@gride>10
>           \gdef\@@gride{50}%
>         \else\ifnum\@@gride>5
>           \gdef\@@gride{10}%
>         \else\ifnum\@@gride>1
>           \gdef\@@gride{5}%
>         \else
>           \gdef\@@gride{1}%
>         \fi\fi\fi\fi
>         \gdef\@@gridd{0}%
>         \def\legend
>           {\ifnum\@@gridd=\zerocount
>              \vbox
>                {\increment(\@@gridc,##1)%
>                 \hbox to 2em{\hss\@@gridc\hss}}%
>              \global\let\@@gridd=\@@gride
>            \fi
>              \doglobal\decrement\@@gridd
>              \doglobal\increment(\@@gridc,##1)}}%
>      \def\draw##1##2##3##4##5##6##7##8##9%
>        {\setuppositioning
>           [\c!state=##8,
>            \c!xstep=\v!absolute,
>            \c!ystep=\v!absolute,
>            \c!unit=\@@rtunit,
>            \c!scale=\@@rtscale,
>            \c!factor=\@@rtfactor,
>            \c!offset=\@@rtoffset,
>            \c!xoffset=##6,
>            \c!yoffset=##7]%
>         \doifelse{##9}\v!middle
>           {\scratchdimen##3pt\scratchdimen.5\scratchdimen
>            \edef\@@psxx{\withoutpt\the\scratchdimen}%
>            \scratchdimen##4pt\scratchdimen.5\scratchdimen
>            \edef\@@psyy{\withoutpt\the\scratchdimen}%
>            \scratchcounter##2\advance\scratchcounter -1
>            \edef\@@pszz{\the\scratchcounter}}
>           {\edef\@@psxx{0}\edef\@@psyy{0}\edef\@@pszz{##2}}%
>         \position(\@@psxx,\@@psyy){##1}%
>         \setuppositioning
>           [\c!state=##8,
>            \c!xstep=\v!relative,
>            \c!ystep=\v!relative,
>            \c!scale=\@@rtscale,
>            \c!factor=\@@rtfactor,
>            \c!offset=\@@rtoffset,
>            \c!unit=\@@rtunit]%
>         \dorecurse\@@pszz{\position(##3,##4){##5}}}%
>      \draw
>        \verline\@@rtnx\@@rtdx0\verline\!!zeropoint\!!zeropoint\v!start\empty
>      \draw
>        \horline\@@rtny0\@@rtdy\horline\!!zeropoint\!!zeropoint\v!start\empty
>      \tfx
>      \doifnot\@@rtxstep{0}
>        {\setlegend\@@rtxstep\@@rtdx\@@rtx
>         \draw\legend\@@rtnx\@@rtdx0\legend{-1em}{-1.5em}\v!overlay\@@rtlocation}%
>      \doifnot\@@rtystep{0}
>        {\setlegend\@@rtystep\@@rtdy\@@rty
>         \draw\legend\@@rtny0\@@rtdy\legend{-2em}{-.75ex}\v!overlay\@@rtlocation}%
>   \stoppositioning
>   \endgroup}
> 
> \let\grid\basegrid
> \f
> % Dit wordt:
> %
> %   \doorverwijzen[naam][instellingen] enz.
> %
> % waarbij <naam> bijvoorbeeld publicatie is. Dit levert:
> %
> %   \start<naam>
> %   \stop<naam>
> %
> %   \beginvan<naam>
> %   \eindvan<naam>
> %
> %   \publicatie
> %
> %   \volledigelijstmetpublicaties
> %
> % eigenlijk kan ook door... zo worden uitgebreid!
> 
> % old, will become obsolete or module, replace by bib module
> 
> \defineenumeration
>   [@publicatie]
>   [\c!location=\v!left,
>    \c!width=\@@pbwidth,\c!hang=,\c!sample=,
>    \c!before=\@@pbbefore,\c!after=\@@pbafter,\c!inbetween=,
>    \c!headstyle=\@@pbheadstyle,\c!style=,
>    \c!headcolor=\@@pbheadcolor,\c!color=,
>    \c!way=\@@pbway,\c!blockway=\@@pbblockway,
>    \c!text=,\c!left=\@@pbleft,\c!right=\@@pbright]
> 
> \def\dosetuppublications[#1]%
>   {\getparameters[\??pb][#1]}
> 
> \def\setuppublications%
>   {\dosingleargument\dosetuppublications}
> 
> \def\apa@publicatie
>   {\doifsomething\@@pb@naam    {\@@pb@naam,\space}%
>    \doifsomething\@@pb@titel   {{\sl\@@pb@titel}.\space}%
>    \doifsomething\@@pb@jaar    {(\@@pb@jaar).\space}%
>    \doifsomething\@@pb@plaats  {\@@pb@plaats\doifelsenothing\@@pb@uitgever{.}{:\space}}%
>    \doifsomething\@@pb@uitgever{\@@pb@uitgever.}}
> 
> \def\normaal@publicatie
>   {\@@pb@naam, \@@pb@titel, \@@pb@jaar, \@@pb@pagina, \@@pb@plaats, \@@pb@uitgever.}
> 
> \def\complexstartpublicatie[#1]#2\stoppublicatie
>   {\bgroup
>    \def\dosetpublicatie
>      {\processcommalist
>         [naam,titel,jaar,plaats,pagina,uitgever]
>         \setpublicatie
>       \ignorespaces}%
>    \def\setpublicatie##1%
>       {\letvalue{\??pb @##1}\empty
>        \setvalue{##1}####1{\setvalue{\??pb @##1}{####1}\ignorespaces}}%
>    \def\getpublicatie%
>      {\doifsomething\@@pbalternative{\getvalue{\@@pbalternative @publicatie}}}%
>    \doifelse\@@pbnumbering\v!yes
>       {\@publicatie[#1]\dosetpublicatie#2\getpublicatie\par}%
>       {\@@pbbefore
>        \dosetpublicatie\ignorespaces#2\getpublicatie
>        \@@pbafter}%
>    \egroup}
> 
> \definecomplexorsimpleempty\startpublicatie
> 
> \def\publication#1[#2]%
>   {\@@pbleft\in{#1}[#2]\@@pbright}
> 
> \setuppublications
>   [\c!numbering=\v!yes,
>    \c!alternative=\c!apa,
>    \c!width=2em,
>    \c!hang=,
>    \c!sample=,
>    \c!before=,
>    \c!after=,
>    \c!inbetween=,
>    \c!headstyle=,
>    \c!headcolor=,
>    \c!style=,
>    \c!color=,
>    \c!blockway=\v!by\v!text,
>    \c!way=\v!by\v!text,
>    \c!text=,
>    \c!left={[},
>    \c!right={]}]
> \f
> % only used at pragma, move from kernel to run time module
> 
> \def\referraldate
>   {\currentdate[\v!referral]}
> 
> \def\doreferral[#1]%
>    {\noheaderandfooterlines
>     \bgroup
>     \getparameters
>       [\??km]
>       [\c!bet=\unknown,\c!dat=\unknown,\c!ken=\unknown,
>        \c!from=,\c!to=,\c!ref=,#1]%
>     % moet anders, hoort niet in 01b
>     \assigntranslation[\s!nl=referentie,\s!en=reference,\s!de=Referenz,\s!sp=referencia]\to\@@@kmref
>     \assigntranslation[\s!nl=van,\s!en=from,\s!de=Von,\s!sp=de]\to\@@@kmvan
>     \assigntranslation[\s!nl=aan,\s!en=to,\s!de=An,\s!sp=a]\to\@@@kmaan
>     \assigntranslation[\s!nl=betreft,\s!en=concerns,\s!de=Betreff,\s!sp=]\to\@@@kmbet
>     \assigntranslation[\s!nl=datum,\s!en=date,\s!de=Datum,\s!sp=fecha]\to\@@@kmdat
>     \assigntranslation[\s!nl=kenmerk,\s!en=mark,\s!de=Kennzeichen,\s!sp=]\to\@@@kmken
>     %
>     \definetabulate[\s!dummy][|l|p|]
>     \startdummy
>       \NC\@@@kmbet\EQ\@@kmbet\NC\NR
>       \NC\@@@kmdat\EQ\@@kmdat\NC\NR
>       \NC\@@@kmken\EQ\expanded{\smallcapped{\@@kmken}}\NC\NR
>       \doifsomething{\@@kmfrom\@@kmto}{\NC\NC\NC\NR}%
>       \doifsomething \@@kmfrom         {\NC\@@@kmvan\EQ\@@kmfrom\NC\NR}%
>       \doifsomething \@@kmto         {\NC\@@@kmaan\EQ\@@kmto\NC\NR}%
>       \doifsomething \@@kmref         {\NC\NC\NC\NR\NC\@@@kmref\EQ\@@kmref\NC\NR}%
>     \stopdummy
>     \egroup}
> 
> \def\referral
>   {\dosingleargument\doreferral}
> \f
> % FUZZY OLD STUFF: will be removed when not used in some manual;
> % rows instead of columns, i'd forgotten that this code exist
> %
> % \definesystemvariable{ri}
> %
> % \def\setuprows
> %   {\dodoubleargument\getparameters[\??ri]}
> %
> % \definecomplexorsimpleempty\startrows
> %
> % \def\complexstartrows[#1]%
> %   {\bgroup
> %    \setuprows[#1]%
> %    \let\do@@ribottom\relax
> %    \def\row
> %      {\do@@ribottom
> %       \egroup
> %       \dimen0\vsize
> %       \divide\dimen0 \@@rin
> %       \advance\dimen0 -\lineskip
> %       \vbox to \dimen0
> %         \bgroup
> %         \@@ritop
> %         \let\do@@ribottom\@@ribottom
> %         \ignorespaces}%
> %    \bgroup
> %    \row}
> %
> % \def\stoprows
> %   {\do@@ribottom
> %    \egroup
> %    \egroup}
> %
> % \setuprows
> %   [\c!n=2,
> %    \c!top=,
> %    \c!bottom=\vfill]
> \f
> % THIS WAS MAIN-003.TEX
> 
> \startmessages  dutch  library: systems
>      41: externe file -- in groep -- bestaat niet
> \stopmessages
> 
> \startmessages  english  library: systems
>      41: external file -- in group -- does not exist
> \stopmessages
> 
> \startmessages  german  library: systems
>      41: Externe Datei -- in Gruppe -- existiert nicht
> \stopmessages
> 
> \startmessages  czech  library: systems
>      41: externi soubor -- ve skupine -- neexistuje
> \stopmessages
> 
> \startmessages  italian  library: systems
>      41: il file esterno -- del gruppo -- non esiste
> \stopmessages
> 
> \startmessages  norwegian  library: systems
>      41: ekstern fil -- i gruppe -- eksisterer ikke
> \stopmessages
> 
> \startmessages  romanian  library: systems
>      41: fisierul extern -- din grupul -- nu exista
> \stopmessages
> 
> \startmessages  french  library: systems
>      41: le fichier externe -- du groupe -- n'existe pas
> \stopmessages
> \f
> \definetabulate
>   [\v!legend]
>   [|emj1|i1|mR|]
> 
> \setuptabulate
>   [\v!legend]
>   [\c!unit=.75em,\c!inner=\setquicktabulate\leg,EQ={=}]
> 
> \definetabulate
>   [\v!legend][\v!two]
>   [|emj1|emk1|i1|mR|]
> 
> \definetabulate
>   [\v!fact]
>   [|R|ecmj1|i1mR|]
> 
> \setuptabulate
>   [\v!fact]
>   [\c!unit=.75em,\c!inner=\setquicktabulate\fact,EQ={=}]
> 
> \unexpanded\def\xbox
>   {\bgroup\aftergroup\egroup\hbox\bgroup\tx\let\next=}
> 
> \unexpanded\def\xxbox
>   {\bgroup\aftergroup\egroup\hbox\bgroup\txx\let\next=}
> 
> % \def\mrm#1%
> %   {$\rm#1$}
> \f
> %D \macros
> %D   {definepairedbox, setuppairedbox, placepairedbox}
> %D
> %D Paired boxes, formally called legends, but from now on a
> %D legend is just an instance, are primarily meant for
> %D typesetting some text alongside an illustration. Although
> %D there is quite some variation possible, the functionality is
> %D kept simple, if only because in most cases such pairs are
> %D typeset sober.
> %D
> %D The location specification accepts a pair, where the first
> %D keyword specifies the arrangement, and the second one the
> %D alignment. The first key of the location pair is one of
> %D \type {left}, \type {right}, \type {top} or \type {bottom},
> %D while the second key can also be \type {middle}.
> %D
> %D The first box is just collected in an horizontal box, but
> %D the second one is a vertical box that gets passed the
> %D bodyfont and alignment settings.
> 
> %D Today we would implement this using layers .... but for the
> %D moment we keep it this way.
> 
> %  \startbuffer[test]
> %  \test left   \test left,top    \test left,bottom  \test left,middle
> %  \test right  \test right,top   \test right,bottom \test right,middle
> %  \test top    \test top,left    \test top,right    \test top,middle
> %  \test bottom \test bottom,left \test bottom,right \test bottom,middle
> %  \stopbuffer
> %
> %  \def\showtest#1%
> %    {\pagina
> %     \typebuffer[demo]
> %     \def\test##1
> %       {\startlinecorrection[blank]
> %        \getbuffer[demo]%
> %        \ruledhbox\placelegend
> %          [bodyfont=6pt,location={##1}]
> %          {\framed[width=.25\textwidth]{\tttf##1}}
> %          {#1}
> %        \stoplinecorrection}
> %     \getbuffer[test]}
> %
> %  \startbuffer[demo]
> %  \setuplegend
> %    [width=\hsize,maxwidth=\makeupwidth,
> %     height=\vsize,maxheight=\makeupheight]
> %  \stopbuffer
> %
> %  \showtest{These examples demonstrate the default settings.}
> %
> %  \startbuffer[demo]
> %  \setuplegend
> %    [width=\textwidth,
> %     maxwidth=\textwidth]
> %  \stopbuffer
> %
> %  \showtest{\input tufte }
> %
> %  \startbuffer[demo]
> %  \setuplegend
> %    [width=.65\textwidth]
> %  \stopbuffer
> %
> %  \showtest{\input knuth }
> %
> %  \startbuffer[demo]
> %  \setuplegend
> %    [height=2cm]
> %  \stopbuffer
> %
> %  \showtest{These examples demonstrate some other settings.}
> %
> %  \startbuffer[demo]
> %  \setuplegend
> %    [width=.65\textwidth,
> %     height=2cm]
> %  \stopbuffer
> %
> %  \showtest{These examples demonstrate some other settings.}
> %
> %  \startbuffer[demo]
> %  \setuplegend
> %    [n=2,align=right,width=.5\textwidth]
> %  \stopbuffer
> %
> %  \showtest{\input zapf }
> 
> %D \macros
> %D   {setuplegend, placelegend}
> %D
> %D It makes sense to typeset a legend to a figure in \TEX\
> %D and not in a drawing package. The macro \type {\placelegend}
> %D combines a figure (or something else) and its legend. This
> %D command is just a paired box.
> %D
> %D The legend is placed according to \type {location}, being
> %D \type {bottom} or \type {right}. The macro macro is used as
> %D follows.
> %D
> %D \starttyping
> %D \placefigure
> %D   {whow}
> %D   {\placelegend
> %D      {\externalfigure[cow]}
> %D      {\starttabulation
> %D       \NC 1 \NC head \NC \NR
> %D       \NC 2 \NC legs \NC \NR
> %D       \NC 3 \NC tail \NC \NR
> %D       \stoptabulation}}
> %D
> %D \placefigure
> %D   {whow}
> %D   {\placelegend
> %D      {\externalfigure[cow]}
> %D      {\starttabulation[|l|l|l|l|]
> %D       \NC 1 \NC head \NC 3 \NC tail \NC \NR
> %D       \NC 2 \NC legs \NC   \NC      \NC \NR
> %D       \stoptabulation}}
> %D
> %D \placefigure
> %D   {whow}
> %D   {\placelegend[n=2]
> %D      {\externalfigure[cow]}
> %D      {\starttabulation
> %D       \NC 1 \NC head \NC \NR
> %D       \NC 2 \NC legs \NC \NR
> %D       \NC 3 \NC tail \NC \NR
> %D       \stoptabulation}}
> %D
> %D \placefigure
> %D   {whow}
> %D   {\placelegend[n=2]
> %D      {\externalfigure[cow]}
> %D      {head \par legs \par tail}}
> %D
> %D \placefigure
> %D   {whow}
> %D   {\placelegend[n=2]
> %D      {\externalfigure[cow]}
> %D      {\startitemize[packed]
> %D       \item head \item legs \item  tail \item belly \item horns
> %D       \stopitemize}}
> %D
> %D \placefigure
> %D   {whow}
> %D   {\placelegend[n=2,width=.8\hsize]
> %D      {\externalfigure[cow]}
> %D      {\startitemize[packed]
> %D       \item head \item legs \item  tail \item belly \item horns
> %D       \stopitemize}}
> %D \stoptyping
> 
> \newbox\firstpairedbox
> \newbox\secondpairedbox
> 
> \def\definepairedbox
>   {\dodoubleempty\dodefinepairedbox}
> 
> \def\dodefinepairedbox[#1][#2]%
>   {\getparameters
>      [\??ld#1]
>      [\c!n=1,
>       \c!distance=\bodyfontsize,
>       \c!before=,
>       \c!after=,
>       \c!color=,
>       \c!style=,
>       \c!inbetween={\blank[\v!medium]},
>       \c!width=\hsize,
>       \c!height=\vsize,
>       \c!maxwidth=\textwidth,   % \makeupwidth,
>       \c!maxheight=\textheight, % \makeupheight,
>       \c!bodyfont=,
>       \c!align=,
>       \c!location=\v!bottom,
>       #2]%
>    \setvalue{\e!setup#1\e!endsetup}{\setuppairedbox[#1]}%
>    \setvalue{\e!place#1}{\placepairedbox[#1]}}
> 
> \def\setuppairedbox
>   {\dodoubleempty\dosetuppairedbox}
> 
> \def\dosetuppairedbox[#1]%
>   {\getparameters[\??ld#1]}
> 
> \def\placepairedbox
>   {\bgroup\dodoubleempty\doplacepairedbox}
> 
> \def\doplacepairedbox[#1][#2]% watch the hsize/vsize tricks
>   {\setuppairedbox[#1][#2]%     % and don't change them
>    \copyparameters % brrr
>      [\??ld][\??ld#1]
>      [\c!n,\c!distance,\c!inbetween,\c!before,\c!after,
>       \c!width,\c!height,\c!maxwidth,\c!maxheight,
>       \c!color,\c!style,\c!bodyfont,\c!align,\c!location]%
>    \@@ldbefore\bgroup
>    \global\setsystemmode{pairedbox}%
>    \beforefirstpairedbox
>    \dowithnextbox
>      {\betweenbothpairedboxes
>       \dowithnextbox
>         {\afterbothpairedboxes
>          \egroup\@@ldafter
>          \egroup}
>       \vbox\bgroup
>         \insidesecondpairedbox
>         \let\next=}
>    \hbox}
> 
> \def\beforefirstpairedbox
>   {\chardef\pairedlocationa1 % left
>    \chardef\pairedlocationb4 % middle
>    \getfromcommacommand[\@@ldlocation][1]%
>    \processaction
>      [\commalistelement]
>      [  \v!left=>\chardef\pairedlocationa0,
>        \v!right=>\chardef\pairedlocationa1,
>          \v!top=>\chardef\pairedlocationa2,
>       \v!bottom=>\chardef\pairedlocationa3]%
>    \getfromcommacommand[\@@ldlocation][2]%
>    \processaction
>      [\commalistelement]
>      [  \v!left=>\chardef\pairedlocationb0,
>        \v!right=>\chardef\pairedlocationb1,
>         \v!high=>\chardef\pairedlocationb2,
>          \v!top=>\chardef\pairedlocationb2,
>          \v!low=>\chardef\pairedlocationb3,
>       \v!bottom=>\chardef\pairedlocationb3,
>       \v!middle=>\chardef\pairedlocationb4]}
> 
> \def\betweenbothpairedboxes
>   {\switchtobodyfont[\@@ldbodyfont]% split under same regime
>    \setbox\firstpairedbox\flushnextbox
>    \ifnum\pairedlocationa<2
>      \hsize\wd\firstpairedbox % trick
>      \hsize\@@ldwidth
>      \scratchdimen\wd\firstpairedbox
>      \advance\scratchdimen \@@lddistance
>      \bgroup\advance\scratchdimen \hsize
>      \ifdim\scratchdimen>\@@ldmaxwidth\relax
>        \egroup
>        \hsize\@@ldmaxwidth
>        \advance\hsize -\scratchdimen
>      \else
>        \egroup
>      \fi
>    \else
>      \hsize\wd\firstpairedbox
>      \hsize\@@ldwidth % can be \hsize
>      \ifdim\hsize>\@@ldmaxwidth\relax \hsize\@@ldmaxwidth \fi % can be \hsize
>    \fi
>    \ifnum\@@ldn>\plusone
>      \setrigidcolumnhsize\hsize\@@lddistance\@@ldn
>    \fi}
> 
> \def\afterbothpairedboxes
>   {\setbox\secondpairedbox\vbox
>      {% \localstartcolor[\@@ldcolor]% does not work yet
>         \ifnum\@@ldn>1
>           \rigidcolumnbalance\nextbox
>         \else
>           \flushnextbox
>         \fi
>       }% \localstopcolor}%
>    \ifnum\pairedlocationa<2\hbox\else\vbox\fi\bgroup % hide vsize
>    \forgetall
>    \ifnum\pairedlocationa<2
>      \scratchdimen\maxoftwoboxdimens\ht\firstpairedbox\secondpairedbox
>      \vsize\scratchdimen
>      \ifdim\scratchdimen<\@@ldheight\relax % can be \vsize
>        \scratchdimen\@@ldheight
>      \fi
>      \ifdim\scratchdimen>\@@ldmaxheight\relax
>        \scratchdimen\@@ldmaxheight
>      \fi
>      \valignpairedbox\firstpairedbox \scratchdimen
>      \valignpairedbox\secondpairedbox\scratchdimen
>    \else
>      \scratchdimen\maxoftwoboxdimens\wd\firstpairedbox\secondpairedbox
>      \halignpairedbox\firstpairedbox \scratchdimen
>      \halignpairedbox\secondpairedbox\scratchdimen
>      \scratchdimen\ht\secondpairedbox
>      \vsize\scratchdimen
>      \ifdim\ht\secondpairedbox<\@@ldheight\relax % can be \vsize
>        \scratchdimen\@@ldheight\relax % \relax needed
>      \fi
>      \ifdim\scratchdimen>\@@ldmaxheight\relax % todo: totale hoogte
>        \scratchdimen\@@ldmaxheight\relax % \relax needed
>      \fi
>      \ifdim\scratchdimen>\ht\secondpairedbox
>        \setbox\secondpairedbox\vbox to \scratchdimen
>          {\ifnum\pairedlocationa=3 \vss\fi %
>           \box\secondpairedbox
>           \ifnum\pairedlocationa=2 \vss\fi}% \kern\zeropoint
>      \fi
>    \fi
>    \ifcase\pairedlocationa
>      \box\secondpairedbox\hskip\@@lddistance\box\firstpairedbox \or
>      \box\firstpairedbox \hskip\@@lddistance\box\secondpairedbox\or
>      \box\secondpairedbox\endgraf \nointerlineskip \@@ldinbetween \box\firstpairedbox \or
>      \box\firstpairedbox \endgraf \nointerlineskip \@@ldinbetween \box\secondpairedbox\else
>    \fi
>    \egroup}
> 
> \def\insidesecondpairedbox
>   {\forgetall
>    \setupalign[\@@ldalign]%
>    \tolerantTABLEbreaktrue % hm.
>    \blank[\v!disable]%
>    \everypar{\begstrut}}
> 
> \def\maxoftwoboxdimens#1#2#3%
>   {#1\ifdim#1#2>#1#3 #2\else#3\fi}
> 
> \def\valignpairedbox#1#2%
>   {\setbox#1\vbox to #2
>      {\ifcase\pairedlocationb\or\or\or\vss\or\vss\fi
>       \box#1\relax
>       \ifcase\pairedlocationb\or\or\vss\or\or\vss\fi}}
> 
> \def\halignpairedbox#1#2%
>   {\setbox#1\hbox to #2
>      {\ifcase\pairedlocationb\or\hss\or\or\or\hss\fi
>       \box#1\relax
>       \ifcase\pairedlocationb\hss\or\or\or\or\hss\fi}}
> 
> \definepairedbox[\v!legend]
> 
> %D Goody:
> 
> \newevery \everyinsidefloat \relax
> 
> \appendtoks
>   \global\resetsystemmode{combination}%
>   \global\resetsystemmode{pairedbox}%
> \to \everyinsidefloat
> \f
> \newcount\horcombination  % counter
> \newcount\totcombination
> 
> \def\definecombination
>   {\dodoubleempty\dodefinecombination}
> 
> \def\dodefinecombination[#1][#2]%
>   {\copyparameters
>      [\??co#1][\??co]
>      [\c!width,\c!height,\c!distance,\c!location,%
>       \c!before,\c!inbetween,\c!after,\c!align,%
>       \c!style,\c!color]%
>    \getparameters
>      [\??co#1][#2]}
> 
> \def\setupcombinations
>   {\dodoubleempty\dosetupcombinations}
> 
> \def\dosetupcombinations[#1][#2]%
>   {\ifsecondargument
>      \getparameters[\??co#1][#2]%
>    \else
>      \getparameters[\??co][#1]%
>    \fi}
> 
> \def\combinationparameter#1%
>   {\csname\??co\currentcombination#1\endcsname}%
> 
> \def\startcombination
>   {\bgroup % so we can grab a group
>    \dodoubleempty\dostartcombination}
> 
> \def\dostartcombination[#1][#2]%
>   {\global\setsystemmode{combination}%
>    \ifsecondargument
>      \def\currentcombination{#1}%
>    \else
>      \let\currentcombination\empty
>    \fi
>    \forgetall
>    \doifelse{\combinationparameter\c!height}\v!fit
>      \vbox {\vbox to \combinationparameter\c!height}%
>    \bgroup
>   %\doifelsenothing{#1}
>   %  {\dodostartcombination[2*1*]}
>   %  {\doifelsenothing{#2}
>   %     {\dodostartcombination[#1*1*]}
>   %     {\dodostartcombination[#2*1*]}}}
>    \expanded{\dodostartcombination
>      [\ifsecondargument#2\else\iffirstargument#1\else2\fi\fi*1*]}}
> 
> \long\def\dodostartcombination[#1*#2*#3]%
>   {\setuphorizontaldivision
>      [\c!n=\v!fit,\c!distance=\combinationparameter\c!distance]%
>    \global\horcombination#1%
>    \global\totcombination#2%
>    \global\setbox\combinationstack\emptybox
>    \xdef\maxhorcombination{\the\horcombination}%
>    \multiply\totcombination\horcombination
>    \tabskip\zeropoint
>    \doifelse{\combinationparameter\c!width}\v!fit
>      {\halign}{\halign to \combinationparameter\c!width}%
>    \bgroup&%
>    %\hfil##\hfil% now : location={left,top}
>    \ExpandBothAfter\doifnotinset\v!left{\combinationparameter\c!location}\hfil
>    ##%
>    \ExpandBothAfter\doifnotinset\v!right{\combinationparameter\c!location}\hfil
>    &\tabskip\zeropoint \!!plus 1fill##\cr
>    \docombination}
> 
> \def\docombination % we want to add struts but still ignore an empty box
>   {\dowithnextbox
>      {\setbox0\flushnextbox
>       \dowithnextbox
>         {\setbox2\flushnextbox
>          \dodocombination}%
>       \vtop\bgroup
>         \def\next
>           {\futurelet\nexttoken\nextnext}%
>         \def\nextnext
>           {\ifx\nexttoken\egroup \else % the next box is empty
>              \hsize\wd0
>              \setupalign[\combinationparameter\c!align]%
>              \dostartattributes{\??co\currentcombination}\c!style\c!color\empty
>              \bgroup
>              \aftergroup\endstrut
>              \aftergroup\dostopattributes
>              \aftergroup\egroup
>              \begstrut
>            \fi}%
>         \afterassignment\next\let\nexttoken=}
>   \hbox}
> 
> % stupid version, does not align top stuff when captions,
> % keep as example
> %
> % \def\dodocombination
> %   {\vbox
> %      {\forgetall % \setupwhitespace[\v!none]%
> %       \let\next\vbox
> %       \ExpandFirstAfter\processallactionsinset
> %         [\combinationparameter\c!location]
> %         [   \v!top=>\let\next\tbox,
> %          \v!middle=>\let\next\halfwaybox]%
> %       \next{\copy0}%
> %       \ifdim\ht2>\zeropoint % beter dan \wd2, nu \strut mogelijk
> %         \combinationparameter\c!inbetween
> %         %\vtop % wrong code
> %         %  {\nointerlineskip  % recently added
> %         %   \hsize\wd0
> %         %   \setupalign[\combinationparameter\c!align]%  % \raggedcenter
> %         %   \begstrut\unhbox2\endstrut}%
> %         \box2
> %       \fi}%
> %    \ifnum\totcombination>\plusone
> %      \global\advance\totcombination\minusone
> %      \global\advance\horcombination\minusone
> %      \ifnum\horcombination=\zerocount
> %        \def\next
> %          {\cr\noalign
> %             {\forgetall % \setupwhitespace[\v!geen]% no
> %              \nointerlineskip
> %              \combinationparameter\c!before
> %              \combinationparameter\c!after
> %              \vss
> %              \nointerlineskip}%
> %           \global\horcombination\maxhorcombination\relax
> %           \docombination}%
> %      \else
> %        \def\next
> %          {&&&\hskip\combinationparameter\c!distance&\docombination}%
> %      \fi
> %    \else
> %      \def\next
> %        {\cr\egroup}%
> %    \fi
> %    \next}
> 
> % \def\dodocombination
> %   {\vbox
> %      {\forgetall % \setupwhitespace[\v!none]%
> %       \let\next\vbox
> %       \ExpandFirstAfter\processallactionsinset
> %         [\combinationparameter\c!plaats]
> %         [   \v!top=>\let\next\tbox,
> %          \v!middle=>\let\next\halfwaybox]%
> %       \next{\copy0}%
> %       % we need to save the caption for a next alignment line
> %       \saveoncombinationstack2}%
> %    \ifnum\totcombination>\plusone
> %      \global\advance\totcombination\minusone
> %      \global\advance\horcombination\minusone
> %      \ifnum\horcombination=\zerocount
> %        \def\next
> %          {\cr
> %           \flushcombinationstack
> %           \noalign
> %             {\forgetall % \setupwhitespace[\v!none]% no
> %              \global\setbox\combinationstack\emptybox
> %              \nointerlineskip
> %              \combinationparameter\c!after
> %              \combinationparameter\c!before
> %              \vss
> %              \nointerlineskip}%
> %           \global\horcombination\maxhorcombination\relax
> %           \docombination}%
> %      \else
> %        \def\next
> %          {&&&\hskip\combinationparameter\c!distance&\docombination}%
> %      \fi
> %    \else
> %      \def\next
> %        {\cr
> %         \flushcombinationstack
> %         \egroup}%
> %    \fi
> %    \next}
> 
> \def\depthonlybox
>   {\dowithnextbox{\vtop{\hsize\wd\nextbox\kern\zeropoint\box\nextbox}}\vbox}
> 
> % \def\boxwithstrutheight
> %   {\dowithnextbox
> %      {\scratchdimen\strutheight
> %       \advance\scratchdimen-\nextboxht
> %       \hbox{\raise\scratchdimen\box\nextbox}}%
> %      \vbox}
> 
> \def\dodocombination
>   {\vbox
>      {\forgetall % \setupwhitespace[\v!none]%
>       \let\next\vbox
>       \ExpandFirstAfter\processallactionsinset
>         [\combinationparameter\c!location]
>         [    \v!top=>\let\next\depthonlybox, % \tbox,
>           \v!middle=>\let\next\halfwaybox]%
>       \next{\copy0}%
>       % we need to save the caption for a next alignment line
>       \saveoncombinationstack2}%
>    \ifnum\totcombination>\plusone
>      \global\advance\totcombination\minusone
>      \global\advance\horcombination\minusone
>      \ifnum\horcombination=\zerocount
>        \def\next
>          {\cr
>           \flushcombinationstack
>           \noalign
>             {\forgetall % \setupwhitespace[\v!none]% no
>              \global\setbox\combinationstack\emptybox
>              \nointerlineskip
>              \combinationparameter\c!after
>              \combinationparameter\c!before
>              \vss
>              \nointerlineskip}%
>           \global\horcombination\maxhorcombination\relax
>           \docombination}%
>      \else
>        \def\next
>          {&&&\hskip\combinationparameter\c!distance&\docombination}%
>      \fi
>    \else
>      \def\next
>        {\cr
>         \flushcombinationstack
>         \egroup}%
>    \fi
>    \next}
> 
> \def\stopcombination
>   {\egroup
>    \egroup}
> 
> \newbox\combinationstack
> 
> \def\saveoncombinationstack#1%
>   {\global\setbox\combinationstack\hbox
>      {\hbox{\box#1}\unhbox\combinationstack}}
> 
> \def\flushcombinationstack
>   {\noalign
>      {\ifdim\ht\combinationstack>\zeropoint
> \nointerlineskip % nieuw
>         \combinationparameter\c!inbetween
>         \global\horcombination\maxhorcombination
>         \globallet\doflushcombinationstack\dodoflushcombinationstack
>       \else
>         \global\setbox\combinationstack\emptybox
>         \globallet\doflushcombinationstack\donothing
>       \fi}%
>    \doflushcombinationstack\crcr}
> 
> \gdef\dodoflushcombinationstack
>   {\global\setbox\combinationstack\hbox
>      {\unhbox\combinationstack
>       \global\setbox1\lastbox}%
>    \box1% \ruledhbox{\box1}%
>    \global\advance\horcombination\minusone\relax
>    \ifnum\horcombination>\zerocount
>      \def\next{&&&&\doflushcombinationstack}%
>    \else
>      \global\setbox\combinationstack\emptybox
>     %\let\next\relax
>      \@EA\gobbleoneargument
>    \fi
>    \next}
> 
> \setupcombinations
>   [\c!width=\v!fit,
>    \c!height=\v!fit,
>    \c!distance=1em,
>    \c!location=\v!bottom, % can be something {top,left}
>    \c!before=\blank,
>    \c!inbetween={\blank[\v!medium]},
>    \c!style=,
>    \c!color=,
>    \c!after=,
>    \c!align=\v!middle]
> \f
> % does not work
> %
> % \def\plaatsondernaastelkaar#1#2%
> %   {\bgroup
> %    \def\doplaatsondernaastelkaar%
> %      {#2\cr\omit\bgroup#2%
> %       \aftergroup#2%
> %       \aftergroup\cr
> %       \aftergroup\egroup
> %       \aftergroup\egroup
> %       \let\next=}%
> %    #1\bgroup##\cr
> %    \omit\bgroup#2%
> %    \aftergroup\doplaatsondernaastelkaar
> %    \let\next=}
> 
> \def\plaatsondernaastelkaar#1#2%
>   {\bgroup
>    \dowithnextbox
>      {\bgroup
>       \setbox0\box\nextbox
>       \dowithnextbox
>         {\setbox2\box\nextbox
>          #1{#2#########2\cr\box0\cr\box2\cr}
>          \egroup
>          \egroup}
>         \hbox}
>      \hbox}
> 
> \def\placeontopofeachother
>   {\plaatsondernaastelkaar\halign\hss}
> 
> \def\placesidebyside
>   {\plaatsondernaastelkaar\valign\vss}
> \f
> \def\douseexternalfiles[#1][#2]%
>   {\getparameters
>      [\??fi#1]
>      [\c!file=,
>       \c!bodyfont=,
>       \c!option=,
>       #2]}
> 
> \def\useexternalfiles
>   {\dodoubleargument\douseexternalfiles}
> 
> \def\dostelexternefilesin[#1][#2]%
>   {\doifundefinedelse{\??fi#1\c!file}
>      {\useexternalfiles[#1][#2]}
>      {\getparameters[\??fi#1][#2]}}
> 
> \def\stelexternefilesin
>   {\dodoubleargument\dostelexternefilesin}
> 
> \def\verwerkexternefile#1#2#3%
>   {\bgroup
>    \getparameters[\??fi#1][\c!file=,#3]%
>    \doinputonce{\getvalue{\??fi#1\c!file}}%
>    \ExpandFirstAfter\switchtobodyfont[\getvalue{\??fi#1\c!bodyfont}]%
>    \readsysfile{#2}  % beter: loc of fix gebied
>      \donothing
>      {\showmessage\m!systems{41}{#2,#1}}%
>    \egroup}
> 
> \def\douseexternalfile[#1][#2][#3][#4]%
>   {\stelexternefilesin[#1][]%
>    \doinputonce{\getvalue{\??fi#1\c!file}}%
>    \doifelsenothing{#2}
>      {\setvalue{#3}{\verwerkexternefile{#1}{#3}{#4}}}
>      {\setvalue{#2}{\verwerkexternefile{#1}{#3}{#4}}}}
> 
> \def\useexternalfile
>   {\doquadrupleargument\douseexternalfile}
> 
> \useexternalfiles
>   [pictex]
>   [\c!bodyfont=\v!small,
>    \c!file=pictex]
> 
> \useexternalfiles
>   [table]
>   [\c!file=table]
> \f
> %D A couple of examples, demonstrating how the depth is
> %D taken care of:
> %D
> %D \startbuffer
> %D test\rotate[frame=on, rotation=0]  {gans}%
> %D test\rotate[frame=on, rotation=90] {gans}%
> %D test\rotate[frame=on, rotation=180]{gans}%
> %D test\rotate[frame=on, rotation=270]{gans}%
> %D test
> %D \stopbuffer
> %D
> %D \typebuffer \getbuffer
> 
> % \presetlocalframed[\??ro]
> %
> % \def\setuprotate
> %   {\dodoubleargument\getparameters[\??ro]}
> %
> % \def\dorotatebox#1% {angle} \hbox/\vbox/\vtop
> %   {\bgroup
> %    \hbox\bgroup % compatibility hack
> %    \dowithnextbox
> %      {\edef\@@rorotation{#1}%
> %       \setbox\nextbox\vbox{\flushnextbox}%
> %       \dostoprotate
> %       \egroup}}
> %
> % \def\dodostoprotate#1#2#3#4#5#6%
> %   {\dontshowcomposition
> %    \scratchdimen\nextboxht\advance\scratchdimen\nextboxdp
> %    \doif\@@rolocation\v!high
> %      {\setbox\nextbox\vbox{\hbox{\raise\nextboxdp\flushnextbox}}}%
> %    \setbox\nextbox\vbox to #1
> %      {#2\relax
> %       \hbox to #4
> %         {#5\relax % \number removes leading spaces too
> %          \edef\@@rorotation{\number\@@rorotation}%
> %          \doifelsenothing\@@rorotation
> %            {\dostartrotation{90}}
> %            {\dostartrotation{\@@rorotation}}%
> %          \nextboxwd\zeropoint
> %          \nextboxht\zeropoint
> %         %\nextboxdp\zeropoint
> %          \flushnextbox
> %          \dostoprotation
> %          #6}
> %       #3}%
> %    \nextboxdp\zeropoint
> %    \flushnextbox
> %    \egroup}
> %
> % \def\dostoprotate
> %   {\!!counta\@@rorotation
> %    \divide\!!counta 90
> %    \ifcase\!!counta
> %      \dodostoprotate\nextboxht\relax\vfill\nextboxwd\relax\hfill
> %    \or
> %     %\dodostoprotate\nextboxwd\vfill\relax\nextboxht\relax\hfill
> %      \dodostoprotate\nextboxwd\vfill\relax\scratchdimen\relax\hfill
> %    \or
> %      \dodostoprotate\nextboxht\vfill\relax\nextboxwd\hfill\relax
> %    \or
> %     %\dodostoprotate\nextboxwd\relax\vfill\nextboxht\hfill\relax
> %      \dodostoprotate\nextboxwd\relax\vfill\scratchdimen\hfill\relax
> %    \or
> %      \dodostoprotate\nextboxht\relax\vfill\nextboxwd\relax\hfill
> %    \else
> %      \def\@@rotation{90}%
> %      \dodostoprotate\nextboxht\relax\vfill\nextboxwd\relax\hfill
> %    \fi}
> %
> % \def\complexrotate[#1]%
> %   {\dowithnextbox
> %      {\getparameters[\??ro][#1]%
> %       \dostoprotate}%
> %    \vbox\localframed[\??ro][#1]}
> %
> % \unexpanded\def\rotate % \bgroup: \rotate kan argument zijn
> %   {\bgroup\complexorsimpleempty\rotate}
> %
> % \setuprotate
> %   [\c!rotation=90,
> %    \c!width=\v!fit,
> %    \c!height=\v!fit,
> %    \c!offset=\v!overlay,
> %    \c!frame=\v!off]
> 
> % The previous implementation is replaced by one that supports
> % rotation over arbitrary angles.
> %
> % When we rotate over arbitrary angles, we need to relocate the
> % resulting box because rotation brings that box onto the negative
> % axis. The calculations (mostly sin and cosine) need to be tuned for
> % the way a box is packages (i.e. the refence point). A typical example
> % of drawing, scribbling, and going back to the days of school math.
> %
> % We do a bit more calculations than needed, simply because that way
> % it's easier to debug the code.
> 
> \def\dododorotatenextbox
>   {\setbox\nextbox\vbox to \@@layerysiz
>      {\vfill
>       \hbox to \@@layerxsiz
>         {\dostartrotation\@@rorotation
>            \nextboxwd\zeropoint
>            \nextboxht\zeropoint
>            \flushnextbox
>          \dostoprotation
>          \hfill}%
>       \kern\@@layerypos}%
>   \setbox\nextbox\hbox
>     {\kern\@@layerxpos
>      \kern\@@layerxoff
>      \lower\@@layeryoff\flushnextbox}}
> 
> \def\dodorotatenextbox#1#2% quite some trial and error -)
>   {\dontshowcomposition
>    \dontcomplain
>    \ifnum#2=\plusfour
>      % new, location=middle
>      \!!widthb \nextboxwd
>      \!!heightb\nextboxht
>      \!!depthb \nextboxdp
>      \setbox\nextbox\vbox{\vskip.5\nextboxht\hskip-.5\nextboxwd\flushnextbox}%
>      \smashbox\nextbox
>    \fi
>    \!!widtha \nextboxwd
>    \!!heighta\nextboxht
>    \!!deptha \nextboxdp
>    \!!doneafalse
>    \!!donebfalse
>    \ifcase#2\or
>      % 1: fit
>    \or
>      % 2: depth, not fit
>      \!!doneatrue
>      \!!donebtrue
>    \or
>      % 3: depth, fit
>      \!!donebtrue
>    \fi
>    \setbox\nextbox\vbox{\hbox{\raise\nextboxdp\flushnextbox}}%
>    \!!dimena \nextboxht
>    \calculatecos\@@rorotation\edef\cos{\calculatedcos\@@rorotation}%
>    \calculatesin\@@rorotation\edef\sin{\calculatedsin\@@rorotation}%
>    \@@layerxpos\zeropoint
>    \@@layerypos\zeropoint
>    \@@layerxoff\zeropoint
>    \@@layeryoff\zeropoint
>    \ifdim\sin\points>\zeropoint
>      \ifdim\cos\points>\zeropoint
>        \@@layerxsiz                    \cos\!!widtha
>        \@@layerysiz                    \sin\!!widtha
>        \advance\@@layerxsiz            \sin\!!dimena
>        \advance\@@layerysiz            \cos\!!dimena
>        \@@layerypos                    \cos\!!dimena
>        \if!!donea
>          \@@layerxoff          \negated\sin\!!dimena
>          \advance\@@layerxoff          \sin\!!deptha
>        \fi
>        \if!!doneb
>          \@@layeryoff                  \cos\!!deptha
>        \fi
>        \dododorotatenextbox
>      \else
>        \@@layerxsiz            \negated\cos\!!widtha
>        \@@layerysiz                    \sin\!!widtha
>        \advance\@@layerxsiz            \sin\!!dimena
>        \advance\@@layerysiz    \negated\cos\!!dimena
>        \@@layerxpos            \negated\cos\!!widtha
>        \if!!donea
>          \@@layerxoff                     -\@@layerxsiz
>          \advance\@@layerxoff          \sin\!!deptha
>        \fi
>        \if!!doneb
>          \@@layeryoff          \negated\cos\!!heighta
>        \fi
>        \dododorotatenextbox
>        \wd\nextbox\if!!donea\sin\!!deptha\else\@@layerxsiz\fi
>      \fi
>    \else
>      \ifdim\cos\points<\zeropoint
>        \@@layerxsiz           \negated\cos\!!widtha
>        \@@layerysiz           \negated\sin\!!widtha
>        \advance\@@layerxsiz   \negated\sin\!!dimena
>        \advance\@@layerysiz   \negated\cos\!!dimena
>        \@@layerxpos                        \@@layerxsiz
>        \@@layerypos            \negated\sin\!!widtha
>        \if!!donea
>          \@@layerxoff                     -\@@layerxsiz
>          \advance\@@layerxoff  \negated\sin\!!heighta
>        \fi
>        \if!!doneb
>          \@@layeryoff                      \@@layerysiz
>          \advance\@@layeryoff          \cos\!!deptha
>        \fi
>        \dododorotatenextbox
>        \wd\nextbox\if!!donea\negated\sin\!!heighta\else\@@layerxsiz\fi
>      \else
>        \@@layerxsiz                    \cos\!!widtha
>        \@@layerysiz            \negated\sin\!!widtha
>        \advance\@@layerxsiz    \negated\sin\!!dimena
>        \advance\@@layerysiz            \cos\!!dimena
>        \ifdim\sin\points=\zeropoint
>          \@@layerxpos                       \zeropoint
>          \@@layerxoff                       \zeropoint
>          \@@layerypos                      \@@layerysiz
>          \if!!doneb
>            \@@layeryoff                     \!!deptha
>          \fi
>        \else
>          \@@layerypos                       \@@layerysiz
>          \@@layerxpos           \negated\sin\!!dimena
>          \if!!donea
>            \@@layerxoff                    -\@@layerxsiz
>            \advance\@@layerxoff \negated\sin\!!heighta
>          \fi
>          \if!!doneb
>            \@@layeryoff          \negated\sin\!!deptha
>          \fi
>        \fi
>        \dododorotatenextbox
>        \ifdim\sin\points=\zeropoint
>        \else
>          \wd\nextbox\if!!donea\negated\sin\!!heighta\else\@@layerxsiz\fi
>        \fi
>      \fi
>    \fi
>    % new, location=middle
>    \ifnum#2=\plusfour
>      \setbox\nextbox\vbox{\vskip-.5\!!heightb\hskip.5\!!heightb\flushnextbox}%
>      \nextboxwd\!!widthb
>      \nextboxht\!!heightb
>      \nextboxdp\!!depthb
>    \fi}
> 
> \def\dorotatenextbox#1#2%
>   {\doifsomething{#1}
>      {\edef\@@rorotation{\number#1}% get rid of leading zeros and spaces
>       \setbox\nextbox\vbox{\flushnextbox}% not really needed
>       \dodorotatenextbox\@@rorotation#2}%
>    \hbox{\boxcursor\flushnextbox}}
> 
> \def\dodorotatebox#1% {angle} \hbox/\vbox/\vtop
>   {\bgroup\hbox\bgroup % compatibility hack
>      \dowithnextbox
>        {\dorotatenextbox{#1}\plusone
>         \egroup\egroup}}
> 
> \def\dorotatebox#1% {angle} \hbox/\vbox/\vtop
>   {\ifcase#1\relax
>      \expandafter\gobbleoneargument
>    \else
>      \expandafter\dodorotatebox
>    \fi{#1}}
> 
> \unexpanded\def\rotate % \bgroup: \rotate kan argument zijn
>   {\bgroup\complexorsimpleempty\rotate}
> 
> \def\complexrotate[#1]% framed met diepte !
>   {\getparameters[\??ro][#1]%
>    \processaction
>      [\@@rolocation]
>      [  \v!depth=>\!!counta\plusthree\donefalse,% depth   fit   - raw box
>           \v!fit=>\!!counta\plustwo  \donefalse,% depth   tight - raw box
>         \v!broad=>\!!counta\plusone  \donefalse,% nodepth fit   - raw box
>          \v!high=>\!!counta\plusone  \donetrue ,% nodepth fit   - framed
>        \v!middle=>\!!counta\plusfour \donefalse,% centered, keep dimensions
>       \s!default=>\!!counta\plusthree\donetrue ,% depth   fit   - framed
>       \s!unknown=>\!!counta\plusthree\donetrue ]% depth   fit   - framed
>    \ifdone
>      \def\docommand{\localframed[\??ro][#1,\c!location=]}%
>    \else
>      \let\docommand\relax
>    \fi
>    \dowithnextbox{\dorotatenextbox\@@rorotation\!!counta\egroup}\vbox\docommand}
> 
> \presetlocalframed[\??ro]
> 
> \def\setuprotate
>   {\dodoubleargument\getparameters[\??ro]}
> 
> \setuprotate
>   [\c!rotation=90,
>    \c!location=\v!normal,
>    \c!width=\v!fit,
>    \c!height=\v!fit,
>    \c!offset=\v!overlay,
>    \c!frame=\v!off]
> 
> % \dostepwiserecurse{0}{360}{10}
> %   {\startlinecorrection[blank]
> %    \hbox
> %      {\expanded{\setuprotate[rotation=\recurselevel]}%
> %       \traceboxplacementtrue
> %       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=depth] {\ruledhbox{\bfb  (depth)}}}}%
> %       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=fit]   {\ruledhbox{\bfb    (fit)}}}}%
> %       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=broad] {\ruledhbox{\bfb  (broad)}}}}%
> %       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=normal]{\ruledhbox{\bfb (normal)}}}}%
> %       \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=high]  {\ruledhbox{\bfb   (high)}}}}}
> %    \stoplinecorrection}
> \f
> % scale
> 
> \def\doscalelikeafigure % quite dirty and potential interference possible
>   {\doifsomething{\@@xyscale\@@xyxscale\@@xyyscale
>                   \@@xyfactor\@@xyhfactor\@@xywfactor
>                   \@@xywidth\@@xyheight\@@xylines}
>      {\let \@@efscale  \@@xyscale
>       \let \@@efxscale \@@xyxscale
>       \let \@@efyscale \@@xyyscale
>       \let \@@effactor \@@xyfactor
>       \let \@@efwfactor\@@xywfactor
>       \let \@@efhfactor\@@xyhfactor
>       \let \@@efwidth  \@@xywidth
>       \let \@@efheight \@@xyheight
>       \let \@@eflines  \@@xylines
>       \let \@@efgrid   \@@xygrid
>       \let \@@epx      \!!zeropoint
>       \let \@@epy      \!!zeropoint
>       \edef\@@epw     {\the\nextboxwd}%
>       \edef\@@eph     {\the\nextboxht}%
>       \figwid\zeropoint \figxsca\plusone % see note * (core-fig)
>       \fighei\zeropoint \figysca\plusone % see note * (core-fig)
>       \checkfiguresettings
>       \setfactorfiguresize
>       \setscalefiguresize
>       \setdimensionfiguresize
>       \convertfigureinsertscale\@@epx\figx\figxsca\scax
>       \convertfigureinsertscale\@@epy\figy\figysca\scay
>       \scratchdimen\scax\points \divide\scratchdimen \plushundred
>       \edef\@@xysx{\withoutpt\the\scratchdimen}%
>       \scratchdimen\scay\points \divide\scratchdimen \plushundred
>       \edef\@@xysy{\withoutpt\the\scratchdimen}}}
> 
> \def\doscale[#1]% todo: xscale/yscale
>   {\bgroup
>    \forgetall
>    \getparameters
>      [\??xy]
>      [\c!scale=,\c!xscale=,\c!yscale=,\c!width=,\c!height=,\c!lines=,
>       \c!factor=,\c!hfactor=,\c!wfactor=,\c!grid=,
>       \c!sx=1,\c!sy=1,#1]%
>    \dowithnextbox
>      {\dontshowcomposition
>       \ifdim\nextboxht>\zeropoint \ifdim\nextboxwd>\zeropoint
>         \doscalelikeafigure
>         \dimen0=\@@xysy\nextboxht
>         \dimen2=\@@xysy\nextboxdp
>         \dimen4=\@@xysx\nextboxwd
>         \dimen6=\dimen0\advance\dimen6 \dimen2
> %        \setbox\nextbox\vbox to \dimen6
> %          {\nextboxht\zeropoint
> %           \nextboxdp\zeropoint
> %           \vfill % erbij
> %           \dostartscaling\@@xysx\@@xysy\flushnextbox\dostopscaling}%
>         \setbox\nextbox\hbox
>           {\smashbox\nextbox
>            \dostartscaling\@@xysx\@@xysy\flushnextbox\dostopscaling}%
>         \nextboxht\dimen0
>         \nextboxdp\dimen2
>         \nextboxwd\dimen4
>       \fi \fi
>       \flushnextbox
>       \egroup}
>    \hbox}
> 
> \def\scale
>   {\dosingleempty\doscale}
> 
> % mirror
> 
> \def\domirrorbox % \hbox/\vbox/\vtop
>   {\bgroup
>    \dowithnextbox
>      {\dontshowcomposition
>       \scratchdimen\nextboxwd
>       % better use an hbox (if no \forgetall, leftskip etc may creep in)
>      %\setbox\nextbox\vbox{\forgetall\dostartmirroring\hskip-\nextboxwd\flushnextbox\dostopmirroring}%
>       \setbox\nextbox\hbox{\dostartmirroring\hskip-\nextboxwd\flushnextbox\dostopmirroring}%
>       \nextboxwd\scratchdimen
>       \flushnextbox
>       \egroup}}
> 
> \def\mirror
>   {\domirrorbox\hbox}
> 
> %\setbox0=\hbox{gans}
> %
> %\ruledhbox{\copy0 \schaal[sx=2,sy=2]{\copy0}}
> %
> %\spiegel{\ruledhbox{\copy0 \schaal{\box0}}}
> \f
> % to be used in some other places! todo!
> %
> % divides \hsize in fractions, will be made a bit more
> % clever and advanced when needed
> %
> % \horizontaldivision[n/m,elements,distance]
> %
> % \horizontaldivision[2/5,3,1em]
> % \horizontaldivision[2/5,3,1em]
> % \horizontaldivision[1/5,3,1em]
> %
> % \setuphorizontaldivision[afstand=,aantal=]  (passend,passend)
> 
> \def\??fr{@@fr}
> 
> \def\setuphorizontaldivision
>   {\dodoubleargument\getparameters[\??fr]}
> 
> \def\horizontaldivision
>   {\dosingleargument\dohorizontaldivision}
> 
> \def\dohorizontaldivision[#1]%
>   {\dodohorizontaldivision[#1,,,,,,]}
> 
> \def\dodohorizontaldivision[#1/#2,#3,#4,#5]%
>   {\doifelsenothing{#3}
>      {\doifelse\@@frn\v!fit
>         {\!!counta#2\relax}
>         {\!!counta\@@frn\relax}}
>      {\!!counta#3\relax}%
>    \doifelsenothing{#4}
>      {\doifelse\@@frdistance\v!fit
>         {\!!widtha\zeropoint}
>         {\!!widtha\@@frdistance}}
>      {\!!widtha#4}%
>    \advance\!!counta \minusone
>    \multiply\!!widtha \!!counta
>    \advance\hsize -\!!widtha
>    \divide\hsize #2\relax
>    \hsize#1\hsize}
> 
> \setuphorizontaldivision
>   [\c!distance=\tfskipsize,
>    \c!n=\v!fit]
> \f
> %D This one is for Daniel Pittman, who wanted tight
> %D fractions. We show three versions. First the simple
> %D one using \type {\low} and \type {high}:
> %D
> %D \startbuffer
> %D \def\vfrac#1#2%
> %D   {\hbox{\high{\tx#1\kern-.25em}/\low{\kern-.25em\tx#2}}}
> %D
> %D test \vfrac{1}{2} test \vfrac{123}{456} test
> %D \stopbuffer
> %D
> %D \typebuffer {\showmakeup\getbuffer}
> %D
> %D A better way to handle the kerning is the following, here
> %D we kind of assume that tye slash is symmetrical and has
> %D nearly zero width.
> %D
> %D \startbuffer
> %D \def\vfract#1#2%
> %D   {\hbox{\high{\tx#1}\hbox to \zeropoint{\hss/\hss}\low{\tx#2}}}
> %D \stopbuffer
> %D
> %D \typebuffer {\showmakeup\getbuffer}
> %D
> %D The third and best alternative is the following:
> %D
> %D {\showmakeup\getbuffer}\crlf\getbuffer
> %D
> %D This time we measure the height of the \type {/} and
> %D shift over the maximum height and depths of this
> %D character and the fractional digits (we use 57 as
> %D sample). Here we combine all methods in one macros.
> 
> \chardef\vulgarfractionmethod=3
> 
> \definehspace[vulgarfraction][.25em] % [.15em]
> \definesymbol[vulgarfraction][/]     % [\raise.2ex\hbox{/}]
> 
> \unexpanded\def\vulgarfraction#1#2%
>   {\dontleavehmode
>    \hbox
>      {\def\vulgarfraction{vulgarfraction}%
>       \ifcase\vulgarfractionmethod
>         #1\symbol[\vulgarfraction]#2%
>       \or
>         \high{\tx#1\kern-\hspaceamount\empty\vulgarfraction}%
>         \symbol[\vulgarfraction]%
>         \low {\kern-\hspaceamount\empty\vulgarfraction\tx#2}%
>       \or
>         \high{\tx#1}%
>         \hbox to \zeropoint{\hss\symbol[\vulgarfraction]\hss}%
>         \low{\tx#2}%
>       \or
>         \setbox0\hbox{\symbol[\vulgarfraction]}%
>         \setbox2\hbox{\txx57}%
>         \raise\ht0\hbox{\lower\ht2\hbox{\txx#1}}%
>         \hbox to \zeropoint{\hss\symbol[\vulgarfraction]\hss}%
>         \lower\dp0\hbox{\raise\dp2\hbox{\txx#2}}%
>       \fi}}
> 
> \ifx\vfrac\undefined \let\vfrac\vulgarfraction \fi
> 
> %D \starttabulate
> %D \HL
> %D \NC \bf method \NC \bf visualization \NC\NR
> %D \HL
> %D \NC 0 \NC \chardef\vulgarfractionmethod0\vulgarfraction{1}{2} \NC\NR
> %D \NC 1 \NC \chardef\vulgarfractionmethod1\vulgarfraction{1}{2} \NC\NR
> %D \NC 2 \NC \chardef\vulgarfractionmethod2\vulgarfraction{1}{2} \NC\NR
> %D \NC 3 \NC \chardef\vulgarfractionmethod3\vulgarfraction{1}{2} \NC\NR
> %D \HL
> %D \stoptabulate
> \f
> %D Under construction:
> %D
> %D \starttyping
> %D \commalistsentence[aap,noot,mies]
> %D \commalistsentence[aap,noot]
> %D \commalistsentence[aap]
> %D \stoptyping
> 
> \let\handlecommalistsentence\firstofoneargument
> 
> \def\commalistsentence[#1]%
>   {\bgroup
>    \getcommalistsize[#1]%
>    \ifcase\commalistsize\relax
>      \def\serializedcommalist{#1}%
>    \else
>      \let\serializedcommalist\empty
>      \scratchcounter\zerocount
>      \def\docommando##1%
>        {\advance\scratchcounter \plusone
>         \ifnum\scratchcounter=\plusone
>           \scratchtoks{\handlecommalistsentence{##1}}%
>         \else
>           \ifnum\scratchcounter=\commalistsize
>             \appendtoks\labeltext{and-2}\handlecommalistsentence{##1}\to\scratchtoks
>           \else
>             \appendtoks\labeltext{and-1}\handlecommalistsentence{##1}\to\scratchtoks
>           \fi
>         \fi}%
>      \processcommacommand[#1]\docommando
>      \edef\serializedcommalist{\the\scratchtoks}%
>    \fi
>    \serializedcommalist
>    \egroup}
> 
> \ifx\textcomma\undefined \def\textcomma{,} \fi
> 
> \setuplabeltext [\s!nl] [and-1=\textcomma\ , and-2= en ]
> \setuplabeltext [\s!en] [and-1=\textcomma\ , and-2=\textcomma\ and ]
> \setuplabeltext [\s!de] [and-1=\textcomma\ , and-2= und ]
> \f
> \protect \endinput
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> ntg-context mailing list
> ntg-context@ntg.nl
> http://www.ntg.nl/mailman/listinfo/ntg-context

-- 
=======================================================
Ing. Vít Zýka, Ph.D.                         TYPOkvítek

database publishing              databazove publikovani
data maintaining and typesetting in typographic quality
priprava dat a jejich sazba v typograficke kvalite

tel.: (+420) 777 198 189     www: http://typokvitek.com
=======================================================

_______________________________________________
ntg-context mailing list
ntg-context@ntg.nl
http://www.ntg.nl/mailman/listinfo/ntg-context

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-28 17:12                   ` \setupmarginrules Hans Hagen
  2006-03-28 18:55                     ` \setupmarginrules Vit Zyka
@ 2006-03-28 21:44                     ` frantisek holop
  2006-03-29  8:14                       ` \setupmarginrules Hans Hagen
  1 sibling, 1 reply; 23+ messages in thread
From: frantisek holop @ 2006-03-28 21:44 UTC (permalink / raw)


hmm, on Tue, Mar 28, 2006 at 07:12:18PM +0200, Hans Hagen said that
> \def\doalinealijn#1#2%
>  {\doifelsevalue{\??al#2\the\alteller\c!rule}\v!on
>     {\linewidth\getvalue{\??al#2\the\alteller\c!rulethickness}%
>      \scratchdimen#1%
>      \advance\scratchdimen-\linewidth
>      \divide\scratchdimen \plustwo
>      \hskip\scratchdimen
>      \vrule\!!width\linewidth
>      \hskip\scratchdimen}
>     {\hskip#1}}

excuse my silly question, but what am i to do now?
replace core-mis.tex in my context installation and
also add the \doalinealijn macro to my .tex file?

-f
-- 
words are not food, though sometimes we must eat them.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-28 21:44                     ` \setupmarginrules frantisek holop
@ 2006-03-29  8:14                       ` Hans Hagen
  0 siblings, 0 replies; 23+ messages in thread
From: Hans Hagen @ 2006-03-29  8:14 UTC (permalink / raw)


frantisek holop wrote:
> hmm, on Tue, Mar 28, 2006 at 07:12:18PM +0200, Hans Hagen said that
>   
>> \def\doalinealijn#1#2%
>>  {\doifelsevalue{\??al#2\the\alteller\c!rule}\v!on
>>     {\linewidth\getvalue{\??al#2\the\alteller\c!rulethickness}%
>>      \scratchdimen#1%
>>      \advance\scratchdimen-\linewidth
>>      \divide\scratchdimen \plustwo
>>      \hskip\scratchdimen
>>      \vrule\!!width\linewidth
>>      \hskip\scratchdimen}
>>     {\hskip#1}}
>>     
>
> excuse my silly question, but what am i to do now?
> replace core-mis.tex in my context installation and
> also add the \doalinealijn macro to my .tex file?
>   
replace core-mis and remake the format 

Hans 

-----------------------------------------------------------------
                                          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
-----------------------------------------------------------------

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: \setupmarginrules
  2006-03-28 15:14                   ` \setupmarginrules Taco Hoekwater
  2006-03-28 16:58                     ` \setupmarginrules Vit Zyka
@ 2006-03-30 19:18                     ` Willi Egger
  1 sibling, 0 replies; 23+ messages in thread
From: Willi Egger @ 2006-03-30 19:18 UTC (permalink / raw)


Hi Taco (the pretended Vit) and Vit,

I had to look tiwce, but then I had to smile!

Willil

Taco Hoekwater wrote:

>Vit Zyka wrote:
>  
>
>>       \dimen3=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
>>    
>>
>
>Taco Hoekwater wrote:
>  
>
>>       \dimen4=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
>>    
>>
>
>That's funny ;)
>
>Cheers, Taco
>
>_______________________________________________
>ntg-context mailing list
>ntg-context@ntg.nl
>http://www.ntg.nl/mailman/listinfo/ntg-context
>  
>

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2006-03-30 19:18 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-03-15 23:53 \page inside a block frantisek holop
2006-03-16 10:38 ` Hans Hagen
2006-03-16 21:50   ` frantisek holop
2006-03-16 22:17     ` Aditya Mahajan
2006-03-16 22:27     ` Thomas A. Schmitz
2006-03-16 22:57   ` frantisek holop
2006-03-17 18:49     ` Willi Egger
2006-03-26 19:42       ` \setupmarginrules (was: Re: \page inside a block) frantisek holop
2006-03-26 20:12         ` \setupmarginrules Vit Zyka
2006-03-26 20:41           ` \setupmarginrules frantisek holop
2006-03-27 20:54             ` \setupmarginrules Vit Zyka
2006-03-28 14:49               ` \setupmarginrules Willi Egger
2006-03-28 15:05                 ` \setupmarginrules Taco Hoekwater
2006-03-28 15:10                 ` \setupmarginrules Vit Zyka
2006-03-28 15:14                   ` \setupmarginrules Taco Hoekwater
2006-03-28 16:58                     ` \setupmarginrules Vit Zyka
2006-03-28 17:13                       ` \setupmarginrules Hans Hagen
2006-03-30 19:18                     ` \setupmarginrules Willi Egger
2006-03-28 16:42                   ` \setupmarginrules Hans Hagen
2006-03-28 17:12                   ` \setupmarginrules Hans Hagen
2006-03-28 18:55                     ` \setupmarginrules Vit Zyka
2006-03-28 21:44                     ` \setupmarginrules frantisek holop
2006-03-29  8:14                       ` \setupmarginrules Hans Hagen

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).