1
2
3
4
5
6
7
8
9
10
11
12
13
14\registerctxluafile{metanod}{}
15
16\unprotect
17
18\defineMPinstance
19 [nodes]
20 [\s!format=metafun,
21 \s!extensions=\v!yes,
22 \s!initializations=\v!yes,
23 \c!method=\s!double]
24
25\defineframed
26 [node]
27 [\c!frame=\v!off]
28
29\defineframed
30 [smallnode]
31 [node]
32 [\c!foregroundstyle=\small]
33
34
35
36
37
38\protect
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\unprotect
80
81\installcorenamespace{metanodes}
82\installcorenamespace{metanodesoption}
83\installcorenamespace{metanodesalternative}
84\installcorenamespace{metanodesposition}
85
86
87
88\installparameterhandler \??metanodes {metanodes}
89\installsetuphandler \??metanodes {metanodes}
90
91\setupmetanodes
92 [\c!option =,
93 \c!alternative =,
94 \c!offset =0,
95 \c!position =,
96 \c!label =,
97 \c!dx =2\emwidth,
98 \c!dy =2\emwidth,
99 \c!rotation =90,
100 \c!rulethickness =.5pt,
101 \c!command =]
102
103\newtoks\t_every_meta_nodes
104\newtoks\t_meta_nodes
105
106
107
108
109\newinteger\c_meta_nodes_n
110
111\permanent\protected\lettonothing\stopnodes
112
113\permanent\tolerant\protected\def\startnodes[#1]#:#2\stopnodes
114 {\hpack\bgroup
115 \setupcurrentmetanodes[#1]
116 \edef\p_meta_option{\metanodesparameter\c!option}
117 \edef\p_meta_alternative{\metanodesparameter\c!alternative}
118 \expand\t_every_meta_nodes
119 \c_meta_nodes_n\zerocount
120 \t_meta_nodes\emptytoks
121 #2\removeunwantedspaces
122
123
124 \clf_grph_nodes_initialize
125 \startMPcode
126 mfun_node_init(
127 \todimension{\metanodesparameter\c!dx},
128 \todimension{\metanodesparameter\c!dy},
129 \metanodesparameter\c!rotation
130 ) ;
131 \the\t_meta_nodes ;
132 mfun_node_flush ;
133 \stopMPcode
134 \clf_grph_nodes_reset
135 \egroup}
136
137\permanent\tolerant\protected\def\grph_nodes_node[#1]#*[#2]
138 {\grph_nodes_node_indeed[#1][#2]}
139
140\def\grph_nodes_node_indeed[#1,#2][#3]#4
141 {\begingroup
142 \setupcurrentmetanodes[#3]
143 \edef\p_label{#4}
144 \edef\p_reference{\metanodesparameter\c!reference}
145 \ifempty\p_reference\else
146 \clf_grph_nodes_register{\p_reference}\c_meta_nodes_n\relax
147 \fi
148 \normalexpanded{\endgroup\noexpand\etoksapp\t_meta_nodes{
149 mfunnodemake(\number#1,\number#2
150 \ifempty\p_label
151 ,""
152 \else
153 ,"\metanodesparameter\c!command{\p_label}"
154 \fi
155 );
156 }}
157 \advanceby\c_meta_nodes_n\plusone}
158
159\permanent\protected\lettonothing\placenode
160
161\appendtoks
162 \enforced\let\placenode\grph_nodes_node
163\to \t_every_meta_nodes
164
165\permanent\tolerant\protected\def\grph_nodes_fromto[#1]#*[#2]
166 {\grph_nodes_fromto_indeed[#1][#2]}
167
168\letcsname\??metanodesposition \endcsname\empty
169\defcsname\??metanodesposition top\endcsname{.top}
170\defcsname\??metanodesposition bottom\endcsname{.bot}
171\defcsname\??metanodesposition left\endcsname{.lft}
172\defcsname\??metanodesposition right\endcsname{.rt}
173\defcsname\??metanodesposition upperleft\endcsname{.ulft}
174\defcsname\??metanodesposition topleft\endcsname{.ulft}
175\defcsname\??metanodesposition lefttop\endcsname{.ulft}
176\defcsname\??metanodesposition upperright\endcsname{.urt}
177\defcsname\??metanodesposition topright\endcsname{.urt}
178\defcsname\??metanodesposition righttop\endcsname{.urt}
179\defcsname\??metanodesposition lowerleft\endcsname{.llft}
180\defcsname\??metanodesposition bottomleft\endcsname{.llft}
181\defcsname\??metanodesposition leftbottom\endcsname{.llft}
182\defcsname\??metanodesposition lowerright\endcsname{.lrt}
183\defcsname\??metanodesposition bottomright\endcsname{.lrt}
184\defcsname\??metanodesposition rightbottom\endcsname{.lrt}
185
186\def\grph_nodes_fromto_indeed[#1,#2][#3]
187 {\begingroup
188 \setupcurrentmetanodes[#3]
189 \edef\p_label {\metanodesparameter\c!label}
190 \edef\p_rulethickness{\metanodesparameter\c!rulethickness}
191 \edef\p_command {\metanodesparameter\c!command}
192 \normalexpanded{\endgroup\noexpand\etoksapp\t_meta_nodes{
193 \ifcsname\??metanodesalternative\metanodesparameter\c!alternative\endcsname
194 \lastnamedcs
195 \else
196 \csname\??metanodesalternative\endcsname
197 \fi
198 \space
199 mfunnodesfromto\begincsname\??metanodesposition\metanodesparameter\c!position\endcsname(
200 \metanodesparameter\c!offset,
201
202 \clf_grph_nodes_resolve{#1},\clf_grph_nodes_resolve{#2}
203 \ifempty\p_label
204 ,""
205 \else
206 ,"\ifempty\p_command\p_label\else\p_command{\p_label}\fi"
207 \fi
208 )
209 \space
210 \ifcsname\??metanodesoption\metanodesparameter\c!option\endcsname
211 \lastnamedcs
212 \else
213 \csname\??metanodesoption\endcsname
214 \fi
215 \space
216 \ifempty\p_rulethickness \else
217 withpen pencircle scaled \todimension{\p_rulethickness}
218 \fi
219 ;
220 }}}
221
222\defcsname\??metanodesalternative \endcsname{draw}
223\defcsname\??metanodesalternative arrow\endcsname{drawarrow}
224\defcsname\??metanodesalternative doublearrow\endcsname{drawdblarrow}
225\defcsname\??metanodesalternative doublearrows\endcsname{drawdoublearrows}
226
227\defcsname\??metanodesoption \endcsname{}
228\defcsname\??metanodesoption dashed\endcsname{dashed evenly}
229\defcsname\??metanodesoption dotted\endcsname{dashed withdots scaled .5}
230
231\permanent\protected\lettonothing\connectnodes
232\permanent\protected\lettonothing\mpcode
233\permanent\protected\lettonothing\nodeMPcode
234
235\appendtoks
236 \enforced\let\connectnodes\grph_nodes_fromto
237\to \t_every_meta_nodes
238
239\permanent\protected\def\grph_nodes_code#1
240 {\etoksapp\t_meta_nodes{#1}}
241
242\appendtoks
243 \enforced\let\nodeMPcode\grph_nodes_code
244 \enforced\let\mpcode \grph_nodes_code
245\to \t_every_meta_nodes
246
247\protect \endinput
248 |