Addbasic -T tab support, fix basic parameterization again
[newfangle.git] / newfangle.lyx
blob9e189bcd4d11b522bccff8d0721834012b11cbdb
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 Enumerate
231 trim spaces from param
232 \end_layout
234 \begin_layout Enumerate
235 add support for other commands in =<...>, starting with 
236 \backslash
237 label which takes the line-number within the chunk, and maybe should also
238  take the chunk name/page
239 \end_layout
241 \begin_layout Enumerate
242 cant have listing inside a ruled box
243 \end_layout
245 \begin_layout Enumerate
246 when a parameterized chunk is included as well as the #line emission, say
247  what the paremeters were for that invocation.
248 \end_layout
250 \begin_layout Chapter*
251 License
252 \end_layout
254 \begin_layout Standard
255 \begin_inset CommandInset label
256 LatexCommand label
257 name "cha:License"
259 \end_inset
261 Newfangle is licensed under the GPL 3
262 \begin_inset CommandInset citation
263 LatexCommand cite
264 key "gpl-licenses"
266 \end_inset
268  (or later).
269  This doesn't mean that you can't use or distribute newfangle with sources
270  of an incompatible license, but it means you must make the source of newfangle
271  available too.
272 \end_layout
274 \begin_layout Chunk
275 gpl3-copyright,language=
276 \end_layout
278 \begin_layout Standard
279 \begin_inset listings
280 inline false
281 status open
283 \begin_layout Plain Layout
285 #newfangle - fully featured notangle replacement in awk
286 \end_layout
288 \begin_layout Plain Layout
291 \end_layout
293 \begin_layout Plain Layout
295 #Copyright (C) Sam Liddicott 2009
296 \end_layout
298 \begin_layout Plain Layout
301 \end_layout
303 \begin_layout Plain Layout
305 #This program is free software: you can redistribute it and/or modify
306 \end_layout
308 \begin_layout Plain Layout
310 #it under the terms of the GNU General Public License as published by
311 \end_layout
313 \begin_layout Plain Layout
315 #the Free Software Foundation, either version 3 of the License, or
316 \end_layout
318 \begin_layout Plain Layout
320 #(at your option) any later version.
321 \end_layout
323 \begin_layout Plain Layout
326 \end_layout
328 \begin_layout Plain Layout
330 #This program is distributed in the hope that it will be useful,
331 \end_layout
333 \begin_layout Plain Layout
335 #but WITHOUT ANY WARRANTY; without even the implied warranty of
336 \end_layout
338 \begin_layout Plain Layout
340 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
341   See the
342 \end_layout
344 \begin_layout Plain Layout
346 #GNU General Public License for more details.
347 \end_layout
349 \begin_layout Plain Layout
352 \end_layout
354 \begin_layout Plain Layout
356 #You should have received a copy of the GNU General Public License
357 \end_layout
359 \begin_layout Plain Layout
361 #along with this program.
362   If not, see <http://www.gnu.org/licenses/>.
363 \end_layout
365 \end_inset
368 \end_layout
370 \begin_layout Standard
371 \begin_inset CommandInset toc
372 LatexCommand tableofcontents
374 \end_inset
377 \end_layout
379 \begin_layout Part
380 Using Newfangle
381 \end_layout
383 \begin_layout Chapter
384 Running Newfangle
385 \end_layout
387 \begin_layout Standard
388 Newfangle is a replacement for noweb, which consists of 
389 \begin_inset Flex CharStyle:Code
390 status collapsed
392 \begin_layout Plain Layout
393 notangle
394 \end_layout
396 \end_inset
399 \begin_inset Flex CharStyle:Code
400 status collapsed
402 \begin_layout Plain Layout
403 noroots
404 \end_layout
406 \end_inset
408  and 
409 \begin_inset Flex CharStyle:Code
410 status collapsed
412 \begin_layout Plain Layout
413 noweave
414 \end_layout
416 \end_inset
419 \end_layout
421 \begin_layout Standard
422 Like 
423 \begin_inset Flex CharStyle:Code
424 status collapsed
426 \begin_layout Plain Layout
427 notangle
428 \end_layout
430 \end_inset
432  and 
433 \begin_inset Flex CharStyle:Code
434 status collapsed
436 \begin_layout Plain Layout
437 noroots
438 \end_layout
440 \end_inset
442  it can read multiple named files, or from stdin.
443 \end_layout
445 \begin_layout Section
446 Listing roots
447 \end_layout
449 \begin_layout Standard
450 The -r option causes newfangle to behave like noroots.
451 \end_layout
453 \begin_layout LyX-Code
454 newfangle -r filename.tex
455 \end_layout
457 \begin_layout Standard
458 will print out the newfangle roots of a tex file.
460 \end_layout
462 \begin_layout Standard
463 Unlike the 
464 \begin_inset Flex CharStyle:Code
465 status collapsed
467 \begin_layout Plain Layout
468 noroots
469 \end_layout
471 \end_inset
473  command, the roots are not enclosed in 
474 \begin_inset Flex CharStyle:Code
475 status collapsed
477 \begin_layout Plain Layout
478 <<name>>
479 \end_layout
481 \end_inset
483 , unless at least one of the roots is defined using the 
484 \begin_inset Flex CharStyle:Code
485 status collapsed
487 \begin_layout Plain Layout
488 notangle
489 \end_layout
491 \end_inset
493  style 
494 \begin_inset Flex CharStyle:Code
495 status collapsed
497 \begin_layout Plain Layout
498 <<name>>=
499 \end_layout
501 \end_inset
504 \end_layout
506 \begin_layout Standard
507 Also, unlike noroots, it prints out all roots --- not just those that are
508  not used elsewhere.
509  I find that a root not being used, doesn't make it particularly top level.
510  My convention is that top level roots to be extracted begin with 
511 \begin_inset Flex CharStyle:Code
512 status collapsed
514 \begin_layout Plain Layout
516 \end_layout
518 \end_inset
520  and have the form of a filename.
521 \end_layout
523 \begin_layout Section
524 Extracting roots
525 \end_layout
527 \begin_layout Standard
528 notangle's 
529 \begin_inset Flex CharStyle:Code
530 status collapsed
532 \begin_layout Plain Layout
534 \end_layout
536 \end_inset
538  and 
539 \begin_inset Flex CharStyle:Code
540 status collapsed
542 \begin_layout Plain Layout
544 \end_layout
546 \end_inset
548  options are supported.
549 \end_layout
551 \begin_layout Standard
552 The standard way to extract a file would be:
553 \end_layout
555 \begin_layout LyX-Code
556 newfangle -R./Makefile.inc newfangle.tex > ./Makefile.inc
557 \end_layout
559 \begin_layout Standard
560 Unlike the 
561 \begin_inset Flex CharStyle:Code
562 status collapsed
564 \begin_layout Plain Layout
565 noroots
566 \end_layout
568 \end_inset
570  command, the 
571 \begin_inset Flex CharStyle:Code
572 status collapsed
574 \begin_layout Plain Layout
576 \end_layout
578 \end_inset
580  option does not break indenting; also the 
581 \begin_inset Flex CharStyle:Code
582 status collapsed
584 \begin_layout Plain Layout
586 \end_layout
588 \end_inset
590  option does not interrupt (and break) multi-line C macros --- or indeed
591  any line ending with a backslash.
592  This does mean that sometimes the compiler might calculate the source line
593  wrongly when generating error messages in such cases, but there isn't any
594  other way around if multi-line macros include other chunks.
595 \end_layout
597 \begin_layout Section
598 Formatting source in LaTeX
599 \end_layout
601 \begin_layout Standard
602 The noweave replacement is a set of LaTeX macros dependant upon 
603 \emph on
604 noweb.sty
605 \emph default
606 , and which can be included with:
607 \end_layout
609 \begin_layout LyX-Code
611 \backslash
612 usepackage{newfangle.sty}
613 \end_layout
615 \begin_layout Standard
616 The LaTeX macros are shown in section 
617 \begin_inset CommandInset ref
618 LatexCommand ref
619 reference "sec:Latex-Macros"
621 \end_inset
623 , and are part of a LyX module file 
624 \begin_inset Flex CharStyle:Code
625 status collapsed
627 \begin_layout Plain Layout
628 newfangle.module
629 \end_layout
631 \end_inset
633 , which automatically includes the macros in the document pre-amble when
634  the newfangle LyX module is used.
635 \end_layout
637 \begin_layout Standard
638 Because the noweave replacement is impemented in LaTeX, there is no processing
639  stage required before running the 
640 \begin_inset Flex CharStyle:Code
641 status collapsed
643 \begin_layout Plain Layout
644 latex
645 \end_layout
647 \end_inset
649  command.
650  LaTeX may need running two or more times, so that the code chunk references
651  can be fully calculated.
652 \end_layout
654 \begin_layout Standard
655 The 
656 \begin_inset Flex CharStyle:Code
657 status collapsed
659 \begin_layout Plain Layout
660 noweb.sty
661 \end_layout
663 \end_inset
665  package is required as it is used for formatting the code chunk captions
666 \end_layout
668 \begin_layout Standard
669 The 
670 \begin_inset Flex CharStyle:Code
671 status collapsed
673 \begin_layout Plain Layout
674 listings.sty
675 \end_layout
677 \end_inset
679  package is also required, as it is used for formatting the code chunks
680  themselves.
681 \end_layout
683 \begin_layout Standard
684 The 
685 \begin_inset Flex CharStyle:Code
686 status collapsed
688 \begin_layout Plain Layout
689 xargs.sty
690 \end_layout
692 \end_inset
694  package is also required.
695 \end_layout
697 \begin_layout Chapter
698 Literate Programming with Newfangle
699 \end_layout
701 \begin_layout Standard
702 Todo.
703  Should really follow on from a part-0 explanation of what literate programming
704  is.
705 \end_layout
707 \begin_layout Chapter
708 Using Newfangle with LyX
709 \end_layout
711 \begin_layout Section
712 Setting up Lyx
713 \end_layout
715 \begin_layout Subsection
716 Installing the LyX module
717 \end_layout
719 \begin_layout Standard
720 Copy 
721 \begin_inset Flex CharStyle:Code
722 status collapsed
724 \begin_layout Plain Layout
725 newfangle.module
726 \end_layout
728 \end_inset
730  to your LyX layouts directory, which for unix users will be 
731 \begin_inset Flex CharStyle:Code
732 status collapsed
734 \begin_layout Plain Layout
735 ~/.lyx/layouts
736 \end_layout
738 \end_inset
741 \end_layout
743 \begin_layout Standard
744 You will need to reconfigure LyX by clicking Tools\SpecialChar \menuseparator
745 Reconfigure, and then
746  re-start LyX.
747 \end_layout
749 \begin_layout Subsection
750 \begin_inset CommandInset label
751 LatexCommand label
752 name "sub:Configuring-the-build"
754 \end_inset
756 Configuring the build script
757 \end_layout
759 \begin_layout Standard
760 Make sure you don't have a conversion defined for Lyx → Program
761 \end_layout
763 \begin_layout Standard
764 From the menu Tools\SpecialChar \menuseparator
765 Preferences, add a conversion from Latex(Plain) → Program
766  as:
767 \end_layout
769 \begin_layout LyX-Code
770 set -x ; newfangle -Rlyx-build $$i | 
771 \end_layout
773 \begin_layout LyX-Code
774   env LYX_b=$$b LYX_i=$$i LYX_o=$$o LYX_p=$$p LYX_r=$$r bash
775 \end_layout
777 \begin_layout Standard
778 (But don't cut-n-paste it from this document or you'll be pasting a multi-line
779  string which will break your lyx preferences file).
781 \end_layout
783 \begin_layout Standard
784 I hope that one day, LyX will set these into the environment when calling
785  the build script.
786 \end_layout
788 \begin_layout Standard
789 You may also want to consider adding options to this conversion\SpecialChar \ldots{}
791 \end_layout
793 \begin_layout LyX-Code
794 parselog=/usr/share/lyx/scripts/listerrors
795 \end_layout
797 \begin_layout Standard
798 \SpecialChar \ldots{}
799 but if you do you will lose your stderr
800 \begin_inset Foot
801 status collapsed
803 \begin_layout Plain Layout
804 There is some bash plumbing to get a copy of stderr but this footnote is
805  too small
806 \end_layout
808 \end_inset
811 \end_layout
813 \begin_layout Standard
814 Now, a shell script chunk called 
815 \begin_inset Flex CharStyle:Code
816 status collapsed
818 \begin_layout Plain Layout
819 lyx-build
820 \end_layout
822 \end_inset
824  will be extracted and run whenever you choose the Document\SpecialChar \menuseparator
825 Build Program
826  menu item.
827 \end_layout
829 \begin_layout Standard
830 The lyx-build script for this document is in section 
831 \begin_inset CommandInset ref
832 LatexCommand ref
833 reference "lyx-build-script"
835 \end_inset
837  and on a unix system will extract 
838 \begin_inset Flex CharStyle:Code
839 status collapsed
841 \begin_layout Plain Layout
842 newfangle.module
843 \end_layout
845 \end_inset
847  and the 
848 \begin_inset Flex CharStyle:Code
849 status collapsed
851 \begin_layout Plain Layout
852 newfangle
853 \end_layout
855 \end_inset
857  awk script.
858 \end_layout
860 \begin_layout Subsection
861 Preparing your Lyx document
862 \end_layout
864 \begin_layout Standard
865 It is not necessary to base your literate document on any of the original
866  LyX literate classes; so select a regular class for your document type.
867 \end_layout
869 \begin_layout Standard
870 Add the new module 
871 \emph on
872 Newfangle Literate
873 \emph default
875 \emph on
876 Listings
877 \emph default
878  and possibly also 
879 \emph on
880 Logical Markup
881 \emph default
883 \end_layout
885 \begin_layout Standard
886 In the drop-down style listbox you should notice a new style defined, called
888 \emph on
889 Chunk
890 \emph default
892 \end_layout
894 \begin_layout Standard
895 When you wish to insert a literate chunk, you enter it's plain name in the
896  Chunk style, instead of the older method that used 
897 \begin_inset Flex CharStyle:Code
898 status collapsed
900 \begin_layout Plain Layout
901 <<name>>=
902 \end_layout
904 \end_inset
906  type tags.
907  Following the chunk name, you insert a listing with: Insert\SpecialChar \menuseparator
908 Program Listing.
909 \end_layout
911 \begin_layout Standard
912 Inside the white listing box you can type (or paste using shift+ctrl+V)
913  your listing.
914  There is not need to use ctrl+enter at the end of lines as with some older
915  LyX literate techniques --- just press enter as normal.
916 \end_layout
918 \begin_layout Subsubsection
919 Customising the listing appearance
920 \end_layout
922 \begin_layout Standard
923 In the final document, the code is formatted using the 
924 \noun on
925 lstlistings
926 \noun default
927  package.
928  The chunk style doesn't just define the chunk name, but can also define
929  any other chunk options supported by the lstlistings package 
930 \begin_inset Flex CharStyle:Code
931 status collapsed
933 \begin_layout Plain Layout
935 \backslash
936 lstset
937 \end_layout
939 \end_inset
941  command.
942  In fact, what you type in the chunk style is raw latex.
943  If you want to set the chunk language without having to right-click the
944  listing, just add 
945 \begin_inset Flex CharStyle:Code
946 status collapsed
948 \begin_layout Plain Layout
949 ,lanuage=C
950 \end_layout
952 \end_inset
954  after the chunk name.
955 \end_layout
957 \begin_layout Standard
958 Of course you can do this by editing the listings box advanced properties
959  by right-clicking on the listings box, but that takes longer, and you can't
960  see at-a-glance what the advanced settings are while editing the document;
961  also advanced settings apply only to that box --- the chunk settings apply
962  through the rest of the document
963 \begin_inset Foot
964 status collapsed
966 \begin_layout Plain Layout
967 It ought to apply only to subsequent chunks of the same name.
968  I'll fix that later
969 \end_layout
971 \end_inset
974 \begin_inset Note Note
975 status collapsed
977 \begin_layout Plain Layout
978 So make sure they only apply to chunks of that name
979 \end_layout
981 \end_inset
984 \end_layout
986 \begin_layout Subsubsection
987 Global customisations
988 \end_layout
990 \begin_layout Standard
991 As 
992 \emph on
993 lstlistings
994 \emph default
995  is used to set the code chunks, it's 
996 \begin_inset Flex CharStyle:Code
997 status collapsed
999 \begin_layout Plain Layout
1001 \backslash
1002 lstset
1003 \end_layout
1005 \end_inset
1007  command can be used in the pre-amble to set some document wide settings.
1008 \end_layout
1010 \begin_layout Standard
1011 If your source has many words with long sequences of capital letters, then
1013 \begin_inset Flex CharStyle:Code
1014 status collapsed
1016 \begin_layout Plain Layout
1017 columns=fullflexible
1018 \end_layout
1020 \end_inset
1022  may be a good idea, or the capital letters will get crowded.
1023  (I think lstlistings ought to use a slightly smaller font for captial letters
1024  so that they still fit).
1025 \end_layout
1027 \begin_layout Standard
1028 The font family 
1029 \begin_inset Flex CharStyle:Code
1030 status collapsed
1032 \begin_layout Plain Layout
1034 \backslash
1035 ttfamily
1036 \end_layout
1038 \end_inset
1040  looks more normal for code, but has no bold (unless luximono is used, but
1041  it doesn't work for me); so I use 
1042 \begin_inset Flex CharStyle:Code
1043 status collapsed
1045 \begin_layout Plain Layout
1047 \backslash
1048 color{darkgreen}
1049 \end_layout
1051 \end_inset
1053  for my keywords.
1054  With 
1055 \begin_inset Flex CharStyle:Code
1056 status collapsed
1058 \begin_layout Plain Layout
1060 \backslash
1061 ttfamily
1062 \end_layout
1064 \end_inset
1067 \begin_inset Flex CharStyle:Code
1068 status collapsed
1070 \begin_layout Plain Layout
1071 columns=fullflexible
1072 \end_layout
1074 \end_inset
1076  is used or the wrong letter spacing is used.
1077 \end_layout
1079 \begin_layout Standard
1080 In my LeTeX pre-amble I usually specialise my code format with:
1081 \end_layout
1083 \begin_layout Chunk
1084 document-preamble,language=tex
1085 \end_layout
1087 \begin_layout Standard
1088 \begin_inset listings
1089 inline false
1090 status open
1092 \begin_layout Plain Layout
1095 \backslash
1096 usepackage{xcolor}
1097 \end_layout
1099 \begin_layout Plain Layout
1102 \backslash
1103 definecolor{darkgreen}{rgb}{0,0.5,0}
1104 \end_layout
1106 \begin_layout Plain Layout
1109 \backslash
1110 lstset{numbers=left, stepnumber=5, numbersep=5pt, breaklines=false,
1111 \end_layout
1113 \begin_layout Plain Layout
1115   basicstyle=
1116 \backslash
1117 footnotesize
1118 \backslash
1119 ttfamily,
1120 \end_layout
1122 \begin_layout Plain Layout
1124   keywordstyle=
1125 \backslash
1126 color{darkgreen},
1127 \end_layout
1129 \begin_layout Plain Layout
1131   numberstyle=
1132 \backslash
1133 tiny,language=C,columns=fullflexible,
1134 \end_layout
1136 \begin_layout Plain Layout
1138   numberfirstline=true
1139 \end_layout
1141 \begin_layout Plain Layout
1144 \end_layout
1146 \end_inset
1149 \end_layout
1151 \begin_layout Chapter
1152 Newfangle with Makefiles
1153 \end_layout
1155 \begin_layout Standard
1156 \begin_inset Note Note
1157 status open
1159 \begin_layout Plain Layout
1160 This chapter needs revising
1161 \end_layout
1163 \end_inset
1166 \begin_inset Note Greyedout
1167 status open
1169 \begin_layout Plain Layout
1170 This chapter needs revising
1171 \end_layout
1173 \end_inset
1175 Here we describe a Makefile.inc that you can include in your own Makefiles,
1176  or glue as a recursive make to other projects.
1177 \end_layout
1179 \begin_layout Standard
1180 The Makefile.inc described here was put together for a Samba4 vfs module,
1181  but can be used in any Make project, including automake projects.
1182 \end_layout
1184 \begin_layout Section
1185 A word about makefiles formats
1186 \end_layout
1188 \begin_layout Standard
1189 Whitespace formatting is very important in a Makefile.
1190  The first character of each command line must be a TAB.
1191 \end_layout
1193 \begin_layout LyX-Code
1194 target: pre-requisite
1195 \begin_inset Newline newline
1196 \end_inset
1198    →    action
1199 \begin_inset Newline newline
1200 \end_inset
1202    →    action
1203 \end_layout
1205 \begin_layout Standard
1206 But a TAB is pretty hard to enter into most of the Lyx formats and insets
1207  I've been using.
1208  An alternative is to use a semi-colon after the pre-requisite, and a backslash
1209  at the end of each line (except the last).
1210  Then any whitespace (or none) can prefix each action.
1211 \end_layout
1213 \begin_layout LyX-Code
1214 target: pre-requisite ; 
1215 \backslash
1217 \begin_inset Newline newline
1218 \end_inset
1220 ␣␣action 
1221 \backslash
1223 \begin_inset Newline newline
1224 \end_inset
1226 ␣␣action
1227 \end_layout
1229 \begin_layout Standard
1230 This is the style that we use and it works pretty well for GNU make at least.
1231 \end_layout
1233 \begin_layout Standard
1234 We also adopt a convention that code chunks whose names beginning with ./
1235  should always be automatically extracted from the document.
1236  Code chunks whose names do not begin with ./ are for internal reference.
1237  (This doesn't prevent such chunks from being extracted directly).
1238 \end_layout
1240 \begin_layout Section
1241 Boot-strapping the extraction
1242 \end_layout
1244 \begin_layout Subsection
1245 Using a Makefile
1246 \end_layout
1248 \begin_layout Standard
1249 \begin_inset CommandInset label
1250 LatexCommand label
1251 name "sub:Bootstrap-Using-a-Makefile"
1253 \end_inset
1255 It seems convenient to have the makefile extract or update the C source
1256  files as part of it's operation.
1257  It also seems convenient to have the makefile itself extracted from this
1258  document.
1259 \end_layout
1261 \begin_layout Standard
1262 It would also be convenient to have the code to extract the makefile from
1263  this document to also be part of this document, however we have to start
1264  somewhere and this unfortunately requires us to type at least a few words
1265  by hand to start things off.
1266 \end_layout
1268 \begin_layout Standard
1269 Therefore we will have a minimal root fragment, which, when extracted, can
1270  cope with extracting the rest of the source.
1271  perhaps with this shell script, which could be called 
1272 \emph on
1273 autoboot
1274 \emph default
1276 \begin_inset Note Note
1277 status open
1279 \begin_layout Plain Layout
1280 FIX THIS CHUNK AND TEST IT
1281 \end_layout
1283 \end_inset
1286 \end_layout
1288 \begin_layout Chunk
1290 \end_layout
1292 \begin_layout Standard
1293 \begin_inset listings
1294 inline false
1295 status open
1297 \begin_layout Plain Layout
1299 #! /bin/sh
1300 \end_layout
1302 \begin_layout Plain Layout
1304 \end_layout
1306 \begin_layout Plain Layout
1308 MAKE_SRC="${1:-${NW_LYX:-../../noweb-lyx/noweb-lyx3.lyx}}"
1309 \end_layout
1311 \begin_layout Plain Layout
1313 MAKE_SRC=`dirname "$MAKE_SRC"`/`basename "$MAKE_SRC" .lyx`
1314 \end_layout
1316 \begin_layout Plain Layout
1318 NOWEB_SRC="${2:-${NOWEB_SRC:-$MAKE_SRC.lyx}}"
1319 \end_layout
1321 \begin_layout Plain Layout
1323 lyx -e latex $MAKE_SRC
1324 \end_layout
1326 \begin_layout Plain Layout
1328 \end_layout
1330 \begin_layout Plain Layout
1332 newfangle -R./Makefile.inc ${MAKE_SRC}.tex 
1333 \backslash
1335 \end_layout
1337 \begin_layout Plain Layout
1339   | sed "/NEWFANGLE_SOURCE=/s/^/#/;T;aNOWEB_SOURCE=$NEWFANGLE_SRC" 
1340 \backslash
1342 \end_layout
1344 \begin_layout Plain Layout
1346   | cpif ./Makefile.inc
1347 \end_layout
1349 \begin_layout Plain Layout
1351 \end_layout
1353 \begin_layout Plain Layout
1355 make -f ./Makefile.inc newfangle_sources
1356 \end_layout
1358 \end_inset
1361 \end_layout
1363 \begin_layout Standard
1364 The general Makefile can be invoked with 
1365 \emph on
1366 ./autoboot
1367 \emph default
1368  and can also be included into any automake file to automatically re-generate
1369  the source files.
1370 \end_layout
1372 \begin_layout Standard
1373 The 
1374 \emph on
1375 autoboot
1376 \emph default
1377  can be extracted with this command:
1378 \end_layout
1380 \begin_layout LyX-Code
1381 lyx -e latex newfangle.lyx && 
1382 \backslash
1384 \end_layout
1386 \begin_layout LyX-Code
1387 newfangle newfangle.lyx > ./autoboot
1388 \end_layout
1390 \begin_layout Standard
1391 This looks simple enough, but as mentioned, newfangle has to be had from
1392  somewhere before it can be extracted.
1393 \end_layout
1395 \begin_layout Subsection
1396 \begin_inset Note Note
1397 status collapsed
1399 \begin_layout Plain Layout
1400 MERGE THIS WITH THE SECTIONS OF THIS DOCUMENT
1401 \end_layout
1403 \end_inset
1405 \SpecialChar \ldots{}
1407 \end_layout
1409 \begin_layout Standard
1410 When the lyx-build chunk is executed, the current directory will be a temporary
1411  directory, and 
1412 \begin_inset Flex CharStyle:Code
1413 status collapsed
1415 \begin_layout Plain Layout
1416 LYX_SOURCE
1417 \end_layout
1419 \end_inset
1421  will refer to the tex file in this temporary directory.
1422  This is unfortunate as our makefile wants to run from the project directory
1423  where the Lyx file is kept.
1424 \end_layout
1426 \begin_layout Standard
1427 We can extract the project directory from $$r, and derive the probable Lyx
1428  filename from the noweb file that Lyx generated.
1429 \end_layout
1431 \begin_layout Chunk
1432 lyx-build-helper
1433 \end_layout
1435 \begin_layout Standard
1436 \begin_inset listings
1437 inline false
1438 status open
1440 \begin_layout Plain Layout
1442 PROJECT_DIR="$LYX_r"
1443 \end_layout
1445 \begin_layout Plain Layout
1447 LYX_SRC="$PROJECT_DIR/${LYX_i%.tex}.lyx"
1448 \end_layout
1450 \begin_layout Plain Layout
1452 TEX_DIR="$LYX_p"
1453 \end_layout
1455 \begin_layout Plain Layout
1457 TEX_SRC="$TEX_DIR/$LYX_i"
1458 \end_layout
1460 \end_inset
1463 \end_layout
1465 \begin_layout Standard
1466 And then we can define a lyx-build fragment similar to the autoboot fragment
1467 \end_layout
1469 \begin_layout Chunk
1470 lyx-build
1471 \end_layout
1473 \begin_layout Standard
1474 \begin_inset listings
1475 inline false
1476 status open
1478 \begin_layout Plain Layout
1480 #! /bin/sh
1481 \end_layout
1483 \begin_layout Plain Layout
1486 \backslash
1487 chunkref{lyx-build-helper}>
1488 \end_layout
1490 \begin_layout Plain Layout
1492 cd $PROJECT_DIR || exit 1
1493 \end_layout
1495 \begin_layout Plain Layout
1497 \end_layout
1499 \begin_layout Plain Layout
1501 #/usr/bin/newfangle -filter ./notanglefix-filter 
1502 \backslash
1504 \end_layout
1506 \begin_layout Plain Layout
1508 #  -R./Makefile.inc "../../noweb-lyx/noweb-lyx3.lyx" 
1509 \backslash
1511 \end_layout
1513 \begin_layout Plain Layout
1515 #  | sed '/NOWEB_SOURCE=/s/=.*/=samba4-dfs.lyx/' 
1516 \backslash
1518 \end_layout
1520 \begin_layout Plain Layout
1522 #  > ./Makefile.inc
1523 \end_layout
1525 \begin_layout Plain Layout
1528 \end_layout
1530 \begin_layout Plain Layout
1532 #make -f ./Makefile.inc newfangle_sources
1533 \end_layout
1535 \end_inset
1538 \end_layout
1540 \begin_layout Section
1541 Extracting Sources
1542 \end_layout
1544 \begin_layout Subsection
1545 Including Makefile.inc
1546 \end_layout
1548 \begin_layout Standard
1549 \begin_inset CommandInset label
1550 LatexCommand label
1551 name "sub:Keeping-extracted-files"
1553 \end_inset
1555 Makefile.inc will cope with extracting all the other source files from this
1556  document and keeping them up to date.
1558 \end_layout
1560 \begin_layout Standard
1561 It may also be included by a Makefile or Makefile.am defined in a Lyx document
1562  to automatically deal with the extraction of source files and documents.
1563 \end_layout
1565 \begin_layout Standard
1566 A makefile has two parts; variables must be defined before the targets that
1567  use them.
1568 \end_layout
1570 \begin_layout Chunk
1571 ./Makefile.inc
1572 \end_layout
1574 \begin_layout Standard
1575 \begin_inset listings
1576 inline false
1577 status open
1579 \begin_layout Plain Layout
1582 \backslash
1583 chunkref{Makefile.inc-vars}>
1584 \end_layout
1586 \begin_layout Plain Layout
1589 \backslash
1590 chunkref{Makefile.inc-targets}>
1591 \end_layout
1593 \end_inset
1596 \end_layout
1598 \begin_layout Standard
1599 We first define 
1600 \begin_inset Flex CharStyle:Code
1601 status collapsed
1603 \begin_layout Plain Layout
1604 NOWEB_SOURCE
1605 \end_layout
1607 \end_inset
1609  to hold the name of this Lyx file.
1610 \end_layout
1612 \begin_layout Chunk
1613 Makefile.inc-vars
1614 \end_layout
1616 \begin_layout Standard
1617 \begin_inset listings
1618 inline false
1619 status open
1621 \begin_layout Plain Layout
1623 LYX_SOURCE=
1624 \end_layout
1626 \begin_layout Plain Layout
1628 LITERATE_SOURCE=$(LYX_SOURCE)
1629 \end_layout
1631 \end_inset
1634 \end_layout
1636 \begin_layout Subsection
1637 Recursive use of Makefile.inc
1638 \end_layout
1640 \begin_layout Standard
1641 The makefile glue described here is used when building Samba4 vfs modules.
1642 \end_layout
1644 \begin_layout Standard
1645 If you are defining a module of an existing program you may find it easier
1646  to use a slight recursive make instead of including the makefile directly.
1647  This way there is less chance of definitions in Makefile.inc interfering
1648  with definitions in the main makefile, or with definitions in other Makefile.inc
1649  from other noweb modules.
1650 \end_layout
1652 \begin_layout Standard
1653 The glue works by adding a .PHONY target to call the recursive make, and
1654  adding this target as an additional pre-requisite to the existing targets.
1655 \end_layout
1657 \begin_layout Standard
1658 In this example, the existing build system already has a build target for
1660 \begin_inset Flex CharStyle:Code
1661 status collapsed
1663 \begin_layout Plain Layout
1664 example.o
1665 \end_layout
1667 \end_inset
1669 , so we just add another pre-requisite to that.
1670  In this case we use 
1671 \begin_inset Flex CharStyle:Code
1672 status collapsed
1674 \begin_layout Plain Layout
1675 example.tex.stamp
1676 \end_layout
1678 \end_inset
1680  as a pre-requisite, the stamp file's modified time indicating when all
1681  sources were extracted.
1682 \end_layout
1684 \begin_layout Chunk
1685 makefile-glue
1686 \end_layout
1688 \begin_layout Standard
1689 \begin_inset listings
1690 inline false
1691 status open
1693 \begin_layout Plain Layout
1695 $(example_srcdir)/example.o: $(example_srcdir)/example.tex.stamp
1696 \end_layout
1698 \end_inset
1701 \end_layout
1703 \begin_layout Standard
1704 The target for this new pre-requisite is generated by a recursive make using
1705  Makefile.inc which will make sure that the source is up to date, before
1706  it is built by the main projects makefile.
1707 \end_layout
1709 \begin_layout Chunk
1710 makefile-glue
1711 \end_layout
1713 \begin_layout Standard
1714 \begin_inset listings
1715 inline false
1716 status open
1718 \begin_layout Plain Layout
1720 $(example_srcdir)/example.tex.stamp: $(example_srcdir)/example.tex ; 
1721 \backslash
1723 \end_layout
1725 \begin_layout Plain Layout
1727         cd $(example_srcdir) && 
1728 \backslash
1730 \end_layout
1732 \begin_layout Plain Layout
1734         $(MAKE) -f Makefile.inc newfangle_sources
1735 \end_layout
1737 \end_inset
1740 \end_layout
1742 \begin_layout Standard
1743 We can do similar glue for the docs, clean and distclean targets.
1744  In this example our build system is using a double colon for these targets,
1745  so we use the same in our glue.
1746 \end_layout
1748 \begin_layout Chunk
1749 makefile-glue
1750 \end_layout
1752 \begin_layout Standard
1753 \begin_inset listings
1754 inline false
1755 status open
1757 \begin_layout Plain Layout
1759 docs:: docs_example
1760 \end_layout
1762 \begin_layout Plain Layout
1764 .PHONY: docs_example
1765 \end_layout
1767 \begin_layout Plain Layout
1769 docs_example:: ; cd $(example_srcdir) && 
1770 \backslash
1772 \end_layout
1774 \begin_layout Plain Layout
1776         $(MAKE) -f Makefile.inc docs
1777 \end_layout
1779 \begin_layout Plain Layout
1781 \end_layout
1783 \begin_layout Plain Layout
1785 clean:: clean_example
1786 \end_layout
1788 \begin_layout Plain Layout
1790 .PHONEY: clean_example
1791 \end_layout
1793 \begin_layout Plain Layout
1795 clean_example: ; cd $(example_srcdir) && 
1796 \backslash
1798 \end_layout
1800 \begin_layout Plain Layout
1802         $(MAKE) -f Makefile.inc clean
1803 \end_layout
1805 \begin_layout Plain Layout
1807 \end_layout
1809 \begin_layout Plain Layout
1811 distclean:: distclean_example
1812 \end_layout
1814 \begin_layout Plain Layout
1816 .PHONY: distclean_example
1817 \end_layout
1819 \begin_layout Plain Layout
1821 distclean_example: ; cd $(example_srcdir) && 
1822 \backslash
1824 \end_layout
1826 \begin_layout Plain Layout
1828         $(MAKE) -f Makefile.inc distclean
1829 \end_layout
1831 \end_inset
1834 \end_layout
1836 \begin_layout Standard
1837 We could do similarly for install targets to install the generated docs.
1838 \end_layout
1840 \begin_layout Subsection
1841 \begin_inset CommandInset label
1842 LatexCommand label
1843 name "sub:Converting-from-Lyx"
1845 \end_inset
1847 Converting from Lyx to LaTeX
1848 \end_layout
1850 \begin_layout Standard
1851 The first stage will always be to convert the Lyx file to a LaTeX file;
1852  this must be so not only because newfangle needs to to run on a TeX file,
1853  but also because the Lyx command 
1854 \emph on
1855 server-goto-file-line
1856 \begin_inset Foot
1857 status collapsed
1859 \begin_layout Plain Layout
1860 The Lyx command 
1861 \emph on
1862 server-goto-file-line
1863 \emph default
1864  is used to position the Lyx cursor at the compiler errors.
1865 \end_layout
1867 \end_inset
1870 \emph default
1871  insists that the line number provided is a line in the TeX file, and always
1872  reverse maps this to derive the line in the Lyx docment.
1873 \begin_inset Note Note
1874 status collapsed
1876 \begin_layout Plain Layout
1877 The tex file should probably be an automake extra dist sources or something,
1878  so that it gets produced and packaged by make dist
1879 \end_layout
1881 \end_inset
1884 \end_layout
1886 \begin_layout Standard
1887 The command [[lyx -e literate noweb-lyx.lyx]] will produce [[noweb-lyx.nw]]
1888  a tex file, so we define the noweb target to be the same as the Lyx file
1889  but with the .nw extension.
1890 \end_layout
1892 \begin_layout Chunk
1893 Makefile.inc-vars
1894 \end_layout
1896 \begin_layout Standard
1897 \begin_inset listings
1898 inline false
1899 status open
1901 \begin_layout Plain Layout
1903 TEX_SOURCE=$(LYX_SOURCE:.lyx=.tex)
1904 \end_layout
1906 \end_inset
1909 \end_layout
1911 \begin_layout Chunk
1912 Makefile.inc-targets
1913 \end_layout
1915 \begin_layout Standard
1916 \begin_inset listings
1917 inline false
1918 status open
1920 \begin_layout Plain Layout
1922 $(TEX_SOURCE): $(LYX_SOURCE) ;
1923 \backslash
1925 \end_layout
1927 \begin_layout Plain Layout
1929         lyx -e latex $<
1930 \end_layout
1932 \begin_layout Plain Layout
1934 clean_tex: ; rm -f -- $(TEX_SOURCE)
1935 \end_layout
1937 \end_inset
1940 \end_layout
1942 \begin_layout Subsection
1943 Extracting Program Source
1944 \end_layout
1946 \begin_layout Standard
1947 The program source is extracted using newfangle, which is designed to operate
1948  on a LaTeX document.
1950 \end_layout
1952 \begin_layout Chunk
1953 Makefile.inc-vars
1954 \end_layout
1956 \begin_layout Standard
1957 \begin_inset listings
1958 inline false
1959 status open
1961 \begin_layout Plain Layout
1963 NEWFANGLE_SOURCE=$(TEX_SOURCE)
1964 \end_layout
1966 \end_inset
1969 \end_layout
1971 \begin_layout Standard
1972 The Lyx document can result in any number of source documents, but not all
1973  of these will be changed each time the Lyx document is updated.
1974  We certainly don't want to update the timestamps of these files and cause
1975  the whole source tree to be recompiled just because the Lyx document was
1976  edited.
1978 \end_layout
1980 \begin_layout Standard
1981 To solve this problem we use a stamp file which is always updated each time
1982  the sources are extracted from the LaTeX document.
1983  If the stamp file is older than the LaTeX document, then we can make an
1984  attempt to re-extract the sources.
1985 \end_layout
1987 \begin_layout Chunk
1988 Makefile.inc-vars
1989 \end_layout
1991 \begin_layout Standard
1992 \begin_inset listings
1993 inline false
1994 status open
1996 \begin_layout Plain Layout
1998 NEWFANGLE_SOURCE_STAMP=$(NEWFANGLE_SOURCE).stamp
1999 \end_layout
2001 \end_inset
2004 \end_layout
2006 \begin_layout Chunk
2007 Makefile.inc-targets
2008 \end_layout
2010 \begin_layout Standard
2011 \begin_inset listings
2012 inline false
2013 status open
2015 \begin_layout Plain Layout
2017 $(NEWFANGLE_SOURCE_STAMP): $(NEWFANGLE_SOURCE) 
2018 \backslash
2020 \end_layout
2022 \begin_layout Plain Layout
2024                            $(NEWFANGLE_SOURCES) ; 
2025 \backslash
2027 \end_layout
2029 \begin_layout Plain Layout
2031         echo > $(NEWFANGLE_SOURCE_STAMP)
2032 \end_layout
2034 \begin_layout Plain Layout
2036 clean_stamp: ; rm -f $(NEWFANGLE_SOURCE_STAMP)
2037 \end_layout
2039 \begin_layout Plain Layout
2041 clean: clean_stamp
2042 \end_layout
2044 \end_inset
2047 \end_layout
2049 \begin_layout Subsection
2050 Extracting C sources
2051 \end_layout
2053 \begin_layout Standard
2054 We compute 
2055 \begin_inset Flex CharStyle:Code
2056 status collapsed
2058 \begin_layout Plain Layout
2059 NEWFANGLE_SOURCES
2060 \end_layout
2062 \end_inset
2064  to hold the names of all the C source files defined in this document.
2065  We compute this only once, by means of := in assignent.
2066  The sed deletes the any <
2067 \begin_inset space \hspace*{}
2068 \length 0in
2069 \end_inset
2071 < and >
2072 \begin_inset space \hspace*{}
2073 \length 0in
2074 \end_inset
2076 > which may surround the roots names (for noroots compatibility).
2078 \end_layout
2080 \begin_layout Standard
2081 As we use chunk names beginning with ./ to denote top level fragments that
2082  should be extracted, we filter out all fragments that do not begin with
2083  ./
2084 \end_layout
2086 \begin_layout Chunk
2087 Makefile.inc-vars
2088 \end_layout
2090 \begin_layout Standard
2091 \begin_inset listings
2092 inline false
2093 status open
2095 \begin_layout Plain Layout
2097 NEWFANGLE_PREFIX:=
2098 \backslash
2100 \backslash
2102 \end_layout
2104 \begin_layout Plain Layout
2106 NEWFANGLE_SOURCES:=$(shell 
2107 \backslash
2109 \end_layout
2111 \begin_layout Plain Layout
2113   newfangle -r $(NEWFANGLE_SOURCE) |
2114 \backslash
2116 \end_layout
2118 \begin_layout Plain Layout
2120   sed -e 's/^[<][<]//;s/[>][>]$$//;/^$(NEWFANGLE_PREFIX)/!d' 
2121 \backslash
2123 \end_layout
2125 \begin_layout Plain Layout
2127       -e 's/^$(NEWFANGLE_PREFIX)/
2128 \backslash
2130 \backslash
2131 //' )
2132 \end_layout
2134 \begin_layout Plain Layout
2137 \end_layout
2139 \end_inset
2142 \end_layout
2144 \begin_layout Chunk
2145 Makefile.inc-targets
2146 \end_layout
2148 \begin_layout Standard
2149 \begin_inset listings
2150 inline false
2151 status open
2153 \begin_layout Plain Layout
2155 .PHONY: echo_newfangle_sources
2156 \end_layout
2158 \begin_layout Plain Layout
2160 echo_newfangle_sources: ; @echo $(NEWFANGLE_SOURCES)
2161 \end_layout
2163 \end_inset
2166 \end_layout
2168 \begin_layout Standard
2169 We define a convenient target called 
2170 \begin_inset Flex CharStyle:Code
2171 status collapsed
2173 \begin_layout Plain Layout
2174 newfangle_sources
2175 \end_layout
2177 \end_inset
2179  to re-extract the source if the LaTeX file has been updated.
2180 \end_layout
2182 \begin_layout Chunk
2183 Makefile.inc-targets
2184 \end_layout
2186 \begin_layout Standard
2187 \begin_inset listings
2188 inline false
2189 status open
2191 \begin_layout Plain Layout
2193 .PHONY: newfangle_sources
2194 \end_layout
2196 \begin_layout Plain Layout
2198 newfangle_sources: $(NEWFANGLE_SOURCE_STAMP)
2199 \end_layout
2201 \end_inset
2204 \end_layout
2206 \begin_layout Standard
2207 And also a convenient target to remove extracted sources.
2208 \end_layout
2210 \begin_layout Chunk
2211 Makefile.inc-targets
2212 \end_layout
2214 \begin_layout Standard
2215 \begin_inset listings
2216 inline false
2217 status open
2219 \begin_layout Plain Layout
2221 .PHONY: clean_newfangle_sources
2222 \end_layout
2224 \begin_layout Plain Layout
2226 clean_newfangle_sources: ; 
2227 \backslash
2229 \end_layout
2231 \begin_layout Plain Layout
2233         rm -f -- $(NEWFANGLE_SOURCE_STAMP) $(NEWFANGLE_SOURCES)
2234 \end_layout
2236 \end_inset
2239 \end_layout
2241 \begin_layout Standard
2242 This 
2243 \begin_inset Flex CharStyle:Code
2244 status collapsed
2246 \begin_layout Plain Layout
2247 if_extension
2248 \end_layout
2250 \end_inset
2252  macro takes 4 arguments: the filename (1), some extensions to match (2)
2253  and a some shell command to return if the filename matches the exentions
2254  (3), or not (4).
2255 \end_layout
2257 \begin_layout Chunk
2258 Makefile.inc-vars
2259 \end_layout
2261 \begin_layout Standard
2262 \begin_inset listings
2263 inline false
2264 status open
2266 \begin_layout Plain Layout
2268 if_extension=$(if $(findstring $(suffix $(1)),$(2)),$(3),$(4))
2269 \end_layout
2271 \end_inset
2274 \end_layout
2276 \begin_layout Standard
2277 For some source files like C files, we want to output the line number and
2278  filename of the original LaTeX document from which the source came.
2279 \end_layout
2281 \begin_layout Standard
2282 To make this easier we define the file extensions for which we want to do
2283  this.
2284 \end_layout
2286 \begin_layout Chunk
2287 Makefile.inc-vars
2288 \end_layout
2290 \begin_layout Standard
2291 \begin_inset listings
2292 inline false
2293 status open
2295 \begin_layout Plain Layout
2297 C_EXTENSIONS=.c .h
2298 \end_layout
2300 \end_inset
2303 \end_layout
2305 \begin_layout Standard
2306 We can then use the if_extensions macro to define a macro which expands
2307  out to the 
2308 \begin_inset Flex CharStyle:Code
2309 status collapsed
2311 \begin_layout Plain Layout
2313 \end_layout
2315 \end_inset
2317  option if newfangle is being invoked in a C source file, so that C compile
2318  errors will refer to the line number in the Lyx document.
2320 \end_layout
2322 \begin_layout Chunk
2323 Makefile.inc-vars
2324 \end_layout
2326 \begin_layout Standard
2327 \begin_inset listings
2328 inline false
2329 status open
2331 \begin_layout Plain Layout
2333 TABS=8
2334 \end_layout
2336 \begin_layout Plain Layout
2338 nf_line=-L -T$(TABS)
2339 \end_layout
2341 \begin_layout Plain Layout
2343 newfangle=newfangle 
2344 \backslash
2346 \end_layout
2348 \begin_layout Plain Layout
2350   $(call if_extension,$(2),$(C_EXTENSIONS),$(nf_line)) 
2351 \backslash
2353 \end_layout
2355 \begin_layout Plain Layout
2357     -R"$(2)" $(1)
2358 \end_layout
2360 \end_inset
2363 \end_layout
2365 \begin_layout Standard
2366 We can use a similar trick to define an 
2367 \emph on
2368 indent
2369 \emph default
2370  macro which takes just the filename as an argument and can return a pipeline
2371  stage calling the indent command.
2372  Indent can be turned off with 
2373 \begin_inset Flex CharStyle:Code
2374 status collapsed
2376 \begin_layout Plain Layout
2377 make newfangle_sources indent=
2378 \end_layout
2380 \end_inset
2383 \end_layout
2385 \begin_layout Chunk
2386 Makefile.inc-vars
2387 \end_layout
2389 \begin_layout Standard
2390 \begin_inset listings
2391 inline false
2392 status open
2394 \begin_layout Plain Layout
2396 indent_options=-npro -kr -i8 -ts8 -sob -l80 -ss -ncs
2397 \end_layout
2399 \begin_layout Plain Layout
2401 indent=$(call if_extension,$(1),$(C_EXTENSIONS),
2402 \backslash
2404 \end_layout
2406 \begin_layout Plain Layout
2408               | indent $(indent_options))
2409 \end_layout
2411 \end_inset
2414 \end_layout
2416 \begin_layout Standard
2417 We now define the pattern for extracting a file.
2418  The files are written using noweb's 
2419 \emph on
2420 cpif
2421 \begin_inset Foot
2422 status collapsed
2424 \begin_layout Plain Layout
2426 \emph on
2427 So you still need noweb installed in order to use cpif
2428 \end_layout
2430 \end_inset
2433 \begin_inset Note Note
2434 status collapsed
2436 \begin_layout Plain Layout
2438 \emph on
2439 Write an awk version
2440 \end_layout
2442 \end_inset
2445 \emph default
2446  so that the file timestamp will not be touched if the contents haven't
2447  changed.
2448  This avoids the need to rebuild the entire project because of a typographical
2449  change in the documentation, or if only a few C source files have changed.
2450 \end_layout
2452 \begin_layout Chunk
2453 Makefile.inc-vars
2454 \end_layout
2456 \begin_layout Standard
2457 \begin_inset listings
2458 inline false
2459 status open
2461 \begin_layout Plain Layout
2463 newfangle_extract=@mkdir -p $(dir $(1)) && 
2464 \backslash
2466 \end_layout
2468 \begin_layout Plain Layout
2470   $(call newfangle,$(2),$(1)) > "$(1).tmp" && 
2471 \backslash
2473 \end_layout
2475 \begin_layout Plain Layout
2477   cat "$(1).tmp" $(indent) | cpif "$(1)" 
2478 \backslash
2480 \end_layout
2482 \begin_layout Plain Layout
2484   && rm -- "$(1).tmp" || 
2485 \backslash
2487 \end_layout
2489 \begin_layout Plain Layout
2491   (echo error newfangling $(1) from $(2) ; exit 1)
2492 \end_layout
2494 \end_inset
2497 \end_layout
2499 \begin_layout Standard
2500 We define a target which will extract or update all sources.
2501  To do this we first defined a makefile template that can do this for any
2502  source file in the LaTeX document.
2503 \end_layout
2505 \begin_layout Chunk
2506 Makefile.inc-vars
2507 \end_layout
2509 \begin_layout Standard
2510 \begin_inset listings
2511 inline false
2512 status open
2514 \begin_layout Plain Layout
2516 define NEWFANGLE_template
2517 \end_layout
2519 \begin_layout Plain Layout
2521   $(1): $(2); 
2522 \backslash
2524 \end_layout
2526 \begin_layout Plain Layout
2528     $$(call newfangle_extract,$(1),$(2))
2529 \end_layout
2531 \begin_layout Plain Layout
2533   NEWFANGLE_TARGETS+=$(1)
2534 \end_layout
2536 \begin_layout Plain Layout
2538 endef
2539 \end_layout
2541 \end_inset
2544 \end_layout
2546 \begin_layout Standard
2547 We then enumerate the discovered 
2548 \begin_inset Flex CharStyle:Code
2549 status collapsed
2551 \begin_layout Plain Layout
2552 NEWTANGLE_SOURCES
2553 \end_layout
2555 \end_inset
2557  to generate a makefile rule for each one using the makefile template we
2558  defined above.
2559 \end_layout
2561 \begin_layout Chunk
2562 Makefile.inc-targets
2563 \end_layout
2565 \begin_layout Standard
2566 \begin_inset listings
2567 inline false
2568 status open
2570 \begin_layout Plain Layout
2572 $(foreach source,$(NEWFANGLE_SOURCES),
2573 \backslash
2575 \end_layout
2577 \begin_layout Plain Layout
2579   $(eval $(call NEWFANGLE_template,$(source),$(NEWFANGLE_SOURCE))) 
2580 \backslash
2582 \end_layout
2584 \begin_layout Plain Layout
2587 \end_layout
2589 \end_inset
2592 \end_layout
2594 \begin_layout Standard
2595 These will all be built with NEWFANGLE_SOURCE_STAMP.
2596 \end_layout
2598 \begin_layout Standard
2599 We also remove the generated sources on a 
2600 \emph on
2601 make distclean
2602 \emph default
2604 \end_layout
2606 \begin_layout Chunk
2607 Makefile.inc-targets
2608 \end_layout
2610 \begin_layout Standard
2611 \begin_inset listings
2612 inline false
2613 status open
2615 \begin_layout Plain Layout
2617 _distclean: clean_newfangle_sources
2618 \end_layout
2620 \end_inset
2623 \end_layout
2625 \begin_layout Subsection
2626 Extracting Documentation
2627 \end_layout
2629 \begin_layout Standard
2630 We then identify the intermediate stages of the documentation and their
2631  build and clean targets.
2632 \end_layout
2634 \begin_layout Subsubsection
2635 Running pdflatex
2636 \end_layout
2638 \begin_layout Standard
2639 We produce a pdf file from the tex file.
2640 \end_layout
2642 \begin_layout Chunk
2643 Makefile.inc-vars
2644 \end_layout
2646 \begin_layout Standard
2647 \begin_inset listings
2648 inline false
2649 status open
2651 \begin_layout Plain Layout
2653 NEWFANGLE_PDF=$(TEX_SOURCE:.tex=.pdf)
2654 \end_layout
2656 \end_inset
2659 \end_layout
2661 \begin_layout Standard
2662 We run pdflatex twice to be sure that the contents and aux files are up
2663  to date.
2664  We certainly are required to run pdflatex twice if these files do not exist!
2665 \end_layout
2667 \begin_layout Chunk
2668 Makefile.inc-targets
2669 \end_layout
2671 \begin_layout Standard
2672 \begin_inset listings
2673 inline false
2674 status open
2676 \begin_layout Plain Layout
2678 $(NEWFANGLE_PDF): $(TEX_SOURCE); pdflatex $< && pdflatex $<
2679 \end_layout
2681 \begin_layout Plain Layout
2683 clean_pdf: ; rm -f -- $(NEWFANGLE_PDF) 
2684 \backslash
2686 \end_layout
2688 \begin_layout Plain Layout
2690                       $(TEX_SOURCE:.tex=.toc) 
2691 \backslash
2693 \end_layout
2695 \begin_layout Plain Layout
2697                       $(TEX_SOURCE:.tex=.log) 
2698 \backslash
2700 \end_layout
2702 \begin_layout Plain Layout
2704                       $(TEX_SOURCE:.tex=.aux)
2705 \end_layout
2707 \end_inset
2710 \end_layout
2712 \begin_layout Subsubsection
2713 The docs as a whole
2714 \end_layout
2716 \begin_layout Standard
2717 Currently we only build pdf as a final format, but NEWFANGLE_DOCS may later
2718  hold other output formats.
2719 \end_layout
2721 \begin_layout Chunk
2722 Makefile.inc-vars
2723 \end_layout
2725 \begin_layout Standard
2726 \begin_inset listings
2727 inline false
2728 status open
2730 \begin_layout Plain Layout
2732 NEWFANGLE_DOCS=$(NEWFANGLE_PDF)
2733 \end_layout
2735 \end_inset
2738 \end_layout
2740 \begin_layout Standard
2741 We also define newfangle_docs as a convenient phony target<
2742 \end_layout
2744 \begin_layout Chunk
2745 Makefile.inc-targets
2746 \end_layout
2748 \begin_layout Standard
2749 \begin_inset listings
2750 inline false
2751 status open
2753 \begin_layout Plain Layout
2755 .PHONY: newfangle_docs
2756 \end_layout
2758 \begin_layout Plain Layout
2760 newfangle_docs: $(NEWFANGLE_DOCS)
2761 \end_layout
2763 \begin_layout Plain Layout
2765 docs: newfangle_docs
2766 \end_layout
2768 \end_inset
2771 \end_layout
2773 \begin_layout Standard
2774 And define a convenient clean_noweb_docs which we add to the regular clean
2775  target
2776 \end_layout
2778 \begin_layout Chunk
2779 Makefile.inc-targets
2780 \end_layout
2782 \begin_layout Standard
2783 \begin_inset listings
2784 inline false
2785 status open
2787 \begin_layout Plain Layout
2789 .PHONEY: clean_newfangle_docs
2790 \end_layout
2792 \begin_layout Plain Layout
2794 clean_newfangle_docs: clean_tex clean_pdf
2795 \end_layout
2797 \begin_layout Plain Layout
2799 clean: clean_newfangle_docs
2800 \end_layout
2802 \begin_layout Plain Layout
2804 \end_layout
2806 \begin_layout Plain Layout
2808 distclean_newfangle_docs: clean_tex clean_newfangle_docs
2809 \end_layout
2811 \begin_layout Plain Layout
2813 distclean: clean distclean_newfangle_docs
2814 \end_layout
2816 \end_inset
2819 \end_layout
2821 \begin_layout Subsection
2822 Other helpers
2823 \end_layout
2825 \begin_layout Standard
2826 If Makefile.inc is included into Makefile, then extracted files can be updated
2827  with this command:
2828 \end_layout
2830 \begin_layout LyX-Code
2831 make newfangle_sources
2832 \end_layout
2834 \begin_layout Standard
2835 otherwise, with:
2836 \end_layout
2838 \begin_layout LyX-Code
2839 make -f Makefile.inc newfangle_sources
2840 \end_layout
2842 \begin_layout Part
2843 Source Code
2844 \end_layout
2846 \begin_layout Chapter
2847 Newfangle awk source code
2848 \end_layout
2850 \begin_layout Standard
2851 We use the copyright notice from chapter 
2852 \begin_inset CommandInset ref
2853 LatexCommand ref
2854 reference "cha:License"
2856 \end_inset
2859 \end_layout
2861 \begin_layout Chunk
2862 ./newfangle,language=awk,morestring=[b]{/},morekeywords=else
2863 \end_layout
2865 \begin_layout Standard
2866 \begin_inset listings
2867 inline false
2868 status open
2870 \begin_layout Plain Layout
2872 #! /usr/bin/awk -f
2873 \end_layout
2875 \begin_layout Plain Layout
2878 \backslash
2879 chunkref{gpl3-copyright}>
2880 \end_layout
2882 \end_inset
2885 \end_layout
2887 \begin_layout Standard
2888 We also use code from Arnold Robbins public domain getopt (1993 revision)
2889  defined in chapter 
2890 \begin_inset CommandInset ref
2891 LatexCommand ref
2892 reference "cha:getopt"
2894 \end_inset
2896 , and naturally want to attribute this appropriately.
2897 \end_layout
2899 \begin_layout Standard
2900 \begin_inset listings
2901 inline false
2902 status open
2904 \begin_layout Plain Layout
2906 \end_layout
2908 \begin_layout Plain Layout
2910 # NOTE: Arnold Robbins public domain getopt for awk is also used:
2911 \end_layout
2913 \begin_layout Plain Layout
2916 \backslash
2917 chunkref{getopt.awk-header}>
2918 \end_layout
2920 \begin_layout Plain Layout
2922 \end_layout
2924 \begin_layout Plain Layout
2927 \backslash
2928 chunkref{getopt.awk-getopt()}>
2929 \end_layout
2931 \begin_layout Plain Layout
2933 \end_layout
2935 \end_inset
2938 \end_layout
2940 \begin_layout Standard
2941 And include the following chunks
2942 \end_layout
2944 \begin_layout Chunk
2945 ./newfangle
2946 \end_layout
2948 \begin_layout Standard
2949 \begin_inset listings
2950 inline false
2951 status open
2953 \begin_layout Plain Layout
2956 \backslash
2957 chunkref{helper-functions}>
2958 \end_layout
2960 \begin_layout Plain Layout
2963 \backslash
2964 chunkref{mode-tracker}>
2965 \end_layout
2967 \begin_layout Plain Layout
2970 \backslash
2971 chunkref{chunk-storage-functions}>
2972 \end_layout
2974 \begin_layout Plain Layout
2977 \backslash
2978 chunkref{output_chunk_names()}>
2979 \end_layout
2981 \begin_layout Plain Layout
2984 \backslash
2985 chunkref{output_chunks()}>
2986 \end_layout
2988 \begin_layout Plain Layout
2991 \backslash
2992 chunkref{write_chunk()}>
2993 \end_layout
2995 \begin_layout Plain Layout
2998 \backslash
2999 chunkref{expand_chunk_args()}>
3000 \end_layout
3002 \begin_layout Plain Layout
3005 \backslash
3006 chunkref{begin}>
3007 \end_layout
3009 \begin_layout Plain Layout
3012 \backslash
3013 chunkref{recognize-chunk}>
3014 \end_layout
3016 \begin_layout Plain Layout
3019 \backslash
3020 chunkref{end}>
3021 \end_layout
3023 \end_inset
3026 \end_layout
3028 \begin_layout Section
3029 AWK tricks
3030 \end_layout
3032 \begin_layout Standard
3033 The portable way to erase an array in awk is to split the empty string,
3034  like this:
3035 \end_layout
3037 \begin_layout Chunk
3038 awk-delete-array,params=ARRAY
3039 \end_layout
3041 \begin_layout Standard
3042 \begin_inset listings
3043 inline false
3044 status open
3046 \begin_layout Plain Layout
3048 split("", ${ARRAY});
3049 \end_layout
3051 \end_inset
3054 \end_layout
3056 \begin_layout Chunk
3057 ,params=
3058 \end_layout
3060 \begin_layout Section
3061 Catching errors
3062 \end_layout
3064 \begin_layout Standard
3065 Fatal errors are issued with the error function:
3066 \end_layout
3068 \begin_layout Chunk
3069 error()
3070 \end_layout
3072 \begin_layout Standard
3073 \begin_inset listings
3074 inline false
3075 status open
3077 \begin_layout Plain Layout
3079 function error(message)
3080 \end_layout
3082 \begin_layout Plain Layout
3085 \end_layout
3087 \begin_layout Plain Layout
3089   print message > "/dev/stderr";
3090 \end_layout
3092 \begin_layout Plain Layout
3094   exit 1;
3095 \end_layout
3097 \begin_layout Plain Layout
3100 \end_layout
3102 \end_inset
3105 \end_layout
3107 \begin_layout Standard
3108 This is one of the helper functions.
3109 \end_layout
3111 \begin_layout Chunk
3112 helper-functions
3113 \end_layout
3115 \begin_layout Standard
3116 \begin_inset listings
3117 inline false
3118 status open
3120 \begin_layout Plain Layout
3123 \backslash
3124 chunkref{error()}>
3125 \end_layout
3127 \end_inset
3130 \end_layout
3132 \begin_layout Chapter
3133 lstlistings
3134 \end_layout
3136 \begin_layout Standard
3137 LaTeX arguments to lstlistings macros are a comma seperated list of key-value
3138  pairs.
3139  Values containing commas are enclosed in { braces }.
3140 \end_layout
3142 \begin_layout Standard
3143 We need a function that can parse such an expression and assign the values
3144  to an 
3145 \noun on
3147 \noun default
3148  associated array.
3149 \end_layout
3151 \begin_layout Standard
3152 A sample expressions is:
3153 \end_layout
3155 \begin_layout LyX-Code
3156 name=thomas, params={a, b}, something, something-else
3157 \end_layout
3159 \begin_layout Standard
3160 but we see that this is just a simpler form of this expression:
3161 \end_layout
3163 \begin_layout LyX-Code
3164 name=freddie, foo={bar=baz, quux={quirk, a=fleeg}}, etc
3165 \end_layout
3167 \begin_layout Standard
3168 And that it would be a good idea to use a recursive parser into a multi-dimensio
3169 nal hash
3170 \begin_inset Foot
3171 status collapsed
3173 \begin_layout Plain Layout
3174 as AWK doesn't have nested-hash support
3175 \end_layout
3177 \end_inset
3179 , resulting in:
3180 \end_layout
3182 \begin_layout Standard
3183 \begin_inset Tabular
3184 <lyxtabular version="3" rows="6" columns="2">
3185 <features>
3186 <column alignment="left" valignment="top" width="0">
3187 <column alignment="left" valignment="top" width="0">
3188 <row>
3189 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
3190 \begin_inset Text
3192 \begin_layout Plain Layout
3194 \end_layout
3196 \end_inset
3197 </cell>
3198 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
3199 \begin_inset Text
3201 \begin_layout Plain Layout
3202 value
3203 \end_layout
3205 \end_inset
3206 </cell>
3207 </row>
3208 <row>
3209 <cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
3210 \begin_inset Text
3212 \begin_layout Plain Layout
3213 a[name]
3214 \end_layout
3216 \end_inset
3217 </cell>
3218 <cell alignment="left" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3219 \begin_inset Text
3221 \begin_layout Plain Layout
3222 freddie
3223 \end_layout
3225 \end_inset
3226 </cell>
3227 </row>
3228 <row>
3229 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3230 \begin_inset Text
3232 \begin_layout Plain Layout
3233 a[foo, bar]
3234 \end_layout
3236 \end_inset
3237 </cell>
3238 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3239 \begin_inset Text
3241 \begin_layout Plain Layout
3243 \end_layout
3245 \end_inset
3246 </cell>
3247 </row>
3248 <row>
3249 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3250 \begin_inset Text
3252 \begin_layout Plain Layout
3253 a[foo, quux, quirk]
3254 \end_layout
3256 \end_inset
3257 </cell>
3258 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3259 \begin_inset Text
3261 \begin_layout Plain Layout
3263 \end_layout
3265 \end_inset
3266 </cell>
3267 </row>
3268 <row>
3269 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3270 \begin_inset Text
3272 \begin_layout Plain Layout
3273 a[foo, quux, a]
3274 \end_layout
3276 \end_inset
3277 </cell>
3278 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3279 \begin_inset Text
3281 \begin_layout Plain Layout
3282 fleeg
3283 \end_layout
3285 \end_inset
3286 </cell>
3287 </row>
3288 <row>
3289 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
3290 \begin_inset Text
3292 \begin_layout Plain Layout
3293 a[etc]
3294 \end_layout
3296 \end_inset
3297 </cell>
3298 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
3299 \begin_inset Text
3301 \begin_layout Plain Layout
3303 \end_layout
3305 \end_inset
3306 </cell>
3307 </row>
3308 </lyxtabular>
3310 \end_inset
3313 \end_layout
3315 \begin_layout Standard
3316 On reflection it seems that sometimes such nesting is not desirable, as
3317  the braces are also used to delimit values that contain commas --- we may
3318  consider that
3319 \end_layout
3321 \begin_layout LyX-Code
3322 name={williamson, freddie}
3323 \end_layout
3325 \begin_layout Standard
3326 should assign 
3327 \begin_inset Flex CharStyle:Code
3328 status collapsed
3330 \begin_layout Plain Layout
3331 williamson, freddie
3332 \end_layout
3334 \end_inset
3336  to 
3337 \begin_inset Flex CharStyle:Code
3338 status collapsed
3340 \begin_layout Plain Layout
3341 name
3342 \end_layout
3344 \end_inset
3346  --- so I may change this behaviour.
3347 \begin_inset Note Note
3348 status collapsed
3350 \begin_layout Plain Layout
3351 So change it
3352 \end_layout
3354 \end_inset
3357 \end_layout
3359 \begin_layout Standard
3360 Function 
3361 \begin_inset Flex Chunkref
3362 status collapsed
3364 \begin_layout Plain Layout
3365 get_chunk_args()
3366 \end_layout
3368 \end_inset
3370  will accept two paramters, 
3371 \begin_inset Flex CharStyle:Code
3372 status collapsed
3374 \begin_layout Plain Layout
3375 text
3376 \end_layout
3378 \end_inset
3380  being the text to parse, and 
3381 \begin_inset Flex CharStyle:Code
3382 status collapsed
3384 \begin_layout Plain Layout
3385 values
3386 \end_layout
3388 \end_inset
3390  being an array to receive the parsed values as described above.
3391  The optional parameter 
3392 \begin_inset Flex CharStyle:Code
3393 status collapsed
3395 \begin_layout Plain Layout
3396 path
3397 \end_layout
3399 \end_inset
3401  is used during recursion to build up the multi-dimensional array path.
3402 \end_layout
3404 \begin_layout Chunk
3405 ./newfangle
3406 \end_layout
3408 \begin_layout Standard
3409 \begin_inset listings
3410 inline false
3411 status open
3413 \begin_layout Plain Layout
3416 \backslash
3417 chunkref{get_chunk_args()}>
3418 \end_layout
3420 \end_inset
3423 \end_layout
3425 \begin_layout Chunk
3426 get_chunk_args()
3427 \end_layout
3429 \begin_layout Standard
3430 \begin_inset listings
3431 inline false
3432 status open
3434 \begin_layout Plain Layout
3436 function get_chunk_args(text, values,
3437 \end_layout
3439 \begin_layout Plain Layout
3441   # optional parameters
3442 \end_layout
3444 \begin_layout Plain Layout
3446   path, # hierarchical precursors
3447 \end_layout
3449 \begin_layout Plain Layout
3451   # local vars
3452 \end_layout
3454 \begin_layout Plain Layout
3456   a, name)
3457 \end_layout
3459 \end_inset
3462 \end_layout
3464 \begin_layout Standard
3465 The strategy is to parse the name, and then look for a value.
3466  If the value begins with a brace 
3467 \begin_inset Flex CharStyle:Code
3468 status collapsed
3470 \begin_layout Plain Layout
3472 \end_layout
3474 \end_inset
3476 , then we recurse and consume as much of the text as necessary, returning
3477  the remaining text when we encounter a leading close-brace 
3478 \begin_inset Flex CharStyle:Code
3479 status collapsed
3481 \begin_layout Plain Layout
3483 \end_layout
3485 \end_inset
3488  This being the strategy --- and executed in a loop --- we realise that
3489  we must first look for the closing brace (perhaps preceded by white space)
3490  in order to terminate the recursion, and returning remaining text.
3491 \end_layout
3493 \begin_layout Standard
3494 \begin_inset listings
3495 inline false
3496 status open
3498 \begin_layout Plain Layout
3501 \end_layout
3503 \begin_layout Plain Layout
3505   while(length(text)) {
3506 \end_layout
3508 \begin_layout Plain Layout
3510     if (match(text, "^ *}(.*)", a)) {
3511 \end_layout
3513 \begin_layout Plain Layout
3515       return a[1];
3516 \end_layout
3518 \begin_layout Plain Layout
3520     }
3521 \end_layout
3523 \begin_layout Plain Layout
3525     =<
3526 \backslash
3527 chunkref{parse-chunk-args}>
3528 \end_layout
3530 \begin_layout Plain Layout
3532   }
3533 \end_layout
3535 \begin_layout Plain Layout
3537   return text;
3538 \end_layout
3540 \begin_layout Plain Layout
3543 \end_layout
3545 \end_inset
3548 \end_layout
3550 \begin_layout Standard
3551 \begin_inset Note Note
3552 status collapsed
3554 \begin_layout Plain Layout
3555 Use BNF package here
3556 \end_layout
3558 \end_inset
3560 We can see that the text could be inspected with this regex:
3561 \end_layout
3563 \begin_layout Chunk
3564 parse-chunk-args
3565 \end_layout
3567 \begin_layout Standard
3568 \begin_inset listings
3569 inline false
3570 status open
3572 \begin_layout Plain Layout
3574 if (! match(text, " *([^,=]*[^,= ]) *(([,=]) *(([^,}]*) *,* *(.*))|)$", a))
3576 \end_layout
3578 \begin_layout Plain Layout
3580   return text;
3581 \end_layout
3583 \begin_layout Plain Layout
3586 \end_layout
3588 \end_inset
3591 \end_layout
3593 \begin_layout Standard
3594 and that 
3595 \begin_inset Flex CharStyle:Code
3596 status collapsed
3598 \begin_layout Plain Layout
3600 \end_layout
3602 \end_inset
3604  will have the following values:
3605 \end_layout
3607 \begin_layout Standard
3608 \begin_inset Tabular
3609 <lyxtabular version="3" rows="7" columns="2">
3610 <features>
3611 <column alignment="center" valignment="top" width="0">
3612 <column alignment="left" valignment="top" width="0">
3613 <row>
3614 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
3615 \begin_inset Text
3617 \begin_layout Plain Layout
3618 a[n]
3619 \end_layout
3621 \end_inset
3622 </cell>
3623 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
3624 \begin_inset Text
3626 \begin_layout Plain Layout
3627 assigned text
3628 \end_layout
3630 \end_inset
3631 </cell>
3632 </row>
3633 <row>
3634 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3635 \begin_inset Text
3637 \begin_layout Plain Layout
3639 \end_layout
3641 \end_inset
3642 </cell>
3643 <cell alignment="left" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3644 \begin_inset Text
3646 \begin_layout Plain Layout
3647 freddie
3648 \end_layout
3650 \end_inset
3651 </cell>
3652 </row>
3653 <row>
3654 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3655 \begin_inset Text
3657 \begin_layout Plain Layout
3659 \end_layout
3661 \end_inset
3662 </cell>
3663 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3664 \begin_inset Text
3666 \begin_layout Plain Layout
3667 =freddie, foo={bar=baz, quux={quirk, a=fleeg}}, etc
3668 \end_layout
3670 \end_inset
3671 </cell>
3672 </row>
3673 <row>
3674 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3675 \begin_inset Text
3677 \begin_layout Plain Layout
3679 \end_layout
3681 \end_inset
3682 </cell>
3683 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3684 \begin_inset Text
3686 \begin_layout Plain Layout
3688 \end_layout
3690 \end_inset
3691 </cell>
3692 </row>
3693 <row>
3694 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3695 \begin_inset Text
3697 \begin_layout Plain Layout
3699 \end_layout
3701 \end_inset
3702 </cell>
3703 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3704 \begin_inset Text
3706 \begin_layout Plain Layout
3707 freddie, foo={bar=baz, quux={quirk, a=fleeg}}, etc
3708 \end_layout
3710 \end_inset
3711 </cell>
3712 </row>
3713 <row>
3714 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3715 \begin_inset Text
3717 \begin_layout Plain Layout
3719 \end_layout
3721 \end_inset
3722 </cell>
3723 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3724 \begin_inset Text
3726 \begin_layout Plain Layout
3727 freddie
3728 \end_layout
3730 \end_inset
3731 </cell>
3732 </row>
3733 <row>
3734 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
3735 \begin_inset Text
3737 \begin_layout Plain Layout
3739 \end_layout
3741 \end_inset
3742 </cell>
3743 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
3744 \begin_inset Text
3746 \begin_layout Plain Layout
3747 , foo={bar=baz, quux={quirk, a=fleeg}}, etc
3748 \end_layout
3750 \end_inset
3751 </cell>
3752 </row>
3753 </lyxtabular>
3755 \end_inset
3758 \end_layout
3760 \begin_layout Standard
3761 a[3] will be either 
3762 \begin_inset Flex CharStyle:Code
3763 status collapsed
3765 \begin_layout Plain Layout
3767 \end_layout
3769 \end_inset
3771  or 
3772 \begin_inset Flex CharStyle:Code
3773 status collapsed
3775 \begin_layout Plain Layout
3777 \end_layout
3779 \end_inset
3781  and signify whether the option named in 
3782 \begin_inset Flex CharStyle:Code
3783 status collapsed
3785 \begin_layout Plain Layout
3786 a[1]
3787 \end_layout
3789 \end_inset
3791  has a value or not (respectively).
3792 \end_layout
3794 \begin_layout Standard
3795 If the option does have a value, then if the expression 
3796 \begin_inset Flex CharStyle:Code
3797 status collapsed
3799 \begin_layout Plain Layout
3800 substr(a[4],1,1)
3801 \end_layout
3803 \end_inset
3805  returns a brace 
3806 \begin_inset Flex CharStyle:Code
3807 status collapsed
3809 \begin_layout Plain Layout
3811 \end_layout
3813 \end_inset
3815  it will signify that we need to recurse:
3816 \end_layout
3818 \begin_layout Standard
3819 \begin_inset listings
3820 inline false
3821 status open
3823 \begin_layout Plain Layout
3825 name=a[1];
3826 \end_layout
3828 \begin_layout Plain Layout
3830 if (a[3] == "=") {
3831 \end_layout
3833 \begin_layout Plain Layout
3835   if (substr(a[4],1,1) == "{") {
3836 \end_layout
3838 \begin_layout Plain Layout
3840     text = get_chunk_args(substr(a[4],2), values, path name SUBSEP);
3841 \end_layout
3843 \begin_layout Plain Layout
3845   } else {
3846 \end_layout
3848 \begin_layout Plain Layout
3850     values[path name]=a[5];
3851 \end_layout
3853 \begin_layout Plain Layout
3855     text = a[6];
3856 \end_layout
3858 \begin_layout Plain Layout
3860   }
3861 \end_layout
3863 \begin_layout Plain Layout
3865 } else {
3866 \end_layout
3868 \begin_layout Plain Layout
3870   values[path name]="";
3871 \end_layout
3873 \begin_layout Plain Layout
3875   text = a[2];
3876 \end_layout
3878 \begin_layout Plain Layout
3881 \end_layout
3883 \end_inset
3886 \end_layout
3888 \begin_layout Standard
3889 We can test this function like this:
3890 \end_layout
3892 \begin_layout Chunk
3893 gca-test.awk
3894 \end_layout
3896 \begin_layout Standard
3897 \begin_inset listings
3898 inline false
3899 status open
3901 \begin_layout Plain Layout
3904 \backslash
3905 chunkref{get_chunk_args()}>
3906 \end_layout
3908 \begin_layout Plain Layout
3910 BEGIN {
3911 \end_layout
3913 \begin_layout Plain Layout
3915   SUBSEP=".";
3916 \end_layout
3918 \begin_layout Plain Layout
3920 \end_layout
3922 \begin_layout Plain Layout
3924   print get_chunk_args("name=freddie, foo={bar=baz, quux={quirk, a=fleeg}},
3925  etc", a);
3926 \end_layout
3928 \begin_layout Plain Layout
3930   for (b in a) {
3931 \end_layout
3933 \begin_layout Plain Layout
3935     print "a[" b "] => " a[b];
3936 \end_layout
3938 \begin_layout Plain Layout
3940   }
3941 \end_layout
3943 \begin_layout Plain Layout
3946 \end_layout
3948 \end_inset
3951 \end_layout
3953 \begin_layout Standard
3954 which should give this output:
3955 \end_layout
3957 \begin_layout Chunk
3958 gca-test.awk-results
3959 \end_layout
3961 \begin_layout Standard
3962 \begin_inset listings
3963 inline false
3964 status open
3966 \begin_layout Plain Layout
3968 a[foo.quux.quirk] => 
3969 \end_layout
3971 \begin_layout Plain Layout
3973 a[foo.quux.a] => fleeg
3974 \end_layout
3976 \begin_layout Plain Layout
3978 a[foo.bar] => baz
3979 \end_layout
3981 \begin_layout Plain Layout
3983 a[etc] => 
3984 \end_layout
3986 \begin_layout Plain Layout
3988 a[name] => freddie
3989 \end_layout
3991 \end_inset
3994 \end_layout
3996 \begin_layout Chapter
3997 Expanding chunk arguments
3998 \end_layout
4000 \begin_layout Standard
4001 \begin_inset CommandInset label
4002 LatexCommand label
4003 name "cha:Chunk Arguments"
4005 \end_inset
4008 \begin_inset Note Note
4009 status open
4011 \begin_layout Plain Layout
4012 Explain this in the documentation section too
4013 \end_layout
4015 \end_inset
4017 As an extension to many literate-programming styles, newfangle permits code
4018  chunks to take parameters and thus operate somewhat like C pre-processor
4019  macros, or like C++ templates.
4020 \end_layout
4022 \begin_layout Standard
4023 Chunk parameters are declared with a chunk argument called 
4024 \begin_inset Flex CharStyle:Code
4025 status collapsed
4027 \begin_layout Plain Layout
4028 params
4029 \end_layout
4031 \end_inset
4033 , which holds a semi-colon separated list of parameters, like this:
4034 \end_layout
4036 \begin_layout LyX-Code
4037 achunk,language=C,params=name;address
4038 \end_layout
4040 \begin_layout Standard
4041 When such a chunk is included the arguments are expressed thus, in square
4042  brackets as optional arguments separated by a comma
4043 \begin_inset Note Note
4044 status open
4046 \begin_layout Plain Layout
4047 We ought to support qouting in {} like ({Jones, John}, Jones@example.com)
4048 \end_layout
4050 \end_inset
4053 \end_layout
4055 \begin_layout LyX-Code
4057 \backslash
4058 chunkref{achunk}(John Jones, jones@example.com)
4059 \end_layout
4061 \begin_layout Standard
4062 Within the body a chunk, parameters are expressed as: 
4063 \begin_inset Flex CharStyle:Code
4064 status collapsed
4066 \begin_layout Plain Layout
4067 ${name}
4068 \end_layout
4070 \end_inset
4072  and 
4073 \begin_inset Flex CharStyle:Code
4074 status collapsed
4076 \begin_layout Plain Layout
4077 ${address}
4078 \end_layout
4080 \end_inset
4083  There is a strong case that a LaTeX style notation should be used, like
4085 \backslash
4086 param{name} --- =<
4087 \backslash
4088 param{name}> as it would appear in the lstlisting.
4089  Such notation would make me go blind, but I do intend to adopt it.
4090 \end_layout
4092 \begin_layout Standard
4093 We therefore need a function 
4094 \begin_inset Flex CharStyle:Code
4095 status collapsed
4097 \begin_layout Plain Layout
4098 expand_chunk_args
4099 \end_layout
4101 \end_inset
4103  which will take a block of text, a list of permitted parameters and the
4104  arguments which must substitute for the parameters.
4105  We also need to be able to parse a parameter list into an array of parameters.
4106 \end_layout
4108 \begin_layout Section
4109 Parsing argument lists
4110 \end_layout
4112 \begin_layout Standard
4113 An argument list may be as simple as in 
4114 \begin_inset Flex CharStyle:Code
4115 status collapsed
4117 \begin_layout Plain Layout
4119 \backslash
4120 chunkref{pull}(thing, otherthing)
4121 \end_layout
4123 \end_inset
4125  or as complex as:
4126 \end_layout
4128 \begin_layout LyX-Code
4130 \backslash
4131 chunkref{pull}(things[x, y], get_other_things(a, "all")) 
4132 \end_layout
4134 \begin_layout Standard
4135 --- which for all it's commas and quotes and parenthesis represents only
4136  two parameters.
4137 \end_layout
4139 \begin_layout Standard
4140 How do we stop the comma in 
4141 \begin_inset Flex CharStyle:Code
4142 status collapsed
4144 \begin_layout Plain Layout
4145 things[x,y]
4146 \end_layout
4148 \end_inset
4150  from splitting it into two arguments 
4151 \begin_inset Flex CharStyle:Code
4152 status collapsed
4154 \begin_layout Plain Layout
4155 things[x
4156 \end_layout
4158 \end_inset
4160  and 
4161 \begin_inset Flex CharStyle:Code
4162 status collapsed
4164 \begin_layout Plain Layout
4166 \end_layout
4168 \end_inset
4170 --- neither of which make sense on their own? 
4171 \end_layout
4173 \begin_layout Standard
4174 One way it could be done is by refusing to split text between maching delimiters
4175 , such as 
4176 \begin_inset Flex CharStyle:Code
4177 status collapsed
4179 \begin_layout Plain Layout
4181 \end_layout
4183 \end_inset
4186 \begin_inset Flex CharStyle:Code
4187 status collapsed
4189 \begin_layout Plain Layout
4191 \end_layout
4193 \end_inset
4196 \begin_inset Flex CharStyle:Code
4197 status collapsed
4199 \begin_layout Plain Layout
4201 \end_layout
4203 \end_inset
4206 \begin_inset Flex CharStyle:Code
4207 status collapsed
4209 \begin_layout Plain Layout
4211 \end_layout
4213 \end_inset
4216 \begin_inset Flex CharStyle:Code
4217 status collapsed
4219 \begin_layout Plain Layout
4221 \end_layout
4223 \end_inset
4226 \begin_inset Flex CharStyle:Code
4227 status collapsed
4229 \begin_layout Plain Layout
4231 \end_layout
4233 \end_inset
4235 and most likely also 
4236 \begin_inset Flex CharStyle:Code
4237 status collapsed
4239 \begin_layout Plain Layout
4241 \end_layout
4243 \end_inset
4246 \begin_inset Flex CharStyle:Code
4247 status collapsed
4249 \begin_layout Plain Layout
4251 \end_layout
4253 \end_inset
4255  and 
4256 \begin_inset Flex CharStyle:Code
4257 status collapsed
4259 \begin_layout Plain Layout
4261 \end_layout
4263 \end_inset
4266 \begin_inset Flex CharStyle:Code
4267 status collapsed
4269 \begin_layout Plain Layout
4271 \end_layout
4273 \end_inset
4276  Of course this also makes it impossible to pass such mis-matched code fragments
4277  as parameters, but I don't think users could cope with people passing such
4278  code unbalanced fragments as chunk parameters
4279 \begin_inset Foot
4280 status collapsed
4282 \begin_layout Plain Layout
4283 I know that I couldn't cope with users doing such things, and although the
4284  GPL3 license prevents me from actually forbidding anyone from trying, if
4285  they wan't it to work they'll have to write the code themselves and not
4286  expect any support from me.
4287 \end_layout
4289 \end_inset
4292 \end_layout
4294 \begin_layout Standard
4295 Unfortunately, the full set of matching delimiters may vary from language
4296  to language.
4297  In certain C++ template contexts, 
4298 \begin_inset Flex CharStyle:Code
4299 status collapsed
4301 \begin_layout Plain Layout
4303 \end_layout
4305 \end_inset
4307  and 
4308 \begin_inset Flex CharStyle:Code
4309 status collapsed
4311 \begin_layout Plain Layout
4313 \end_layout
4315 \end_inset
4317  would count as delimiters, and yet in other contexts they would not.
4318 \end_layout
4320 \begin_layout Standard
4321 This puts me in the unfortunate position of having to parse-somewhat all
4322  programming languages without knowing what they are! Eventually this will
4323  be managed in the chunk modes in chapter 
4324 \begin_inset CommandInset ref
4325 LatexCommand ref
4326 reference "cha:modes"
4328 \end_inset
4331 \end_layout
4333 \begin_layout Standard
4334 Another way, inspired by LaTeX, is if the first character of the parameter
4335  is an opening-delimiter, to read up to the matching closing-delimiter wthout
4336  considering intervening commas; thus the above example could be expressed:
4337 \end_layout
4339 \begin_layout LyX-Code
4341 \backslash
4342 chunkref{pull}({things[x, y]}, [get_other_things(a, "all")])
4343 \end_layout
4345 \begin_layout Standard
4346 --- using 
4347 \begin_inset Flex CharStyle:Code
4348 status collapsed
4350 \begin_layout Plain Layout
4352 \end_layout
4354 \end_inset
4357 \begin_inset Flex CharStyle:Code
4358 status collapsed
4360 \begin_layout Plain Layout
4362 \end_layout
4364 \end_inset
4366  to wrap the first agument, and 
4367 \begin_inset Flex CharStyle:Code
4368 status collapsed
4370 \begin_layout Plain Layout
4372 \end_layout
4374 \end_inset
4377 \begin_inset Flex CharStyle:Code
4378 status collapsed
4380 \begin_layout Plain Layout
4382 \end_layout
4384 \end_inset
4386 to wrap the second argument and protect the comma.
4387 \end_layout
4389 \begin_layout Standard
4390 In the meantime, I'll work with the first method, and a fixed list of delimiters.
4391 \end_layout
4393 \begin_layout Standard
4394 -------
4395 \end_layout
4397 \begin_layout Chunk
4398 parse_chunk_args
4399 \end_layout
4401 \begin_layout Standard
4402 \begin_inset listings
4403 inline false
4404 status open
4406 \begin_layout Plain Layout
4408 function parse_chunk_args(text, values,
4409 \end_layout
4411 \begin_layout Plain Layout
4413   # optional parameters
4414 \end_layout
4416 \begin_layout Plain Layout
4418   path, # hierarchical precursors
4419 \end_layout
4421 \begin_layout Plain Layout
4423   stack, # delimiters to be matched
4424 \end_layout
4426 \begin_layout Plain Layout
4428   delimiters,
4429 \end_layout
4431 \begin_layout Plain Layout
4433   # local vars
4434 \end_layout
4436 \begin_layout Plain Layout
4438   a, name)
4439 \end_layout
4441 \begin_layout Plain Layout
4444 \end_layout
4446 \begin_layout Plain Layout
4448   split(chunklet_parts[2], call_chunk_args, " *, *");
4449 \end_layout
4451 \begin_layout Plain Layout
4454 \end_layout
4456 \end_inset
4459 \end_layout
4461 \begin_layout Standard
4462 The strategy is to parse the name, and then look for a value.
4463  If the value begins with a brace 
4464 \begin_inset Flex CharStyle:Code
4465 status collapsed
4467 \begin_layout Plain Layout
4469 \end_layout
4471 \end_inset
4473 , then we recurse and consume as much of the text as necessary, returning
4474  the remaining text when we encounter a leading close-brace 
4475 \begin_inset Flex CharStyle:Code
4476 status collapsed
4478 \begin_layout Plain Layout
4480 \end_layout
4482 \end_inset
4485  This being the strategy --- and executed in a loop --- we realise that
4486  we must first look for the closing brace (perhaps preceded by white space)
4487  in order to terminate the recursion, and returning remaining text.
4488 \end_layout
4490 \begin_layout Standard
4491 \begin_inset listings
4492 inline false
4493 status open
4495 \begin_layout Plain Layout
4498 \end_layout
4500 \begin_layout Plain Layout
4502   modes["
4503 \backslash
4504 "", "delimiters" ]="
4505 \backslash
4506 "" "|
4507 \backslash
4509 \end_layout
4511 \begin_layout Plain Layout
4513   modes["
4514 \backslash
4515 "", "terminators"]="
4516 \backslash
4518 \end_layout
4520 \begin_layout Plain Layout
4522   modes["{",  "delimiters" ]="
4523 \backslash
4525 \backslash
4527 \backslash
4528 "|{|}|(|)|
4529 \backslash
4531 \backslash
4533 \backslash
4535 \backslash
4536 ]|'|/*" "|}";
4537 \end_layout
4539 \begin_layout Plain Layout
4541   modes["{",  "terminators"]="}";
4542 \end_layout
4544 \begin_layout Plain Layout
4546   modes["[",  "delimiters" ]="
4547 \backslash
4549 \backslash
4551 \backslash
4552 "|{|}|(|)|
4553 \backslash
4555 \backslash
4557 \backslash
4559 \backslash
4560 ]|'|/*" "|
4561 \backslash
4563 \backslash
4565 \end_layout
4567 \begin_layout Plain Layout
4569   modes["[",  "terminators"]="]";
4570 \end_layout
4572 \begin_layout Plain Layout
4574   modes["(",  "delimiters" ]="
4575 \backslash
4577 \backslash
4579 \backslash
4580 "|{|}|(|)|
4581 \backslash
4583 \backslash
4585 \backslash
4587 \backslash
4588 ]|'|/*" "|)";
4589 \end_layout
4591 \begin_layout Plain Layout
4593   modes["(",  "terminators"]=")";
4594 \end_layout
4596 \begin_layout Plain Layout
4598   modes["'",  "delimiters" ]="
4599 \backslash
4601 \backslash
4603 \end_layout
4605 \begin_layout Plain Layout
4607   modes["'",  "terminators"]="'";
4608 \end_layout
4610 \begin_layout Plain Layout
4612   modes["/*", "terminators"]="*/";
4613 \end_layout
4615 \begin_layout Plain Layout
4617   modes["//", "terminators"]="
4618 \backslash
4620 \end_layout
4622 \begin_layout Plain Layout
4624   modes["",   "delimiters" ]="
4625 \backslash
4627 \backslash
4629 \backslash
4630 "|{|}|(|)|
4631 \backslash
4633 \backslash
4635 \backslash
4637 \backslash
4638 ]|'|/*";
4639 \end_layout
4641 \begin_layout Plain Layout
4643   mode="";
4644 \end_layout
4646 \begin_layout Plain Layout
4648 \end_layout
4650 \begin_layout Plain Layout
4652   delimiters=modes[mode, "delimiters"];
4653 \end_layout
4655 \begin_layout Plain Layout
4657 \end_layout
4659 \begin_layout Plain Layout
4661   while(length(text)) {
4662 \end_layout
4664 \begin_layout Plain Layout
4666     if match(text, "(" delimiters ")", a) {
4667 \end_layout
4669 \begin_layout Plain Layout
4671       if (a[1] == modes[mode, "terminator"]) return result a[1];
4672 \end_layout
4674 \begin_layout Plain Layout
4676       new_mode=a[1];
4677 \end_layout
4679 \begin_layout Plain Layout
4681       #check if new_mode is defined
4682 \end_layout
4684 \begin_layout Plain Layout
4686       if (! (new_mode, "terminators") in modes) {
4687 \end_layout
4689 \begin_layout Plain Layout
4691         error("Delimiter %s set unknown mode in text: %s", new_mode, text);
4692 \end_layout
4694 \begin_layout Plain Layout
4696       }
4697 \end_layout
4699 \begin_layout Plain Layout
4701       text = substr(text, RSTART));
4702 \end_layout
4704 \begin_layout Plain Layout
4706       result = result substr(text, 1, RSTART -1) RECURSE(text,,new_mode);
4707 \end_layout
4709 \begin_layout Plain Layout
4711     }
4712 \end_layout
4714 \begin_layout Plain Layout
4716     result = result text;
4717 \end_layout
4719 \begin_layout Plain Layout
4721     text = "";
4722 \end_layout
4724 \begin_layout Plain Layout
4726   }
4727 \end_layout
4729 \begin_layout Plain Layout
4731   return result;
4732 \end_layout
4734 \begin_layout Plain Layout
4737 \end_layout
4739 \end_inset
4742 \end_layout
4744 \begin_layout Standard
4745 We can test this function like this:
4746 \end_layout
4748 \begin_layout Chunk
4749 pca-test.awk
4750 \end_layout
4752 \begin_layout Standard
4753 \begin_inset listings
4754 inline false
4755 status open
4757 \begin_layout Plain Layout
4760 \backslash
4761 chunkref{get_chunk_args()}>
4762 \end_layout
4764 \begin_layout Plain Layout
4766 BEGIN {
4767 \end_layout
4769 \begin_layout Plain Layout
4771   SUBSEP=".";
4772 \end_layout
4774 \begin_layout Plain Layout
4776 \end_layout
4778 \begin_layout Plain Layout
4780   print parse_chunk_args("things[x, y], get_other_things(a, 
4781 \backslash
4782 "all
4783 \backslash
4784 ")", a);
4785 \end_layout
4787 \begin_layout Plain Layout
4789   for (b in a) {
4790 \end_layout
4792 \begin_layout Plain Layout
4794     print "a[" b "] => " a[b];
4795 \end_layout
4797 \begin_layout Plain Layout
4799   }
4800 \end_layout
4802 \begin_layout Plain Layout
4805 \end_layout
4807 \end_inset
4810 \end_layout
4812 \begin_layout Standard
4813 which should give this output:
4814 \end_layout
4816 \begin_layout Chunk
4817 pca-test.awk-results
4818 \end_layout
4820 \begin_layout Standard
4821 \begin_inset listings
4822 inline false
4823 status open
4825 \begin_layout Plain Layout
4827 a[foo.quux.quirk] => 
4828 \end_layout
4830 \begin_layout Plain Layout
4832 a[foo.quux.a] => fleeg
4833 \end_layout
4835 \begin_layout Plain Layout
4837 a[foo.bar] => baz
4838 \end_layout
4840 \begin_layout Plain Layout
4842 a[etc] => 
4843 \end_layout
4845 \begin_layout Plain Layout
4847 a[name] => freddie
4848 \end_layout
4850 \end_inset
4853 \end_layout
4855 \begin_layout Section
4856 Expanding parameters
4857 \end_layout
4859 \begin_layout Standard
4860 \begin_inset CommandInset label
4861 LatexCommand label
4862 name "Here-we-split"
4864 \end_inset
4866 Here we split the text on 
4867 \begin_inset Flex CharStyle:Code
4868 status collapsed
4870 \begin_layout Plain Layout
4872 \end_layout
4874 \end_inset
4876  which means that all parts except the first will begin with a parameter
4877  name.
4878  The split function will consume the literal 
4879 \begin_inset Flex CharStyle:Code
4880 status collapsed
4882 \begin_layout Plain Layout
4884 \end_layout
4886 \end_inset
4888  in each case.
4889 \end_layout
4891 \begin_layout Chunk
4892 expand_chunk_args()
4893 \end_layout
4895 \begin_layout Standard
4896 \begin_inset listings
4897 inline false
4898 status open
4900 \begin_layout Plain Layout
4902 function expand_chunk_args(text, params, args,  
4903 \end_layout
4905 \begin_layout Plain Layout
4907   p, text_array, next_text, v, t, l)
4908 \end_layout
4910 \begin_layout Plain Layout
4913 \end_layout
4915 \begin_layout Plain Layout
4917   if (split(text, text_array, "
4918 \backslash
4920 \backslash
4921 ${")) {
4922 \end_layout
4924 \begin_layout Plain Layout
4926     =<
4927 \backslash
4928 chunkref{substitute-chunk-args}>
4929 \end_layout
4931 \begin_layout Plain Layout
4933   }
4934 \end_layout
4936 \begin_layout Plain Layout
4938   return text;
4939 \end_layout
4941 \begin_layout Plain Layout
4944 \end_layout
4946 \end_inset
4949 \end_layout
4951 \begin_layout Standard
4952 First, we produce an associative array of substitution values indexed by
4953  parameter names
4954 \end_layout
4956 \begin_layout Chunk
4957 substitute-chunk-args
4958 \end_layout
4960 \begin_layout Standard
4961 \begin_inset listings
4962 inline false
4963 status open
4965 \begin_layout Plain Layout
4967 for(p in params) {
4968 \end_layout
4970 \begin_layout Plain Layout
4972   v[params[p]]=args[p];
4973 \end_layout
4975 \begin_layout Plain Layout
4978 \end_layout
4980 \end_inset
4983 \end_layout
4985 \begin_layout Standard
4986 We accumulate substituted text in the variable 
4987 \begin_inset Flex CharStyle:Code
4988 status collapsed
4990 \begin_layout Plain Layout
4991 text
4992 \end_layout
4994 \end_inset
4997  As the first part of the split function is the part before the delimiter
4998  --- which is 
4999 \begin_inset Flex CharStyle:Code
5000 status collapsed
5002 \begin_layout Plain Layout
5004 \end_layout
5006 \end_inset
5008  in our case --- this part will never contain a parameter reference, so
5009  we assign this directly to the result kept in 
5010 \begin_inset Flex CharStyle:Code
5011 status collapsed
5013 \begin_layout Plain Layout
5014 $text
5015 \end_layout
5017 \end_inset
5020 \begin_inset listings
5021 inline false
5022 status open
5024 \begin_layout Plain Layout
5026 text=text_array[1];
5027 \end_layout
5029 \end_inset
5032 \end_layout
5034 \begin_layout Standard
5035 We then iterate over the remaining values in the array
5036 \begin_inset Foot
5037 status collapsed
5039 \begin_layout Plain Layout
5040 I don't know why I think that it will enumerate the array in order, but
5041  it seems to work
5042 \end_layout
5044 \end_inset
5047 \begin_inset Note Note
5048 status collapsed
5050 \begin_layout Plain Layout
5051 So fix it or porve it
5052 \end_layout
5054 \end_inset
5056 , and substitute each reference for it's argument.
5057 \end_layout
5059 \begin_layout Standard
5060 \begin_inset listings
5061 inline false
5062 status open
5064 \begin_layout Plain Layout
5066 for(t in text_array) if (t>1) {
5067 \end_layout
5069 \begin_layout Plain Layout
5071   =<
5072 \backslash
5073 chunkref{substitute-chunk-arg}>
5074 \end_layout
5076 \begin_layout Plain Layout
5079 \end_layout
5081 \end_inset
5084 \end_layout
5086 \begin_layout Standard
5087 After the split on 
5088 \begin_inset Flex CharStyle:Code
5089 status collapsed
5091 \begin_layout Plain Layout
5093 \end_layout
5095 \end_inset
5097  a valid parameter reference will consist of valid parameter name terminated
5098  by a close-brace 
5099 \begin_inset Flex CharStyle:Code
5100 status collapsed
5102 \begin_layout Plain Layout
5104 \end_layout
5106 \end_inset
5109  A valid character name begins with the underscore or a letter, and may
5110  contain letters, digits or underscores.
5111 \end_layout
5113 \begin_layout Standard
5114 A valid looking reference that is not actually the name of a parameter will
5115  be and not substituted.
5116  This is good because there is nothing to substitute anyway, and it avoids
5117  clashes when writing code for languages where ${\SpecialChar \ldots{}
5118 } is a valid construct
5119  --- such constructs will not be interfered with unless the parameter name
5120  also matches.
5121 \end_layout
5123 \begin_layout Chunk
5124 substitute-chunk-arg
5125 \end_layout
5127 \begin_layout Standard
5128 \begin_inset listings
5129 inline false
5130 status open
5132 \begin_layout Plain Layout
5134 if (match(text_array[t], "^([a-zA-Z_][a-zA-Z0-9_]*)}", l) &&
5135 \end_layout
5137 \begin_layout Plain Layout
5139     l[1] in v) 
5140 \end_layout
5142 \begin_layout Plain Layout
5145 \end_layout
5147 \begin_layout Plain Layout
5149   text = text v[l[1]] substr(text_array[t], length(l[1])+2);
5150 \end_layout
5152 \begin_layout Plain Layout
5154 } else {
5155 \end_layout
5157 \begin_layout Plain Layout
5159   text = text "${" text_array[t];
5160 \end_layout
5162 \begin_layout Plain Layout
5165 \end_layout
5167 \end_inset
5170 \end_layout
5172 \begin_layout Chapter
5173 Recognizing Chunks
5174 \end_layout
5176 \begin_layout Standard
5177 Newfangle recognizes noweb chunks, but as we also want better LaTeX integration
5178  we will recognize any of these:
5179 \end_layout
5181 \begin_layout Itemize
5182 notangle chunks matching the pattern 
5183 \begin_inset Flex CharStyle:Code
5184 status collapsed
5186 \begin_layout Plain Layout
5188 \begin_inset space \hspace*{}
5189 \length 0in
5190 \end_inset
5192 <.*?>
5193 \begin_inset space \hspace*{}
5194 \length 0in
5195 \end_inset
5198 \end_layout
5200 \end_inset
5203 \end_layout
5205 \begin_layout Itemize
5206 a chunks beginning with 
5207 \begin_inset Flex CharStyle:Code
5208 status collapsed
5210 \begin_layout Plain Layout
5212 \backslash
5213 begin{lstlistings}
5214 \end_layout
5216 \end_inset
5218 , possibly with 
5219 \backslash
5220 Chunk{\SpecialChar \ldots{}
5221 } on the previous line
5222 \end_layout
5224 \begin_layout Itemize
5225 an older form I have used, beginning with 
5226 \begin_inset Flex CharStyle:Code
5227 status collapsed
5229 \begin_layout Plain Layout
5231 \backslash
5232 begin{Chunk}[options]
5233 \end_layout
5235 \end_inset
5237  --- also more suitable for plain LaTeX users
5238 \begin_inset Foot
5239 status collapsed
5241 \begin_layout Plain Layout
5242 Is there such a thing as plain LaTeX?
5243 \end_layout
5245 \end_inset
5248 \end_layout
5250 \begin_layout Section
5251 Chunk start
5252 \end_layout
5254 \begin_layout Standard
5255 The variable 
5256 \begin_inset Flex CharStyle:Code
5257 status collapsed
5259 \begin_layout Plain Layout
5260 chunking
5261 \end_layout
5263 \end_inset
5265  is used to signify that we are processing a code chunk and not document.
5266  In such a state, input lines will be assigned to the current chunk; otherwise
5267  they are ignored.
5268 \end_layout
5270 \begin_layout Subsection
5271 lstlistings
5272 \end_layout
5274 \begin_layout Standard
5275 Our current scheme is to recognize the new lstlisting chunks, but these
5276  may be preceded by a 
5277 \begin_inset Flex CharStyle:Code
5278 status collapsed
5280 \begin_layout Plain Layout
5282 \backslash
5283 Chunk
5284 \end_layout
5286 \end_inset
5288  command which in LyX is a more convenient way to pass the chunk name to
5289  the 
5290 \begin_inset Flex CharStyle:Code
5291 status collapsed
5293 \begin_layout Plain Layout
5295 \backslash
5296 begin{lstlistings}
5297 \end_layout
5299 \end_inset
5301  command, and a more visible way to specify other 
5302 \begin_inset Flex CharStyle:Code
5303 status collapsed
5305 \begin_layout Plain Layout
5306 lstset
5307 \end_layout
5309 \end_inset
5311  settings.
5312 \end_layout
5314 \begin_layout Standard
5315 The arguments to the 
5316 \begin_inset Flex CharStyle:Code
5317 status collapsed
5319 \begin_layout Plain Layout
5321 \backslash
5322 Chunk
5323 \end_layout
5325 \end_inset
5327  command are a name, and then a comma-seperated list of key-value pairs
5328  after the manner of 
5329 \begin_inset Flex CharStyle:Code
5330 status collapsed
5332 \begin_layout Plain Layout
5334 \backslash
5335 lstset
5336 \end_layout
5338 \end_inset
5341  (In fact within the LaTeX 
5342 \begin_inset Flex CharStyle:Code
5343 status collapsed
5345 \begin_layout Plain Layout
5347 \backslash
5348 Chunk
5349 \end_layout
5351 \end_inset
5353  macro (section 
5354 \begin_inset CommandInset ref
5355 LatexCommand ref
5356 reference "sub:The-chunk-command"
5358 \end_inset
5360 ) the text 
5361 \begin_inset Flex CharStyle:Code
5362 status collapsed
5364 \begin_layout Plain Layout
5365 name=
5366 \end_layout
5368 \end_inset
5370  is prefixed to the argument which is then literally passed to 
5371 \begin_inset Flex CharStyle:Code
5372 status collapsed
5374 \begin_layout Plain Layout
5376 \backslash
5377 lstset
5378 \end_layout
5380 \end_inset
5383 \end_layout
5385 \begin_layout Chunk
5386 recognize-chunk
5387 \end_layout
5389 \begin_layout Standard
5390 \begin_inset listings
5391 inline false
5392 status open
5394 \begin_layout Plain Layout
5397 \backslash
5399 \backslash
5400 Chunk{/ {
5401 \end_layout
5403 \begin_layout Plain Layout
5405   if (match($0, "^
5406 \backslash
5408 \backslash
5410 \backslash
5412 \backslash
5413 Chunk{ *([^ ,}]*),?(.*)}", line)) {
5414 \end_layout
5416 \begin_layout Plain Layout
5418     next_chunk_name = line[1];
5419 \end_layout
5421 \begin_layout Plain Layout
5423     get_chunk_args(line[2], next_chunk_args);
5424 \end_layout
5426 \begin_layout Plain Layout
5428   }
5429 \end_layout
5431 \begin_layout Plain Layout
5433   next;
5434 \end_layout
5436 \begin_layout Plain Layout
5439 \end_layout
5441 \end_inset
5444 \end_layout
5446 \begin_layout Standard
5447 We also make a basic attempt to parse the name out of the 
5448 \begin_inset Flex CharStyle:Code
5449 status collapsed
5451 \begin_layout Plain Layout
5453 \backslash
5454 lstlistings[name=
5455 \begin_inset space \hspace{}
5456 \length 0in
5457 \end_inset
5459 chunk-name]
5460 \end_layout
5462 \end_inset
5464  text, otherwise we fall back to the name found in the previous chunk command.
5465  This attempt is very basic and doesn't support commas or spaces or square
5466  brackets as part of the chunkname.
5467  We also recognize 
5468 \begin_inset Flex CharStyle:Code
5469 status collapsed
5471 \begin_layout Plain Layout
5473 \backslash
5474 begin{Chunk}
5475 \end_layout
5477 \end_inset
5479  which is convenient for some users
5480 \begin_inset Foot
5481 status open
5483 \begin_layout Plain Layout
5484 but not yet supported in the LaTeX macros
5485 \end_layout
5487 \end_inset
5490 \begin_inset Note Note
5491 status collapsed
5493 \begin_layout Plain Layout
5494 Add noweave support
5495 \end_layout
5497 \end_inset
5500 \end_layout
5502 \begin_layout Standard
5503 \begin_inset listings
5504 inline false
5505 status open
5507 \begin_layout Plain Layout
5510 \backslash
5512 \backslash
5513 begin{lstlisting}|^
5514 \backslash
5516 \backslash
5517 begin{Chunk}/ {
5518 \end_layout
5520 \begin_layout Plain Layout
5522   if (match($0, "}.*[[,] *name= *{? *([^], }]*)", line)) {
5523 \end_layout
5525 \begin_layout Plain Layout
5527     new_chunk(line[1]);
5528 \end_layout
5530 \begin_layout Plain Layout
5532   } else {
5533 \end_layout
5535 \begin_layout Plain Layout
5537     new_chunk(next_chunk_name, next_chunk_args);
5538 \end_layout
5540 \begin_layout Plain Layout
5542   }
5543 \end_layout
5545 \begin_layout Plain Layout
5547   chunking=1;
5548 \end_layout
5550 \begin_layout Plain Layout
5552   next;
5553 \end_layout
5555 \begin_layout Plain Layout
5558 \end_layout
5560 \end_inset
5563 \end_layout
5565 \begin_layout Subsection
5566 Noweb
5567 \end_layout
5569 \begin_layout Standard
5570 We recognize notangle style chunks too:
5571 \end_layout
5573 \begin_layout Chunk
5574 recognize-chunk
5575 \end_layout
5577 \begin_layout Standard
5578 \begin_inset listings
5579 inline false
5580 status open
5582 \begin_layout Plain Layout
5584 /^[<]<.*[>]>=/ {
5585 \end_layout
5587 \begin_layout Plain Layout
5589   if (match($0, "^[<]<(.*)[>]>= *$", line)) {
5590 \end_layout
5592 \begin_layout Plain Layout
5594     chunking=1;
5595 \end_layout
5597 \begin_layout Plain Layout
5599     notangle_mode=1;
5600 \end_layout
5602 \begin_layout Plain Layout
5604     new_chunk(line[1]);
5605 \end_layout
5607 \begin_layout Plain Layout
5609     next;
5610 \end_layout
5612 \begin_layout Plain Layout
5614   }
5615 \end_layout
5617 \begin_layout Plain Layout
5620 \end_layout
5622 \end_inset
5625 \end_layout
5627 \begin_layout Section
5628 Chunk end
5629 \end_layout
5631 \begin_layout Standard
5632 Likewise, we need to recognize when a chunk ends.
5633 \end_layout
5635 \begin_layout Subsection
5636 lstlistings
5637 \end_layout
5639 \begin_layout Standard
5640 The 
5641 \begin_inset Flex CharStyle:Code
5642 status collapsed
5644 \begin_layout Plain Layout
5646 \end_layout
5648 \end_inset
5650  in 
5651 \begin_inset Flex CharStyle:Code
5652 status collapsed
5654 \begin_layout Plain Layout
5655 [e]end{lislisting}
5656 \end_layout
5658 \end_inset
5660  is surrounded by square brackets so that when this document is processed,
5661  this chunk doesn't terminate early when the lstlistings package recognizes
5662  it's own end-string! 
5663 \begin_inset Note Greyedout
5664 status collapsed
5666 \begin_layout Plain Layout
5667 This doesn't make sense as the regex is anchored with ^, which this line
5668  does not begin with!
5669 \end_layout
5671 \end_inset
5674 \begin_inset Note Note
5675 status open
5677 \begin_layout Plain Layout
5678 No, it doesn't.
5679 \end_layout
5681 \end_inset
5684 \end_layout
5686 \begin_layout Chunk
5687 recognize-chunk
5688 \end_layout
5690 \begin_layout Standard
5691 \begin_inset listings
5692 inline false
5693 status open
5695 \begin_layout Plain Layout
5698 \backslash
5700 \backslash
5701 [e]nd{lstlisting}|^
5702 \backslash
5704 \backslash
5705 [e]nd{Chunk}/ {
5706 \end_layout
5708 \begin_layout Plain Layout
5710   chunking=0;
5711 \end_layout
5713 \begin_layout Plain Layout
5715   active_chunk="";
5716 \end_layout
5718 \begin_layout Plain Layout
5720   next;
5721 \end_layout
5723 \begin_layout Plain Layout
5726 \end_layout
5728 \end_inset
5731 \end_layout
5733 \begin_layout Subsection
5734 noweb
5735 \end_layout
5737 \begin_layout Chunk
5738 recognize-chunk
5739 \end_layout
5741 \begin_layout Standard
5742 \begin_inset listings
5743 inline false
5744 status open
5746 \begin_layout Plain Layout
5748 /^@ *$/ {
5749 \end_layout
5751 \begin_layout Plain Layout
5753   chunking=0;
5754 \end_layout
5756 \begin_layout Plain Layout
5758   active_chunk="";
5759 \end_layout
5761 \begin_layout Plain Layout
5764 \end_layout
5766 \end_inset
5769 \end_layout
5771 \begin_layout Standard
5772 All other recognizers are only of effect if we are chunking; there's no
5773  point in looking at lines if they aren't part of a chunk, so we just ignore
5774  them as efficiently as we can.
5775 \end_layout
5777 \begin_layout Chunk
5778 recognize-chunk
5779 \end_layout
5781 \begin_layout Standard
5782 \begin_inset listings
5783 inline false
5784 status open
5786 \begin_layout Plain Layout
5788 ! chunking { next; }
5789 \end_layout
5791 \end_inset
5794 \end_layout
5796 \begin_layout Section
5797 Chunk contents
5798 \end_layout
5800 \begin_layout Standard
5801 Chunk contents are any lines read while 
5802 \begin_inset Flex CharStyle:Code
5803 status collapsed
5805 \begin_layout Plain Layout
5806 chunking
5807 \end_layout
5809 \end_inset
5811  is true.
5812  Some chunk contents are special in that they refer to other chunks, and
5813  will be replaced by the contents of these chunks when the file is generated.
5814 \end_layout
5816 \begin_layout Standard
5817 \begin_inset CommandInset label
5818 LatexCommand label
5819 name "sub:ORS-chunk-text"
5821 \end_inset
5823 We add the output record separator 
5824 \begin_inset Flex CharStyle:Code
5825 status collapsed
5827 \begin_layout Plain Layout
5829 \end_layout
5831 \end_inset
5833  to the line now, because we will set 
5834 \begin_inset Flex CharStyle:Code
5835 status collapsed
5837 \begin_layout Plain Layout
5839 \end_layout
5841 \end_inset
5843  to the empty string when we generate the output
5844 \begin_inset Foot
5845 status collapsed
5847 \begin_layout Plain Layout
5848 So that we can print partial lines using 
5849 \begin_inset Flex CharStyle:Code
5850 status collapsed
5852 \begin_layout Plain Layout
5853 print
5854 \end_layout
5856 \end_inset
5858  instead of 
5859 \begin_inset Flex CharStyle:Code
5860 status collapsed
5862 \begin_layout Plain Layout
5863 printf
5864 \end_layout
5866 \end_inset
5869 \end_layout
5871 \end_inset
5874 \end_layout
5876 \begin_layout Chunk
5877 recognize-chunk
5878 \end_layout
5880 \begin_layout Standard
5881 \begin_inset listings
5882 inline false
5883 status open
5885 \begin_layout Plain Layout
5887 length(active_chunk) {
5888 \end_layout
5890 \begin_layout Plain Layout
5892   =<
5893 \backslash
5894 chunkref{process-chunk-tabs}>
5895 \end_layout
5897 \begin_layout Plain Layout
5899   =<
5900 \backslash
5901 chunkref{process-chunk}>
5902 \end_layout
5904 \begin_layout Plain Layout
5907 \end_layout
5909 \end_inset
5912 \end_layout
5914 \begin_layout Standard
5915 If a chunk just consisted of plain text, we could handle the chunk like
5916  this:
5917 \end_layout
5919 \begin_layout Chunk
5920 process-chunk-simple
5921 \end_layout
5923 \begin_layout Standard
5924 \begin_inset listings
5925 inline false
5926 status open
5928 \begin_layout Plain Layout
5930 chunk_line(active_chunk, $0 ORS);
5931 \end_layout
5933 \end_inset
5936 \end_layout
5938 \begin_layout Standard
5939 but in fact a chunk can include references to other chunks.
5940  Chunk includes are traditionally written as 
5941 \begin_inset Flex CharStyle:Code
5942 status collapsed
5944 \begin_layout Plain Layout
5945 <<chunk-name>>
5946 \end_layout
5948 \end_inset
5950 , but we support other variations.
5951 \end_layout
5953 \begin_layout Standard
5954 However, we also process tabs at this point, a tab at input can be replaced
5955  by a number of spaces defined by the 
5956 \begin_inset Flex CharStyle:Code
5957 status collapsed
5959 \begin_layout Plain Layout
5960 tabs
5961 \end_layout
5963 \end_inset
5965  variable, set by the 
5966 \begin_inset Flex CharStyle:Code
5967 status collapsed
5969 \begin_layout Plain Layout
5971 \end_layout
5973 \end_inset
5975  option.
5976  Of course this is poor tab behaviour, we should probably have the option
5977  to use proper counted tab-stops and process this on output.
5978 \end_layout
5980 \begin_layout Chunk
5981 process-chunk-tabs
5982 \end_layout
5984 \begin_layout Standard
5985 \begin_inset listings
5986 inline false
5987 status open
5989 \begin_layout Plain Layout
5991 if (length(tabs)) {
5992 \end_layout
5994 \begin_layout Plain Layout
5996   gsub("
5997 \backslash
5998 t", tabs);
5999 \end_layout
6001 \begin_layout Plain Layout
6004 \end_layout
6006 \end_inset
6009 \end_layout
6011 \begin_layout Subsection
6012 \begin_inset CommandInset label
6013 LatexCommand label
6014 name "sub:lstlistings-includes"
6016 \end_inset
6018 lstlistings
6019 \end_layout
6021 \begin_layout Standard
6022 If 
6023 \begin_inset Flex CharStyle:Code
6024 status collapsed
6026 \begin_layout Plain Layout
6028 \backslash
6029 lstset{escapeinside={=<}{>}}
6030 \end_layout
6032 \end_inset
6034  is set, then we can use 
6035 \begin_inset Flex CharStyle:Code
6036 status collapsed
6038 \begin_layout Plain Layout
6040 \backslash
6041 chunkref{
6042 \begin_inset space \hspace{}
6043 \length 0in
6044 \end_inset
6046 chunk-name}>
6047 \end_layout
6049 \end_inset
6051  in listings.
6052  The sequence 
6053 \begin_inset Flex CharStyle:Code
6054 status collapsed
6056 \begin_layout Plain Layout
6058 \end_layout
6060 \end_inset
6062  was chosen because:
6063 \end_layout
6065 \begin_layout Enumerate
6066 it is a better mnemonic than 
6067 \begin_inset Flex CharStyle:Code
6068 status collapsed
6070 \begin_layout Plain Layout
6071 <<chunk-name>>
6072 \end_layout
6074 \end_inset
6076  in that the = sign signifies equivalent or substitutability, 
6077 \end_layout
6079 \begin_layout Enumerate
6080 and because =< is not valid in C or in any language I can think of 
6081 \end_layout
6083 \begin_layout Enumerate
6084 and also because lstlistings doesn't like 
6085 \begin_inset Flex CharStyle:Code
6086 status collapsed
6088 \begin_layout Plain Layout
6090 \end_layout
6092 \end_inset
6094  as an end delimiter for the 
6095 \emph on
6096 texcl
6097 \emph default
6098  escape, so we must make do with a single 
6099 \begin_inset Flex CharStyle:Code
6100 status collapsed
6102 \begin_layout Plain Layout
6104 \end_layout
6106 \end_inset
6108 , which is better matched by 
6109 \begin_inset Flex CharStyle:Code
6110 status collapsed
6112 \begin_layout Plain Layout
6114 \end_layout
6116 \end_inset
6118  than 
6119 \begin_inset Flex CharStyle:Code
6120 status collapsed
6122 \begin_layout Plain Layout
6124 \end_layout
6126 \end_inset
6129 \end_layout
6131 \begin_layout Standard
6132 As each chunk line may contain more than one chunk include, we will split
6133  out chunk includes in an iterative fashion
6134 \begin_inset Foot
6135 status open
6137 \begin_layout Plain Layout
6138 Contrary to our use of 
6139 \begin_inset Flex CharStyle:Code
6140 status collapsed
6142 \begin_layout Plain Layout
6143 split
6144 \end_layout
6146 \end_inset
6148  when substituting parameters in chapter 
6149 \begin_inset CommandInset ref
6150 LatexCommand ref
6151 reference "Here-we-split"
6153 \end_inset
6156 \end_layout
6158 \end_inset
6161 \end_layout
6163 \begin_layout Standard
6164 First, as long as the chunk contains a 
6165 \begin_inset Flex CharStyle:Code
6166 status collapsed
6168 \begin_layout Plain Layout
6170 \backslash
6171 chunkref
6172 \end_layout
6174 \end_inset
6176  command we take as much as we can up to the first 
6177 \begin_inset Flex CharStyle:Code
6178 status collapsed
6180 \begin_layout Plain Layout
6182 \backslash
6183 chunkref
6184 \end_layout
6186 \end_inset
6188  command.
6189 \end_layout
6191 \begin_layout Chunk
6192 process-chunk
6193 \end_layout
6195 \begin_layout Standard
6196 \begin_inset listings
6197 inline false
6198 status open
6200 \begin_layout Plain Layout
6202 chunk = $0;
6203 \end_layout
6205 \begin_layout Plain Layout
6207 indent = 0;
6208 \end_layout
6210 \begin_layout Plain Layout
6212 while(match(chunk, 
6213 \end_layout
6215 \begin_layout Plain Layout
6217             "([=]<
6218 \backslash
6220 \backslash
6222 \backslash
6224 \backslash
6225 chunkref{([^}>]*)}(
6226 \backslash
6228 \backslash
6230 \backslash
6232 \backslash
6233 )|)>|<<([a-zA-Z_][-a-zA-Z0-9_]*)>>)", 
6234 \end_layout
6236 \begin_layout Plain Layout
6238             line)
6239 \backslash
6241 \end_layout
6243 \begin_layout Plain Layout
6245 ) {
6246 \end_layout
6248 \begin_layout Plain Layout
6250   chunklet = substr(chunk, 1, RSTART - 1);
6251 \end_layout
6253 \end_inset
6256 \end_layout
6258 \begin_layout Standard
6259 We keep track of the indent count, by counting the number of literal characters
6260  found.
6261  We can then preserve this indent on each output line when multi-line chunks
6262  are expanded.
6263 \end_layout
6265 \begin_layout Standard
6266 We then process this first part literal text, and set the chunk which is
6267  still to be processed to be the text after the 
6268 \begin_inset Flex CharStyle:Code
6269 status collapsed
6271 \begin_layout Plain Layout
6273 \backslash
6274 chunkref
6275 \end_layout
6277 \end_inset
6279  command, which we will process next as we continue around the loop.
6280 \end_layout
6282 \begin_layout Standard
6283 \begin_inset listings
6284 inline false
6285 status open
6287 \begin_layout Plain Layout
6289   indent += length(chunklet);
6290 \end_layout
6292 \begin_layout Plain Layout
6294   chunk_line(active_chunk, chunklet);
6295 \end_layout
6297 \begin_layout Plain Layout
6299   chunk = substr(chunk, RSTART + RLENGTH);
6300 \end_layout
6302 \end_inset
6305 \end_layout
6307 \begin_layout Standard
6308 We then consider the type of chunk command we have found, whether it is
6309  the newfangle style command beginning with 
6310 \begin_inset Flex CharStyle:Code
6311 status collapsed
6313 \begin_layout Plain Layout
6315 \end_layout
6317 \end_inset
6319  or the older notangle style beginning with 
6320 \begin_inset Flex CharStyle:Code
6321 status collapsed
6323 \begin_layout Plain Layout
6325 \end_layout
6327 \end_inset
6331 \end_layout
6333 \begin_layout Standard
6334 Newfangle chunks may have parameters contained within square brackets.
6335  These will be matched in 
6336 \begin_inset Flex CharStyle:Code
6337 status collapsed
6339 \begin_layout Plain Layout
6340 line[3]
6341 \end_layout
6343 \end_inset
6345  and are considered at this stage of processing to be part of the name of
6346  the chunk to be included.
6347 \end_layout
6349 \begin_layout Standard
6350 \begin_inset listings
6351 inline false
6352 status open
6354 \begin_layout Plain Layout
6356   if (substr(line[1], 1, 1) == "=") {
6357 \end_layout
6359 \begin_layout Plain Layout
6361     # chunk name up to }
6362 \end_layout
6364 \begin_layout Plain Layout
6366     chunk_include(active_chunk, line[2] line[3], indent);
6367 \end_layout
6369 \begin_layout Plain Layout
6371   } else if (substr(line[1], 1, 1) == "<") {
6372 \end_layout
6374 \begin_layout Plain Layout
6376     chunk_include(active_chunk, line[4], indent);
6377 \end_layout
6379 \begin_layout Plain Layout
6381   } else {
6382 \end_layout
6384 \begin_layout Plain Layout
6386     error("Unknown chunk fragment: " line[1]);
6387 \end_layout
6389 \begin_layout Plain Layout
6391   }
6392 \end_layout
6394 \end_inset
6397 \end_layout
6399 \begin_layout Standard
6400 The loop will continue until there are no more chunkref statements in the
6401  text, at which point we process the final part of the chunk.
6402 \end_layout
6404 \begin_layout Standard
6405 \begin_inset listings
6406 inline false
6407 status open
6409 \begin_layout Plain Layout
6412 \end_layout
6414 \begin_layout Plain Layout
6416 chunk_line(active_chunk, chunk);
6417 \end_layout
6419 \end_inset
6422 \end_layout
6424 \begin_layout Standard
6425 \begin_inset CommandInset label
6426 LatexCommand label
6427 name "lone-newline"
6429 \end_inset
6431 We add the newline character as a chunklet on it's own, to make it easier
6432  to detect new lines and thus manage indentation when processing the output.
6433 \end_layout
6435 \begin_layout Standard
6436 \begin_inset listings
6437 inline false
6438 status open
6440 \begin_layout Plain Layout
6442 chunk_line(active_chunk, "
6443 \backslash
6444 n");
6445 \end_layout
6447 \end_inset
6450 \end_layout
6452 \begin_layout Standard
6453 We will also permit a chunk-part number to follow in square brackets, so
6454  that 
6455 \begin_inset Flex CharStyle:Code
6456 status collapsed
6458 \begin_layout Plain Layout
6460 \backslash
6461 chunkref{chunk-name[1]}>
6462 \end_layout
6464 \end_inset
6466  will refer to the first part only.
6467  This can make it easy to include a C function prototype in a header file,
6468  if the first part of the chunk is just the function prototype without the
6469  trailing semi-colon.
6470  The header file would include the prototype with the trailing semi-colon,
6471  like this:
6472 \end_layout
6474 \begin_layout LyX-Code
6476 \backslash
6477 chunkref{chunk-name[1]}>;
6478 \end_layout
6480 \begin_layout Standard
6481 This is handled in section 
6482 \begin_inset CommandInset ref
6483 LatexCommand ref
6484 reference "sub:Chunk-parts"
6486 \end_inset
6489 \end_layout
6491 \begin_layout Standard
6492 We should perhaps introduce a notion of language specific chunk options;
6493  so that perhaps we could specify:
6494 \end_layout
6496 \begin_layout LyX-Code
6498 \backslash
6499 chunkref{chunk-name[function-declaration]}>;
6500 \end_layout
6502 \begin_layout Standard
6503 which applies a transform 
6504 \begin_inset Flex CharStyle:Code
6505 status collapsed
6507 \begin_layout Plain Layout
6508 function-declaration
6509 \end_layout
6511 \end_inset
6513  to the chunk --- which in this case would extract a function prototype
6514  from a function.
6515 \begin_inset Note Note
6516 status open
6518 \begin_layout Plain Layout
6519 So do it
6520 \end_layout
6522 \end_inset
6525 \end_layout
6527 \begin_layout Chapter
6528 Processing Options
6529 \end_layout
6531 \begin_layout Standard
6532 At the start, first we set the default options.
6533 \end_layout
6535 \begin_layout Chunk
6536 default-options
6537 \end_layout
6539 \begin_layout Standard
6540 \begin_inset listings
6541 inline false
6542 status open
6544 \begin_layout Plain Layout
6546 debug=0;
6547 \end_layout
6549 \begin_layout Plain Layout
6551 linenos=0;
6552 \end_layout
6554 \begin_layout Plain Layout
6556 notangle_mode=0;
6557 \end_layout
6559 \begin_layout Plain Layout
6561 SUBSEP=",";
6562 \end_layout
6564 \begin_layout Plain Layout
6566 root="*";
6567 \end_layout
6569 \begin_layout Plain Layout
6571 tabs = "";
6572 \end_layout
6574 \end_inset
6577 \end_layout
6579 \begin_layout Standard
6580 Then we use getopt the standard way, and null out ARGV afterwards in the
6581  normal AWK fashion.
6582 \end_layout
6584 \begin_layout Chunk
6585 read-options
6586 \end_layout
6588 \begin_layout Standard
6589 \begin_inset listings
6590 inline false
6591 status open
6593 \begin_layout Plain Layout
6595 Optind = 1    # skip ARGV[0]
6596 \end_layout
6598 \begin_layout Plain Layout
6600 while(getopt(ARGC, ARGV, "R:LdT:hr")!=-1) {
6601 \end_layout
6603 \begin_layout Plain Layout
6605   =<
6606 \backslash
6607 chunkref{handle-options}>
6608 \end_layout
6610 \begin_layout Plain Layout
6613 \end_layout
6615 \begin_layout Plain Layout
6617 for (i=1; i<Optind; i++) { ARGV[i]=""; }
6618 \end_layout
6620 \end_inset
6623 \end_layout
6625 \begin_layout Standard
6626 This is how we handle our options:
6627 \end_layout
6629 \begin_layout Chunk
6630 handle-options
6631 \end_layout
6633 \begin_layout Standard
6634 \begin_inset listings
6635 inline false
6636 status open
6638 \begin_layout Plain Layout
6640 if (Optopt == "R") root = Optarg;
6641 \end_layout
6643 \begin_layout Plain Layout
6645 else if (Optopt == "r") root="";
6646 \end_layout
6648 \begin_layout Plain Layout
6650 else if (Optopt == "L") linenos = 1;
6651 \end_layout
6653 \begin_layout Plain Layout
6655 else if (Optopt == "d") debug = 1;
6656 \end_layout
6658 \begin_layout Plain Layout
6660 else if (Optopt == "T") tabs = indent_string(Optarg+0);
6661 \end_layout
6663 \begin_layout Plain Layout
6665 else if (Optopt == "h") help();
6666 \end_layout
6668 \begin_layout Plain Layout
6670 else if (Optopt == "?") help();
6671 \end_layout
6673 \end_inset
6676 \end_layout
6678 \begin_layout Standard
6679 We do all of this at the beginning of the program
6680 \end_layout
6682 \begin_layout Chunk
6683 begin
6684 \end_layout
6686 \begin_layout Standard
6687 \begin_inset listings
6688 inline false
6689 status open
6691 \begin_layout Plain Layout
6693 BEGIN {
6694 \end_layout
6696 \begin_layout Plain Layout
6698   =<
6699 \backslash
6700 chunkref{constants}>
6701 \end_layout
6703 \begin_layout Plain Layout
6705   =<
6706 \backslash
6707 chunkref{default-options}>
6708 \end_layout
6710 \begin_layout Plain Layout
6712 \end_layout
6714 \begin_layout Plain Layout
6716   =<
6717 \backslash
6718 chunkref{read-options}>
6719 \end_layout
6721 \begin_layout Plain Layout
6724 \end_layout
6726 \end_inset
6729 \end_layout
6731 \begin_layout Standard
6732 And have a simple help function
6733 \end_layout
6735 \begin_layout Chunk
6736 help()
6737 \end_layout
6739 \begin_layout Standard
6740 \begin_inset listings
6741 inline false
6742 status open
6744 \begin_layout Plain Layout
6746 function help() {
6747 \end_layout
6749 \begin_layout Plain Layout
6751   print "Usage:"
6752 \end_layout
6754 \begin_layout Plain Layout
6756   print "  newfangle [-L] -R<rootname> [source.tex ...]"
6757 \end_layout
6759 \begin_layout Plain Layout
6761   print "  newfangle -r [source.tex ...]"
6762 \end_layout
6764 \begin_layout Plain Layout
6766   print "  If the filename, source.tex is not specified then stdin is used"
6767 \end_layout
6769 \begin_layout Plain Layout
6771   print
6772 \end_layout
6774 \begin_layout Plain Layout
6776   print "-L causes the C statement: #line <lineno> 
6777 \backslash
6778 "filename
6779 \backslash
6780 "" to be issued"
6781 \end_layout
6783 \begin_layout Plain Layout
6785   print "-R causes the named root to be written to stdout"
6786 \end_layout
6788 \begin_layout Plain Layout
6790   print "-r lists all roots in the file (even those used elsewhere)"
6791 \end_layout
6793 \begin_layout Plain Layout
6795   exit 1;
6796 \end_layout
6798 \begin_layout Plain Layout
6801 \end_layout
6803 \end_inset
6806 \end_layout
6808 \begin_layout Chapter
6809 Chunk Language Modes
6810 \end_layout
6812 \begin_layout Standard
6813 \begin_inset CommandInset label
6814 LatexCommand label
6815 name "cha:modes"
6817 \end_inset
6820 \begin_inset Note Greyedout
6821 status open
6823 \begin_layout Plain Layout
6824 This feature is in-development and does not work yet
6825 \end_layout
6827 \end_inset
6830 \begin_inset Note Note
6831 status open
6833 \begin_layout Plain Layout
6834 In Progress!
6835 \end_layout
6837 \end_inset
6840 \end_layout
6842 \begin_layout Standard
6843 lstlistings and newfangle both recognize source languages, and perform some
6844  basic parsing.
6845  lstlistings can detect strings and comments within a language definition
6846  and perform suitable rendering, such as italics for comments, and visible-space
6847 s within strings.
6848 \end_layout
6850 \begin_layout Standard
6851 Newfangle similarly can recognize strings, and comments, etc, within a language,
6852  so that any chunks included with 
6853 \begin_inset Flex CharStyle:Code
6854 status collapsed
6856 \begin_layout Plain Layout
6858 \backslash
6859 chunkref
6860 \end_layout
6862 \end_inset
6864  can be suitably quoted.
6865 \end_layout
6867 \begin_layout Standard
6868 For instance, consider this chunk with 
6869 \begin_inset Flex CharStyle:Code
6870 status collapsed
6872 \begin_layout Plain Layout
6873 language=perl
6874 \end_layout
6876 \end_inset
6879 \end_layout
6881 \begin_layout Chunk
6882 example-perl,language=perl
6883 \end_layout
6885 \begin_layout Standard
6886 \begin_inset listings
6887 inline false
6888 status open
6890 \begin_layout Plain Layout
6892 s/"$/'/;
6893 \end_layout
6895 \end_inset
6898 \end_layout
6900 \begin_layout Standard
6901 If it were included in a chunk with 
6902 \begin_inset Flex CharStyle:Code
6903 status collapsed
6905 \begin_layout Plain Layout
6906 language=sh
6907 \end_layout
6909 \end_inset
6911 , like this:
6912 \end_layout
6914 \begin_layout Chunk
6915 example-sh,language=sh
6916 \end_layout
6918 \begin_layout Standard
6919 \begin_inset listings
6920 inline false
6921 status open
6923 \begin_layout Plain Layout
6925 perl -pe "=<
6926 \backslash
6927 chunkref{example-perl}>"
6928 \end_layout
6930 \end_inset
6933 \end_layout
6935 \begin_layout Standard
6936 would need to generate output like this if it were to work: 
6937 \end_layout
6939 \begin_layout LyX-Code
6940 perl -pe "s/
6941 \backslash
6943 \backslash
6944 $/'/;"
6945 \end_layout
6947 \begin_layout Standard
6948 See that the double quote " as part of the regex has been quoted with a
6949  slash to protect it from shell interpretation.
6950 \end_layout
6952 \begin_layout Standard
6953 If that were then included in a chunk with 
6954 \begin_inset Flex CharStyle:Code
6955 status collapsed
6957 \begin_layout Plain Layout
6958 language=make
6959 \end_layout
6961 \end_inset
6963 , like this:
6964 \end_layout
6966 \begin_layout Chunk
6967 example-makefile,language=make
6968 \end_layout
6970 \begin_layout Standard
6971 \begin_inset listings
6972 inline false
6973 status open
6975 \begin_layout Plain Layout
6977 target: pre-req
6978 \end_layout
6980 \begin_layout Plain Layout
6982                 =<
6983 \backslash
6984 chunkref{example-sh}>
6985 \end_layout
6987 \end_inset
6990 \end_layout
6992 \begin_layout Standard
6993 We would need the output to look like this --- note the $$:
6994 \end_layout
6996 \begin_layout LyX-Code
6997 target: pre-req
6998 \end_layout
7000 \begin_layout LyX-Code
7001         perl -pe "s/
7002 \backslash
7004 \backslash
7005 $$/'/;"
7006 \end_layout
7008 \begin_layout Standard
7009 In order to make this work, we need to define a mode-tracker for each supported
7010  language, that can detect the various quoting modes, and provide a transformati
7011 on that must be applied to any included text so that included text will
7012  be interpreted correctly after the additional interpolation that it will
7013  be subject to at run-time.
7014 \end_layout
7016 \begin_layout Standard
7017 For example, the transformation for text to be inserted into sh double-quoted
7018  strings would be something like:
7019 \end_layout
7021 \begin_layout LyX-Code
7023 \backslash
7025 \backslash
7027 \backslash
7029 \backslash
7031 \backslash
7033 \backslash
7034 /g;s/$/
7035 \backslash
7037 \backslash
7038 $/g;s/"/
7039 \backslash
7041 \backslash
7042 "/g;
7043 \end_layout
7045 \begin_layout Standard
7046 which protects 
7047 \begin_inset Flex CharStyle:Code
7048 status collapsed
7050 \begin_layout Plain Layout
7052 \backslash
7053  $ "
7054 \end_layout
7056 \end_inset
7059 \end_layout
7061 \begin_layout Standard
7062 \begin_inset Note Note
7063 status collapsed
7065 \begin_layout Plain Layout
7066 I don't think this example is true
7067 \end_layout
7069 \end_inset
7071 The mode tracker must also track nested mode-changes, as in this 
7072 \begin_inset Flex CharStyle:Code
7073 status collapsed
7075 \begin_layout Plain Layout
7077 \end_layout
7079 \end_inset
7081  example.
7082 \end_layout
7084 \begin_layout LyX-Code
7085 echo "hello `id **`"
7086 \end_layout
7088 \begin_layout Standard
7089 Any literal text inserted at the point marked ** would need to be escaped
7090  in all kinds of ways, including 
7091 \begin_inset Flex CharStyle:Code
7092 status collapsed
7094 \begin_layout Plain Layout
7095 ` | *
7096 \end_layout
7098 \end_inset
7100  among others.
7101  First it would need escaping for the back-ticks `, and then for the double-quot
7102 es ".
7103 \end_layout
7105 \begin_layout Standard
7106 Escaping need not occur if the format and mode of the included chunk matches
7107  that of the including chunk, which would suggest that any back-ticks might
7108  need to be part of the included chunk and not including chunk
7109 \begin_inset Note Note
7110 status collapsed
7112 \begin_layout Plain Layout
7113 or is it the other way around?
7114 \end_layout
7116 \end_inset
7119 \end_layout
7121 \begin_layout Standard
7122 As each chunk is output a new mode tracker for that language is initialized
7123  in it's normal state.
7124  As text is output for that chunk the output mode is tracked.
7125  When a new chunk is included, a transformation appropriate to that mode
7126  is selected and pushed onto a stack of transformations.
7127  Any text to be output is first passed through this stack of transformations.
7128 \end_layout
7130 \begin_layout Standard
7131 It remains to consider if the chunk-include function should return it's
7132  generated text so that the caller can apply any transformations (and formatting
7133 ), or if it should apply the stack of transformations itself.
7134 \end_layout
7136 \begin_layout Standard
7137 Note that the transformed text should have the property of not being able
7138  to change the mode in the current chunk.
7139 \end_layout
7141 \begin_layout Standard
7142 \begin_inset Note Note
7143 status open
7145 \begin_layout Plain Layout
7146 Note chunk parameters should probably also be transformed
7147 \end_layout
7149 \end_inset
7152 \end_layout
7154 \begin_layout Chunk
7155 new_mode()
7156 \end_layout
7158 \begin_layout Standard
7159 \begin_inset listings
7160 inline false
7161 status open
7163 \begin_layout Plain Layout
7165 function new_mode(language, mode) {
7166 \end_layout
7168 \begin_layout Plain Layout
7170   mode["language"] = language;
7171 \end_layout
7173 \begin_layout Plain Layout
7175   mode["state"]="";
7176 \end_layout
7178 \begin_layout Plain Layout
7181 \end_layout
7183 \end_inset
7186 \end_layout
7188 \begin_layout Standard
7189 Because awk functions cannot return an array, we must create the array first
7190  and pass it in.
7191 \end_layout
7193 \begin_layout Chunk
7194 new-mode,params=language;mode
7195 \end_layout
7197 \begin_layout Standard
7198 \begin_inset listings
7199 inline false
7200 status open
7202 \begin_layout Plain Layout
7205 \backslash
7206 chunkref{awk-delete-array}(${mode})>
7207 \end_layout
7209 \begin_layout Plain Layout
7211 new_mode(${language}, ${mode});
7212 \end_layout
7214 \end_inset
7217 \end_layout
7219 \begin_layout Standard
7220 And for tracking modes, we dispatch to a mode-tracker action based on the
7221  current language
7222 \end_layout
7224 \begin_layout Chunk
7225 track_mode()
7226 \end_layout
7228 \begin_layout Standard
7229 \begin_inset listings
7230 inline false
7231 status open
7233 \begin_layout Plain Layout
7235 function track_mode(mode, text) {
7236 \end_layout
7238 \begin_layout Plain Layout
7240   if (mode["language"] == "C") {
7241 \end_layout
7243 \begin_layout Plain Layout
7245     =<
7246 \backslash
7247 chunkref{track-mode-C}>
7248 \end_layout
7250 \begin_layout Plain Layout
7252     return;
7253 \end_layout
7255 \begin_layout Plain Layout
7257   }
7258 \end_layout
7260 \begin_layout Plain Layout
7263 \end_layout
7265 \end_inset
7268 \end_layout
7270 \begin_layout Standard
7271 For each mode, we look for a character that has the power to change the
7272  mode.
7273 \end_layout
7275 \begin_layout Standard
7276 In plain mode:
7277 \end_layout
7279 \begin_layout List
7280 \labelwidthstring 00.00.0000
7281 \begin_inset Quotes eld
7282 \end_inset
7284  enters double-quote mode
7285 \end_layout
7287 \begin_layout List
7288 \labelwidthstring 00.00.0000
7289 ' enters single-quote mode
7290 \end_layout
7292 \begin_layout List
7293 \labelwidthstring 00.00.0000
7294 trailing-
7295 \backslash
7296  enters multi-line mode
7297 \end_layout
7299 \begin_layout List
7300 \labelwidthstring 00.00.0000
7301 # enters #define sub-mode, needs 
7302 \backslash
7303  escaping end of line too
7304 \end_layout
7306 \begin_layout List
7307 \labelwidthstring 00.00.0000
7308 /* enters comment mode
7309 \end_layout
7311 \begin_layout Standard
7312 In double-quote mode, escape 
7313 \backslash
7314  and 
7315 \begin_inset Quotes eld
7316 \end_inset
7318  and newline
7319 \end_layout
7321 \begin_layout Standard
7323 \backslash
7324  escapes prevents 
7325 \begin_inset Quotes eld
7326 \end_inset
7328  from leaving mode
7329 \end_layout
7331 \begin_layout Standard
7332 \begin_inset Quotes eld
7333 \end_inset
7335  leaves mode
7336 \end_layout
7338 \begin_layout Standard
7339 newline needs to close and re-open string or something
7340 \end_layout
7342 \begin_layout Standard
7343 in single-quote mode escape 
7344 \backslash
7345  and 
7346 \begin_inset Quotes eld
7347 \end_inset
7350 \end_layout
7352 \begin_layout Chunk
7353 track-mode-C
7354 \end_layout
7356 \begin_layout Standard
7357 \begin_inset listings
7358 inline false
7359 status open
7361 \begin_layout Plain Layout
7363 \end_layout
7365 \end_inset
7368 \end_layout
7370 \begin_layout Chunk
7371 mode-tracker
7372 \end_layout
7374 \begin_layout Standard
7375 \begin_inset listings
7376 inline false
7377 status open
7379 \begin_layout Plain Layout
7382 \backslash
7383 chunkref{new_mode()}>
7384 \end_layout
7386 \end_inset
7389 \end_layout
7391 \begin_layout Chapter
7392 Generating the output
7393 \end_layout
7395 \begin_layout Standard
7396 We generate output by calling output_chunk, or listing the chunk names.
7397 \end_layout
7399 \begin_layout Chunk
7400 generate-output
7401 \end_layout
7403 \begin_layout Standard
7404 \begin_inset listings
7405 inline false
7406 status open
7408 \begin_layout Plain Layout
7410 if (length(root)) output_chunk(root);
7411 \end_layout
7413 \begin_layout Plain Layout
7415 else output_chunk_names();
7416 \end_layout
7418 \end_inset
7421 \end_layout
7423 \begin_layout Standard
7424 We also have some other output debugging:
7425 \end_layout
7427 \begin_layout Chunk
7428 debug-output
7429 \end_layout
7431 \begin_layout Standard
7432 \begin_inset listings
7433 inline false
7434 status open
7436 \begin_layout Plain Layout
7438 if (debug) {
7439 \end_layout
7441 \begin_layout Plain Layout
7443   print "------ chunk names "
7444 \end_layout
7446 \begin_layout Plain Layout
7448   output_chunk_names();
7449 \end_layout
7451 \begin_layout Plain Layout
7453   print "====== chunks"
7454 \end_layout
7456 \begin_layout Plain Layout
7458   output_chunks();
7459 \end_layout
7461 \begin_layout Plain Layout
7463   print "++++++ debug"
7464 \end_layout
7466 \begin_layout Plain Layout
7468   for (a in chunks) {
7469 \end_layout
7471 \begin_layout Plain Layout
7473     print a "=" chunks[a];
7474 \end_layout
7476 \begin_layout Plain Layout
7478   }
7479 \end_layout
7481 \begin_layout Plain Layout
7484 \end_layout
7486 \end_inset
7489 \end_layout
7491 \begin_layout Standard
7492 We do both of these at the end.
7493  We also set 
7494 \begin_inset Flex CharStyle:Code
7495 status collapsed
7497 \begin_layout Plain Layout
7498 ORS=""
7499 \end_layout
7501 \end_inset
7503  because each chunklet is not necessarily a complete line, and we already
7504  added 
7505 \begin_inset Flex CharStyle:Code
7506 status collapsed
7508 \begin_layout Plain Layout
7510 \end_layout
7512 \end_inset
7514  to each input line in section 
7515 \begin_inset CommandInset ref
7516 LatexCommand ref
7517 reference "sub:ORS-chunk-text"
7519 \end_inset
7522 \end_layout
7524 \begin_layout Chunk
7526 \end_layout
7528 \begin_layout Standard
7529 \begin_inset listings
7530 inline false
7531 status open
7533 \begin_layout Plain Layout
7535 END {
7536 \end_layout
7538 \begin_layout Plain Layout
7540   =<
7541 \backslash
7542 chunkref{debug-output}>
7543 \end_layout
7545 \begin_layout Plain Layout
7547   ORS="";
7548 \end_layout
7550 \begin_layout Plain Layout
7552   =<
7553 \backslash
7554 chunkref{generate-output}>
7555 \end_layout
7557 \begin_layout Plain Layout
7560 \end_layout
7562 \end_inset
7565 \end_layout
7567 \begin_layout Standard
7568 We write chunk names like this.
7569  If we seem to be running in notangle compatibility mode, then we enclose
7570  the name like this 
7571 \begin_inset Flex CharStyle:Code
7572 status collapsed
7574 \begin_layout Plain Layout
7575 <<name>>
7576 \end_layout
7578 \end_inset
7580  the same way notangle does:
7581 \end_layout
7583 \begin_layout Chunk
7584 output_chunk_names()
7585 \end_layout
7587 \begin_layout Standard
7588 \begin_inset listings
7589 inline false
7590 status open
7592 \begin_layout Plain Layout
7594 function output_chunk_names(   c, prefix, suffix) 
7595 \end_layout
7597 \begin_layout Plain Layout
7600 \end_layout
7602 \begin_layout Plain Layout
7604   if (notangle_mode) {
7605 \end_layout
7607 \begin_layout Plain Layout
7609     prefix="<<";
7610 \end_layout
7612 \begin_layout Plain Layout
7614     suffix=">>";
7615 \end_layout
7617 \begin_layout Plain Layout
7619   }
7620 \end_layout
7622 \begin_layout Plain Layout
7624   for (c in chunk_names) {
7625 \end_layout
7627 \begin_layout Plain Layout
7629     print prefix c suffix "
7630 \backslash
7632 \end_layout
7634 \begin_layout Plain Layout
7636   }
7637 \end_layout
7639 \begin_layout Plain Layout
7642 \end_layout
7644 \end_inset
7647 \end_layout
7649 \begin_layout Standard
7650 This function would write out all chunks
7651 \end_layout
7653 \begin_layout Chunk
7654 output_chunks()
7655 \end_layout
7657 \begin_layout Standard
7658 \begin_inset listings
7659 inline false
7660 status open
7662 \begin_layout Plain Layout
7664 function output_chunks(  a) 
7665 \end_layout
7667 \begin_layout Plain Layout
7670 \end_layout
7672 \begin_layout Plain Layout
7674   for (a in chunk_names) {
7675 \end_layout
7677 \begin_layout Plain Layout
7679     output_chunk(chunk_names[a]);
7680 \end_layout
7682 \begin_layout Plain Layout
7684   }
7685 \end_layout
7687 \begin_layout Plain Layout
7690 \end_layout
7692 \begin_layout Plain Layout
7694 \end_layout
7696 \begin_layout Plain Layout
7698 function output_chunk(chunk) {
7699 \end_layout
7701 \begin_layout Plain Layout
7703   newline = 1;
7704 \end_layout
7706 \begin_layout Plain Layout
7708   lineno_needed = linenos;
7709 \end_layout
7711 \begin_layout Plain Layout
7713 \end_layout
7715 \begin_layout Plain Layout
7717   write_chunk(chunk);
7718 \end_layout
7720 \begin_layout Plain Layout
7723 \end_layout
7725 \begin_layout Plain Layout
7727 \end_layout
7729 \end_inset
7732 \end_layout
7734 \begin_layout Section
7735 Assembling the chunks
7736 \end_layout
7738 \begin_layout Standard
7739 \begin_inset Flex CharStyle:Code
7740 status collapsed
7742 \begin_layout Plain Layout
7743 chunk_path
7744 \end_layout
7746 \end_inset
7748  holds a string consisting of the names of all the chunks that resulted
7749  in this chunk being output.
7751 \begin_inset Note Note
7752 status collapsed
7754 \begin_layout Plain Layout
7755 Make sure it includes the line numbers too...
7757 \end_layout
7759 \end_inset
7761 It should probably also contain the source line numbers at which each inclusion
7762  also occured.
7763 \end_layout
7765 \begin_layout Chunk
7766 write_chunk(),emph={chunk_path}
7767 \end_layout
7769 \begin_layout Standard
7770 \begin_inset listings
7771 inline false
7772 status open
7774 \begin_layout Plain Layout
7776 function write_chunk(chunk_name, indent, tail,
7777 \end_layout
7779 \begin_layout Plain Layout
7781   # optional vars
7782 \end_layout
7784 \begin_layout Plain Layout
7786   chunk_path, chunk_args, 
7787 \end_layout
7789 \begin_layout Plain Layout
7791   # local vars
7792 \end_layout
7794 \begin_layout Plain Layout
7796   part, max_part, part_line, frag, max_frag, text, 
7797 \end_layout
7799 \begin_layout Plain Layout
7801   chunklet, only_part, call_chunk_args, mode)
7802 \end_layout
7804 \begin_layout Plain Layout
7807 \end_layout
7809 \end_inset
7812 \end_layout
7814 \begin_layout Subsection
7815 \begin_inset CommandInset label
7816 LatexCommand label
7817 name "sub:Chunk-parts"
7819 \end_inset
7821 Chunk parts
7822 \end_layout
7824 \begin_layout Standard
7825 As mentioned in section 
7826 \begin_inset CommandInset ref
7827 LatexCommand ref
7828 reference "sub:lstlistings-includes"
7830 \end_inset
7832 , a chunk name may contain a part specifier in square brackets, limiting
7833  the parts that should be emitted.
7834 \end_layout
7836 \begin_layout Standard
7837 \begin_inset listings
7838 inline false
7839 status open
7841 \begin_layout Plain Layout
7843   if (match(chunk_name, "^(.*)
7844 \backslash
7846 \backslash
7847 [([0-9]*)
7848 \backslash
7850 \backslash
7851 ]$", chunk_name_parts)) {
7852 \end_layout
7854 \begin_layout Plain Layout
7856     chunk_name = chunk_name_parts[1];
7857 \end_layout
7859 \begin_layout Plain Layout
7861     only_part = chunk_name_parts[2];
7862 \end_layout
7864 \begin_layout Plain Layout
7866   }
7867 \end_layout
7869 \end_inset
7872 \end_layout
7874 \begin_layout Standard
7875 We first create the mode tracker for this chunk.
7876 \end_layout
7878 \begin_layout Standard
7879 #  =<
7880 \backslash
7881 chunkref{awk-delete-array}(mode)>
7882 \end_layout
7884 \begin_layout Standard
7885 \begin_inset listings
7886 inline false
7887 status open
7889 \begin_layout Plain Layout
7891   split("", mode);
7892 \end_layout
7894 \begin_layout Plain Layout
7896   new_mode(chunks[chunk_name, "language"], mode);
7897 \end_layout
7899 \end_inset
7902 \end_layout
7904 \begin_layout Standard
7905 #  =<
7906 \backslash
7907 chunkref{new-mode}(chunks[chunk_name, "language"], mode)>
7908 \end_layout
7910 \begin_layout Standard
7911 We extract into 
7912 \begin_inset Flex CharStyle:Code
7913 status collapsed
7915 \begin_layout Plain Layout
7916 chunk_params
7917 \end_layout
7919 \end_inset
7921  the names of the parameters that this chunk accepts, whose values were
7922  (optionally) passed in 
7923 \begin_inset Flex CharStyle:Code
7924 status collapsed
7926 \begin_layout Plain Layout
7927 chunk_args
7928 \end_layout
7930 \end_inset
7933 \end_layout
7935 \begin_layout Standard
7936 \begin_inset listings
7937 inline false
7938 status open
7940 \begin_layout Plain Layout
7942   split(chunks[chunk_name, "params"], chunk_params, " *; *");
7943 \end_layout
7945 \end_inset
7948 \end_layout
7950 \begin_layout Standard
7951 To assemble a chunk, we write out each part.
7952 \end_layout
7954 \begin_layout Chunk
7955 write_chunk()
7956 \end_layout
7958 \begin_layout Standard
7959 \begin_inset listings
7960 inline false
7961 status open
7963 \begin_layout Plain Layout
7965   if (! (chunk_name in chunk_names)) {
7966 \end_layout
7968 \begin_layout Plain Layout
7970     error(sprintf(_"The root module <<%s>> was not defined.
7971 \backslash
7972 nUsed by: %s",
7973 \backslash
7975 \end_layout
7977 \begin_layout Plain Layout
7979                   chunk_name, chunk_path));
7980 \end_layout
7982 \begin_layout Plain Layout
7984   }
7985 \end_layout
7987 \begin_layout Plain Layout
7989 \end_layout
7991 \begin_layout Plain Layout
7993   max_part = chunks[chunk_name, "part"];
7994 \end_layout
7996 \begin_layout Plain Layout
7998   for(part = 1; part <= max_part; part++) {
7999 \end_layout
8001 \begin_layout Plain Layout
8003     if (! only_part || part == only_part) {
8004 \end_layout
8006 \begin_layout Plain Layout
8008       =<
8009 \backslash
8010 chunkref{write-part}>
8011 \end_layout
8013 \begin_layout Plain Layout
8015     }
8016 \end_layout
8018 \begin_layout Plain Layout
8020   }
8021 \end_layout
8023 \begin_layout Plain Layout
8026 \end_layout
8028 \end_inset
8031 \end_layout
8033 \begin_layout Standard
8034 A part can either be a chunklet of lines, or an include of another chunk.
8035 \end_layout
8037 \begin_layout Standard
8038 Chunks may also have parameters, specified in LaTeX style with braces after
8039  the chunk name --- looking like this in the document: 
8040 \begin_inset Flex CharStyle:Code
8041 status collapsed
8043 \begin_layout Plain Layout
8044 chunkname{param1, param2}
8045 \end_layout
8047 \end_inset
8050  Arguments are passed in square brackets: 
8051 \begin_inset Flex CharStyle:Code
8052 status collapsed
8054 \begin_layout Plain Layout
8056 \backslash
8057 chunkref{chunkname}[arg1, arg2]
8058 \end_layout
8060 \end_inset
8063 \end_layout
8065 \begin_layout Standard
8066 Before we process each part, we check that the source position hasn't changed
8067  unexpectedly, so that we can know if we need to output a new file-line
8068  directive.
8069 \end_layout
8071 \begin_layout Chunk
8072 write-part
8073 \end_layout
8075 \begin_layout Standard
8076 \begin_inset listings
8077 inline false
8078 status open
8080 \begin_layout Plain Layout
8083 \backslash
8084 chunkref{check-source-jump}>
8085 \end_layout
8087 \begin_layout Plain Layout
8089 \end_layout
8091 \begin_layout Plain Layout
8093 chunklet = chunks[chunk_name, "part", part];
8094 \end_layout
8096 \begin_layout Plain Layout
8098 if (chunks[chunk_name, "part", part, "type"] == part_type_chunk) {
8099 \end_layout
8101 \begin_layout Plain Layout
8103   =<
8104 \backslash
8105 chunkref{write-included-chunk}>
8106 \end_layout
8108 \begin_layout Plain Layout
8110 } else if (chunklet SUBSEP "line" in chunks) {
8111 \end_layout
8113 \begin_layout Plain Layout
8115   =<
8116 \backslash
8117 chunkref{write-chunklets}>
8118 \end_layout
8120 \begin_layout Plain Layout
8122 } else {
8123 \end_layout
8125 \begin_layout Plain Layout
8127   # empty last chunklet
8128 \end_layout
8130 \begin_layout Plain Layout
8133 \end_layout
8135 \end_inset
8138 \end_layout
8140 \begin_layout Standard
8141 To write an included chunk, we must detect any optional chunk arguments
8142  in parenthesis.
8143  Then we recurse calling 
8144 \begin_inset Flex Chunkref
8145 status collapsed
8147 \begin_layout Plain Layout
8148 write_chunk()
8149 \end_layout
8151 \end_inset
8154 \end_layout
8156 \begin_layout Chunk
8157 write-included-chunk
8158 \end_layout
8160 \begin_layout Standard
8161 \begin_inset listings
8162 inline false
8163 status open
8165 \begin_layout Plain Layout
8167 if (match(chunklet, "^([^
8168 \backslash
8170 \backslash
8171 []*)
8172 \backslash
8174 \backslash
8175 ((.*)
8176 \backslash
8178 \backslash
8179 )$", chunklet_parts)) {
8180 \end_layout
8182 \begin_layout Plain Layout
8184   chunklet = chunklet_parts[1];
8185 \end_layout
8187 \begin_layout Plain Layout
8189 #  parse_chunk_args(chunklet_parts[2], chunk_args);
8190 \end_layout
8192 \begin_layout Plain Layout
8194 # TO BE parse_chunk_args SOON
8195 \end_layout
8197 \begin_layout Plain Layout
8199   split(chunklet_parts[2], call_chunk_args, " *, *");
8200 \end_layout
8202 \begin_layout Plain Layout
8204   for (c in call_chunk_args) {
8205 \end_layout
8207 \begin_layout Plain Layout
8209     call_chunk_args[c] = expand_chunk_args(call_chunk_args[c], chunk_params,
8210  chunk_args);
8211 \end_layout
8213 \begin_layout Plain Layout
8215   }
8216 \end_layout
8218 \begin_layout Plain Layout
8220 } else {
8221 \end_layout
8223 \begin_layout Plain Layout
8225   split("", call_chunk_args);
8226 \end_layout
8228 \begin_layout Plain Layout
8231 \end_layout
8233 \begin_layout Plain Layout
8235 write_chunk(chunklet,
8236 \end_layout
8238 \begin_layout Plain Layout
8240             chunks[chunk_name, "part", part, "indent"] indent,
8241 \end_layout
8243 \begin_layout Plain Layout
8245             chunks[chunk_name, "part", part, "tail"],
8246 \end_layout
8248 \begin_layout Plain Layout
8250             chunk_path "
8251 \backslash
8252 n         " chunk_name,
8253 \end_layout
8255 \begin_layout Plain Layout
8257             call_chunk_args);
8258 \end_layout
8260 \end_inset
8263 \end_layout
8265 \begin_layout Standard
8266 Before we output a chunklet of lines, we first emit the file and line number
8267  if we have one, and if it is safe to do so.
8269 \end_layout
8271 \begin_layout Standard
8272 Chunklets are generally broken up by includes, so the start of a chunklet
8273  is a good place to do this.
8274  Then we output each line of the chunklet.
8275 \end_layout
8277 \begin_layout Standard
8278 When it is not safe, such as in the middle of a multi-line macro definition,
8280 \begin_inset Flex CharStyle:Code
8281 status collapsed
8283 \begin_layout Plain Layout
8284 lineno_suppressed
8285 \end_layout
8287 \end_inset
8289  is set to true, and in such a case we note that we want to emit the line
8290  statement when it is next safe.
8291 \end_layout
8293 \begin_layout Chunk
8294 write-chunklets
8295 \end_layout
8297 \begin_layout Standard
8298 \begin_inset listings
8299 inline false
8300 status open
8302 \begin_layout Plain Layout
8304 max_frag = chunks[chunklet, "line"];
8305 \end_layout
8307 \begin_layout Plain Layout
8309 for(frag = 1; frag <= max_frag; frag++) {
8310 \end_layout
8312 \begin_layout Plain Layout
8314   =<
8315 \backslash
8316 chunkref{write-file-line}>
8317 \end_layout
8319 \end_inset
8322 \end_layout
8324 \begin_layout Standard
8325 We then extract the chunklet text and expand any arguments.
8326 \end_layout
8328 \begin_layout Standard
8329 \begin_inset listings
8330 inline false
8331 status open
8333 \begin_layout Plain Layout
8335 \end_layout
8337 \begin_layout Plain Layout
8339   text = chunks[chunklet, frag];
8340 \end_layout
8342 \begin_layout Plain Layout
8345 \end_layout
8347 \begin_layout Plain Layout
8349   /* check params */
8350 \end_layout
8352 \begin_layout Plain Layout
8354   text = expand_chunk_args(text, chunk_params, chunk_args);
8355 \end_layout
8357 \end_inset
8360 \end_layout
8362 \begin_layout Standard
8363 If the text is a single newline (which we keep separate - see 
8364 \begin_inset CommandInset ref
8365 LatexCommand ref
8366 reference "lone-newline"
8368 \end_inset
8370 ) then we increment the line number.
8371  In the case where this is the last line of a chunk and it is not a top-level
8372  chunk we replace the newline with an empty string --- because the chunk
8373  that included this chunk will have the newline at the end of the line that
8374  included this chunk.
8375 \end_layout
8377 \begin_layout Standard
8378 We also note by 
8379 \begin_inset Flex CharStyle:Code
8380 status collapsed
8382 \begin_layout Plain Layout
8383 newline = 1
8384 \end_layout
8386 \end_inset
8388  that we have started a new line, so that indentation can be managed with
8389  the following piece of text.
8390 \end_layout
8392 \begin_layout Standard
8393 \begin_inset listings
8394 inline false
8395 status open
8397 \begin_layout Plain Layout
8399 \end_layout
8401 \begin_layout Plain Layout
8403  if (text == "
8404 \backslash
8405 n") {
8406 \end_layout
8408 \begin_layout Plain Layout
8410     lineno++;
8411 \end_layout
8413 \begin_layout Plain Layout
8415     if (part == max_part && frag == max_frag && length(chunk_path)) {
8416 \end_layout
8418 \begin_layout Plain Layout
8420       text = "";
8421 \end_layout
8423 \begin_layout Plain Layout
8425       break;
8426 \end_layout
8428 \begin_layout Plain Layout
8430     } else {
8431 \end_layout
8433 \begin_layout Plain Layout
8435       newline = 1;
8436 \end_layout
8438 \begin_layout Plain Layout
8440     }
8441 \end_layout
8443 \end_inset
8446 \end_layout
8448 \begin_layout Standard
8449 If this text does not represent a newline, but we see that we are the first
8450  piece of text on a newline, then we prefix our text with the current indent.
8451  NOTE: 
8452 \begin_inset Flex CharStyle:Code
8453 status collapsed
8455 \begin_layout Plain Layout
8456 newline
8457 \end_layout
8459 \end_inset
8461  is a global output-state variable, but the 
8462 \begin_inset Flex CharStyle:Code
8463 status collapsed
8465 \begin_layout Plain Layout
8466 indent
8467 \end_layout
8469 \end_inset
8471  is not.
8473 \end_layout
8475 \begin_layout Standard
8476 \begin_inset listings
8477 inline false
8478 status open
8480 \begin_layout Plain Layout
8482   } else {
8483 \end_layout
8485 \begin_layout Plain Layout
8487     if (newline) text = indent text;
8488 \end_layout
8490 \begin_layout Plain Layout
8492     newline = 0;
8493 \end_layout
8495 \begin_layout Plain Layout
8497   }
8498 \end_layout
8500 \begin_layout Plain Layout
8502 \end_layout
8504 \end_inset
8507 \end_layout
8509 \begin_layout Standard
8510 Tail will soon no longer be relevant once mode-detection is in place.
8511 \end_layout
8513 \begin_layout Standard
8514 \begin_inset listings
8515 inline false
8516 status open
8518 \begin_layout Plain Layout
8520   text = text tail;
8521 \end_layout
8523 \begin_layout Plain Layout
8525 #  track_mode(mode, text);
8526 \end_layout
8528 \begin_layout Plain Layout
8530   print text;
8531 \end_layout
8533 \end_inset
8536 \end_layout
8538 \begin_layout Standard
8539 If a line ends in a backslash --- suggesting continuation --- then we supress
8540  outputting file-line as it would probably break the continued lines.
8542 \end_layout
8544 \begin_layout Standard
8545 \begin_inset listings
8546 inline false
8547 status open
8549 \begin_layout Plain Layout
8551   if (linenos) {
8552 \end_layout
8554 \begin_layout Plain Layout
8556     lineno_suppressed = substr(lastline, length(lastline)) == "
8557 \backslash
8559 \backslash
8561 \end_layout
8563 \begin_layout Plain Layout
8565   }
8566 \end_layout
8568 \begin_layout Plain Layout
8571 \end_layout
8573 \end_inset
8576 \end_layout
8578 \begin_layout Standard
8579 Of course there is no point in actually outputting the source filename and
8580  line number (file-line) if they don't say anything new! We only need to
8581  emit them if they aren't what is expected, or if we we not able to emit
8582  one when they had changed.
8583 \end_layout
8585 \begin_layout Chunk
8586 write-file-line
8587 \end_layout
8589 \begin_layout Standard
8590 \begin_inset listings
8591 inline false
8592 status open
8594 \begin_layout Plain Layout
8596 if (newline && lineno_needed && ! lineno_suppressed) {
8597 \end_layout
8599 \begin_layout Plain Layout
8601   filename = a_filename;
8602 \end_layout
8604 \begin_layout Plain Layout
8606   lineno = a_lineno;
8607 \end_layout
8609 \begin_layout Plain Layout
8611   print "#line " lineno " 
8612 \backslash
8613 "" filename "
8614 \backslash
8616 \backslash
8618 \end_layout
8620 \begin_layout Plain Layout
8622   lineno_needed = 0;
8623 \end_layout
8625 \begin_layout Plain Layout
8628 \end_layout
8630 \end_inset
8633 \end_layout
8635 \begin_layout Standard
8636 We check if a new file-line is needed by checking if the source line matches
8637  what we (or a compiler) would expect.
8639 \end_layout
8641 \begin_layout Chunk
8642 check-source-jump
8643 \end_layout
8645 \begin_layout Standard
8646 \begin_inset listings
8647 inline false
8648 status open
8650 \begin_layout Plain Layout
8652 if (linenos && (chunk_name SUBSEP "part" SUBSEP part SUBSEP "FILENAME" in
8653  chunks)) {
8654 \end_layout
8656 \begin_layout Plain Layout
8658   a_filename = chunks[chunk_name, "part", part, "FILENAME"];
8659 \end_layout
8661 \begin_layout Plain Layout
8663   a_lineno = chunks[chunk_name, "part", part, "LINENO"];
8664 \end_layout
8666 \begin_layout Plain Layout
8668   if (a_filename != filename || a_lineno != lineno) {
8669 \end_layout
8671 \begin_layout Plain Layout
8673     lineno_needed++;
8674 \end_layout
8676 \begin_layout Plain Layout
8678   }
8679 \end_layout
8681 \begin_layout Plain Layout
8684 \end_layout
8686 \end_inset
8689 \end_layout
8691 \begin_layout Chapter
8692 Storing chunks
8693 \end_layout
8695 \begin_layout Standard
8696 Awk has pretty limited data structures, so we will use two main hashes.
8697  Uninterrupted sequences of a chunk will be stored in 
8698 \begin_inset Flex CharStyle:Code
8699 status collapsed
8701 \begin_layout Plain Layout
8702 chunklets
8703 \end_layout
8705 \end_inset
8707  and the chunklets used in a chunk will be stored in 
8708 \begin_inset Flex CharStyle:Code
8709 status collapsed
8711 \begin_layout Plain Layout
8712 chunks
8713 \end_layout
8715 \end_inset
8718 \end_layout
8720 \begin_layout Chunk
8721 constants
8722 \end_layout
8724 \begin_layout Standard
8725 \begin_inset listings
8726 inline false
8727 status open
8729 \begin_layout Plain Layout
8731 part_type_chunk=1;
8732 \end_layout
8734 \end_inset
8737 \end_layout
8739 \begin_layout Standard
8740 The 
8741 \begin_inset Flex CharStyle:Code
8742 status collapsed
8744 \begin_layout Plain Layout
8745 params
8746 \end_layout
8748 \end_inset
8750  mentioned are not chunk parameters for parameterized chunks, as mentioned
8751  in 
8752 \begin_inset CommandInset ref
8753 LatexCommand ref
8754 reference "cha:Chunk Arguments"
8756 \end_inset
8758 , but the lstlistings style parameters used in the 
8759 \begin_inset Flex CharStyle:Code
8760 status collapsed
8762 \begin_layout Plain Layout
8764 \backslash
8765 Chunk
8766 \end_layout
8768 \end_inset
8770  command
8771 \begin_inset Foot
8772 status collapsed
8774 \begin_layout Plain Layout
8775 The 
8776 \begin_inset Flex CharStyle:Code
8777 status collapsed
8779 \begin_layout Plain Layout
8780 params
8781 \end_layout
8783 \end_inset
8785  parameter is used to hold the parameters for parameterized chunks
8786 \end_layout
8788 \end_inset
8791 \end_layout
8793 \begin_layout Chunk
8794 chunk-storage-functions
8795 \end_layout
8797 \begin_layout Standard
8798 \begin_inset listings
8799 inline false
8800 status open
8802 \begin_layout Plain Layout
8804 function new_chunk(chunk_name, params,
8805 \end_layout
8807 \begin_layout Plain Layout
8809   # local vars
8810 \end_layout
8812 \begin_layout Plain Layout
8814   p )
8815 \end_layout
8817 \begin_layout Plain Layout
8820 \end_layout
8822 \begin_layout Plain Layout
8824   # HACK WHILE WE CHANGE TO ( ) for PARAM CHUNKS
8825 \end_layout
8827 \begin_layout Plain Layout
8829   gsub("
8830 \backslash
8832 \backslash
8834 \backslash
8836 \backslash
8837 )$", "", chunk_name);
8838 \end_layout
8840 \begin_layout Plain Layout
8842   active_chunk = chunk_name;
8843 \end_layout
8845 \begin_layout Plain Layout
8847   if (! (chunk_name in chunk_names)) {
8848 \end_layout
8850 \begin_layout Plain Layout
8852     if (debug) print "New chunk " chunk_name;
8853 \end_layout
8855 \begin_layout Plain Layout
8857     chunk_names[chunk_name];
8858 \end_layout
8860 \begin_layout Plain Layout
8862     for (p in params) {
8863 \end_layout
8865 \begin_layout Plain Layout
8867       chunks[chunk_name, p] = params[p];
8868 \end_layout
8870 \begin_layout Plain Layout
8872     }
8873 \end_layout
8875 \begin_layout Plain Layout
8877   }
8878 \end_layout
8880 \begin_layout Plain Layout
8882   prime_chunk(chunk_name);
8883 \end_layout
8885 \begin_layout Plain Layout
8888 \end_layout
8890 \end_inset
8893 \end_layout
8895 \begin_layout Standard
8896 \begin_inset listings
8897 inline false
8898 status open
8900 \begin_layout Plain Layout
8902 \end_layout
8904 \begin_layout Plain Layout
8906 function prime_chunk(chunk_name)
8907 \end_layout
8909 \begin_layout Plain Layout
8912 \end_layout
8914 \begin_layout Plain Layout
8916   chunks[chunk_name, "part", ++chunks[chunk_name, "part"] ] = 
8917 \backslash
8919 \end_layout
8921 \begin_layout Plain Layout
8923          chunk_name SUBSEP "chunklet" SUBSEP "" ++chunks[chunk_name, "chunklet"]
8925 \end_layout
8927 \begin_layout Plain Layout
8929   chunks[chunk_name, "part", chunks[chunk_name, "part"], "FILENAME"] = FILENAME;
8930 \end_layout
8932 \begin_layout Plain Layout
8934   chunks[chunk_name, "part", chunks[chunk_name, "part"], "LINENO"] = FNR
8935  + 1;
8936 \end_layout
8938 \begin_layout Plain Layout
8941 \end_layout
8943 \begin_layout Plain Layout
8945 \end_layout
8947 \begin_layout Plain Layout
8949 function chunk_line(chunk_name, line){
8950 \end_layout
8952 \begin_layout Plain Layout
8954   chunks[chunk_name, "chunklet", chunks[chunk_name, "chunklet"],
8955 \end_layout
8957 \begin_layout Plain Layout
8959          ++chunks[chunk_name, "chunklet", chunks[chunk_name, "chunklet"],
8960  "line"]  ] = line;
8961 \end_layout
8963 \begin_layout Plain Layout
8966 \end_layout
8968 \begin_layout Plain Layout
8970 \end_layout
8972 \end_inset
8975 \end_layout
8977 \begin_layout Standard
8978 Chunk include represents a 
8979 \emph on
8980 chunkref
8981 \emph default
8982  statement, and stores the requirement to include another chunk.
8983  The parameter indent represents the quanity of literal text characters
8984  that preceded this 
8985 \emph on
8986 chunkref
8987 \emph default
8988  statement and therefore by how much additional lines of the included chunk
8989  should be indented.
8990 \end_layout
8992 \begin_layout Standard
8993 \begin_inset listings
8994 inline false
8995 status open
8997 \begin_layout Plain Layout
8999 function chunk_include(chunk_name, chunk_ref, indent, tail)
9000 \end_layout
9002 \begin_layout Plain Layout
9005 \end_layout
9007 \begin_layout Plain Layout
9009   chunks[chunk_name, "part", ++chunks[chunk_name, "part"] ] = chunk_ref;
9010 \end_layout
9012 \begin_layout Plain Layout
9014   chunks[chunk_name, "part", chunks[chunk_name, "part"], "type" ] = part_type_ch
9015 unk;
9016 \end_layout
9018 \begin_layout Plain Layout
9020   chunks[chunk_name, "part", chunks[chunk_name, "part"], "indent" ] = indent_str
9021 ing(indent);
9022 \end_layout
9024 \begin_layout Plain Layout
9026   chunks[chunk_name, "part", chunks[chunk_name, "part"], "tail" ] = tail;
9027 \end_layout
9029 \begin_layout Plain Layout
9031   prime_chunk(chunk_name);
9032 \end_layout
9034 \begin_layout Plain Layout
9037 \end_layout
9039 \begin_layout Plain Layout
9041 \end_layout
9043 \end_inset
9046 \end_layout
9048 \begin_layout Standard
9049 The indent is calculated by indent_string, which may in future convert some
9050  spaces into tab characters.
9051  This function works by generating a printf padded format string, like 
9052 \begin_inset Flex CharStyle:Code
9053 status collapsed
9055 \begin_layout Plain Layout
9056 %22s
9057 \end_layout
9059 \end_inset
9061  for an indent of 22, and then printing an empty string using that format.
9062 \end_layout
9064 \begin_layout Standard
9065 \begin_inset listings
9066 inline false
9067 status open
9069 \begin_layout Plain Layout
9071 function indent_string(indent) {
9072 \end_layout
9074 \begin_layout Plain Layout
9076   return sprintf("%" indent "s", "");
9077 \end_layout
9079 \begin_layout Plain Layout
9082 \end_layout
9084 \end_inset
9087 \end_layout
9089 \begin_layout Chapter
9090 \begin_inset CommandInset label
9091 LatexCommand label
9092 name "cha:getopt"
9094 \end_inset
9096 getopt
9097 \end_layout
9099 \begin_layout Standard
9100 I use Arnold Robbins public domain getopt (1993 revision).
9101  This is probably the same one that is covered in chapter 12 of 
9102 \begin_inset Quotes eld
9103 \end_inset
9105 Edition 3 of GAWK: Effective AWK Programming: A User's Guide for GNU Awk
9106 \begin_inset Quotes erd
9107 \end_inset
9109  but as that is licensed under the GNU Free Documentation License, Version
9110  1.3, which conflicts with the GPL3, I can't use it from there (or it's accompany
9111 ing explanations), so I do my best to explain how it works here.
9112 \end_layout
9114 \begin_layout Standard
9115 The getopt.awk header is:
9116 \end_layout
9118 \begin_layout Chunk
9119 getopt.awk-header,language=awk,morestring=[b]{/},morekeywords=else
9120 \end_layout
9122 \begin_layout Standard
9123 \begin_inset listings
9124 inline false
9125 status open
9127 \begin_layout Plain Layout
9129 # getopt.awk --- do C library getopt(3) function in awk
9130 \end_layout
9132 \begin_layout Plain Layout
9135 \end_layout
9137 \begin_layout Plain Layout
9139 # Arnold Robbins, arnold@skeeve.com, Public Domain
9140 \end_layout
9142 \begin_layout Plain Layout
9145 \end_layout
9147 \begin_layout Plain Layout
9149 # Initial version: March, 1991
9150 \end_layout
9152 \begin_layout Plain Layout
9154 # Revised: May, 1993
9155 \end_layout
9157 \end_inset
9160 \end_layout
9162 \begin_layout Standard
9163 The provided explanation is:
9164 \end_layout
9166 \begin_layout Chunk
9167 getopt.awk-notes
9168 \end_layout
9170 \begin_layout Standard
9171 \begin_inset listings
9172 inline false
9173 status open
9175 \begin_layout Plain Layout
9177 # External variables:
9178 \end_layout
9180 \begin_layout Plain Layout
9182 #    Optind -- index in ARGV of first nonoption argument
9183 \end_layout
9185 \begin_layout Plain Layout
9187 #    Optarg -- string value of argument to current option
9188 \end_layout
9190 \begin_layout Plain Layout
9192 #    Opterr -- if nonzero, print our own diagnostic
9193 \end_layout
9195 \begin_layout Plain Layout
9197 #    Optopt -- current option letter
9198 \end_layout
9200 \begin_layout Plain Layout
9202 \end_layout
9204 \begin_layout Plain Layout
9206 # Returns:
9207 \end_layout
9209 \begin_layout Plain Layout
9211 #    -1     at end of options
9212 \end_layout
9214 \begin_layout Plain Layout
9216 #    ?      for unrecognized option
9217 \end_layout
9219 \begin_layout Plain Layout
9221 #    <c>    a character representing the current option
9222 \end_layout
9224 \begin_layout Plain Layout
9226 \end_layout
9228 \begin_layout Plain Layout
9230 # Private Data:
9231 \end_layout
9233 \begin_layout Plain Layout
9235 #    _opti  -- index in multi-flag option, e.g., -abc
9236 \end_layout
9238 \end_inset
9241 \end_layout
9243 \begin_layout Standard
9244 The function follows.
9245  The final two parameters, 
9246 \begin_inset Flex CharStyle:Code
9247 status collapsed
9249 \begin_layout Plain Layout
9250 thisopt
9251 \end_layout
9253 \end_inset
9255  and 
9256 \begin_inset Flex CharStyle:Code
9257 status collapsed
9259 \begin_layout Plain Layout
9261 \end_layout
9263 \end_inset
9265  are local variables and not parameters --- as indicated by the multiple
9266  spaces preceding them.
9267  Awk doesn't care, the multiple spaces are a convention to help us humans.
9268 \end_layout
9270 \begin_layout Chunk
9271 getopt.awk-getopt()
9272 \end_layout
9274 \begin_layout Standard
9275 \begin_inset listings
9276 inline false
9277 status open
9279 \begin_layout Plain Layout
9281 function getopt(argc, argv, options,    thisopt, i)
9282 \end_layout
9284 \begin_layout Plain Layout
9287 \end_layout
9289 \begin_layout Plain Layout
9291     if (length(options) == 0)    # no options given
9292 \end_layout
9294 \begin_layout Plain Layout
9296         return -1
9297 \end_layout
9299 \begin_layout Plain Layout
9301     if (argv[Optind] == "--") {  # all done
9302 \end_layout
9304 \begin_layout Plain Layout
9306         Optind++
9307 \end_layout
9309 \begin_layout Plain Layout
9311         _opti = 0
9312 \end_layout
9314 \begin_layout Plain Layout
9316         return -1
9317 \end_layout
9319 \begin_layout Plain Layout
9321     } else if (argv[Optind] !~ /^-[^: 
9322 \backslash
9324 \backslash
9326 \backslash
9328 \backslash
9330 \backslash
9332 \backslash
9333 b]/) {
9334 \end_layout
9336 \begin_layout Plain Layout
9338         _opti = 0
9339 \end_layout
9341 \begin_layout Plain Layout
9343         return -1
9344 \end_layout
9346 \begin_layout Plain Layout
9348     }
9349 \end_layout
9351 \begin_layout Plain Layout
9353     if (_opti == 0)
9354 \end_layout
9356 \begin_layout Plain Layout
9358         _opti = 2
9359 \end_layout
9361 \begin_layout Plain Layout
9363     thisopt = substr(argv[Optind], _opti, 1)
9364 \end_layout
9366 \begin_layout Plain Layout
9368     Optopt = thisopt
9369 \end_layout
9371 \begin_layout Plain Layout
9373     i = index(options, thisopt)
9374 \end_layout
9376 \begin_layout Plain Layout
9378     if (i == 0) {
9379 \end_layout
9381 \begin_layout Plain Layout
9383         if (Opterr)
9384 \end_layout
9386 \begin_layout Plain Layout
9388             printf("%c -- invalid option
9389 \backslash
9391 \end_layout
9393 \begin_layout Plain Layout
9395                                   thisopt) > "/dev/stderr"
9396 \end_layout
9398 \begin_layout Plain Layout
9400         if (_opti >= length(argv[Optind])) {
9401 \end_layout
9403 \begin_layout Plain Layout
9405             Optind++
9406 \end_layout
9408 \begin_layout Plain Layout
9410             _opti = 0
9411 \end_layout
9413 \begin_layout Plain Layout
9415         } else
9416 \end_layout
9418 \begin_layout Plain Layout
9420             _opti++
9421 \end_layout
9423 \begin_layout Plain Layout
9425         return "?"
9426 \end_layout
9428 \begin_layout Plain Layout
9430     }
9431 \end_layout
9433 \end_inset
9436 \end_layout
9438 \begin_layout Standard
9439 At this point, the option has been found and we need to know if it takes
9440  any arguments.
9441 \end_layout
9443 \begin_layout Standard
9444 \begin_inset listings
9445 inline false
9446 status open
9448 \begin_layout Plain Layout
9450     if (substr(options, i + 1, 1) == ":") {
9451 \end_layout
9453 \begin_layout Plain Layout
9455         # get option argument
9456 \end_layout
9458 \begin_layout Plain Layout
9460         if (length(substr(argv[Optind], _opti + 1)) > 0)
9461 \end_layout
9463 \begin_layout Plain Layout
9465             Optarg = substr(argv[Optind], _opti + 1)
9466 \end_layout
9468 \begin_layout Plain Layout
9470         else
9471 \end_layout
9473 \begin_layout Plain Layout
9475             Optarg = argv[++Optind]
9476 \end_layout
9478 \begin_layout Plain Layout
9480         _opti = 0
9481 \end_layout
9483 \begin_layout Plain Layout
9485     } else
9486 \end_layout
9488 \begin_layout Plain Layout
9490         Optarg = ""
9491 \end_layout
9493 \begin_layout Plain Layout
9495     if (_opti == 0 || _opti >= length(argv[Optind])) {
9496 \end_layout
9498 \begin_layout Plain Layout
9500         Optind++
9501 \end_layout
9503 \begin_layout Plain Layout
9505         _opti = 0
9506 \end_layout
9508 \begin_layout Plain Layout
9510     } else
9511 \end_layout
9513 \begin_layout Plain Layout
9515         _opti++
9516 \end_layout
9518 \begin_layout Plain Layout
9520     return thisopt
9521 \end_layout
9523 \begin_layout Plain Layout
9526 \end_layout
9528 \end_inset
9530 A test program is built in, too
9531 \end_layout
9533 \begin_layout Chunk
9534 getopt.awk-begin
9535 \end_layout
9537 \begin_layout Standard
9538 \begin_inset listings
9539 inline false
9540 status open
9542 \begin_layout Plain Layout
9544 BEGIN {
9545 \end_layout
9547 \begin_layout Plain Layout
9549     Opterr = 1    # default is to diagnose
9550 \end_layout
9552 \begin_layout Plain Layout
9554     Optind = 1    # skip ARGV[0]
9555 \end_layout
9557 \begin_layout Plain Layout
9559     # test program
9560 \end_layout
9562 \begin_layout Plain Layout
9564     if (_getopt_test) {
9565 \end_layout
9567 \begin_layout Plain Layout
9569         while ((_go_c = getopt(ARGC, ARGV, "ab:cd")) != -1)
9570 \end_layout
9572 \begin_layout Plain Layout
9574             printf("c = <%c>, optarg = <%s>
9575 \backslash
9577 \end_layout
9579 \begin_layout Plain Layout
9581                                        _go_c, Optarg)
9582 \end_layout
9584 \begin_layout Plain Layout
9586         printf("non-option arguments:
9587 \backslash
9589 \end_layout
9591 \begin_layout Plain Layout
9593         for (; Optind < ARGC; Optind++)
9594 \end_layout
9596 \begin_layout Plain Layout
9598             printf("
9599 \backslash
9600 tARGV[%d] = <%s>
9601 \backslash
9603 \end_layout
9605 \begin_layout Plain Layout
9607                                     Optind, ARGV[Optind])
9608 \end_layout
9610 \begin_layout Plain Layout
9612     }
9613 \end_layout
9615 \begin_layout Plain Layout
9618 \end_layout
9620 \end_inset
9623 \end_layout
9625 \begin_layout Standard
9626 The entire getopt.awk is made out of these chunks in order
9627 \end_layout
9629 \begin_layout Chunk
9630 getopt.awk
9631 \end_layout
9633 \begin_layout Standard
9634 \begin_inset listings
9635 inline false
9636 status open
9638 \begin_layout Plain Layout
9641 \backslash
9642 chunkref{getopt.awk-header}>
9643 \end_layout
9645 \begin_layout Plain Layout
9647 \end_layout
9649 \begin_layout Plain Layout
9652 \backslash
9653 chunkref{getopt.awk-notes}>
9654 \end_layout
9656 \begin_layout Plain Layout
9659 \backslash
9660 chunkref{getopt.awk-getopt()}>
9661 \end_layout
9663 \begin_layout Plain Layout
9666 \backslash
9667 chunkref{getopt.awk-begin}>
9668 \end_layout
9670 \end_inset
9673 \end_layout
9675 \begin_layout Standard
9676 Although we only want the header and function:
9677 \end_layout
9679 \begin_layout Chunk
9680 getopt
9681 \end_layout
9683 \begin_layout Standard
9684 \begin_inset listings
9685 inline false
9686 status open
9688 \begin_layout Plain Layout
9690 # try: locate getopt.awk for the full original file
9691 \end_layout
9693 \begin_layout Plain Layout
9695 # as part of your standard awk installation
9696 \end_layout
9698 \begin_layout Plain Layout
9701 \backslash
9702 chunkref{getopt.awk-header}>
9703 \end_layout
9705 \begin_layout Plain Layout
9707 \end_layout
9709 \begin_layout Plain Layout
9712 \backslash
9713 chunkref{getopt.awk-getopt()}>
9714 \end_layout
9716 \end_inset
9719 \end_layout
9721 \begin_layout Chapter
9722 Newfangle LaTeX source code
9723 \end_layout
9725 \begin_layout Section
9726 newfangle module
9727 \end_layout
9729 \begin_layout Standard
9730 Here we define a Lyx .module file that makes it convenient to use LyX for
9731  writing such literate programs.
9732 \end_layout
9734 \begin_layout Standard
9735 This file 
9736 \begin_inset Flex CharStyle:Code
9737 status collapsed
9739 \begin_layout Plain Layout
9740 ./newfangle.module
9741 \end_layout
9743 \end_inset
9745  can be installed in your personal 
9746 \begin_inset Flex CharStyle:Code
9747 status collapsed
9749 \begin_layout Plain Layout
9750 .lyx/layouts folder
9751 \end_layout
9753 \end_inset
9756  You will need to Tools Reconfigure so that LyX notices it.
9757  It adds a new format Chunk, which should precede every listing and contain
9758  the chunk name.
9760 \end_layout
9762 \begin_layout Chunk
9763 ./newfangle.module,language=
9764 \end_layout
9766 \begin_layout Standard
9767 \begin_inset listings
9768 inline false
9769 status open
9771 \begin_layout Plain Layout
9774 \backslash
9775 DeclareLyXModule{Newfangle Literate Listings}
9776 \end_layout
9778 \begin_layout Plain Layout
9780 #DescriptionBegin
9781 \end_layout
9783 \begin_layout Plain Layout
9785 #  Newfangle literate listings allow one to write
9786 \end_layout
9788 \begin_layout Plain Layout
9790 #   literate programs after the fashion of noweb, but without having
9791 \end_layout
9793 \begin_layout Plain Layout
9795 #   to use noweave to generate the documentation.
9796  Instead the listings
9797 \end_layout
9799 \begin_layout Plain Layout
9801 #   package is extended in conjunction with the noweb package to implement
9802 \end_layout
9804 \begin_layout Plain Layout
9806 #   to code formating directly as latex.
9807 \end_layout
9809 \begin_layout Plain Layout
9811 #  The newfangle awk script
9812 \end_layout
9814 \begin_layout Plain Layout
9816 #DescriptionEnd
9817 \end_layout
9819 \begin_layout Plain Layout
9821 \end_layout
9823 \begin_layout Plain Layout
9825 Format 11
9826 \end_layout
9828 \begin_layout Plain Layout
9830 \end_layout
9832 \begin_layout Plain Layout
9834 AddToPreamble
9835 \end_layout
9837 \begin_layout Plain Layout
9840 \backslash
9841 chunkref{./newfangle.sty}>
9842 \end_layout
9844 \begin_layout Plain Layout
9846 EndPreamble
9847 \end_layout
9849 \begin_layout Plain Layout
9851 \end_layout
9853 \begin_layout Plain Layout
9856 \backslash
9857 chunkref{chunkstyle}>
9858 \end_layout
9860 \begin_layout Plain Layout
9862 \end_layout
9864 \begin_layout Plain Layout
9867 \backslash
9868 chunkref{chunkref}>
9869 \end_layout
9871 \end_inset
9874 \end_layout
9876 \begin_layout Subsection
9877 The Chunk style
9878 \end_layout
9880 \begin_layout Standard
9881 The purpose of the 
9882 \noun on
9883 chunk
9884 \noun default
9885  style is to make it easier for LyX users to provide the name to 
9886 \begin_inset Flex CharStyle:Code
9887 status collapsed
9889 \begin_layout Plain Layout
9891 \backslash
9892 lstlistings
9893 \end_layout
9895 \end_inset
9898  Normally this requires right-clicking on the listing, choosing settings,
9899  advanced, and then typing 
9900 \begin_inset Flex CharStyle:Code
9901 status collapsed
9903 \begin_layout Plain Layout
9904 name=chunk-name
9905 \end_layout
9907 \end_inset
9910  This has the further disadvantage that the name (and other options) are
9911  not generally visible during document editing.
9912 \end_layout
9914 \begin_layout Standard
9915 The chunk style is defined as a LaTeX command, so that all text on the same
9916  line is passed to the LaTeX command 
9917 \begin_inset Flex CharStyle:Code
9918 status collapsed
9920 \begin_layout Plain Layout
9921 Chunk
9922 \end_layout
9924 \end_inset
9927  This makes it easy to parse using 
9928 \begin_inset Flex CharStyle:Code
9929 status collapsed
9931 \begin_layout Plain Layout
9932 newfangle
9933 \end_layout
9935 \end_inset
9937 , and easy to pass these options on to the listings package.
9938  The first word in a chunk section should be the chunk name, and will have
9940 \begin_inset Flex CharStyle:Code
9941 status collapsed
9943 \begin_layout Plain Layout
9944 name=
9945 \end_layout
9947 \end_inset
9949  prepended to it.
9950  Any other words are accepted arguments to 
9951 \begin_inset Flex CharStyle:Code
9952 status collapsed
9954 \begin_layout Plain Layout
9956 \backslash
9957 lstset
9958 \end_layout
9960 \end_inset
9963 \end_layout
9965 \begin_layout Standard
9966 We set PassThru to 1 because the user is actually entering raw latex.
9967 \end_layout
9969 \begin_layout Chunk
9970 chunkstyle
9971 \end_layout
9973 \begin_layout Standard
9974 \begin_inset listings
9975 inline false
9976 status open
9978 \begin_layout Plain Layout
9980 Style Chunk
9981 \end_layout
9983 \begin_layout Plain Layout
9985   LatexType             Command
9986 \end_layout
9988 \begin_layout Plain Layout
9990   LatexName             Chunk
9991 \end_layout
9993 \begin_layout Plain Layout
9995   Margin                First_Dynamic
9996 \end_layout
9998 \begin_layout Plain Layout
10000   LeftMargin            Chunk:xxx
10001 \end_layout
10003 \begin_layout Plain Layout
10005   LabelSep              xx
10006 \end_layout
10008 \begin_layout Plain Layout
10010   LabelType             Static
10011 \end_layout
10013 \begin_layout Plain Layout
10015   LabelString           "Chunk:"
10016 \end_layout
10018 \begin_layout Plain Layout
10020   Align                 Left
10021 \end_layout
10023 \begin_layout Plain Layout
10025   PassThru              1
10026 \end_layout
10028 \begin_layout Plain Layout
10030 \end_layout
10032 \end_inset
10035 \end_layout
10037 \begin_layout Standard
10038 To make the label very visible we choose a larger font coloured red.
10039 \end_layout
10041 \begin_layout Standard
10042 \begin_inset listings
10043 inline false
10044 status open
10046 \begin_layout Plain Layout
10048   LabelFont
10049 \end_layout
10051 \begin_layout Plain Layout
10053     Family              Sans
10054 \end_layout
10056 \begin_layout Plain Layout
10058     Size                Large
10059 \end_layout
10061 \begin_layout Plain Layout
10063     Series              Bold
10064 \end_layout
10066 \begin_layout Plain Layout
10068     Shape               Italic
10069 \end_layout
10071 \begin_layout Plain Layout
10073     Color               red
10074 \end_layout
10076 \begin_layout Plain Layout
10078   EndFont
10079 \end_layout
10081 \begin_layout Plain Layout
10084 \end_layout
10086 \end_inset
10089 \end_layout
10091 \begin_layout Subsection
10092 The chunkref style
10093 \end_layout
10095 \begin_layout Standard
10096 We also define the Chunkref style which can be used to express cross references
10097  to chunks.
10098 \end_layout
10100 \begin_layout Chunk
10101 chunkref
10102 \end_layout
10104 \begin_layout Standard
10105 \begin_inset listings
10106 inline false
10107 status open
10109 \begin_layout Plain Layout
10111 InsetLayout Chunkref
10112 \end_layout
10114 \begin_layout Plain Layout
10116   LyxType               charstyle
10117 \end_layout
10119 \begin_layout Plain Layout
10121   LatexType             Command
10122 \end_layout
10124 \begin_layout Plain Layout
10126   LatexName             chunkref
10127 \end_layout
10129 \begin_layout Plain Layout
10131   PassThru              1
10132 \end_layout
10134 \begin_layout Plain Layout
10136   LabelFont             
10137 \end_layout
10139 \begin_layout Plain Layout
10141     Shape               Italic
10142 \end_layout
10144 \begin_layout Plain Layout
10146     Color               red
10147 \end_layout
10149 \begin_layout Plain Layout
10151   EndFont
10152 \end_layout
10154 \begin_layout Plain Layout
10157 \end_layout
10159 \end_inset
10162 \end_layout
10164 \begin_layout Section
10165 \begin_inset CommandInset label
10166 LatexCommand label
10167 name "sec:Latex-Macros"
10169 \end_inset
10171 Latex Macros
10172 \end_layout
10174 \begin_layout Standard
10175 We require the 
10176 \noun on
10177 listings
10178 \noun default
10180 \noun on
10181 noweb
10182 \noun default
10183  and 
10184 \noun on
10185 xargs
10186 \noun default
10187  packages.
10188  As noweb defines it's own 
10189 \begin_inset Flex CharStyle:Code
10190 status collapsed
10192 \begin_layout Plain Layout
10194 \backslash
10195 code
10196 \end_layout
10198 \end_inset
10200  environment, we re-define the one that LyX logical markup module expects
10201  here.
10202 \end_layout
10204 \begin_layout Chunk
10205 ./newfangle.sty,language=tex,basicstyle=
10206 \backslash
10207 ttfamily
10208 \end_layout
10210 \begin_layout Standard
10211 \begin_inset listings
10212 inline false
10213 status open
10215 \begin_layout Plain Layout
10218 \backslash
10219 usepackage{listings}%
10220 \end_layout
10222 \begin_layout Plain Layout
10225 \backslash
10226 usepackage{noweb}%
10227 \end_layout
10229 \begin_layout Plain Layout
10232 \backslash
10233 usepackage{xargs}%
10234 \end_layout
10236 \begin_layout Plain Layout
10239 \backslash
10240 renewcommand{
10241 \backslash
10242 code}[1]{
10243 \backslash
10244 texttt{#1}}%
10245 \end_layout
10247 \end_inset
10250 \end_layout
10252 \begin_layout Standard
10253 We also define a 
10254 \begin_inset Flex CharStyle:Code
10255 status collapsed
10257 \begin_layout Plain Layout
10258 CChunk
10259 \end_layout
10261 \end_inset
10263  macro, for use as: 
10264 \begin_inset Flex CharStyle:Code
10265 status collapsed
10267 \begin_layout Plain Layout
10269 \backslash
10270 begin{CChunk}
10271 \end_layout
10273 \end_inset
10275  which will need renaming to 
10276 \begin_inset Flex CharStyle:Code
10277 status collapsed
10279 \begin_layout Plain Layout
10281 \backslash
10282 begin{Chunk}
10283 \end_layout
10285 \end_inset
10287  when I can do this without clashing with 
10288 \begin_inset Flex CharStyle:Code
10289 status collapsed
10291 \begin_layout Plain Layout
10293 \backslash
10294 Chunk
10295 \end_layout
10297 \end_inset
10300 \end_layout
10302 \begin_layout Standard
10303 \begin_inset listings
10304 inline false
10305 status open
10307 \begin_layout Plain Layout
10310 \backslash
10311 lstnewenvironment{Chunk}{
10312 \backslash
10313 relax}{
10314 \backslash
10315 relax}%
10316 \end_layout
10318 \end_inset
10321 \end_layout
10323 \begin_layout Standard
10324 We also define a suitable 
10325 \begin_inset Flex CharStyle:Code
10326 status collapsed
10328 \begin_layout Plain Layout
10330 \backslash
10331 lstset
10332 \end_layout
10334 \end_inset
10336  of parameters that suit the literate programming style after the fashion
10337  of 
10338 \noun on
10339 noweave
10340 \noun default
10342 \end_layout
10344 \begin_layout Standard
10345 \begin_inset listings
10346 inline false
10347 status open
10349 \begin_layout Plain Layout
10352 \backslash
10353 lstset{numbers=left, stepnumber=5, numbersep=5pt,
10354 \end_layout
10356 \begin_layout Plain Layout
10358         breaklines=false,basicstyle=
10359 \backslash
10360 ttfamily,
10361 \end_layout
10363 \begin_layout Plain Layout
10365         numberstyle=
10366 \backslash
10367 tiny, language=C}%
10368 \end_layout
10370 \end_inset
10373 \end_layout
10375 \begin_layout Standard
10376 We also define a notangle-like mechanism for 
10377 \emph on
10378 escaping
10379 \emph default
10380  to LaTeX from the listing, and by which we can refer to other listings.
10381  We declare the 
10382 \begin_inset Flex CharStyle:Code
10383 status collapsed
10385 \begin_layout Plain Layout
10386 =<\SpecialChar \ldots{}
10388 \end_layout
10390 \end_inset
10392  sequence to contain LaTeX code, and include another like this chunk: 
10393 \begin_inset Flex CharStyle:Code
10394 status collapsed
10396 \begin_layout Plain Layout
10398 \backslash
10399 chunkref{chunkname}>
10400 \end_layout
10402 \end_inset
10405  However, because 
10406 \begin_inset Flex CharStyle:Code
10407 status collapsed
10409 \begin_layout Plain Layout
10410 =<\SpecialChar \ldots{}
10412 \end_layout
10414 \end_inset
10416  is already defined to contain LaTeX code for this document --- this is
10417  a 
10418 \noun on
10419 newfangle
10420 \noun default
10421  document after all --- the code fragment below effectively contains the
10422  LaTeX code: 
10423 \begin_inset Flex CharStyle:Code
10424 status collapsed
10426 \begin_layout Plain Layout
10428 \end_layout
10430 \end_inset
10433  To avoid problems with document generation, I had to declare an lstlistings
10434  property: 
10435 \begin_inset Flex CharStyle:Code
10436 status collapsed
10438 \begin_layout Plain Layout
10439 escapeinside={}
10440 \end_layout
10442 \end_inset
10444  for this listing only; which in LyX was done by right-clicking the listings
10445  inset, choosing 
10446 \begin_inset Flex CharStyle:Code
10447 status collapsed
10449 \begin_layout Plain Layout
10450 settings
10451 \end_layout
10453 \end_inset
10455 \SpecialChar \menuseparator
10457 \begin_inset Flex CharStyle:Code
10458 status collapsed
10460 \begin_layout Plain Layout
10461 advanced
10462 \end_layout
10464 \end_inset
10467 \end_layout
10469 \begin_layout Standard
10470 \begin_inset Note Note
10471 status collapsed
10473 \begin_layout Plain Layout
10474 =< isn't enjoyed literally here, in a listing when the escape sequence is
10475  already defined as shown...
10476  we need to somehow escape this representation...
10477 \end_layout
10479 \end_inset
10482 \end_layout
10484 \begin_layout Standard
10485 \begin_inset listings
10486 lstparams "escapeinside={}"
10487 inline false
10488 status open
10490 \begin_layout Plain Layout
10493 \backslash
10494 lstset{escapeinside={=<}{>}}%
10495 \end_layout
10497 \end_inset
10500 \end_layout
10502 \begin_layout Standard
10503 Although our macros will contain the @ symbol, they will be included in
10504  a 
10505 \begin_inset Flex CharStyle:Code
10506 status collapsed
10508 \begin_layout Plain Layout
10510 \backslash
10511 makeatletter
10512 \end_layout
10514 \end_inset
10516  section by LyX; however we keep the commented out 
10517 \begin_inset Flex CharStyle:Code
10518 status collapsed
10520 \begin_layout Plain Layout
10522 \backslash
10523 makeatletter
10524 \end_layout
10526 \end_inset
10528  as a reminder.
10529  The listings package likes to centre the titles, but noweb titles are specially
10530  formatted and must be left aligned.
10531  The simplest way to do this turned out to be by removing the definition
10532  of 
10533 \begin_inset Flex CharStyle:Code
10534 status collapsed
10536 \begin_layout Plain Layout
10538 \backslash
10539 lst@maketitle
10540 \end_layout
10542 \end_inset
10545  This may interact badly if other listings want a regular title or caption.
10546  We remember the old maketitle in case we need it.
10547 \end_layout
10549 \begin_layout Standard
10550 \begin_inset listings
10551 inline false
10552 status open
10554 \begin_layout Plain Layout
10557 \backslash
10558 makeatletter
10559 \end_layout
10561 \begin_layout Plain Layout
10563 %somehow re-defining maketitle gives us a left-aligned title
10564 \end_layout
10566 \begin_layout Plain Layout
10568 %which is extactly what our specially formatted title needs!
10569 \end_layout
10571 \begin_layout Plain Layout
10574 \backslash
10575 global
10576 \backslash
10578 \backslash
10579 newfangle@lst@maketitle
10580 \backslash
10581 lst@maketitle%
10582 \end_layout
10584 \begin_layout Plain Layout
10587 \backslash
10588 global
10589 \backslash
10591 \backslash
10592 lst@maketitle{}%
10593 \end_layout
10595 \end_inset
10598 \end_layout
10600 \begin_layout Subsection
10601 \begin_inset CommandInset label
10602 LatexCommand label
10603 name "sub:The-chunk-command"
10605 \end_inset
10607 The chunk command
10608 \end_layout
10610 \begin_layout Standard
10611 Our chunk command accepts one argument, and calls 
10612 \begin_inset Flex CharStyle:Code
10613 status collapsed
10615 \begin_layout Plain Layout
10617 \backslash
10618 ltset
10619 \end_layout
10621 \end_inset
10624  Although 
10625 \begin_inset Flex CharStyle:Code
10626 status collapsed
10628 \begin_layout Plain Layout
10630 \backslash
10631 ltset
10632 \end_layout
10634 \end_inset
10636  will note the name, this is erased when the next 
10637 \begin_inset Flex CharStyle:Code
10638 status collapsed
10640 \begin_layout Plain Layout
10642 \backslash
10643 lstlisting
10644 \end_layout
10646 \end_inset
10648  starts, so we make a note of this in 
10649 \begin_inset Flex CharStyle:Code
10650 status collapsed
10652 \begin_layout Plain Layout
10654 \backslash
10655 lst@chunkname
10656 \end_layout
10658 \end_inset
10660  and restore in in lstlistings Init hook.
10661 \end_layout
10663 \begin_layout Standard
10664 \begin_inset listings
10665 inline false
10666 status open
10668 \begin_layout Plain Layout
10671 \backslash
10673 \backslash
10674 Chunk#1{%
10675 \end_layout
10677 \begin_layout Plain Layout
10679   
10680 \backslash
10681 lstset{title={
10682 \backslash
10683 newfanglecaption},name=#1}%
10684 \end_layout
10686 \begin_layout Plain Layout
10688   
10689 \backslash
10690 global
10691 \backslash
10692 edef
10693 \backslash
10694 lst@chunkname{
10695 \backslash
10696 lst@intname}%
10697 \end_layout
10699 \begin_layout Plain Layout
10702 \end_layout
10704 \begin_layout Plain Layout
10707 \backslash
10709 \backslash
10710 lst@chunkname{
10711 \backslash
10712 empty}%
10713 \end_layout
10715 \end_inset
10718 \end_layout
10720 \begin_layout Subsubsection
10721 Chunk parameters
10722 \end_layout
10724 \begin_layout Standard
10725 Newfangle permits parameterized chunks, and requires the paramters to be
10726  specified as listings options.
10727  The newfangle script uses this, and although we don't do anything with
10728  these in the LaTeX code right now, we need to stop the listings package
10729  complaining.
10730 \end_layout
10732 \begin_layout Standard
10733 \begin_inset listings
10734 inline false
10735 status open
10737 \begin_layout Plain Layout
10740 \backslash
10741 lst@Key{params}
10742 \backslash
10743 relax{
10744 \backslash
10746 \backslash
10747 newfangle@chunk@params{#1}}%
10748 \end_layout
10750 \end_inset
10753 \end_layout
10755 \begin_layout Subsection
10756 The noweb styled caption
10757 \end_layout
10759 \begin_layout Standard
10760 We define a public macro 
10761 \begin_inset Flex CharStyle:Code
10762 status collapsed
10764 \begin_layout Plain Layout
10766 \backslash
10767 newfanglecaption
10768 \end_layout
10770 \end_inset
10772  which can be set as a regular title.
10773  By means of 
10774 \begin_inset Flex CharStyle:Code
10775 status collapsed
10777 \begin_layout Plain Layout
10779 \backslash
10780 protect
10781 \end_layout
10783 \end_inset
10785 , It expands to 
10786 \begin_inset Flex CharStyle:Code
10787 status collapsed
10789 \begin_layout Plain Layout
10791 \backslash
10792 newfangle@caption
10793 \end_layout
10795 \end_inset
10797  at the appriate time when the caption is emitted.
10798 \end_layout
10800 \begin_layout Standard
10801 \begin_inset listings
10802 inline false
10803 status open
10805 \begin_layout Plain Layout
10808 \backslash
10810 \backslash
10811 newfanglecaption{
10812 \backslash
10813 protect
10814 \backslash
10815 newfangle@caption}%
10816 \end_layout
10818 \end_inset
10821 \end_layout
10823 \begin_layout Standard
10824 \begin_inset Float figure
10825 placement H
10826 wide false
10827 sideways false
10828 status collapsed
10830 \begin_layout Plain Layout
10831 \begin_inset Box Boxed
10832 position "t"
10833 hor_pos "c"
10834 has_inner_box 1
10835 inner_pos "t"
10836 use_parbox 0
10837 width "100col%"
10838 special "none"
10839 height "1in"
10840 height_special "totalheight"
10841 status open
10843 \begin_layout Plain Layout
10845 \begin_inset space \qquad{}
10846 \end_inset
10849 \shape italic
10850 some-chunk
10851 \shape default
10852  19b⟩
10853 \begin_inset Formula $\equiv+$
10854 \end_inset
10857 \begin_inset space \qquad{}
10858 \end_inset
10861 \begin_inset space \qquad{}
10862 \end_inset
10865 \begin_inset space \qquad{}
10866 \end_inset
10869 \begin_inset Formula $\triangleleft$
10870 \end_inset
10873 \begin_inset space \quad{}
10874 \end_inset
10877 \begin_inset Formula $\triangleright$
10878 \end_inset
10881 \end_layout
10883 \begin_layout Plain Layout
10885 \size footnotesize
10886 In this example, the current chunk is 22c, and therefore the third chunk
10887  on page 22.
10888 \end_layout
10890 \begin_layout Plain Layout
10892 \size footnotesize
10893 It's name is 
10894 \emph on
10895 some-chunk
10896 \emph default
10899 \end_layout
10901 \begin_layout Plain Layout
10903 \size footnotesize
10904 The first chunk with this name (19b) occurs as the second chunk on page
10905  19.
10906 \end_layout
10908 \begin_layout Plain Layout
10910 \size footnotesize
10911 The previous chunk (22d) with the same name is the second chunk on page
10912  22.
10913 \end_layout
10915 \begin_layout Plain Layout
10917 \size footnotesize
10918 The next chunk (24d) is the fourth chunk on page 24.
10919 \end_layout
10921 \begin_layout Plain Layout
10922 \begin_inset Caption
10924 \begin_layout Plain Layout
10925 noweb heading
10926 \end_layout
10928 \end_inset
10931 \end_layout
10933 \end_inset
10936 \end_layout
10938 \end_inset
10940 The general noweb output format compactly identifies the current chunk,
10941  and references to the first chunk, and the previous and next chunks that
10942  have the same name.
10944 \end_layout
10946 \begin_layout Standard
10947 This means that we need to keep a counter for each chunk-name, that we use
10948  to count chunks of the same name.
10950 \end_layout
10952 \begin_layout Subsection
10953 The chunk counter
10954 \end_layout
10956 \begin_layout Standard
10957 It would be natural to have a counter for each chunk name, but TeX would
10958  soon run out of counters
10959 \begin_inset Foot
10960 status collapsed
10962 \begin_layout Plain Layout
10963 \SpecialChar \ldots{}
10964 soon 
10965 \emph on
10967 \emph default
10968  run out of counters and so I had to re-write the LaTeX macros to share
10969  a counter as described here
10970 \end_layout
10972 \end_inset
10974 , so we have one counter which we save at the end of a chunk and restore
10975  at the beginning of a chunk.
10976 \end_layout
10978 \begin_layout Standard
10979 \begin_inset listings
10980 inline false
10981 status open
10983 \begin_layout Plain Layout
10986 \backslash
10987 newcounter{newfangle@chunkcounter}%
10988 \end_layout
10990 \end_inset
10993 \end_layout
10995 \begin_layout Standard
10996 We construct the name of this variable to store the counter to be the text
10998 \begin_inset Flex CharStyle:Code
10999 status collapsed
11001 \begin_layout Plain Layout
11002 lst-chunk-
11003 \end_layout
11005 \end_inset
11007  prefixed onto the chunks own name, and store it in 
11008 \begin_inset Flex CharStyle:Code
11009 status collapsed
11011 \begin_layout Plain Layout
11013 \backslash
11014 chunkcount
11015 \end_layout
11017 \end_inset
11021 \end_layout
11023 \begin_layout Standard
11024 We save the counter like this:
11025 \end_layout
11027 \begin_layout Chunk
11028 save-counter
11029 \end_layout
11031 \begin_layout Standard
11032 \begin_inset listings
11033 inline false
11034 status open
11036 \begin_layout Plain Layout
11039 \backslash
11040 global
11041 \backslash
11042 expandafter
11043 \backslash
11044 edef
11045 \backslash
11046 csname 
11047 \backslash
11048 chunkcount
11049 \backslash
11050 endcsname{
11051 \backslash
11052 arabic{newfangle@chunkcounter}}%
11053 \end_layout
11055 \end_inset
11058 \end_layout
11060 \begin_layout Standard
11061 and restore the counter like this:
11062 \end_layout
11064 \begin_layout Chunk
11065 restore-counter
11066 \end_layout
11068 \begin_layout Standard
11069 \begin_inset listings
11070 inline false
11071 status open
11073 \begin_layout Plain Layout
11076 \backslash
11077 setcounter{newfangle@chunkcounter}{
11078 \backslash
11079 csname 
11080 \backslash
11081 chunkcount
11082 \backslash
11083 endcsname}%
11084 \end_layout
11086 \end_inset
11089 \end_layout
11091 \begin_layout Chunk
11092 ./newfangle.sty
11093 \end_layout
11095 \begin_layout Standard
11096 If there does not already exist a variable whose name is stored in 
11097 \begin_inset Flex CharStyle:Code
11098 status collapsed
11100 \begin_layout Plain Layout
11102 \backslash
11103 chunkcount
11104 \end_layout
11106 \end_inset
11108 , then we know we are the first chunk with this name, and then define a
11109  counter.
11111 \end_layout
11113 \begin_layout Standard
11114 Although chunks of the same name share a common counter, they must still
11115  be distinguished.
11116  We use is the internal name of the listing, suffixed by the counter value.
11117  So the first chunk might be 
11118 \begin_inset Flex CharStyle:Code
11119 status collapsed
11121 \begin_layout Plain Layout
11122 something-1
11123 \end_layout
11125 \end_inset
11127  and the second chunk be 
11128 \begin_inset Flex CharStyle:Code
11129 status collapsed
11131 \begin_layout Plain Layout
11132 something-2
11133 \end_layout
11135 \end_inset
11137 , etc.
11138 \end_layout
11140 \begin_layout Standard
11141 We also calculate the name of the previous chunk if we can (before we increment
11142  the chunk counter).
11143  If this is the first chunk of that name, then 
11144 \begin_inset Flex CharStyle:Code
11145 status collapsed
11147 \begin_layout Plain Layout
11149 \backslash
11150 prevchunkname
11151 \end_layout
11153 \end_inset
11155  is set to 
11156 \begin_inset Flex CharStyle:Code
11157 status collapsed
11159 \begin_layout Plain Layout
11161 \backslash
11162 relax
11163 \end_layout
11165 \end_inset
11167  which the noweb package will interpret as not existing.
11168 \end_layout
11170 \begin_layout Standard
11171 \begin_inset listings
11172 inline false
11173 status open
11175 \begin_layout Plain Layout
11178 \backslash
11180 \backslash
11181 newfangle@caption{%
11182 \end_layout
11184 \begin_layout Plain Layout
11186   
11187 \backslash
11188 edef
11189 \backslash
11190 chunkcount{lst-chunk-
11191 \backslash
11192 lst@intname}%
11193 \end_layout
11195 \begin_layout Plain Layout
11197   
11198 \backslash
11199 @ifundefined{
11200 \backslash
11201 chunkcount}{%
11202 \end_layout
11204 \begin_layout Plain Layout
11206     
11207 \backslash
11208 expandafter
11209 \backslash
11210 gdef
11211 \backslash
11212 csname 
11213 \backslash
11214 chunkcount
11215 \backslash
11216 endcsname{0}%
11217 \end_layout
11219 \begin_layout Plain Layout
11221     
11222 \backslash
11223 setcounter{newfangle@chunkcounter}{
11224 \backslash
11225 csname 
11226 \backslash
11227 chunkcount
11228 \backslash
11229 endcsname}%
11230 \end_layout
11232 \begin_layout Plain Layout
11234     
11235 \backslash
11237 \backslash
11238 prevchunkname
11239 \backslash
11240 relax%
11241 \end_layout
11243 \begin_layout Plain Layout
11245   }{%
11246 \end_layout
11248 \begin_layout Plain Layout
11250     
11251 \backslash
11252 setcounter{newfangle@chunkcounter}{
11253 \backslash
11254 csname 
11255 \backslash
11256 chunkcount
11257 \backslash
11258 endcsname}%
11259 \end_layout
11261 \begin_layout Plain Layout
11263     
11264 \backslash
11265 edef
11266 \backslash
11267 prevchunkname{
11268 \backslash
11269 lst@intname-
11270 \backslash
11271 arabic{newfangle@chunkcounter}}%
11272 \end_layout
11274 \begin_layout Plain Layout
11276   }%
11277 \end_layout
11279 \end_inset
11282 \end_layout
11284 \begin_layout Standard
11285 After incrementing the chunk counter, we then define the name of this chunk,
11286  as well as the name of the first chunk.
11287 \end_layout
11289 \begin_layout Standard
11290 \begin_inset listings
11291 inline false
11292 status open
11294 \begin_layout Plain Layout
11296   
11297 \backslash
11298 addtocounter{newfangle@chunkcounter}{1}%
11299 \end_layout
11301 \begin_layout Plain Layout
11303   
11304 \backslash
11305 global
11306 \backslash
11307 expandafter
11308 \backslash
11309 edef
11310 \backslash
11311 csname 
11312 \backslash
11313 chunkcount
11314 \backslash
11315 endcsname{
11316 \backslash
11317 arabic{newfangle@chunkcounter}}%
11318 \end_layout
11320 \begin_layout Plain Layout
11322   
11323 \backslash
11324 edef
11325 \backslash
11326 chunkname{
11327 \backslash
11328 lst@intname-
11329 \backslash
11330 arabic{newfangle@chunkcounter}}%
11331 \end_layout
11333 \begin_layout Plain Layout
11335   
11336 \backslash
11337 edef
11338 \backslash
11339 firstchunkname{
11340 \backslash
11341 lst@intname-1}%
11342 \end_layout
11344 \end_inset
11347 \end_layout
11349 \begin_layout Standard
11350 We now need to calculate the name of the next chunk.
11351  We do this by temporarily skipping the counter on by one; however there
11352  may not actually be another chunk with this name! We detect this by also
11353  defining a label for each chunk based on the chunkname.
11354  If there is a next chunkname then it will define a label with that name.
11355  As labels are persistent, we can at least tell the second time LaTeX is
11356  run.
11357  If we don't find such a defined label then we define 
11358 \begin_inset Flex CharStyle:Code
11359 status collapsed
11361 \begin_layout Plain Layout
11363 \backslash
11364 nextchunkname
11365 \end_layout
11367 \end_inset
11369  to 
11370 \begin_inset Flex CharStyle:Code
11371 status collapsed
11373 \begin_layout Plain Layout
11375 \backslash
11376 relax
11377 \end_layout
11379 \end_inset
11382 \end_layout
11384 \begin_layout Standard
11385 \begin_inset listings
11386 inline false
11387 status open
11389 \begin_layout Plain Layout
11391   
11392 \backslash
11393 addtocounter{newfangle@chunkcounter}{1}%
11394 \end_layout
11396 \begin_layout Plain Layout
11398   
11399 \backslash
11400 edef
11401 \backslash
11402 nextchunkname{
11403 \backslash
11404 lst@intname-
11405 \backslash
11406 arabic{newfangle@chunkcounter}}%
11407 \end_layout
11409 \begin_layout Plain Layout
11411   
11412 \backslash
11413 @ifundefined{r@label-
11414 \backslash
11415 nextchunkname}{
11416 \backslash
11418 \backslash
11419 nextchunkname
11420 \backslash
11421 relax}{}%
11422 \end_layout
11424 \end_inset
11427 \end_layout
11429 \begin_layout Standard
11430 The noweb package requires that we define a 
11431 \begin_inset Flex CharStyle:Code
11432 status collapsed
11434 \begin_layout Plain Layout
11436 \backslash
11437 sublabel
11438 \end_layout
11440 \end_inset
11442  for every chunk, with a unique name, which is then used to print out it's
11443  navigation hints.
11444 \end_layout
11446 \begin_layout Standard
11447 We also define a regular label for this chunk, as was mentioned above when
11448  we calculated 
11449 \begin_inset Flex CharStyle:Code
11450 status collapsed
11452 \begin_layout Plain Layout
11454 \backslash
11455 nextchunkname
11456 \end_layout
11458 \end_inset
11461  This requires LaTeX to be run at least twice after new chunk sections are
11462  added --- but noweb requried that anyway.
11463 \end_layout
11465 \begin_layout Standard
11466 \begin_inset listings
11467 inline false
11468 status open
11470 \begin_layout Plain Layout
11472   
11473 \backslash
11474 sublabel{
11475 \backslash
11476 chunkname}%
11477 \end_layout
11479 \begin_layout Plain Layout
11481 % define this label for every chunk instance, so we
11482 \end_layout
11484 \begin_layout Plain Layout
11486 % can tell when we are the last chunk of this name
11487 \end_layout
11489 \begin_layout Plain Layout
11491   
11492 \backslash
11493 label{label-
11494 \backslash
11495 chunkname}%
11496 \end_layout
11498 \end_inset
11501 \end_layout
11503 \begin_layout Standard
11504 We also try and add the chunk to the list of listings, but I'm afraid we
11505  don't do very well.
11506  We want each chunk name listing once, with all of it's references.
11507 \end_layout
11509 \begin_layout Standard
11510 \begin_inset listings
11511 inline false
11512 status open
11514 \begin_layout Plain Layout
11516   
11517 \backslash
11518 addcontentsline{lol}{lstlisting}{
11519 \backslash
11520 lst@name~[
11521 \backslash
11522 protect
11523 \backslash
11524 subpageref{
11525 \backslash
11526 chunkname}]}%
11527 \end_layout
11529 \end_inset
11532 \end_layout
11534 \begin_layout Standard
11535 We then call the noweb output macros in the same way that noweave generates
11536  them, except that we don't need to call 
11537 \begin_inset Flex CharStyle:Code
11538 status collapsed
11540 \begin_layout Plain Layout
11542 \backslash
11543 nwstartdeflinemarkup
11544 \end_layout
11546 \end_inset
11548  or 
11549 \begin_inset Flex CharStyle:Code
11550 status collapsed
11552 \begin_layout Plain Layout
11554 \backslash
11555 nwenddeflinemarkup
11556 \end_layout
11558 \end_inset
11560  -- and if we do it messes up the output somewhat.
11561 \end_layout
11563 \begin_layout Standard
11564 \begin_inset listings
11565 inline false
11566 status open
11568 \begin_layout Plain Layout
11570   
11571 \backslash
11572 nwmargintag{%
11573 \end_layout
11575 \begin_layout Plain Layout
11577     {%
11578 \end_layout
11580 \begin_layout Plain Layout
11582       
11583 \backslash
11584 nwtagstyle{}%
11585 \end_layout
11587 \begin_layout Plain Layout
11589       
11590 \backslash
11591 subpageref{
11592 \backslash
11593 chunkname}%
11594 \end_layout
11596 \begin_layout Plain Layout
11598     }%
11599 \end_layout
11601 \begin_layout Plain Layout
11603   }%
11604 \end_layout
11606 \begin_layout Plain Layout
11609 \end_layout
11611 \begin_layout Plain Layout
11613   
11614 \backslash
11615 moddef{%
11616 \end_layout
11618 \begin_layout Plain Layout
11620     {
11621 \backslash
11622 lst@name}%
11623 \end_layout
11625 \begin_layout Plain Layout
11627     {%
11628 \end_layout
11630 \begin_layout Plain Layout
11632       
11633 \backslash
11634 nwtagstyle{}
11635 \backslash
11637 \end_layout
11639 \begin_layout Plain Layout
11641       
11642 \backslash
11643 @ifundefined{newfangle@chunk@params}{}{%
11644 \end_layout
11646 \begin_layout Plain Layout
11648         (
11649 \backslash
11650 newfangle@chunk@params)%
11651 \end_layout
11653 \begin_layout Plain Layout
11655       }%
11656 \end_layout
11658 \begin_layout Plain Layout
11660       [
11661 \backslash
11662 csname 
11663 \backslash
11664 chunkcount
11665 \backslash
11666 endcsname]~%%
11667 \end_layout
11669 \begin_layout Plain Layout
11671       
11672 \backslash
11673 subpageref{
11674 \backslash
11675 firstchunkname}%
11676 \end_layout
11678 \begin_layout Plain Layout
11680     }%
11681 \end_layout
11683 \begin_layout Plain Layout
11685   }%
11686 \end_layout
11688 \begin_layout Plain Layout
11691 \end_layout
11693 \begin_layout Plain Layout
11695   
11696 \backslash
11698 \backslash
11699 relax
11700 \backslash
11701 prevchunkname
11702 \backslash
11703 endmoddef
11704 \backslash
11705 else
11706 \backslash
11707 plusendmoddef
11708 \backslash
11710 \end_layout
11712 \begin_layout Plain Layout
11714 %  
11715 \backslash
11716 nwstartdeflinemarkup%
11717 \end_layout
11719 \begin_layout Plain Layout
11721   
11722 \backslash
11723 nwprevnextdefs{
11724 \backslash
11725 prevchunkname}{
11726 \backslash
11727 nextchunkname}%
11728 \end_layout
11730 \begin_layout Plain Layout
11732 %  
11733 \backslash
11734 nwenddeflinemarkup%
11735 \end_layout
11737 \begin_layout Plain Layout
11740 \end_layout
11742 \end_inset
11745 \end_layout
11747 \begin_layout Standard
11748 Originally this was developed as a 
11749 \begin_inset Flex CharStyle:Code
11750 status collapsed
11752 \begin_layout Plain Layout
11753 listings
11754 \end_layout
11756 \end_inset
11758  aspect, in the Init hook, but it was found easier to affect the title without
11759  using a hook --- 
11760 \begin_inset Flex CharStyle:Code
11761 status collapsed
11763 \begin_layout Plain Layout
11765 \backslash
11766 lst@AddToHookExe{PreSet}
11767 \end_layout
11769 \end_inset
11771  is still required to set the listings name to the name passed to the 
11772 \begin_inset Flex CharStyle:Code
11773 status collapsed
11775 \begin_layout Plain Layout
11777 \backslash
11778 Chunk
11779 \end_layout
11781 \end_inset
11783  command, though.
11784 \end_layout
11786 \begin_layout Standard
11787 \begin_inset listings
11788 inline false
11789 status open
11791 \begin_layout Plain Layout
11794 \backslash
11795 lst@BeginAspect{newfangle}
11796 \end_layout
11798 \begin_layout Plain Layout
11801 \backslash
11802 lst@Key{newfangle}{true}[t]{
11803 \backslash
11804 lstKV@SetIf{#1}{true}}
11805 \end_layout
11807 \begin_layout Plain Layout
11810 \backslash
11811 lst@AddToHookExe{PreSet}{
11812 \backslash
11813 global
11814 \backslash
11816 \backslash
11817 lst@intname
11818 \backslash
11819 lst@chunkname}
11820 \end_layout
11822 \begin_layout Plain Layout
11825 \backslash
11826 lst@AddToHook{Init}{}%
11827 \backslash
11828 newfangle@caption}
11829 \end_layout
11831 \begin_layout Plain Layout
11834 \backslash
11835 lst@EndAspect
11836 \end_layout
11838 \end_inset
11841 \end_layout
11843 \begin_layout Subsection
11844 Cross references
11845 \end_layout
11847 \begin_layout Standard
11848 We define the 
11849 \backslash
11850 chunkref command which makes it easy to generate visual references to different
11851  code chunks, e.g.
11852 \end_layout
11854 \begin_layout Standard
11855 \begin_inset Tabular
11856 <lyxtabular version="3" rows="4" columns="2">
11857 <features>
11858 <column alignment="center" valignment="top" width="0">
11859 <column alignment="center" valignment="top" width="0">
11860 <row>
11861 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
11862 \begin_inset Text
11864 \begin_layout Plain Layout
11865 Macro
11866 \end_layout
11868 \end_inset
11869 </cell>
11870 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
11871 \begin_inset Text
11873 \begin_layout Plain Layout
11874 Appearance
11875 \end_layout
11877 \end_inset
11878 </cell>
11879 </row>
11880 <row>
11881 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
11882 \begin_inset Text
11884 \begin_layout Plain Layout
11886 \backslash
11887 chunkref{preamble}
11888 \end_layout
11890 \end_inset
11891 </cell>
11892 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
11893 \begin_inset Text
11895 \begin_layout Plain Layout
11896 \begin_inset ERT
11897 status open
11899 \begin_layout Plain Layout
11902 \backslash
11903 chunkref{preamble}
11904 \end_layout
11906 \end_inset
11909 \end_layout
11911 \end_inset
11912 </cell>
11913 </row>
11914 <row>
11915 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
11916 \begin_inset Text
11918 \begin_layout Plain Layout
11920 \backslash
11921 chunkref[3]{preamble}
11922 \end_layout
11924 \end_inset
11925 </cell>
11926 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
11927 \begin_inset Text
11929 \begin_layout Plain Layout
11930 \begin_inset ERT
11931 status open
11933 \begin_layout Plain Layout
11936 \backslash
11937 chunkref[3]{preamble}
11938 \end_layout
11940 \end_inset
11943 \end_layout
11945 \end_inset
11946 </cell>
11947 </row>
11948 <row>
11949 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
11950 \begin_inset Text
11952 \begin_layout Plain Layout
11954 \backslash
11955 chunkref{preamble}[arg1, arg2]
11956 \end_layout
11958 \end_inset
11959 </cell>
11960 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
11961 \begin_inset Text
11963 \begin_layout Plain Layout
11964 \begin_inset ERT
11965 status open
11967 \begin_layout Plain Layout
11970 \backslash
11971 chunkref{preamble}[arg1, arg2]
11972 \end_layout
11974 \end_inset
11977 \end_layout
11979 \end_inset
11980 </cell>
11981 </row>
11982 </lyxtabular>
11984 \end_inset
11987 \end_layout
11989 \begin_layout Standard
11990 Chunkref can also be used within a code chunk to include another code chunk.
11991  The third optional parameter to chunkref is a comma sepatarated list of
11992  arguments, which will replace defined parameters in the chunkref.
11993 \begin_inset Note Note
11994 status open
11996 \begin_layout Plain Layout
11997 Darn it, if I have: =<
11998 \backslash
11999 chunkref{new-mode}[{chunks[chunk_name, "language"]},{mode}]> the inner braces
12000  (inside [ ]) cause _ to signify subscript even though we have lst@ReplaceIn
12001 \end_layout
12003 \end_inset
12006 \end_layout
12008 \begin_layout Standard
12009 \begin_inset listings
12010 inline false
12011 status open
12013 \begin_layout Plain Layout
12016 \backslash
12018 \backslash
12019 chunkref@args#1,{%
12020 \end_layout
12022 \begin_layout Plain Layout
12024   
12025 \backslash
12027 \backslash
12028 arg{#1}%
12029 \end_layout
12031 \begin_layout Plain Layout
12033   
12034 \backslash
12035 lst@ReplaceIn
12036 \backslash
12038 \backslash
12039 lst@filenamerpl%
12040 \end_layout
12042 \begin_layout Plain Layout
12044   
12045 \backslash
12046 arg%
12047 \end_layout
12049 \begin_layout Plain Layout
12051   
12052 \backslash
12053 @ifnextchar){
12054 \backslash
12055 relax}{, 
12056 \backslash
12057 chunkref@args}%
12058 \end_layout
12060 \begin_layout Plain Layout
12063 \end_layout
12065 \begin_layout Plain Layout
12068 \backslash
12069 newcommand
12070 \backslash
12071 chunkref[2][0]{%
12072 \end_layout
12074 \begin_layout Plain Layout
12076   
12077 \backslash
12078 @ifnextchar({
12079 \backslash
12080 chunkref@i{#1}{#2}}{
12081 \backslash
12082 chunkref@i{#1}{#2}()}%
12083 \end_layout
12085 \begin_layout Plain Layout
12088 \end_layout
12090 \begin_layout Plain Layout
12093 \backslash
12095 \backslash
12096 chunkref@i#1#2(#3){%
12097 \end_layout
12099 \begin_layout Plain Layout
12101   
12102 \backslash
12104 \backslash
12105 zero{0}%
12106 \end_layout
12108 \begin_layout Plain Layout
12110   
12111 \backslash
12113 \backslash
12114 chunk{#2}%
12115 \end_layout
12117 \begin_layout Plain Layout
12119   
12120 \backslash
12122 \backslash
12123 chunkno{#1}%
12124 \end_layout
12126 \begin_layout Plain Layout
12128   
12129 \backslash
12131 \backslash
12132 chunkargs{#3}%
12133 \end_layout
12135 \begin_layout Plain Layout
12137   
12138 \backslash
12140 \backslash
12141 chunkno
12142 \backslash
12143 zero%
12144 \end_layout
12146 \begin_layout Plain Layout
12148     
12149 \backslash
12151 \backslash
12152 chunkname{#2-1}%
12153 \end_layout
12155 \begin_layout Plain Layout
12157   
12158 \backslash
12159 else%
12160 \end_layout
12162 \begin_layout Plain Layout
12164     
12165 \backslash
12167 \backslash
12168 chunkname{#2-
12169 \backslash
12170 chunkno}%
12171 \end_layout
12173 \begin_layout Plain Layout
12175   
12176 \backslash
12178 \end_layout
12180 \begin_layout Plain Layout
12182   
12183 \backslash
12185 \backslash
12186 lst@arg
12187 \backslash
12188 chunk%
12189 \end_layout
12191 \begin_layout Plain Layout
12193   
12194 \backslash
12195 lst@ReplaceIn
12196 \backslash
12197 chunk
12198 \backslash
12199 lst@filenamerpl%
12200 \end_layout
12202 \begin_layout Plain Layout
12204   
12205 \backslash
12206 LA{%
12207 \backslash
12208 moddef{%
12209 \end_layout
12211 \begin_layout Plain Layout
12213     {
12214 \backslash
12215 chunk}%
12216 \end_layout
12218 \begin_layout Plain Layout
12220     {%
12221 \end_layout
12223 \begin_layout Plain Layout
12225       
12226 \backslash
12227 nwtagstyle{}
12228 \backslash
12230 \end_layout
12232 \begin_layout Plain Layout
12234       
12235 \backslash
12237 \backslash
12238 chunkno
12239 \backslash
12240 zero%
12241 \end_layout
12243 \begin_layout Plain Layout
12245       
12246 \backslash
12247 else%
12248 \end_layout
12250 \begin_layout Plain Layout
12252       [
12253 \backslash
12254 chunkno]%
12255 \end_layout
12257 \begin_layout Plain Layout
12259       
12260 \backslash
12262 \end_layout
12264 \begin_layout Plain Layout
12266       
12267 \backslash
12269 \backslash
12270 chunkargs
12271 \backslash
12272 empty%
12273 \end_layout
12275 \begin_layout Plain Layout
12277       
12278 \backslash
12279 else%
12280 \end_layout
12282 \begin_layout Plain Layout
12284         (
12285 \backslash
12286 chunkref@args #3,)%
12287 \end_layout
12289 \begin_layout Plain Layout
12291       
12292 \backslash
12294 \end_layout
12296 \begin_layout Plain Layout
12298       ~
12299 \backslash
12300 subpageref{
12301 \backslash
12302 chunkname}%
12303 \end_layout
12305 \begin_layout Plain Layout
12307     }%
12308 \end_layout
12310 \begin_layout Plain Layout
12312   }%
12313 \end_layout
12315 \begin_layout Plain Layout
12317   
12318 \backslash
12320 \backslash
12321 endmoddef%
12322 \end_layout
12324 \begin_layout Plain Layout
12327 \end_layout
12329 \end_inset
12332 \end_layout
12334 \begin_layout Subsection
12335 The end
12336 \end_layout
12338 \begin_layout Standard
12339 \begin_inset listings
12340 inline false
12341 status open
12343 \begin_layout Plain Layout
12346 \end_layout
12348 \begin_layout Plain Layout
12351 \backslash
12352 makeatother
12353 \end_layout
12355 \end_inset
12358 \end_layout
12360 \begin_layout Chapter
12361 Extracting newfangle
12362 \end_layout
12364 \begin_layout Section
12365 Extracting from Lyx
12366 \end_layout
12368 \begin_layout Standard
12369 To extract from LyX, you will need to configure LyX as explained in section
12371 \begin_inset CommandInset ref
12372 LatexCommand ref
12373 reference "sub:Configuring-the-build"
12375 \end_inset
12378 \end_layout
12380 \begin_layout Standard
12381 \begin_inset CommandInset label
12382 LatexCommand label
12383 name "lyx-build-script"
12385 \end_inset
12387 And this lyx-build scrap will extract newfangle for me.
12388 \end_layout
12390 \begin_layout Chunk
12391 lyx-build,language=sh
12392 \end_layout
12394 \begin_layout Standard
12395 \begin_inset listings
12396 inline false
12397 status open
12399 \begin_layout Plain Layout
12401 #! /bin/sh
12402 \end_layout
12404 \begin_layout Plain Layout
12406 set -x
12407 \end_layout
12409 \begin_layout Plain Layout
12411 \end_layout
12413 \begin_layout Plain Layout
12416 \backslash
12417 chunkref{lyx-build-helper}>
12418 \end_layout
12420 \begin_layout Plain Layout
12422 cd $PROJECT_DIR || exit 1
12423 \end_layout
12425 \begin_layout Plain Layout
12427 \end_layout
12429 \begin_layout Plain Layout
12431 /usr/local/bin/newfangle -R./newfangle $TEX_SRC > ./newfangle
12432 \end_layout
12434 \begin_layout Plain Layout
12436 /usr/local/bin/newfangle -R./newfangle.module $TEX_SRC > ./newfangle.module
12437 \end_layout
12439 \end_inset
12442 \end_layout
12444 \begin_layout Standard
12445 With a lyx-build-helper
12446 \end_layout
12448 \begin_layout Chunk
12449 lyx-build-helper,language=sh
12450 \end_layout
12452 \begin_layout Standard
12453 \begin_inset listings
12454 inline false
12455 status open
12457 \begin_layout Plain Layout
12459 PROJECT_DIR="$LYX_r"
12460 \end_layout
12462 \begin_layout Plain Layout
12464 LYX_SRC="$PROJECT_DIR/${LYX_i%.tex}.lyx"
12465 \end_layout
12467 \begin_layout Plain Layout
12469 TEX_DIR="$LYX_p"
12470 \end_layout
12472 \begin_layout Plain Layout
12474 TEX_SRC="$TEX_DIR/$LYX_i"
12475 \end_layout
12477 \end_inset
12480 \end_layout
12482 \begin_layout Section
12483 Extracting from the command line
12484 \end_layout
12486 \begin_layout Standard
12487 First you will need the tex output, then you can extract:
12488 \end_layout
12490 \begin_layout Chunk
12491 lyx-build-manual,language=sh
12492 \end_layout
12494 \begin_layout Standard
12495 \begin_inset listings
12496 inline false
12497 status open
12499 \begin_layout Plain Layout
12501 lyx -e latex newfangle.lyx
12502 \end_layout
12504 \begin_layout Plain Layout
12506 newfangle -R./newfangle newfangle.tex > ./newfangle
12507 \end_layout
12509 \begin_layout Plain Layout
12511 newfangle -R./newfangle.module newfangle.tex > ./newfangle.module
12512 \end_layout
12514 \end_inset
12517 \end_layout
12519 \begin_layout Part
12520 Tests
12521 \end_layout
12523 \begin_layout Chapter
12524 Chunk Parameters
12525 \end_layout
12527 \begin_layout Chunk
12528 tests-sub,params=THING;colour
12529 \end_layout
12531 \begin_layout Standard
12532 \begin_inset listings
12533 inline false
12534 status open
12536 \begin_layout Plain Layout
12538 I see a ${THING} of 
12539 \end_layout
12541 \begin_layout Plain Layout
12543 colour ${colour}, 
12544 \end_layout
12546 \begin_layout Plain Layout
12548 looking closer =<
12549 \backslash
12550 chunkref{tests-sub-sub}(${colour})>
12551 \end_layout
12553 \end_inset
12556 \end_layout
12558 \begin_layout Chunk
12559 tests-sub-sub,params=colour
12560 \end_layout
12562 \begin_layout Standard
12563 \begin_inset listings
12564 inline false
12565 status open
12567 \begin_layout Plain Layout
12569 a funny shade of ${colour}
12570 \end_layout
12572 \end_inset
12575 \end_layout
12577 \begin_layout Chunk
12578 tests
12579 \end_layout
12581 \begin_layout Standard
12582 \begin_inset listings
12583 inline false
12584 status open
12586 \begin_layout Plain Layout
12588 What do you see? "=<
12589 \backslash
12590 chunkref{tests-sub}(joe, red)>"
12591 \end_layout
12593 \begin_layout Plain Layout
12595 Well, fancy!
12596 \end_layout
12598 \end_inset
12601 \end_layout
12603 \begin_layout Standard
12604 Should generate output:
12605 \end_layout
12607 \begin_layout Chunk
12608 tests-result
12609 \end_layout
12611 \begin_layout Standard
12612 \begin_inset listings
12613 inline false
12614 status open
12616 \begin_layout Plain Layout
12618 What do you see? "I see a joe of 
12619 \end_layout
12621 \begin_layout Plain Layout
12623                   colour red, 
12624 \end_layout
12626 \begin_layout Plain Layout
12628                   looking closer a funny shade of red"
12629 \end_layout
12631 \begin_layout Plain Layout
12633 Well, fancy!
12634 \end_layout
12636 \begin_layout Plain Layout
12638 \end_layout
12640 \end_inset
12643 \end_layout
12645 \end_body
12646 \end_document