WIP
[newfangle.git] / fangle.ts
blob26fff3c00e8653efae8a8e2673308e4192f1eaf5
1 <TeXmacs|1.0.7.15>
3 <style|source>
5 <\body>
6   <\active*>
7     <\src-title>
8       <src-style-file|fangle|0.5>
10       <\src-purpose>
11         Style to be used in literate programs.
12       </src-purpose>
14       <\src-copyright|2009-2012>
15         Sam Liddicott
16       </src-copyright>
18       <\src-license>
19         This <TeXmacs> style file falls under the <hlink|GNU general public
20         license|$TEXMACS_PATH/LICENSE> and comes WITHOUT ANY WARRANTY
21         WHATSOEVER. If you do not have a copy of the license, then write to
22         the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23         Boston, MA 02111-1307, USA.
24       </src-license>
25     </src-title>
26   </active*>
28   <\active*>
29     <\src-comment>
30       The previous release of newfangle did not embed the \<less\>item\<gtr\>
31       tags within the listing to denote a new line. Instead it used tricks to
32       break the environment contents into lines and enumerated over those and
33       emitting an \<less\>item\<gtr\> tag before each one.
35       Such a technique prevented lines from wrapping when typesetting and
36       also prevented users from inserting soft line-breaks (as they can with
37       normal enumerate environments).
39       For these reasons, a change is made to explicitly use the
40       \<less\>item\<gtr\> tag at the beginning of each line in a listing.
41       When the program is extracted from the document:
43       1. lines that do not begin with \<less\>item\<gtr\> will be joined to
44       the previous line by a single space character.
46       2. if the first line does not begin with \<less\>item\<gtr\> then
48       \ \ \ a. if it is not the first instance of a chunk name, it will be
49       joined to the end of the last line of the previous chunk instance
51       Note: if a line is included in another chunk without starting a new
52       line in the including chunk then the included chunk will not start a
53       new line, regardless of whether or not it is prefixed with
54       \<less\>item\<gtr\>
56       \;
58       This sed will convert <TeXmacs> documents from the old to the new
59       format. Within nf-chunk tags it detects the start of a new entry by the
60       preceding blank line and inserts an \<less\>item\<gtr\> tag. It also
61       inserts an \<less\>item\<gtr\> tag right after the start of the
62       nf-chunk tag as this does not have a blank line.
64       <\verbatim>
65         sed -e '
67         /^[[:space:]]*\<less\>\\/nf-chunk/h
69         /^$/{n;/[^ ]/{x;/^[[:space:]]*\<less\>\\\\nf-chunk/{x;s/[[:space:]]*/
70         \<less\>item\<gtr\>/;x};x}}
72         /^[[:space:]]*\<less\>\\\\nf-chunk/{h;n;s/[[:space:]]*/
73         \<less\>item\<gtr\>/}
75         ' slow.tm
76       </verbatim>
77     </src-comment>
78   </active*>
80   <\active*>
81     <\src-comment>
82       These are our package dependancies
83     </src-comment>
84   </active*>
86   <use-package|std|env|tmdoc-markup>
88   <\active*>
89     <\src-comment>
90       This is a failed attempt to add nf-chunk to the list tag definitions.
91       It does not work and must currently be executed from Tools, Execute,
92       Evaluate Scheme Expression
93     </src-comment>
94   </active*>
96   <extern|(lambda() (define-group enumerate-tag nf-chunk))>
98   <assign|list-of-chunks|<\macro|aux|body>
99     <render-index|List of Code Chunks|<arg|body>>
100   </macro>>
102   <assign|list-of-chunks*|<\macro|aux|name|body>
103     <render-index|<localize|<arg|name>>|<arg|body>>
104   </macro>>
106   <\active*>
107     <\src-comment>
108       The filename macro is intended to format filenames with appropriate
109       visual markup and avoiding confusing insertions of hyphens when the
110       name is split over a line
111     </src-comment>
112   </active*>
114   <assign|filename|<macro|name|<verbatim|<arg|name>>>>
116   <\active*>
117     <\src-comment>
118       The build-in code and verbaitim formats have an unpleasant line spacing
119     </src-comment>
120   </active*>
122   <assign|old-code|<value|code>>
124   <assign|code|<macro|x|<with|par-par-sep|0fn|<compound|old-code|<arg|x>>>>>
126   <assign|old-verbatim|<value|verbatim>>
128   <assign|verbatim|<macro|x|<with|<merge|ov-|<get-label|<arg|x>>>|<macro|x|<old-verbatim|<arg|x>>>|ov-document|<macro|x|<with|par-par-sep|0fn|<small|<old-verbatim|<arg|x>>>>>|<compound|<merge|ov-|<get-label|<arg|x>>>|<arg|x>>>>>
130   <\active*>
131     <\src-comment>
132       This style renders causes hyperlinks to show the URL in a footnote -
133       very useful for printed text and while <TeXmacs> PDF output does not
134       support hyperlink clicking
135     </src-comment>
136   </active*>
138   <assign|old-hlink|<value|hlink>>
140   <assign|hlink|<macro|t|l|<old-hlink|<arg|t>|<arg|l>><if|<greater|<length|<arg|l>>|0>|<\footnote>
141     <old-hlink|<arg|l>|<arg|l>>
142   </footnote>>>>
144   <assign|old-render-footnote|<value|render-footnote>>
146   <assign|render-footnote|<macro|nr|x|<specific|html|\<less\>table
147   width="30%" align="right"\<gtr\>\<less\>tr\<gtr\>\<less\>td\<gtr\>><assign|zz|<arg|nr>><with|footnote-sep|<macro|<specific|html|<value|zz>>.
148   >|<old-render-footnote|<arg|nr>|<arg|x>>><specific|html|\<less\>/td\<gtr\>\<less\>/tr\<gtr\>\<less\>/table\<gtr\>>>>
150   <\active*>
151     <\src-comment>
152       This style makes it easy to render a sequence of keystrokes.
154       TODO: boundry from single-to multiple or back must have an extra space
155     </src-comment>
156   </active*>
158   <assign|keys|<xmacro|args|<with|c|0|m|<length|<map-args|identity|tuple|args>>|<while|<less|<value|c>|<value|m>>|<if|<greater|<value|c>|0>|<if|<greater|<length|<arg|args|<value|c>>>|1>|
159   >><key|<arg|args|<value|c>>><if|<less|<plus|<value|c>|1>|<value|m>>|<if|<and|<greater|<length|<arg|args|<value|c>>>|1>|<not|<greater|<length|<arg|args|<plus|<value|c>|1>>>|1>>>|
160   >><assign|c|<plus|<value|c>|1>>>>>>
162   <\active*>
163     <\src-comment>
164       This style makes it easy to render a fake text insertion point/caret
166       TODO: make it full height. Maybe make it also italic when needed
167     </src-comment>
168   </active*>
170   <assign|look-up-or|<macro|x|i|o|<if|<and|<equal|<get-label|<arg|x>>|tuple>|<greater|<length|<arg|x>>|<arg|i>>>|<look-up|<arg|x>|<arg|i>>|<arg|o>>>>
172   <assign|fake-caret|<macro|<space|0.5spc><with|gr-mode|<tuple|edit|line>|gr-frame|<tuple|scale|1fs|<tuple|0.5gw|0.5gh>>|gr-geometry|<tuple|geometry|3ln|1.5ex|bottom>|gr-color|red|gr-auto-crop|false|<graphics||<with|color|red|<line|<point|0gw|1ln>|<point|1gw|1ln>>>|<with|color|red|<line|<point|0.5gw|1ln>|<point|0.5gw|1gh>>>|<with|color|red|<line|<point|0gw|1gh>|<point|1gw|1gh>>>>><space|0.5spc>>>
174   <assign|sub-page|<macro|x|<with|ornament-color|#eeeeee|ornament-sunny-color|#000000|ornament-shadow-color|#000000|ornament-borderx|2l|ornament-hpadding|2ex|ornament-vpadding|2ex|<ornament|<surround||<htab|0spc>|<indent-both|1cm|1cm|<arg|x>>>>>>>
176   <assign|fake-page-base-name|>
178   <assign|fake-page-make-new-label|<macro|x|<merge|<value|fake-page-base-name>|-|<arg|x>>>>
180   <assign|fake-page-label|<macro|x|<with|the-label|<tuple|<value|the-label>|<value|page-no>>|<quasi|<old-label|<unquote|<fake-page-make-new-label|<arg|x>>>>>>>>
182   <assign|fake-page-pagerefpage|<macro|x|<quasi|<look-up-or|<get-binding|<unquote|<fake-page-make-new-label|<arg|x>>>|0>|1|<uninit>>>>>
184   <assign|fake-page-reference|<macro|x|<quasi|<with|b|<get-binding|<unquote|<fake-page-make-new-label|<arg|x>>>|0>|<compound|look-up-or|<value|b>|0|<uninit>>>>>>
186   <assign|fake-page-environment|<macro|x|<with|old-label|<value|label>|label|<value|fake-page-label>|pagerefpage|<value|fake-page-pagerefpage>|old-reference|<value|reference>|reference|<value|fake-page-reference>|this-page-no|<macro|<value|page-no>>|fake-page-base-name|<merge|fake-page-|<value|doc>|-|<value|page-no>|-|<value|instance>>|<arg|x>>>>
188   <assign|init-or|<macro|x|i|<if|<not|<equal|<uninit>|<arg|x>>>|<arg|x>|<arg|i>>>>
190   <assign|fake-page|<macro|content|doc|page-no|instance|<with|doc|<compound|init-or|<arg|doc>|>|page-no|<compound|init-or|<arg|page-no>|0>|instance|<compound|init-or|<arg|instance>|0>|<sub-page|<fake-page-environment|<arg|content>>>>>>
192   <assign|this-page-no|<macro|<auto-label><get-binding|<the-auto>|1>>>
194   <\active*>
195     <\src-comment>
196       Now, some extensions to standard <TeXmacs> functionality.
198       \ - the get-binding trick to extract a page number is kindly given by
199       Joris who gave us so much already.
201       I would rather ispageref? just made the first test comparing to uninit
202       (the red question mark) so that real but un-placed page refs would
203       still be recognized as a pageref - however I have found documents with
204       stale labels - that no longer exist in the document but which are still
205       stored in the document references section with a target page of ?
207       --- additional note: I have found that stale labels are now not even
208       reverting to ? but retain the last known value. The only fix is to
209       insert \<less\>assign\|save-aux\|false\<gtr\> in the pre-amble and hope
210       that it works (it often doesn't) so that page references are not saved
211       at all but created from scratch each time - avoiding the problem of
212       stale labels as they won't get created!
213     </src-comment>
214   </active*>
216   <assign|ispageref?|<macro|x|<and|<not|<equal|<uninit>|<pagerefpage|<arg|x>>>>|<not|<equal|?|<pagerefpage|<arg|x>>>>>>>
218   <\active*>
219     <\src-comment>
220       Joris tells me:
222       <\verbatim>
223         Page references are links, defined by the following macro:
225         \ \ \ (macro "x"
227         \ \ \ \ \ (locus (id (hard-id (arg "x")))
229         \ \ \ \ \ \ \ \ \ \ \ \ (hyperlink (id (hard-id (arg "x")))
231         \ \ \ \ \ (url (merge "#" (arg "x"))))
233         (get-binding (arg "x") "1")))
234       </verbatim>
236       which leads to this definition if pagerefpage whose job it is to give
237       the page number for a label (as it was last calculated to be).\ 
239       This is useful when constructing our own labels that consist of the
240       page number and a sub-page counter of the target.
241     </src-comment>
242   </active*>
244   <assign|pagerefpage|<macro|x|<get-binding|<arg|x>|1>>>
246   <\active*>
247     <\src-comment>
248       These next macros control how a code chunk is rendered on the screen,
249       and could legitimately be re-defined in the document.
250     </src-comment>
251   </active*>
253   <\active*>
254     <\src-comment>
255       nf-framed-table defines the format of the single cell that used to hold
256       the listing. The listing is no longer defined in a cell, but we still
257       draw top and bottom borders.
259       Currenly we can't draw left and right borders.
260     </src-comment>
261   </active*>
263   <assign|nf-cell-border|0.5ln>
265   <assign|nf-cell-no-border|0.0ln>
267   <assign|nf-cell-top-border|<value|nf-cell-border>>
269   <assign|nf-cell-left-border|<value|nf-cell-border>>
271   <assign|nf-cell-bottom-border|<value|nf-cell-no-border>>
273   <assign|nf-cell-right-border|<value|nf-cell-border>>
275   <\active*>
276     <\src-comment>
277       DEPRACATED: nf-framed-fragment defines the listing to be rendered in a
278       table with a single cell.
279     </src-comment>
280   </active*>
282   <assign|nf-framed-table|<macro|x|<with|color|dark
283   grey|<tformat|<twith|table-width|1par>|<cwith|1|-1|1|-1|cell-hyphen|t>|<cwith|1|-1|1|-1|cell-bsep|1spc>|<cwith|1|-1|1|-1|cell-tsep|1spc>|<cwith|1|-1|1|-1|cell-background|white>|<cwith|1|-1|1|-1|cell-lborder|<value|nf-cell-left-border>>|<cwith|1|-1|1|-1|cell-rborder|<value|nf-cell-right-border>>|<cwith|1|-1|1|-1|cell-bborder|<value|nf-cell-bottom-border>>|<cwith|1|-1|1|-1|cell-tborder|<value|nf-cell-top-border>>|<arg|x>>>>>
285   <\active*>
286     <\src-comment>
287       DEPREACTED: nf-framed-fragment defines the listing to be rendered in a
288       table with a single cell.\ 
290       As we currently use \<less\>wide-underlined\<gtr\> or
291       \<less\>wide-bothlined\<gtr\> to draw the lines this is done on lines
292       before and after the listing by underlining the header and a following
293       blank line, so nf-framed-fragment is currently null.
294     </src-comment>
295   </active*>
297   <assign|nf-framed-fragment-old|<macro|x|<nf-framed-table|<tformat|<table|<row|<\cell>
298     <with|color|black|<arg|x>>
299   </cell>>>>>>>
301   <assign|nf-framed-fragment|<macro|x|<arg|x>>>
303   <\active*>
304     <\src-comment>
305       This is how top and bottom borders are drawn using solid or jagged
306       lines - it needs reworking, its a horrid hack with repeated code. \ 
307     </src-comment>
308   </active*>
310   <assign|nf-jag-top|<macro|<with|gr-geometry|<tuple|geometry|0.25fn|1fn>|gr-mode|<tuple|edit|line>|gr-frame|<tuple|scale|1cm|<tuple|0gw|1gh>>|gr-line-width|0.5ln|<graphics||<line|<point|0gw|-0.4gh>|<point|0.5gw|-0.25gh>|<point|1gw|-0.4gh>>>>>>
312   <assign|nf-jag-bottom|<macro|<with|gr-geometry|<tuple|geometry|0.25fn|1bls>|gr-mode|<tuple|edit|line>|gr-frame|<tuple|scale|1cm|<tuple|0gw|1gh>>|gr-line-width|1ln|<graphics||<line|<point|0gw|0.5gh>|<point|0.5gw|0.35gh>|<point|1gw|0.5gh>>>>>>
314   <assign|nf-jags-top|<macro|x|<repeat|<arg|x>|<nf-jag-top>>>>
316   <assign|nf-jags-bottom|<macro|x|<repeat|<arg|x>|<nf-jag-bottom>>>>
318   <assign|nf-jagit-top|<macro|body|<datoms|<macro|x|<nf-jags-top|<arg|x>>>|<surround||<htab|5mm*|last><vspace*|1sep>|<arg|body>>>>>
320   <assign|nf-jagit-bottom|<macro|body|<datoms|<macro|x|<nf-jags-bottom|<arg|x>>>|<surround||<htab|5mm*|last><vspace*|1sep>|<arg|body>>>>>
322   <assign|nf-top-border-line|<macro|body|<wide-underlined|<value|nf-cell-border>|1ln|<arg|body>>>>
324   <assign|nf-top-border-jags|<macro|body|<nf-jagit-top|<arg|body>>>>
326   <assign|nf-top-border-true|<macro|body|<nf-top-border-line|<arg|body>>>>
328   <assign|nf-top-border-false|<macro|body|<nf-top-border-jags|<arg|body>>>>
330   <assign|nf-top-border|<macro|first|body|<compound|<merge|nf-top-border-|<arg|first>>|<arg|body>>>>
332   <assign|nf-bottom-border-line|<macro|body|<wide-bothlined|<value|nf-cell-border>|0ln|1ln|0ln|<arg|body>>>>
334   <assign|nf-bottom-border-jags|<macro|body|<nf-jagit-bottom|<arg|body>>>>
336   <assign|nf-bottom-border-true|<macro|body|<nf-bottom-border-line|<arg|body>>>>
338   <assign|nf-bottom-border-false|<macro|body|<nf-bottom-border-jags|<arg|body>>>>
340   <assign|nf-bottom-border|<macro|first|body|<compound|<merge|nf-bottom-border-|<arg|first>>|<arg|body>>>>
342   <\active*>
343     <\src-comment>
344       prog-f renders a body in prog mode with specified language and without
345       a ghastly par-par-sep
346     </src-comment>
347   </active*>
349   <assign|prog-f|<macro|lang|body|<with|mode|prog|prog-language|<arg|lang>|<with|par-par-sep|0fn|<arg|body>>>>>
351   <\active*>
352     <\src-comment>
353       nf-border-if takes a boolean and then returns a correct width to show
354       (or not show) a border -- either as a table sell or a wide-underlined
355     </src-comment>
356   </active*>
358   <assign|nf-border-if|<macro|x|<if|<arg|x>|<value|nf-cell-border>|<value|nf-cell-no-border>>>>
360   <\active*>
361     <\src-comment>
362       ???prog-fragment is the top level macro used for rendering a listing
363       (without line numbers). It renders prog-f within a framed fragment.
364     </src-comment>
365   </active*>
367   <assign|prog-fragment|<\macro|name|lang|x>
368     <with|nf-cell-top-border|<nf-border-if|<compound|nf-first-chunklet?|<arg|name>>>|nf-cell-bottom-border|<nf-border-if|<nf-last-chunklet?|<arg|name>>>|<nf-framed-fragment|<compound|prog-f|<arg|lang>|<arg|x>>>>
369   </macro>>
371   <assign|nf-pf|<macro|name|lang|x|<nf-framed-fragment|<prog-f|<arg|lang>|<arg|x>>>>>
373   <\active*>
374     <\src-comment>
375       ???Numbering the listing
376     </src-comment>
377   </active*>
379   <assign|nflp|<macro|x|<arg|x>>>
381   <\active*>
382     <\src-comment>
383       Forgot what nf-chunk is for
384     </src-comment>
385   </active*>
387   <new-counter|nf-chunk>
389   <\active*>
390     <\src-comment>
391       The noweb format that we follow names listings after the page number
392       followed by an alpha-counter that is reset on each page; e.g. 12a then
393       12b, 12c and then on page 13 back to 13a
395       As there is no trigger called on a new page that can help us, we
396       instead store the page number as we process each chunk so that we can
397       tell when a chunk is on a different page to the previous chunk --- in
398       order to reset the alpha-counter.
399     </src-comment>
400   </active*>
402   <assign|nf-page|0>
404   <\active*>
405     <\src-comment>
406       Chunks have a name which is provided by the user, but more than one
407       chunk can have the same name. These are called chunklets of the same
408       chunk.
410       Although chunklets have the same name, they have a different id, which
411       is the name with a specified prefix, and a suffix which is the chunklet
412       sequence number.
414       nf-chunk-id computes a chunk id from a fixed "code-" namespace, a
415       supplied "tag" namespace name, the name and the chunklet number
416     </src-comment>
417   </active*>
419   <assign|nf-base|<macro|x|<if|<provides|fake-page-base-name>|<merge|<value|fake-page-base-name>|-|<arg|x>>|<arg|x>>>>
421   <assign|zog|<xmacro|x|<quasi|<if|<and|<provides|fake-page-base-name>|<greater|<length|<value|fake-page-base-name>>|0>>|<merge|<value|fake-page-base-name>|-|<unquote*|<quote-arg|x>>>|<merge|<unquote*|<quote-arg|x>>>>>>>
423   <assign|nf-chunk-id|<macro|name|tag|n|<merge|<nf-base|code->|<arg|tag>|-|<unquote|<arg|name>>|-|<arg|n>>>>
425   <\active*>
426     <\src-comment>
427       nf-this-chunk-id is a convenience that uses the counter for the current
428       chunklet. (Each chunk has it's own counter to count it's chunklets)
430       ???Possibly unquote should be used by the called and not here
431     </src-comment>
432   </active*>
434   <assign|nf-this-chunk-id|<macro|name|tag|<nf-chunk-id|<arg|name>|<arg|tag>|<compound|<merge|the-code-chunk-|<unquote|<arg|name>>>>>>>
436   <\active*>
437     <\src-comment>
438       Simple way to discover if we are processing the first chunklet of a
439       named chunk - by checking it's chunklet counter.
440     </src-comment>
441   </active*>
443   <assign|nf-first-chunklet?|<macro|name|<equal|<compound|<merge|the-code-chunk-|<unquote|<arg|name>>>>|1>>>
445   <\active*>
446     <\src-comment>
447       Simple way to discover if we are processing the last chunklet of a
448       named chunk - by checking if there is a chunklet with an increased
449       counter
450     </src-comment>
451   </active*>
453   <assign|nf-last-chunklet?|<macro|name|<not|<nf-chunklet-exists?|<nf-next-chunk-id|<arg|name>>>>>>
455   <\active*>
456     <\src-comment>
457       Simple way to discover if a chunklet (probably) exists - which is
458       needed to know if we should show a forward reference to the next
459       chunklet. As each chunklet defines a label, we just need to check if
460       there is a pageref to that label.
461     </src-comment>
462   </active*>
464   <assign|nf-chunklet-exists?|<macro|id|<ispageref?|<arg|id>>>>
466   <\active*>
467     <\src-comment>
468       nf-nav renders the links to the previous and next chunklets of this
469       chunk (if they exist).
471       Looks like this: <math|\<vartriangleleft\>>7b
472       7d<math|\<vartriangleright\>>
473     </src-comment>
474   </active*>
476   <assign|nf-prev-chunk-id|<macro|name|<nf-chunk-id|<arg|name>|ref|<minus|<compound|<merge|the-code-chunk-|<unquote|<arg|name>>>>|1>>>>
478   <assign|nf-next-chunk-id|<macro|name|<nf-chunk-id|<arg|name>|ref|<plus|<compound|<merge|the-code-chunk-|<unquote|<arg|name>>>>|1>>>>
480   <assign|fangle-nav-left|<math|\<vartriangleleft\>>>
482   <assign|fangle-nav-up|<math|\<vartriangle\>>>
484   <assign|fangle-nav-down|<math|\<triangledown\>>>
486   <assign|fangle-nav-right|<math|\<vartriangleright\>>>
488   <assign|render-fangle-nav|<style-with|src-compact|none|<macro|<style-with|src-compact|all|<if|<not|<equal|<length|<value|prev_label>>|0>>|<value|prev><value|prev_label>><style-with|src-compact|all|<if|<not|<equal|<length|<value|next_label>>|0>>|
489   <value|next_label><value|next>>>>>>>
491   <assign|fangle-nav|<style-with|src-compact|none|<\macro|name>
492     <with|prev|<if|<equal|<pagerefpage|<nf-prev-chunk-id|<arg|name>>>|<pagerefpage|<nf-this-chunk-id|<arg|name>|label>>>|<math|\<vartriangle\>>|<math|\<vartriangleleft\>>>|prev_label|<if|<not|<nf-first-chunklet?|<arg|name>>>|<reference|<nf-prev-chunk-id|<arg|name>>>>|next|<if|<not|<nf-last-chunklet?|<arg|name>>>|<if|<equal|<pagerefpage|<nf-next-chunk-id|<arg|name>>>|<pagerefpage|<nf-this-chunk-id|<arg|name>|label>>>|<math|\<triangledown\>>|<math|\<vartriangleright\>>>>|next_label|<if|<not|<nf-last-chunklet?|<arg|name>>>|
493     <reference|<nf-next-chunk-id|<arg|name>>>>|<render-fangle-nav>>
495     <style-with|src-compact|all|>
496   </macro>>>
498   <assign|xnf-nav|<style-with|src-compact|none|<macro|name|<style-with|src-compact|all|<if|<not|<nf-first-chunklet?|<arg|name>>>|<if|<equal|<pagerefpage|<nf-prev-chunk-id|<arg|name>>>|<pagerefpage|<nf-this-chunk-id|<arg|name>|label>>>|<math|\<vartriangle\>>|<math|\<vartriangleleft\>>><reference|<nf-prev-chunk-id|<arg|name>>>>><if|<nf-chunklet-exists?|<nf-next-chunk-id|<arg|name>>>|
499   <reference|<nf-next-chunk-id|<arg|name>>><if|<equal|<pagerefpage|<nf-next-chunk-id|<arg|name>>>|<pagerefpage|<nf-this-chunk-id|<arg|name>|label>>>|<math|\<triangledown\>>|<math|\<vartriangleright\>>>>>>>
501   <\active*>
502     <\src-comment>
503       nf-header renders the single line header before the listing. It lists
504       the reference of this chunk which is the-label (already estiablished by
505       nf-chunk-init) along with the chunk name and language, the chunklet
506       number and a reference to the first chunklet with the same name, and
507       also the chunklet navigation.
509       Like this:\ 
510     </src-comment>
511   </active*>
513   <assign|render-fangle-header|<macro|name|lang|args|<shift|<resize|<specific-verbatim|\<#000A\>><value|chunk_label>
514   |||0fn|>|-2.0fn|><nv-langle><with|color|blue|<arg|name>>[<value|chunk_no><style-with|src-compact|none|]><if|<not|<equal|<value|chunk_no>|1>>|<if|<not|<equal|<length|<arg|args>>|0>>|(<with|nf-render-commas|<macro|x|<arg|x>>|<nf-commas|<arg|args>>>)>
515   <math|\<Uparrow\>><value|first_chunk_label>|(<nf-commas|<arg|args>>)>,
516   lang=<with|color|blue|<arg|lang>><nv-rangle>
517   <math|<if|<not|<equal|<value|chunk_no>|1>>|+>\<equiv\>>>>
519   <drd-props|render-fangle-header|accessible|all>
521   <assign|if-provides|<macro|x|<if|<provides|<arg|x>>|<arg|x>>>>
523   <assign|fangle-header|<macro|name|lang|args|<render-fangle-header|<arg|name>|<arg|lang>|<arg|args>|<if-provides|<compound|<merge|the-code-chunk-|<unquote|<arg|name>>>>>|<value|the-label>>>>
525   <assign|draw-fangle-header|<macro|name|lang|args|chunk_no|chunk_label|first_chunk_label|prev|prev_label|next|next_label|<with|name|<arg|name>|lang|<arg|lang>|args|<arg|args>|chunk_no|<arg|chunk_no>|chunk_label|<arg|chunk_label>|first_chunk_label|<arg|first_chunk_label>|prev|<arg|prev>|prev_label|<arg|prev_label>|next_label|<arg|next_label>|next|<arg|next>|<render-fangle-header><htab|0pt><render-fangle-nav>>>>
527   <assign|nf-pad|<macro|w|<if|<not|<less|<arg|w>|1>>|
528   <nf-pad|<minus|<arg|w>|1>>>>>
530   <assign|nf-header|<macro|name|lang|args|<shift|<resize|<specific-verbatim|\<#000A\>><value|the-label>
531   |||0fn|>|-2.0fn|><nv-langle><with|color|blue|<arg|name>>[<compound|<merge|the-code-chunk-|<unquote|<arg|name>>>><style-with|src-compact|none|]><if|<not|<nf-first-chunklet?|<arg|name>>>|<if|<not|<equal|<value|<merge|code-args-|<unquote|<arg|name>>>>|<uninit>>>|(<with|nf-render-commas|<macro|x|<arg|x>>|<nf-commas|<value|<merge|code-args-|<unquote|<arg|name>>>>>>)>
532   <math|\<Uparrow\>><reference|<nf-chunk-id|<arg|name>|ref|1>>|(<nf-commas|<arg|args>>)>,
533   lang=<with|color|blue|<arg|lang>><nv-rangle>
534   <math|<if|<not|<nf-first-chunklet?|<arg|name>>>|+>\<equiv\>><htab|0pt><fangle-nav|<arg|name>>>>
536   <assign|nf-header|<macro|name|lang|args|<with|chunk_label|<value|the-label>|chunk_no|<compound|<merge|the-code-chunk-|<unquote|<arg|name>>>>|first_chunk_label|<reference|<nf-chunk-id|<arg|name>|ref|1>>|<fangle-header|<arg|name>|<arg|lang>|<if|<not|<equal|<value|<merge|code-args-|<unquote|<arg|name>>>>|<uninit>>>|<nf-commas|<value|<merge|code-args-|<unquote|<arg|name>>>>>|<arg|args>>><htab|0pt><xnf-nav|<arg|name>>>>>
538   <assign|nf-render-commas|<macro|x|<with|color|blue|<arg|x>>>>
540   <assign|nf-commas|<macro|items|<if|<equal|<get-label|<arg|items>>|tuple>|<if|<less|<length|<arg|items>>|1>|<arg|items><specific-verbatim|\<#000B\>>|<nf-render-commas|<look-up|<arg|items>|0>><if|<greater|<length|<arg|items>>|1>|<specific-verbatim|\<#000B\>>,
541   <nf-commas|<range|<arg|items>|1|<length|<arg|items>>>>|<specific-verbatim|\<#000B\>>>>|<arg|items><if|<not|<equal|<length|<arg|items>>|0>>|<specific-verbatim|\<#000B\>>>>>>
543   <drd-props|nf-commas|accessible|all>
545   <assign|nf-commaxy|<macro|x|, (<arg|x>)>>
547   <assign|nf-commax|<xmacro|args|[<arg|args|0><map-args|nf-commaxy|concat|args|1>]>>
549   <assign|bla|<xmacro|args|<arg|args|0>:<arg|args|1>(<arg|args>)>>
551   <\active*>
552     <\src-comment>
553       nf-gather is an attempt to remember each named chunk so that it can
554       optionally be expanded in-place in other chunks. It's a poor attempt
555       and only works for forward uses. Such expansion should be compined with
556       over-brace or side-brace decoration of the included chunk, and also
557       requires that the inline continuation after the expanded chunk continue
558       from the baseline of the expanded chunk instead of the baseline before
559       the expanded chunk was included.
560     </src-comment>
561   </active*>
563   <assign|nf-gather|<macro|name|x|lang|<if|<provides|<arg|name>>|<assign|<unquote|<arg|name>>|<value|<arg|name>><unquote|<arg|x>>>|<assign|<unquote|<arg|name>>|<quote|<arg|x>>>>>>
565   <\active*>
566     <\src-comment>
567       nf-chunk-new is called by nf-chunk-init for the first chunklet of a
568       given chunk name - it defines a chunklet counter and a line number
569       counter
570     </src-comment>
571   </active*>
573   <assign|nf-chunk-new|<macro|name|args|<quasi|<new-counter|<merge|code-chunk-|<unquote|<arg|name>>>><new-counter|<merge|code-line-|<unquote|<arg|name>>>><assign|<unquote|<merge|code-item-|<arg|name>>>|<macro|<compound|<unquote|<merge|next-code-line-|<arg|name>>>><render-item|<compound|<unquote|<merge|the-code-line-|<arg|name>>>>>>><compound|<merge|inc-code-chunk-|<unquote|<arg|name>>>><assign|<merge|code-args-|<unquote|<arg|name>>>|<arg|args>>><write|nf-chunk|<tuple|<tuple|<arg|name>>|<reference|<nf-this-chunk-id|<arg|name>|ref>>>>>>
575   <\active*>
576     <\src-comment>
577       nf-chunk-next is called by nf-chunk-init for the additional chunklets
578       of a given chunk name. \ It increments the chunklet counter
579     </src-comment>
580   </active*>
582   <assign|nf-chunk-next|<macro|name|<compound|<merge|inc-code-chunk-|<unquote|<arg|name>>>><write|nf-chunk|<tuple|<tuple|<arg|name>>|<reference|<nf-this-chunk-id|<arg|name>|ref>>>>>>
584   <\active*>
585     <\src-comment>
586       nf-check-page uses the label defined in nf-chunk-label to get the
587       number of the page containing this chunk to compare to nf-page (the
588       number of the page containing the previous chunk) to see if this chunk
589       is the first chunk on a page. If so, then the nf-chunk alpha counter is
590       reset, otherwise it is increased.
591     </src-comment>
592   </active*>
594   <assign|nf-check-page|<macro|name|<if|<not|<equal|<value|nf-page>|<pagerefpage|<nf-this-chunk-id|<arg|name>|label>>>>|<reset-nf-chunk><inc-nf-chunk><assign|nf-page|<pagerefpage|<nf-this-chunk-id|<arg|name>|label>>>|<inc-nf-chunk>>>>
596   <\active*>
597     <\src-comment>
598       ???????? Review from here onwards
599     </src-comment>
600   </active*>
602   <\active*>
603     <\src-comment>
604       nf-chunk-ref defines labels and label text so that we can generate
605       references to chunklets in the form
606       \<less\>PAGENO\<gtr\>\<less\>the-nf-chunk\<gtr\> \ e.g. 17a then 17b
607       etc.
609       The label text is stored in the-chunk-label which is used by XXX. It
610       then creates a label (with the tag ref) of the form code-ref-NAME-NO
611       which is a bit long winded to use with \<less\>reference\|...\<gtr\>
612       and so \<less\>chunk-reference\|...\<gtr\> is provided to help.
614       The ref tagged label is to be used in preference to the label-tagged
615       label created in nf-chunk-label whose only purpose is to find out what
616       page a chunk starts on so that the chunk ref label can be created
617     </src-comment>
618   </active*>
620   <assign|nf-chunk-ref|<macro|name|<nf-check-page|<arg|name>><assign|the-chunk-label|<pagerefpage|<nf-this-chunk-id|<arg|name>|label>><number|<the-nf-chunk>|alpha>><assign|the-label|<value|the-chunk-label>><label|<nf-this-chunk-id|<arg|name>|ref>>>>
622   <\active*>
623     <\src-comment>
624       There seems to be no \<less\>specific\|...\<gtr\> tag for verbatim
625       exports, so we use specific-verbatim. The body is not visible except in
626       text exports.
627     </src-comment>
628   </active*>
630   <assign|specific-verbatim|<macro|x|<clipped|<arg|x>|0|0|0|0>>>
632   <\active*>
633     <\src-comment>
634       except-specific-verbatim is intended to output in all forms except
635       verbatim. This is used because some entities do not have a text
636       representation --- like \<less\>langle\<gtr\> and the fall-back
637       representation is ugly. This macro does not work in page headers, the
638       \<less\>if*\|false\|body\<gtr\> fails to leave the correct space
639     </src-comment>
640   </active*>
642   <assign|except-specific-verbatim|<macro|body|<specific|screen|<arg|body>><specific|printer|<arg|body>><if*|false|<arg|body>>>>
644   <\active*>
645     <\src-comment>
646       nv-langle-subst and lv-rangle-subst define characters that should be
647       output in verbatim mode instead of langle and rangle which would
648       otherwise be output as the literal text rangle and langle
649     </src-comment>
650   </active*>
652   <assign|nv-langle-subst|\<less\>>
654   <assign|nv-rangle-subst|\<gtr\>>
656   <\active*>
657     <\src-comment>
658       nv-langle and nv-rangle are macros that can be used to generate a
659       langle and rangle exceot in text mode were they use the subst
660       characters \<less\> and \<gtr\>
661     </src-comment>
662   </active*>
664   <assign|nv-langle|<macro|<except-specific-verbatim|<with|mode|math|<left|langle>>><specific-verbatim|<value|nv-langle-subst>>>>
666   <assign|nv-rangle|<macro|<except-specific-verbatim|<with|mode|math|<right|rangle>>><specific-verbatim|<value|nv-rangle-subst>>>>
668   <\active*>
669     <\src-comment>
670       nv-render-line-no renders the line numbers for listings in a way that
671       is suitable for typeset and also verbatim export.
672     </src-comment>
673   </active*>
675   <assign|nf-render-line-no|<macro|x|<with|mode|text|par-mode|right|<with|font-family|tt|<with|font-base-size|6|<specific-verbatim|<nf-pad|<minus|3|<length|<value|item-nr>>>>><aligned-space-item|<arg|x>><specific-verbatim|\|
676   >>>><nf-bar>>>
678   <\active*>
679     <\src-comment>
680       A chunklabel is of the form [chunkaname chunkno] e.g. [main.c 1] but
681       it's main purpose is not decorative or visual but as a means to
682       discover the page number containing this chunk so that it can be used
683       by nf-chunk-ref.
684     </src-comment>
685   </active*>
687   <assign|nf-chunk-label|<macro|name|<assign|nf-last-chunk|<arg|name>><assign|the-label|[<arg|name>
688   <compound|<merge|the-code-chunk-|<unquote|<arg|name>>>>]><label|<nf-this-chunk-id|<arg|name>|label>>>>
690   <\active*>
691     <\src-comment>
692       nf-chunk-init is called at the start of nf-chunk to create all
693       neccessary counters and labels. The
694       \<less\>provides\|\<less\>merge\|code-chunk-\|\<less\>unquote\|name\<gtr\>\|-nr\<gtr\>\<gtr\>
695       test could be replaced by some more canonical way to discover if a
696       chunk or chunk counter is defined. It's old code and I don't want to
697       change it now.
698     </src-comment>
699   </active*>
701   <assign|nf-chunk-init|<macro|name|args|<with|nf-same-chunk|<equal|<value|nf-last-chunk>|<arg|name>>|<if|<not|<provides|<merge|code-chunk-|<unquote|<arg|name>>|-nr>>>|<nf-chunk-new|<arg|name>|<arg|args>>|<nf-chunk-next|<arg|name>>><nf-chunk-label|<arg|name>><nf-chunk-ref|<arg|name>><assign|nf-continues|<and|<value|nf-same-chunk>|<not|<equal|<number|<the-nf-chunk>|alpha>|a>>>>>>>
703   <\active*>
704     <\src-comment>
705       nf-chunk-outit is called at the end of nf-chunk mainly to create a
706       label so that we can see if the chunk ended on the same page it began.\ 
707     </src-comment>
708   </active*>
710   <assign|nf-chunk-outit|<macro|name|<label|<nf-this-chunk-id|<arg|name>|end>>>>
712   <\active*>
713     <\src-comment>
714       These macros output either a solid line ________ or a torn-paper-line
715       /\\/\\/\\ at the top and bottom of listins in verbatim mode, to signify
716       if the chunk continues or ends with this chunklet
717     </src-comment>
718   </active*>
720   <assign|nf-jags|<macro|<datoms|<macro|x|<repeat|<arg|x>|<with|gr-geometry|<tuple|geometry|2mm|5mm|center>|gr-mode|<tuple|edit|line>|gr-frame|<tuple|scale|1cm|<tuple|0.589991gw|0.5gh>>|<graphics||<line|<point|0mm|0mm>|<point|1mm|1mm>|<point|2mm|0mm|>>>>>>|<htab|5mm*|last>>>>
722   <assign|nf-bar|<macro|>>
724   <assign|nf-barx|<macro|<merge|<times|<value|font-base-size>|<value|font-size>>|pt><with|gr-geometry|<tuple|geometry|2mm|<merge|<times|<value|font-base-size>|<value|font-size>|1>|pt>|center>|gr-mode|<tuple|edit|line>|line-width|8ln|<graphics||<line|<point|0mm|0mm>|<point|0mm|30pt>>>>>>
726   <assign|nf-verbatim-top|<macro|new|<if|<arg|new>|<specific-verbatim|
727   \ \ \ \ \ ________________________________________________________________________>|<specific-verbatim|
728   \ \ \ \ ./\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\>>>>
730   <assign|nf-verbatim-bottom|<macro|new|<if|<arg|new>|<specific-verbatim|
731   \ \ \ \ \|________________________________________________________________________>|<specific-verbatim|
732   \ \ \ \ \|/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\>>>>
734   <\active*>
735     <\src-comment>
736       nf-chunk is the first public macro. It shows a named listing with all
737       the trimmings.\ 
739       We used to disable the full header if previous chunk on this page had
740       same name and this is not the first chunk on a page
741     </src-comment>
742   </active*>
744   <assign|nf-use-page-header|<macro|h|<set-this-page-header|<value|page-even-header>>>>
746   <assign|nf-use-page-header|<macro|h|<set-this-page-header|<arg|h>>>>
748   <assign|nf-chunk|<macro|name|x|lang|args|<with|the-label||xnv-langle-subst||xnv-rangle-subst||nf-name|<unquote|<arg|name>>|y|<value|pob>|<small|<surround|<aligned-space-item|><nf-chunk-init|<arg|name>|<arg|args>><wide-underlined|<nf-border-if|<nf-first-chunklet?|<value|nf-name>>>|1ln|<no-page-break*><label|<arg|name>><small|<nf-header|<arg|name>|<arg|lang>|<arg|args>>><no-page-break>>|<if|<nf-last-chunklet?|<value|nf-name>>|<wide-bothlined|<nf-border-if|<nf-last-chunklet?|<value|nf-name>>>|0ln|1ln|0ln|<if|<nf-first-chunklet?|<value|nf-name>>|<nf-show-used-by>><htab|5mm*|last>>|<if|<nf-first-chunklet?|<value|nf-name>>|<nf-show-used-by>>>|<\with|item|<value|<merge|code-item-|<unquote|<arg|name>>>>|item-vsep|0fn|current-item|<value|nf-render-line-no>|transform-item|<value|identity>>
749     <\surround||<nf-chunk-outit|<arg|name>><if|<and|<not|<equal|<value|nf-page>|<pagerefpage|<nf-this-chunk-id|<arg|name>|end>>>>|<ispageref?|<nf-this-chunk-id|<arg|name>|end>>>|<nf-use-page-header|<with|nv-langle|<macro|<with|mode|math|<left|langle>>>|nv-rangle|<macro|<with|mode|math|<right|rangle>>>|<small|<nf-header|<arg|name>|<arg|lang>|<arg|args>>>>>>>
750       <no-page-break><nf-verbatim-top|<nf-first-chunklet?|<value|nf-name>>>
752       <with|nv-langle-subst|\S|nv-rangle-subst|\T|nf-current-chunk|<arg|name>|<nf-pf|<value|nf-name>|<arg|lang>|<arg|x>>>
754       <no-page-break*><if|<nf-last-chunklet?|<value|nf-name>>|<assign|<merge|code-line-|<value|nf-name>|-nr>|0>><nf-verbatim-bottom|<nf-last-chunklet?|<value|nf-name>>>
755     </surround>
756   </with>>>>>>
758   <assign|nf-chunkl|<macro|name|x|lang|args|<with|the-label||xnv-langle-subst||xnv-rangle-subst||nf-name|<unquote|<arg|name>>|y|<value|pob>|||<small|<\surround|<nf-chunk-init|<arg|name>|<arg|args>><label|<arg|name>><no-page-break*><small|<nf-top-border|<nf-first-chunklet?|<value|nf-name>>|<nf-header|<arg|name>|<arg|lang>|<arg|args>>>><no-page-break>|<nf-bottom-border|<nf-last-chunklet?|<value|nf-name>>|<htab|5mm*|last>>>
759     <\with|item|<value|<merge|code-item-|<unquote|<arg|name>>>>|item-vsep|0fn|current-item|<value|nf-render-line-no>|transform-item|<value|identity>>
760       <\surround||<nf-chunk-outit|<arg|name>><if|<and|<not|<equal|<value|nf-page>|<pagerefpage|<nf-this-chunk-id|<arg|name>|end>>>>|<ispageref?|<nf-this-chunk-id|<arg|name>|end>>>|<nf-use-page-header|<with|nv-langle|<macro|<with|mode|math|<left|langle>>>|nv-rangle|<macro|<with|mode|math|<right|rangle>>>|<small|<nf-header|<arg|name>|<arg|lang>|<arg|args>>>>>>>
761         <no-page-break><nf-verbatim-top|<nf-first-chunklet?|<value|nf-name>>>
763         <with|nv-langle-subst|\S|nv-rangle-subst|\T|<nf-pf|<value|nf-name>|<arg|lang>|<arg|x>>>
765         <if|<nf-last-chunklet?|<value|nf-name>>|<assign|<merge|code-line-|<value|nf-name>|-nr>|0>>
766       </surround>
767     </with>
768   </surround>>>>>
770   <assign|nf-fake-chunk|<macro|name|x|lang|args|chunk_no|chunk_label|chunk_first_label|prev|prev_label|next|next_label|line-no|<with|the-label||xnv-langle-subst||xnv-rangle-subst||nf-name|<unquote|<arg|name>>|chunk_no|<arg|chunk_no>|chunk_label|<arg|chunk_label>|first_chunk_label|<arg|chunk_first_label>|prev|<arg|prev>|prev_label|<arg|prev_label>|next|<arg|next>|next_label|<arg|next_label>|<small|<surround|<aligned-space-item|><wide-underlined|<nf-border-if|<equal|<value|chunk_no>|1>>|1ln|<no-page-break*><small|<render-fangle-header|<arg|name>|<arg|lang>|<arg|args>><htab|0pt><render-fangle-nav>><no-page-break>>|<if|<equal|<length|<value|next>>|0>|<wide-bothlined|<nf-border-if|<equal|<length|<value|next>>|0>>|0ln|1ln|0ln|<htab|5mm*|last>>|<nf-jags>>|<\with|xitem|<arg|line-no>|item-nr|0|item-vsep|0fn|current-item|<value|nf-render-line-no>|transform-item|<value|identity>>
771     <no-page-break><nf-verbatim-top|<nf-first-chunklet?|<value|nf-name>>>
773     <with|nv-langle-subst|\S|nv-rangle-subst|\T|<nf-pf|<value|nf-name>|<arg|lang>|<arg|x>>>
775     <no-page-break*><if|<nf-last-chunklet?|<value|nf-name>>|<assign|<merge|code-line-|<value|nf-name>|-nr>|0>><nf-verbatim-bottom|<nf-last-chunklet?|<value|nf-name>>>
776   </with>>>>>>
778   <new-list|nfl|<value|aligned-dot-item>|<value|identity>>
780   <drd-props|nf-chunk|accessible|all>
782   <drd-props|nf-fake-chunk|accessible|all>
784   <assign|nf-comment|<macro|x|<with|mode|text|<specific-verbatim|/*
785   ><arg|x><specific-verbatim| */>>>>
787   <\active*>
788     <\src-comment>
789       nf-ref is the second public macro. It may be inserted into a chunk
790       listing to signify that another listing should be included at that
791       point. As \\ doesn't work in listings you'll have to type meta-\\ \ 
793       This will become an xmacro or something so that it can take optional
794       arguments (like C macros) which will be expanded when the programs are
795       extracted.
796     </src-comment>
797   </active*>
799   <assign|nf-ref|<style-with|src-compact|none|<macro|name|args|<if|<and|<provides|nf-current-chunk>|<not|<equal|<uninit>|<value|nf-current-chunk>>>|<not|<equal|?|<value|nf-current-chunk>>>>|<nf-used-by-chunk|<arg|name>|<nf-chunk-id|<value|nf-current-chunk>|ref|1>><write|nf-chunk|<tuple|<tuple|<arg|name>|Used
800   by>|<reference|<nf-chunk-id|<value|nf-current-chunk>|ref|1>>>>|<auto-label><write|nf-chunk|<tuple|<tuple|<arg|name>|Mentioned>|<nf-render-used-by|<the-auto>>>>><nv-langle><arg|name><if|<and|<or|<equal|<get-label|<arg|args>>|tuple>|<equal|<get-label|<arg|args>>|string>>|<greater|<length|<arg|args>>|0>>|<specific-verbatim|\<#000B\>>(<if|<equal|<get-label|<arg|args>>|tuple>|<nf-commas|<arg|args>>|<with|color|blue|<arg|args>>>)|<phantom|(><arg|args>>
801   <reference|<nf-chunk-id|<arg|name>|ref|1>><nv-rangle><flag|<arg|name>|red><if|<equal|0|1>|<compound|<quote-arg|name>>>>>>
803   <assign|nf-fake-ref|<style-with|src-compact|none|<macro|name|args|ref|<nv-langle><arg|name><if|<equal|<get-label|<arg|args>>|tuple>|<specific-verbatim|\<#000B\>>(<nf-commas|<arg|args>>)>
804   <arg|ref><nv-rangle><flag|<arg|name>|red><if|<equal|0|1>|<compound|<quote-arg|name>>>>>>
806   <drd-props|nf-ref|accessible|all>
808   <drd-props|nf-fake-ref|accessible|all>
810   <assign|nf-render-used-by|<macro|x|<reference|<arg|x>> (<localize|page>
811   <pageref|<arg|x>>)>>
813   <assign|nf-used-by-chunk|<macro|name|<write|nf-chunk|<tuple|<tuple|<arg|name>|Used
814   by>|<reference|<nf-chunk-id|<value|nf-current-chunk>|ref|1>>>>>>
816   <assign|nf-put|<macro|name|value|<with|the-label|<arg|value>|<label|<arg|name>>>>>
818   <assign|nf-get|<macro|name|<get-binding|<arg|name>|0>>>
820   <assign|nf-ping-old|<macro|name|<if|<not|<provides|<merge|old-|<arg|name>>>>|<assign|<merge|old-|<arg|name>>|<get-binding|<arg|name>|0>>>>>
822   <assign|nf-used-by-chunk|<macro|name|used|<nf-ping-old|<merge|nf-code-use-|<arg|name>>><with|uses|<value|<merge|nf-code-use-|<arg|name>>>|<if|<not|<equal|<get-label|<value|uses>>|tuple>>|<assign|<merge|nf-code-use-|<arg|name>>|<tuple|<arg|used>>>|<if|<not|<equal|<look-up|<value|<merge|nf-code-use-|<arg|name>>>|<minus|<length|<value|<merge|nf-code-use-|<arg|name>>>>|1>>|<arg|used>>>|<assign|<merge|nf-code-use-|<arg|name>>|<merge|<value|<merge|nf-code-use-|<arg|name>>>|<tuple|<arg|used>>>>>><nf-put|<merge|nf-code-use-|<arg|name>>|<value|<merge|nf-code-use-|<arg|name>>>>>>>
824   <assign|nf-show-used-by|<macro|<nf-ping-old|<merge|nf-code-use-|<value|nf-name>>><with|uses|<value|<merge|old-nf-code-use-|<value|nf-name>>>|<if|<equal|<get-label|<value|uses>>|tuple>|Used
825   by <nf-render-used-by|<value|uses>>|<smaller|not used>>>>>
827   <assign|render-join|<xmacro|args|<with|join|<arg|args|0>|render|<arg|args|1>|render-join|<macro|x|<value|join><compound|<value|render>|<arg|x>>>|<compound|<value|render>|<arg|args|2>><map-args|render-join|concat|args|3>>>>
829   <assign|nf-render-used-by|<macro|t|with|render|<quasi|<render-join|,
830   |reference|<unquote*|<arg|t>>>>>>
832   <\active*>
833     <\src-comment>
834       nf-quote causes literal text to be included in a new language mode -
835       it's main task is to do some of the horrid nested quoting that some
836       languages require.
838       For instance to match a backslash in a gsub regex in awk requires 4
839       back slashes - first quote the single backslash for the regex which
840       makes two backslashes, and then quote each of those for the string
841       argument to gsub
842     </src-comment>
843   </active*>
845   <assign|output-mode?|<macro|<assign|output-mode|unknown><specific|screen|<assign|output-mode|typeset>><specific|html|<assign|output-mode|export>>>>
847   <assign|nf-text-render-typeset|<macro|x|mode|submode|<math|<wide|<text|<verbatim|<arg|x>>>|\<wide-overbrace\>><rsup|<arg|mode>:<arg|submode>>>>>
849   <assign|nf-text-render-export|<macro|x|mode|submode|<nv-langle><arg|mode>:<arg|submode>:<arg|x><nv-rangle>>>
851   <assign|nf-text|<macro|x|mode|submode|<output-mode?><compound|<merge|nf-text-render-|<value|output-mode>>|<arg|x>|<arg|mode>|<arg|submode>>>>
853   <drd-props|nf-text|accessible|all>
855   <\active*>
856     <\src-comment>
857       nf-arg is a public macro. It will be replaced by the value of the chunk
858       argument when the code is extracted.
860       I really want to use \<less\>with\|nv-langle\|${\<gtr\> etc, but
861       evaluation of this is deferred until afterwards or something
862     </src-comment>
863   </active*>
865   <assign|nf-arg|<macro|name|<with|nv-langle-subst||nv-rangle-subst||<nv-langle><specific-verbatim|${><with|color|dark
866   green|<with|prog-font-shape|italic|<arg|name>>><specific-verbatim|}><nv-rangle>>>>
868   <\active*>
869     <\src-comment>
870       chunk-reference takes the chunks name and chunklet number and returns a
871       regular reference - like \<less\>reference\|\<gtr\> but calculates the
872       id for you.
873     </src-comment>
874   </active*>
876   <assign|chunk-reference|<macro|name|n|<reference|<nf-chunk-id|<arg|name>|ref|<arg|n>>>>>
878   <assign|chunk-page-reference|<macro|name|n|<pageref|<nf-chunk-id|<arg|name>|ref|<arg|n>>>>>
880   <assign|chunk-page-reference-page|<macro|name|n|<pagerefpage|<nf-chunk-id|<arg|name>|ref|<arg|n>>>>>
882   <\active*>
883     <\src-comment>
884       One day nf-tab will manage proper tab stops and emit a literal TAB
885       character in text mode.
887       Until then, it equals 8 spaces and the sequence 0xE2 0x86 0xA6 must be
888       converted to a tab during untangling
890       nf-untab will output 0xE2 0x86 0xA4 and is a hack; during untanging
891       [[:space:]]*0xE2 0x86 0xA4 will be deleted. This is useful for
892       removeing the indent of here documents in bash scripts
893     </src-comment>
894   </active*>
896   <assign|nf-tab-stop|8>
898   <assign|xafter|<specific-verbatim|\<#000A\> \ \ \ \<#221F\>>>
900   <assign|xnf-tab|<macro|<resize|\<#0009\><with|mode|math|\<mapsto\>>|||<merge|c+|<minus|<value|nf-tab-stop>|<mod|<value|nf-len>|<value|nf-tab-stop>>>|spc>|>>>
902   <assign|nf-tab|<macro|<resize|<with|mode|math|\<mapsto\>>|||8spc|>>>
904   <assign|nf-untab|<macro|<with|mode|math|\<mapsfrom\>>>>
906   <assign|nf-ht|<macro|<extern|(lambda () `(concat "[" ,(string #\\ht)
907   "]"))>>>
909   <\active*>
910     <\src-comment>
911       THIS is the NEW fangle
912     </src-comment>
913   </active*>
915   <assign|fangle-chunk-new|<macro|name|args|<quasi|<new-counter|<merge|code-chunk-|<unquote|<arg|name>>>><new-counter|<merge|code-line-|<unquote|<arg|name>>>><assign|<unquote|<merge|code-item-|<arg|name>>>|<macro|<compound|<unquote|<merge|next-code-line-|<arg|name>>>><render-item|<compound|<unquote|<merge|the-code-line-|<arg|name>>>>>>><compound|<merge|inc-code-chunk-|<unquote|<arg|name>>>><assign|<merge|code-args-|<unquote|<arg|name>>>|<arg|args>>>>>
917   <assign|fangle-chunk-init|<macro|name|args|<with|nf-same-chunk|<equal|<value|nf-last-chunk>|<arg|name>>|<if|<not|<provides|<merge|code-chunk-|<unquote|<arg|name>>|-nr>>>|<fangle-chunk-new|<arg|name>|<arg|args>>|<nf-chunk-next|<arg|name>>><nf-chunk-label|<arg|name>><nf-chunk-ref|<arg|name>><assign|nf-continues|<and|<value|nf-same-chunk>|<not|<equal|<number|<the-nf-chunk>|alpha>|a>>>>>>>
919   <assign|fangle-render-list|<\macro|body>
920     <\padded-normal|<item-vsep>|<item-vsep>>
921       <\indent-left|<item-hsep>>
922         <surround|<no-page-break*>|<no-indent*>|<arg|body>>
923       </indent-left>
924     </padded-normal>
925   </macro>>
927   <assign|fangle-list|<\macro|item-render|item-transform|body>
928     <\with|current-item|<arg|item-render>|transform-item|<arg|item-transform>|_item-nr|0>
929       <fangle-render-list|<arg|body>>
930     </with>
931   </macro>>
933   <assign|new-fangle|<\macro|name|lang|args>
934     <fangle-chunk-init|<arg|name>|<arg|args>><quasi|<style-with|src-compact|none|<assign|<arg|name>|<\macro|body>
935       <small|<with|item-vsep|0fn|item-nr|<value|<unquote|<merge|code-line-|<arg|name>|-nr>>>|<fangle-list|<value|nf-render-line-no>|<value|identity>|<prog-f|<unquote|<arg|lang>>|<arg|body>>>>>
936     </macro>>><drd-props|<unquote|<arg|name>>|arity|1|accessible|all>>
937   </macro>>
939   <assign|nf-chunkz|<macro|name|x|lang|args|<with|the-label||xnv-langle-subst||xnv-rangle-subst||nf-name|<unquote|<arg|name>>|y|<value|pob>|<small|<surround|<nf-chunk-init|<arg|name>|<arg|args>><wide-underlined|<nf-border-if|<nf-first-chunklet?|<value|nf-name>>>|1ln|<no-page-break*><label|<arg|name>><small|<nf-header|<arg|name>|<arg|lang>|<arg|args>>><no-page-break>>|<if|<nf-last-chunklet?|<value|nf-name>>|<wide-bothlined|<nf-border-if|<nf-last-chunklet?|<value|nf-name>>>|0ln|1ln|0ln|<htab|5mm*|last>>|<nf-jags>>|<\with|item|<value|<merge|code-item-|<unquote|<arg|name>>>>|item-vsep|0fn|current-item|<value|nf-render-line-no>|transform-item|<value|identity>>
940     <\surround||<nf-chunk-outit|<arg|name>><if|<and|<not|<equal|<value|nf-page>|<pagerefpage|<nf-this-chunk-id|<arg|name>|end>>>>|<ispageref?|<nf-this-chunk-id|<arg|name>|end>>>|<nf-use-page-header|<with|nv-langle|<macro|<with|mode|math|<left|langle>>>|nv-rangle|<macro|<with|mode|math|<right|rangle>>>|<small|<nf-header|<arg|name>|<arg|lang>|<arg|args>>>>>>>
941       <no-page-break><nf-verbatim-top|<nf-first-chunklet?|<value|nf-name>>>
943       <with|nv-langle-subst|\S|nv-rangle-subst|\T|<nf-pf|<value|nf-name>|<arg|lang>|<arg|x>>>
945       <no-page-break*><if|<nf-last-chunklet?|<value|nf-name>>|<assign|<merge|code-line-|<value|nf-name>|-nr>|0>><nf-verbatim-bottom|<nf-last-chunklet?|<value|nf-name>>>
946     </surround>
947   </with>>>>>>
948 </body>
950 <\initial>
951   <\collection>
952     <associate|page-medium|automatic>
953     <associate|page-screen-height|747264tmpt>
954     <associate|page-screen-width|1267200tmpt>
955     <associate|preamble|true>
956   </collection>
957 </initial>