summaryrefslogtreecommitdiff
path: root/tex/context/base/strc-sbe.mkiv
blob: a98b678852303222231380099a0135853e5990a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
%D \module
%D   [       file=strc-sbe,
%D        version=2008.10.20,
%D          title=\CONTEXT\ Structure Macros,
%D       subtitle=Section Block Environments,
%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.

\writestatus{loading}{ConTeXt Structure Macros / Section Block Environments}

\unprotect

% \def\ChapterEntry#1#2#3%
%   {chapter : \hbox to \hsize{\strut\bf#2\hss#3}\endgraf\placelist[section]}
%
% \startfrontmatter % optional
%   \placelist[chapter][alternative=command,command=\ChapterEntry,criterium=text] \page
% \stopfrontmatter  % optional
%
% \startbodymatter % optional
%   \chapter{first}  \section{one}   test \section{two}  test \page
%   \chapter{second} \section{alpha} test \section{beta} test \page
% \stopbodymatter  % optional

\unexpanded\def\definesectionblock{\dotripleargument\dodefinesectionblock}
\unexpanded\def\setupsectionblock {\dodoubleargument\dosetupsectionblock}
\def\setsectionblock              {\dosingleargument\dosetsectionblock}

\def\sectionblockparameter#1%
  {\csname
     \ifcsname\??sb\currentsectionblock#1\endcsname\??sb\currentsectionblock#1\else\s!empty\fi
   \endcsname}

\newtoks \everybeforesectionblock
\newtoks \everyaftersectionblock

\def\dodefinesectionblock[#1][#2][#3]% singular plural settings
  {\getparameters
     [\??sb#1]
     [\c!number=\v!yes,
      \c!page=\v!right, % anders worden marks te vroeg gereset !
      #3]%
   \expandafter\newif\csname if#2\endcsname % better a mode
   \setsectionblockenvironment{#1}\empty
   \setvalue {\e!start#2}{\startsectionblock[#1]}%
   \setvalue {\e!stop #2}{\stopsectionblock}}

\ifdefined \resetallstructuremarks \else
    \let\resetallstructuremarks\relax
\fi

\appendtoks
    \doifsomething{\sectionblockparameter\c!page}{\page[\sectionblockparameter\c!page]}%
    \resetallstructuremarks
    \getsectionblockenvironment\currentsectionblock
    \sectionblockparameter\c!before % don't move
    \dostarttagged\t!division\currentsectionblock
\to \everybeforesectionblock

\appendtoks
    \sectionblockparameter\c!after % don't move
    \doifsomething{\sectionblockparameter\c!page}{\page[\sectionblockparameter\c!page]}%
    \dostoptagged
    \resetallstructuremarks
\to \everyaftersectionblock

\def\dosetupsectionblock[#1]%
  {\getparameters[\??sb#1]}% [#2]

\def\dosetsectionblock[#1]% used to set the default
  {\edef\currentsectionblock{\ctxlua{structures.sections.setblock("#1")}}}

\let\currentsectionblock\empty % was \s!unknown

\unexpanded\def\startsectionblock[#1]%
  {%\ctxlua{structures.counters.check(0)}% we assume sane usage of \page, as this is the only workable place (in push)
   \begingroup
   \edef\currentsectionblock{\ctxlua{structures.sections.pushblock("#1")}}%
   \csname #1true\endcsname % for old times sake
   \setsystemmode\currentsectionblock
   \the\everybeforesectionblock\relax
   \showmessage\m!structures1\currentsectionblock}

\unexpanded\def\stopsectionblock
 {\showmessage\m!structures2\currentsectionblock
  \the\everyaftersectionblock\relax
  \edef\currentsectionblock{\ctxlua{structures.sections.popblock()}}%
  \endgroup}

\long\def\setsectionblockenvironment#1#2%
  {\long\setvalue{\??sb\s!do#1}{\do{#2}}}

\def\getsectionblockenvironment#1%
  {\let\do\firstofoneargument
  %\sectionblockparameter{\s!do#1}}
   \csname\??sb\s!do#1\endcsname}

%D \starttyping
%D \startsectionblockenvironment[frontpart]
%D   \setupnumber[userpage][numberconversion=romannumerals,start=1]
%D \stopsectionblockenvironment
%D
%D \startsectionblockenvironment[bodypart]
%D   \setupnumber[userpage][numberconversion=numbers,start=1]
%D \stopsectionblockenvironment
%D
%D \startsectionblockenvironment[backpart]
%D   \setupnumber[userpage][numberconversion=numbers,start=1]
%D \stopsectionblockenvironment
%D
%D \starttext
%D   \startfrontmatter \chapter{test} \stopfrontmatter
%D   \startbodymatter  \chapter{test} \stopbodymatter
%D   \startappendices  \chapter{test} \stopappendices
%D \stoptext
%D \stoptyping

\setvalue{\e!start\v!sectionblockenvironment}%
  {\dosingleargument\dostartsectionblockenvironment}

\def\dostartsectionblockenvironment[#1]% evt \pushendofline \popendofline
  {\grabuntil{\e!stop\v!sectionblockenvironment}{\setsectionblockenvironment{#1}}}

\protect \endinput