Use () not [] for chunk params, add mode nodes
[newfangle.git] / newfangle.lyx
blobda7fcc83f2865b911a91750e1f57c6756eeb5724
1 #LyX 1.6.4 created this file. For more info see http://www.lyx.org/
2 \lyxformat 345
3 \begin_document
4 \begin_header
5 \textclass book
6 \begin_preamble
7 %\usepackage{xcolor}
8 %\definecolor{darkgreen}{rgb}{0,0.5,0}
9 \lstset{numbers=left, stepnumber=1, numbersep=5pt, breaklines=false,
10 basicstyle=\footnotesize\ttfamily,
11 %keywordstyle=\color{darkgreen},
12 numberstyle=\tiny,language=C,columns=fullflexible,
13 numberfirstline=true}
14 \end_preamble
15 \use_default_options true
16 \begin_modules
17 logicalmkup
18 newfangle
19 \end_modules
20 \language english
21 \inputencoding auto
22 \font_roman default
23 \font_sans default
24 \font_typewriter default
25 \font_default_family default
26 \font_sc false
27 \font_osf false
28 \font_sf_scale 100
29 \font_tt_scale 100
31 \graphics default
32 \paperfontsize default
33 \spacing single
34 \use_hyperref true
35 \pdf_title "Newfangle"
36 \pdf_author "Sam Liddicott"
37 \pdf_subject "Literate Programing"
38 \pdf_keywords "notangle noweb noweave literate programming cweb"
39 \pdf_bookmarks true
40 \pdf_bookmarksnumbered false
41 \pdf_bookmarksopen false
42 \pdf_bookmarksopenlevel 1
43 \pdf_breaklinks false
44 \pdf_pdfborder false
45 \pdf_colorlinks true
46 \pdf_backref false
47 \pdf_pdfusetitle true
48 \papersize default
49 \use_geometry false
50 \use_amsmath 1
51 \use_esint 1
52 \cite_engine basic
53 \use_bibtopic false
54 \paperorientation portrait
55 \secnumdepth 3
56 \tocdepth 3
57 \paragraph_separation skip
58 \defskip medskip
59 \quotes_language english
60 \papercolumns 1
61 \papersides 1
62 \paperpagestyle default
63 \tracking_changes false
64 \output_changes false
65 \author "" 
66 \author "" 
67 \end_header
69 \begin_body
71 \begin_layout Title
72 newfangle
73 \end_layout
75 \begin_layout Author
76 Sam Liddicott
77 \end_layout
79 \begin_layout Date
80 August 2009
81 \end_layout
83 \begin_layout Chapter*
84 Introduction
85 \end_layout
87 \begin_layout Standard
89 \noun on
90 Newfangle
91 \noun default
92  is a tool for newfangled literate programming.
93  Newfangled is defined as 
94 \emph on
95 New and often needlessly novel
96 \emph default
97  by 
98 \noun on
99 TheFreeDictionary.com
100 \noun default
102 \end_layout
104 \begin_layout Standard
105 In this case, newfangled means yet another new and improved method for literate
106  programming.
107 \end_layout
109 \begin_layout Standard
111 \noun on
112 Literate Programming
113 \noun default
114  has a long history starting with the great 
115 \noun on
116 Donald Knuth
117 \noun default
118  whose literate programming tools seem to make use of as many escaped abbreviati
119 ons for semantic markup as TeX itself.
120 \end_layout
122 \begin_layout Standard
124 \noun on
125 Norman Ramsey
126 \noun default
127  wrote the 
128 \noun on
129 noweb
130 \noun default
131  set of tools (notangle, noweave and noroots) and helpfully reduced the
132  amount of magic character sequences to just 
133 \begin_inset Flex CharStyle:Code
134 status collapsed
136 \begin_layout Plain Layout
138 \end_layout
140 \end_inset
142  and 
143 \begin_inset Flex CharStyle:Code
144 status collapsed
146 \begin_layout Plain Layout
148 \end_layout
150 \end_inset
152 , and in doing so brought the wonders of literate programming within my
153  reach.
154 \end_layout
156 \begin_layout Standard
157 Using LyX for LaTeX editing, I had various troubles with the noweb tools,
158  some of which were my fault, some of which were noweb's fault and some
159  of which were LyX's fault.
160 \end_layout
162 \begin_layout Standard
164 \noun on
165 Noweb
166 \noun default
167  generally brought literate programming to the masses through removing some
168  of the complexity of the original literate programming, but this would
169  be of no advantage to me if the LyX --- LaTeX combination brought more
170  complications in their place.
171 \end_layout
173 \begin_layout Standard
175 \noun on
176 Newfangle
177 \noun default
178  was thus born --- as an awk replacement for notangle, adding some important
179  features, like better integration with LyX and LaTeX, multiple output format
180  conversions, and fixing notangle bugs like indenting when using -L for
181  line numbers.
182 \end_layout
184 \begin_layout Standard
185 Significantly, newfangle is just one program which replaces various programs
186  in Noweb.
187  Specifically noweave is done away with and implemented directly as LaTeX
188  macros, and noroots is implemented as a function of the untangler 
189 \noun on
190 newfangle
191 \noun default
193 \end_layout
195 \begin_layout Standard
196 Newfangle is written in awk for portability reasons, awk being available
197  for most platforms.
198  A python conversion will probably be attempted for the benefit of LyX.
199  (Hasn't anyone implemented awk in python yet?)
200 \end_layout
202 \begin_layout Section*
203 Todo
204 \end_layout
206 \begin_layout Enumerate
207 ^^ is always going to be a problem, see texbytopic 1.2.2 (Work out what I
208  meant by this).
209 \end_layout
211 \begin_layout Enumerate
212 copy over up to date Makefile guide from noweb-lyx document
213 \end_layout
215 \begin_layout Enumerate
216 Make chunk-name settings only apply to chunks with that name
217 \end_layout
219 \begin_layout Enumerate
220 indent of multi-line chunks may be mode dependant (i.e.
221  not in string literals)
222 \end_layout
224 \begin_layout Enumerate
225 support chunk-param usage =<
226 \backslash
227 param{name}>
228 \end_layout
230 \begin_layout Standard
231 \begin_inset CommandInset toc
232 LatexCommand tableofcontents
234 \end_inset
237 \end_layout
239 \begin_layout Chapter
240 License
241 \end_layout
243 \begin_layout Standard
244 \begin_inset CommandInset label
245 LatexCommand label
246 name "cha:License"
248 \end_inset
250 Newfangle is licensed under the GPL 3
251 \begin_inset CommandInset citation
252 LatexCommand cite
253 key "gpl-licenses"
255 \end_inset
257  (or later).
258  This doesn't mean that you can't use or distribute newfangle with sources
259  of an incompatible license, but it means you must make the source of newfangle
260  available too.
261 \end_layout
263 \begin_layout Chunk
264 gpl3-copyright,language=
265 \end_layout
267 \begin_layout Standard
268 \begin_inset listings
269 inline false
270 status open
272 \begin_layout Plain Layout
274 #newfangle - fully featured notangle replacement in awk
275 \end_layout
277 \begin_layout Plain Layout
280 \end_layout
282 \begin_layout Plain Layout
284 #Copyright (C) Sam Liddicott 2009
285 \end_layout
287 \begin_layout Plain Layout
290 \end_layout
292 \begin_layout Plain Layout
294 #This program is free software: you can redistribute it and/or modify
295 \end_layout
297 \begin_layout Plain Layout
299 #it under the terms of the GNU General Public License as published by
300 \end_layout
302 \begin_layout Plain Layout
304 #the Free Software Foundation, either version 3 of the License, or
305 \end_layout
307 \begin_layout Plain Layout
309 #(at your option) any later version.
310 \end_layout
312 \begin_layout Plain Layout
315 \end_layout
317 \begin_layout Plain Layout
319 #This program is distributed in the hope that it will be useful,
320 \end_layout
322 \begin_layout Plain Layout
324 #but WITHOUT ANY WARRANTY; without even the implied warranty of
325 \end_layout
327 \begin_layout Plain Layout
329 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
330   See the
331 \end_layout
333 \begin_layout Plain Layout
335 #GNU General Public License for more details.
336 \end_layout
338 \begin_layout Plain Layout
341 \end_layout
343 \begin_layout Plain Layout
345 #You should have received a copy of the GNU General Public License
346 \end_layout
348 \begin_layout Plain Layout
350 #along with this program.
351   If not, see <http://www.gnu.org/licenses/>.
352 \end_layout
354 \end_inset
357 \end_layout
359 \begin_layout Part
360 Running Newfangle
361 \end_layout
363 \begin_layout Standard
364 Newfangle is a replacement for noweb, which consists of 
365 \begin_inset Flex CharStyle:Code
366 status collapsed
368 \begin_layout Plain Layout
369 notangle
370 \end_layout
372 \end_inset
375 \begin_inset Flex CharStyle:Code
376 status collapsed
378 \begin_layout Plain Layout
379 noroots
380 \end_layout
382 \end_inset
384  and 
385 \begin_inset Flex CharStyle:Code
386 status collapsed
388 \begin_layout Plain Layout
389 noweave
390 \end_layout
392 \end_inset
395 \end_layout
397 \begin_layout Standard
398 Like 
399 \begin_inset Flex CharStyle:Code
400 status collapsed
402 \begin_layout Plain Layout
403 notangle
404 \end_layout
406 \end_inset
408  and 
409 \begin_inset Flex CharStyle:Code
410 status collapsed
412 \begin_layout Plain Layout
413 noroots
414 \end_layout
416 \end_inset
418  it can read multiple named files, or from stdin.
419 \end_layout
421 \begin_layout Chapter
422 noroots replacment
423 \end_layout
425 \begin_layout Standard
426 The -r option causes newfangle to behave like noroots.
427 \end_layout
429 \begin_layout LyX-Code
430 newfangle -r filename.tex
431 \end_layout
433 \begin_layout Standard
434 will print out the newfangle roots of a tex file.
436 \end_layout
438 \begin_layout Standard
439 Unlike the 
440 \begin_inset Flex CharStyle:Code
441 status collapsed
443 \begin_layout Plain Layout
444 noroots
445 \end_layout
447 \end_inset
449  command, the roots are not enclosed in 
450 \begin_inset Flex CharStyle:Code
451 status collapsed
453 \begin_layout Plain Layout
454 <<name>>
455 \end_layout
457 \end_inset
459 , unless at least one of the roots is defined using the 
460 \begin_inset Flex CharStyle:Code
461 status collapsed
463 \begin_layout Plain Layout
464 notangle
465 \end_layout
467 \end_inset
469  style 
470 \begin_inset Flex CharStyle:Code
471 status collapsed
473 \begin_layout Plain Layout
474 <<name>>=
475 \end_layout
477 \end_inset
480 \end_layout
482 \begin_layout Standard
483 Also, unlike noroots, it prints out all roots --- not just those that are
484  not used elsewhere.
485  I find that a root not being used, doesn't make it particularly top level.
486  My convention is that top level roots to be extracted begin with 
487 \begin_inset Flex CharStyle:Code
488 status collapsed
490 \begin_layout Plain Layout
492 \end_layout
494 \end_inset
496  and have the form of a filename.
497 \end_layout
499 \begin_layout Chapter
500 notangle replacement
501 \end_layout
503 \begin_layout Standard
504 notangle's 
505 \begin_inset Flex CharStyle:Code
506 status collapsed
508 \begin_layout Plain Layout
510 \end_layout
512 \end_inset
514  and 
515 \begin_inset Flex CharStyle:Code
516 status collapsed
518 \begin_layout Plain Layout
520 \end_layout
522 \end_inset
524  options are supported.
525 \end_layout
527 \begin_layout Standard
528 The standard way to extract a file would be:
529 \end_layout
531 \begin_layout LyX-Code
532 newfangle -R./Makefile.inc newfangle.tex > ./Makefile.inc
533 \end_layout
535 \begin_layout Standard
536 Unlike the 
537 \begin_inset Flex CharStyle:Code
538 status collapsed
540 \begin_layout Plain Layout
541 noroots
542 \end_layout
544 \end_inset
546  command, the 
547 \begin_inset Flex CharStyle:Code
548 status collapsed
550 \begin_layout Plain Layout
552 \end_layout
554 \end_inset
556  option does not break indenting; also the 
557 \begin_inset Flex CharStyle:Code
558 status collapsed
560 \begin_layout Plain Layout
562 \end_layout
564 \end_inset
566  option does not interrupt (and break) multi-line C macros --- or indeed
567  any line ending with a backslash.
568  This does mean that sometimes the compiler might calculate the source line
569  wrongly when generating error messages in such cases, but there isn't any
570  other way around if multi-line macros include other chunks.
571 \end_layout
573 \begin_layout Chapter
574 noweave replacement
575 \end_layout
577 \begin_layout Standard
578 The noweave replacement is a set of LaTeX macros dependant upon 
579 \emph on
580 noweb.sty
581 \emph default
582 , and which can be included with:
583 \end_layout
585 \begin_layout LyX-Code
587 \backslash
588 usepackage{newfangle.sty}
589 \end_layout
591 \begin_layout Standard
592 The LaTeX macros are shown in section 
593 \begin_inset CommandInset ref
594 LatexCommand ref
595 reference "sec:Latex-Macros"
597 \end_inset
599 , and are part of a LyX module file 
600 \begin_inset Flex CharStyle:Code
601 status collapsed
603 \begin_layout Plain Layout
604 newfangle.module
605 \end_layout
607 \end_inset
609 , which automatically includes the macros in the document pre-amble when
610  the newfangle LyX module is used.
611 \end_layout
613 \begin_layout Standard
614 Because the noweave replacement is impemented in LaTeX, there is no processing
615  stage required before running the 
616 \begin_inset Flex CharStyle:Code
617 status collapsed
619 \begin_layout Plain Layout
620 latex
621 \end_layout
623 \end_inset
625  command.
626  LaTeX may need running two or more times, so that the code chunk references
627  can be fully calculated.
628 \end_layout
630 \begin_layout Standard
631 The 
632 \begin_inset Flex CharStyle:Code
633 status collapsed
635 \begin_layout Plain Layout
636 noweb.sty
637 \end_layout
639 \end_inset
641  package is required as it is used for formatting the code chunk captions
642 \end_layout
644 \begin_layout Standard
645 The 
646 \begin_inset Flex CharStyle:Code
647 status collapsed
649 \begin_layout Plain Layout
650 listings.sty
651 \end_layout
653 \end_inset
655  package is also required, as it is used for formatting the code chunks
656  themselves.
657 \end_layout
659 \begin_layout Standard
660 The 
661 \begin_inset Flex CharStyle:Code
662 status collapsed
664 \begin_layout Plain Layout
665 xargs.sty
666 \end_layout
668 \end_inset
670  package is also required.
671 \end_layout
673 \begin_layout Chapter
674 Literate Programming with Newfangle
675 \end_layout
677 \begin_layout Standard
678 Todo.
679  Should really follow on from a part-0 explanation of what literate programming
680  is.
681 \end_layout
683 \begin_layout Chapter
684 Using Newfangle with LyX
685 \end_layout
687 \begin_layout Section
688 Setting up Lyx
689 \end_layout
691 \begin_layout Subsection
692 Installing the LyX module
693 \end_layout
695 \begin_layout Standard
696 Copy 
697 \begin_inset Flex CharStyle:Code
698 status collapsed
700 \begin_layout Plain Layout
701 newfangle.module
702 \end_layout
704 \end_inset
706  to your LyX layouts directory, which for unix users will be 
707 \begin_inset Flex CharStyle:Code
708 status collapsed
710 \begin_layout Plain Layout
711 ~/.lyx/layouts
712 \end_layout
714 \end_inset
717 \end_layout
719 \begin_layout Standard
720 You will need to reconfigure LyX by clicking Tools\SpecialChar \menuseparator
721 Reconfigure, and then
722  re-start LyX.
723 \end_layout
725 \begin_layout Subsection
726 \begin_inset CommandInset label
727 LatexCommand label
728 name "sub:Configuring-the-build"
730 \end_inset
732 Configuring the build script
733 \end_layout
735 \begin_layout Standard
736 Make sure you don't have a conversion defined for Lyx → Program
737 \end_layout
739 \begin_layout Standard
740 From the menu Tools\SpecialChar \menuseparator
741 Preferences, add a conversion from Latex(Plain) → Program
742  as:
743 \end_layout
745 \begin_layout LyX-Code
746 set -x ; newfangle -Rlyx-build $$i | 
747 \end_layout
749 \begin_layout LyX-Code
750   env LYX_b=$$b LYX_i=$$i LYX_o=$$o LYX_p=$$p LYX_r=$$r bash
751 \end_layout
753 \begin_layout Standard
754 (But don't cut-n-paste it from this document or you'll be pasting a multi-line
755  string which will break your lyx preferences file).
757 \end_layout
759 \begin_layout Standard
760 I hope that one day, LyX will set these into the environment when calling
761  the build script.
762 \end_layout
764 \begin_layout Standard
765 You may also want to consider adding options to this conversion\SpecialChar \ldots{}
767 \end_layout
769 \begin_layout LyX-Code
770 parselog=/usr/share/lyx/scripts/listerrors
771 \end_layout
773 \begin_layout Standard
774 \SpecialChar \ldots{}
775 but if you do you will lose your stderr
776 \begin_inset Foot
777 status collapsed
779 \begin_layout Plain Layout
780 There is some bash plumbing to get a copy of stderr but this footnote is
781  too small
782 \end_layout
784 \end_inset
787 \end_layout
789 \begin_layout Standard
790 Now, a shell script chunk called 
791 \begin_inset Flex CharStyle:Code
792 status collapsed
794 \begin_layout Plain Layout
795 lyx-build
796 \end_layout
798 \end_inset
800  will be extracted and run whenever you choose the Document\SpecialChar \menuseparator
801 Build Program
802  menu item.
803 \end_layout
805 \begin_layout Standard
806 The lyx-build script for this document is in section 
807 \begin_inset CommandInset ref
808 LatexCommand ref
809 reference "lyx-build-script"
811 \end_inset
813  and on a unix system will extract 
814 \begin_inset Flex CharStyle:Code
815 status collapsed
817 \begin_layout Plain Layout
818 newfangle.module
819 \end_layout
821 \end_inset
823  and the 
824 \begin_inset Flex CharStyle:Code
825 status collapsed
827 \begin_layout Plain Layout
828 newfangle
829 \end_layout
831 \end_inset
833  awk script.
834 \end_layout
836 \begin_layout Subsection
837 Preparing your Lyx document
838 \end_layout
840 \begin_layout Standard
841 It is not necessary to base your literate document on any of the original
842  LyX literate classes; so select a regular class for your document type.
843 \end_layout
845 \begin_layout Standard
846 Add the new module 
847 \emph on
848 Newfangle Literate
849 \emph default
851 \emph on
852 Listings
853 \emph default
854  and possibly also 
855 \emph on
856 Logical Markup
857 \emph default
859 \end_layout
861 \begin_layout Standard
862 In the drop-down style listbox you should notice a new style defined, called
864 \emph on
865 Chunk
866 \emph default
868 \end_layout
870 \begin_layout Standard
871 When you wish to insert a literate chunk, you enter it's plain name in the
872  Chunk style, instead of the older method that used 
873 \begin_inset Flex CharStyle:Code
874 status collapsed
876 \begin_layout Plain Layout
877 <<name>>=
878 \end_layout
880 \end_inset
882  type tags.
883  Following the chunk name, you insert a listing with: Insert\SpecialChar \menuseparator
884 Program Listing.
885 \end_layout
887 \begin_layout Standard
888 Inside the white listing box you can type (or paste using shift+ctrl+V)
889  your listing.
890  There is not need to use ctrl+enter at the end of lines as with some older
891  LyX literate techniques --- just press enter as normal.
892 \end_layout
894 \begin_layout Subsubsection
895 Customising the listing appearance
896 \end_layout
898 \begin_layout Standard
899 In the final document, the code is formatted using the 
900 \noun on
901 lstlistings
902 \noun default
903  package.
904  The chunk style doesn't just define the chunk name, but can also define
905  any other chunk options supported by the lstlistings package 
906 \begin_inset Flex CharStyle:Code
907 status collapsed
909 \begin_layout Plain Layout
911 \backslash
912 lstset
913 \end_layout
915 \end_inset
917  command.
918  In fact, what you type in the chunk style is raw latex.
919  If you want to set the chunk language without having to right-click the
920  listing, just add 
921 \begin_inset Flex CharStyle:Code
922 status collapsed
924 \begin_layout Plain Layout
925 ,lanuage=C
926 \end_layout
928 \end_inset
930  after the chunk name.
931 \end_layout
933 \begin_layout Standard
934 Of course you can do this by editing the listings box advanced properties
935  by right-clicking on the listings box, but that takes longer, and you can't
936  see at-a-glance what the advanced settings are while editing the document;
937  also advanced settings apply only to that box --- the chunk settings apply
938  through the rest of the document
939 \begin_inset Foot
940 status collapsed
942 \begin_layout Plain Layout
943 It ought to apply only to subsequent chunks of the same name.
944  I'll fix that later
945 \end_layout
947 \end_inset
950 \begin_inset Note Note
951 status collapsed
953 \begin_layout Plain Layout
954 So make sure they only apply to chunks of that name
955 \end_layout
957 \end_inset
960 \end_layout
962 \begin_layout Subsubsection
963 Global customisations
964 \end_layout
966 \begin_layout Standard
967 As 
968 \emph on
969 lstlistings
970 \emph default
971  is used to set the code chunks, it's 
972 \begin_inset Flex CharStyle:Code
973 status collapsed
975 \begin_layout Plain Layout
977 \backslash
978 lstset
979 \end_layout
981 \end_inset
983  command can be used in the pre-amble to set some document wide settings.
984 \end_layout
986 \begin_layout Standard
987 If your source has many words with long sequences of capital letters, then
989 \begin_inset Flex CharStyle:Code
990 status collapsed
992 \begin_layout Plain Layout
993 columns=fullflexible
994 \end_layout
996 \end_inset
998  may be a good idea, or the capital letters will get crowded.
999  (I think lstlistings ought to use a slightly smaller font for captial letters
1000  so that they still fit).
1001 \end_layout
1003 \begin_layout Standard
1004 The font family 
1005 \begin_inset Flex CharStyle:Code
1006 status collapsed
1008 \begin_layout Plain Layout
1010 \backslash
1011 ttfamily
1012 \end_layout
1014 \end_inset
1016  looks more normal for code, but has no bold (unless luximono is used, but
1017  it doesn't work for me); so I use 
1018 \begin_inset Flex CharStyle:Code
1019 status collapsed
1021 \begin_layout Plain Layout
1023 \backslash
1024 color{darkgreen}
1025 \end_layout
1027 \end_inset
1029  for my keywords.
1030  With 
1031 \begin_inset Flex CharStyle:Code
1032 status collapsed
1034 \begin_layout Plain Layout
1036 \backslash
1037 ttfamily
1038 \end_layout
1040 \end_inset
1043 \begin_inset Flex CharStyle:Code
1044 status collapsed
1046 \begin_layout Plain Layout
1047 columns=fullflexible
1048 \end_layout
1050 \end_inset
1052  is used or the wrong letter spacing is used.
1053 \end_layout
1055 \begin_layout Standard
1056 In my LeTeX pre-amble I usually specialise my code format with:
1057 \end_layout
1059 \begin_layout Chunk
1060 document-preamble,language=tex
1061 \end_layout
1063 \begin_layout Standard
1064 \begin_inset listings
1065 inline false
1066 status open
1068 \begin_layout Plain Layout
1071 \backslash
1072 usepackage{xcolor}
1073 \end_layout
1075 \begin_layout Plain Layout
1078 \backslash
1079 definecolor{darkgreen}{rgb}{0,0.5,0}
1080 \end_layout
1082 \begin_layout Plain Layout
1085 \backslash
1086 lstset{numbers=left, stepnumber=5, numbersep=5pt, breaklines=false,
1087 \end_layout
1089 \begin_layout Plain Layout
1091   basicstyle=
1092 \backslash
1093 footnotesize
1094 \backslash
1095 ttfamily,
1096 \end_layout
1098 \begin_layout Plain Layout
1100   keywordstyle=
1101 \backslash
1102 color{darkgreen},
1103 \end_layout
1105 \begin_layout Plain Layout
1107   numberstyle=
1108 \backslash
1109 tiny,language=C,columns=fullflexible,
1110 \end_layout
1112 \begin_layout Plain Layout
1114   numberfirstline=true
1115 \end_layout
1117 \begin_layout Plain Layout
1120 \end_layout
1122 \end_inset
1125 \end_layout
1127 \begin_layout Chapter
1128 Newfangle with Makefiles
1129 \end_layout
1131 \begin_layout Standard
1132 \begin_inset Note Note
1133 status open
1135 \begin_layout Plain Layout
1136 This chapter needs revising
1137 \end_layout
1139 \end_inset
1142 \begin_inset Note Greyedout
1143 status open
1145 \begin_layout Plain Layout
1146 This chapter needs revising
1147 \end_layout
1149 \end_inset
1151 Here we describe a Makefile.inc that you can include in your own Makefiles,
1152  or glue as a recursive make to other projects.
1153 \end_layout
1155 \begin_layout Standard
1156 The Makefile.inc described here was put together for a Samba4 vfs module,
1157  but can be used in any Make project, including automake projects.
1158 \end_layout
1160 \begin_layout Section
1161 A word about makefiles formats
1162 \end_layout
1164 \begin_layout Standard
1165 Whitespace formatting is very important in a Makefile.
1166  The first character of each command line must be a TAB.
1167 \end_layout
1169 \begin_layout LyX-Code
1170 target: pre-requisite
1171 \begin_inset Newline newline
1172 \end_inset
1174    →    action
1175 \begin_inset Newline newline
1176 \end_inset
1178    →    action
1179 \end_layout
1181 \begin_layout Standard
1182 But a TAB is pretty hard to enter into most of the Lyx formats and insets
1183  I've been using.
1184  An alternative is to use a semi-colon after the pre-requisite, and a backslash
1185  at the end of each line (except the last).
1186  Then any whitespace (or none) can prefix each action.
1187 \end_layout
1189 \begin_layout LyX-Code
1190 target: pre-requisite ; 
1191 \backslash
1193 \begin_inset Newline newline
1194 \end_inset
1196 ␣␣action 
1197 \backslash
1199 \begin_inset Newline newline
1200 \end_inset
1202 ␣␣action
1203 \end_layout
1205 \begin_layout Standard
1206 This is the style that we use and it works pretty well for GNU make at least.
1207 \end_layout
1209 \begin_layout Standard
1210 We also adopt a convention that code chunks whose names beginning with ./
1211  should always be automatically extracted from the document.
1212  Code chunks whose names do not begin with ./ are for internal reference.
1213  (This doesn't prevent such chunks from being extracted directly).
1214 \end_layout
1216 \begin_layout Section
1217 Boot-strapping the extraction
1218 \end_layout
1220 \begin_layout Subsection
1221 Using a Makefile
1222 \end_layout
1224 \begin_layout Standard
1225 \begin_inset CommandInset label
1226 LatexCommand label
1227 name "sub:Bootstrap-Using-a-Makefile"
1229 \end_inset
1231 It seems convenient to have the makefile extract or update the C source
1232  files as part of it's operation.
1233  It also seems convenient to have the makefile itself extracted from this
1234  document.
1235 \end_layout
1237 \begin_layout Standard
1238 It would also be convenient to have the code to extract the makefile from
1239  this document to also be part of this document, however we have to start
1240  somewhere and this unfortunately requires us to type at least a few words
1241  by hand to start things off.
1242 \end_layout
1244 \begin_layout Standard
1245 Therefore we will have a minimal root fragment, which, when extracted, can
1246  cope with extracting the rest of the source.
1247  perhaps with this shell script, which could be called 
1248 \emph on
1249 autoboot
1250 \emph default
1252 \begin_inset Note Note
1253 status open
1255 \begin_layout Plain Layout
1256 FIX THIS CHUNK AND TEST IT
1257 \end_layout
1259 \end_inset
1262 \end_layout
1264 \begin_layout Chunk
1266 \end_layout
1268 \begin_layout Standard
1269 \begin_inset listings
1270 inline false
1271 status open
1273 \begin_layout Plain Layout
1275 #! /bin/sh
1276 \end_layout
1278 \begin_layout Plain Layout
1280 \end_layout
1282 \begin_layout Plain Layout
1284 MAKE_SRC="${1:-${NW_LYX:-../../noweb-lyx/noweb-lyx3.lyx}}"
1285 \end_layout
1287 \begin_layout Plain Layout
1289 MAKE_SRC=`dirname "$MAKE_SRC"`/`basename "$MAKE_SRC" .lyx`
1290 \end_layout
1292 \begin_layout Plain Layout
1294 NOWEB_SRC="${2:-${NOWEB_SRC:-$MAKE_SRC.lyx}}"
1295 \end_layout
1297 \begin_layout Plain Layout
1299 lyx -e latex $MAKE_SRC
1300 \end_layout
1302 \begin_layout Plain Layout
1304 \end_layout
1306 \begin_layout Plain Layout
1308 newfangle -R./Makefile.inc ${MAKE_SRC}.tex 
1309 \backslash
1311 \end_layout
1313 \begin_layout Plain Layout
1315   | sed "/NEWFANGLE_SOURCE=/s/^/#/;T;aNOWEB_SOURCE=$NEWFANGLE_SRC" 
1316 \backslash
1318 \end_layout
1320 \begin_layout Plain Layout
1322   | cpif ./Makefile.inc
1323 \end_layout
1325 \begin_layout Plain Layout
1327 \end_layout
1329 \begin_layout Plain Layout
1331 make -f ./Makefile.inc newfangle_sources
1332 \end_layout
1334 \end_inset
1337 \end_layout
1339 \begin_layout Standard
1340 The general Makefile can be invoked with 
1341 \emph on
1342 ./autoboot
1343 \emph default
1344  and can also be included into any automake file to automatically re-generate
1345  the source files.
1346 \end_layout
1348 \begin_layout Standard
1349 The 
1350 \emph on
1351 autoboot
1352 \emph default
1353  can be extracted with this command:
1354 \end_layout
1356 \begin_layout LyX-Code
1357 lyx -e latex newfangle.lyx && 
1358 \backslash
1360 \end_layout
1362 \begin_layout LyX-Code
1363 newfangle newfangle.lyx > ./autoboot
1364 \end_layout
1366 \begin_layout Standard
1367 This looks simple enough, but as mentioned, newfangle has to be had from
1368  somewhere before it can be extracted.
1369 \end_layout
1371 \begin_layout Subsection
1372 \begin_inset Note Note
1373 status collapsed
1375 \begin_layout Plain Layout
1376 MERGE THIS WITH THE SECTIONS OF THIS DOCUMENT
1377 \end_layout
1379 \end_inset
1381 \SpecialChar \ldots{}
1383 \end_layout
1385 \begin_layout Standard
1386 When the lyx-build chunk is executed, the current directory will be a temporary
1387  directory, and 
1388 \begin_inset Flex CharStyle:Code
1389 status collapsed
1391 \begin_layout Plain Layout
1392 LYX_SOURCE
1393 \end_layout
1395 \end_inset
1397  will refer to the tex file in this temporary directory.
1398  This is unfortunate as our makefile wants to run from the project directory
1399  where the Lyx file is kept.
1400 \end_layout
1402 \begin_layout Standard
1403 We can extract the project directory from $$r, and derive the probable Lyx
1404  filename from the noweb file that Lyx generated.
1405 \end_layout
1407 \begin_layout Chunk
1408 lyx-build-helper
1409 \end_layout
1411 \begin_layout Standard
1412 \begin_inset listings
1413 inline false
1414 status open
1416 \begin_layout Plain Layout
1418 PROJECT_DIR="$LYX_r"
1419 \end_layout
1421 \begin_layout Plain Layout
1423 LYX_SRC="$PROJECT_DIR/${LYX_i%.tex}.lyx"
1424 \end_layout
1426 \begin_layout Plain Layout
1428 TEX_DIR="$LYX_p"
1429 \end_layout
1431 \begin_layout Plain Layout
1433 TEX_SRC="$TEX_DIR/$LYX_i"
1434 \end_layout
1436 \end_inset
1439 \end_layout
1441 \begin_layout Standard
1442 And then we can define a lyx-build fragment similar to the autoboot fragment
1443 \end_layout
1445 \begin_layout Chunk
1446 lyx-build
1447 \end_layout
1449 \begin_layout Standard
1450 \begin_inset listings
1451 inline false
1452 status open
1454 \begin_layout Plain Layout
1456 #! /bin/sh
1457 \end_layout
1459 \begin_layout Plain Layout
1462 \backslash
1463 chunkref{lyx-build-helper}>
1464 \end_layout
1466 \begin_layout Plain Layout
1468 cd $PROJECT_DIR || exit 1
1469 \end_layout
1471 \begin_layout Plain Layout
1473 \end_layout
1475 \begin_layout Plain Layout
1477 #/usr/bin/newfangle -filter ./notanglefix-filter 
1478 \backslash
1480 \end_layout
1482 \begin_layout Plain Layout
1484 #  -R./Makefile.inc "../../noweb-lyx/noweb-lyx3.lyx" 
1485 \backslash
1487 \end_layout
1489 \begin_layout Plain Layout
1491 #  | sed '/NOWEB_SOURCE=/s/=.*/=samba4-dfs.lyx/' 
1492 \backslash
1494 \end_layout
1496 \begin_layout Plain Layout
1498 #  > ./Makefile.inc
1499 \end_layout
1501 \begin_layout Plain Layout
1504 \end_layout
1506 \begin_layout Plain Layout
1508 #make -f ./Makefile.inc newfangle_sources
1509 \end_layout
1511 \end_inset
1514 \end_layout
1516 \begin_layout Section
1517 Extracting Sources
1518 \end_layout
1520 \begin_layout Subsection
1521 Including Makefile.inc
1522 \end_layout
1524 \begin_layout Standard
1525 \begin_inset CommandInset label
1526 LatexCommand label
1527 name "sub:Keeping-extracted-files"
1529 \end_inset
1531 Makefile.inc will cope with extracting all the other source files from this
1532  document and keeping them up to date.
1534 \end_layout
1536 \begin_layout Standard
1537 It may also be included by a Makefile or Makefile.am defined in a Lyx document
1538  to automatically deal with the extraction of source files and documents.
1539 \end_layout
1541 \begin_layout Standard
1542 A makefile has two parts; variables must be defined before the targets that
1543  use them.
1544 \end_layout
1546 \begin_layout Chunk
1547 ./Makefile.inc
1548 \end_layout
1550 \begin_layout Standard
1551 \begin_inset listings
1552 inline false
1553 status open
1555 \begin_layout Plain Layout
1558 \backslash
1559 chunkref{Makefile.inc-vars}>
1560 \end_layout
1562 \begin_layout Plain Layout
1565 \backslash
1566 chunkref{Makefile.inc-targets}>
1567 \end_layout
1569 \end_inset
1572 \end_layout
1574 \begin_layout Standard
1575 We first define 
1576 \begin_inset Flex CharStyle:Code
1577 status collapsed
1579 \begin_layout Plain Layout
1580 NOWEB_SOURCE
1581 \end_layout
1583 \end_inset
1585  to hold the name of this Lyx file.
1586 \end_layout
1588 \begin_layout Chunk
1589 Makefile.inc-vars
1590 \end_layout
1592 \begin_layout Standard
1593 \begin_inset listings
1594 inline false
1595 status open
1597 \begin_layout Plain Layout
1599 LYX_SOURCE=../../noweb-lyx/newfangle.lyx
1600 \end_layout
1602 \begin_layout Plain Layout
1604 LITERATE_SOURCE=$(LYX_SOURCE)
1605 \end_layout
1607 \end_inset
1610 \end_layout
1612 \begin_layout Subsection
1613 Recursive use of Makefile.inc
1614 \end_layout
1616 \begin_layout Standard
1617 The makefile glue described here is used when building Samba4 vfs modules.
1618 \end_layout
1620 \begin_layout Standard
1621 If you are defining a module of an existing program you may find it easier
1622  to use a slight recursive make instead of including the makefile directly.
1623  This way there is less chance of definitions in Makefile.inc interfering
1624  with definitions in the main makefile, or with definitions in other Makefile.inc
1625  from other noweb modules.
1626 \end_layout
1628 \begin_layout Standard
1629 The glue works by adding a .PHONY target to call the recursive make, and
1630  adding this target as an additional pre-requisite to the existing targets.
1631 \end_layout
1633 \begin_layout Standard
1634 In this example, the existing build system already has a build target for
1636 \begin_inset Flex CharStyle:Code
1637 status collapsed
1639 \begin_layout Plain Layout
1640 example.o
1641 \end_layout
1643 \end_inset
1645 , so we just add another pre-requisite to that.
1646  In this case we use 
1647 \begin_inset Flex CharStyle:Code
1648 status collapsed
1650 \begin_layout Plain Layout
1651 example.tex.stamp
1652 \end_layout
1654 \end_inset
1656  as a pre-requisite, the stamp file's modified time indicating when all
1657  sources were extracted.
1658 \end_layout
1660 \begin_layout Chunk
1661 makefile-glue
1662 \end_layout
1664 \begin_layout Standard
1665 \begin_inset listings
1666 inline false
1667 status open
1669 \begin_layout Plain Layout
1671 $(example_srcdir)/example.o: $(example_srcdir)/example.tex.stamp
1672 \end_layout
1674 \end_inset
1677 \end_layout
1679 \begin_layout Standard
1680 The target for this new pre-requisite is generated by a recursive make using
1681  Makefile.inc which will make sure that the source is up to date, before
1682  it is built by the main projects makefile.
1683 \end_layout
1685 \begin_layout Chunk
1686 makefile-glue
1687 \end_layout
1689 \begin_layout Standard
1690 \begin_inset listings
1691 inline false
1692 status open
1694 \begin_layout Plain Layout
1696 $(example_srcdir)/example.tex.stamp: $(example_srcdir)/example.tex ; 
1697 \backslash
1699 \end_layout
1701 \begin_layout Plain Layout
1703         cd $(example_srcdir) && 
1704 \backslash
1706 \end_layout
1708 \begin_layout Plain Layout
1710         $(MAKE) -f Makefile.inc newfangle_sources
1711 \end_layout
1713 \end_inset
1716 \end_layout
1718 \begin_layout Standard
1719 We can do similar glue for the docs, clean and distclean targets.
1720  In this example our build system is using a double colon for these targets,
1721  so we use the same in our glue.
1722 \end_layout
1724 \begin_layout Chunk
1725 makefile-glue
1726 \end_layout
1728 \begin_layout Standard
1729 \begin_inset listings
1730 inline false
1731 status open
1733 \begin_layout Plain Layout
1735 docs:: docs_example
1736 \end_layout
1738 \begin_layout Plain Layout
1740 .PHONY: docs_example
1741 \end_layout
1743 \begin_layout Plain Layout
1745 docs_example:: ; cd $(example_srcdir) && 
1746 \backslash
1748 \end_layout
1750 \begin_layout Plain Layout
1752         $(MAKE) -f Makefile.inc docs
1753 \end_layout
1755 \begin_layout Plain Layout
1757 \end_layout
1759 \begin_layout Plain Layout
1761 clean:: clean_example
1762 \end_layout
1764 \begin_layout Plain Layout
1766 .PHONEY: clean_example
1767 \end_layout
1769 \begin_layout Plain Layout
1771 clean_example: ; cd $(example_srcdir) && 
1772 \backslash
1774 \end_layout
1776 \begin_layout Plain Layout
1778         $(MAKE) -f Makefile.inc clean
1779 \end_layout
1781 \begin_layout Plain Layout
1783 \end_layout
1785 \begin_layout Plain Layout
1787 distclean:: distclean_example
1788 \end_layout
1790 \begin_layout Plain Layout
1792 .PHONY: distclean_example
1793 \end_layout
1795 \begin_layout Plain Layout
1797 distclean_example: ; cd $(example_srcdir) && 
1798 \backslash
1800 \end_layout
1802 \begin_layout Plain Layout
1804         $(MAKE) -f Makefile.inc distclean
1805 \end_layout
1807 \end_inset
1810 \end_layout
1812 \begin_layout Standard
1813 We could do similarly for install targets to install the generated docs.
1814 \end_layout
1816 \begin_layout Subsection
1817 \begin_inset CommandInset label
1818 LatexCommand label
1819 name "sub:Converting-from-Lyx"
1821 \end_inset
1823 Converting from Lyx to LaTeX
1824 \end_layout
1826 \begin_layout Standard
1827 The first stage will always be to convert the Lyx file to a LaTeX file;
1828  this must be so not only because newfangle needs to to run on a TeX file,
1829  but also because the Lyx command 
1830 \emph on
1831 server-goto-file-line
1832 \begin_inset Foot
1833 status collapsed
1835 \begin_layout Plain Layout
1836 The Lyx command 
1837 \emph on
1838 server-goto-file-line
1839 \emph default
1840  is used to position the Lyx cursor at the compiler errors.
1841 \end_layout
1843 \end_inset
1846 \emph default
1847  insists that the line number provided is a line in the TeX file, and always
1848  reverse maps this to derive the line in the Lyx docment.
1849 \begin_inset Note Note
1850 status collapsed
1852 \begin_layout Plain Layout
1853 The tex file should probably be an automake extra dist sources or something,
1854  so that it gets produced and packaged by make dist
1855 \end_layout
1857 \end_inset
1860 \end_layout
1862 \begin_layout Standard
1863 The command [[lyx -e literate noweb-lyx.lyx]] will produce [[noweb-lyx.nw]]
1864  a tex file, so we define the noweb target to be the same as the Lyx file
1865  but with the .nw extension.
1866 \end_layout
1868 \begin_layout Chunk
1869 Makefile.inc-vars
1870 \end_layout
1872 \begin_layout Standard
1873 \begin_inset listings
1874 inline false
1875 status open
1877 \begin_layout Plain Layout
1879 TEX_SOURCE=$(LYX_SOURCE:.lyx=.tex)
1880 \end_layout
1882 \end_inset
1885 \end_layout
1887 \begin_layout Chunk
1888 Makefile.inc-targets
1889 \end_layout
1891 \begin_layout Standard
1892 \begin_inset listings
1893 inline false
1894 status open
1896 \begin_layout Plain Layout
1898 $(TEX_SOURCE): $(LYX_SOURCE) ;
1899 \backslash
1901 \end_layout
1903 \begin_layout Plain Layout
1905         lyx -e latex $<
1906 \end_layout
1908 \begin_layout Plain Layout
1910 clean_tex: ; rm -f -- $(TEX_SOURCE)
1911 \end_layout
1913 \end_inset
1916 \end_layout
1918 \begin_layout Subsection
1919 Extracting Program Source
1920 \end_layout
1922 \begin_layout Standard
1923 The program source is extracted using newfangle, which is designed to operate
1924  on a LaTeX document.
1926 \end_layout
1928 \begin_layout Chunk
1929 Makefile.inc-vars
1930 \end_layout
1932 \begin_layout Standard
1933 \begin_inset listings
1934 inline false
1935 status open
1937 \begin_layout Plain Layout
1939 NEWFANGLE_SOURCE=$(TEX_SOURCE)
1940 \end_layout
1942 \end_inset
1945 \end_layout
1947 \begin_layout Standard
1948 The Lyx document can result in any number of source documents, but not all
1949  of these will be changed each time the Lyx document is updated.
1950  We certainly don't want to update the timestamps of these files and cause
1951  the whole source tree to be recompiled just because the Lyx document was
1952  edited.
1954 \end_layout
1956 \begin_layout Standard
1957 To solve this problem we use a stamp file which is always updated each time
1958  the sources are extracted from the LaTeX document.
1959  If the stamp file is older than the LaTeX document, then we can make an
1960  attempt to re-extract the sources.
1961 \end_layout
1963 \begin_layout Chunk
1964 Makefile.inc-vars
1965 \end_layout
1967 \begin_layout Standard
1968 \begin_inset listings
1969 inline false
1970 status open
1972 \begin_layout Plain Layout
1974 NEWFANGLE_SOURCE_STAMP=$(NEWFANGLE_SOURCE).stamp
1975 \end_layout
1977 \end_inset
1980 \end_layout
1982 \begin_layout Chunk
1983 Makefile.inc-targets
1984 \end_layout
1986 \begin_layout Standard
1987 \begin_inset listings
1988 inline false
1989 status open
1991 \begin_layout Plain Layout
1993 $(NEWFANGLE_SOURCE_STAMP): $(NEWFANGLE_SOURCE) 
1994 \backslash
1996 \end_layout
1998 \begin_layout Plain Layout
2000                            $(NEWFANGLE_SOURCES) ; 
2001 \backslash
2003 \end_layout
2005 \begin_layout Plain Layout
2007         touch $(NEWFANGLE_SOURCE_STAMP)
2008 \end_layout
2010 \begin_layout Plain Layout
2012 clean_stamp: ; rm -f $(NEWFANGLE_SOURCE_STAMP)
2013 \end_layout
2015 \begin_layout Plain Layout
2017 clean: clean_stamp
2018 \end_layout
2020 \end_inset
2023 \end_layout
2025 \begin_layout Subsection
2026 Extracting C sources
2027 \end_layout
2029 \begin_layout Standard
2030 We compute 
2031 \begin_inset Flex CharStyle:Code
2032 status collapsed
2034 \begin_layout Plain Layout
2035 NEWFANGLE_SOURCES
2036 \end_layout
2038 \end_inset
2040  to hold the names of all the C source files defined in this document.
2041  We compute this only once, by means of := in assignent.
2042  The sed deletes the any <
2043 \begin_inset space \hspace*{}
2044 \length 0in
2045 \end_inset
2047 < and >
2048 \begin_inset space \hspace*{}
2049 \length 0in
2050 \end_inset
2052 > which may surround the roots names (for noroots compatibility).
2054 \end_layout
2056 \begin_layout Standard
2057 As we use chunk names beginning with ./ to denote top level fragments that
2058  should be extracted, we filter out all fragments that do not begin with
2059  ./
2060 \end_layout
2062 \begin_layout Chunk
2063 Makefile.inc-vars
2064 \end_layout
2066 \begin_layout Standard
2067 \begin_inset listings
2068 inline false
2069 status open
2071 \begin_layout Plain Layout
2073 NEWFANGLE_PREFIX:=
2074 \backslash
2076 \backslash
2078 \end_layout
2080 \begin_layout Plain Layout
2082 NEWFANGLE_SOURCES:=$(shell 
2083 \backslash
2085 \end_layout
2087 \begin_layout Plain Layout
2089   newfangle -r $(NEWFANGLE_SOURCE) |
2090 \backslash
2092 \end_layout
2094 \begin_layout Plain Layout
2096   sed -e 's/^[<][<]//;s/[>][>]$$//;/^$(NEWFANGLE_PREFIX)/!d' 
2097 \backslash
2099 \end_layout
2101 \begin_layout Plain Layout
2103       -e 's/^$(NEWFANGLE_PREFIX)/
2104 \backslash
2106 \backslash
2107 //' )
2108 \end_layout
2110 \begin_layout Plain Layout
2113 \end_layout
2115 \end_inset
2118 \end_layout
2120 \begin_layout Chunk
2121 Makefile.inc-targets
2122 \end_layout
2124 \begin_layout Standard
2125 \begin_inset listings
2126 inline false
2127 status open
2129 \begin_layout Plain Layout
2131 .PHONY: echo_newfangle_sources
2132 \end_layout
2134 \begin_layout Plain Layout
2136 echo_newfangle_sources: ; @echo $(NEWFANGLE_SOURCES)
2137 \end_layout
2139 \end_inset
2142 \end_layout
2144 \begin_layout Standard
2145 We define a convenient target called 
2146 \begin_inset Flex CharStyle:Code
2147 status collapsed
2149 \begin_layout Plain Layout
2150 newfangle_sources
2151 \end_layout
2153 \end_inset
2155  to re-extract the source if the LaTeX file has been updated.
2156 \end_layout
2158 \begin_layout Chunk
2159 Makefile.inc-targets
2160 \end_layout
2162 \begin_layout Standard
2163 \begin_inset listings
2164 inline false
2165 status open
2167 \begin_layout Plain Layout
2169 .PHONY: newfangle_sources
2170 \end_layout
2172 \begin_layout Plain Layout
2174 newfangle_sources: $(NEWFANGLE_SOURCE_STAMP)
2175 \end_layout
2177 \end_inset
2180 \end_layout
2182 \begin_layout Standard
2183 And also a convenient target to remove extracted sources.
2184 \end_layout
2186 \begin_layout Chunk
2187 Makefile.inc-targets
2188 \end_layout
2190 \begin_layout Standard
2191 \begin_inset listings
2192 inline false
2193 status open
2195 \begin_layout Plain Layout
2197 .PHONY: clean_newfangle_sources
2198 \end_layout
2200 \begin_layout Plain Layout
2202 clean_newfangle_sources: ; 
2203 \backslash
2205 \end_layout
2207 \begin_layout Plain Layout
2209         rm -f -- $(NEWFANGLE_SOURCE_STAMP) $(NEWFANGLE_SOURCES)
2210 \end_layout
2212 \end_inset
2215 \end_layout
2217 \begin_layout Standard
2218 This 
2219 \begin_inset Flex CharStyle:Code
2220 status collapsed
2222 \begin_layout Plain Layout
2223 if_extension
2224 \end_layout
2226 \end_inset
2228  macro takes 4 arguments: the filename (1), some extensions to match (2)
2229  and a some shell command to return if the filename matches the exentions
2230  (3), or not (4).
2231 \end_layout
2233 \begin_layout Chunk
2234 Makefile.inc-vars
2235 \end_layout
2237 \begin_layout Standard
2238 \begin_inset listings
2239 inline false
2240 status open
2242 \begin_layout Plain Layout
2244 if_extension=$(if $(findstring $(suffix $(1)),$(2)),$(3),$(4))
2245 \end_layout
2247 \end_inset
2250 \end_layout
2252 \begin_layout Standard
2253 For some source files like C files, we want to output the line number and
2254  filename of the original LaTeX document from which the source came.
2255 \end_layout
2257 \begin_layout Standard
2258 To make this easier we define the file extensions for which we want to do
2259  this.
2260 \end_layout
2262 \begin_layout Chunk
2263 Makefile.inc-vars
2264 \end_layout
2266 \begin_layout Standard
2267 \begin_inset listings
2268 inline false
2269 status open
2271 \begin_layout Plain Layout
2273 C_EXTENSIONS=.c .h
2274 \end_layout
2276 \end_inset
2279 \end_layout
2281 \begin_layout Standard
2282 We can then use the if_extensions macro to define a macro which expands
2283  out to the 
2284 \begin_inset Flex CharStyle:Code
2285 status collapsed
2287 \begin_layout Plain Layout
2289 \end_layout
2291 \end_inset
2293  option if newfangle is being invoked in a C source file, so that C compile
2294  errors will refer to the line number in the Lyx document.
2296 \end_layout
2298 \begin_layout Chunk
2299 Makefile.inc-vars
2300 \end_layout
2302 \begin_layout Standard
2303 \begin_inset listings
2304 inline false
2305 status open
2307 \begin_layout Plain Layout
2309 nf_line=-L
2310 \end_layout
2312 \begin_layout Plain Layout
2314 newfangle=newfangle 
2315 \backslash
2317 \end_layout
2319 \begin_layout Plain Layout
2321   $(call if_extension,$(2),$(C_EXTENSIONS),$(nf_line)) 
2322 \backslash
2324 \end_layout
2326 \begin_layout Plain Layout
2328     -R"$(2)" $(1)
2329 \end_layout
2331 \end_inset
2334 \end_layout
2336 \begin_layout Standard
2337 We can use a similar trick to define an 
2338 \emph on
2339 indent
2340 \emph default
2341  macro which takes just the filename as an argument and can return a pipeline
2342  stage calling the indent command.
2343  Indent can be turned off with 
2344 \begin_inset Flex CharStyle:Code
2345 status collapsed
2347 \begin_layout Plain Layout
2348 make newfangle_sources indent=
2349 \end_layout
2351 \end_inset
2354 \end_layout
2356 \begin_layout Chunk
2357 Makefile.inc-vars
2358 \end_layout
2360 \begin_layout Standard
2361 \begin_inset listings
2362 inline false
2363 status open
2365 \begin_layout Plain Layout
2367 indent_options=-npro -kr -i8 -ts8 -sob -l80 -ss -ncs
2368 \end_layout
2370 \begin_layout Plain Layout
2372 indent=$(call if_extension,$(1),$(C_EXTENSIONS),
2373 \backslash
2375 \end_layout
2377 \begin_layout Plain Layout
2379               | indent $(indent_options))
2380 \end_layout
2382 \end_inset
2385 \end_layout
2387 \begin_layout Standard
2388 We now define the pattern for extracting a file.
2389  The files are written using noweb's 
2390 \emph on
2391 cpif
2392 \begin_inset Foot
2393 status collapsed
2395 \begin_layout Plain Layout
2397 \emph on
2398 So you still need noweb installed in order to use cpif
2399 \end_layout
2401 \end_inset
2404 \begin_inset Note Note
2405 status collapsed
2407 \begin_layout Plain Layout
2409 \emph on
2410 Write an awk version
2411 \end_layout
2413 \end_inset
2416 \emph default
2417  so that the file timestamp will not be touched if the contents haven't
2418  changed.
2419  This avoids the need to rebuild the entire project because of a typographical
2420  change in the documentation, or if only a few C source files have changed.
2421 \end_layout
2423 \begin_layout Chunk
2424 Makefile.inc-vars
2425 \end_layout
2427 \begin_layout Standard
2428 \begin_inset listings
2429 inline false
2430 status open
2432 \begin_layout Plain Layout
2434 newfangle_extract=@mkdir -p $(dir $(1)) && 
2435 \backslash
2437 \end_layout
2439 \begin_layout Plain Layout
2441   $(call newfangle,$(2),$(1)) > "$(1).tmp" && 
2442 \backslash
2444 \end_layout
2446 \begin_layout Plain Layout
2448   cat "$(1).tmp" $(indent) | cpif "$(1)" 
2449 \backslash
2451 \end_layout
2453 \begin_layout Plain Layout
2455   && rm -- "$(1).tmp" || 
2456 \backslash
2458 \end_layout
2460 \begin_layout Plain Layout
2462   (echo error newfangling $(1) from $(2) ; exit 1)
2463 \end_layout
2465 \end_inset
2468 \end_layout
2470 \begin_layout Standard
2471 We define a target which will extract or update all sources.
2472  To do this we first defined a makefile template that can do this for any
2473  source file in the LaTeX document.
2474 \end_layout
2476 \begin_layout Chunk
2477 Makefile.inc-vars
2478 \end_layout
2480 \begin_layout Standard
2481 \begin_inset listings
2482 inline false
2483 status open
2485 \begin_layout Plain Layout
2487 define NEWFANGLE_template
2488 \end_layout
2490 \begin_layout Plain Layout
2492   $(1): $(2); 
2493 \backslash
2495 \end_layout
2497 \begin_layout Plain Layout
2499     $$(call newfangle_extract,$(1),$(2))
2500 \end_layout
2502 \begin_layout Plain Layout
2504   NEWFANGLE_TARGETS+=$(1)
2505 \end_layout
2507 \begin_layout Plain Layout
2509 endef
2510 \end_layout
2512 \end_inset
2515 \end_layout
2517 \begin_layout Standard
2518 We then enumerate the discovered 
2519 \begin_inset Flex CharStyle:Code
2520 status collapsed
2522 \begin_layout Plain Layout
2523 NEWTANGLE_SOURCES
2524 \end_layout
2526 \end_inset
2528  to generate a makefile rule for each one using the makefile template we
2529  defined above.
2530 \end_layout
2532 \begin_layout Chunk
2533 Makefile.inc-targets
2534 \end_layout
2536 \begin_layout Standard
2537 \begin_inset listings
2538 inline false
2539 status open
2541 \begin_layout Plain Layout
2543 $(foreach source,$(NEWFANGLE_SOURCES),
2544 \backslash
2546 \end_layout
2548 \begin_layout Plain Layout
2550   $(eval $(call NEWFANGLE_template,$(source),$(NEWFANGLE_SOURCE))) 
2551 \backslash
2553 \end_layout
2555 \begin_layout Plain Layout
2558 \end_layout
2560 \end_inset
2563 \end_layout
2565 \begin_layout Standard
2566 These will all be built with NEWFANGLE_SOURCE_STAMP.
2567 \end_layout
2569 \begin_layout Standard
2570 We also remove the generated sources on a 
2571 \emph on
2572 make distclean
2573 \emph default
2575 \end_layout
2577 \begin_layout Chunk
2578 Makefile.inc-targets
2579 \end_layout
2581 \begin_layout Standard
2582 \begin_inset listings
2583 inline false
2584 status open
2586 \begin_layout Plain Layout
2588 _distclean: clean_newfangle_sources
2589 \end_layout
2591 \end_inset
2594 \end_layout
2596 \begin_layout Subsection
2597 Extracting Documentation
2598 \end_layout
2600 \begin_layout Standard
2601 We then identify the intermediate stages of the documentation and their
2602  build and clean targets.
2603 \end_layout
2605 \begin_layout Subsubsection
2606 Running pdflatex
2607 \end_layout
2609 \begin_layout Standard
2610 We produce a pdf file from the tex file.
2611 \end_layout
2613 \begin_layout Chunk
2614 Makefile.inc-vars
2615 \end_layout
2617 \begin_layout Standard
2618 \begin_inset listings
2619 inline false
2620 status open
2622 \begin_layout Plain Layout
2624 NEWFANGLE_PDF=$(TEX_SOURCE:.tex=.pdf)
2625 \end_layout
2627 \end_inset
2630 \end_layout
2632 \begin_layout Standard
2633 We run pdflatex twice to be sure that the contents and aux files are up
2634  to date.
2635  We certainly are required to run pdflatex twice if these files do not exist!
2636 \end_layout
2638 \begin_layout Chunk
2639 Makefile.inc-targets
2640 \end_layout
2642 \begin_layout Standard
2643 \begin_inset listings
2644 inline false
2645 status open
2647 \begin_layout Plain Layout
2649 $(NEWFANGLE_PDF): $(TEX_SOURCE); pdflatex $< && pdflatex $<
2650 \end_layout
2652 \begin_layout Plain Layout
2654 clean_pdf: ; rm -f -- $(NEWFANGLE_PDF) 
2655 \backslash
2657 \end_layout
2659 \begin_layout Plain Layout
2661                       $(TEX_SOURCE:.tex=.toc) 
2662 \backslash
2664 \end_layout
2666 \begin_layout Plain Layout
2668                       $(TEX_SOURCE:.tex=.log) 
2669 \backslash
2671 \end_layout
2673 \begin_layout Plain Layout
2675                       $(TEX_SOURCE:.tex=.aux)
2676 \end_layout
2678 \end_inset
2681 \end_layout
2683 \begin_layout Subsubsection
2684 The docs as a whole
2685 \end_layout
2687 \begin_layout Standard
2688 Currently we only build pdf as a final format, but NEWFANGLE_DOCS may later
2689  hold other output formats.
2690 \end_layout
2692 \begin_layout Chunk
2693 Makefile.inc-vars
2694 \end_layout
2696 \begin_layout Standard
2697 \begin_inset listings
2698 inline false
2699 status open
2701 \begin_layout Plain Layout
2703 NEWFANGLE_DOCS=$(NEWFANGLE_PDF)
2704 \end_layout
2706 \end_inset
2709 \end_layout
2711 \begin_layout Standard
2712 We also define noweb_docs as a convenient phony target<
2713 \end_layout
2715 \begin_layout Chunk
2716 Makefile.inc-targets
2717 \end_layout
2719 \begin_layout Standard
2720 \begin_inset listings
2721 inline false
2722 status open
2724 \begin_layout Plain Layout
2726 .PHONY: newfangle_docs
2727 \end_layout
2729 \begin_layout Plain Layout
2731 newfangle_docs: $(NOWEB_DOCS)
2732 \end_layout
2734 \begin_layout Plain Layout
2736 docs: newfangle_docs
2737 \end_layout
2739 \end_inset
2742 \end_layout
2744 \begin_layout Standard
2745 And define a convenient clean_noweb_docs which we add to the regular clean
2746  target
2747 \end_layout
2749 \begin_layout Chunk
2750 Makefile.inc-targets
2751 \end_layout
2753 \begin_layout Standard
2754 \begin_inset listings
2755 inline false
2756 status open
2758 \begin_layout Plain Layout
2760 .PHONEY: clean_newfangle_docs
2761 \end_layout
2763 \begin_layout Plain Layout
2765 clean_newfangle_docs: clean_tex clean_pdf
2766 \end_layout
2768 \begin_layout Plain Layout
2770 clean: clean_newfangle_docs
2771 \end_layout
2773 \begin_layout Plain Layout
2775 \end_layout
2777 \begin_layout Plain Layout
2779 distclean_newfangle_docs: clean_tex clean_newfangle_docs
2780 \end_layout
2782 \begin_layout Plain Layout
2784 distclean: clean distclean_newfangle_docs
2785 \end_layout
2787 \end_inset
2790 \end_layout
2792 \begin_layout Subsection
2793 Other helpers
2794 \end_layout
2796 \begin_layout Standard
2797 If Makefile.inc is included into Makefile, then extracted files can be updated
2798  with this command:
2799 \end_layout
2801 \begin_layout LyX-Code
2802 make newfangle_sources
2803 \end_layout
2805 \begin_layout Standard
2806 otherwise, with:
2807 \end_layout
2809 \begin_layout LyX-Code
2810 make -f Makefile.inc newfangle_sources
2811 \end_layout
2813 \begin_layout Part
2814 Source Code
2815 \end_layout
2817 \begin_layout Chapter
2818 Newfangle awk source code
2819 \end_layout
2821 \begin_layout Standard
2822 We use the copyright notice from chapter 
2823 \begin_inset CommandInset ref
2824 LatexCommand ref
2825 reference "cha:License"
2827 \end_inset
2830 \end_layout
2832 \begin_layout Chunk
2833 ./newfangle,language=awk,morestring=[b]{/},morekeywords=else
2834 \end_layout
2836 \begin_layout Standard
2837 \begin_inset listings
2838 inline false
2839 status open
2841 \begin_layout Plain Layout
2843 #! /usr/bin/awk -f
2844 \end_layout
2846 \begin_layout Plain Layout
2849 \backslash
2850 chunkref{gpl3-copyright}>
2851 \end_layout
2853 \end_inset
2856 \end_layout
2858 \begin_layout Standard
2859 We also use code from Arnold Robbins public domain getopt (1993 revision)
2860  defined in chapter 
2861 \begin_inset CommandInset ref
2862 LatexCommand ref
2863 reference "cha:getopt"
2865 \end_inset
2867 , and naturally want to attribute this appropriately.
2868 \end_layout
2870 \begin_layout Standard
2871 \begin_inset listings
2872 inline false
2873 status open
2875 \begin_layout Plain Layout
2877 \end_layout
2879 \begin_layout Plain Layout
2881 # NOTE: Arnold Robbins public domain getopt for awk is also used:
2882 \end_layout
2884 \begin_layout Plain Layout
2887 \backslash
2888 chunkref{getopt.awk-header}>
2889 \end_layout
2891 \begin_layout Plain Layout
2893 \end_layout
2895 \begin_layout Plain Layout
2898 \backslash
2899 chunkref{getopt.awk-getopt()}>
2900 \end_layout
2902 \begin_layout Plain Layout
2904 \end_layout
2906 \end_inset
2909 \end_layout
2911 \begin_layout Standard
2912 And include the following chunks
2913 \end_layout
2915 \begin_layout Chunk
2916 ./newfangle
2917 \end_layout
2919 \begin_layout Standard
2920 \begin_inset listings
2921 inline false
2922 status open
2924 \begin_layout Plain Layout
2927 \backslash
2928 chunkref{helper-functions}>
2929 \end_layout
2931 \begin_layout Plain Layout
2934 \backslash
2935 chunkref{mode-tracker}>
2936 \end_layout
2938 \begin_layout Plain Layout
2941 \backslash
2942 chunkref{chunk-storage-functions}>
2943 \end_layout
2945 \begin_layout Plain Layout
2948 \backslash
2949 chunkref{output_chunk_names()}>
2950 \end_layout
2952 \begin_layout Plain Layout
2955 \backslash
2956 chunkref{output_chunks()}>
2957 \end_layout
2959 \begin_layout Plain Layout
2962 \backslash
2963 chunkref{write_chunk()}>
2964 \end_layout
2966 \begin_layout Plain Layout
2969 \backslash
2970 chunkref{expand_chunk_args()}>
2971 \end_layout
2973 \begin_layout Plain Layout
2976 \backslash
2977 chunkref{begin}>
2978 \end_layout
2980 \begin_layout Plain Layout
2983 \backslash
2984 chunkref{recognize-chunk}>
2985 \end_layout
2987 \begin_layout Plain Layout
2990 \backslash
2991 chunkref{end}>
2992 \end_layout
2994 \end_inset
2997 \end_layout
2999 \begin_layout Section
3000 AWK tricks
3001 \end_layout
3003 \begin_layout Standard
3004 The portable way to erase an array in awk is to split the empty string,
3005  like this:
3006 \end_layout
3008 \begin_layout Chunk
3009 awk-delete-array,params=ARRAY
3010 \end_layout
3012 \begin_layout Standard
3013 \begin_inset listings
3014 inline false
3015 status open
3017 \begin_layout Plain Layout
3019 split("", ${ARRAY});
3020 \end_layout
3022 \end_inset
3025 \end_layout
3027 \begin_layout Chunk
3028 ,params=
3029 \end_layout
3031 \begin_layout Section
3032 Catching errors
3033 \end_layout
3035 \begin_layout Standard
3036 Fatal errors are issued with the error function:
3037 \end_layout
3039 \begin_layout Chunk
3040 error()
3041 \end_layout
3043 \begin_layout Standard
3044 \begin_inset listings
3045 inline false
3046 status open
3048 \begin_layout Plain Layout
3050 function error(message)
3051 \end_layout
3053 \begin_layout Plain Layout
3056 \end_layout
3058 \begin_layout Plain Layout
3060   print message > "/dev/stderr";
3061 \end_layout
3063 \begin_layout Plain Layout
3065   exit 1;
3066 \end_layout
3068 \begin_layout Plain Layout
3071 \end_layout
3073 \end_inset
3076 \end_layout
3078 \begin_layout Standard
3079 This is one of the helper functions.
3080 \end_layout
3082 \begin_layout Chunk
3083 helper-functions
3084 \end_layout
3086 \begin_layout Standard
3087 \begin_inset listings
3088 inline false
3089 status open
3091 \begin_layout Plain Layout
3094 \backslash
3095 chunkref{error()}>
3096 \end_layout
3098 \end_inset
3101 \end_layout
3103 \begin_layout Chapter
3104 lstlistings
3105 \end_layout
3107 \begin_layout Standard
3108 LaTeX arguments to lstlistings macros are a comma seperated list of key-value
3109  pairs.
3110  Values containing commas are enclosed in { braces }.
3111 \end_layout
3113 \begin_layout Standard
3114 We need a function that can parse such an expression and assign the values
3115  to an 
3116 \noun on
3118 \noun default
3119  associated array.
3120 \end_layout
3122 \begin_layout Standard
3123 A sample expressions is:
3124 \end_layout
3126 \begin_layout LyX-Code
3127 name=thomas, params={a, b}, something, something-else
3128 \end_layout
3130 \begin_layout Standard
3131 but we see that this is just a simpler form of this expression:
3132 \end_layout
3134 \begin_layout LyX-Code
3135 name=freddie, foo={bar=baz, quux={quirk, a=fleeg}}, etc
3136 \end_layout
3138 \begin_layout Standard
3139 And that it would be a good idea to use a recursive parser into a multi-dimensio
3140 nal hash
3141 \begin_inset Foot
3142 status collapsed
3144 \begin_layout Plain Layout
3145 as AWK doesn't have nested-hash support
3146 \end_layout
3148 \end_inset
3150 , resulting in:
3151 \end_layout
3153 \begin_layout Standard
3154 \begin_inset Tabular
3155 <lyxtabular version="3" rows="6" columns="2">
3156 <features>
3157 <column alignment="left" valignment="top" width="0">
3158 <column alignment="left" valignment="top" width="0">
3159 <row>
3160 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
3161 \begin_inset Text
3163 \begin_layout Plain Layout
3165 \end_layout
3167 \end_inset
3168 </cell>
3169 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
3170 \begin_inset Text
3172 \begin_layout Plain Layout
3173 value
3174 \end_layout
3176 \end_inset
3177 </cell>
3178 </row>
3179 <row>
3180 <cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
3181 \begin_inset Text
3183 \begin_layout Plain Layout
3184 a[name]
3185 \end_layout
3187 \end_inset
3188 </cell>
3189 <cell alignment="left" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3190 \begin_inset Text
3192 \begin_layout Plain Layout
3193 freddie
3194 \end_layout
3196 \end_inset
3197 </cell>
3198 </row>
3199 <row>
3200 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3201 \begin_inset Text
3203 \begin_layout Plain Layout
3204 a[foo, bar]
3205 \end_layout
3207 \end_inset
3208 </cell>
3209 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3210 \begin_inset Text
3212 \begin_layout Plain Layout
3214 \end_layout
3216 \end_inset
3217 </cell>
3218 </row>
3219 <row>
3220 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3221 \begin_inset Text
3223 \begin_layout Plain Layout
3224 a[foo, quux, quirk]
3225 \end_layout
3227 \end_inset
3228 </cell>
3229 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3230 \begin_inset Text
3232 \begin_layout Plain Layout
3234 \end_layout
3236 \end_inset
3237 </cell>
3238 </row>
3239 <row>
3240 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3241 \begin_inset Text
3243 \begin_layout Plain Layout
3244 a[foo, quux, a]
3245 \end_layout
3247 \end_inset
3248 </cell>
3249 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3250 \begin_inset Text
3252 \begin_layout Plain Layout
3253 fleeg
3254 \end_layout
3256 \end_inset
3257 </cell>
3258 </row>
3259 <row>
3260 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
3261 \begin_inset Text
3263 \begin_layout Plain Layout
3264 a[etc]
3265 \end_layout
3267 \end_inset
3268 </cell>
3269 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
3270 \begin_inset Text
3272 \begin_layout Plain Layout
3274 \end_layout
3276 \end_inset
3277 </cell>
3278 </row>
3279 </lyxtabular>
3281 \end_inset
3284 \end_layout
3286 \begin_layout Standard
3287 On reflection it seems that sometimes such nesting is not desirable, as
3288  the braces are also used to delimit values that contain commas --- we may
3289  consider that
3290 \end_layout
3292 \begin_layout LyX-Code
3293 name={williamson, freddie}
3294 \end_layout
3296 \begin_layout Standard
3297 should assign 
3298 \begin_inset Flex CharStyle:Code
3299 status collapsed
3301 \begin_layout Plain Layout
3302 williamson, freddie
3303 \end_layout
3305 \end_inset
3307  to 
3308 \begin_inset Flex CharStyle:Code
3309 status collapsed
3311 \begin_layout Plain Layout
3312 name
3313 \end_layout
3315 \end_inset
3317  --- so I may change this behaviour.
3318 \begin_inset Note Note
3319 status collapsed
3321 \begin_layout Plain Layout
3322 So change it
3323 \end_layout
3325 \end_inset
3328 \end_layout
3330 \begin_layout Standard
3331 Function 
3332 \begin_inset Flex Chunkref
3333 status collapsed
3335 \begin_layout Plain Layout
3336 get_chunk_args()
3337 \end_layout
3339 \end_inset
3341  will accept two paramters, 
3342 \begin_inset Flex CharStyle:Code
3343 status collapsed
3345 \begin_layout Plain Layout
3346 text
3347 \end_layout
3349 \end_inset
3351  being the text to parse, and 
3352 \begin_inset Flex CharStyle:Code
3353 status collapsed
3355 \begin_layout Plain Layout
3356 values
3357 \end_layout
3359 \end_inset
3361  being an array to receive the parsed values as described above.
3362  The optional parameter 
3363 \begin_inset Flex CharStyle:Code
3364 status collapsed
3366 \begin_layout Plain Layout
3367 path
3368 \end_layout
3370 \end_inset
3372  is used during recursion to build up the multi-dimensional array path.
3373 \end_layout
3375 \begin_layout Chunk
3376 ./newfangle
3377 \end_layout
3379 \begin_layout Standard
3380 \begin_inset listings
3381 inline false
3382 status open
3384 \begin_layout Plain Layout
3387 \backslash
3388 chunkref{get_chunk_args()}>
3389 \end_layout
3391 \end_inset
3394 \end_layout
3396 \begin_layout Chunk
3397 get_chunk_args()
3398 \end_layout
3400 \begin_layout Standard
3401 \begin_inset listings
3402 inline false
3403 status open
3405 \begin_layout Plain Layout
3407 function get_chunk_args(text, values,
3408 \end_layout
3410 \begin_layout Plain Layout
3412   # optional parameters
3413 \end_layout
3415 \begin_layout Plain Layout
3417   path, # hierarchical precursors
3418 \end_layout
3420 \begin_layout Plain Layout
3422   # local vars
3423 \end_layout
3425 \begin_layout Plain Layout
3427   a, name)
3428 \end_layout
3430 \end_inset
3433 \end_layout
3435 \begin_layout Standard
3436 The strategy is to parse the name, and then look for a value.
3437  If the value begins with a brace 
3438 \begin_inset Flex CharStyle:Code
3439 status collapsed
3441 \begin_layout Plain Layout
3443 \end_layout
3445 \end_inset
3447 , then we recurse and consume as much of the text as necessary, returning
3448  the remaining text when we encounter a leading close-brace 
3449 \begin_inset Flex CharStyle:Code
3450 status collapsed
3452 \begin_layout Plain Layout
3454 \end_layout
3456 \end_inset
3459  This being the strategy --- and executed in a loop --- we realise that
3460  we must first look for the closing brace (perhaps preceded by white space)
3461  in order to terminate the recursion, and returning remaining text.
3462 \end_layout
3464 \begin_layout Standard
3465 \begin_inset listings
3466 inline false
3467 status open
3469 \begin_layout Plain Layout
3472 \end_layout
3474 \begin_layout Plain Layout
3476   while(length(text)) {
3477 \end_layout
3479 \begin_layout Plain Layout
3481     if (match(text, "^ *}(.*)", a)) {
3482 \end_layout
3484 \begin_layout Plain Layout
3486       return a[1];
3487 \end_layout
3489 \begin_layout Plain Layout
3491     }
3492 \end_layout
3494 \begin_layout Plain Layout
3496     =<
3497 \backslash
3498 chunkref{parse-chunk-args}>
3499 \end_layout
3501 \begin_layout Plain Layout
3503   }
3504 \end_layout
3506 \begin_layout Plain Layout
3508   return text;
3509 \end_layout
3511 \begin_layout Plain Layout
3514 \end_layout
3516 \end_inset
3519 \end_layout
3521 \begin_layout Standard
3522 \begin_inset Note Note
3523 status collapsed
3525 \begin_layout Plain Layout
3526 Use BNF package here
3527 \end_layout
3529 \end_inset
3531 We can see that the text could be inspected with this regex:
3532 \end_layout
3534 \begin_layout Chunk
3535 parse-chunk-args
3536 \end_layout
3538 \begin_layout Standard
3539 \begin_inset listings
3540 inline false
3541 status open
3543 \begin_layout Plain Layout
3545 if (! match(text, " *([^,=]*[^,= ]) *(([,=]) *(([^,}]*) *,* *(.*))|)$", a))
3547 \end_layout
3549 \begin_layout Plain Layout
3551   return text;
3552 \end_layout
3554 \begin_layout Plain Layout
3557 \end_layout
3559 \end_inset
3562 \end_layout
3564 \begin_layout Standard
3565 and that 
3566 \begin_inset Flex CharStyle:Code
3567 status collapsed
3569 \begin_layout Plain Layout
3571 \end_layout
3573 \end_inset
3575  will have the following values:
3576 \end_layout
3578 \begin_layout Standard
3579 \begin_inset Tabular
3580 <lyxtabular version="3" rows="7" columns="2">
3581 <features>
3582 <column alignment="center" valignment="top" width="0">
3583 <column alignment="left" valignment="top" width="0">
3584 <row>
3585 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
3586 \begin_inset Text
3588 \begin_layout Plain Layout
3589 a[n]
3590 \end_layout
3592 \end_inset
3593 </cell>
3594 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
3595 \begin_inset Text
3597 \begin_layout Plain Layout
3598 assigned text
3599 \end_layout
3601 \end_inset
3602 </cell>
3603 </row>
3604 <row>
3605 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3606 \begin_inset Text
3608 \begin_layout Plain Layout
3610 \end_layout
3612 \end_inset
3613 </cell>
3614 <cell alignment="left" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3615 \begin_inset Text
3617 \begin_layout Plain Layout
3618 freddie
3619 \end_layout
3621 \end_inset
3622 </cell>
3623 </row>
3624 <row>
3625 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3626 \begin_inset Text
3628 \begin_layout Plain Layout
3630 \end_layout
3632 \end_inset
3633 </cell>
3634 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3635 \begin_inset Text
3637 \begin_layout Plain Layout
3638 =freddie, foo={bar=baz, quux={quirk, a=fleeg}}, etc
3639 \end_layout
3641 \end_inset
3642 </cell>
3643 </row>
3644 <row>
3645 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3646 \begin_inset Text
3648 \begin_layout Plain Layout
3650 \end_layout
3652 \end_inset
3653 </cell>
3654 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3655 \begin_inset Text
3657 \begin_layout Plain Layout
3659 \end_layout
3661 \end_inset
3662 </cell>
3663 </row>
3664 <row>
3665 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3666 \begin_inset Text
3668 \begin_layout Plain Layout
3670 \end_layout
3672 \end_inset
3673 </cell>
3674 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3675 \begin_inset Text
3677 \begin_layout Plain Layout
3678 freddie, foo={bar=baz, quux={quirk, a=fleeg}}, etc
3679 \end_layout
3681 \end_inset
3682 </cell>
3683 </row>
3684 <row>
3685 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3686 \begin_inset Text
3688 \begin_layout Plain Layout
3690 \end_layout
3692 \end_inset
3693 </cell>
3694 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3695 \begin_inset Text
3697 \begin_layout Plain Layout
3698 freddie
3699 \end_layout
3701 \end_inset
3702 </cell>
3703 </row>
3704 <row>
3705 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
3706 \begin_inset Text
3708 \begin_layout Plain Layout
3710 \end_layout
3712 \end_inset
3713 </cell>
3714 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
3715 \begin_inset Text
3717 \begin_layout Plain Layout
3718 , foo={bar=baz, quux={quirk, a=fleeg}}, etc
3719 \end_layout
3721 \end_inset
3722 </cell>
3723 </row>
3724 </lyxtabular>
3726 \end_inset
3729 \end_layout
3731 \begin_layout Standard
3732 a[3] will be either 
3733 \begin_inset Flex CharStyle:Code
3734 status collapsed
3736 \begin_layout Plain Layout
3738 \end_layout
3740 \end_inset
3742  or 
3743 \begin_inset Flex CharStyle:Code
3744 status collapsed
3746 \begin_layout Plain Layout
3748 \end_layout
3750 \end_inset
3752  and signify whether the option named in 
3753 \begin_inset Flex CharStyle:Code
3754 status collapsed
3756 \begin_layout Plain Layout
3757 a[1]
3758 \end_layout
3760 \end_inset
3762  has a value or not (respectively).
3763 \end_layout
3765 \begin_layout Standard
3766 If the option does have a value, then if the expression 
3767 \begin_inset Flex CharStyle:Code
3768 status collapsed
3770 \begin_layout Plain Layout
3771 substr(a[4],1,1)
3772 \end_layout
3774 \end_inset
3776  returns a brace 
3777 \begin_inset Flex CharStyle:Code
3778 status collapsed
3780 \begin_layout Plain Layout
3782 \end_layout
3784 \end_inset
3786  it will signify that we need to recurse:
3787 \end_layout
3789 \begin_layout Standard
3790 \begin_inset listings
3791 inline false
3792 status open
3794 \begin_layout Plain Layout
3796 name=a[1];
3797 \end_layout
3799 \begin_layout Plain Layout
3801 if (a[3] == "=") {
3802 \end_layout
3804 \begin_layout Plain Layout
3806   if (substr(a[4],1,1) == "{") {
3807 \end_layout
3809 \begin_layout Plain Layout
3811     text = get_chunk_args(substr(a[4],2), values, path name SUBSEP);
3812 \end_layout
3814 \begin_layout Plain Layout
3816   } else {
3817 \end_layout
3819 \begin_layout Plain Layout
3821     values[path name]=a[5];
3822 \end_layout
3824 \begin_layout Plain Layout
3826     text = a[6];
3827 \end_layout
3829 \begin_layout Plain Layout
3831   }
3832 \end_layout
3834 \begin_layout Plain Layout
3836 } else {
3837 \end_layout
3839 \begin_layout Plain Layout
3841   values[path name]="";
3842 \end_layout
3844 \begin_layout Plain Layout
3846   text = a[2];
3847 \end_layout
3849 \begin_layout Plain Layout
3852 \end_layout
3854 \end_inset
3857 \end_layout
3859 \begin_layout Standard
3860 We can test this function like this:
3861 \end_layout
3863 \begin_layout Chunk
3864 gca-test.awk
3865 \end_layout
3867 \begin_layout Standard
3868 \begin_inset listings
3869 inline false
3870 status open
3872 \begin_layout Plain Layout
3875 \backslash
3876 chunkref{get_chunk_args()}>
3877 \end_layout
3879 \begin_layout Plain Layout
3881 BEGIN {
3882 \end_layout
3884 \begin_layout Plain Layout
3886   SUBSEP=".";
3887 \end_layout
3889 \begin_layout Plain Layout
3891 \end_layout
3893 \begin_layout Plain Layout
3895   print get_chunk_args("name=freddie, foo={bar=baz, quux={quirk, a=fleeg}},
3896  etc", a);
3897 \end_layout
3899 \begin_layout Plain Layout
3901   for (b in a) {
3902 \end_layout
3904 \begin_layout Plain Layout
3906     print "a[" b "] => " a[b];
3907 \end_layout
3909 \begin_layout Plain Layout
3911   }
3912 \end_layout
3914 \begin_layout Plain Layout
3917 \end_layout
3919 \end_inset
3922 \end_layout
3924 \begin_layout Standard
3925 which should give this output:
3926 \end_layout
3928 \begin_layout Chunk
3929 gca-test.awk-results
3930 \end_layout
3932 \begin_layout Standard
3933 \begin_inset listings
3934 inline false
3935 status open
3937 \begin_layout Plain Layout
3939 a[foo.quux.quirk] => 
3940 \end_layout
3942 \begin_layout Plain Layout
3944 a[foo.quux.a] => fleeg
3945 \end_layout
3947 \begin_layout Plain Layout
3949 a[foo.bar] => baz
3950 \end_layout
3952 \begin_layout Plain Layout
3954 a[etc] => 
3955 \end_layout
3957 \begin_layout Plain Layout
3959 a[name] => freddie
3960 \end_layout
3962 \end_inset
3965 \end_layout
3967 \begin_layout Chapter
3968 Expanding chunk arguments
3969 \end_layout
3971 \begin_layout Standard
3972 \begin_inset CommandInset label
3973 LatexCommand label
3974 name "cha:Chunk Arguments"
3976 \end_inset
3979 \begin_inset Note Note
3980 status open
3982 \begin_layout Plain Layout
3983 Explain this in the documentation section too
3984 \end_layout
3986 \end_inset
3988 As an extension to many literate-programming styles, newfangle permits code
3989  chunks to take parameters and thus operate somewhat like C pre-processor
3990  macros, or like C++ templates.
3991 \end_layout
3993 \begin_layout Standard
3994 Chunk parameters are declared with a chunk argument called 
3995 \begin_inset Flex CharStyle:Code
3996 status collapsed
3998 \begin_layout Plain Layout
3999 params
4000 \end_layout
4002 \end_inset
4004 , which holds a semi-colon separated list of parameters, like this:
4005 \end_layout
4007 \begin_layout LyX-Code
4008 achunk,language=C,params=name;address
4009 \end_layout
4011 \begin_layout Standard
4012 When such a chunk is included the arguments are expressed thus, in square
4013  brackets as optional arguments separated by a comma
4014 \begin_inset Note Note
4015 status open
4017 \begin_layout Plain Layout
4018 We ought to support qouting in {} like ({Jones, John}, Jones@example.com)
4019 \end_layout
4021 \end_inset
4024 \end_layout
4026 \begin_layout LyX-Code
4028 \backslash
4029 chunkref{achunk}(John Jones, jones@example.com)
4030 \end_layout
4032 \begin_layout Standard
4033 Within the body a chunk, parameters are expressed as: 
4034 \begin_inset Flex CharStyle:Code
4035 status collapsed
4037 \begin_layout Plain Layout
4038 ${name}
4039 \end_layout
4041 \end_inset
4043  and 
4044 \begin_inset Flex CharStyle:Code
4045 status collapsed
4047 \begin_layout Plain Layout
4048 ${address}
4049 \end_layout
4051 \end_inset
4054  There is a strong case that a LaTeX style notation should be used, like
4056 \backslash
4057 param{name} --- =<
4058 \backslash
4059 param{name}> as it would appear in the lstlisting.
4060  Such notation would make me go blind, but I do intend to adopt it.
4061 \end_layout
4063 \begin_layout Standard
4064 We therefore need a function 
4065 \begin_inset Flex CharStyle:Code
4066 status collapsed
4068 \begin_layout Plain Layout
4069 expand_chunk_args
4070 \end_layout
4072 \end_inset
4074  which will take a block of text, a list of permitted parameters and the
4075  arguments which must substitute for the parameters.
4077 \end_layout
4079 \begin_layout Standard
4080 \begin_inset CommandInset label
4081 LatexCommand label
4082 name "Here-we-split"
4084 \end_inset
4086 Here we split the text on 
4087 \begin_inset Flex CharStyle:Code
4088 status collapsed
4090 \begin_layout Plain Layout
4092 \end_layout
4094 \end_inset
4096  which means that all parts except the first will begin with a parameter
4097  name.
4098  The split function will consume the literal 
4099 \begin_inset Flex CharStyle:Code
4100 status collapsed
4102 \begin_layout Plain Layout
4104 \end_layout
4106 \end_inset
4108  in each case.
4109 \end_layout
4111 \begin_layout Chunk
4112 expand_chunk_args()
4113 \end_layout
4115 \begin_layout Standard
4116 \begin_inset listings
4117 inline false
4118 status open
4120 \begin_layout Plain Layout
4122 function expand_chunk_args(text, params, args,  
4123 \end_layout
4125 \begin_layout Plain Layout
4127   p, text_array, next_text, v, t, l)
4128 \end_layout
4130 \begin_layout Plain Layout
4133 \end_layout
4135 \begin_layout Plain Layout
4137   if (split(text, text_array, "
4138 \backslash
4140 \backslash
4141 ${")) {
4142 \end_layout
4144 \begin_layout Plain Layout
4146     =<
4147 \backslash
4148 chunkref{substitute-chunk-args}>
4149 \end_layout
4151 \begin_layout Plain Layout
4153   }
4154 \end_layout
4156 \begin_layout Plain Layout
4158   return text;
4159 \end_layout
4161 \begin_layout Plain Layout
4164 \end_layout
4166 \end_inset
4169 \end_layout
4171 \begin_layout Standard
4172 First, we produce an associative array of substitution values indexed by
4173  parameter names
4174 \end_layout
4176 \begin_layout Chunk
4177 substitute-chunk-args
4178 \end_layout
4180 \begin_layout Standard
4181 \begin_inset listings
4182 inline false
4183 status open
4185 \begin_layout Plain Layout
4187 for(p in params) {
4188 \end_layout
4190 \begin_layout Plain Layout
4192   v[params[p]]=args[p];
4193 \end_layout
4195 \begin_layout Plain Layout
4198 \end_layout
4200 \end_inset
4203 \end_layout
4205 \begin_layout Standard
4206 We accumulate substituted text in the variable 
4207 \begin_inset Flex CharStyle:Code
4208 status collapsed
4210 \begin_layout Plain Layout
4211 text
4212 \end_layout
4214 \end_inset
4217  As the first part of the split function is the part before the delimiter
4218  --- which is 
4219 \begin_inset Flex CharStyle:Code
4220 status collapsed
4222 \begin_layout Plain Layout
4224 \end_layout
4226 \end_inset
4228  in our case --- this part will never contain a parameter reference, so
4229  we assign this directly to the result kept in 
4230 \begin_inset Flex CharStyle:Code
4231 status collapsed
4233 \begin_layout Plain Layout
4234 $text
4235 \end_layout
4237 \end_inset
4240 \begin_inset listings
4241 inline false
4242 status open
4244 \begin_layout Plain Layout
4246 text=text_array[1];
4247 \end_layout
4249 \end_inset
4252 \end_layout
4254 \begin_layout Standard
4255 We then iterate over the remaining values in the array
4256 \begin_inset Foot
4257 status collapsed
4259 \begin_layout Plain Layout
4260 I don't know why I think that it will enumerate the array in order, but
4261  it seems to work
4262 \end_layout
4264 \end_inset
4267 \begin_inset Note Note
4268 status collapsed
4270 \begin_layout Plain Layout
4271 So fix it or porve it
4272 \end_layout
4274 \end_inset
4276 , and substitute each reference for it's argument.
4277 \end_layout
4279 \begin_layout Standard
4280 \begin_inset listings
4281 inline false
4282 status open
4284 \begin_layout Plain Layout
4286 for(t in text_array) if (t>1) {
4287 \end_layout
4289 \begin_layout Plain Layout
4291   =<
4292 \backslash
4293 chunkref{substitute-chunk-arg}>
4294 \end_layout
4296 \begin_layout Plain Layout
4299 \end_layout
4301 \end_inset
4304 \end_layout
4306 \begin_layout Standard
4307 After the split on 
4308 \begin_inset Flex CharStyle:Code
4309 status collapsed
4311 \begin_layout Plain Layout
4313 \end_layout
4315 \end_inset
4317  a valid parameter reference will consist of valid parameter name terminated
4318  by a close-brace 
4319 \begin_inset Flex CharStyle:Code
4320 status collapsed
4322 \begin_layout Plain Layout
4324 \end_layout
4326 \end_inset
4329  A valid character name begins with the underscore or a letter, and may
4330  contain letters, digits or underscores.
4331 \end_layout
4333 \begin_layout Standard
4334 A valid looking reference that is not actually the name of a parameter will
4335  be and not substituted.
4336  This is good because there is nothing to substitute anyway, and it avoids
4337  clashes when writing code for languages where ${\SpecialChar \ldots{}
4338 } is a valid construct
4339  --- such constructs will not be interfered with unless the parameter name
4340  also matches.
4341 \end_layout
4343 \begin_layout Chunk
4344 substitute-chunk-arg
4345 \end_layout
4347 \begin_layout Standard
4348 \begin_inset listings
4349 inline false
4350 status open
4352 \begin_layout Plain Layout
4354 if (match(text_array[t], "^([a-zA-Z_][a-zA-Z0-9_]*)}", l) &&
4355 \end_layout
4357 \begin_layout Plain Layout
4359     l[1] in v) 
4360 \end_layout
4362 \begin_layout Plain Layout
4365 \end_layout
4367 \begin_layout Plain Layout
4369   text = text v[l[1]] substr(text_array[t], length(l[1])+2);
4370 \end_layout
4372 \begin_layout Plain Layout
4374 } else {
4375 \end_layout
4377 \begin_layout Plain Layout
4379   text = text "${" text_array[t];
4380 \end_layout
4382 \begin_layout Plain Layout
4385 \end_layout
4387 \end_inset
4390 \end_layout
4392 \begin_layout Chapter
4393 Recognizing Chunks
4394 \end_layout
4396 \begin_layout Standard
4397 Newfangle recognizes noweb chunks, but as we also want better LaTeX integration
4398  we will recognize any of these:
4399 \end_layout
4401 \begin_layout Itemize
4402 notangle chunks matching the pattern 
4403 \begin_inset Flex CharStyle:Code
4404 status collapsed
4406 \begin_layout Plain Layout
4408 \begin_inset space \hspace*{}
4409 \length 0in
4410 \end_inset
4412 <.*?>
4413 \begin_inset space \hspace*{}
4414 \length 0in
4415 \end_inset
4418 \end_layout
4420 \end_inset
4423 \end_layout
4425 \begin_layout Itemize
4426 a chunks beginning with 
4427 \begin_inset Flex CharStyle:Code
4428 status collapsed
4430 \begin_layout Plain Layout
4432 \backslash
4433 begin{lstlistings}
4434 \end_layout
4436 \end_inset
4438 , possibly with 
4439 \backslash
4440 Chunk{\SpecialChar \ldots{}
4441 } on the previous line
4442 \end_layout
4444 \begin_layout Itemize
4445 an older form I have used, beginning with 
4446 \begin_inset Flex CharStyle:Code
4447 status collapsed
4449 \begin_layout Plain Layout
4451 \backslash
4452 begin{Chunk}[options]
4453 \end_layout
4455 \end_inset
4457  --- also more suitable for plain LaTeX users
4458 \begin_inset Foot
4459 status collapsed
4461 \begin_layout Plain Layout
4462 Is there such a thing as plain LaTeX?
4463 \end_layout
4465 \end_inset
4468 \end_layout
4470 \begin_layout Section
4471 Chunk start
4472 \end_layout
4474 \begin_layout Standard
4475 The variable 
4476 \begin_inset Flex CharStyle:Code
4477 status collapsed
4479 \begin_layout Plain Layout
4480 chunking
4481 \end_layout
4483 \end_inset
4485  is used to signify that we are processing a code chunk and not document.
4486  In such a state, input lines will be assigned to the current chunk; otherwise
4487  they are ignored.
4488 \end_layout
4490 \begin_layout Subsection
4491 lstlistings
4492 \end_layout
4494 \begin_layout Standard
4495 Our current scheme is to recognize the new lstlisting chunks, but these
4496  may be preceded by a 
4497 \begin_inset Flex CharStyle:Code
4498 status collapsed
4500 \begin_layout Plain Layout
4502 \backslash
4503 Chunk
4504 \end_layout
4506 \end_inset
4508  command which in LyX is a more convenient way to pass the chunk name to
4509  the 
4510 \begin_inset Flex CharStyle:Code
4511 status collapsed
4513 \begin_layout Plain Layout
4515 \backslash
4516 begin{lstlistings}
4517 \end_layout
4519 \end_inset
4521  command, and a more visible way to specify other 
4522 \begin_inset Flex CharStyle:Code
4523 status collapsed
4525 \begin_layout Plain Layout
4526 lstset
4527 \end_layout
4529 \end_inset
4531  settings.
4532 \end_layout
4534 \begin_layout Standard
4535 The arguments to the 
4536 \begin_inset Flex CharStyle:Code
4537 status collapsed
4539 \begin_layout Plain Layout
4541 \backslash
4542 Chunk
4543 \end_layout
4545 \end_inset
4547  command are a name, and then a comma-seperated list of key-value pairs
4548  after the manner of 
4549 \begin_inset Flex CharStyle:Code
4550 status collapsed
4552 \begin_layout Plain Layout
4554 \backslash
4555 lstset
4556 \end_layout
4558 \end_inset
4561  (In fact within the LaTeX 
4562 \begin_inset Flex CharStyle:Code
4563 status collapsed
4565 \begin_layout Plain Layout
4567 \backslash
4568 Chunk
4569 \end_layout
4571 \end_inset
4573  macro (section 
4574 \begin_inset CommandInset ref
4575 LatexCommand ref
4576 reference "sub:The-chunk-command"
4578 \end_inset
4580 ) the text 
4581 \begin_inset Flex CharStyle:Code
4582 status collapsed
4584 \begin_layout Plain Layout
4585 name=
4586 \end_layout
4588 \end_inset
4590  is prefixed to the argument which is then literally passed to 
4591 \begin_inset Flex CharStyle:Code
4592 status collapsed
4594 \begin_layout Plain Layout
4596 \backslash
4597 lstset
4598 \end_layout
4600 \end_inset
4603 \end_layout
4605 \begin_layout Chunk
4606 recognize-chunk
4607 \end_layout
4609 \begin_layout Standard
4610 \begin_inset listings
4611 inline false
4612 status open
4614 \begin_layout Plain Layout
4617 \backslash
4619 \backslash
4620 Chunk{/ {
4621 \end_layout
4623 \begin_layout Plain Layout
4625   if (match($0, "^
4626 \backslash
4628 \backslash
4630 \backslash
4632 \backslash
4633 Chunk{ *([^ ,}]*),?(.*)}", line)) {
4634 \end_layout
4636 \begin_layout Plain Layout
4638     next_chunk_name = line[1];
4639 \end_layout
4641 \begin_layout Plain Layout
4643     get_chunk_args(line[2], next_chunk_args);
4644 \end_layout
4646 \begin_layout Plain Layout
4648   }
4649 \end_layout
4651 \begin_layout Plain Layout
4653   next;
4654 \end_layout
4656 \begin_layout Plain Layout
4659 \end_layout
4661 \end_inset
4664 \end_layout
4666 \begin_layout Standard
4667 We also make a basic attempt to parse the name out of the 
4668 \begin_inset Flex CharStyle:Code
4669 status collapsed
4671 \begin_layout Plain Layout
4673 \backslash
4674 lstlistings[name=
4675 \begin_inset space \hspace{}
4676 \length 0in
4677 \end_inset
4679 chunk-name]
4680 \end_layout
4682 \end_inset
4684  text, otherwise we fall back to the name found in the previous chunk command.
4685  This attempt is very basic and doesn't support commas or spaces or square
4686  brackets as part of the chunkname.
4687  We also recognize 
4688 \begin_inset Flex CharStyle:Code
4689 status collapsed
4691 \begin_layout Plain Layout
4693 \backslash
4694 begin{Chunk}
4695 \end_layout
4697 \end_inset
4699  which is convenient for some users
4700 \begin_inset Foot
4701 status open
4703 \begin_layout Plain Layout
4704 but not yet supported in the LaTeX macros
4705 \end_layout
4707 \end_inset
4710 \begin_inset Note Note
4711 status collapsed
4713 \begin_layout Plain Layout
4714 Add noweave support
4715 \end_layout
4717 \end_inset
4720 \end_layout
4722 \begin_layout Standard
4723 \begin_inset listings
4724 inline false
4725 status open
4727 \begin_layout Plain Layout
4730 \backslash
4732 \backslash
4733 begin{lstlisting}|^
4734 \backslash
4736 \backslash
4737 begin{Chunk}/ {
4738 \end_layout
4740 \begin_layout Plain Layout
4742   if (match($0, "}.*[[,] *name= *{? *([^], }]*)", line)) {
4743 \end_layout
4745 \begin_layout Plain Layout
4747     new_chunk(line[1]);
4748 \end_layout
4750 \begin_layout Plain Layout
4752   } else {
4753 \end_layout
4755 \begin_layout Plain Layout
4757     new_chunk(next_chunk_name, next_chunk_args);
4758 \end_layout
4760 \begin_layout Plain Layout
4762   }
4763 \end_layout
4765 \begin_layout Plain Layout
4767   chunking=1;
4768 \end_layout
4770 \begin_layout Plain Layout
4772   next;
4773 \end_layout
4775 \begin_layout Plain Layout
4778 \end_layout
4780 \end_inset
4783 \end_layout
4785 \begin_layout Subsection
4786 Noweb
4787 \end_layout
4789 \begin_layout Standard
4790 We recognize notangle style chunks too:
4791 \end_layout
4793 \begin_layout Chunk
4794 recognize-chunk
4795 \end_layout
4797 \begin_layout Standard
4798 \begin_inset listings
4799 inline false
4800 status open
4802 \begin_layout Plain Layout
4804 /^[<]<.*[>]>=/ {
4805 \end_layout
4807 \begin_layout Plain Layout
4809   if (match($0, "^[<]<(.*)[>]>= *$", line)) {
4810 \end_layout
4812 \begin_layout Plain Layout
4814     chunking=1;
4815 \end_layout
4817 \begin_layout Plain Layout
4819     notangle_mode=1;
4820 \end_layout
4822 \begin_layout Plain Layout
4824     new_chunk(line[1]);
4825 \end_layout
4827 \begin_layout Plain Layout
4829     next;
4830 \end_layout
4832 \begin_layout Plain Layout
4834   }
4835 \end_layout
4837 \begin_layout Plain Layout
4840 \end_layout
4842 \end_inset
4845 \end_layout
4847 \begin_layout Section
4848 Chunk end
4849 \end_layout
4851 \begin_layout Standard
4852 Likewise, we need to recognize when a chunk ends.
4853 \end_layout
4855 \begin_layout Subsection
4856 lstlistings
4857 \end_layout
4859 \begin_layout Standard
4860 The 
4861 \begin_inset Flex CharStyle:Code
4862 status collapsed
4864 \begin_layout Plain Layout
4866 \end_layout
4868 \end_inset
4870  in 
4871 \begin_inset Flex CharStyle:Code
4872 status collapsed
4874 \begin_layout Plain Layout
4875 [e]end{lislisting}
4876 \end_layout
4878 \end_inset
4880  is surrounded by square brackets so that when this document is processed,
4881  this chunk doesn't terminate early when the lstlistings package recognizes
4882  it's own end-string! 
4883 \begin_inset Note Greyedout
4884 status collapsed
4886 \begin_layout Plain Layout
4887 This doesn't make sense as the regex is anchored with ^, which this line
4888  does not begin with!
4889 \end_layout
4891 \end_inset
4894 \begin_inset Note Note
4895 status open
4897 \begin_layout Plain Layout
4898 No, it doesn't.
4899 \end_layout
4901 \end_inset
4904 \end_layout
4906 \begin_layout Chunk
4907 recognize-chunk
4908 \end_layout
4910 \begin_layout Standard
4911 \begin_inset listings
4912 inline false
4913 status open
4915 \begin_layout Plain Layout
4918 \backslash
4920 \backslash
4921 [e]nd{lstlisting}|^
4922 \backslash
4924 \backslash
4925 [e]nd{Chunk}/ {
4926 \end_layout
4928 \begin_layout Plain Layout
4930   chunking=0;
4931 \end_layout
4933 \begin_layout Plain Layout
4935   active_chunk="";
4936 \end_layout
4938 \begin_layout Plain Layout
4940   next;
4941 \end_layout
4943 \begin_layout Plain Layout
4946 \end_layout
4948 \end_inset
4951 \end_layout
4953 \begin_layout Subsection
4954 noweb
4955 \end_layout
4957 \begin_layout Chunk
4958 recognize-chunk
4959 \end_layout
4961 \begin_layout Standard
4962 \begin_inset listings
4963 inline false
4964 status open
4966 \begin_layout Plain Layout
4968 /^@/ {
4969 \end_layout
4971 \begin_layout Plain Layout
4973   chunking=0;
4974 \end_layout
4976 \begin_layout Plain Layout
4978   active_chunk="";
4979 \end_layout
4981 \begin_layout Plain Layout
4984 \end_layout
4986 \end_inset
4989 \end_layout
4991 \begin_layout Standard
4992 All other recognizers are only of effect if we are chunking; there's no
4993  point in looking at lines if they aren't part of a chunk, so we just ignore
4994  them as efficiently as we can.
4995 \end_layout
4997 \begin_layout Chunk
4998 recognize-chunk
4999 \end_layout
5001 \begin_layout Standard
5002 \begin_inset listings
5003 inline false
5004 status open
5006 \begin_layout Plain Layout
5008 ! chunking { next; }
5009 \end_layout
5011 \end_inset
5014 \end_layout
5016 \begin_layout Section
5017 Chunk contents
5018 \end_layout
5020 \begin_layout Standard
5021 Chunk contents are any lines read while 
5022 \begin_inset Flex CharStyle:Code
5023 status collapsed
5025 \begin_layout Plain Layout
5026 chunking
5027 \end_layout
5029 \end_inset
5031  is true.
5032  Some chunk contents are special in that they refer to other chunks, and
5033  will be replaced by the contents of these chunks when the file is generated.
5034 \end_layout
5036 \begin_layout Standard
5037 \begin_inset CommandInset label
5038 LatexCommand label
5039 name "sub:ORS-chunk-text"
5041 \end_inset
5043 We add the output record separator 
5044 \begin_inset Flex CharStyle:Code
5045 status collapsed
5047 \begin_layout Plain Layout
5049 \end_layout
5051 \end_inset
5053  to the line now, because we will set 
5054 \begin_inset Flex CharStyle:Code
5055 status collapsed
5057 \begin_layout Plain Layout
5059 \end_layout
5061 \end_inset
5063  to the empty string when we generate the output
5064 \begin_inset Foot
5065 status open
5067 \begin_layout Plain Layout
5068 So that we can print partial lines using 
5069 \begin_inset Flex CharStyle:Code
5070 status collapsed
5072 \begin_layout Plain Layout
5073 print
5074 \end_layout
5076 \end_inset
5078  instead of 
5079 \begin_inset Flex CharStyle:Code
5080 status collapsed
5082 \begin_layout Plain Layout
5083 printf
5084 \end_layout
5086 \end_inset
5089 \end_layout
5091 \end_inset
5094 \end_layout
5096 \begin_layout Chunk
5097 recognize-chunk
5098 \end_layout
5100 \begin_layout Standard
5101 \begin_inset listings
5102 inline false
5103 status open
5105 \begin_layout Plain Layout
5107 length(active_chunk) {
5108 \end_layout
5110 \begin_layout Plain Layout
5112   =<
5113 \backslash
5114 chunkref{process-chunk}>
5115 \end_layout
5117 \begin_layout Plain Layout
5120 \end_layout
5122 \end_inset
5125 \end_layout
5127 \begin_layout Standard
5128 If a chunk just consisted of plain text, we could handle the chunk like
5129  this:
5130 \end_layout
5132 \begin_layout Chunk
5133 process-chunk-simple
5134 \end_layout
5136 \begin_layout Standard
5137 \begin_inset listings
5138 inline false
5139 status open
5141 \begin_layout Plain Layout
5143 chunk_line(active_chunk, $0 ORS);
5144 \end_layout
5146 \end_inset
5149 \end_layout
5151 \begin_layout Standard
5152 but in fact a chunk can include references to other chunks.
5153  Chunk includes are traditionally written as 
5154 \begin_inset Flex CharStyle:Code
5155 status collapsed
5157 \begin_layout Plain Layout
5158 <<chunk-name>>
5159 \end_layout
5161 \end_inset
5163 , but we support other variations.
5164 \end_layout
5166 \begin_layout Subsection
5167 \begin_inset CommandInset label
5168 LatexCommand label
5169 name "sub:lstlistings-includes"
5171 \end_inset
5173 lstlistings
5174 \end_layout
5176 \begin_layout Standard
5177 If 
5178 \begin_inset Flex CharStyle:Code
5179 status collapsed
5181 \begin_layout Plain Layout
5183 \backslash
5184 lstset{escapeinside={=<}{>}}
5185 \end_layout
5187 \end_inset
5189  is set, then we can use 
5190 \begin_inset Flex CharStyle:Code
5191 status collapsed
5193 \begin_layout Plain Layout
5195 \backslash
5196 chunkref{
5197 \begin_inset space \hspace{}
5198 \length 0in
5199 \end_inset
5201 chunk-name}>
5202 \end_layout
5204 \end_inset
5206  in listings.
5207  The sequence 
5208 \begin_inset Flex CharStyle:Code
5209 status collapsed
5211 \begin_layout Plain Layout
5213 \end_layout
5215 \end_inset
5217  was chosen because:
5218 \end_layout
5220 \begin_layout Enumerate
5221 it is a better mnemonic than 
5222 \begin_inset Flex CharStyle:Code
5223 status collapsed
5225 \begin_layout Plain Layout
5226 <<chunk-name>>
5227 \end_layout
5229 \end_inset
5231  in that the = sign signifies equivalent or substitutability, 
5232 \end_layout
5234 \begin_layout Enumerate
5235 and because =< is not valid in C or in any language I can think of 
5236 \end_layout
5238 \begin_layout Enumerate
5239 and also because lstlistings doesn't like 
5240 \begin_inset Flex CharStyle:Code
5241 status collapsed
5243 \begin_layout Plain Layout
5245 \end_layout
5247 \end_inset
5249  as an end delimiter for the 
5250 \emph on
5251 texcl
5252 \emph default
5253  escape, so we must make do with a single 
5254 \begin_inset Flex CharStyle:Code
5255 status collapsed
5257 \begin_layout Plain Layout
5259 \end_layout
5261 \end_inset
5263 , which is better matched by 
5264 \begin_inset Flex CharStyle:Code
5265 status collapsed
5267 \begin_layout Plain Layout
5269 \end_layout
5271 \end_inset
5273  than 
5274 \begin_inset Flex CharStyle:Code
5275 status collapsed
5277 \begin_layout Plain Layout
5279 \end_layout
5281 \end_inset
5284 \end_layout
5286 \begin_layout Standard
5287 As each chunk line may contain more than one chunk include, we will split
5288  out chunk includes in an iterative fashion
5289 \begin_inset Foot
5290 status open
5292 \begin_layout Plain Layout
5293 Contrary to our use of 
5294 \begin_inset Flex CharStyle:Code
5295 status collapsed
5297 \begin_layout Plain Layout
5298 split
5299 \end_layout
5301 \end_inset
5303  when substituting parameters in chapter 
5304 \begin_inset CommandInset ref
5305 LatexCommand ref
5306 reference "Here-we-split"
5308 \end_inset
5311 \end_layout
5313 \end_inset
5316 \end_layout
5318 \begin_layout Standard
5319 First, as long as the chunk contains a 
5320 \begin_inset Flex CharStyle:Code
5321 status collapsed
5323 \begin_layout Plain Layout
5325 \backslash
5326 chunkref
5327 \end_layout
5329 \end_inset
5331  command we take as much as we can up to the first 
5332 \begin_inset Flex CharStyle:Code
5333 status collapsed
5335 \begin_layout Plain Layout
5337 \backslash
5338 chunkref
5339 \end_layout
5341 \end_inset
5343  command.
5344 \end_layout
5346 \begin_layout Chunk
5347 process-chunk
5348 \end_layout
5350 \begin_layout Standard
5351 \begin_inset listings
5352 inline false
5353 status open
5355 \begin_layout Plain Layout
5357 chunk = $0;
5358 \end_layout
5360 \begin_layout Plain Layout
5362 indent = 0;
5363 \end_layout
5365 \begin_layout Plain Layout
5367 while(match(chunk, 
5368 \end_layout
5370 \begin_layout Plain Layout
5372             "([=]<
5373 \backslash
5375 \backslash
5377 \backslash
5379 \backslash
5380 chunkref{([^}>]*)}(
5381 \backslash
5383 \backslash
5385 \backslash
5387 \backslash
5388 )|)>|<<([a-zA-Z_][-a-zA-Z0-9_]*)>>)", 
5389 \end_layout
5391 \begin_layout Plain Layout
5393             line)
5394 \backslash
5396 \end_layout
5398 \begin_layout Plain Layout
5400 ) {
5401 \end_layout
5403 \begin_layout Plain Layout
5405   chunklet = substr(chunk, 1, RSTART - 1);
5406 \end_layout
5408 \end_inset
5411 \end_layout
5413 \begin_layout Standard
5414 We keep track of the indent count, by counting the number of literal characters
5415  found.
5416  We can then preserve this indent on each output line when multi-line chunks
5417  are expanded.
5418 \end_layout
5420 \begin_layout Standard
5421 We then process this first part literal text, and set the chunk which is
5422  still to be processed to be the text after the 
5423 \begin_inset Flex CharStyle:Code
5424 status collapsed
5426 \begin_layout Plain Layout
5428 \backslash
5429 chunkref
5430 \end_layout
5432 \end_inset
5434  command, which we will process next as we continue around the loop.
5435 \end_layout
5437 \begin_layout Standard
5438 \begin_inset listings
5439 inline false
5440 status open
5442 \begin_layout Plain Layout
5444   indent += length(chunklet);
5445 \end_layout
5447 \begin_layout Plain Layout
5449   chunk_line(active_chunk, chunklet);
5450 \end_layout
5452 \begin_layout Plain Layout
5454   chunk = substr(chunk, RSTART + RLENGTH);
5455 \end_layout
5457 \end_inset
5460 \end_layout
5462 \begin_layout Standard
5463 We then consider the type of chunk command we have found, whether it is
5464  the newfangle style command beginning with 
5465 \begin_inset Flex CharStyle:Code
5466 status collapsed
5468 \begin_layout Plain Layout
5470 \end_layout
5472 \end_inset
5474  or the older notangle style beginning with 
5475 \begin_inset Flex CharStyle:Code
5476 status collapsed
5478 \begin_layout Plain Layout
5480 \end_layout
5482 \end_inset
5486 \end_layout
5488 \begin_layout Standard
5489 Newfangle chunks may have parameters contained within square brackets.
5490  These will be matched in 
5491 \begin_inset Flex CharStyle:Code
5492 status collapsed
5494 \begin_layout Plain Layout
5495 line[3]
5496 \end_layout
5498 \end_inset
5500  and are considered at this stage of processing to be part of the name of
5501  the chunk to be included.
5502 \end_layout
5504 \begin_layout Standard
5505 \begin_inset listings
5506 inline false
5507 status open
5509 \begin_layout Plain Layout
5511   if (substr(line[1], 1, 1) == "=") {
5512 \end_layout
5514 \begin_layout Plain Layout
5516     # chunk name up to }
5517 \end_layout
5519 \begin_layout Plain Layout
5521     chunk_include(active_chunk, line[2] line[3], indent);
5522 \end_layout
5524 \begin_layout Plain Layout
5526   } else if (substr(line[1], 1, 1) == "<") {
5527 \end_layout
5529 \begin_layout Plain Layout
5531     chunk_include(active_chunk, line[4], indent);
5532 \end_layout
5534 \begin_layout Plain Layout
5536   } else {
5537 \end_layout
5539 \begin_layout Plain Layout
5541     error("Unknown chunk fragment: " line[1]);
5542 \end_layout
5544 \begin_layout Plain Layout
5546   }
5547 \end_layout
5549 \end_inset
5552 \end_layout
5554 \begin_layout Standard
5555 The loop will continue until there are no more chunkref statements in the
5556  text, at which point we process the final part of the chunk.
5557 \end_layout
5559 \begin_layout Standard
5560 \begin_inset listings
5561 inline false
5562 status open
5564 \begin_layout Plain Layout
5567 \end_layout
5569 \begin_layout Plain Layout
5571 chunk_line(active_chunk, chunk);
5572 \end_layout
5574 \end_inset
5577 \end_layout
5579 \begin_layout Standard
5580 \begin_inset CommandInset label
5581 LatexCommand label
5582 name "lone-newline"
5584 \end_inset
5586 We add the newline character as a chunklet on it's own, to make it easier
5587  to detect new lines and thus manage indentation when processing the output.
5588 \end_layout
5590 \begin_layout Standard
5591 \begin_inset listings
5592 inline false
5593 status open
5595 \begin_layout Plain Layout
5597 chunk_line(active_chunk, "
5598 \backslash
5599 n");
5600 \end_layout
5602 \end_inset
5605 \end_layout
5607 \begin_layout Standard
5608 We will also permit a chunk-part number to follow in square brackets, so
5609  that 
5610 \begin_inset Flex CharStyle:Code
5611 status collapsed
5613 \begin_layout Plain Layout
5615 \backslash
5616 chunkref{chunk-name[1]}>
5617 \end_layout
5619 \end_inset
5621  will refer to the first part only.
5622  This can make it easy to include a C function prototype in a header file,
5623  if the first part of the chunk is just the function prototype without the
5624  trailing semi-colon.
5625  The header file would include the prototype with the trailing semi-colon,
5626  like this:
5627 \end_layout
5629 \begin_layout LyX-Code
5631 \backslash
5632 chunkref{chunk-name[1]}>;
5633 \end_layout
5635 \begin_layout Standard
5636 This is handled in section 
5637 \begin_inset CommandInset ref
5638 LatexCommand ref
5639 reference "sub:Chunk-parts"
5641 \end_inset
5644 \end_layout
5646 \begin_layout Standard
5647 We should perhaps introduce a notion of language specific chunk options;
5648  so that perhaps we could specify:
5649 \end_layout
5651 \begin_layout LyX-Code
5653 \backslash
5654 chunkref{chunk-name[function-declaration]}>;
5655 \end_layout
5657 \begin_layout Standard
5658 which applies a transform 
5659 \begin_inset Flex CharStyle:Code
5660 status collapsed
5662 \begin_layout Plain Layout
5663 function-declaration
5664 \end_layout
5666 \end_inset
5668  to the chunk --- which in this case would extract a function prototype
5669  from a function.
5670 \begin_inset Note Note
5671 status open
5673 \begin_layout Plain Layout
5674 So do it
5675 \end_layout
5677 \end_inset
5680 \end_layout
5682 \begin_layout Chapter
5683 Processing Options
5684 \end_layout
5686 \begin_layout Standard
5687 At the start, first we set the default options.
5688 \end_layout
5690 \begin_layout Chunk
5691 default-options
5692 \end_layout
5694 \begin_layout Standard
5695 \begin_inset listings
5696 inline false
5697 status open
5699 \begin_layout Plain Layout
5701 debug=0;
5702 \end_layout
5704 \begin_layout Plain Layout
5706 linenos=0;
5707 \end_layout
5709 \begin_layout Plain Layout
5711 notangle_mode=0;
5712 \end_layout
5714 \begin_layout Plain Layout
5716 SUBSEP=",";
5717 \end_layout
5719 \begin_layout Plain Layout
5721 root="*";
5722 \end_layout
5724 \end_inset
5727 \end_layout
5729 \begin_layout Standard
5730 Then we use getopt the standard way, and null out ARGV afterwards in the
5731  normal AWK fashion.
5732 \end_layout
5734 \begin_layout Chunk
5735 read-options
5736 \end_layout
5738 \begin_layout Standard
5739 \begin_inset listings
5740 inline false
5741 status open
5743 \begin_layout Plain Layout
5745 Optind = 1    # skip ARGV[0]
5746 \end_layout
5748 \begin_layout Plain Layout
5750 while(getopt(ARGC, ARGV, "R:Ldhr")!=-1) {
5751 \end_layout
5753 \begin_layout Plain Layout
5755   =<
5756 \backslash
5757 chunkref{handle-options}>
5758 \end_layout
5760 \begin_layout Plain Layout
5763 \end_layout
5765 \begin_layout Plain Layout
5767 for (i=1; i<Optind; i++) { ARGV[i]=""; }
5768 \end_layout
5770 \end_inset
5773 \end_layout
5775 \begin_layout Standard
5776 This is how we handle our options:
5777 \end_layout
5779 \begin_layout Chunk
5780 handle-options
5781 \end_layout
5783 \begin_layout Standard
5784 \begin_inset listings
5785 inline false
5786 status open
5788 \begin_layout Plain Layout
5790 if (Optopt == "R") root = Optarg;
5791 \end_layout
5793 \begin_layout Plain Layout
5795 else if (Optopt == "r") root="";
5796 \end_layout
5798 \begin_layout Plain Layout
5800 else if (Optopt == "L") linenos = 1;
5801 \end_layout
5803 \begin_layout Plain Layout
5805 else if (Optopt == "d") debug = 1;
5806 \end_layout
5808 \begin_layout Plain Layout
5810 else if (Optopt == "h") help();
5811 \end_layout
5813 \begin_layout Plain Layout
5815 else if (Optopt == "?") help();
5816 \end_layout
5818 \end_inset
5821 \end_layout
5823 \begin_layout Standard
5824 We do all of this at the beginning of the program
5825 \end_layout
5827 \begin_layout Chunk
5828 begin
5829 \end_layout
5831 \begin_layout Standard
5832 \begin_inset listings
5833 inline false
5834 status open
5836 \begin_layout Plain Layout
5838 BEGIN {
5839 \end_layout
5841 \begin_layout Plain Layout
5843   =<
5844 \backslash
5845 chunkref{constants}>
5846 \end_layout
5848 \begin_layout Plain Layout
5850   =<
5851 \backslash
5852 chunkref{default-options}>
5853 \end_layout
5855 \begin_layout Plain Layout
5857 \end_layout
5859 \begin_layout Plain Layout
5861   =<
5862 \backslash
5863 chunkref{read-options}>
5864 \end_layout
5866 \begin_layout Plain Layout
5869 \end_layout
5871 \end_inset
5874 \end_layout
5876 \begin_layout Standard
5877 And have a simple help function
5878 \end_layout
5880 \begin_layout Chunk
5881 help()
5882 \end_layout
5884 \begin_layout Standard
5885 \begin_inset listings
5886 inline false
5887 status open
5889 \begin_layout Plain Layout
5891 function help() {
5892 \end_layout
5894 \begin_layout Plain Layout
5896   print "Usage:"
5897 \end_layout
5899 \begin_layout Plain Layout
5901   print "  newfangle [-L] -R<rootname> [source.tex ...]"
5902 \end_layout
5904 \begin_layout Plain Layout
5906   print "  newfangle -r [source.tex ...]"
5907 \end_layout
5909 \begin_layout Plain Layout
5911   print "  If the filename, source.tex is not specified then stdin is used"
5912 \end_layout
5914 \begin_layout Plain Layout
5916   print
5917 \end_layout
5919 \begin_layout Plain Layout
5921   print "-L causes the C statement: #line <lineno> 
5922 \backslash
5923 "filename
5924 \backslash
5925 "" to be issued"
5926 \end_layout
5928 \begin_layout Plain Layout
5930   print "-R causes the named root to be written to stdout"
5931 \end_layout
5933 \begin_layout Plain Layout
5935   print "-r lists all roots in the file (even those used elsewhere)"
5936 \end_layout
5938 \begin_layout Plain Layout
5940   exit 1;
5941 \end_layout
5943 \begin_layout Plain Layout
5946 \end_layout
5948 \end_inset
5951 \end_layout
5953 \begin_layout Chapter
5954 Chunk Language Modes
5955 \end_layout
5957 \begin_layout Standard
5958 \begin_inset Note Greyedout
5959 status open
5961 \begin_layout Plain Layout
5962 This feature is in-development and does not work yet
5963 \end_layout
5965 \end_inset
5968 \begin_inset Note Note
5969 status open
5971 \begin_layout Plain Layout
5972 In Progress!
5973 \end_layout
5975 \end_inset
5978 \end_layout
5980 \begin_layout Standard
5981 lstlistings and newfangle both recognize source languages, and perform some
5982  basic parsing.
5983  lstlistings can detect strings and comments within a language definition
5984  and perform suitable rendering, such as italics for comments, and visible-space
5985 s within strings.
5986 \end_layout
5988 \begin_layout Standard
5989 Newfangle similarly can recognize strings, and comments, etc, within a language,
5990  so that any chunks included with 
5991 \begin_inset Flex CharStyle:Code
5992 status collapsed
5994 \begin_layout Plain Layout
5996 \backslash
5997 chunkref
5998 \end_layout
6000 \end_inset
6002  can be suitably quoted.
6003 \end_layout
6005 \begin_layout Standard
6006 For instance, consider this chunk with 
6007 \begin_inset Flex CharStyle:Code
6008 status collapsed
6010 \begin_layout Plain Layout
6011 language=perl
6012 \end_layout
6014 \end_inset
6017 \end_layout
6019 \begin_layout Chunk
6020 example-perl,language=perl
6021 \end_layout
6023 \begin_layout Standard
6024 \begin_inset listings
6025 inline false
6026 status open
6028 \begin_layout Plain Layout
6030 s/"$/'/;
6031 \end_layout
6033 \end_inset
6036 \end_layout
6038 \begin_layout Standard
6039 If it were included in a chunk with 
6040 \begin_inset Flex CharStyle:Code
6041 status collapsed
6043 \begin_layout Plain Layout
6044 language=sh
6045 \end_layout
6047 \end_inset
6049 , like this:
6050 \end_layout
6052 \begin_layout Chunk
6053 example-sh,language=sh
6054 \end_layout
6056 \begin_layout Standard
6057 \begin_inset listings
6058 inline false
6059 status open
6061 \begin_layout Plain Layout
6063 perl -pe "=<
6064 \backslash
6065 chunkref{example-perl}>"
6066 \end_layout
6068 \end_inset
6071 \end_layout
6073 \begin_layout Standard
6074 would need to generate output like this if it were to work: 
6075 \end_layout
6077 \begin_layout LyX-Code
6078 perl -pe "s/
6079 \backslash
6081 \backslash
6082 $/'/;"
6083 \end_layout
6085 \begin_layout Standard
6086 See that the double quote " as part of the regex has been quoted with a
6087  slash to protect it from shell interpretation.
6088 \end_layout
6090 \begin_layout Standard
6091 If that were then included in a chunk with 
6092 \begin_inset Flex CharStyle:Code
6093 status collapsed
6095 \begin_layout Plain Layout
6096 language=make
6097 \end_layout
6099 \end_inset
6101 , like this:
6102 \end_layout
6104 \begin_layout Chunk
6105 example-makefile,language=make
6106 \end_layout
6108 \begin_layout Standard
6109 \begin_inset listings
6110 inline false
6111 status open
6113 \begin_layout Plain Layout
6115 target: pre-req
6116 \end_layout
6118 \begin_layout Plain Layout
6120                 =<
6121 \backslash
6122 chunkref{example-sh}>
6123 \end_layout
6125 \end_inset
6128 \end_layout
6130 \begin_layout Standard
6131 We would need the output to look like this --- note the $$:
6132 \end_layout
6134 \begin_layout LyX-Code
6135 target: pre-req
6136 \end_layout
6138 \begin_layout LyX-Code
6139         perl -pe "s/
6140 \backslash
6142 \backslash
6143 $$/'/;"
6144 \end_layout
6146 \begin_layout Standard
6147 In order to make this work, we need to define a mode-tracker for each supported
6148  language, that can detect the various quoting modes, and provide a transformati
6149 on that must be applied to any included text so that included text will
6150  be interpreted correctly after the additional interpolation that it will
6151  be subject to at run-time.
6152 \end_layout
6154 \begin_layout Standard
6155 For example, the transformation for text to be inserted into sh double-quoted
6156  strings would be something like:
6157 \end_layout
6159 \begin_layout LyX-Code
6161 \backslash
6163 \backslash
6165 \backslash
6167 \backslash
6169 \backslash
6171 \backslash
6172 /g;s/$/
6173 \backslash
6175 \backslash
6176 $/g;s/"/
6177 \backslash
6179 \backslash
6180 "/g;
6181 \end_layout
6183 \begin_layout Standard
6184 which protects 
6185 \begin_inset Flex CharStyle:Code
6186 status collapsed
6188 \begin_layout Plain Layout
6190 \backslash
6191  $ "
6192 \end_layout
6194 \end_inset
6197 \end_layout
6199 \begin_layout Standard
6200 \begin_inset Note Note
6201 status collapsed
6203 \begin_layout Plain Layout
6204 I don't think this example is true
6205 \end_layout
6207 \end_inset
6209 The mode tracker must also track nested mode-changes, as in this 
6210 \begin_inset Flex CharStyle:Code
6211 status collapsed
6213 \begin_layout Plain Layout
6215 \end_layout
6217 \end_inset
6219  example.
6220 \end_layout
6222 \begin_layout LyX-Code
6223 echo "hello `id **`"
6224 \end_layout
6226 \begin_layout Standard
6227 Any literal text inserted at the point marked ** would need to be escaped
6228  in all kinds of ways, including 
6229 \begin_inset Flex CharStyle:Code
6230 status collapsed
6232 \begin_layout Plain Layout
6233 ` | *
6234 \end_layout
6236 \end_inset
6238  among others.
6239  First it would need escaping for the back-ticks `, and then for the double-quot
6240 es ".
6241 \end_layout
6243 \begin_layout Standard
6244 Escaping need not occur if the format and mode of the included chunk matches
6245  that of the including chunk, which would suggest that any back-ticks might
6246  need to be part of the included chunk and not including chunk
6247 \begin_inset Note Note
6248 status collapsed
6250 \begin_layout Plain Layout
6251 or is it the other way around?
6252 \end_layout
6254 \end_inset
6257 \end_layout
6259 \begin_layout Standard
6260 As each chunk is output a new mode tracker for that language is initialized
6261  in it's normal state.
6262  As text is output for that chunk the output mode is tracked.
6263  When a new chunk is included, a transformation appropriate to that mode
6264  is selected and pushed onto a stack of transformations.
6265  Any text to be output is first passed through this stack of transformations.
6266 \end_layout
6268 \begin_layout Standard
6269 It remains to consider if the chunk-include function should return it's
6270  generated text so that the caller can apply any transformations (and formatting
6271 ), or if it should apply the stack of transformations itself.
6272 \end_layout
6274 \begin_layout Standard
6275 Note that the transformed text should have the property of not being able
6276  to change the mode in the current chunk.
6277 \end_layout
6279 \begin_layout Standard
6280 \begin_inset Note Note
6281 status open
6283 \begin_layout Plain Layout
6284 Note chunk parameters should probably also be transformed
6285 \end_layout
6287 \end_inset
6290 \end_layout
6292 \begin_layout Chunk
6293 new_mode()
6294 \end_layout
6296 \begin_layout Standard
6297 \begin_inset listings
6298 inline false
6299 status open
6301 \begin_layout Plain Layout
6303 function new_mode(language, mode) {
6304 \end_layout
6306 \begin_layout Plain Layout
6308   mode["language"] = language;
6309 \end_layout
6311 \begin_layout Plain Layout
6313   mode["state"]="";
6314 \end_layout
6316 \begin_layout Plain Layout
6319 \end_layout
6321 \end_inset
6324 \end_layout
6326 \begin_layout Standard
6327 Because awk functions cannot return an array, we must create the array first
6328  and pass it in.
6329 \end_layout
6331 \begin_layout Chunk
6332 new-mode,params=language;mode
6333 \end_layout
6335 \begin_layout Standard
6336 \begin_inset listings
6337 inline false
6338 status open
6340 \begin_layout Plain Layout
6343 \backslash
6344 chunkref{awk-delete-array}(${mode})>
6345 \end_layout
6347 \begin_layout Plain Layout
6349 new_mode(${language}, ${mode});
6350 \end_layout
6352 \end_inset
6355 \end_layout
6357 \begin_layout Standard
6358 And for tracking modes, we dispatch to a mode-tracker action based on the
6359  current language
6360 \end_layout
6362 \begin_layout Chunk
6363 track_mode()
6364 \end_layout
6366 \begin_layout Standard
6367 \begin_inset listings
6368 inline false
6369 status open
6371 \begin_layout Plain Layout
6373 function track_mode(mode, text) {
6374 \end_layout
6376 \begin_layout Plain Layout
6378   if (mode["language"] == "C") {
6379 \end_layout
6381 \begin_layout Plain Layout
6383     =<
6384 \backslash
6385 chunkref{track-mode-C}>
6386 \end_layout
6388 \begin_layout Plain Layout
6390     return;
6391 \end_layout
6393 \begin_layout Plain Layout
6395   }
6396 \end_layout
6398 \begin_layout Plain Layout
6401 \end_layout
6403 \end_inset
6406 \end_layout
6408 \begin_layout Standard
6409 For each mode, we look for a character that has the power to change the
6410  mode.
6411 \end_layout
6413 \begin_layout Standard
6414 In plain mode:
6415 \end_layout
6417 \begin_layout List
6418 \labelwidthstring 00.00.0000
6419 \begin_inset Quotes eld
6420 \end_inset
6422  enters double-quote mode
6423 \end_layout
6425 \begin_layout List
6426 \labelwidthstring 00.00.0000
6427 ' enters single-quote mode
6428 \end_layout
6430 \begin_layout List
6431 \labelwidthstring 00.00.0000
6432 trailing-
6433 \backslash
6434  enters multi-line mode
6435 \end_layout
6437 \begin_layout List
6438 \labelwidthstring 00.00.0000
6439 # enters #define sub-mode, needs 
6440 \backslash
6441  escaping end of line too
6442 \end_layout
6444 \begin_layout List
6445 \labelwidthstring 00.00.0000
6446 /* enters comment mode
6447 \end_layout
6449 \begin_layout Standard
6450 In double-quote mode, escape 
6451 \backslash
6452  and 
6453 \begin_inset Quotes eld
6454 \end_inset
6456  and newline
6457 \end_layout
6459 \begin_layout Standard
6461 \backslash
6462  escapes prevents 
6463 \begin_inset Quotes eld
6464 \end_inset
6466  from leaving mode
6467 \end_layout
6469 \begin_layout Standard
6470 \begin_inset Quotes eld
6471 \end_inset
6473  leaves mode
6474 \end_layout
6476 \begin_layout Standard
6477 newline needs to close and re-open string or something
6478 \end_layout
6480 \begin_layout Standard
6481 in single-quote mode escape 
6482 \backslash
6483  and 
6484 \begin_inset Quotes eld
6485 \end_inset
6488 \end_layout
6490 \begin_layout Chunk
6491 track-mode-C
6492 \end_layout
6494 \begin_layout Standard
6495 \begin_inset listings
6496 inline false
6497 status open
6499 \begin_layout Plain Layout
6501 \end_layout
6503 \end_inset
6506 \end_layout
6508 \begin_layout Chunk
6509 mode-tracker
6510 \end_layout
6512 \begin_layout Standard
6513 \begin_inset listings
6514 inline false
6515 status open
6517 \begin_layout Plain Layout
6520 \backslash
6521 chunkref{new_mode()}>
6522 \end_layout
6524 \end_inset
6527 \end_layout
6529 \begin_layout Chapter
6530 Generating the output
6531 \end_layout
6533 \begin_layout Standard
6534 We generate output by calling output_chunk, or listing the chunk names.
6535 \end_layout
6537 \begin_layout Chunk
6538 generate-output
6539 \end_layout
6541 \begin_layout Standard
6542 \begin_inset listings
6543 inline false
6544 status open
6546 \begin_layout Plain Layout
6548 if (length(root)) output_chunk(root);
6549 \end_layout
6551 \begin_layout Plain Layout
6553 else output_chunk_names();
6554 \end_layout
6556 \end_inset
6559 \end_layout
6561 \begin_layout Standard
6562 We also have some other output debugging:
6563 \end_layout
6565 \begin_layout Chunk
6566 debug-output
6567 \end_layout
6569 \begin_layout Standard
6570 \begin_inset listings
6571 inline false
6572 status open
6574 \begin_layout Plain Layout
6576 if (debug) {
6577 \end_layout
6579 \begin_layout Plain Layout
6581   print "------ chunk names "
6582 \end_layout
6584 \begin_layout Plain Layout
6586   output_chunk_names();
6587 \end_layout
6589 \begin_layout Plain Layout
6591   print "====== chunks"
6592 \end_layout
6594 \begin_layout Plain Layout
6596   output_chunks();
6597 \end_layout
6599 \begin_layout Plain Layout
6601   print "++++++ debug"
6602 \end_layout
6604 \begin_layout Plain Layout
6606   for (a in chunks) {
6607 \end_layout
6609 \begin_layout Plain Layout
6611     print a "=" chunks[a];
6612 \end_layout
6614 \begin_layout Plain Layout
6616   }
6617 \end_layout
6619 \begin_layout Plain Layout
6622 \end_layout
6624 \end_inset
6627 \end_layout
6629 \begin_layout Standard
6630 We do both of these at the end.
6631  We also set 
6632 \begin_inset Flex CharStyle:Code
6633 status collapsed
6635 \begin_layout Plain Layout
6636 ORS=""
6637 \end_layout
6639 \end_inset
6641  because each chunklet is not necessarily a complete line, and we already
6642  added 
6643 \begin_inset Flex CharStyle:Code
6644 status collapsed
6646 \begin_layout Plain Layout
6648 \end_layout
6650 \end_inset
6652  to each input line in section 
6653 \begin_inset CommandInset ref
6654 LatexCommand ref
6655 reference "sub:ORS-chunk-text"
6657 \end_inset
6660 \end_layout
6662 \begin_layout Chunk
6664 \end_layout
6666 \begin_layout Standard
6667 \begin_inset listings
6668 inline false
6669 status open
6671 \begin_layout Plain Layout
6673 END {
6674 \end_layout
6676 \begin_layout Plain Layout
6678   =<
6679 \backslash
6680 chunkref{debug-output}>
6681 \end_layout
6683 \begin_layout Plain Layout
6685   ORS="";
6686 \end_layout
6688 \begin_layout Plain Layout
6690   =<
6691 \backslash
6692 chunkref{generate-output}>
6693 \end_layout
6695 \begin_layout Plain Layout
6698 \end_layout
6700 \end_inset
6703 \end_layout
6705 \begin_layout Standard
6706 We write chunk names like this.
6707  If we seem to be running in notangle compatibility mode, then we enclose
6708  the name like this 
6709 \begin_inset Flex CharStyle:Code
6710 status collapsed
6712 \begin_layout Plain Layout
6713 <<name>>
6714 \end_layout
6716 \end_inset
6718  the same way notangle does:
6719 \end_layout
6721 \begin_layout Chunk
6722 output_chunk_names()
6723 \end_layout
6725 \begin_layout Standard
6726 \begin_inset listings
6727 inline false
6728 status open
6730 \begin_layout Plain Layout
6732 function output_chunk_names(   c, prefix, suffix) 
6733 \end_layout
6735 \begin_layout Plain Layout
6738 \end_layout
6740 \begin_layout Plain Layout
6742   if (notangle_mode) {
6743 \end_layout
6745 \begin_layout Plain Layout
6747     prefix="<<";
6748 \end_layout
6750 \begin_layout Plain Layout
6752     suffix=">>";
6753 \end_layout
6755 \begin_layout Plain Layout
6757   }
6758 \end_layout
6760 \begin_layout Plain Layout
6762   for (c in chunk_names) {
6763 \end_layout
6765 \begin_layout Plain Layout
6767     print prefix c suffix;
6768 \end_layout
6770 \begin_layout Plain Layout
6772   }
6773 \end_layout
6775 \begin_layout Plain Layout
6778 \end_layout
6780 \end_inset
6783 \end_layout
6785 \begin_layout Standard
6786 This function would write out all chunks
6787 \end_layout
6789 \begin_layout Chunk
6790 output_chunks()
6791 \end_layout
6793 \begin_layout Standard
6794 \begin_inset listings
6795 inline false
6796 status open
6798 \begin_layout Plain Layout
6800 function output_chunks(  a) 
6801 \end_layout
6803 \begin_layout Plain Layout
6806 \end_layout
6808 \begin_layout Plain Layout
6810   for (a in chunk_names) {
6811 \end_layout
6813 \begin_layout Plain Layout
6815     output_chunk(chunk_names[a]);
6816 \end_layout
6818 \begin_layout Plain Layout
6820   }
6821 \end_layout
6823 \begin_layout Plain Layout
6826 \end_layout
6828 \begin_layout Plain Layout
6830 \end_layout
6832 \begin_layout Plain Layout
6834 function output_chunk(chunk) {
6835 \end_layout
6837 \begin_layout Plain Layout
6839   newline = 1;
6840 \end_layout
6842 \begin_layout Plain Layout
6844   lineno_needed = linenos;
6845 \end_layout
6847 \begin_layout Plain Layout
6849 \end_layout
6851 \begin_layout Plain Layout
6853   write_chunk(chunk);
6854 \end_layout
6856 \begin_layout Plain Layout
6859 \end_layout
6861 \begin_layout Plain Layout
6863 \end_layout
6865 \end_inset
6868 \end_layout
6870 \begin_layout Section
6871 Assembling the chunks
6872 \end_layout
6874 \begin_layout Standard
6875 \begin_inset Flex CharStyle:Code
6876 status collapsed
6878 \begin_layout Plain Layout
6879 chunk_path
6880 \end_layout
6882 \end_inset
6884  holds a string consisting of the names of all the chunks that resulted
6885  in this chunk being output.
6887 \begin_inset Note Note
6888 status collapsed
6890 \begin_layout Plain Layout
6891 Make sure it includes the line numbers too...
6893 \end_layout
6895 \end_inset
6897 It should probably also contain the source line numbers at which each inclusion
6898  also occured.
6899 \end_layout
6901 \begin_layout Chunk
6902 write_chunk(),emph={chunk_path}
6903 \end_layout
6905 \begin_layout Standard
6906 \begin_inset listings
6907 inline false
6908 status open
6910 \begin_layout Plain Layout
6912 function write_chunk(chunk_name, indent, tail,
6913 \end_layout
6915 \begin_layout Plain Layout
6917   # optional vars
6918 \end_layout
6920 \begin_layout Plain Layout
6922   chunk_path, chunk_args, 
6923 \end_layout
6925 \begin_layout Plain Layout
6927   # local vars
6928 \end_layout
6930 \begin_layout Plain Layout
6932   part, max_part, part_line, frag, max_frag, text, 
6933 \end_layout
6935 \begin_layout Plain Layout
6937   chunklet, only_part, call_chunk_args, mode)
6938 \end_layout
6940 \begin_layout Plain Layout
6943 \end_layout
6945 \end_inset
6948 \end_layout
6950 \begin_layout Subsection
6951 \begin_inset CommandInset label
6952 LatexCommand label
6953 name "sub:Chunk-parts"
6955 \end_inset
6957 Chunk parts
6958 \end_layout
6960 \begin_layout Standard
6961 As mentioned in section 
6962 \begin_inset CommandInset ref
6963 LatexCommand ref
6964 reference "sub:lstlistings-includes"
6966 \end_inset
6968 , a chunk name may contain a part specifier in square brackets, limiting
6969  the parts that should be emitted.
6970 \end_layout
6972 \begin_layout Standard
6973 \begin_inset listings
6974 inline false
6975 status open
6977 \begin_layout Plain Layout
6979   if (match(chunk_name, "^(.*)
6980 \backslash
6982 \backslash
6983 [([0-9]*)
6984 \backslash
6986 \backslash
6987 ]$", chunk_name_parts)) {
6988 \end_layout
6990 \begin_layout Plain Layout
6992     chunk_name = chunk_name_parts[1];
6993 \end_layout
6995 \begin_layout Plain Layout
6997     only_part = chunk_name_parts[2];
6998 \end_layout
7000 \begin_layout Plain Layout
7002   }
7003 \end_layout
7005 \end_inset
7008 \end_layout
7010 \begin_layout Standard
7011 We first create the mode tracker for this chunk.
7012 \end_layout
7014 \begin_layout Standard
7015 \begin_inset listings
7016 inline false
7017 status open
7019 \begin_layout Plain Layout
7021   =<
7022 \backslash
7023 chunkref{awk-delete-array}(mode)>
7024 \end_layout
7026 \begin_layout Plain Layout
7028   new_mode(chunks[chunk_name, "language"], mode);
7029 \end_layout
7031 \end_inset
7034 \end_layout
7036 \begin_layout Standard
7037 We extract into 
7038 \begin_inset Flex CharStyle:Code
7039 status collapsed
7041 \begin_layout Plain Layout
7042 chunk_params
7043 \end_layout
7045 \end_inset
7047  the names of the parameters that this chunk accepts, whose values were
7048  (optionally) passed in 
7049 \begin_inset Flex CharStyle:Code
7050 status collapsed
7052 \begin_layout Plain Layout
7053 chunk_args
7054 \end_layout
7056 \end_inset
7059 \end_layout
7061 \begin_layout Standard
7062 \begin_inset listings
7063 inline false
7064 status open
7066 \begin_layout Plain Layout
7068   split(chunks[chunk_name, "params"], chunk_params, " *; *");
7069 \end_layout
7071 \end_inset
7074 \end_layout
7076 \begin_layout Standard
7077 To assemble a chunk, we write out each part.
7078 \end_layout
7080 \begin_layout Chunk
7081 write_chunk()
7082 \end_layout
7084 \begin_layout Standard
7085 \begin_inset listings
7086 inline false
7087 status open
7089 \begin_layout Plain Layout
7091   if (! (chunk_name in chunk_names)) {
7092 \end_layout
7094 \begin_layout Plain Layout
7096     error(sprintf(_"The root module <<%s>> was not defined.
7097 \backslash
7098 nUsed by: %s",
7099 \backslash
7101 \end_layout
7103 \begin_layout Plain Layout
7105                   chunk_name, chunk_path));
7106 \end_layout
7108 \begin_layout Plain Layout
7110   }
7111 \end_layout
7113 \begin_layout Plain Layout
7115 \end_layout
7117 \begin_layout Plain Layout
7119   max_part = chunks[chunk_name, "part"];
7120 \end_layout
7122 \begin_layout Plain Layout
7124   for(part = 1; part <= max_part; part++) {
7125 \end_layout
7127 \begin_layout Plain Layout
7129     if (! only_part || part == only_part) {
7130 \end_layout
7132 \begin_layout Plain Layout
7134       =<
7135 \backslash
7136 chunkref{write-part}>
7137 \end_layout
7139 \begin_layout Plain Layout
7141     }
7142 \end_layout
7144 \begin_layout Plain Layout
7146   }
7147 \end_layout
7149 \begin_layout Plain Layout
7152 \end_layout
7154 \end_inset
7157 \end_layout
7159 \begin_layout Standard
7160 A part can either be a chunklet of lines, or an include of another chunk.
7161 \end_layout
7163 \begin_layout Standard
7164 Chunks may also have parameters, specified in LaTeX style with braces after
7165  the chunk name --- looking like this in the document: 
7166 \begin_inset Flex CharStyle:Code
7167 status collapsed
7169 \begin_layout Plain Layout
7170 chunkname{param1, param2}
7171 \end_layout
7173 \end_inset
7176  Arguments are passed in square brackets: 
7177 \begin_inset Flex CharStyle:Code
7178 status collapsed
7180 \begin_layout Plain Layout
7182 \backslash
7183 chunkref{chunkname}[arg1, arg2]
7184 \end_layout
7186 \end_inset
7189 \end_layout
7191 \begin_layout Standard
7192 Before we process each part, we check that the source position hasn't changed
7193  unexpectedly, so that we can know if we need to output a new file-line
7194  directive.
7195 \end_layout
7197 \begin_layout Chunk
7198 write-part
7199 \end_layout
7201 \begin_layout Standard
7202 \begin_inset listings
7203 inline false
7204 status open
7206 \begin_layout Plain Layout
7209 \backslash
7210 chunkref{check-source-jump}>
7211 \end_layout
7213 \begin_layout Plain Layout
7215 \end_layout
7217 \begin_layout Plain Layout
7219 chunklet = chunks[chunk_name, "part", part];
7220 \end_layout
7222 \begin_layout Plain Layout
7224 if (chunks[chunk_name, "part", part, "type"] == part_type_chunk) {
7225 \end_layout
7227 \begin_layout Plain Layout
7229   =<
7230 \backslash
7231 chunkref{write-included-chunk}>
7232 \end_layout
7234 \begin_layout Plain Layout
7236 } else if (chunklet SUBSEP "line" in chunks) {
7237 \end_layout
7239 \begin_layout Plain Layout
7241   =<
7242 \backslash
7243 chunkref{write-chunklets}>
7244 \end_layout
7246 \begin_layout Plain Layout
7248 } else {
7249 \end_layout
7251 \begin_layout Plain Layout
7253   # empty last chunklet
7254 \end_layout
7256 \begin_layout Plain Layout
7259 \end_layout
7261 \end_inset
7264 \end_layout
7266 \begin_layout Standard
7267 To write an included chunk, we must detect any optional chunk arguments
7268  in parenthesis.
7269  Then we recurse calling 
7270 \begin_inset Flex Chunkref
7271 status collapsed
7273 \begin_layout Plain Layout
7274 write_chunk()
7275 \end_layout
7277 \end_inset
7280 \end_layout
7282 \begin_layout Chunk
7283 write-included-chunk
7284 \end_layout
7286 \begin_layout Standard
7287 \begin_inset listings
7288 inline false
7289 status open
7291 \begin_layout Plain Layout
7293 if (match(chunklet, "^([^
7294 \backslash
7296 \backslash
7297 []*)
7298 \backslash
7300 \backslash
7301 ((.*)
7302 \backslash
7304 \backslash
7305 )$", chunklet_parts)) {
7306 \end_layout
7308 \begin_layout Plain Layout
7310   chunklet = chunklet_parts[1];
7311 \end_layout
7313 \begin_layout Plain Layout
7315   split(chunklet_parts[2], call_chunk_args, " *, *");
7316 \end_layout
7318 \begin_layout Plain Layout
7320   for (c in call_chunk_args) {
7321 \end_layout
7323 \begin_layout Plain Layout
7325     call_chunk_args[c] = expand_chunk_args(call_chunk_args[c], chunk_params,
7326  chunk_args);
7327 \end_layout
7329 \begin_layout Plain Layout
7331   }
7332 \end_layout
7334 \begin_layout Plain Layout
7336 } else {
7337 \end_layout
7339 \begin_layout Plain Layout
7341   =<
7342 \backslash
7343 chunkref{awk-delete-array}(call_chunk_args)>
7344 \end_layout
7346 \begin_layout Plain Layout
7349 \end_layout
7351 \begin_layout Plain Layout
7353 write_chunk(chunklet,
7354 \end_layout
7356 \begin_layout Plain Layout
7358             chunks[chunk_name, "part", part, "indent"] indent,
7359 \end_layout
7361 \begin_layout Plain Layout
7363             chunks[chunk_name, "part", part, "tail"],
7364 \end_layout
7366 \begin_layout Plain Layout
7368             chunk_path "
7369 \backslash
7370 n         " chunk_name,
7371 \end_layout
7373 \begin_layout Plain Layout
7375             call_chunk_args);
7376 \end_layout
7378 \end_inset
7381 \end_layout
7383 \begin_layout Standard
7384 Before we output a chunklet of lines, we first emit the file and line number
7385  if we have one, and if it is safe to do so.
7387 \end_layout
7389 \begin_layout Standard
7390 Chunklets are generally broken up by includes, so the start of a chunklet
7391  is a good place to do this.
7392  Then we output each line of the chunklet.
7393 \end_layout
7395 \begin_layout Standard
7396 When it is not safe, such as in the middle of a multi-line macro definition,
7398 \begin_inset Flex CharStyle:Code
7399 status collapsed
7401 \begin_layout Plain Layout
7402 lineno_suppressed
7403 \end_layout
7405 \end_inset
7407  is set to true, and in such a case we note that we want to emit the line
7408  statement when it is next safe.
7409 \end_layout
7411 \begin_layout Chunk
7412 write-chunklets
7413 \end_layout
7415 \begin_layout Standard
7416 \begin_inset listings
7417 inline false
7418 status open
7420 \begin_layout Plain Layout
7422 max_frag = chunks[chunklet, "line"];
7423 \end_layout
7425 \begin_layout Plain Layout
7427 for(frag = 1; frag <= max_frag; frag++) {
7428 \end_layout
7430 \begin_layout Plain Layout
7432   =<
7433 \backslash
7434 chunkref{write-file-line}>
7435 \end_layout
7437 \end_inset
7440 \end_layout
7442 \begin_layout Standard
7443 We then extract the chunklet text and expand any arguments.
7444 \end_layout
7446 \begin_layout Standard
7447 \begin_inset listings
7448 inline false
7449 status open
7451 \begin_layout Plain Layout
7453 \end_layout
7455 \begin_layout Plain Layout
7457   text = chunks[chunklet, frag];
7458 \end_layout
7460 \begin_layout Plain Layout
7463 \end_layout
7465 \begin_layout Plain Layout
7467   /* check params */
7468 \end_layout
7470 \begin_layout Plain Layout
7472   text = expand_chunk_args(text, chunk_params, chunk_args);
7473 \end_layout
7475 \end_inset
7478 \end_layout
7480 \begin_layout Standard
7481 If the text is a single newline (which we keep separate - see 
7482 \begin_inset CommandInset ref
7483 LatexCommand ref
7484 reference "lone-newline"
7486 \end_inset
7488 ) then we increment the line number.
7489  In the case where this is the last line of a chunk and it is not a top-level
7490  chunk we replace the newline with an empty string --- because the chunk
7491  that included this chunk will have the newline at the end of the line that
7492  included this chunk.
7493 \end_layout
7495 \begin_layout Standard
7496 We also note by 
7497 \begin_inset Flex CharStyle:Code
7498 status collapsed
7500 \begin_layout Plain Layout
7501 newline = 1
7502 \end_layout
7504 \end_inset
7506  that we have started a new line, so that indentation can be managed with
7507  the following piece of text.
7508 \end_layout
7510 \begin_layout Standard
7511 \begin_inset listings
7512 inline false
7513 status open
7515 \begin_layout Plain Layout
7517 \end_layout
7519 \begin_layout Plain Layout
7521  if (text == "
7522 \backslash
7523 n") {
7524 \end_layout
7526 \begin_layout Plain Layout
7528     lineno++;
7529 \end_layout
7531 \begin_layout Plain Layout
7533     if (part == max_part && frag == max_frag && length(chunk_path)) {
7534 \end_layout
7536 \begin_layout Plain Layout
7538       text = "";
7539 \end_layout
7541 \begin_layout Plain Layout
7543       break;
7544 \end_layout
7546 \begin_layout Plain Layout
7548     } else {
7549 \end_layout
7551 \begin_layout Plain Layout
7553       newline = 1;
7554 \end_layout
7556 \begin_layout Plain Layout
7558     }
7559 \end_layout
7561 \end_inset
7564 \end_layout
7566 \begin_layout Standard
7567 If this text does not represent a newline, but we see that we are the first
7568  piece of text on a newline, then we prefix our text with the current indent.
7569  NOTE: 
7570 \begin_inset Flex CharStyle:Code
7571 status collapsed
7573 \begin_layout Plain Layout
7574 newline
7575 \end_layout
7577 \end_inset
7579  is a global output-state variable, but the 
7580 \begin_inset Flex CharStyle:Code
7581 status collapsed
7583 \begin_layout Plain Layout
7584 indent
7585 \end_layout
7587 \end_inset
7589  is not.
7591 \end_layout
7593 \begin_layout Standard
7594 \begin_inset listings
7595 inline false
7596 status open
7598 \begin_layout Plain Layout
7600   } else {
7601 \end_layout
7603 \begin_layout Plain Layout
7605     if (newline) text = indent text;
7606 \end_layout
7608 \begin_layout Plain Layout
7610     newline = 0;
7611 \end_layout
7613 \begin_layout Plain Layout
7615   }
7616 \end_layout
7618 \begin_layout Plain Layout
7620 \end_layout
7622 \end_inset
7625 \end_layout
7627 \begin_layout Standard
7628 Tail will soon no longer be relevant once mode-detection is in place.
7629 \end_layout
7631 \begin_layout Standard
7632 \begin_inset listings
7633 inline false
7634 status open
7636 \begin_layout Plain Layout
7638   text = text tail;
7639 \end_layout
7641 \begin_layout Plain Layout
7643 #  track_mode(mode, text);
7644 \end_layout
7646 \begin_layout Plain Layout
7648   print text;
7649 \end_layout
7651 \end_inset
7654 \end_layout
7656 \begin_layout Standard
7657 If a line ends in a backslash --- suggesting continuation --- then we supress
7658  outputting file-line as it would probably break the continued lines.
7660 \end_layout
7662 \begin_layout Standard
7663 \begin_inset listings
7664 inline false
7665 status open
7667 \begin_layout Plain Layout
7669   if (linenos) {
7670 \end_layout
7672 \begin_layout Plain Layout
7674     lineno_suppressed = substr(lastline, length(lastline)) == "
7675 \backslash
7677 \backslash
7679 \end_layout
7681 \begin_layout Plain Layout
7683   }
7684 \end_layout
7686 \begin_layout Plain Layout
7689 \end_layout
7691 \end_inset
7694 \end_layout
7696 \begin_layout Standard
7697 Of course there is no point in actually outputting the source filename and
7698  line number (file-line) if they don't say anything new! We only need to
7699  emit them if they aren't what is expected, or if we we not able to emit
7700  one when they had changed.
7701 \end_layout
7703 \begin_layout Chunk
7704 write-file-line
7705 \end_layout
7707 \begin_layout Standard
7708 \begin_inset listings
7709 inline false
7710 status open
7712 \begin_layout Plain Layout
7714 if (newline && lineno_needed && ! lineno_suppressed) {
7715 \end_layout
7717 \begin_layout Plain Layout
7719   filename = a_filename;
7720 \end_layout
7722 \begin_layout Plain Layout
7724   lineno = a_lineno;
7725 \end_layout
7727 \begin_layout Plain Layout
7729   print "#line " lineno " 
7730 \backslash
7731 "" filename "
7732 \backslash
7734 \backslash
7736 \end_layout
7738 \begin_layout Plain Layout
7740   lineno_needed = 0;
7741 \end_layout
7743 \begin_layout Plain Layout
7746 \end_layout
7748 \end_inset
7751 \end_layout
7753 \begin_layout Standard
7754 We check if a new file-line is needed by checking if the source line matches
7755  what we (or a compiler) would expect.
7757 \end_layout
7759 \begin_layout Chunk
7760 check-source-jump
7761 \end_layout
7763 \begin_layout Standard
7764 \begin_inset listings
7765 inline false
7766 status open
7768 \begin_layout Plain Layout
7770 if (linenos && (chunk_name SUBSEP "part" SUBSEP part SUBSEP "FILENAME" in
7771  chunks)) {
7772 \end_layout
7774 \begin_layout Plain Layout
7776   a_filename = chunks[chunk_name, "part", part, "FILENAME"];
7777 \end_layout
7779 \begin_layout Plain Layout
7781   a_lineno = chunks[chunk_name, "part", part, "LINENO"];
7782 \end_layout
7784 \begin_layout Plain Layout
7786   if (a_filename != filename || a_lineno != lineno) {
7787 \end_layout
7789 \begin_layout Plain Layout
7791     lineno_needed++;
7792 \end_layout
7794 \begin_layout Plain Layout
7796   }
7797 \end_layout
7799 \begin_layout Plain Layout
7802 \end_layout
7804 \end_inset
7807 \end_layout
7809 \begin_layout Chapter
7810 Storing chunks
7811 \end_layout
7813 \begin_layout Standard
7814 Awk has pretty limited data structures, so we will use two main hashes.
7815  Uninterrupted sequences of a chunk will be stored in 
7816 \begin_inset Flex CharStyle:Code
7817 status collapsed
7819 \begin_layout Plain Layout
7820 chunklets
7821 \end_layout
7823 \end_inset
7825  and the chunklets used in a chunk will be stored in 
7826 \begin_inset Flex CharStyle:Code
7827 status collapsed
7829 \begin_layout Plain Layout
7830 chunks
7831 \end_layout
7833 \end_inset
7836 \end_layout
7838 \begin_layout Chunk
7839 constants
7840 \end_layout
7842 \begin_layout Standard
7843 \begin_inset listings
7844 inline false
7845 status open
7847 \begin_layout Plain Layout
7849 part_type_chunk=1;
7850 \end_layout
7852 \end_inset
7855 \end_layout
7857 \begin_layout Standard
7858 The 
7859 \begin_inset Flex CharStyle:Code
7860 status collapsed
7862 \begin_layout Plain Layout
7863 params
7864 \end_layout
7866 \end_inset
7868  mentioned are not chunk parameters for parameterized chunks, as mentioned
7869  in 
7870 \begin_inset CommandInset ref
7871 LatexCommand ref
7872 reference "cha:Chunk Arguments"
7874 \end_inset
7876 , but the lstlistings style parameters used in the 
7877 \begin_inset Flex CharStyle:Code
7878 status collapsed
7880 \begin_layout Plain Layout
7882 \backslash
7883 Chunk
7884 \end_layout
7886 \end_inset
7888  command
7889 \begin_inset Foot
7890 status collapsed
7892 \begin_layout Plain Layout
7893 The 
7894 \begin_inset Flex CharStyle:Code
7895 status collapsed
7897 \begin_layout Plain Layout
7898 params
7899 \end_layout
7901 \end_inset
7903  parameter is used to hold the parameters for parameterized chunks
7904 \end_layout
7906 \end_inset
7909 \end_layout
7911 \begin_layout Chunk
7912 chunk-storage-functions
7913 \end_layout
7915 \begin_layout Standard
7916 \begin_inset listings
7917 inline false
7918 status open
7920 \begin_layout Plain Layout
7922 function new_chunk(chunk_name, params,
7923 \end_layout
7925 \begin_layout Plain Layout
7927   # local vars
7928 \end_layout
7930 \begin_layout Plain Layout
7932   p )
7933 \end_layout
7935 \begin_layout Plain Layout
7938 \end_layout
7940 \begin_layout Plain Layout
7942   # HACK WHILE WE CHANGE TO ( ) for PARAM CHUNKS
7943 \end_layout
7945 \begin_layout Plain Layout
7947   gsub("
7948 \backslash
7950 \backslash
7952 \backslash
7954 \backslash
7955 )$", "", chunk_name);
7956 \end_layout
7958 \begin_layout Plain Layout
7960   active_chunk = chunk_name;
7961 \end_layout
7963 \begin_layout Plain Layout
7965   if (! (chunk_name in chunk_names)) {
7966 \end_layout
7968 \begin_layout Plain Layout
7970     if (debug) print "New chunk " chunk_name;
7971 \end_layout
7973 \begin_layout Plain Layout
7975     chunk_names[chunk_name];
7976 \end_layout
7978 \begin_layout Plain Layout
7980     for (p in params) {
7981 \end_layout
7983 \begin_layout Plain Layout
7985       chunks[chunk_name, p] = params[p];
7986 \end_layout
7988 \begin_layout Plain Layout
7990     }
7991 \end_layout
7993 \begin_layout Plain Layout
7995   }
7996 \end_layout
7998 \begin_layout Plain Layout
8000   prime_chunk(chunk_name);
8001 \end_layout
8003 \begin_layout Plain Layout
8006 \end_layout
8008 \end_inset
8011 \end_layout
8013 \begin_layout Standard
8014 \begin_inset listings
8015 inline false
8016 status open
8018 \begin_layout Plain Layout
8020 \end_layout
8022 \begin_layout Plain Layout
8024 function prime_chunk(chunk_name)
8025 \end_layout
8027 \begin_layout Plain Layout
8030 \end_layout
8032 \begin_layout Plain Layout
8034   chunks[chunk_name, "part", ++chunks[chunk_name, "part"] ] = 
8035 \backslash
8037 \end_layout
8039 \begin_layout Plain Layout
8041          chunk_name SUBSEP "chunklet" SUBSEP "" ++chunks[chunk_name, "chunklet"]
8043 \end_layout
8045 \begin_layout Plain Layout
8047   chunks[chunk_name, "part", chunks[chunk_name, "part"], "FILENAME"] = FILENAME;
8048 \end_layout
8050 \begin_layout Plain Layout
8052   chunks[chunk_name, "part", chunks[chunk_name, "part"], "LINENO"] = FNR
8053  + 1;
8054 \end_layout
8056 \begin_layout Plain Layout
8059 \end_layout
8061 \begin_layout Plain Layout
8063 \end_layout
8065 \begin_layout Plain Layout
8067 function chunk_line(chunk_name, line){
8068 \end_layout
8070 \begin_layout Plain Layout
8072   chunks[chunk_name, "chunklet", chunks[chunk_name, "chunklet"],
8073 \end_layout
8075 \begin_layout Plain Layout
8077          ++chunks[chunk_name, "chunklet", chunks[chunk_name, "chunklet"],
8078  "line"]  ] = line;
8079 \end_layout
8081 \begin_layout Plain Layout
8084 \end_layout
8086 \begin_layout Plain Layout
8088 \end_layout
8090 \end_inset
8093 \end_layout
8095 \begin_layout Standard
8096 Chunk include represents a 
8097 \emph on
8098 chunkref
8099 \emph default
8100  statement, and stores the requirement to include another chunk.
8101  The parameter indent represents the quanity of literal text characters
8102  that preceded this 
8103 \emph on
8104 chunkref
8105 \emph default
8106  statement and therefore by how much additional lines of the included chunk
8107  should be indented.
8108 \end_layout
8110 \begin_layout Standard
8111 \begin_inset listings
8112 inline false
8113 status open
8115 \begin_layout Plain Layout
8117 function chunk_include(chunk_name, chunk_ref, indent, tail)
8118 \end_layout
8120 \begin_layout Plain Layout
8123 \end_layout
8125 \begin_layout Plain Layout
8127   chunks[chunk_name, "part", ++chunks[chunk_name, "part"] ] = chunk_ref;
8128 \end_layout
8130 \begin_layout Plain Layout
8132   chunks[chunk_name, "part", chunks[chunk_name, "part"], "type" ] = part_type_ch
8133 unk;
8134 \end_layout
8136 \begin_layout Plain Layout
8138   chunks[chunk_name, "part", chunks[chunk_name, "part"], "indent" ] = indent_str
8139 ing(indent);
8140 \end_layout
8142 \begin_layout Plain Layout
8144   chunks[chunk_name, "part", chunks[chunk_name, "part"], "tail" ] = tail;
8145 \end_layout
8147 \begin_layout Plain Layout
8149   prime_chunk(chunk_name);
8150 \end_layout
8152 \begin_layout Plain Layout
8155 \end_layout
8157 \begin_layout Plain Layout
8159 \end_layout
8161 \end_inset
8164 \end_layout
8166 \begin_layout Standard
8167 The indent is calculated by indent_string, which may in future convert some
8168  spaces into tab characters.
8169  This function works by generating a printf padded format string, like 
8170 \begin_inset Flex CharStyle:Code
8171 status collapsed
8173 \begin_layout Plain Layout
8174 %22s
8175 \end_layout
8177 \end_inset
8179  for an indent of 22, and then printing an empty string using that format.
8180 \end_layout
8182 \begin_layout Standard
8183 \begin_inset listings
8184 inline false
8185 status open
8187 \begin_layout Plain Layout
8189 function indent_string(indent) {
8190 \end_layout
8192 \begin_layout Plain Layout
8194   return sprintf("%" indent "s", "");
8195 \end_layout
8197 \begin_layout Plain Layout
8200 \end_layout
8202 \end_inset
8205 \end_layout
8207 \begin_layout Chapter
8208 \begin_inset CommandInset label
8209 LatexCommand label
8210 name "cha:getopt"
8212 \end_inset
8214 getopt
8215 \end_layout
8217 \begin_layout Standard
8218 I use Arnold Robbins public domain getopt (1993 revision).
8219  This is probably the same one that is covered in chapter 12 of 
8220 \begin_inset Quotes eld
8221 \end_inset
8223 Edition 3 of GAWK: Effective AWK Programming: A User's Guide for GNU Awk
8224 \begin_inset Quotes erd
8225 \end_inset
8227  but as that is licensed under the GNU Free Documentation License, Version
8228  1.3, which conflicts with the GPL3, I can't use it from there (or it's accompany
8229 ing explanations), so I do my best to explain how it works here.
8230 \end_layout
8232 \begin_layout Standard
8233 The getopt.awk header is:
8234 \end_layout
8236 \begin_layout Chunk
8237 getopt.awk-header,language=awk,morestring=[b]{/},morekeywords=else
8238 \end_layout
8240 \begin_layout Standard
8241 \begin_inset listings
8242 inline false
8243 status open
8245 \begin_layout Plain Layout
8247 # getopt.awk --- do C library getopt(3) function in awk
8248 \end_layout
8250 \begin_layout Plain Layout
8253 \end_layout
8255 \begin_layout Plain Layout
8257 # Arnold Robbins, arnold@skeeve.com, Public Domain
8258 \end_layout
8260 \begin_layout Plain Layout
8263 \end_layout
8265 \begin_layout Plain Layout
8267 # Initial version: March, 1991
8268 \end_layout
8270 \begin_layout Plain Layout
8272 # Revised: May, 1993
8273 \end_layout
8275 \end_inset
8278 \end_layout
8280 \begin_layout Standard
8281 The provided explanation is:
8282 \end_layout
8284 \begin_layout Chunk
8285 getopt.awk-notes
8286 \end_layout
8288 \begin_layout Standard
8289 \begin_inset listings
8290 inline false
8291 status open
8293 \begin_layout Plain Layout
8295 # External variables:
8296 \end_layout
8298 \begin_layout Plain Layout
8300 #    Optind -- index in ARGV of first nonoption argument
8301 \end_layout
8303 \begin_layout Plain Layout
8305 #    Optarg -- string value of argument to current option
8306 \end_layout
8308 \begin_layout Plain Layout
8310 #    Opterr -- if nonzero, print our own diagnostic
8311 \end_layout
8313 \begin_layout Plain Layout
8315 #    Optopt -- current option letter
8316 \end_layout
8318 \begin_layout Plain Layout
8320 \end_layout
8322 \begin_layout Plain Layout
8324 # Returns:
8325 \end_layout
8327 \begin_layout Plain Layout
8329 #    -1     at end of options
8330 \end_layout
8332 \begin_layout Plain Layout
8334 #    ?      for unrecognized option
8335 \end_layout
8337 \begin_layout Plain Layout
8339 #    <c>    a character representing the current option
8340 \end_layout
8342 \begin_layout Plain Layout
8344 \end_layout
8346 \begin_layout Plain Layout
8348 # Private Data:
8349 \end_layout
8351 \begin_layout Plain Layout
8353 #    _opti  -- index in multi-flag option, e.g., -abc
8354 \end_layout
8356 \end_inset
8359 \end_layout
8361 \begin_layout Standard
8362 The function follows.
8363  The final two parameters, 
8364 \begin_inset Flex CharStyle:Code
8365 status collapsed
8367 \begin_layout Plain Layout
8368 thisopt
8369 \end_layout
8371 \end_inset
8373  and 
8374 \begin_inset Flex CharStyle:Code
8375 status collapsed
8377 \begin_layout Plain Layout
8379 \end_layout
8381 \end_inset
8383  are local variables and not parameters --- as indicated by the multiple
8384  spaces preceding them.
8385  Awk doesn't care, the multiple spaces are a convention to help us humans.
8386 \end_layout
8388 \begin_layout Chunk
8389 getopt.awk-getopt()
8390 \end_layout
8392 \begin_layout Standard
8393 \begin_inset listings
8394 inline false
8395 status open
8397 \begin_layout Plain Layout
8399 function getopt(argc, argv, options,    thisopt, i)
8400 \end_layout
8402 \begin_layout Plain Layout
8405 \end_layout
8407 \begin_layout Plain Layout
8409     if (length(options) == 0)    # no options given
8410 \end_layout
8412 \begin_layout Plain Layout
8414         return -1
8415 \end_layout
8417 \begin_layout Plain Layout
8419     if (argv[Optind] == "--") {  # all done
8420 \end_layout
8422 \begin_layout Plain Layout
8424         Optind++
8425 \end_layout
8427 \begin_layout Plain Layout
8429         _opti = 0
8430 \end_layout
8432 \begin_layout Plain Layout
8434         return -1
8435 \end_layout
8437 \begin_layout Plain Layout
8439     } else if (argv[Optind] !~ /^-[^: 
8440 \backslash
8442 \backslash
8444 \backslash
8446 \backslash
8448 \backslash
8450 \backslash
8451 b]/) {
8452 \end_layout
8454 \begin_layout Plain Layout
8456         _opti = 0
8457 \end_layout
8459 \begin_layout Plain Layout
8461         return -1
8462 \end_layout
8464 \begin_layout Plain Layout
8466     }
8467 \end_layout
8469 \begin_layout Plain Layout
8471     if (_opti == 0)
8472 \end_layout
8474 \begin_layout Plain Layout
8476         _opti = 2
8477 \end_layout
8479 \begin_layout Plain Layout
8481     thisopt = substr(argv[Optind], _opti, 1)
8482 \end_layout
8484 \begin_layout Plain Layout
8486     Optopt = thisopt
8487 \end_layout
8489 \begin_layout Plain Layout
8491     i = index(options, thisopt)
8492 \end_layout
8494 \begin_layout Plain Layout
8496     if (i == 0) {
8497 \end_layout
8499 \begin_layout Plain Layout
8501         if (Opterr)
8502 \end_layout
8504 \begin_layout Plain Layout
8506             printf("%c -- invalid option
8507 \backslash
8509 \end_layout
8511 \begin_layout Plain Layout
8513                                   thisopt) > "/dev/stderr"
8514 \end_layout
8516 \begin_layout Plain Layout
8518         if (_opti >= length(argv[Optind])) {
8519 \end_layout
8521 \begin_layout Plain Layout
8523             Optind++
8524 \end_layout
8526 \begin_layout Plain Layout
8528             _opti = 0
8529 \end_layout
8531 \begin_layout Plain Layout
8533         } else
8534 \end_layout
8536 \begin_layout Plain Layout
8538             _opti++
8539 \end_layout
8541 \begin_layout Plain Layout
8543         return "?"
8544 \end_layout
8546 \begin_layout Plain Layout
8548     }
8549 \end_layout
8551 \end_inset
8554 \end_layout
8556 \begin_layout Standard
8557 At this point, the option has been found and we need to know if it takes
8558  any arguments.
8559 \end_layout
8561 \begin_layout Standard
8562 \begin_inset listings
8563 inline false
8564 status open
8566 \begin_layout Plain Layout
8568     if (substr(options, i + 1, 1) == ":") {
8569 \end_layout
8571 \begin_layout Plain Layout
8573         # get option argument
8574 \end_layout
8576 \begin_layout Plain Layout
8578         if (length(substr(argv[Optind], _opti + 1)) > 0)
8579 \end_layout
8581 \begin_layout Plain Layout
8583             Optarg = substr(argv[Optind], _opti + 1)
8584 \end_layout
8586 \begin_layout Plain Layout
8588         else
8589 \end_layout
8591 \begin_layout Plain Layout
8593             Optarg = argv[++Optind]
8594 \end_layout
8596 \begin_layout Plain Layout
8598         _opti = 0
8599 \end_layout
8601 \begin_layout Plain Layout
8603     } else
8604 \end_layout
8606 \begin_layout Plain Layout
8608         Optarg = ""
8609 \end_layout
8611 \begin_layout Plain Layout
8613     if (_opti == 0 || _opti >= length(argv[Optind])) {
8614 \end_layout
8616 \begin_layout Plain Layout
8618         Optind++
8619 \end_layout
8621 \begin_layout Plain Layout
8623         _opti = 0
8624 \end_layout
8626 \begin_layout Plain Layout
8628     } else
8629 \end_layout
8631 \begin_layout Plain Layout
8633         _opti++
8634 \end_layout
8636 \begin_layout Plain Layout
8638     return thisopt
8639 \end_layout
8641 \begin_layout Plain Layout
8644 \end_layout
8646 \end_inset
8648 A test program is built in, too
8649 \end_layout
8651 \begin_layout Chunk
8652 getopt.awk-begin
8653 \end_layout
8655 \begin_layout Standard
8656 \begin_inset listings
8657 inline false
8658 status open
8660 \begin_layout Plain Layout
8662 BEGIN {
8663 \end_layout
8665 \begin_layout Plain Layout
8667     Opterr = 1    # default is to diagnose
8668 \end_layout
8670 \begin_layout Plain Layout
8672     Optind = 1    # skip ARGV[0]
8673 \end_layout
8675 \begin_layout Plain Layout
8677     # test program
8678 \end_layout
8680 \begin_layout Plain Layout
8682     if (_getopt_test) {
8683 \end_layout
8685 \begin_layout Plain Layout
8687         while ((_go_c = getopt(ARGC, ARGV, "ab:cd")) != -1)
8688 \end_layout
8690 \begin_layout Plain Layout
8692             printf("c = <%c>, optarg = <%s>
8693 \backslash
8695 \end_layout
8697 \begin_layout Plain Layout
8699                                        _go_c, Optarg)
8700 \end_layout
8702 \begin_layout Plain Layout
8704         printf("non-option arguments:
8705 \backslash
8707 \end_layout
8709 \begin_layout Plain Layout
8711         for (; Optind < ARGC; Optind++)
8712 \end_layout
8714 \begin_layout Plain Layout
8716             printf("
8717 \backslash
8718 tARGV[%d] = <%s>
8719 \backslash
8721 \end_layout
8723 \begin_layout Plain Layout
8725                                     Optind, ARGV[Optind])
8726 \end_layout
8728 \begin_layout Plain Layout
8730     }
8731 \end_layout
8733 \begin_layout Plain Layout
8736 \end_layout
8738 \end_inset
8741 \end_layout
8743 \begin_layout Standard
8744 The entire getopt.awk is made out of these chunks in order
8745 \end_layout
8747 \begin_layout Chunk
8748 getopt.awk
8749 \end_layout
8751 \begin_layout Standard
8752 \begin_inset listings
8753 inline false
8754 status open
8756 \begin_layout Plain Layout
8759 \backslash
8760 chunkref{getopt.awk-header}>
8761 \end_layout
8763 \begin_layout Plain Layout
8765 \end_layout
8767 \begin_layout Plain Layout
8770 \backslash
8771 chunkref{getopt.awk-notes}>
8772 \end_layout
8774 \begin_layout Plain Layout
8777 \backslash
8778 chunkref{getopt.awk-getopt()}>
8779 \end_layout
8781 \begin_layout Plain Layout
8784 \backslash
8785 chunkref{getopt.awk-begin}>
8786 \end_layout
8788 \end_inset
8791 \end_layout
8793 \begin_layout Standard
8794 Although we only want the header and function:
8795 \end_layout
8797 \begin_layout Chunk
8798 getopt
8799 \end_layout
8801 \begin_layout Standard
8802 \begin_inset listings
8803 inline false
8804 status open
8806 \begin_layout Plain Layout
8808 # try: locate getopt.awk for the full original file
8809 \end_layout
8811 \begin_layout Plain Layout
8813 # as part of your standard awk installation
8814 \end_layout
8816 \begin_layout Plain Layout
8819 \backslash
8820 chunkref{getopt.awk-header}>
8821 \end_layout
8823 \begin_layout Plain Layout
8825 \end_layout
8827 \begin_layout Plain Layout
8830 \backslash
8831 chunkref{getopt.awk-getopt()}>
8832 \end_layout
8834 \end_inset
8837 \end_layout
8839 \begin_layout Chapter
8840 Newfangle LaTeX source code
8841 \end_layout
8843 \begin_layout Section
8844 newfangle module
8845 \end_layout
8847 \begin_layout Standard
8848 Here we define a Lyx .module file that makes it convenient to use LyX for
8849  writing such literate programs.
8850 \end_layout
8852 \begin_layout Standard
8853 This file 
8854 \begin_inset Flex CharStyle:Code
8855 status collapsed
8857 \begin_layout Plain Layout
8858 ./newfangle.module
8859 \end_layout
8861 \end_inset
8863  can be installed in your personal 
8864 \begin_inset Flex CharStyle:Code
8865 status collapsed
8867 \begin_layout Plain Layout
8868 .lyx/layouts folder
8869 \end_layout
8871 \end_inset
8874  You will need to Tools Reconfigure so that LyX notices it.
8875  It adds a new format Chunk, which should precede every listing and contain
8876  the chunk name.
8878 \end_layout
8880 \begin_layout Chunk
8881 ./newfangle.module,language=
8882 \end_layout
8884 \begin_layout Standard
8885 \begin_inset listings
8886 inline false
8887 status open
8889 \begin_layout Plain Layout
8892 \backslash
8893 DeclareLyXModule{Newfangle Literate Listings}
8894 \end_layout
8896 \begin_layout Plain Layout
8898 #DescriptionBegin
8899 \end_layout
8901 \begin_layout Plain Layout
8903 #  Newfangle literate listings allow one to write
8904 \end_layout
8906 \begin_layout Plain Layout
8908 #   literate programs after the fashion of noweb, but without having
8909 \end_layout
8911 \begin_layout Plain Layout
8913 #   to use noweave to generate the documentation.
8914  Instead the listings
8915 \end_layout
8917 \begin_layout Plain Layout
8919 #   package is extended in conjunction with the noweb package to implement
8920 \end_layout
8922 \begin_layout Plain Layout
8924 #   to code formating directly as latex.
8925 \end_layout
8927 \begin_layout Plain Layout
8929 #  The newfangle awk script
8930 \end_layout
8932 \begin_layout Plain Layout
8934 #DescriptionEnd
8935 \end_layout
8937 \begin_layout Plain Layout
8939 \end_layout
8941 \begin_layout Plain Layout
8943 Format 11
8944 \end_layout
8946 \begin_layout Plain Layout
8948 \end_layout
8950 \begin_layout Plain Layout
8952 AddToPreamble
8953 \end_layout
8955 \begin_layout Plain Layout
8958 \backslash
8959 chunkref{./newfangle.sty}>
8960 \end_layout
8962 \begin_layout Plain Layout
8964 EndPreamble
8965 \end_layout
8967 \begin_layout Plain Layout
8969 \end_layout
8971 \begin_layout Plain Layout
8974 \backslash
8975 chunkref{chunkstyle}>
8976 \end_layout
8978 \begin_layout Plain Layout
8980 \end_layout
8982 \begin_layout Plain Layout
8985 \backslash
8986 chunkref{chunkref}>
8987 \end_layout
8989 \end_inset
8992 \end_layout
8994 \begin_layout Subsection
8995 The Chunk style
8996 \end_layout
8998 \begin_layout Standard
8999 The purpose of the 
9000 \noun on
9001 chunk
9002 \noun default
9003  style is to make it easier for LyX users to provide the name to 
9004 \begin_inset Flex CharStyle:Code
9005 status collapsed
9007 \begin_layout Plain Layout
9009 \backslash
9010 lstlistings
9011 \end_layout
9013 \end_inset
9016  Normally this requires right-clicking on the listing, choosing settings,
9017  advanced, and then typing 
9018 \begin_inset Flex CharStyle:Code
9019 status collapsed
9021 \begin_layout Plain Layout
9022 name=chunk-name
9023 \end_layout
9025 \end_inset
9028  This has the further disadvantage that the name (and other options) are
9029  not generally visible during document editing.
9030 \end_layout
9032 \begin_layout Standard
9033 The chunk style is defined as a LaTeX command, so that all text on the same
9034  line is passed to the LaTeX command 
9035 \begin_inset Flex CharStyle:Code
9036 status collapsed
9038 \begin_layout Plain Layout
9039 Chunk
9040 \end_layout
9042 \end_inset
9045  This makes it easy to parse using 
9046 \begin_inset Flex CharStyle:Code
9047 status collapsed
9049 \begin_layout Plain Layout
9050 newfangle
9051 \end_layout
9053 \end_inset
9055 , and easy to pass these options on to the listings package.
9056  The first word in a chunk section should be the chunk name, and will have
9058 \begin_inset Flex CharStyle:Code
9059 status collapsed
9061 \begin_layout Plain Layout
9062 name=
9063 \end_layout
9065 \end_inset
9067  prepended to it.
9068  Any other words are accepted arguments to 
9069 \begin_inset Flex CharStyle:Code
9070 status collapsed
9072 \begin_layout Plain Layout
9074 \backslash
9075 lstset
9076 \end_layout
9078 \end_inset
9081 \end_layout
9083 \begin_layout Standard
9084 We set PassThru to 1 because the user is actually entering raw latex.
9085 \end_layout
9087 \begin_layout Chunk
9088 chunkstyle
9089 \end_layout
9091 \begin_layout Standard
9092 \begin_inset listings
9093 inline false
9094 status open
9096 \begin_layout Plain Layout
9098 Style Chunk
9099 \end_layout
9101 \begin_layout Plain Layout
9103   LatexType             Command
9104 \end_layout
9106 \begin_layout Plain Layout
9108   LatexName             Chunk
9109 \end_layout
9111 \begin_layout Plain Layout
9113   Margin                First_Dynamic
9114 \end_layout
9116 \begin_layout Plain Layout
9118   LeftMargin            Chunk:xxx
9119 \end_layout
9121 \begin_layout Plain Layout
9123   LabelSep              xx
9124 \end_layout
9126 \begin_layout Plain Layout
9128   LabelType             Static
9129 \end_layout
9131 \begin_layout Plain Layout
9133   LabelString           "Chunk:"
9134 \end_layout
9136 \begin_layout Plain Layout
9138   Align                 Left
9139 \end_layout
9141 \begin_layout Plain Layout
9143   PassThru              1
9144 \end_layout
9146 \begin_layout Plain Layout
9148 \end_layout
9150 \end_inset
9153 \end_layout
9155 \begin_layout Standard
9156 To make the label very visible we choose a larger font coloured red.
9157 \end_layout
9159 \begin_layout Standard
9160 \begin_inset listings
9161 inline false
9162 status open
9164 \begin_layout Plain Layout
9166   LabelFont
9167 \end_layout
9169 \begin_layout Plain Layout
9171     Family              Sans
9172 \end_layout
9174 \begin_layout Plain Layout
9176     Size                Large
9177 \end_layout
9179 \begin_layout Plain Layout
9181     Series              Bold
9182 \end_layout
9184 \begin_layout Plain Layout
9186     Shape               Italic
9187 \end_layout
9189 \begin_layout Plain Layout
9191     Color               red
9192 \end_layout
9194 \begin_layout Plain Layout
9196   EndFont
9197 \end_layout
9199 \begin_layout Plain Layout
9202 \end_layout
9204 \end_inset
9207 \end_layout
9209 \begin_layout Subsection
9210 The chunkref style
9211 \end_layout
9213 \begin_layout Standard
9214 We also define the Chunkref style which can be used to express cross references
9215  to chunks.
9216 \end_layout
9218 \begin_layout Chunk
9219 chunkref
9220 \end_layout
9222 \begin_layout Standard
9223 \begin_inset listings
9224 inline false
9225 status open
9227 \begin_layout Plain Layout
9229 InsetLayout Chunkref
9230 \end_layout
9232 \begin_layout Plain Layout
9234   LyxType               charstyle
9235 \end_layout
9237 \begin_layout Plain Layout
9239   LatexType             Command
9240 \end_layout
9242 \begin_layout Plain Layout
9244   LatexName             chunkref
9245 \end_layout
9247 \begin_layout Plain Layout
9249   PassThru              1
9250 \end_layout
9252 \begin_layout Plain Layout
9254   LabelFont             
9255 \end_layout
9257 \begin_layout Plain Layout
9259     Shape               Italic
9260 \end_layout
9262 \begin_layout Plain Layout
9264     Color               red
9265 \end_layout
9267 \begin_layout Plain Layout
9269   EndFont
9270 \end_layout
9272 \begin_layout Plain Layout
9275 \end_layout
9277 \end_inset
9280 \end_layout
9282 \begin_layout Section
9283 \begin_inset CommandInset label
9284 LatexCommand label
9285 name "sec:Latex-Macros"
9287 \end_inset
9289 Latex Macros
9290 \end_layout
9292 \begin_layout Standard
9293 We require the 
9294 \noun on
9295 listings
9296 \noun default
9298 \noun on
9299 noweb
9300 \noun default
9301  and 
9302 \noun on
9303 xargs
9304 \noun default
9305  packages.
9306  As noweb defines it's own 
9307 \begin_inset Flex CharStyle:Code
9308 status collapsed
9310 \begin_layout Plain Layout
9312 \backslash
9313 code
9314 \end_layout
9316 \end_inset
9318  environment, we re-define the one that LyX logical markup module expects
9319  here.
9320 \end_layout
9322 \begin_layout Chunk
9323 ./newfangle.sty,language=tex,basicstyle=
9324 \backslash
9325 ttfamily
9326 \end_layout
9328 \begin_layout Standard
9329 \begin_inset listings
9330 inline false
9331 status open
9333 \begin_layout Plain Layout
9336 \backslash
9337 usepackage{listings}%
9338 \end_layout
9340 \begin_layout Plain Layout
9343 \backslash
9344 usepackage{noweb}%
9345 \end_layout
9347 \begin_layout Plain Layout
9350 \backslash
9351 usepackage{xargs}%
9352 \end_layout
9354 \begin_layout Plain Layout
9357 \backslash
9358 renewcommand{
9359 \backslash
9360 code}[1]{
9361 \backslash
9362 texttt{#1}}%
9363 \end_layout
9365 \end_inset
9368 \end_layout
9370 \begin_layout Standard
9371 We also define a 
9372 \begin_inset Flex CharStyle:Code
9373 status collapsed
9375 \begin_layout Plain Layout
9376 CChunk
9377 \end_layout
9379 \end_inset
9381  macro, for use as: 
9382 \begin_inset Flex CharStyle:Code
9383 status collapsed
9385 \begin_layout Plain Layout
9387 \backslash
9388 begin{CChunk}
9389 \end_layout
9391 \end_inset
9393  which will need renaming to 
9394 \begin_inset Flex CharStyle:Code
9395 status collapsed
9397 \begin_layout Plain Layout
9399 \backslash
9400 begin{Chunk}
9401 \end_layout
9403 \end_inset
9405  when I can do this without clashing with 
9406 \begin_inset Flex CharStyle:Code
9407 status collapsed
9409 \begin_layout Plain Layout
9411 \backslash
9412 Chunk
9413 \end_layout
9415 \end_inset
9418 \end_layout
9420 \begin_layout Standard
9421 \begin_inset listings
9422 inline false
9423 status open
9425 \begin_layout Plain Layout
9428 \backslash
9429 lstnewenvironment{Chunk}{
9430 \backslash
9431 relax}{
9432 \backslash
9433 relax}%
9434 \end_layout
9436 \end_inset
9439 \end_layout
9441 \begin_layout Standard
9442 We also define a suitable 
9443 \begin_inset Flex CharStyle:Code
9444 status collapsed
9446 \begin_layout Plain Layout
9448 \backslash
9449 lstset
9450 \end_layout
9452 \end_inset
9454  of parameters that suit the literate programming style after the fashion
9455  of 
9456 \noun on
9457 noweave
9458 \noun default
9460 \end_layout
9462 \begin_layout Standard
9463 \begin_inset listings
9464 inline false
9465 status open
9467 \begin_layout Plain Layout
9470 \backslash
9471 lstset{numbers=left, stepnumber=5, numbersep=5pt,
9472 \end_layout
9474 \begin_layout Plain Layout
9476         breaklines=false,basicstyle=
9477 \backslash
9478 ttfamily,
9479 \end_layout
9481 \begin_layout Plain Layout
9483         numberstyle=
9484 \backslash
9485 tiny, language=C}%
9486 \end_layout
9488 \end_inset
9491 \end_layout
9493 \begin_layout Standard
9494 We also define a notangle-like mechanism for 
9495 \emph on
9496 escaping
9497 \emph default
9498  to LaTeX from the listing, and by which we can refer to other listings.
9499  We declare the 
9500 \begin_inset Flex CharStyle:Code
9501 status collapsed
9503 \begin_layout Plain Layout
9504 =<\SpecialChar \ldots{}
9506 \end_layout
9508 \end_inset
9510  sequence to contain LaTeX code, and include another like this chunk: 
9511 \begin_inset Flex CharStyle:Code
9512 status collapsed
9514 \begin_layout Plain Layout
9516 \backslash
9517 chunkref{chunkname}>
9518 \end_layout
9520 \end_inset
9523  However, because 
9524 \begin_inset Flex CharStyle:Code
9525 status collapsed
9527 \begin_layout Plain Layout
9528 =<\SpecialChar \ldots{}
9530 \end_layout
9532 \end_inset
9534  is already defined to contain LaTeX code for this document --- this is
9535  a 
9536 \noun on
9537 newfangle
9538 \noun default
9539  document after all --- the code fragment below effectively contains the
9540  LaTeX code: 
9541 \begin_inset Flex CharStyle:Code
9542 status collapsed
9544 \begin_layout Plain Layout
9546 \end_layout
9548 \end_inset
9551  To avoid problems with document generation, I had to declare an lstlistings
9552  property: 
9553 \begin_inset Flex CharStyle:Code
9554 status collapsed
9556 \begin_layout Plain Layout
9557 escapeinside={}
9558 \end_layout
9560 \end_inset
9562  for this listing only; which in LyX was done by right-clicking the listings
9563  inset, choosing 
9564 \begin_inset Flex CharStyle:Code
9565 status collapsed
9567 \begin_layout Plain Layout
9568 settings
9569 \end_layout
9571 \end_inset
9573 \SpecialChar \menuseparator
9575 \begin_inset Flex CharStyle:Code
9576 status collapsed
9578 \begin_layout Plain Layout
9579 advanced
9580 \end_layout
9582 \end_inset
9585 \end_layout
9587 \begin_layout Standard
9588 \begin_inset Note Note
9589 status collapsed
9591 \begin_layout Plain Layout
9592 =< isn't enjoyed literally here, in a listing when the escape sequence is
9593  already defined as shown...
9594  we need to somehow escape this representation...
9595 \end_layout
9597 \end_inset
9600 \end_layout
9602 \begin_layout Standard
9603 \begin_inset listings
9604 lstparams "escapeinside={}"
9605 inline false
9606 status open
9608 \begin_layout Plain Layout
9611 \backslash
9612 lstset{escapeinside={=<}{>}}%
9613 \end_layout
9615 \end_inset
9618 \end_layout
9620 \begin_layout Standard
9621 Although our macros will contain the @ symbol, they will be included in
9622  a 
9623 \begin_inset Flex CharStyle:Code
9624 status collapsed
9626 \begin_layout Plain Layout
9628 \backslash
9629 makeatletter
9630 \end_layout
9632 \end_inset
9634  section by LyX; however we keep the commented out 
9635 \begin_inset Flex CharStyle:Code
9636 status collapsed
9638 \begin_layout Plain Layout
9640 \backslash
9641 makeatletter
9642 \end_layout
9644 \end_inset
9646  as a reminder.
9647  The listings package likes to centre the titles, but noweb titles are specially
9648  formatted and must be left aligned.
9649  The simplest way to do this turned out to be by removing the definition
9650  of 
9651 \begin_inset Flex CharStyle:Code
9652 status collapsed
9654 \begin_layout Plain Layout
9656 \backslash
9657 lst@maketitle
9658 \end_layout
9660 \end_inset
9663  This may interact badly if other listings want a regular title or caption.
9664  We remember the old maketitle in case we need it.
9665 \end_layout
9667 \begin_layout Standard
9668 \begin_inset listings
9669 inline false
9670 status open
9672 \begin_layout Plain Layout
9675 \backslash
9676 makeatletter
9677 \end_layout
9679 \begin_layout Plain Layout
9681 %somehow re-defining maketitle gives us a left-aligned title
9682 \end_layout
9684 \begin_layout Plain Layout
9686 %which is extactly what our specially formatted title needs!
9687 \end_layout
9689 \begin_layout Plain Layout
9692 \backslash
9693 global
9694 \backslash
9696 \backslash
9697 newfangle@lst@maketitle
9698 \backslash
9699 lst@maketitle%
9700 \end_layout
9702 \begin_layout Plain Layout
9705 \backslash
9706 global
9707 \backslash
9709 \backslash
9710 lst@maketitle{}%
9711 \end_layout
9713 \end_inset
9716 \end_layout
9718 \begin_layout Subsection
9719 \begin_inset CommandInset label
9720 LatexCommand label
9721 name "sub:The-chunk-command"
9723 \end_inset
9725 The chunk command
9726 \end_layout
9728 \begin_layout Standard
9729 Our chunk command accepts one argument, and calls 
9730 \begin_inset Flex CharStyle:Code
9731 status collapsed
9733 \begin_layout Plain Layout
9735 \backslash
9736 ltset
9737 \end_layout
9739 \end_inset
9742  Although 
9743 \begin_inset Flex CharStyle:Code
9744 status collapsed
9746 \begin_layout Plain Layout
9748 \backslash
9749 ltset
9750 \end_layout
9752 \end_inset
9754  will note the name, this is erased when the next 
9755 \begin_inset Flex CharStyle:Code
9756 status collapsed
9758 \begin_layout Plain Layout
9760 \backslash
9761 lstlisting
9762 \end_layout
9764 \end_inset
9766  starts, so we make a note of this in 
9767 \begin_inset Flex CharStyle:Code
9768 status collapsed
9770 \begin_layout Plain Layout
9772 \backslash
9773 lst@chunkname
9774 \end_layout
9776 \end_inset
9778  and restore in in lstlistings Init hook.
9779 \end_layout
9781 \begin_layout Standard
9782 \begin_inset listings
9783 inline false
9784 status open
9786 \begin_layout Plain Layout
9789 \backslash
9791 \backslash
9792 Chunk#1{%
9793 \end_layout
9795 \begin_layout Plain Layout
9797   
9798 \backslash
9799 lstset{title={
9800 \backslash
9801 newfanglecaption},name=#1}%
9802 \end_layout
9804 \begin_layout Plain Layout
9806   
9807 \backslash
9808 global
9809 \backslash
9810 edef
9811 \backslash
9812 lst@chunkname{
9813 \backslash
9814 lst@intname}%
9815 \end_layout
9817 \begin_layout Plain Layout
9820 \end_layout
9822 \begin_layout Plain Layout
9825 \backslash
9827 \backslash
9828 lst@chunkname{
9829 \backslash
9830 empty}%
9831 \end_layout
9833 \end_inset
9836 \end_layout
9838 \begin_layout Subsubsection
9839 Chunk parameters
9840 \end_layout
9842 \begin_layout Standard
9843 Newfangle permits parameterized chunks, and requires the paramters to be
9844  specified as listings options.
9845  The newfangle script uses this, and although we don't do anything with
9846  these in the LaTeX code right now, we need to stop the listings package
9847  complaining.
9848 \end_layout
9850 \begin_layout Standard
9851 \begin_inset listings
9852 inline false
9853 status open
9855 \begin_layout Plain Layout
9858 \backslash
9859 lst@Key{params}
9860 \backslash
9861 relax{
9862 \backslash
9864 \backslash
9865 newfangle@chunk@params{#1}}%
9866 \end_layout
9868 \end_inset
9871 \end_layout
9873 \begin_layout Subsection
9874 The noweb styled caption
9875 \end_layout
9877 \begin_layout Standard
9878 We define a public macro 
9879 \begin_inset Flex CharStyle:Code
9880 status collapsed
9882 \begin_layout Plain Layout
9884 \backslash
9885 newfanglecaption
9886 \end_layout
9888 \end_inset
9890  which can be set as a regular title.
9891  By means of 
9892 \begin_inset Flex CharStyle:Code
9893 status collapsed
9895 \begin_layout Plain Layout
9897 \backslash
9898 protect
9899 \end_layout
9901 \end_inset
9903 , It expands to 
9904 \begin_inset Flex CharStyle:Code
9905 status collapsed
9907 \begin_layout Plain Layout
9909 \backslash
9910 newfangle@caption
9911 \end_layout
9913 \end_inset
9915  at the appriate time when the caption is emitted.
9916 \end_layout
9918 \begin_layout Standard
9919 \begin_inset listings
9920 inline false
9921 status open
9923 \begin_layout Plain Layout
9926 \backslash
9928 \backslash
9929 newfanglecaption{
9930 \backslash
9931 protect
9932 \backslash
9933 newfangle@caption}%
9934 \end_layout
9936 \end_inset
9939 \end_layout
9941 \begin_layout Standard
9942 \begin_inset Float figure
9943 placement H
9944 wide false
9945 sideways false
9946 status collapsed
9948 \begin_layout Plain Layout
9949 \begin_inset Box Boxed
9950 position "t"
9951 hor_pos "c"
9952 has_inner_box 1
9953 inner_pos "t"
9954 use_parbox 0
9955 width "100col%"
9956 special "none"
9957 height "1in"
9958 height_special "totalheight"
9959 status open
9961 \begin_layout Plain Layout
9963 \begin_inset space \qquad{}
9964 \end_inset
9967 \shape italic
9968 some-chunk
9969 \shape default
9970  19b⟩
9971 \begin_inset Formula $\equiv+$
9972 \end_inset
9975 \begin_inset space \qquad{}
9976 \end_inset
9979 \begin_inset space \qquad{}
9980 \end_inset
9983 \begin_inset space \qquad{}
9984 \end_inset
9987 \begin_inset Formula $\triangleleft$
9988 \end_inset
9991 \begin_inset space \quad{}
9992 \end_inset
9995 \begin_inset Formula $\triangleright$
9996 \end_inset
9999 \end_layout
10001 \begin_layout Plain Layout
10003 \size footnotesize
10004 In this example, the current chunk is 22c, and therefore the third chunk
10005  on page 22.
10006 \end_layout
10008 \begin_layout Plain Layout
10010 \size footnotesize
10011 It's name is 
10012 \emph on
10013 some-chunk
10014 \emph default
10017 \end_layout
10019 \begin_layout Plain Layout
10021 \size footnotesize
10022 The first chunk with this name (19b) occurs as the second chunk on page
10023  19.
10024 \end_layout
10026 \begin_layout Plain Layout
10028 \size footnotesize
10029 The previous chunk (22d) with the same name is the second chunk on page
10030  22.
10031 \end_layout
10033 \begin_layout Plain Layout
10035 \size footnotesize
10036 The next chunk (24d) is the fourth chunk on page 24.
10037 \end_layout
10039 \begin_layout Plain Layout
10040 \begin_inset Caption
10042 \begin_layout Plain Layout
10043 noweb heading
10044 \end_layout
10046 \end_inset
10049 \end_layout
10051 \end_inset
10054 \end_layout
10056 \end_inset
10058 The general noweb output format compactly identifies the current chunk,
10059  and references to the first chunk, and the previous and next chunks that
10060  have the same name.
10062 \end_layout
10064 \begin_layout Standard
10065 This means that we need to keep a counter for each chunk-name, that we use
10066  to count chunks of the same name.
10068 \end_layout
10070 \begin_layout Subsection
10071 The chunk counter
10072 \end_layout
10074 \begin_layout Standard
10075 It would be natural to have a counter for each chunk name, but TeX would
10076  soon run out of counters
10077 \begin_inset Foot
10078 status collapsed
10080 \begin_layout Plain Layout
10081 \SpecialChar \ldots{}
10082 soon 
10083 \emph on
10085 \emph default
10086  run out of counters and so I had to re-write the LaTeX macros to share
10087  a counter as described here
10088 \end_layout
10090 \end_inset
10092 , so we have one counter which we save at the end of a chunk and restore
10093  at the beginning of a chunk.
10094 \end_layout
10096 \begin_layout Standard
10097 \begin_inset listings
10098 inline false
10099 status open
10101 \begin_layout Plain Layout
10104 \backslash
10105 newcounter{newfangle@chunkcounter}%
10106 \end_layout
10108 \end_inset
10111 \end_layout
10113 \begin_layout Standard
10114 We construct the name of this variable to store the counter to be the text
10116 \begin_inset Flex CharStyle:Code
10117 status collapsed
10119 \begin_layout Plain Layout
10120 lst-chunk-
10121 \end_layout
10123 \end_inset
10125  prefixed onto the chunks own name, and store it in 
10126 \begin_inset Flex CharStyle:Code
10127 status collapsed
10129 \begin_layout Plain Layout
10131 \backslash
10132 chunkcount
10133 \end_layout
10135 \end_inset
10139 \end_layout
10141 \begin_layout Standard
10142 We save the counter like this:
10143 \end_layout
10145 \begin_layout Chunk
10146 save-counter
10147 \end_layout
10149 \begin_layout Standard
10150 \begin_inset listings
10151 inline false
10152 status open
10154 \begin_layout Plain Layout
10157 \backslash
10158 global
10159 \backslash
10160 expandafter
10161 \backslash
10162 edef
10163 \backslash
10164 csname 
10165 \backslash
10166 chunkcount
10167 \backslash
10168 endcsname{
10169 \backslash
10170 arabic{newfangle@chunkcounter}}%
10171 \end_layout
10173 \end_inset
10176 \end_layout
10178 \begin_layout Standard
10179 and restore the counter like this:
10180 \end_layout
10182 \begin_layout Chunk
10183 restore-counter
10184 \end_layout
10186 \begin_layout Standard
10187 \begin_inset listings
10188 inline false
10189 status open
10191 \begin_layout Plain Layout
10194 \backslash
10195 setcounter{newfangle@chunkcounter}{
10196 \backslash
10197 csname 
10198 \backslash
10199 chunkcount
10200 \backslash
10201 endcsname}%
10202 \end_layout
10204 \end_inset
10207 \end_layout
10209 \begin_layout Chunk
10210 ./newfangle.sty
10211 \end_layout
10213 \begin_layout Standard
10214 If there does not already exist a variable whose name is stored in 
10215 \begin_inset Flex CharStyle:Code
10216 status collapsed
10218 \begin_layout Plain Layout
10220 \backslash
10221 chunkcount
10222 \end_layout
10224 \end_inset
10226 , then we know we are the first chunk with this name, and then define a
10227  counter.
10229 \end_layout
10231 \begin_layout Standard
10232 Although chunks of the same name share a common counter, they must still
10233  be distinguished.
10234  We use is the internal name of the listing, suffixed by the counter value.
10235  So the first chunk might be 
10236 \begin_inset Flex CharStyle:Code
10237 status collapsed
10239 \begin_layout Plain Layout
10240 something-1
10241 \end_layout
10243 \end_inset
10245  and the second chunk be 
10246 \begin_inset Flex CharStyle:Code
10247 status collapsed
10249 \begin_layout Plain Layout
10250 something-2
10251 \end_layout
10253 \end_inset
10255 , etc.
10256 \end_layout
10258 \begin_layout Standard
10259 We also calculate the name of the previous chunk if we can (before we increment
10260  the chunk counter).
10261  If this is the first chunk of that name, then 
10262 \begin_inset Flex CharStyle:Code
10263 status collapsed
10265 \begin_layout Plain Layout
10267 \backslash
10268 prevchunkname
10269 \end_layout
10271 \end_inset
10273  is set to 
10274 \begin_inset Flex CharStyle:Code
10275 status collapsed
10277 \begin_layout Plain Layout
10279 \backslash
10280 relax
10281 \end_layout
10283 \end_inset
10285  which the noweb package will interpret as not existing.
10286 \end_layout
10288 \begin_layout Standard
10289 \begin_inset listings
10290 inline false
10291 status open
10293 \begin_layout Plain Layout
10296 \backslash
10298 \backslash
10299 newfangle@caption{%
10300 \end_layout
10302 \begin_layout Plain Layout
10304   
10305 \backslash
10306 edef
10307 \backslash
10308 chunkcount{lst-chunk-
10309 \backslash
10310 lst@intname}%
10311 \end_layout
10313 \begin_layout Plain Layout
10315   
10316 \backslash
10317 @ifundefined{
10318 \backslash
10319 chunkcount}{%
10320 \end_layout
10322 \begin_layout Plain Layout
10324     
10325 \backslash
10326 expandafter
10327 \backslash
10328 gdef
10329 \backslash
10330 csname 
10331 \backslash
10332 chunkcount
10333 \backslash
10334 endcsname{0}%
10335 \end_layout
10337 \begin_layout Plain Layout
10339     
10340 \backslash
10341 setcounter{newfangle@chunkcounter}{
10342 \backslash
10343 csname 
10344 \backslash
10345 chunkcount
10346 \backslash
10347 endcsname}%
10348 \end_layout
10350 \begin_layout Plain Layout
10352     
10353 \backslash
10355 \backslash
10356 prevchunkname
10357 \backslash
10358 relax%
10359 \end_layout
10361 \begin_layout Plain Layout
10363   }{%
10364 \end_layout
10366 \begin_layout Plain Layout
10368     
10369 \backslash
10370 setcounter{newfangle@chunkcounter}{
10371 \backslash
10372 csname 
10373 \backslash
10374 chunkcount
10375 \backslash
10376 endcsname}%
10377 \end_layout
10379 \begin_layout Plain Layout
10381     
10382 \backslash
10383 edef
10384 \backslash
10385 prevchunkname{
10386 \backslash
10387 lst@intname-
10388 \backslash
10389 arabic{newfangle@chunkcounter}}%
10390 \end_layout
10392 \begin_layout Plain Layout
10394   }%
10395 \end_layout
10397 \end_inset
10400 \end_layout
10402 \begin_layout Standard
10403 After incrementing the chunk counter, we then define the name of this chunk,
10404  as well as the name of the first chunk.
10405 \end_layout
10407 \begin_layout Standard
10408 \begin_inset listings
10409 inline false
10410 status open
10412 \begin_layout Plain Layout
10414   
10415 \backslash
10416 addtocounter{newfangle@chunkcounter}{1}%
10417 \end_layout
10419 \begin_layout Plain Layout
10421   
10422 \backslash
10423 global
10424 \backslash
10425 expandafter
10426 \backslash
10427 edef
10428 \backslash
10429 csname 
10430 \backslash
10431 chunkcount
10432 \backslash
10433 endcsname{
10434 \backslash
10435 arabic{newfangle@chunkcounter}}%
10436 \end_layout
10438 \begin_layout Plain Layout
10440   
10441 \backslash
10442 edef
10443 \backslash
10444 chunkname{
10445 \backslash
10446 lst@intname-
10447 \backslash
10448 arabic{newfangle@chunkcounter}}%
10449 \end_layout
10451 \begin_layout Plain Layout
10453   
10454 \backslash
10455 edef
10456 \backslash
10457 firstchunkname{
10458 \backslash
10459 lst@intname-1}%
10460 \end_layout
10462 \end_inset
10465 \end_layout
10467 \begin_layout Standard
10468 We now need to calculate the name of the next chunk.
10469  We do this by temporarily skipping the counter on by one; however there
10470  may not actually be another chunk with this name! We detect this by also
10471  defining a label for each chunk based on the chunkname.
10472  If there is a next chunkname then it will define a label with that name.
10473  As labels are persistent, we can at least tell the second time LaTeX is
10474  run.
10475  If we don't find such a defined label then we define 
10476 \begin_inset Flex CharStyle:Code
10477 status collapsed
10479 \begin_layout Plain Layout
10481 \backslash
10482 nextchunkname
10483 \end_layout
10485 \end_inset
10487  to 
10488 \begin_inset Flex CharStyle:Code
10489 status collapsed
10491 \begin_layout Plain Layout
10493 \backslash
10494 relax
10495 \end_layout
10497 \end_inset
10500 \end_layout
10502 \begin_layout Standard
10503 \begin_inset listings
10504 inline false
10505 status open
10507 \begin_layout Plain Layout
10509   
10510 \backslash
10511 addtocounter{newfangle@chunkcounter}{1}%
10512 \end_layout
10514 \begin_layout Plain Layout
10516   
10517 \backslash
10518 edef
10519 \backslash
10520 nextchunkname{
10521 \backslash
10522 lst@intname-
10523 \backslash
10524 arabic{newfangle@chunkcounter}}%
10525 \end_layout
10527 \begin_layout Plain Layout
10529   
10530 \backslash
10531 @ifundefined{r@label-
10532 \backslash
10533 nextchunkname}{
10534 \backslash
10536 \backslash
10537 nextchunkname
10538 \backslash
10539 relax}{}%
10540 \end_layout
10542 \end_inset
10545 \end_layout
10547 \begin_layout Standard
10548 The noweb package requires that we define a 
10549 \begin_inset Flex CharStyle:Code
10550 status collapsed
10552 \begin_layout Plain Layout
10554 \backslash
10555 sublabel
10556 \end_layout
10558 \end_inset
10560  for every chunk, with a unique name, which is then used to print out it's
10561  navigation hints.
10562 \end_layout
10564 \begin_layout Standard
10565 We also define a regular label for this chunk, as was mentioned above when
10566  we calculated 
10567 \begin_inset Flex CharStyle:Code
10568 status collapsed
10570 \begin_layout Plain Layout
10572 \backslash
10573 nextchunkname
10574 \end_layout
10576 \end_inset
10579  This requires LaTeX to be run at least twice after new chunk sections are
10580  added --- but noweb requried that anyway.
10581 \end_layout
10583 \begin_layout Standard
10584 \begin_inset listings
10585 inline false
10586 status open
10588 \begin_layout Plain Layout
10590   
10591 \backslash
10592 sublabel{
10593 \backslash
10594 chunkname}%
10595 \end_layout
10597 \begin_layout Plain Layout
10599 % define this label for every chunk instance, so we
10600 \end_layout
10602 \begin_layout Plain Layout
10604 % can tell when we are the last chunk of this name
10605 \end_layout
10607 \begin_layout Plain Layout
10609   
10610 \backslash
10611 label{label-
10612 \backslash
10613 chunkname}%
10614 \end_layout
10616 \end_inset
10619 \end_layout
10621 \begin_layout Standard
10622 We also try and add the chunk to the list of listings, but I'm afraid we
10623  don't do very well.
10624  We want each chunk name listing once, with all of it's references.
10625 \end_layout
10627 \begin_layout Standard
10628 \begin_inset listings
10629 inline false
10630 status open
10632 \begin_layout Plain Layout
10634   
10635 \backslash
10636 addcontentsline{lol}{lstlisting}{
10637 \backslash
10638 lst@name~[
10639 \backslash
10640 protect
10641 \backslash
10642 subpageref{
10643 \backslash
10644 chunkname}]}%
10645 \end_layout
10647 \end_inset
10650 \end_layout
10652 \begin_layout Standard
10653 We then call the noweb output macros in the same way that noweave generates
10654  them, except that we don't need to call 
10655 \begin_inset Flex CharStyle:Code
10656 status collapsed
10658 \begin_layout Plain Layout
10660 \backslash
10661 nwstartdeflinemarkup
10662 \end_layout
10664 \end_inset
10666  or 
10667 \begin_inset Flex CharStyle:Code
10668 status collapsed
10670 \begin_layout Plain Layout
10672 \backslash
10673 nwenddeflinemarkup
10674 \end_layout
10676 \end_inset
10678  -- and if we do it messes up the output somewhat.
10679 \end_layout
10681 \begin_layout Standard
10682 \begin_inset listings
10683 inline false
10684 status open
10686 \begin_layout Plain Layout
10688   
10689 \backslash
10690 nwmargintag{%
10691 \end_layout
10693 \begin_layout Plain Layout
10695     {%
10696 \end_layout
10698 \begin_layout Plain Layout
10700       
10701 \backslash
10702 nwtagstyle{}%
10703 \end_layout
10705 \begin_layout Plain Layout
10707       
10708 \backslash
10709 subpageref{
10710 \backslash
10711 chunkname}%
10712 \end_layout
10714 \begin_layout Plain Layout
10716     }%
10717 \end_layout
10719 \begin_layout Plain Layout
10721   }%
10722 \end_layout
10724 \begin_layout Plain Layout
10727 \end_layout
10729 \begin_layout Plain Layout
10731   
10732 \backslash
10733 moddef{%
10734 \end_layout
10736 \begin_layout Plain Layout
10738     {
10739 \backslash
10740 lst@name}%
10741 \end_layout
10743 \begin_layout Plain Layout
10745     {%
10746 \end_layout
10748 \begin_layout Plain Layout
10750       
10751 \backslash
10752 nwtagstyle{}
10753 \backslash
10755 \end_layout
10757 \begin_layout Plain Layout
10759       
10760 \backslash
10761 @ifundefined{newfangle@chunk@params}{}{%
10762 \end_layout
10764 \begin_layout Plain Layout
10766         (
10767 \backslash
10768 newfangle@chunk@params)%
10769 \end_layout
10771 \begin_layout Plain Layout
10773       }%
10774 \end_layout
10776 \begin_layout Plain Layout
10778       [
10779 \backslash
10780 csname 
10781 \backslash
10782 chunkcount
10783 \backslash
10784 endcsname]~%%
10785 \end_layout
10787 \begin_layout Plain Layout
10789       
10790 \backslash
10791 subpageref{
10792 \backslash
10793 firstchunkname}%
10794 \end_layout
10796 \begin_layout Plain Layout
10798     }%
10799 \end_layout
10801 \begin_layout Plain Layout
10803   }%
10804 \end_layout
10806 \begin_layout Plain Layout
10809 \end_layout
10811 \begin_layout Plain Layout
10813   
10814 \backslash
10816 \backslash
10817 relax
10818 \backslash
10819 prevchunkname
10820 \backslash
10821 endmoddef
10822 \backslash
10823 else
10824 \backslash
10825 plusendmoddef
10826 \backslash
10828 \end_layout
10830 \begin_layout Plain Layout
10832 %  
10833 \backslash
10834 nwstartdeflinemarkup%
10835 \end_layout
10837 \begin_layout Plain Layout
10839   
10840 \backslash
10841 nwprevnextdefs{
10842 \backslash
10843 prevchunkname}{
10844 \backslash
10845 nextchunkname}%
10846 \end_layout
10848 \begin_layout Plain Layout
10850 %  
10851 \backslash
10852 nwenddeflinemarkup%
10853 \end_layout
10855 \begin_layout Plain Layout
10858 \end_layout
10860 \end_inset
10863 \end_layout
10865 \begin_layout Standard
10866 Originally this was developed as a 
10867 \begin_inset Flex CharStyle:Code
10868 status collapsed
10870 \begin_layout Plain Layout
10871 listings
10872 \end_layout
10874 \end_inset
10876  aspect, in the Init hook, but it was found easier to affect the title without
10877  using a hook --- 
10878 \begin_inset Flex CharStyle:Code
10879 status collapsed
10881 \begin_layout Plain Layout
10883 \backslash
10884 lst@AddToHookExe{PreSet}
10885 \end_layout
10887 \end_inset
10889  is still required to set the listings name to the name passed to the 
10890 \begin_inset Flex CharStyle:Code
10891 status collapsed
10893 \begin_layout Plain Layout
10895 \backslash
10896 Chunk
10897 \end_layout
10899 \end_inset
10901  command, though.
10902 \end_layout
10904 \begin_layout Standard
10905 \begin_inset listings
10906 inline false
10907 status open
10909 \begin_layout Plain Layout
10912 \backslash
10913 lst@BeginAspect{newfangle}
10914 \end_layout
10916 \begin_layout Plain Layout
10919 \backslash
10920 lst@Key{newfangle}{true}[t]{
10921 \backslash
10922 lstKV@SetIf{#1}{true}}
10923 \end_layout
10925 \begin_layout Plain Layout
10928 \backslash
10929 lst@AddToHookExe{PreSet}{
10930 \backslash
10931 global
10932 \backslash
10934 \backslash
10935 lst@intname
10936 \backslash
10937 lst@chunkname}
10938 \end_layout
10940 \begin_layout Plain Layout
10943 \backslash
10944 lst@AddToHook{Init}{}%
10945 \backslash
10946 newfangle@caption}
10947 \end_layout
10949 \begin_layout Plain Layout
10952 \backslash
10953 lst@EndAspect
10954 \end_layout
10956 \end_inset
10959 \end_layout
10961 \begin_layout Subsection
10962 Cross references
10963 \end_layout
10965 \begin_layout Standard
10966 We define the 
10967 \backslash
10968 chunkref command which makes it easy to generate visual references to different
10969  code chunks, e.g.
10970 \end_layout
10972 \begin_layout Standard
10973 \begin_inset Tabular
10974 <lyxtabular version="3" rows="4" columns="2">
10975 <features>
10976 <column alignment="center" valignment="top" width="0">
10977 <column alignment="center" valignment="top" width="0">
10978 <row>
10979 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
10980 \begin_inset Text
10982 \begin_layout Plain Layout
10983 Macro
10984 \end_layout
10986 \end_inset
10987 </cell>
10988 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
10989 \begin_inset Text
10991 \begin_layout Plain Layout
10992 Appearance
10993 \end_layout
10995 \end_inset
10996 </cell>
10997 </row>
10998 <row>
10999 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
11000 \begin_inset Text
11002 \begin_layout Plain Layout
11004 \backslash
11005 chunkref{preamble}
11006 \end_layout
11008 \end_inset
11009 </cell>
11010 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
11011 \begin_inset Text
11013 \begin_layout Plain Layout
11014 \begin_inset ERT
11015 status open
11017 \begin_layout Plain Layout
11020 \backslash
11021 chunkref{preamble}
11022 \end_layout
11024 \end_inset
11027 \end_layout
11029 \end_inset
11030 </cell>
11031 </row>
11032 <row>
11033 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
11034 \begin_inset Text
11036 \begin_layout Plain Layout
11038 \backslash
11039 chunkref[3]{preamble}
11040 \end_layout
11042 \end_inset
11043 </cell>
11044 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
11045 \begin_inset Text
11047 \begin_layout Plain Layout
11048 \begin_inset ERT
11049 status open
11051 \begin_layout Plain Layout
11054 \backslash
11055 chunkref[3]{preamble}
11056 \end_layout
11058 \end_inset
11061 \end_layout
11063 \end_inset
11064 </cell>
11065 </row>
11066 <row>
11067 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
11068 \begin_inset Text
11070 \begin_layout Plain Layout
11072 \backslash
11073 chunkref{preamble}[arg1, arg2]
11074 \end_layout
11076 \end_inset
11077 </cell>
11078 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
11079 \begin_inset Text
11081 \begin_layout Plain Layout
11082 \begin_inset ERT
11083 status open
11085 \begin_layout Plain Layout
11088 \backslash
11089 chunkref{preamble}[arg1, arg2]
11090 \end_layout
11092 \end_inset
11095 \end_layout
11097 \end_inset
11098 </cell>
11099 </row>
11100 </lyxtabular>
11102 \end_inset
11105 \end_layout
11107 \begin_layout Standard
11108 Chunkref can also be used within a code chunk to include another code chunk.
11109  The third optional parameter to chunkref is a comma sepatarated list of
11110  arguments, which will replace defined parameters in the chunkref.
11111 \begin_inset Note Note
11112 status open
11114 \begin_layout Plain Layout
11115 Darn it, if I have: =<
11116 \backslash
11117 chunkref{new-mode}[{chunks[chunk_name, "language"]},{mode}]> the inner braces
11118  (inside [ ]) cause _ to signify subscript even though we have lst@ReplaceIn
11119 \end_layout
11121 \end_inset
11124 \end_layout
11126 \begin_layout Standard
11127 \begin_inset listings
11128 inline false
11129 status open
11131 \begin_layout Plain Layout
11134 \backslash
11136 \backslash
11137 chunkref@args#1,{%
11138 \end_layout
11140 \begin_layout Plain Layout
11142   
11143 \backslash
11145 \backslash
11146 arg{#1}%
11147 \end_layout
11149 \begin_layout Plain Layout
11151   
11152 \backslash
11153 lst@ReplaceIn
11154 \backslash
11156 \backslash
11157 lst@filenamerpl%
11158 \end_layout
11160 \begin_layout Plain Layout
11162   
11163 \backslash
11164 arg%
11165 \end_layout
11167 \begin_layout Plain Layout
11169   
11170 \backslash
11171 @ifnextchar){
11172 \backslash
11173 relax}{, 
11174 \backslash
11175 chunkref@args}%
11176 \end_layout
11178 \begin_layout Plain Layout
11181 \end_layout
11183 \begin_layout Plain Layout
11186 \backslash
11187 newcommand
11188 \backslash
11189 chunkref[2][0]{%
11190 \end_layout
11192 \begin_layout Plain Layout
11194   
11195 \backslash
11196 @ifnextchar({
11197 \backslash
11198 chunkref@i{#1}{#2}}{
11199 \backslash
11200 chunkref@i{#1}{#2}()}%
11201 \end_layout
11203 \begin_layout Plain Layout
11206 \end_layout
11208 \begin_layout Plain Layout
11211 \backslash
11213 \backslash
11214 chunkref@i#1#2(#3){%
11215 \end_layout
11217 \begin_layout Plain Layout
11219   
11220 \backslash
11222 \backslash
11223 zero{0}%
11224 \end_layout
11226 \begin_layout Plain Layout
11228   
11229 \backslash
11231 \backslash
11232 chunk{#2}%
11233 \end_layout
11235 \begin_layout Plain Layout
11237   
11238 \backslash
11240 \backslash
11241 chunkno{#1}%
11242 \end_layout
11244 \begin_layout Plain Layout
11246   
11247 \backslash
11249 \backslash
11250 chunkargs{#3}%
11251 \end_layout
11253 \begin_layout Plain Layout
11255   
11256 \backslash
11258 \backslash
11259 chunkno
11260 \backslash
11261 zero%
11262 \end_layout
11264 \begin_layout Plain Layout
11266     
11267 \backslash
11269 \backslash
11270 chunkname{#2-1}%
11271 \end_layout
11273 \begin_layout Plain Layout
11275   
11276 \backslash
11277 else%
11278 \end_layout
11280 \begin_layout Plain Layout
11282     
11283 \backslash
11285 \backslash
11286 chunkname{#2-
11287 \backslash
11288 chunkno}%
11289 \end_layout
11291 \begin_layout Plain Layout
11293   
11294 \backslash
11296 \end_layout
11298 \begin_layout Plain Layout
11300   
11301 \backslash
11303 \backslash
11304 lst@arg
11305 \backslash
11306 chunk%
11307 \end_layout
11309 \begin_layout Plain Layout
11311   
11312 \backslash
11313 lst@ReplaceIn
11314 \backslash
11315 chunk
11316 \backslash
11317 lst@filenamerpl%
11318 \end_layout
11320 \begin_layout Plain Layout
11322   
11323 \backslash
11324 LA{%
11325 \backslash
11326 moddef{%
11327 \end_layout
11329 \begin_layout Plain Layout
11331     {
11332 \backslash
11333 chunk}%
11334 \end_layout
11336 \begin_layout Plain Layout
11338     {%
11339 \end_layout
11341 \begin_layout Plain Layout
11343       
11344 \backslash
11345 nwtagstyle{}
11346 \backslash
11348 \end_layout
11350 \begin_layout Plain Layout
11352       
11353 \backslash
11355 \backslash
11356 chunkno
11357 \backslash
11358 zero%
11359 \end_layout
11361 \begin_layout Plain Layout
11363       
11364 \backslash
11365 else%
11366 \end_layout
11368 \begin_layout Plain Layout
11370       [
11371 \backslash
11372 chunkno]%
11373 \end_layout
11375 \begin_layout Plain Layout
11377       
11378 \backslash
11380 \end_layout
11382 \begin_layout Plain Layout
11384       
11385 \backslash
11387 \backslash
11388 chunkargs
11389 \backslash
11390 empty%
11391 \end_layout
11393 \begin_layout Plain Layout
11395       
11396 \backslash
11397 else%
11398 \end_layout
11400 \begin_layout Plain Layout
11402         (
11403 \backslash
11404 chunkref@args #3,)%
11405 \end_layout
11407 \begin_layout Plain Layout
11409       
11410 \backslash
11412 \end_layout
11414 \begin_layout Plain Layout
11416       ~
11417 \backslash
11418 subpageref{
11419 \backslash
11420 chunkname}%
11421 \end_layout
11423 \begin_layout Plain Layout
11425     }%
11426 \end_layout
11428 \begin_layout Plain Layout
11430   }%
11431 \end_layout
11433 \begin_layout Plain Layout
11435   
11436 \backslash
11438 \backslash
11439 endmoddef%
11440 \end_layout
11442 \begin_layout Plain Layout
11445 \end_layout
11447 \end_inset
11450 \end_layout
11452 \begin_layout Subsection
11453 The end
11454 \end_layout
11456 \begin_layout Standard
11457 \begin_inset listings
11458 inline false
11459 status open
11461 \begin_layout Plain Layout
11464 \end_layout
11466 \begin_layout Plain Layout
11469 \backslash
11470 makeatother
11471 \end_layout
11473 \end_inset
11476 \end_layout
11478 \begin_layout Chapter
11479 Extracting newfangle
11480 \end_layout
11482 \begin_layout Section
11483 Extracting from Lyx
11484 \end_layout
11486 \begin_layout Standard
11487 To extract from LyX, you will need to configure LyX as explained in section
11489 \begin_inset CommandInset ref
11490 LatexCommand ref
11491 reference "sub:Configuring-the-build"
11493 \end_inset
11496 \end_layout
11498 \begin_layout Standard
11499 \begin_inset CommandInset label
11500 LatexCommand label
11501 name "lyx-build-script"
11503 \end_inset
11505 And this lyx-build scrap will extract newfangle for me.
11506 \end_layout
11508 \begin_layout Chunk
11509 lyx-build,language=sh
11510 \end_layout
11512 \begin_layout Standard
11513 \begin_inset listings
11514 inline false
11515 status open
11517 \begin_layout Plain Layout
11519 #! /bin/sh
11520 \end_layout
11522 \begin_layout Plain Layout
11524 set -x
11525 \end_layout
11527 \begin_layout Plain Layout
11529 \end_layout
11531 \begin_layout Plain Layout
11534 \backslash
11535 chunkref{lyx-build-helper}>
11536 \end_layout
11538 \begin_layout Plain Layout
11540 cd $PROJECT_DIR || exit 1
11541 \end_layout
11543 \begin_layout Plain Layout
11545 \end_layout
11547 \begin_layout Plain Layout
11549 /usr/local/bin/newfangle -R./newfangle $TEX_SRC > ./newfangle
11550 \end_layout
11552 \begin_layout Plain Layout
11554 /usr/local/bin/newfangle -R./newfangle.module $TEX_SRC > ./newfangle.module
11555 \end_layout
11557 \end_inset
11560 \end_layout
11562 \begin_layout Standard
11563 With a lyx-build-helper
11564 \end_layout
11566 \begin_layout Chunk
11567 lyx-build-helper,language=sh
11568 \end_layout
11570 \begin_layout Standard
11571 \begin_inset listings
11572 inline false
11573 status open
11575 \begin_layout Plain Layout
11577 PROJECT_DIR="$LYX_r"
11578 \end_layout
11580 \begin_layout Plain Layout
11582 LYX_SRC="$PROJECT_DIR/${LYX_i%.tex}.lyx"
11583 \end_layout
11585 \begin_layout Plain Layout
11587 TEX_DIR="$LYX_p"
11588 \end_layout
11590 \begin_layout Plain Layout
11592 TEX_SRC="$TEX_DIR/$LYX_i"
11593 \end_layout
11595 \end_inset
11598 \end_layout
11600 \begin_layout Section
11601 Extracting from the command line
11602 \end_layout
11604 \begin_layout Standard
11605 First you will need the tex output, then you can extract:
11606 \end_layout
11608 \begin_layout Chunk
11609 lyx-build-manual,language=sh
11610 \end_layout
11612 \begin_layout Standard
11613 \begin_inset listings
11614 inline false
11615 status open
11617 \begin_layout Plain Layout
11619 lyx -e latex newfangle.lyx
11620 \end_layout
11622 \begin_layout Plain Layout
11624 newfangle -R./newfangle newfangle.tex > ./newfangle
11625 \end_layout
11627 \begin_layout Plain Layout
11629 newfangle -R./newfangle.module newfangle.tex > ./newfangle.module
11630 \end_layout
11632 \end_inset
11635 \end_layout
11637 \begin_layout Part
11638 Tests
11639 \end_layout
11641 \begin_layout Chapter
11642 Chunk Parameters
11643 \end_layout
11645 \begin_layout Chunk
11646 tests-sub,params=THING;colour
11647 \end_layout
11649 \begin_layout Standard
11650 \begin_inset listings
11651 inline false
11652 status open
11654 \begin_layout Plain Layout
11656 I see a ${THING} of 
11657 \end_layout
11659 \begin_layout Plain Layout
11661 colour ${colour}, 
11662 \end_layout
11664 \begin_layout Plain Layout
11666 looking closer =<
11667 \backslash
11668 chunkref{tests-sub-sub}(${colour})>
11669 \end_layout
11671 \end_inset
11674 \end_layout
11676 \begin_layout Chunk
11677 tests-sub-sub,params=colour 
11678 \end_layout
11680 \begin_layout Standard
11681 \begin_inset listings
11682 inline false
11683 status open
11685 \begin_layout Plain Layout
11687 a funny shade of ${colour}
11688 \end_layout
11690 \end_inset
11693 \end_layout
11695 \begin_layout Chunk
11696 tests
11697 \end_layout
11699 \begin_layout Standard
11700 \begin_inset listings
11701 inline false
11702 status open
11704 \begin_layout Plain Layout
11706 What do you see? "=<
11707 \backslash
11708 chunkref{tests-sub}({joej_joe[hi],red})>"
11709 \end_layout
11711 \begin_layout Plain Layout
11713 Well, fancy!
11714 \end_layout
11716 \end_inset
11719 \end_layout
11721 \begin_layout Standard
11722 Should generate output:
11723 \end_layout
11725 \begin_layout Chunk
11726 tests-result
11727 \end_layout
11729 \begin_layout Standard
11730 \begin_inset listings
11731 inline false
11732 status open
11734 \begin_layout Plain Layout
11736 What do you see? "I see a joe of 
11737 \end_layout
11739 \begin_layout Plain Layout
11741                   colour red, 
11742 \end_layout
11744 \begin_layout Plain Layout
11746                   looking closer a funny shade of red"
11747 \end_layout
11749 \begin_layout Plain Layout
11751 Well, fancy!
11752 \end_layout
11754 \begin_layout Plain Layout
11756 \end_layout
11758 \end_inset
11761 \end_layout
11763 \end_body
11764 \end_document