%D \module
%D [ file=m-steps,
%D version=2011.10.07, % 2001.05.28,
%D title=\CONTEXT\ Modules,
%D subtitle=Step Charts \& Tables,
%D author=Hans Hagen,
%D date=\currentdate,
%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
% This code is not optimized.
\registerctxluafile{m-steps}{}
\unprotect
\defineMPinstance
[steps]
[\s!format=metafun,
\s!extensions=\v!yes,
\s!initializations=\v!yes]
%\c!method=\s!double]
\startMPdefinitions{steps}
loadmodule "step" ;
\stopMPdefinitions
\installcorenamespace {stepcharts}
\installcorenamespace {stepcells}
\installcorenamespace {steptexts}
\installcorenamespace {steplines}
\installstylisticautosetuphandler \??stepcharts {STEPchart} \??stepcharts
\installstylisticautosetuphandler \??stepcells {STEPcell} \??stepcells
\installstylisticautosetuphandler \??steptexts {STEPtext} \??steptexts
\installstylisticautosetuphandler \??steplines {STEPline} \??steplines
\let\setupSTEPcharts\setupSTEPchart
\let\setupSTEPtables\setupSTEPchart % one can define categories so no need
\let\setupSTEPcells \setupSTEPcell
\let\setupSTEPtexts \setupSTEPtext
\let\setupSTEPlines \setupSTEPline
\let\setSTEPchartsparameter\setSTEPchartparameter
\let\setSTEPcellsparameter \setSTEPcellparameter
\let\setSTEPtextsparameter \setSTEPtextparameter
\let\setSTEPlinesparameter \setSTEPlineparameter
% numeric text_text_distance ; text_text_distance := 20pt ;
% numeric step_distance ; step_distance := 20pt ;
\setupSTEPcharts
[%c!alternative=\v!horizontal, % travels with stored so dealt with in lua
%\c!offset=.15\bodyfontsize
%\c!height=2ex
\c!before=\blank,
\c!after=\blank]
\setupSTEPcells
[\c!alternative=24,
\c!style=,
\c!color=,
\c!dx=\bodyfontsize,
\c!dy=\bodyfontsize,
% \c!background=\v!color,
\c!backgroundcolor=STEPbackgroundcolor,
\c!rulethickness=.1\bodyfontsize,
\c!framecolor=STEPframecolor,
\c!offset=.25\bodyfontsize]
\setupSTEPtexts
[\c!alternative=24,
\c!style=\v!smallbodyfont,
\c!color=,
% \c!background=\v!color,
\c!backgroundcolor=STEPbackgroundcolor,
\c!rulethickness=.1\bodyfontsize,
\c!framecolor=STEPframecolor,
\c!distance=.5\bodyfontsize,
\c!offset=.25\bodyfontsize]
\setupSTEPlines
[\c!alternative=1,
\c!rulethickness=.15\bodyfontsize,
\c!height=\STEPlineparameter\c!width,
\c!width=3\bodyfontsize,
\c!distance=.5\bodyfontsize,
\c!offset=.25\bodyfontsize,
\c!color=STEPlinecolor]
\definecolor [STEPlinecolor] [s=.5]
\definecolor [STEPframecolor] [s=.7]
\definecolor [STEPbackgroundcolor] [s=.9]
\newcount\c_module_steps_tag
\newmacro\m_module_steps_category
\unexpanded\def\setSTEPbox#tag#str%
{\setbox\scratchbox\hbox\bgroup
\begstrut
\ignorespaces
#str%
\removeunwantedspaces
\endstrut
\egroup
\ifzeropt\wd\scratchbox
\let#1\empty
\else
\global\advance\c_module_steps_tag\plusone
\edef#tag{\the\c_module_steps_tag}%
\putboxincache{\??stepcharts\m_module_steps_category}{#tag}\scratchbox
\fi}
\newtoks\everySTEPchart
% we used to save charts but that is tricky with so much delegated to lua
% and mp so now we do support a buffered way only
\def\module_steps_syncronize
{\let\currentSTEPtext\p_category
\let\currentSTEPcell\p_category
\let\currentSTEPline\p_category
\checkSTEPcellparent
\checkSTEPtextparent
\checkSTEPlineparent}
\unexpanded\def\startSTEPchart
{\begingroup
\dodoubleempty\module_steps_start_chart}
\def\module_steps_start_chart[#name][#settings]%
{\iffirstargument
\doifelseassignment{#name}
{\let\currentSTEPchart\empty
\let\m_module_steps_category\empty
\setupcurrentSTEPchart[#name]%
\def\module_steps_flush_chart{\module_steps_chart[][#name]}}
{\edef\currentSTEPchart{#name}%
\setupcurrentSTEPchart[#settings]%
\let\m_module_steps_category\currentSTEPchart
\resetboxesincache{\??stepcharts\m_module_steps_category}%
\doifelse{\STEPchartparameter\c!buffer}\v!no
{\def\module_steps_flush_chart{\STEPchart[#name]}}
{\let\module_steps_flush_chart\relax}}%
\else
\let\currentSTEPchart\empty
\def\module_steps_flush_chart{\module_steps_chart[][]}%
\fi
\edef\p_category{\STEPchartparameter\c!category}%
\let\currentSTEPtext\p_category
\let\currentSTEPcell\p_category
\let\currentSTEPline\p_category
\checkSTEPcellparent
\checkSTEPtextparent
\checkSTEPlineparent
\the\everySTEPchart
\startnointerference
\clf_step_start_chart{\currentSTEPchart}{\STEPchartparameter\c!alternative}}
\unexpanded\def\stopSTEPchart
{\clf_step_stop_chart
\stopnointerference
\module_steps_flush_chart
\ifx\m_module_steps_category\empty
\resetboxesincache{\??stepcharts}%
\fi
\endgroup}
\unexpanded\def\startSTEPtable
{\begingroup
\setupSTEPchart[\c!alternative=\v!vertical]%
\dodoubleempty\module_steps_start_chart}
\let\stopSTEPtable\stopSTEPchart
\unexpanded\def\startSTEPaligntable
{\begingroup
\setupSTEPchart[\c!alternative={\v!vertical,\v!three}]%
\let\module_steps_cells\module_steps_cells_three % no nesting yet
\dodoubleempty\module_steps_start_chart}
\let\stopSTEPaligntable\stopSTEPchart
\let\module_steps_flush_chart\relax
% \resetboxesincache\??stepcharts
\unexpanded\def\STEPchart
{\dodoubleempty\module_steps_chart}
\unexpanded\def\module_steps_chart[#name][#settings]%
{\begingroup
\edef\m_module_steps_category{#name}%
\setupSTEPchart[#settings]%
\ifinsidefloat
\makeSTEPchart[#name]%
\else
\STEPchartparameter\c!before
\startbaselinecorrection
\setlocalhsize
\dontleavehmode\vpack{\makeSTEPchart[#name]}% we need to ensure leftskip
\stopbaselinecorrection
\STEPchartparameter\c!after
\fi
\endgroup}
\unexpanded\def\makeSTEPchart[#name]%
{\clf_step_make_chart
chart {
category {\??stepcharts\m_module_steps_category}
name {#name}
alternative {\STEPchartparameter\c!alternative}
}
cell {
alternative {\STEPcellparameter\c!alternative}
offset \dimexpr\STEPcellparameter\c!offset\relax
rulethickness \dimexpr\STEPcellparameter\c!rulethickness\relax
framecolor {\STEPcellparameter\c!framecolor}
backgroundcolor {\STEPcellparameter\c!backgroundcolor}
dx \dimexpr\STEPcellparameter\c!dx\relax
dy \dimexpr\STEPcellparameter\c!dy\relax
}
text {
alternative {\STEPtextparameter\c!alternative}
offset \dimexpr\STEPtextparameter\c!offset\relax
distance \dimexpr\STEPtextparameter\c!distance\relax
rulethickness \dimexpr\STEPtextparameter\c!rulethickness\relax
framecolor {\STEPtextparameter\c!framecolor}
backgroundcolor {\STEPtextparameter\c!backgroundcolor}
}
line {
alternative {\STEPlineparameter\c!alternative}
rulethickness \dimexpr\STEPlineparameter\c!rulethickness\relax
height \dimexpr\STEPlineparameter\c!height\relax
distance \dimexpr\STEPlineparameter\c!distance\relax
offset \dimexpr\STEPlineparameter\c!offset\relax
color {\STEPlineparameter\c!color}
}
\relax}
\unexpanded\def\startSTEPcell{\clf_step_start_cell}
\unexpanded\def\stopSTEPcell {\clf_step_stop_cell}
\unexpanded\def\module_steps_cells {\dosingleempty\module_steps_cells_indeed}
\unexpanded\def\module_steps_cells_three{\dosingleempty\module_steps_cells_three_indeed}
\unexpanded\def\module_steps_texts {\dosingleempty\module_steps_texts_indeed}
\unexpanded\def\module_steps_cell {\dosingleempty\module_steps_cell_indeed}
\unexpanded\def\module_steps_text {\dosingleempty\module_steps_text_indeed}
\unexpanded\def\module_steps_toptext {\dosingleempty\module_steps_toptext_indeed}
\unexpanded\def\module_steps_bottext {\dosingleempty\module_steps_bottext_indeed}
\unexpanded\def\module_steps_topcell {\dosingleempty\module_steps_topcell_indeed}
\unexpanded\def\module_steps_botcell {\dosingleempty\module_steps_botcell_indeed}
\def\module_steps_check_cell#category%
{\edef\p_category{#category}%
\ifx\p_category\empty \else
\let\currentSTEPcell\p_category
\let\currentSTEPline\p_category
\checkSTEPcellparent
\checkSTEPlineparent
\fi}
\def\module_steps_check_text#category%
{\edef\p_category{#category}%
\ifx\p_category\empty \else
\let\currentSTEPtext\p_category
\let\currentSTEPline\p_category
\checkSTEPtextparent
\checkSTEPlineparent
\fi}
\def\module_steps_pass_data#1#2%
{{
text {
#2
}
shape {
rulethickness \dimexpr#1\c!rulethickness\relax
alternative {#1\c!alternative}
framecolor {#1\c!framecolor}
backgroundcolor {#1\c!backgroundcolor}
}
line {
rulethickness \dimexpr\STEPlineparameter\c!rulethickness\relax
alternative {\STEPlineparameter\c!alternative}
color {\STEPlineparameter\c!color}
offset \dimexpr\STEPlineparameter\c!offset\relax
}
}}
\def\module_steps_cells_indeed[#category]#top#bot%
{\begingroup
\iffirstargument
\module_steps_check_cell{#category}%
\fi
\useSTEPcellstyleandcolor\c!style\c!color
\setSTEPbox\module_steps_tag_a{#top}%
\setSTEPbox\module_steps_tag_b{#bot}%
\clf_step_cells \module_steps_pass_data \STEPcellparameter {
top {\module_steps_tag_a}
bot {\module_steps_tag_b}
}
\endgroup}
\def\module_steps_cells_three_indeed[#category]#one#two#three%
{\begingroup
\iffirstargument
\module_steps_check_cell{#category}%
\fi
\useSTEPcellstyleandcolor\c!style\c!color
\setSTEPbox\module_steps_tag_a{#one}%
\setSTEPbox\module_steps_tag_b{#two}%
\setSTEPbox\module_steps_tag_c{#three}%
\clf_step_cells_three \module_steps_pass_data \STEPcellparameter {
left {\module_steps_tag_a}
middle {\module_steps_tag_b}
right {\module_steps_tag_c}
}%
\endgroup}
\def\module_steps_texts_indeed[#category]#top#bot%
{\begingroup
\iffirstargument
\module_steps_check_text{#category}%
\fi
\useSTEPtextstyleandcolor\c!style\c!color
\setSTEPbox\module_steps_tag_a{#top}%
\setSTEPbox\module_steps_tag_b{#bot}%
\clf_step_texts \module_steps_pass_data \STEPtextparameter {
top {\module_steps_tag_a}
bot {\module_steps_tag_b}
}%
\endgroup}
\def\module_steps_cell_indeed[#category]#str%
{\begingroup
\iffirstargument
\module_steps_check_cell{#category}%
\fi
\useSTEPcellstyleandcolor\c!style\c!color
\setSTEPbox\module_steps_tag_a{#str}%
\clf_step_cell \module_steps_pass_data \STEPcellparameter {
top {\module_steps_tag_a}
}%
\endgroup}
\def\module_steps_text_indeed[#category]#str%
{\begingroup
\iffirstargument
\module_steps_check_text{#category}%
\fi
\useSTEPtextstyleandcolor\c!style\c!color
\setSTEPbox\module_steps_tag_a{#str}%
\clf_step_text \module_steps_pass_data \STEPtextparameter {
top {\module_steps_tag_a}
}%
\endgroup}
\def\module_steps_toptext_indeed[#category]#top%
{\begingroup
\iffirstargument
\module_steps_check_text{#category}%
\fi
\useSTEPtextstyleandcolor\c!style\c!color
\setSTEPbox\module_steps_tag_a{#top}%
\clf_step_text_top \module_steps_pass_data \STEPtextparameter {
top {\module_steps_tag_a}
}%
\endgroup}
\def\module_steps_bottext_indeed[#category]#bot%
{\begingroup
\iffirstargument
\module_steps_check_text{#category}%
\fi
\useSTEPtextstyleandcolor\c!style\c!color
\setSTEPbox\module_steps_tag_a{#bot}%
\clf_step_text_bot \module_steps_pass_data \STEPtextparameter {
bot {\module_steps_tag_a}
}%
\endgroup}
\def\module_steps_topcell_indeed[#category]#top%
{\begingroup
\iffirstargument
\module_steps_check_cell{#category}%
\fi
\useSTEPcellstyleandcolor\c!style\c!color
\setSTEPbox\module_steps_tag_a{#top}%
\clf_step_cell_top \module_steps_pass_data \STEPcellparameter {
top {\module_steps_tag_a}
}%
\endgroup}
\def\module_steps_botcell_indeed[#category]#bot%
{\begingroup
\iffirstargument
\module_steps_check_cell{#category}%
\fi
\useSTEPcellstyleandcolor\c!style\c!color
\setSTEPbox\module_steps_tag_a{#bot}%
\clf_step_cell_bot \module_steps_pass_data \STEPcellparameter {
bot {\module_steps_tag_a}
}%
\endgroup}
\appendtoks
\let\cells \module_steps_cells
\let\texts \module_steps_texts
\let\cell \module_steps_cell
\let\text \module_steps_text
\let\toptext\module_steps_toptext
\let\bottext\module_steps_bottext
\let\topcell\module_steps_topcell
\let\botcell\module_steps_botcell
\to \everySTEPchart
% The xml interface:
\unexpanded\def\setSTEPxmldirective#1#2#3%
{\begincsname setSTEP#1parameter\endcsname{#2}{#3}}
\xmlinstalldirective{stepchart}{setSTEPxmldirective}
\startxmlsetups xml:step:define
\xmlsetsetup
{#1}
{stepchart|steptable|stepaligntable|cells|texts|stepcell|cell|text|br}
{xml:step:*}
\stopxmlsetups
\xmlregistersetup{xml:step:define}
\startxmlsetups xml:step:br
\crlf
\stopxmlsetups
\startxmlsetups xml:step:stepchart
\startSTEPchart[\c!category=\xmlatt{#1}{class}]
\xmlflush{#1}
\stopSTEPchart
\stopxmlsetups
\startxmlsetups xml:step:steptable
\startSTEPtable[\c!category=\xmlatt{#1}{class}]
\xmlflush{#1}
\stopSTEPtable
\stopxmlsetups
\startxmlsetups xml:step:stepaligntable
\startSTEPaligntable[\c!category=\xmlatt{#1}{class}]
\xmlflush{#1}
\stopSTEPaligntable
\stopxmlsetups
\startxmlsetups xml:step:cells
\xmldoifelse {#1} {/c1} {
\cells
[\xmlatt{#1}{class}]
{\xmltext{#1}{/c1}}
{\xmltext{#1}{/c2}}
{\xmltext{#1}{/c3}}
} {
\cells
[\xmlatt{#1}{class}]
{\xmltext{#1}{/top}}
{\xmltext{#1}{/bot}}
}
\stopxmlsetups
\startxmlsetups xml:step:texts
\texts
[\xmlatt{#1}{class}]
{\xmltext{#1}{/top}}
{\xmltext{#1}{/bot}}
\stopxmlsetups
\startxmlsetups xml:step:stepcell
\cells
[\xmlatt{#1}{class}]
{\xmltext{#1}{/topcell}}
{\xmltext{#1}{/botcell}}
\texts
[\xmlatt{#1}{class}]
{\xmltext{#1}{/toptext}}
{\xmltext{#1}{/bottext}}
\stopxmlsetups
\startxmlsetups xml:step:cell
\cell
[\xmlatt{#1}{class}]
{\xmlflush{#1}}
\stopxmlsetups
\startxmlsetups xml:step:text
\doifelse {\xmlatt{#1}{option}} {paragraph} {
\text
[\xmlatt{#1}{class}]
{\framed
[\c!location=\v!middle,\c!align={\v!lohi,\v!flushleft},\c!offset=0pt,\c!frame=\v!no]
{\ignorespaces\xmlflush{#1}\removeunwantedspaces}}
} {
\text
[\xmlatt{#1}{class}]
{\xmlflush{#1}}
}
\stopxmlsetups
\protect
\continueifinputfile{m-steps.mkvi}
\starttext
\setupSTEPcells[demo-1][style=bold]
\startbuffer
some cell |
some text
some cell |
some text
some cell |
\stopbuffer
\typebuffer \processxmlbuffer
\startbuffer
some cell A |
some text 1
some cell B |
some text 2
some cell C |
\stopbuffer
\typebuffer \processxmlbuffer
\startbuffer
some cell A |
some more
text 1
some cell B |
\stopbuffer
\typebuffer \processxmlbuffer
\page
\startSTEPchart
\cells {A} {B}
\cells {one} {five} \texts{$+2$}{$-2$}
\cells {two} {four} \texts{$+3$}{$-3$}
\cells {three} {three} \texts{$+4$}{$-4$}
\cells {four} {two} \texts{$+5$}{$-5$}
\cells {five} {one}
\stopSTEPchart
\startbuffer
some text some text
text text
some text some text
\stopbuffer
\processxmlbuffer
\startbuffer
some text |
text text
some text |
\stopbuffer
\processxmlbuffer
\page
\startSTEPchart[second]
\startSTEPcell
\topcell {A}
\botcell {B}
\startSTEPcell
\topcell {one}
\botcell {five}
\toptext {$+2$}
\bottext {$-2$}
\stopSTEPcell
\startSTEPcell
\topcell {two}
\botcell {four}
\toptext {$+3$}
\bottext {$-3$}
\stopSTEPcell
\startSTEPcell
\topcell {three}
\botcell {three}
\toptext {$+4$}
\bottext {$-4$}
\stopSTEPcell
\startSTEPcell
\topcell {four}
\botcell {two}
\toptext {$+5$}
\bottext {$-5$}
\stopSTEPcell
\startSTEPcell
\topcell {five}
\botcell {one}
\stopSTEPcell
\stopSTEPchart
\STEPchart[first][alternative=horizontal]
\STEPchart[first][alternative=vertical]
\page
\STEPchart[second][alternative=horizontal]
\STEPchart[second][alternative=vertical]
\page
\setupSTEPchart
[mytable]
[before={\blank[2*big]},
after={\blank[2*big]}]
\starttext
\startSTEPaligntable[mytable]
\cells {$2c$} {$=$} {$2a+3b$}
\text {with $a=5$}
\cells {$2c$}{$=$} {$10+3b$}
\text {and $b=6$}
\cells {$2c$} {$=$} {$10+18$}
\text {we get}
\cells {$2c$} {$=$} {$28$}
\text {and therefore}
\cells {$c$} {$=$} {$28/2$}
\text {which reduces to}
\cells {$c$} {$=$} {$14$}
\stopSTEPaligntable
\input tufte
\STEPchart[mytable]
\input tufte
\setupSTEPchart
[mytable]
[buffer=no]
\startSTEPaligntable[mytable]
\cells {$2c$} {$=$} {$2a+3b$}
\text {with $a=5$}
\cells {$2c$}{$=$} {$10+3b$}
\text {and $b=6$}
\cells {$2c$} {$=$} {$10+18$}
\text {we get}
\cells {$2c$} {$=$} {$28$}
\text {and therefore}
\cells {$c$} {$=$} {$28/2$}
\text {which reduces to}
\cells {$c$} {$=$} {$14$}
\stopSTEPaligntable
\input tufte
\STEPchart[mytable]
\stoptext