Restrict old noweb @ terminator
[newfangle.git] / newfangle.lyx
blobc809d91a8542ba9778536c04be57a07a1102d4f8
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 Chapter*
235 License
236 \end_layout
238 \begin_layout Standard
239 \begin_inset CommandInset label
240 LatexCommand label
241 name "cha:License"
243 \end_inset
245 Newfangle is licensed under the GPL 3
246 \begin_inset CommandInset citation
247 LatexCommand cite
248 key "gpl-licenses"
250 \end_inset
252  (or later).
253  This doesn't mean that you can't use or distribute newfangle with sources
254  of an incompatible license, but it means you must make the source of newfangle
255  available too.
256 \end_layout
258 \begin_layout Chunk
259 gpl3-copyright,language=
260 \end_layout
262 \begin_layout Standard
263 \begin_inset listings
264 inline false
265 status open
267 \begin_layout Plain Layout
269 #newfangle - fully featured notangle replacement in awk
270 \end_layout
272 \begin_layout Plain Layout
275 \end_layout
277 \begin_layout Plain Layout
279 #Copyright (C) Sam Liddicott 2009
280 \end_layout
282 \begin_layout Plain Layout
285 \end_layout
287 \begin_layout Plain Layout
289 #This program is free software: you can redistribute it and/or modify
290 \end_layout
292 \begin_layout Plain Layout
294 #it under the terms of the GNU General Public License as published by
295 \end_layout
297 \begin_layout Plain Layout
299 #the Free Software Foundation, either version 3 of the License, or
300 \end_layout
302 \begin_layout Plain Layout
304 #(at your option) any later version.
305 \end_layout
307 \begin_layout Plain Layout
310 \end_layout
312 \begin_layout Plain Layout
314 #This program is distributed in the hope that it will be useful,
315 \end_layout
317 \begin_layout Plain Layout
319 #but WITHOUT ANY WARRANTY; without even the implied warranty of
320 \end_layout
322 \begin_layout Plain Layout
324 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
325   See the
326 \end_layout
328 \begin_layout Plain Layout
330 #GNU General Public License for more details.
331 \end_layout
333 \begin_layout Plain Layout
336 \end_layout
338 \begin_layout Plain Layout
340 #You should have received a copy of the GNU General Public License
341 \end_layout
343 \begin_layout Plain Layout
345 #along with this program.
346   If not, see <http://www.gnu.org/licenses/>.
347 \end_layout
349 \end_inset
352 \end_layout
354 \begin_layout Standard
355 \begin_inset CommandInset toc
356 LatexCommand tableofcontents
358 \end_inset
361 \end_layout
363 \begin_layout Part
364 Using Newfangle
365 \end_layout
367 \begin_layout Chapter
368 Running Newfangle
369 \end_layout
371 \begin_layout Standard
372 Newfangle is a replacement for noweb, which consists of 
373 \begin_inset Flex CharStyle:Code
374 status collapsed
376 \begin_layout Plain Layout
377 notangle
378 \end_layout
380 \end_inset
383 \begin_inset Flex CharStyle:Code
384 status collapsed
386 \begin_layout Plain Layout
387 noroots
388 \end_layout
390 \end_inset
392  and 
393 \begin_inset Flex CharStyle:Code
394 status collapsed
396 \begin_layout Plain Layout
397 noweave
398 \end_layout
400 \end_inset
403 \end_layout
405 \begin_layout Standard
406 Like 
407 \begin_inset Flex CharStyle:Code
408 status collapsed
410 \begin_layout Plain Layout
411 notangle
412 \end_layout
414 \end_inset
416  and 
417 \begin_inset Flex CharStyle:Code
418 status collapsed
420 \begin_layout Plain Layout
421 noroots
422 \end_layout
424 \end_inset
426  it can read multiple named files, or from stdin.
427 \end_layout
429 \begin_layout Section
430 Listing roots
431 \end_layout
433 \begin_layout Standard
434 The -r option causes newfangle to behave like noroots.
435 \end_layout
437 \begin_layout LyX-Code
438 newfangle -r filename.tex
439 \end_layout
441 \begin_layout Standard
442 will print out the newfangle roots of a tex file.
444 \end_layout
446 \begin_layout Standard
447 Unlike the 
448 \begin_inset Flex CharStyle:Code
449 status collapsed
451 \begin_layout Plain Layout
452 noroots
453 \end_layout
455 \end_inset
457  command, the roots are not enclosed in 
458 \begin_inset Flex CharStyle:Code
459 status collapsed
461 \begin_layout Plain Layout
462 <<name>>
463 \end_layout
465 \end_inset
467 , unless at least one of the roots is defined using the 
468 \begin_inset Flex CharStyle:Code
469 status collapsed
471 \begin_layout Plain Layout
472 notangle
473 \end_layout
475 \end_inset
477  style 
478 \begin_inset Flex CharStyle:Code
479 status collapsed
481 \begin_layout Plain Layout
482 <<name>>=
483 \end_layout
485 \end_inset
488 \end_layout
490 \begin_layout Standard
491 Also, unlike noroots, it prints out all roots --- not just those that are
492  not used elsewhere.
493  I find that a root not being used, doesn't make it particularly top level.
494  My convention is that top level roots to be extracted begin with 
495 \begin_inset Flex CharStyle:Code
496 status collapsed
498 \begin_layout Plain Layout
500 \end_layout
502 \end_inset
504  and have the form of a filename.
505 \end_layout
507 \begin_layout Section
508 Extracting roots
509 \end_layout
511 \begin_layout Standard
512 notangle's 
513 \begin_inset Flex CharStyle:Code
514 status collapsed
516 \begin_layout Plain Layout
518 \end_layout
520 \end_inset
522  and 
523 \begin_inset Flex CharStyle:Code
524 status collapsed
526 \begin_layout Plain Layout
528 \end_layout
530 \end_inset
532  options are supported.
533 \end_layout
535 \begin_layout Standard
536 The standard way to extract a file would be:
537 \end_layout
539 \begin_layout LyX-Code
540 newfangle -R./Makefile.inc newfangle.tex > ./Makefile.inc
541 \end_layout
543 \begin_layout Standard
544 Unlike the 
545 \begin_inset Flex CharStyle:Code
546 status collapsed
548 \begin_layout Plain Layout
549 noroots
550 \end_layout
552 \end_inset
554  command, the 
555 \begin_inset Flex CharStyle:Code
556 status collapsed
558 \begin_layout Plain Layout
560 \end_layout
562 \end_inset
564  option does not break indenting; also the 
565 \begin_inset Flex CharStyle:Code
566 status collapsed
568 \begin_layout Plain Layout
570 \end_layout
572 \end_inset
574  option does not interrupt (and break) multi-line C macros --- or indeed
575  any line ending with a backslash.
576  This does mean that sometimes the compiler might calculate the source line
577  wrongly when generating error messages in such cases, but there isn't any
578  other way around if multi-line macros include other chunks.
579 \end_layout
581 \begin_layout Section
582 Formatting source in LaTeX
583 \end_layout
585 \begin_layout Standard
586 The noweave replacement is a set of LaTeX macros dependant upon 
587 \emph on
588 noweb.sty
589 \emph default
590 , and which can be included with:
591 \end_layout
593 \begin_layout LyX-Code
595 \backslash
596 usepackage{newfangle.sty}
597 \end_layout
599 \begin_layout Standard
600 The LaTeX macros are shown in section 
601 \begin_inset CommandInset ref
602 LatexCommand ref
603 reference "sec:Latex-Macros"
605 \end_inset
607 , and are part of a LyX module file 
608 \begin_inset Flex CharStyle:Code
609 status collapsed
611 \begin_layout Plain Layout
612 newfangle.module
613 \end_layout
615 \end_inset
617 , which automatically includes the macros in the document pre-amble when
618  the newfangle LyX module is used.
619 \end_layout
621 \begin_layout Standard
622 Because the noweave replacement is impemented in LaTeX, there is no processing
623  stage required before running the 
624 \begin_inset Flex CharStyle:Code
625 status collapsed
627 \begin_layout Plain Layout
628 latex
629 \end_layout
631 \end_inset
633  command.
634  LaTeX may need running two or more times, so that the code chunk references
635  can be fully calculated.
636 \end_layout
638 \begin_layout Standard
639 The 
640 \begin_inset Flex CharStyle:Code
641 status collapsed
643 \begin_layout Plain Layout
644 noweb.sty
645 \end_layout
647 \end_inset
649  package is required as it is used for formatting the code chunk captions
650 \end_layout
652 \begin_layout Standard
653 The 
654 \begin_inset Flex CharStyle:Code
655 status collapsed
657 \begin_layout Plain Layout
658 listings.sty
659 \end_layout
661 \end_inset
663  package is also required, as it is used for formatting the code chunks
664  themselves.
665 \end_layout
667 \begin_layout Standard
668 The 
669 \begin_inset Flex CharStyle:Code
670 status collapsed
672 \begin_layout Plain Layout
673 xargs.sty
674 \end_layout
676 \end_inset
678  package is also required.
679 \end_layout
681 \begin_layout Chapter
682 Literate Programming with Newfangle
683 \end_layout
685 \begin_layout Standard
686 Todo.
687  Should really follow on from a part-0 explanation of what literate programming
688  is.
689 \end_layout
691 \begin_layout Chapter
692 Using Newfangle with LyX
693 \end_layout
695 \begin_layout Section
696 Setting up Lyx
697 \end_layout
699 \begin_layout Subsection
700 Installing the LyX module
701 \end_layout
703 \begin_layout Standard
704 Copy 
705 \begin_inset Flex CharStyle:Code
706 status collapsed
708 \begin_layout Plain Layout
709 newfangle.module
710 \end_layout
712 \end_inset
714  to your LyX layouts directory, which for unix users will be 
715 \begin_inset Flex CharStyle:Code
716 status collapsed
718 \begin_layout Plain Layout
719 ~/.lyx/layouts
720 \end_layout
722 \end_inset
725 \end_layout
727 \begin_layout Standard
728 You will need to reconfigure LyX by clicking Tools\SpecialChar \menuseparator
729 Reconfigure, and then
730  re-start LyX.
731 \end_layout
733 \begin_layout Subsection
734 \begin_inset CommandInset label
735 LatexCommand label
736 name "sub:Configuring-the-build"
738 \end_inset
740 Configuring the build script
741 \end_layout
743 \begin_layout Standard
744 Make sure you don't have a conversion defined for Lyx → Program
745 \end_layout
747 \begin_layout Standard
748 From the menu Tools\SpecialChar \menuseparator
749 Preferences, add a conversion from Latex(Plain) → Program
750  as:
751 \end_layout
753 \begin_layout LyX-Code
754 set -x ; newfangle -Rlyx-build $$i | 
755 \end_layout
757 \begin_layout LyX-Code
758   env LYX_b=$$b LYX_i=$$i LYX_o=$$o LYX_p=$$p LYX_r=$$r bash
759 \end_layout
761 \begin_layout Standard
762 (But don't cut-n-paste it from this document or you'll be pasting a multi-line
763  string which will break your lyx preferences file).
765 \end_layout
767 \begin_layout Standard
768 I hope that one day, LyX will set these into the environment when calling
769  the build script.
770 \end_layout
772 \begin_layout Standard
773 You may also want to consider adding options to this conversion\SpecialChar \ldots{}
775 \end_layout
777 \begin_layout LyX-Code
778 parselog=/usr/share/lyx/scripts/listerrors
779 \end_layout
781 \begin_layout Standard
782 \SpecialChar \ldots{}
783 but if you do you will lose your stderr
784 \begin_inset Foot
785 status collapsed
787 \begin_layout Plain Layout
788 There is some bash plumbing to get a copy of stderr but this footnote is
789  too small
790 \end_layout
792 \end_inset
795 \end_layout
797 \begin_layout Standard
798 Now, a shell script chunk called 
799 \begin_inset Flex CharStyle:Code
800 status collapsed
802 \begin_layout Plain Layout
803 lyx-build
804 \end_layout
806 \end_inset
808  will be extracted and run whenever you choose the Document\SpecialChar \menuseparator
809 Build Program
810  menu item.
811 \end_layout
813 \begin_layout Standard
814 The lyx-build script for this document is in section 
815 \begin_inset CommandInset ref
816 LatexCommand ref
817 reference "lyx-build-script"
819 \end_inset
821  and on a unix system will extract 
822 \begin_inset Flex CharStyle:Code
823 status collapsed
825 \begin_layout Plain Layout
826 newfangle.module
827 \end_layout
829 \end_inset
831  and the 
832 \begin_inset Flex CharStyle:Code
833 status collapsed
835 \begin_layout Plain Layout
836 newfangle
837 \end_layout
839 \end_inset
841  awk script.
842 \end_layout
844 \begin_layout Subsection
845 Preparing your Lyx document
846 \end_layout
848 \begin_layout Standard
849 It is not necessary to base your literate document on any of the original
850  LyX literate classes; so select a regular class for your document type.
851 \end_layout
853 \begin_layout Standard
854 Add the new module 
855 \emph on
856 Newfangle Literate
857 \emph default
859 \emph on
860 Listings
861 \emph default
862  and possibly also 
863 \emph on
864 Logical Markup
865 \emph default
867 \end_layout
869 \begin_layout Standard
870 In the drop-down style listbox you should notice a new style defined, called
872 \emph on
873 Chunk
874 \emph default
876 \end_layout
878 \begin_layout Standard
879 When you wish to insert a literate chunk, you enter it's plain name in the
880  Chunk style, instead of the older method that used 
881 \begin_inset Flex CharStyle:Code
882 status collapsed
884 \begin_layout Plain Layout
885 <<name>>=
886 \end_layout
888 \end_inset
890  type tags.
891  Following the chunk name, you insert a listing with: Insert\SpecialChar \menuseparator
892 Program Listing.
893 \end_layout
895 \begin_layout Standard
896 Inside the white listing box you can type (or paste using shift+ctrl+V)
897  your listing.
898  There is not need to use ctrl+enter at the end of lines as with some older
899  LyX literate techniques --- just press enter as normal.
900 \end_layout
902 \begin_layout Subsubsection
903 Customising the listing appearance
904 \end_layout
906 \begin_layout Standard
907 In the final document, the code is formatted using the 
908 \noun on
909 lstlistings
910 \noun default
911  package.
912  The chunk style doesn't just define the chunk name, but can also define
913  any other chunk options supported by the lstlistings package 
914 \begin_inset Flex CharStyle:Code
915 status collapsed
917 \begin_layout Plain Layout
919 \backslash
920 lstset
921 \end_layout
923 \end_inset
925  command.
926  In fact, what you type in the chunk style is raw latex.
927  If you want to set the chunk language without having to right-click the
928  listing, just add 
929 \begin_inset Flex CharStyle:Code
930 status collapsed
932 \begin_layout Plain Layout
933 ,lanuage=C
934 \end_layout
936 \end_inset
938  after the chunk name.
939 \end_layout
941 \begin_layout Standard
942 Of course you can do this by editing the listings box advanced properties
943  by right-clicking on the listings box, but that takes longer, and you can't
944  see at-a-glance what the advanced settings are while editing the document;
945  also advanced settings apply only to that box --- the chunk settings apply
946  through the rest of the document
947 \begin_inset Foot
948 status collapsed
950 \begin_layout Plain Layout
951 It ought to apply only to subsequent chunks of the same name.
952  I'll fix that later
953 \end_layout
955 \end_inset
958 \begin_inset Note Note
959 status collapsed
961 \begin_layout Plain Layout
962 So make sure they only apply to chunks of that name
963 \end_layout
965 \end_inset
968 \end_layout
970 \begin_layout Subsubsection
971 Global customisations
972 \end_layout
974 \begin_layout Standard
975 As 
976 \emph on
977 lstlistings
978 \emph default
979  is used to set the code chunks, it's 
980 \begin_inset Flex CharStyle:Code
981 status collapsed
983 \begin_layout Plain Layout
985 \backslash
986 lstset
987 \end_layout
989 \end_inset
991  command can be used in the pre-amble to set some document wide settings.
992 \end_layout
994 \begin_layout Standard
995 If your source has many words with long sequences of capital letters, then
997 \begin_inset Flex CharStyle:Code
998 status collapsed
1000 \begin_layout Plain Layout
1001 columns=fullflexible
1002 \end_layout
1004 \end_inset
1006  may be a good idea, or the capital letters will get crowded.
1007  (I think lstlistings ought to use a slightly smaller font for captial letters
1008  so that they still fit).
1009 \end_layout
1011 \begin_layout Standard
1012 The font family 
1013 \begin_inset Flex CharStyle:Code
1014 status collapsed
1016 \begin_layout Plain Layout
1018 \backslash
1019 ttfamily
1020 \end_layout
1022 \end_inset
1024  looks more normal for code, but has no bold (unless luximono is used, but
1025  it doesn't work for me); so I use 
1026 \begin_inset Flex CharStyle:Code
1027 status collapsed
1029 \begin_layout Plain Layout
1031 \backslash
1032 color{darkgreen}
1033 \end_layout
1035 \end_inset
1037  for my keywords.
1038  With 
1039 \begin_inset Flex CharStyle:Code
1040 status collapsed
1042 \begin_layout Plain Layout
1044 \backslash
1045 ttfamily
1046 \end_layout
1048 \end_inset
1051 \begin_inset Flex CharStyle:Code
1052 status collapsed
1054 \begin_layout Plain Layout
1055 columns=fullflexible
1056 \end_layout
1058 \end_inset
1060  is used or the wrong letter spacing is used.
1061 \end_layout
1063 \begin_layout Standard
1064 In my LeTeX pre-amble I usually specialise my code format with:
1065 \end_layout
1067 \begin_layout Chunk
1068 document-preamble,language=tex
1069 \end_layout
1071 \begin_layout Standard
1072 \begin_inset listings
1073 inline false
1074 status open
1076 \begin_layout Plain Layout
1079 \backslash
1080 usepackage{xcolor}
1081 \end_layout
1083 \begin_layout Plain Layout
1086 \backslash
1087 definecolor{darkgreen}{rgb}{0,0.5,0}
1088 \end_layout
1090 \begin_layout Plain Layout
1093 \backslash
1094 lstset{numbers=left, stepnumber=5, numbersep=5pt, breaklines=false,
1095 \end_layout
1097 \begin_layout Plain Layout
1099   basicstyle=
1100 \backslash
1101 footnotesize
1102 \backslash
1103 ttfamily,
1104 \end_layout
1106 \begin_layout Plain Layout
1108   keywordstyle=
1109 \backslash
1110 color{darkgreen},
1111 \end_layout
1113 \begin_layout Plain Layout
1115   numberstyle=
1116 \backslash
1117 tiny,language=C,columns=fullflexible,
1118 \end_layout
1120 \begin_layout Plain Layout
1122   numberfirstline=true
1123 \end_layout
1125 \begin_layout Plain Layout
1128 \end_layout
1130 \end_inset
1133 \end_layout
1135 \begin_layout Chapter
1136 Newfangle with Makefiles
1137 \end_layout
1139 \begin_layout Standard
1140 \begin_inset Note Note
1141 status open
1143 \begin_layout Plain Layout
1144 This chapter needs revising
1145 \end_layout
1147 \end_inset
1150 \begin_inset Note Greyedout
1151 status open
1153 \begin_layout Plain Layout
1154 This chapter needs revising
1155 \end_layout
1157 \end_inset
1159 Here we describe a Makefile.inc that you can include in your own Makefiles,
1160  or glue as a recursive make to other projects.
1161 \end_layout
1163 \begin_layout Standard
1164 The Makefile.inc described here was put together for a Samba4 vfs module,
1165  but can be used in any Make project, including automake projects.
1166 \end_layout
1168 \begin_layout Section
1169 A word about makefiles formats
1170 \end_layout
1172 \begin_layout Standard
1173 Whitespace formatting is very important in a Makefile.
1174  The first character of each command line must be a TAB.
1175 \end_layout
1177 \begin_layout LyX-Code
1178 target: pre-requisite
1179 \begin_inset Newline newline
1180 \end_inset
1182    →    action
1183 \begin_inset Newline newline
1184 \end_inset
1186    →    action
1187 \end_layout
1189 \begin_layout Standard
1190 But a TAB is pretty hard to enter into most of the Lyx formats and insets
1191  I've been using.
1192  An alternative is to use a semi-colon after the pre-requisite, and a backslash
1193  at the end of each line (except the last).
1194  Then any whitespace (or none) can prefix each action.
1195 \end_layout
1197 \begin_layout LyX-Code
1198 target: pre-requisite ; 
1199 \backslash
1201 \begin_inset Newline newline
1202 \end_inset
1204 ␣␣action 
1205 \backslash
1207 \begin_inset Newline newline
1208 \end_inset
1210 ␣␣action
1211 \end_layout
1213 \begin_layout Standard
1214 This is the style that we use and it works pretty well for GNU make at least.
1215 \end_layout
1217 \begin_layout Standard
1218 We also adopt a convention that code chunks whose names beginning with ./
1219  should always be automatically extracted from the document.
1220  Code chunks whose names do not begin with ./ are for internal reference.
1221  (This doesn't prevent such chunks from being extracted directly).
1222 \end_layout
1224 \begin_layout Section
1225 Boot-strapping the extraction
1226 \end_layout
1228 \begin_layout Subsection
1229 Using a Makefile
1230 \end_layout
1232 \begin_layout Standard
1233 \begin_inset CommandInset label
1234 LatexCommand label
1235 name "sub:Bootstrap-Using-a-Makefile"
1237 \end_inset
1239 It seems convenient to have the makefile extract or update the C source
1240  files as part of it's operation.
1241  It also seems convenient to have the makefile itself extracted from this
1242  document.
1243 \end_layout
1245 \begin_layout Standard
1246 It would also be convenient to have the code to extract the makefile from
1247  this document to also be part of this document, however we have to start
1248  somewhere and this unfortunately requires us to type at least a few words
1249  by hand to start things off.
1250 \end_layout
1252 \begin_layout Standard
1253 Therefore we will have a minimal root fragment, which, when extracted, can
1254  cope with extracting the rest of the source.
1255  perhaps with this shell script, which could be called 
1256 \emph on
1257 autoboot
1258 \emph default
1260 \begin_inset Note Note
1261 status open
1263 \begin_layout Plain Layout
1264 FIX THIS CHUNK AND TEST IT
1265 \end_layout
1267 \end_inset
1270 \end_layout
1272 \begin_layout Chunk
1274 \end_layout
1276 \begin_layout Standard
1277 \begin_inset listings
1278 inline false
1279 status open
1281 \begin_layout Plain Layout
1283 #! /bin/sh
1284 \end_layout
1286 \begin_layout Plain Layout
1288 \end_layout
1290 \begin_layout Plain Layout
1292 MAKE_SRC="${1:-${NW_LYX:-../../noweb-lyx/noweb-lyx3.lyx}}"
1293 \end_layout
1295 \begin_layout Plain Layout
1297 MAKE_SRC=`dirname "$MAKE_SRC"`/`basename "$MAKE_SRC" .lyx`
1298 \end_layout
1300 \begin_layout Plain Layout
1302 NOWEB_SRC="${2:-${NOWEB_SRC:-$MAKE_SRC.lyx}}"
1303 \end_layout
1305 \begin_layout Plain Layout
1307 lyx -e latex $MAKE_SRC
1308 \end_layout
1310 \begin_layout Plain Layout
1312 \end_layout
1314 \begin_layout Plain Layout
1316 newfangle -R./Makefile.inc ${MAKE_SRC}.tex 
1317 \backslash
1319 \end_layout
1321 \begin_layout Plain Layout
1323   | sed "/NEWFANGLE_SOURCE=/s/^/#/;T;aNOWEB_SOURCE=$NEWFANGLE_SRC" 
1324 \backslash
1326 \end_layout
1328 \begin_layout Plain Layout
1330   | cpif ./Makefile.inc
1331 \end_layout
1333 \begin_layout Plain Layout
1335 \end_layout
1337 \begin_layout Plain Layout
1339 make -f ./Makefile.inc newfangle_sources
1340 \end_layout
1342 \end_inset
1345 \end_layout
1347 \begin_layout Standard
1348 The general Makefile can be invoked with 
1349 \emph on
1350 ./autoboot
1351 \emph default
1352  and can also be included into any automake file to automatically re-generate
1353  the source files.
1354 \end_layout
1356 \begin_layout Standard
1357 The 
1358 \emph on
1359 autoboot
1360 \emph default
1361  can be extracted with this command:
1362 \end_layout
1364 \begin_layout LyX-Code
1365 lyx -e latex newfangle.lyx && 
1366 \backslash
1368 \end_layout
1370 \begin_layout LyX-Code
1371 newfangle newfangle.lyx > ./autoboot
1372 \end_layout
1374 \begin_layout Standard
1375 This looks simple enough, but as mentioned, newfangle has to be had from
1376  somewhere before it can be extracted.
1377 \end_layout
1379 \begin_layout Subsection
1380 \begin_inset Note Note
1381 status collapsed
1383 \begin_layout Plain Layout
1384 MERGE THIS WITH THE SECTIONS OF THIS DOCUMENT
1385 \end_layout
1387 \end_inset
1389 \SpecialChar \ldots{}
1391 \end_layout
1393 \begin_layout Standard
1394 When the lyx-build chunk is executed, the current directory will be a temporary
1395  directory, and 
1396 \begin_inset Flex CharStyle:Code
1397 status collapsed
1399 \begin_layout Plain Layout
1400 LYX_SOURCE
1401 \end_layout
1403 \end_inset
1405  will refer to the tex file in this temporary directory.
1406  This is unfortunate as our makefile wants to run from the project directory
1407  where the Lyx file is kept.
1408 \end_layout
1410 \begin_layout Standard
1411 We can extract the project directory from $$r, and derive the probable Lyx
1412  filename from the noweb file that Lyx generated.
1413 \end_layout
1415 \begin_layout Chunk
1416 lyx-build-helper
1417 \end_layout
1419 \begin_layout Standard
1420 \begin_inset listings
1421 inline false
1422 status open
1424 \begin_layout Plain Layout
1426 PROJECT_DIR="$LYX_r"
1427 \end_layout
1429 \begin_layout Plain Layout
1431 LYX_SRC="$PROJECT_DIR/${LYX_i%.tex}.lyx"
1432 \end_layout
1434 \begin_layout Plain Layout
1436 TEX_DIR="$LYX_p"
1437 \end_layout
1439 \begin_layout Plain Layout
1441 TEX_SRC="$TEX_DIR/$LYX_i"
1442 \end_layout
1444 \end_inset
1447 \end_layout
1449 \begin_layout Standard
1450 And then we can define a lyx-build fragment similar to the autoboot fragment
1451 \end_layout
1453 \begin_layout Chunk
1454 lyx-build
1455 \end_layout
1457 \begin_layout Standard
1458 \begin_inset listings
1459 inline false
1460 status open
1462 \begin_layout Plain Layout
1464 #! /bin/sh
1465 \end_layout
1467 \begin_layout Plain Layout
1470 \backslash
1471 chunkref{lyx-build-helper}>
1472 \end_layout
1474 \begin_layout Plain Layout
1476 cd $PROJECT_DIR || exit 1
1477 \end_layout
1479 \begin_layout Plain Layout
1481 \end_layout
1483 \begin_layout Plain Layout
1485 #/usr/bin/newfangle -filter ./notanglefix-filter 
1486 \backslash
1488 \end_layout
1490 \begin_layout Plain Layout
1492 #  -R./Makefile.inc "../../noweb-lyx/noweb-lyx3.lyx" 
1493 \backslash
1495 \end_layout
1497 \begin_layout Plain Layout
1499 #  | sed '/NOWEB_SOURCE=/s/=.*/=samba4-dfs.lyx/' 
1500 \backslash
1502 \end_layout
1504 \begin_layout Plain Layout
1506 #  > ./Makefile.inc
1507 \end_layout
1509 \begin_layout Plain Layout
1512 \end_layout
1514 \begin_layout Plain Layout
1516 #make -f ./Makefile.inc newfangle_sources
1517 \end_layout
1519 \end_inset
1522 \end_layout
1524 \begin_layout Section
1525 Extracting Sources
1526 \end_layout
1528 \begin_layout Subsection
1529 Including Makefile.inc
1530 \end_layout
1532 \begin_layout Standard
1533 \begin_inset CommandInset label
1534 LatexCommand label
1535 name "sub:Keeping-extracted-files"
1537 \end_inset
1539 Makefile.inc will cope with extracting all the other source files from this
1540  document and keeping them up to date.
1542 \end_layout
1544 \begin_layout Standard
1545 It may also be included by a Makefile or Makefile.am defined in a Lyx document
1546  to automatically deal with the extraction of source files and documents.
1547 \end_layout
1549 \begin_layout Standard
1550 A makefile has two parts; variables must be defined before the targets that
1551  use them.
1552 \end_layout
1554 \begin_layout Chunk
1555 ./Makefile.inc
1556 \end_layout
1558 \begin_layout Standard
1559 \begin_inset listings
1560 inline false
1561 status open
1563 \begin_layout Plain Layout
1566 \backslash
1567 chunkref{Makefile.inc-vars}>
1568 \end_layout
1570 \begin_layout Plain Layout
1573 \backslash
1574 chunkref{Makefile.inc-targets}>
1575 \end_layout
1577 \end_inset
1580 \end_layout
1582 \begin_layout Standard
1583 We first define 
1584 \begin_inset Flex CharStyle:Code
1585 status collapsed
1587 \begin_layout Plain Layout
1588 NOWEB_SOURCE
1589 \end_layout
1591 \end_inset
1593  to hold the name of this Lyx file.
1594 \end_layout
1596 \begin_layout Chunk
1597 Makefile.inc-vars
1598 \end_layout
1600 \begin_layout Standard
1601 \begin_inset listings
1602 inline false
1603 status open
1605 \begin_layout Plain Layout
1607 LYX_SOURCE=
1608 \end_layout
1610 \begin_layout Plain Layout
1612 LITERATE_SOURCE=$(LYX_SOURCE)
1613 \end_layout
1615 \end_inset
1618 \end_layout
1620 \begin_layout Subsection
1621 Recursive use of Makefile.inc
1622 \end_layout
1624 \begin_layout Standard
1625 The makefile glue described here is used when building Samba4 vfs modules.
1626 \end_layout
1628 \begin_layout Standard
1629 If you are defining a module of an existing program you may find it easier
1630  to use a slight recursive make instead of including the makefile directly.
1631  This way there is less chance of definitions in Makefile.inc interfering
1632  with definitions in the main makefile, or with definitions in other Makefile.inc
1633  from other noweb modules.
1634 \end_layout
1636 \begin_layout Standard
1637 The glue works by adding a .PHONY target to call the recursive make, and
1638  adding this target as an additional pre-requisite to the existing targets.
1639 \end_layout
1641 \begin_layout Standard
1642 In this example, the existing build system already has a build target for
1644 \begin_inset Flex CharStyle:Code
1645 status collapsed
1647 \begin_layout Plain Layout
1648 example.o
1649 \end_layout
1651 \end_inset
1653 , so we just add another pre-requisite to that.
1654  In this case we use 
1655 \begin_inset Flex CharStyle:Code
1656 status collapsed
1658 \begin_layout Plain Layout
1659 example.tex.stamp
1660 \end_layout
1662 \end_inset
1664  as a pre-requisite, the stamp file's modified time indicating when all
1665  sources were extracted.
1666 \end_layout
1668 \begin_layout Chunk
1669 makefile-glue
1670 \end_layout
1672 \begin_layout Standard
1673 \begin_inset listings
1674 inline false
1675 status open
1677 \begin_layout Plain Layout
1679 $(example_srcdir)/example.o: $(example_srcdir)/example.tex.stamp
1680 \end_layout
1682 \end_inset
1685 \end_layout
1687 \begin_layout Standard
1688 The target for this new pre-requisite is generated by a recursive make using
1689  Makefile.inc which will make sure that the source is up to date, before
1690  it is built by the main projects makefile.
1691 \end_layout
1693 \begin_layout Chunk
1694 makefile-glue
1695 \end_layout
1697 \begin_layout Standard
1698 \begin_inset listings
1699 inline false
1700 status open
1702 \begin_layout Plain Layout
1704 $(example_srcdir)/example.tex.stamp: $(example_srcdir)/example.tex ; 
1705 \backslash
1707 \end_layout
1709 \begin_layout Plain Layout
1711         cd $(example_srcdir) && 
1712 \backslash
1714 \end_layout
1716 \begin_layout Plain Layout
1718         $(MAKE) -f Makefile.inc newfangle_sources
1719 \end_layout
1721 \end_inset
1724 \end_layout
1726 \begin_layout Standard
1727 We can do similar glue for the docs, clean and distclean targets.
1728  In this example our build system is using a double colon for these targets,
1729  so we use the same in our glue.
1730 \end_layout
1732 \begin_layout Chunk
1733 makefile-glue
1734 \end_layout
1736 \begin_layout Standard
1737 \begin_inset listings
1738 inline false
1739 status open
1741 \begin_layout Plain Layout
1743 docs:: docs_example
1744 \end_layout
1746 \begin_layout Plain Layout
1748 .PHONY: docs_example
1749 \end_layout
1751 \begin_layout Plain Layout
1753 docs_example:: ; cd $(example_srcdir) && 
1754 \backslash
1756 \end_layout
1758 \begin_layout Plain Layout
1760         $(MAKE) -f Makefile.inc docs
1761 \end_layout
1763 \begin_layout Plain Layout
1765 \end_layout
1767 \begin_layout Plain Layout
1769 clean:: clean_example
1770 \end_layout
1772 \begin_layout Plain Layout
1774 .PHONEY: clean_example
1775 \end_layout
1777 \begin_layout Plain Layout
1779 clean_example: ; cd $(example_srcdir) && 
1780 \backslash
1782 \end_layout
1784 \begin_layout Plain Layout
1786         $(MAKE) -f Makefile.inc clean
1787 \end_layout
1789 \begin_layout Plain Layout
1791 \end_layout
1793 \begin_layout Plain Layout
1795 distclean:: distclean_example
1796 \end_layout
1798 \begin_layout Plain Layout
1800 .PHONY: distclean_example
1801 \end_layout
1803 \begin_layout Plain Layout
1805 distclean_example: ; cd $(example_srcdir) && 
1806 \backslash
1808 \end_layout
1810 \begin_layout Plain Layout
1812         $(MAKE) -f Makefile.inc distclean
1813 \end_layout
1815 \end_inset
1818 \end_layout
1820 \begin_layout Standard
1821 We could do similarly for install targets to install the generated docs.
1822 \end_layout
1824 \begin_layout Subsection
1825 \begin_inset CommandInset label
1826 LatexCommand label
1827 name "sub:Converting-from-Lyx"
1829 \end_inset
1831 Converting from Lyx to LaTeX
1832 \end_layout
1834 \begin_layout Standard
1835 The first stage will always be to convert the Lyx file to a LaTeX file;
1836  this must be so not only because newfangle needs to to run on a TeX file,
1837  but also because the Lyx command 
1838 \emph on
1839 server-goto-file-line
1840 \begin_inset Foot
1841 status collapsed
1843 \begin_layout Plain Layout
1844 The Lyx command 
1845 \emph on
1846 server-goto-file-line
1847 \emph default
1848  is used to position the Lyx cursor at the compiler errors.
1849 \end_layout
1851 \end_inset
1854 \emph default
1855  insists that the line number provided is a line in the TeX file, and always
1856  reverse maps this to derive the line in the Lyx docment.
1857 \begin_inset Note Note
1858 status collapsed
1860 \begin_layout Plain Layout
1861 The tex file should probably be an automake extra dist sources or something,
1862  so that it gets produced and packaged by make dist
1863 \end_layout
1865 \end_inset
1868 \end_layout
1870 \begin_layout Standard
1871 The command [[lyx -e literate noweb-lyx.lyx]] will produce [[noweb-lyx.nw]]
1872  a tex file, so we define the noweb target to be the same as the Lyx file
1873  but with the .nw extension.
1874 \end_layout
1876 \begin_layout Chunk
1877 Makefile.inc-vars
1878 \end_layout
1880 \begin_layout Standard
1881 \begin_inset listings
1882 inline false
1883 status open
1885 \begin_layout Plain Layout
1887 TEX_SOURCE=$(LYX_SOURCE:.lyx=.tex)
1888 \end_layout
1890 \end_inset
1893 \end_layout
1895 \begin_layout Chunk
1896 Makefile.inc-targets
1897 \end_layout
1899 \begin_layout Standard
1900 \begin_inset listings
1901 inline false
1902 status open
1904 \begin_layout Plain Layout
1906 $(TEX_SOURCE): $(LYX_SOURCE) ;
1907 \backslash
1909 \end_layout
1911 \begin_layout Plain Layout
1913         lyx -e latex $<
1914 \end_layout
1916 \begin_layout Plain Layout
1918 clean_tex: ; rm -f -- $(TEX_SOURCE)
1919 \end_layout
1921 \end_inset
1924 \end_layout
1926 \begin_layout Subsection
1927 Extracting Program Source
1928 \end_layout
1930 \begin_layout Standard
1931 The program source is extracted using newfangle, which is designed to operate
1932  on a LaTeX document.
1934 \end_layout
1936 \begin_layout Chunk
1937 Makefile.inc-vars
1938 \end_layout
1940 \begin_layout Standard
1941 \begin_inset listings
1942 inline false
1943 status open
1945 \begin_layout Plain Layout
1947 NEWFANGLE_SOURCE=$(TEX_SOURCE)
1948 \end_layout
1950 \end_inset
1953 \end_layout
1955 \begin_layout Standard
1956 The Lyx document can result in any number of source documents, but not all
1957  of these will be changed each time the Lyx document is updated.
1958  We certainly don't want to update the timestamps of these files and cause
1959  the whole source tree to be recompiled just because the Lyx document was
1960  edited.
1962 \end_layout
1964 \begin_layout Standard
1965 To solve this problem we use a stamp file which is always updated each time
1966  the sources are extracted from the LaTeX document.
1967  If the stamp file is older than the LaTeX document, then we can make an
1968  attempt to re-extract the sources.
1969 \end_layout
1971 \begin_layout Chunk
1972 Makefile.inc-vars
1973 \end_layout
1975 \begin_layout Standard
1976 \begin_inset listings
1977 inline false
1978 status open
1980 \begin_layout Plain Layout
1982 NEWFANGLE_SOURCE_STAMP=$(NEWFANGLE_SOURCE).stamp
1983 \end_layout
1985 \end_inset
1988 \end_layout
1990 \begin_layout Chunk
1991 Makefile.inc-targets
1992 \end_layout
1994 \begin_layout Standard
1995 \begin_inset listings
1996 inline false
1997 status open
1999 \begin_layout Plain Layout
2001 $(NEWFANGLE_SOURCE_STAMP): $(NEWFANGLE_SOURCE) 
2002 \backslash
2004 \end_layout
2006 \begin_layout Plain Layout
2008                            $(NEWFANGLE_SOURCES) ; 
2009 \backslash
2011 \end_layout
2013 \begin_layout Plain Layout
2015         echo > $(NEWFANGLE_SOURCE_STAMP)
2016 \end_layout
2018 \begin_layout Plain Layout
2020 clean_stamp: ; rm -f $(NEWFANGLE_SOURCE_STAMP)
2021 \end_layout
2023 \begin_layout Plain Layout
2025 clean: clean_stamp
2026 \end_layout
2028 \end_inset
2031 \end_layout
2033 \begin_layout Subsection
2034 Extracting C sources
2035 \end_layout
2037 \begin_layout Standard
2038 We compute 
2039 \begin_inset Flex CharStyle:Code
2040 status collapsed
2042 \begin_layout Plain Layout
2043 NEWFANGLE_SOURCES
2044 \end_layout
2046 \end_inset
2048  to hold the names of all the C source files defined in this document.
2049  We compute this only once, by means of := in assignent.
2050  The sed deletes the any <
2051 \begin_inset space \hspace*{}
2052 \length 0in
2053 \end_inset
2055 < and >
2056 \begin_inset space \hspace*{}
2057 \length 0in
2058 \end_inset
2060 > which may surround the roots names (for noroots compatibility).
2062 \end_layout
2064 \begin_layout Standard
2065 As we use chunk names beginning with ./ to denote top level fragments that
2066  should be extracted, we filter out all fragments that do not begin with
2067  ./
2068 \end_layout
2070 \begin_layout Chunk
2071 Makefile.inc-vars
2072 \end_layout
2074 \begin_layout Standard
2075 \begin_inset listings
2076 inline false
2077 status open
2079 \begin_layout Plain Layout
2081 NEWFANGLE_PREFIX:=
2082 \backslash
2084 \backslash
2086 \end_layout
2088 \begin_layout Plain Layout
2090 NEWFANGLE_SOURCES:=$(shell 
2091 \backslash
2093 \end_layout
2095 \begin_layout Plain Layout
2097   newfangle -r $(NEWFANGLE_SOURCE) |
2098 \backslash
2100 \end_layout
2102 \begin_layout Plain Layout
2104   sed -e 's/^[<][<]//;s/[>][>]$$//;/^$(NEWFANGLE_PREFIX)/!d' 
2105 \backslash
2107 \end_layout
2109 \begin_layout Plain Layout
2111       -e 's/^$(NEWFANGLE_PREFIX)/
2112 \backslash
2114 \backslash
2115 //' )
2116 \end_layout
2118 \begin_layout Plain Layout
2121 \end_layout
2123 \end_inset
2126 \end_layout
2128 \begin_layout Chunk
2129 Makefile.inc-targets
2130 \end_layout
2132 \begin_layout Standard
2133 \begin_inset listings
2134 inline false
2135 status open
2137 \begin_layout Plain Layout
2139 .PHONY: echo_newfangle_sources
2140 \end_layout
2142 \begin_layout Plain Layout
2144 echo_newfangle_sources: ; @echo $(NEWFANGLE_SOURCES)
2145 \end_layout
2147 \end_inset
2150 \end_layout
2152 \begin_layout Standard
2153 We define a convenient target called 
2154 \begin_inset Flex CharStyle:Code
2155 status collapsed
2157 \begin_layout Plain Layout
2158 newfangle_sources
2159 \end_layout
2161 \end_inset
2163  to re-extract the source if the LaTeX file has been updated.
2164 \end_layout
2166 \begin_layout Chunk
2167 Makefile.inc-targets
2168 \end_layout
2170 \begin_layout Standard
2171 \begin_inset listings
2172 inline false
2173 status open
2175 \begin_layout Plain Layout
2177 .PHONY: newfangle_sources
2178 \end_layout
2180 \begin_layout Plain Layout
2182 newfangle_sources: $(NEWFANGLE_SOURCE_STAMP)
2183 \end_layout
2185 \end_inset
2188 \end_layout
2190 \begin_layout Standard
2191 And also a convenient target to remove extracted sources.
2192 \end_layout
2194 \begin_layout Chunk
2195 Makefile.inc-targets
2196 \end_layout
2198 \begin_layout Standard
2199 \begin_inset listings
2200 inline false
2201 status open
2203 \begin_layout Plain Layout
2205 .PHONY: clean_newfangle_sources
2206 \end_layout
2208 \begin_layout Plain Layout
2210 clean_newfangle_sources: ; 
2211 \backslash
2213 \end_layout
2215 \begin_layout Plain Layout
2217         rm -f -- $(NEWFANGLE_SOURCE_STAMP) $(NEWFANGLE_SOURCES)
2218 \end_layout
2220 \end_inset
2223 \end_layout
2225 \begin_layout Standard
2226 This 
2227 \begin_inset Flex CharStyle:Code
2228 status collapsed
2230 \begin_layout Plain Layout
2231 if_extension
2232 \end_layout
2234 \end_inset
2236  macro takes 4 arguments: the filename (1), some extensions to match (2)
2237  and a some shell command to return if the filename matches the exentions
2238  (3), or not (4).
2239 \end_layout
2241 \begin_layout Chunk
2242 Makefile.inc-vars
2243 \end_layout
2245 \begin_layout Standard
2246 \begin_inset listings
2247 inline false
2248 status open
2250 \begin_layout Plain Layout
2252 if_extension=$(if $(findstring $(suffix $(1)),$(2)),$(3),$(4))
2253 \end_layout
2255 \end_inset
2258 \end_layout
2260 \begin_layout Standard
2261 For some source files like C files, we want to output the line number and
2262  filename of the original LaTeX document from which the source came.
2263 \end_layout
2265 \begin_layout Standard
2266 To make this easier we define the file extensions for which we want to do
2267  this.
2268 \end_layout
2270 \begin_layout Chunk
2271 Makefile.inc-vars
2272 \end_layout
2274 \begin_layout Standard
2275 \begin_inset listings
2276 inline false
2277 status open
2279 \begin_layout Plain Layout
2281 C_EXTENSIONS=.c .h
2282 \end_layout
2284 \end_inset
2287 \end_layout
2289 \begin_layout Standard
2290 We can then use the if_extensions macro to define a macro which expands
2291  out to the 
2292 \begin_inset Flex CharStyle:Code
2293 status collapsed
2295 \begin_layout Plain Layout
2297 \end_layout
2299 \end_inset
2301  option if newfangle is being invoked in a C source file, so that C compile
2302  errors will refer to the line number in the Lyx document.
2304 \end_layout
2306 \begin_layout Chunk
2307 Makefile.inc-vars
2308 \end_layout
2310 \begin_layout Standard
2311 \begin_inset listings
2312 inline false
2313 status open
2315 \begin_layout Plain Layout
2317 nf_line=-L
2318 \end_layout
2320 \begin_layout Plain Layout
2322 newfangle=newfangle 
2323 \backslash
2325 \end_layout
2327 \begin_layout Plain Layout
2329   $(call if_extension,$(2),$(C_EXTENSIONS),$(nf_line)) 
2330 \backslash
2332 \end_layout
2334 \begin_layout Plain Layout
2336     -R"$(2)" $(1)
2337 \end_layout
2339 \end_inset
2342 \end_layout
2344 \begin_layout Standard
2345 We can use a similar trick to define an 
2346 \emph on
2347 indent
2348 \emph default
2349  macro which takes just the filename as an argument and can return a pipeline
2350  stage calling the indent command.
2351  Indent can be turned off with 
2352 \begin_inset Flex CharStyle:Code
2353 status collapsed
2355 \begin_layout Plain Layout
2356 make newfangle_sources indent=
2357 \end_layout
2359 \end_inset
2362 \end_layout
2364 \begin_layout Chunk
2365 Makefile.inc-vars
2366 \end_layout
2368 \begin_layout Standard
2369 \begin_inset listings
2370 inline false
2371 status open
2373 \begin_layout Plain Layout
2375 indent_options=-npro -kr -i8 -ts8 -sob -l80 -ss -ncs
2376 \end_layout
2378 \begin_layout Plain Layout
2380 indent=$(call if_extension,$(1),$(C_EXTENSIONS),
2381 \backslash
2383 \end_layout
2385 \begin_layout Plain Layout
2387               | indent $(indent_options))
2388 \end_layout
2390 \end_inset
2393 \end_layout
2395 \begin_layout Standard
2396 We now define the pattern for extracting a file.
2397  The files are written using noweb's 
2398 \emph on
2399 cpif
2400 \begin_inset Foot
2401 status collapsed
2403 \begin_layout Plain Layout
2405 \emph on
2406 So you still need noweb installed in order to use cpif
2407 \end_layout
2409 \end_inset
2412 \begin_inset Note Note
2413 status collapsed
2415 \begin_layout Plain Layout
2417 \emph on
2418 Write an awk version
2419 \end_layout
2421 \end_inset
2424 \emph default
2425  so that the file timestamp will not be touched if the contents haven't
2426  changed.
2427  This avoids the need to rebuild the entire project because of a typographical
2428  change in the documentation, or if only a few C source files have changed.
2429 \end_layout
2431 \begin_layout Chunk
2432 Makefile.inc-vars
2433 \end_layout
2435 \begin_layout Standard
2436 \begin_inset listings
2437 inline false
2438 status open
2440 \begin_layout Plain Layout
2442 newfangle_extract=@mkdir -p $(dir $(1)) && 
2443 \backslash
2445 \end_layout
2447 \begin_layout Plain Layout
2449   $(call newfangle,$(2),$(1)) > "$(1).tmp" && 
2450 \backslash
2452 \end_layout
2454 \begin_layout Plain Layout
2456   cat "$(1).tmp" $(indent) | cpif "$(1)" 
2457 \backslash
2459 \end_layout
2461 \begin_layout Plain Layout
2463   && rm -- "$(1).tmp" || 
2464 \backslash
2466 \end_layout
2468 \begin_layout Plain Layout
2470   (echo error newfangling $(1) from $(2) ; exit 1)
2471 \end_layout
2473 \end_inset
2476 \end_layout
2478 \begin_layout Standard
2479 We define a target which will extract or update all sources.
2480  To do this we first defined a makefile template that can do this for any
2481  source file in the LaTeX document.
2482 \end_layout
2484 \begin_layout Chunk
2485 Makefile.inc-vars
2486 \end_layout
2488 \begin_layout Standard
2489 \begin_inset listings
2490 inline false
2491 status open
2493 \begin_layout Plain Layout
2495 define NEWFANGLE_template
2496 \end_layout
2498 \begin_layout Plain Layout
2500   $(1): $(2); 
2501 \backslash
2503 \end_layout
2505 \begin_layout Plain Layout
2507     $$(call newfangle_extract,$(1),$(2))
2508 \end_layout
2510 \begin_layout Plain Layout
2512   NEWFANGLE_TARGETS+=$(1)
2513 \end_layout
2515 \begin_layout Plain Layout
2517 endef
2518 \end_layout
2520 \end_inset
2523 \end_layout
2525 \begin_layout Standard
2526 We then enumerate the discovered 
2527 \begin_inset Flex CharStyle:Code
2528 status collapsed
2530 \begin_layout Plain Layout
2531 NEWTANGLE_SOURCES
2532 \end_layout
2534 \end_inset
2536  to generate a makefile rule for each one using the makefile template we
2537  defined above.
2538 \end_layout
2540 \begin_layout Chunk
2541 Makefile.inc-targets
2542 \end_layout
2544 \begin_layout Standard
2545 \begin_inset listings
2546 inline false
2547 status open
2549 \begin_layout Plain Layout
2551 $(foreach source,$(NEWFANGLE_SOURCES),
2552 \backslash
2554 \end_layout
2556 \begin_layout Plain Layout
2558   $(eval $(call NEWFANGLE_template,$(source),$(NEWFANGLE_SOURCE))) 
2559 \backslash
2561 \end_layout
2563 \begin_layout Plain Layout
2566 \end_layout
2568 \end_inset
2571 \end_layout
2573 \begin_layout Standard
2574 These will all be built with NEWFANGLE_SOURCE_STAMP.
2575 \end_layout
2577 \begin_layout Standard
2578 We also remove the generated sources on a 
2579 \emph on
2580 make distclean
2581 \emph default
2583 \end_layout
2585 \begin_layout Chunk
2586 Makefile.inc-targets
2587 \end_layout
2589 \begin_layout Standard
2590 \begin_inset listings
2591 inline false
2592 status open
2594 \begin_layout Plain Layout
2596 _distclean: clean_newfangle_sources
2597 \end_layout
2599 \end_inset
2602 \end_layout
2604 \begin_layout Subsection
2605 Extracting Documentation
2606 \end_layout
2608 \begin_layout Standard
2609 We then identify the intermediate stages of the documentation and their
2610  build and clean targets.
2611 \end_layout
2613 \begin_layout Subsubsection
2614 Running pdflatex
2615 \end_layout
2617 \begin_layout Standard
2618 We produce a pdf file from the tex file.
2619 \end_layout
2621 \begin_layout Chunk
2622 Makefile.inc-vars
2623 \end_layout
2625 \begin_layout Standard
2626 \begin_inset listings
2627 inline false
2628 status open
2630 \begin_layout Plain Layout
2632 NEWFANGLE_PDF=$(TEX_SOURCE:.tex=.pdf)
2633 \end_layout
2635 \end_inset
2638 \end_layout
2640 \begin_layout Standard
2641 We run pdflatex twice to be sure that the contents and aux files are up
2642  to date.
2643  We certainly are required to run pdflatex twice if these files do not exist!
2644 \end_layout
2646 \begin_layout Chunk
2647 Makefile.inc-targets
2648 \end_layout
2650 \begin_layout Standard
2651 \begin_inset listings
2652 inline false
2653 status open
2655 \begin_layout Plain Layout
2657 $(NEWFANGLE_PDF): $(TEX_SOURCE); pdflatex $< && pdflatex $<
2658 \end_layout
2660 \begin_layout Plain Layout
2662 clean_pdf: ; rm -f -- $(NEWFANGLE_PDF) 
2663 \backslash
2665 \end_layout
2667 \begin_layout Plain Layout
2669                       $(TEX_SOURCE:.tex=.toc) 
2670 \backslash
2672 \end_layout
2674 \begin_layout Plain Layout
2676                       $(TEX_SOURCE:.tex=.log) 
2677 \backslash
2679 \end_layout
2681 \begin_layout Plain Layout
2683                       $(TEX_SOURCE:.tex=.aux)
2684 \end_layout
2686 \end_inset
2689 \end_layout
2691 \begin_layout Subsubsection
2692 The docs as a whole
2693 \end_layout
2695 \begin_layout Standard
2696 Currently we only build pdf as a final format, but NEWFANGLE_DOCS may later
2697  hold other output formats.
2698 \end_layout
2700 \begin_layout Chunk
2701 Makefile.inc-vars
2702 \end_layout
2704 \begin_layout Standard
2705 \begin_inset listings
2706 inline false
2707 status open
2709 \begin_layout Plain Layout
2711 NEWFANGLE_DOCS=$(NEWFANGLE_PDF)
2712 \end_layout
2714 \end_inset
2717 \end_layout
2719 \begin_layout Standard
2720 We also define newfangle_docs as a convenient phony target<
2721 \end_layout
2723 \begin_layout Chunk
2724 Makefile.inc-targets
2725 \end_layout
2727 \begin_layout Standard
2728 \begin_inset listings
2729 inline false
2730 status open
2732 \begin_layout Plain Layout
2734 .PHONY: newfangle_docs
2735 \end_layout
2737 \begin_layout Plain Layout
2739 newfangle_docs: $(NEWFANGLE_DOCS)
2740 \end_layout
2742 \begin_layout Plain Layout
2744 docs: newfangle_docs
2745 \end_layout
2747 \end_inset
2750 \end_layout
2752 \begin_layout Standard
2753 And define a convenient clean_noweb_docs which we add to the regular clean
2754  target
2755 \end_layout
2757 \begin_layout Chunk
2758 Makefile.inc-targets
2759 \end_layout
2761 \begin_layout Standard
2762 \begin_inset listings
2763 inline false
2764 status open
2766 \begin_layout Plain Layout
2768 .PHONEY: clean_newfangle_docs
2769 \end_layout
2771 \begin_layout Plain Layout
2773 clean_newfangle_docs: clean_tex clean_pdf
2774 \end_layout
2776 \begin_layout Plain Layout
2778 clean: clean_newfangle_docs
2779 \end_layout
2781 \begin_layout Plain Layout
2783 \end_layout
2785 \begin_layout Plain Layout
2787 distclean_newfangle_docs: clean_tex clean_newfangle_docs
2788 \end_layout
2790 \begin_layout Plain Layout
2792 distclean: clean distclean_newfangle_docs
2793 \end_layout
2795 \end_inset
2798 \end_layout
2800 \begin_layout Subsection
2801 Other helpers
2802 \end_layout
2804 \begin_layout Standard
2805 If Makefile.inc is included into Makefile, then extracted files can be updated
2806  with this command:
2807 \end_layout
2809 \begin_layout LyX-Code
2810 make newfangle_sources
2811 \end_layout
2813 \begin_layout Standard
2814 otherwise, with:
2815 \end_layout
2817 \begin_layout LyX-Code
2818 make -f Makefile.inc newfangle_sources
2819 \end_layout
2821 \begin_layout Part
2822 Source Code
2823 \end_layout
2825 \begin_layout Chapter
2826 Newfangle awk source code
2827 \end_layout
2829 \begin_layout Standard
2830 We use the copyright notice from chapter 
2831 \begin_inset CommandInset ref
2832 LatexCommand ref
2833 reference "cha:License"
2835 \end_inset
2838 \end_layout
2840 \begin_layout Chunk
2841 ./newfangle,language=awk,morestring=[b]{/},morekeywords=else
2842 \end_layout
2844 \begin_layout Standard
2845 \begin_inset listings
2846 inline false
2847 status open
2849 \begin_layout Plain Layout
2851 #! /usr/bin/awk -f
2852 \end_layout
2854 \begin_layout Plain Layout
2857 \backslash
2858 chunkref{gpl3-copyright}>
2859 \end_layout
2861 \end_inset
2864 \end_layout
2866 \begin_layout Standard
2867 We also use code from Arnold Robbins public domain getopt (1993 revision)
2868  defined in chapter 
2869 \begin_inset CommandInset ref
2870 LatexCommand ref
2871 reference "cha:getopt"
2873 \end_inset
2875 , and naturally want to attribute this appropriately.
2876 \end_layout
2878 \begin_layout Standard
2879 \begin_inset listings
2880 inline false
2881 status open
2883 \begin_layout Plain Layout
2885 \end_layout
2887 \begin_layout Plain Layout
2889 # NOTE: Arnold Robbins public domain getopt for awk is also used:
2890 \end_layout
2892 \begin_layout Plain Layout
2895 \backslash
2896 chunkref{getopt.awk-header}>
2897 \end_layout
2899 \begin_layout Plain Layout
2901 \end_layout
2903 \begin_layout Plain Layout
2906 \backslash
2907 chunkref{getopt.awk-getopt()}>
2908 \end_layout
2910 \begin_layout Plain Layout
2912 \end_layout
2914 \end_inset
2917 \end_layout
2919 \begin_layout Standard
2920 And include the following chunks
2921 \end_layout
2923 \begin_layout Chunk
2924 ./newfangle
2925 \end_layout
2927 \begin_layout Standard
2928 \begin_inset listings
2929 inline false
2930 status open
2932 \begin_layout Plain Layout
2935 \backslash
2936 chunkref{helper-functions}>
2937 \end_layout
2939 \begin_layout Plain Layout
2942 \backslash
2943 chunkref{mode-tracker}>
2944 \end_layout
2946 \begin_layout Plain Layout
2949 \backslash
2950 chunkref{chunk-storage-functions}>
2951 \end_layout
2953 \begin_layout Plain Layout
2956 \backslash
2957 chunkref{output_chunk_names()}>
2958 \end_layout
2960 \begin_layout Plain Layout
2963 \backslash
2964 chunkref{output_chunks()}>
2965 \end_layout
2967 \begin_layout Plain Layout
2970 \backslash
2971 chunkref{write_chunk()}>
2972 \end_layout
2974 \begin_layout Plain Layout
2977 \backslash
2978 chunkref{expand_chunk_args()}>
2979 \end_layout
2981 \begin_layout Plain Layout
2984 \backslash
2985 chunkref{begin}>
2986 \end_layout
2988 \begin_layout Plain Layout
2991 \backslash
2992 chunkref{recognize-chunk}>
2993 \end_layout
2995 \begin_layout Plain Layout
2998 \backslash
2999 chunkref{end}>
3000 \end_layout
3002 \end_inset
3005 \end_layout
3007 \begin_layout Section
3008 AWK tricks
3009 \end_layout
3011 \begin_layout Standard
3012 The portable way to erase an array in awk is to split the empty string,
3013  like this:
3014 \end_layout
3016 \begin_layout Chunk
3017 awk-delete-array,params=ARRAY
3018 \end_layout
3020 \begin_layout Standard
3021 \begin_inset listings
3022 inline false
3023 status open
3025 \begin_layout Plain Layout
3027 split("", ${ARRAY});
3028 \end_layout
3030 \end_inset
3033 \end_layout
3035 \begin_layout Chunk
3036 ,params=
3037 \end_layout
3039 \begin_layout Section
3040 Catching errors
3041 \end_layout
3043 \begin_layout Standard
3044 Fatal errors are issued with the error function:
3045 \end_layout
3047 \begin_layout Chunk
3048 error()
3049 \end_layout
3051 \begin_layout Standard
3052 \begin_inset listings
3053 inline false
3054 status open
3056 \begin_layout Plain Layout
3058 function error(message)
3059 \end_layout
3061 \begin_layout Plain Layout
3064 \end_layout
3066 \begin_layout Plain Layout
3068   print message > "/dev/stderr";
3069 \end_layout
3071 \begin_layout Plain Layout
3073   exit 1;
3074 \end_layout
3076 \begin_layout Plain Layout
3079 \end_layout
3081 \end_inset
3084 \end_layout
3086 \begin_layout Standard
3087 This is one of the helper functions.
3088 \end_layout
3090 \begin_layout Chunk
3091 helper-functions
3092 \end_layout
3094 \begin_layout Standard
3095 \begin_inset listings
3096 inline false
3097 status open
3099 \begin_layout Plain Layout
3102 \backslash
3103 chunkref{error()}>
3104 \end_layout
3106 \end_inset
3109 \end_layout
3111 \begin_layout Chapter
3112 lstlistings
3113 \end_layout
3115 \begin_layout Standard
3116 LaTeX arguments to lstlistings macros are a comma seperated list of key-value
3117  pairs.
3118  Values containing commas are enclosed in { braces }.
3119 \end_layout
3121 \begin_layout Standard
3122 We need a function that can parse such an expression and assign the values
3123  to an 
3124 \noun on
3126 \noun default
3127  associated array.
3128 \end_layout
3130 \begin_layout Standard
3131 A sample expressions is:
3132 \end_layout
3134 \begin_layout LyX-Code
3135 name=thomas, params={a, b}, something, something-else
3136 \end_layout
3138 \begin_layout Standard
3139 but we see that this is just a simpler form of this expression:
3140 \end_layout
3142 \begin_layout LyX-Code
3143 name=freddie, foo={bar=baz, quux={quirk, a=fleeg}}, etc
3144 \end_layout
3146 \begin_layout Standard
3147 And that it would be a good idea to use a recursive parser into a multi-dimensio
3148 nal hash
3149 \begin_inset Foot
3150 status collapsed
3152 \begin_layout Plain Layout
3153 as AWK doesn't have nested-hash support
3154 \end_layout
3156 \end_inset
3158 , resulting in:
3159 \end_layout
3161 \begin_layout Standard
3162 \begin_inset Tabular
3163 <lyxtabular version="3" rows="6" columns="2">
3164 <features>
3165 <column alignment="left" valignment="top" width="0">
3166 <column alignment="left" valignment="top" width="0">
3167 <row>
3168 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
3169 \begin_inset Text
3171 \begin_layout Plain Layout
3173 \end_layout
3175 \end_inset
3176 </cell>
3177 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
3178 \begin_inset Text
3180 \begin_layout Plain Layout
3181 value
3182 \end_layout
3184 \end_inset
3185 </cell>
3186 </row>
3187 <row>
3188 <cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
3189 \begin_inset Text
3191 \begin_layout Plain Layout
3192 a[name]
3193 \end_layout
3195 \end_inset
3196 </cell>
3197 <cell alignment="left" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3198 \begin_inset Text
3200 \begin_layout Plain Layout
3201 freddie
3202 \end_layout
3204 \end_inset
3205 </cell>
3206 </row>
3207 <row>
3208 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3209 \begin_inset Text
3211 \begin_layout Plain Layout
3212 a[foo, bar]
3213 \end_layout
3215 \end_inset
3216 </cell>
3217 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3218 \begin_inset Text
3220 \begin_layout Plain Layout
3222 \end_layout
3224 \end_inset
3225 </cell>
3226 </row>
3227 <row>
3228 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3229 \begin_inset Text
3231 \begin_layout Plain Layout
3232 a[foo, quux, quirk]
3233 \end_layout
3235 \end_inset
3236 </cell>
3237 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3238 \begin_inset Text
3240 \begin_layout Plain Layout
3242 \end_layout
3244 \end_inset
3245 </cell>
3246 </row>
3247 <row>
3248 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3249 \begin_inset Text
3251 \begin_layout Plain Layout
3252 a[foo, quux, a]
3253 \end_layout
3255 \end_inset
3256 </cell>
3257 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3258 \begin_inset Text
3260 \begin_layout Plain Layout
3261 fleeg
3262 \end_layout
3264 \end_inset
3265 </cell>
3266 </row>
3267 <row>
3268 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
3269 \begin_inset Text
3271 \begin_layout Plain Layout
3272 a[etc]
3273 \end_layout
3275 \end_inset
3276 </cell>
3277 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
3278 \begin_inset Text
3280 \begin_layout Plain Layout
3282 \end_layout
3284 \end_inset
3285 </cell>
3286 </row>
3287 </lyxtabular>
3289 \end_inset
3292 \end_layout
3294 \begin_layout Standard
3295 On reflection it seems that sometimes such nesting is not desirable, as
3296  the braces are also used to delimit values that contain commas --- we may
3297  consider that
3298 \end_layout
3300 \begin_layout LyX-Code
3301 name={williamson, freddie}
3302 \end_layout
3304 \begin_layout Standard
3305 should assign 
3306 \begin_inset Flex CharStyle:Code
3307 status collapsed
3309 \begin_layout Plain Layout
3310 williamson, freddie
3311 \end_layout
3313 \end_inset
3315  to 
3316 \begin_inset Flex CharStyle:Code
3317 status collapsed
3319 \begin_layout Plain Layout
3320 name
3321 \end_layout
3323 \end_inset
3325  --- so I may change this behaviour.
3326 \begin_inset Note Note
3327 status collapsed
3329 \begin_layout Plain Layout
3330 So change it
3331 \end_layout
3333 \end_inset
3336 \end_layout
3338 \begin_layout Standard
3339 Function 
3340 \begin_inset Flex Chunkref
3341 status collapsed
3343 \begin_layout Plain Layout
3344 get_chunk_args()
3345 \end_layout
3347 \end_inset
3349  will accept two paramters, 
3350 \begin_inset Flex CharStyle:Code
3351 status collapsed
3353 \begin_layout Plain Layout
3354 text
3355 \end_layout
3357 \end_inset
3359  being the text to parse, and 
3360 \begin_inset Flex CharStyle:Code
3361 status collapsed
3363 \begin_layout Plain Layout
3364 values
3365 \end_layout
3367 \end_inset
3369  being an array to receive the parsed values as described above.
3370  The optional parameter 
3371 \begin_inset Flex CharStyle:Code
3372 status collapsed
3374 \begin_layout Plain Layout
3375 path
3376 \end_layout
3378 \end_inset
3380  is used during recursion to build up the multi-dimensional array path.
3381 \end_layout
3383 \begin_layout Chunk
3384 ./newfangle
3385 \end_layout
3387 \begin_layout Standard
3388 \begin_inset listings
3389 inline false
3390 status open
3392 \begin_layout Plain Layout
3395 \backslash
3396 chunkref{get_chunk_args()}>
3397 \end_layout
3399 \end_inset
3402 \end_layout
3404 \begin_layout Chunk
3405 get_chunk_args()
3406 \end_layout
3408 \begin_layout Standard
3409 \begin_inset listings
3410 inline false
3411 status open
3413 \begin_layout Plain Layout
3415 function get_chunk_args(text, values,
3416 \end_layout
3418 \begin_layout Plain Layout
3420   # optional parameters
3421 \end_layout
3423 \begin_layout Plain Layout
3425   path, # hierarchical precursors
3426 \end_layout
3428 \begin_layout Plain Layout
3430   # local vars
3431 \end_layout
3433 \begin_layout Plain Layout
3435   a, name)
3436 \end_layout
3438 \end_inset
3441 \end_layout
3443 \begin_layout Standard
3444 The strategy is to parse the name, and then look for a value.
3445  If the value begins with a brace 
3446 \begin_inset Flex CharStyle:Code
3447 status collapsed
3449 \begin_layout Plain Layout
3451 \end_layout
3453 \end_inset
3455 , then we recurse and consume as much of the text as necessary, returning
3456  the remaining text when we encounter a leading close-brace 
3457 \begin_inset Flex CharStyle:Code
3458 status collapsed
3460 \begin_layout Plain Layout
3462 \end_layout
3464 \end_inset
3467  This being the strategy --- and executed in a loop --- we realise that
3468  we must first look for the closing brace (perhaps preceded by white space)
3469  in order to terminate the recursion, and returning remaining text.
3470 \end_layout
3472 \begin_layout Standard
3473 \begin_inset listings
3474 inline false
3475 status open
3477 \begin_layout Plain Layout
3480 \end_layout
3482 \begin_layout Plain Layout
3484   while(length(text)) {
3485 \end_layout
3487 \begin_layout Plain Layout
3489     if (match(text, "^ *}(.*)", a)) {
3490 \end_layout
3492 \begin_layout Plain Layout
3494       return a[1];
3495 \end_layout
3497 \begin_layout Plain Layout
3499     }
3500 \end_layout
3502 \begin_layout Plain Layout
3504     =<
3505 \backslash
3506 chunkref{parse-chunk-args}>
3507 \end_layout
3509 \begin_layout Plain Layout
3511   }
3512 \end_layout
3514 \begin_layout Plain Layout
3516   return text;
3517 \end_layout
3519 \begin_layout Plain Layout
3522 \end_layout
3524 \end_inset
3527 \end_layout
3529 \begin_layout Standard
3530 \begin_inset Note Note
3531 status collapsed
3533 \begin_layout Plain Layout
3534 Use BNF package here
3535 \end_layout
3537 \end_inset
3539 We can see that the text could be inspected with this regex:
3540 \end_layout
3542 \begin_layout Chunk
3543 parse-chunk-args
3544 \end_layout
3546 \begin_layout Standard
3547 \begin_inset listings
3548 inline false
3549 status open
3551 \begin_layout Plain Layout
3553 if (! match(text, " *([^,=]*[^,= ]) *(([,=]) *(([^,}]*) *,* *(.*))|)$", a))
3555 \end_layout
3557 \begin_layout Plain Layout
3559   return text;
3560 \end_layout
3562 \begin_layout Plain Layout
3565 \end_layout
3567 \end_inset
3570 \end_layout
3572 \begin_layout Standard
3573 and that 
3574 \begin_inset Flex CharStyle:Code
3575 status collapsed
3577 \begin_layout Plain Layout
3579 \end_layout
3581 \end_inset
3583  will have the following values:
3584 \end_layout
3586 \begin_layout Standard
3587 \begin_inset Tabular
3588 <lyxtabular version="3" rows="7" columns="2">
3589 <features>
3590 <column alignment="center" valignment="top" width="0">
3591 <column alignment="left" valignment="top" width="0">
3592 <row>
3593 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
3594 \begin_inset Text
3596 \begin_layout Plain Layout
3597 a[n]
3598 \end_layout
3600 \end_inset
3601 </cell>
3602 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
3603 \begin_inset Text
3605 \begin_layout Plain Layout
3606 assigned text
3607 \end_layout
3609 \end_inset
3610 </cell>
3611 </row>
3612 <row>
3613 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3614 \begin_inset Text
3616 \begin_layout Plain Layout
3618 \end_layout
3620 \end_inset
3621 </cell>
3622 <cell alignment="left" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3623 \begin_inset Text
3625 \begin_layout Plain Layout
3626 freddie
3627 \end_layout
3629 \end_inset
3630 </cell>
3631 </row>
3632 <row>
3633 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3634 \begin_inset Text
3636 \begin_layout Plain Layout
3638 \end_layout
3640 \end_inset
3641 </cell>
3642 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3643 \begin_inset Text
3645 \begin_layout Plain Layout
3646 =freddie, foo={bar=baz, quux={quirk, a=fleeg}}, etc
3647 \end_layout
3649 \end_inset
3650 </cell>
3651 </row>
3652 <row>
3653 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3654 \begin_inset Text
3656 \begin_layout Plain Layout
3658 \end_layout
3660 \end_inset
3661 </cell>
3662 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3663 \begin_inset Text
3665 \begin_layout Plain Layout
3667 \end_layout
3669 \end_inset
3670 </cell>
3671 </row>
3672 <row>
3673 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3674 \begin_inset Text
3676 \begin_layout Plain Layout
3678 \end_layout
3680 \end_inset
3681 </cell>
3682 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3683 \begin_inset Text
3685 \begin_layout Plain Layout
3686 freddie, foo={bar=baz, quux={quirk, a=fleeg}}, etc
3687 \end_layout
3689 \end_inset
3690 </cell>
3691 </row>
3692 <row>
3693 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
3694 \begin_inset Text
3696 \begin_layout Plain Layout
3698 \end_layout
3700 \end_inset
3701 </cell>
3702 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
3703 \begin_inset Text
3705 \begin_layout Plain Layout
3706 freddie
3707 \end_layout
3709 \end_inset
3710 </cell>
3711 </row>
3712 <row>
3713 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
3714 \begin_inset Text
3716 \begin_layout Plain Layout
3718 \end_layout
3720 \end_inset
3721 </cell>
3722 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
3723 \begin_inset Text
3725 \begin_layout Plain Layout
3726 , foo={bar=baz, quux={quirk, a=fleeg}}, etc
3727 \end_layout
3729 \end_inset
3730 </cell>
3731 </row>
3732 </lyxtabular>
3734 \end_inset
3737 \end_layout
3739 \begin_layout Standard
3740 a[3] will be either 
3741 \begin_inset Flex CharStyle:Code
3742 status collapsed
3744 \begin_layout Plain Layout
3746 \end_layout
3748 \end_inset
3750  or 
3751 \begin_inset Flex CharStyle:Code
3752 status collapsed
3754 \begin_layout Plain Layout
3756 \end_layout
3758 \end_inset
3760  and signify whether the option named in 
3761 \begin_inset Flex CharStyle:Code
3762 status collapsed
3764 \begin_layout Plain Layout
3765 a[1]
3766 \end_layout
3768 \end_inset
3770  has a value or not (respectively).
3771 \end_layout
3773 \begin_layout Standard
3774 If the option does have a value, then if the expression 
3775 \begin_inset Flex CharStyle:Code
3776 status collapsed
3778 \begin_layout Plain Layout
3779 substr(a[4],1,1)
3780 \end_layout
3782 \end_inset
3784  returns a brace 
3785 \begin_inset Flex CharStyle:Code
3786 status collapsed
3788 \begin_layout Plain Layout
3790 \end_layout
3792 \end_inset
3794  it will signify that we need to recurse:
3795 \end_layout
3797 \begin_layout Standard
3798 \begin_inset listings
3799 inline false
3800 status open
3802 \begin_layout Plain Layout
3804 name=a[1];
3805 \end_layout
3807 \begin_layout Plain Layout
3809 if (a[3] == "=") {
3810 \end_layout
3812 \begin_layout Plain Layout
3814   if (substr(a[4],1,1) == "{") {
3815 \end_layout
3817 \begin_layout Plain Layout
3819     text = get_chunk_args(substr(a[4],2), values, path name SUBSEP);
3820 \end_layout
3822 \begin_layout Plain Layout
3824   } else {
3825 \end_layout
3827 \begin_layout Plain Layout
3829     values[path name]=a[5];
3830 \end_layout
3832 \begin_layout Plain Layout
3834     text = a[6];
3835 \end_layout
3837 \begin_layout Plain Layout
3839   }
3840 \end_layout
3842 \begin_layout Plain Layout
3844 } else {
3845 \end_layout
3847 \begin_layout Plain Layout
3849   values[path name]="";
3850 \end_layout
3852 \begin_layout Plain Layout
3854   text = a[2];
3855 \end_layout
3857 \begin_layout Plain Layout
3860 \end_layout
3862 \end_inset
3865 \end_layout
3867 \begin_layout Standard
3868 We can test this function like this:
3869 \end_layout
3871 \begin_layout Chunk
3872 gca-test.awk
3873 \end_layout
3875 \begin_layout Standard
3876 \begin_inset listings
3877 inline false
3878 status open
3880 \begin_layout Plain Layout
3883 \backslash
3884 chunkref{get_chunk_args()}>
3885 \end_layout
3887 \begin_layout Plain Layout
3889 BEGIN {
3890 \end_layout
3892 \begin_layout Plain Layout
3894   SUBSEP=".";
3895 \end_layout
3897 \begin_layout Plain Layout
3899 \end_layout
3901 \begin_layout Plain Layout
3903   print get_chunk_args("name=freddie, foo={bar=baz, quux={quirk, a=fleeg}},
3904  etc", a);
3905 \end_layout
3907 \begin_layout Plain Layout
3909   for (b in a) {
3910 \end_layout
3912 \begin_layout Plain Layout
3914     print "a[" b "] => " a[b];
3915 \end_layout
3917 \begin_layout Plain Layout
3919   }
3920 \end_layout
3922 \begin_layout Plain Layout
3925 \end_layout
3927 \end_inset
3930 \end_layout
3932 \begin_layout Standard
3933 which should give this output:
3934 \end_layout
3936 \begin_layout Chunk
3937 gca-test.awk-results
3938 \end_layout
3940 \begin_layout Standard
3941 \begin_inset listings
3942 inline false
3943 status open
3945 \begin_layout Plain Layout
3947 a[foo.quux.quirk] => 
3948 \end_layout
3950 \begin_layout Plain Layout
3952 a[foo.quux.a] => fleeg
3953 \end_layout
3955 \begin_layout Plain Layout
3957 a[foo.bar] => baz
3958 \end_layout
3960 \begin_layout Plain Layout
3962 a[etc] => 
3963 \end_layout
3965 \begin_layout Plain Layout
3967 a[name] => freddie
3968 \end_layout
3970 \end_inset
3973 \end_layout
3975 \begin_layout Chapter
3976 Expanding chunk arguments
3977 \end_layout
3979 \begin_layout Standard
3980 \begin_inset CommandInset label
3981 LatexCommand label
3982 name "cha:Chunk Arguments"
3984 \end_inset
3987 \begin_inset Note Note
3988 status open
3990 \begin_layout Plain Layout
3991 Explain this in the documentation section too
3992 \end_layout
3994 \end_inset
3996 As an extension to many literate-programming styles, newfangle permits code
3997  chunks to take parameters and thus operate somewhat like C pre-processor
3998  macros, or like C++ templates.
3999 \end_layout
4001 \begin_layout Standard
4002 Chunk parameters are declared with a chunk argument called 
4003 \begin_inset Flex CharStyle:Code
4004 status collapsed
4006 \begin_layout Plain Layout
4007 params
4008 \end_layout
4010 \end_inset
4012 , which holds a semi-colon separated list of parameters, like this:
4013 \end_layout
4015 \begin_layout LyX-Code
4016 achunk,language=C,params=name;address
4017 \end_layout
4019 \begin_layout Standard
4020 When such a chunk is included the arguments are expressed thus, in square
4021  brackets as optional arguments separated by a comma
4022 \begin_inset Note Note
4023 status open
4025 \begin_layout Plain Layout
4026 We ought to support qouting in {} like ({Jones, John}, Jones@example.com)
4027 \end_layout
4029 \end_inset
4032 \end_layout
4034 \begin_layout LyX-Code
4036 \backslash
4037 chunkref{achunk}(John Jones, jones@example.com)
4038 \end_layout
4040 \begin_layout Standard
4041 Within the body a chunk, parameters are expressed as: 
4042 \begin_inset Flex CharStyle:Code
4043 status collapsed
4045 \begin_layout Plain Layout
4046 ${name}
4047 \end_layout
4049 \end_inset
4051  and 
4052 \begin_inset Flex CharStyle:Code
4053 status collapsed
4055 \begin_layout Plain Layout
4056 ${address}
4057 \end_layout
4059 \end_inset
4062  There is a strong case that a LaTeX style notation should be used, like
4064 \backslash
4065 param{name} --- =<
4066 \backslash
4067 param{name}> as it would appear in the lstlisting.
4068  Such notation would make me go blind, but I do intend to adopt it.
4069 \end_layout
4071 \begin_layout Standard
4072 We therefore need a function 
4073 \begin_inset Flex CharStyle:Code
4074 status collapsed
4076 \begin_layout Plain Layout
4077 expand_chunk_args
4078 \end_layout
4080 \end_inset
4082  which will take a block of text, a list of permitted parameters and the
4083  arguments which must substitute for the parameters.
4084  We also need to be able to parse a parameter list into an array of parameters.
4085 \end_layout
4087 \begin_layout Section
4088 Parsing argument lists
4089 \end_layout
4091 \begin_layout Standard
4092 An argument list may be as simple as in 
4093 \begin_inset Flex CharStyle:Code
4094 status collapsed
4096 \begin_layout Plain Layout
4098 \backslash
4099 chunkref{pull}(thing, otherthing)
4100 \end_layout
4102 \end_inset
4104  or as complex as:
4105 \end_layout
4107 \begin_layout LyX-Code
4109 \backslash
4110 chunkref{pull}(things[x, y], get_other_things(a, "all")) 
4111 \end_layout
4113 \begin_layout Standard
4114 --- which for all it's commas and quotes and parenthesis represents only
4115  two parameters.
4116 \end_layout
4118 \begin_layout Standard
4119 How do we stop the comma in 
4120 \begin_inset Flex CharStyle:Code
4121 status collapsed
4123 \begin_layout Plain Layout
4124 things[x,y]
4125 \end_layout
4127 \end_inset
4129  from splitting it into two arguments 
4130 \begin_inset Flex CharStyle:Code
4131 status collapsed
4133 \begin_layout Plain Layout
4134 things[x
4135 \end_layout
4137 \end_inset
4139  and 
4140 \begin_inset Flex CharStyle:Code
4141 status collapsed
4143 \begin_layout Plain Layout
4145 \end_layout
4147 \end_inset
4149 --- neither of which make sense on their own? 
4150 \end_layout
4152 \begin_layout Standard
4153 One way it could be done is by refusing to split text between maching delimiters
4154 , such as 
4155 \begin_inset Flex CharStyle:Code
4156 status collapsed
4158 \begin_layout Plain Layout
4160 \end_layout
4162 \end_inset
4165 \begin_inset Flex CharStyle:Code
4166 status collapsed
4168 \begin_layout Plain Layout
4170 \end_layout
4172 \end_inset
4175 \begin_inset Flex CharStyle:Code
4176 status collapsed
4178 \begin_layout Plain Layout
4180 \end_layout
4182 \end_inset
4185 \begin_inset Flex CharStyle:Code
4186 status collapsed
4188 \begin_layout Plain Layout
4190 \end_layout
4192 \end_inset
4195 \begin_inset Flex CharStyle:Code
4196 status collapsed
4198 \begin_layout Plain Layout
4200 \end_layout
4202 \end_inset
4205 \begin_inset Flex CharStyle:Code
4206 status collapsed
4208 \begin_layout Plain Layout
4210 \end_layout
4212 \end_inset
4214 and most likely also 
4215 \begin_inset Flex CharStyle:Code
4216 status collapsed
4218 \begin_layout Plain Layout
4220 \end_layout
4222 \end_inset
4225 \begin_inset Flex CharStyle:Code
4226 status collapsed
4228 \begin_layout Plain Layout
4230 \end_layout
4232 \end_inset
4234  and 
4235 \begin_inset Flex CharStyle:Code
4236 status collapsed
4238 \begin_layout Plain Layout
4240 \end_layout
4242 \end_inset
4245 \begin_inset Flex CharStyle:Code
4246 status collapsed
4248 \begin_layout Plain Layout
4250 \end_layout
4252 \end_inset
4255  Of course this also makes it impossible to pass such mis-matched code fragments
4256  as parameters, but I don't think users could cope with people passing such
4257  code unbalanced fragments as chunk parameters
4258 \begin_inset Foot
4259 status collapsed
4261 \begin_layout Plain Layout
4262 I know that I couldn't cope with users doing such things, and although the
4263  GPL3 license prevents me from actually forbidding anyone from trying, if
4264  they wan't it to work they'll have to write the code themselves and not
4265  expect any support from me.
4266 \end_layout
4268 \end_inset
4271 \end_layout
4273 \begin_layout Standard
4274 Unfortunately, the full set of matching delimiters may vary from language
4275  to language.
4276  In certain C++ template contexts, 
4277 \begin_inset Flex CharStyle:Code
4278 status collapsed
4280 \begin_layout Plain Layout
4282 \end_layout
4284 \end_inset
4286  and 
4287 \begin_inset Flex CharStyle:Code
4288 status collapsed
4290 \begin_layout Plain Layout
4292 \end_layout
4294 \end_inset
4296  would count as delimiters, and yet in other contexts they would not.
4297 \end_layout
4299 \begin_layout Standard
4300 This puts me in the unfortunate position of having to parse-somewhat all
4301  programming languages without knowing what they are! Eventually this will
4302  be managed in the chunk modes in chapter 
4303 \begin_inset CommandInset ref
4304 LatexCommand ref
4305 reference "cha:modes"
4307 \end_inset
4310 \end_layout
4312 \begin_layout Standard
4313 Another way, inspired by LaTeX, is if the first character of the parameter
4314  is an opening-delimiter, to read up to the matching closing-delimiter wthout
4315  considering intervening commas; thus the above example could be expressed:
4316 \end_layout
4318 \begin_layout LyX-Code
4320 \backslash
4321 chunkref{pull}({things[x, y]}, [get_other_things(a, "all")])
4322 \end_layout
4324 \begin_layout Standard
4325 --- using 
4326 \begin_inset Flex CharStyle:Code
4327 status collapsed
4329 \begin_layout Plain Layout
4331 \end_layout
4333 \end_inset
4336 \begin_inset Flex CharStyle:Code
4337 status collapsed
4339 \begin_layout Plain Layout
4341 \end_layout
4343 \end_inset
4345  to wrap the first agument, and 
4346 \begin_inset Flex CharStyle:Code
4347 status collapsed
4349 \begin_layout Plain Layout
4351 \end_layout
4353 \end_inset
4356 \begin_inset Flex CharStyle:Code
4357 status collapsed
4359 \begin_layout Plain Layout
4361 \end_layout
4363 \end_inset
4365 to wrap the second argument and protect the comma.
4366 \end_layout
4368 \begin_layout Standard
4369 In the meantime, I'll work with the first method, and a fixed list of delimiters.
4370 \end_layout
4372 \begin_layout Standard
4373 -------
4374 \end_layout
4376 \begin_layout Chunk
4377 parse_chunk_args
4378 \end_layout
4380 \begin_layout Standard
4381 \begin_inset listings
4382 inline false
4383 status open
4385 \begin_layout Plain Layout
4387 function parse_chunk_args(text, values,
4388 \end_layout
4390 \begin_layout Plain Layout
4392   # optional parameters
4393 \end_layout
4395 \begin_layout Plain Layout
4397   path, # hierarchical precursors
4398 \end_layout
4400 \begin_layout Plain Layout
4402   stack, # delimiters to be matched
4403 \end_layout
4405 \begin_layout Plain Layout
4407   delimiters,
4408 \end_layout
4410 \begin_layout Plain Layout
4412   # local vars
4413 \end_layout
4415 \begin_layout Plain Layout
4417   a, name)
4418 \end_layout
4420 \begin_layout Plain Layout
4423 \end_layout
4425 \begin_layout Plain Layout
4427   split(chunklet_parts[2], call_chunk_args, " *, *");
4428 \end_layout
4430 \begin_layout Plain Layout
4433 \end_layout
4435 \end_inset
4438 \end_layout
4440 \begin_layout Standard
4441 The strategy is to parse the name, and then look for a value.
4442  If the value begins with a brace 
4443 \begin_inset Flex CharStyle:Code
4444 status collapsed
4446 \begin_layout Plain Layout
4448 \end_layout
4450 \end_inset
4452 , then we recurse and consume as much of the text as necessary, returning
4453  the remaining text when we encounter a leading close-brace 
4454 \begin_inset Flex CharStyle:Code
4455 status collapsed
4457 \begin_layout Plain Layout
4459 \end_layout
4461 \end_inset
4464  This being the strategy --- and executed in a loop --- we realise that
4465  we must first look for the closing brace (perhaps preceded by white space)
4466  in order to terminate the recursion, and returning remaining text.
4467 \end_layout
4469 \begin_layout Standard
4470 \begin_inset listings
4471 inline false
4472 status open
4474 \begin_layout Plain Layout
4477 \end_layout
4479 \begin_layout Plain Layout
4481   modes["
4482 \backslash
4483 "", "delimiters" ]="
4484 \backslash
4485 "" "|
4486 \backslash
4488 \end_layout
4490 \begin_layout Plain Layout
4492   modes["
4493 \backslash
4494 "", "terminators"]="
4495 \backslash
4497 \end_layout
4499 \begin_layout Plain Layout
4501   modes["{",  "delimiters" ]="
4502 \backslash
4504 \backslash
4506 \backslash
4507 "|{|}|(|)|
4508 \backslash
4510 \backslash
4512 \backslash
4514 \backslash
4515 ]|'|/*" "|}";
4516 \end_layout
4518 \begin_layout Plain Layout
4520   modes["{",  "terminators"]="}";
4521 \end_layout
4523 \begin_layout Plain Layout
4525   modes["[",  "delimiters" ]="
4526 \backslash
4528 \backslash
4530 \backslash
4531 "|{|}|(|)|
4532 \backslash
4534 \backslash
4536 \backslash
4538 \backslash
4539 ]|'|/*" "|
4540 \backslash
4542 \backslash
4544 \end_layout
4546 \begin_layout Plain Layout
4548   modes["[",  "terminators"]="]";
4549 \end_layout
4551 \begin_layout Plain Layout
4553   modes["(",  "delimiters" ]="
4554 \backslash
4556 \backslash
4558 \backslash
4559 "|{|}|(|)|
4560 \backslash
4562 \backslash
4564 \backslash
4566 \backslash
4567 ]|'|/*" "|)";
4568 \end_layout
4570 \begin_layout Plain Layout
4572   modes["(",  "terminators"]=")";
4573 \end_layout
4575 \begin_layout Plain Layout
4577   modes["'",  "delimiters" ]="
4578 \backslash
4580 \backslash
4582 \end_layout
4584 \begin_layout Plain Layout
4586   modes["'",  "terminators"]="'";
4587 \end_layout
4589 \begin_layout Plain Layout
4591   modes["/*", "terminators"]="*/";
4592 \end_layout
4594 \begin_layout Plain Layout
4596   modes["//", "terminators"]="
4597 \backslash
4599 \end_layout
4601 \begin_layout Plain Layout
4603   modes["",   "delimiters" ]="
4604 \backslash
4606 \backslash
4608 \backslash
4609 "|{|}|(|)|
4610 \backslash
4612 \backslash
4614 \backslash
4616 \backslash
4617 ]|'|/*";
4618 \end_layout
4620 \begin_layout Plain Layout
4622   mode="";
4623 \end_layout
4625 \begin_layout Plain Layout
4627 \end_layout
4629 \begin_layout Plain Layout
4631   delimiters=modes[mode, "delimiters"];
4632 \end_layout
4634 \begin_layout Plain Layout
4636 \end_layout
4638 \begin_layout Plain Layout
4640   while(length(text)) {
4641 \end_layout
4643 \begin_layout Plain Layout
4645     if match(text, "(" delimiters ")", a) {
4646 \end_layout
4648 \begin_layout Plain Layout
4650       if (a[1] == modes[mode, "terminator"]) return result a[1];
4651 \end_layout
4653 \begin_layout Plain Layout
4655       new_mode=a[1];
4656 \end_layout
4658 \begin_layout Plain Layout
4660       #check if new_mode is defined
4661 \end_layout
4663 \begin_layout Plain Layout
4665       if (! (new_mode, "terminators") in modes) {
4666 \end_layout
4668 \begin_layout Plain Layout
4670         error("Delimiter %s set unknown mode in text: %s", new_mode, text);
4671 \end_layout
4673 \begin_layout Plain Layout
4675       }
4676 \end_layout
4678 \begin_layout Plain Layout
4680       text = substr(text, RSTART));
4681 \end_layout
4683 \begin_layout Plain Layout
4685       result = result substr(text, 1, RSTART -1) RECURSE(text,,new_mode);
4686 \end_layout
4688 \begin_layout Plain Layout
4690     }
4691 \end_layout
4693 \begin_layout Plain Layout
4695     result = result text;
4696 \end_layout
4698 \begin_layout Plain Layout
4700     text = "";
4701 \end_layout
4703 \begin_layout Plain Layout
4705   }
4706 \end_layout
4708 \begin_layout Plain Layout
4710   return result;
4711 \end_layout
4713 \begin_layout Plain Layout
4716 \end_layout
4718 \end_inset
4721 \end_layout
4723 \begin_layout Standard
4724 We can test this function like this:
4725 \end_layout
4727 \begin_layout Chunk
4728 pca-test.awk
4729 \end_layout
4731 \begin_layout Standard
4732 \begin_inset listings
4733 inline false
4734 status open
4736 \begin_layout Plain Layout
4739 \backslash
4740 chunkref{get_chunk_args()}>
4741 \end_layout
4743 \begin_layout Plain Layout
4745 BEGIN {
4746 \end_layout
4748 \begin_layout Plain Layout
4750   SUBSEP=".";
4751 \end_layout
4753 \begin_layout Plain Layout
4755 \end_layout
4757 \begin_layout Plain Layout
4759   print parse_chunk_args("things[x, y], get_other_things(a, 
4760 \backslash
4761 "all
4762 \backslash
4763 ")", a);
4764 \end_layout
4766 \begin_layout Plain Layout
4768   for (b in a) {
4769 \end_layout
4771 \begin_layout Plain Layout
4773     print "a[" b "] => " a[b];
4774 \end_layout
4776 \begin_layout Plain Layout
4778   }
4779 \end_layout
4781 \begin_layout Plain Layout
4784 \end_layout
4786 \end_inset
4789 \end_layout
4791 \begin_layout Standard
4792 which should give this output:
4793 \end_layout
4795 \begin_layout Chunk
4796 pca-test.awk-results
4797 \end_layout
4799 \begin_layout Standard
4800 \begin_inset listings
4801 inline false
4802 status open
4804 \begin_layout Plain Layout
4806 a[foo.quux.quirk] => 
4807 \end_layout
4809 \begin_layout Plain Layout
4811 a[foo.quux.a] => fleeg
4812 \end_layout
4814 \begin_layout Plain Layout
4816 a[foo.bar] => baz
4817 \end_layout
4819 \begin_layout Plain Layout
4821 a[etc] => 
4822 \end_layout
4824 \begin_layout Plain Layout
4826 a[name] => freddie
4827 \end_layout
4829 \end_inset
4832 \end_layout
4834 \begin_layout Section
4835 Expanding parameters
4836 \end_layout
4838 \begin_layout Standard
4839 \begin_inset CommandInset label
4840 LatexCommand label
4841 name "Here-we-split"
4843 \end_inset
4845 Here we split the text on 
4846 \begin_inset Flex CharStyle:Code
4847 status collapsed
4849 \begin_layout Plain Layout
4851 \end_layout
4853 \end_inset
4855  which means that all parts except the first will begin with a parameter
4856  name.
4857  The split function will consume the literal 
4858 \begin_inset Flex CharStyle:Code
4859 status collapsed
4861 \begin_layout Plain Layout
4863 \end_layout
4865 \end_inset
4867  in each case.
4868 \end_layout
4870 \begin_layout Chunk
4871 expand_chunk_args()
4872 \end_layout
4874 \begin_layout Standard
4875 \begin_inset listings
4876 inline false
4877 status open
4879 \begin_layout Plain Layout
4881 function expand_chunk_args(text, params, args,  
4882 \end_layout
4884 \begin_layout Plain Layout
4886   p, text_array, next_text, v, t, l)
4887 \end_layout
4889 \begin_layout Plain Layout
4892 \end_layout
4894 \begin_layout Plain Layout
4896   if (split(text, text_array, "
4897 \backslash
4899 \backslash
4900 ${")) {
4901 \end_layout
4903 \begin_layout Plain Layout
4905     =<
4906 \backslash
4907 chunkref{substitute-chunk-args}>
4908 \end_layout
4910 \begin_layout Plain Layout
4912   }
4913 \end_layout
4915 \begin_layout Plain Layout
4917   return text;
4918 \end_layout
4920 \begin_layout Plain Layout
4923 \end_layout
4925 \end_inset
4928 \end_layout
4930 \begin_layout Standard
4931 First, we produce an associative array of substitution values indexed by
4932  parameter names
4933 \end_layout
4935 \begin_layout Chunk
4936 substitute-chunk-args
4937 \end_layout
4939 \begin_layout Standard
4940 \begin_inset listings
4941 inline false
4942 status open
4944 \begin_layout Plain Layout
4946 for(p in params) {
4947 \end_layout
4949 \begin_layout Plain Layout
4951   v[params[p]]=args[p];
4952 \end_layout
4954 \begin_layout Plain Layout
4957 \end_layout
4959 \end_inset
4962 \end_layout
4964 \begin_layout Standard
4965 We accumulate substituted text in the variable 
4966 \begin_inset Flex CharStyle:Code
4967 status collapsed
4969 \begin_layout Plain Layout
4970 text
4971 \end_layout
4973 \end_inset
4976  As the first part of the split function is the part before the delimiter
4977  --- which is 
4978 \begin_inset Flex CharStyle:Code
4979 status collapsed
4981 \begin_layout Plain Layout
4983 \end_layout
4985 \end_inset
4987  in our case --- this part will never contain a parameter reference, so
4988  we assign this directly to the result kept in 
4989 \begin_inset Flex CharStyle:Code
4990 status collapsed
4992 \begin_layout Plain Layout
4993 $text
4994 \end_layout
4996 \end_inset
4999 \begin_inset listings
5000 inline false
5001 status open
5003 \begin_layout Plain Layout
5005 text=text_array[1];
5006 \end_layout
5008 \end_inset
5011 \end_layout
5013 \begin_layout Standard
5014 We then iterate over the remaining values in the array
5015 \begin_inset Foot
5016 status collapsed
5018 \begin_layout Plain Layout
5019 I don't know why I think that it will enumerate the array in order, but
5020  it seems to work
5021 \end_layout
5023 \end_inset
5026 \begin_inset Note Note
5027 status collapsed
5029 \begin_layout Plain Layout
5030 So fix it or porve it
5031 \end_layout
5033 \end_inset
5035 , and substitute each reference for it's argument.
5036 \end_layout
5038 \begin_layout Standard
5039 \begin_inset listings
5040 inline false
5041 status open
5043 \begin_layout Plain Layout
5045 for(t in text_array) if (t>1) {
5046 \end_layout
5048 \begin_layout Plain Layout
5050   =<
5051 \backslash
5052 chunkref{substitute-chunk-arg}>
5053 \end_layout
5055 \begin_layout Plain Layout
5058 \end_layout
5060 \end_inset
5063 \end_layout
5065 \begin_layout Standard
5066 After the split on 
5067 \begin_inset Flex CharStyle:Code
5068 status collapsed
5070 \begin_layout Plain Layout
5072 \end_layout
5074 \end_inset
5076  a valid parameter reference will consist of valid parameter name terminated
5077  by a close-brace 
5078 \begin_inset Flex CharStyle:Code
5079 status collapsed
5081 \begin_layout Plain Layout
5083 \end_layout
5085 \end_inset
5088  A valid character name begins with the underscore or a letter, and may
5089  contain letters, digits or underscores.
5090 \end_layout
5092 \begin_layout Standard
5093 A valid looking reference that is not actually the name of a parameter will
5094  be and not substituted.
5095  This is good because there is nothing to substitute anyway, and it avoids
5096  clashes when writing code for languages where ${\SpecialChar \ldots{}
5097 } is a valid construct
5098  --- such constructs will not be interfered with unless the parameter name
5099  also matches.
5100 \end_layout
5102 \begin_layout Chunk
5103 substitute-chunk-arg
5104 \end_layout
5106 \begin_layout Standard
5107 \begin_inset listings
5108 inline false
5109 status open
5111 \begin_layout Plain Layout
5113 if (match(text_array[t], "^([a-zA-Z_][a-zA-Z0-9_]*)}", l) &&
5114 \end_layout
5116 \begin_layout Plain Layout
5118     l[1] in v) 
5119 \end_layout
5121 \begin_layout Plain Layout
5124 \end_layout
5126 \begin_layout Plain Layout
5128   text = text v[l[1]] substr(text_array[t], length(l[1])+2);
5129 \end_layout
5131 \begin_layout Plain Layout
5133 } else {
5134 \end_layout
5136 \begin_layout Plain Layout
5138   text = text "${" text_array[t];
5139 \end_layout
5141 \begin_layout Plain Layout
5144 \end_layout
5146 \end_inset
5149 \end_layout
5151 \begin_layout Chapter
5152 Recognizing Chunks
5153 \end_layout
5155 \begin_layout Standard
5156 Newfangle recognizes noweb chunks, but as we also want better LaTeX integration
5157  we will recognize any of these:
5158 \end_layout
5160 \begin_layout Itemize
5161 notangle chunks matching the pattern 
5162 \begin_inset Flex CharStyle:Code
5163 status collapsed
5165 \begin_layout Plain Layout
5167 \begin_inset space \hspace*{}
5168 \length 0in
5169 \end_inset
5171 <.*?>
5172 \begin_inset space \hspace*{}
5173 \length 0in
5174 \end_inset
5177 \end_layout
5179 \end_inset
5182 \end_layout
5184 \begin_layout Itemize
5185 a chunks beginning with 
5186 \begin_inset Flex CharStyle:Code
5187 status collapsed
5189 \begin_layout Plain Layout
5191 \backslash
5192 begin{lstlistings}
5193 \end_layout
5195 \end_inset
5197 , possibly with 
5198 \backslash
5199 Chunk{\SpecialChar \ldots{}
5200 } on the previous line
5201 \end_layout
5203 \begin_layout Itemize
5204 an older form I have used, beginning with 
5205 \begin_inset Flex CharStyle:Code
5206 status collapsed
5208 \begin_layout Plain Layout
5210 \backslash
5211 begin{Chunk}[options]
5212 \end_layout
5214 \end_inset
5216  --- also more suitable for plain LaTeX users
5217 \begin_inset Foot
5218 status collapsed
5220 \begin_layout Plain Layout
5221 Is there such a thing as plain LaTeX?
5222 \end_layout
5224 \end_inset
5227 \end_layout
5229 \begin_layout Section
5230 Chunk start
5231 \end_layout
5233 \begin_layout Standard
5234 The variable 
5235 \begin_inset Flex CharStyle:Code
5236 status collapsed
5238 \begin_layout Plain Layout
5239 chunking
5240 \end_layout
5242 \end_inset
5244  is used to signify that we are processing a code chunk and not document.
5245  In such a state, input lines will be assigned to the current chunk; otherwise
5246  they are ignored.
5247 \end_layout
5249 \begin_layout Subsection
5250 lstlistings
5251 \end_layout
5253 \begin_layout Standard
5254 Our current scheme is to recognize the new lstlisting chunks, but these
5255  may be preceded by a 
5256 \begin_inset Flex CharStyle:Code
5257 status collapsed
5259 \begin_layout Plain Layout
5261 \backslash
5262 Chunk
5263 \end_layout
5265 \end_inset
5267  command which in LyX is a more convenient way to pass the chunk name to
5268  the 
5269 \begin_inset Flex CharStyle:Code
5270 status collapsed
5272 \begin_layout Plain Layout
5274 \backslash
5275 begin{lstlistings}
5276 \end_layout
5278 \end_inset
5280  command, and a more visible way to specify other 
5281 \begin_inset Flex CharStyle:Code
5282 status collapsed
5284 \begin_layout Plain Layout
5285 lstset
5286 \end_layout
5288 \end_inset
5290  settings.
5291 \end_layout
5293 \begin_layout Standard
5294 The arguments to the 
5295 \begin_inset Flex CharStyle:Code
5296 status collapsed
5298 \begin_layout Plain Layout
5300 \backslash
5301 Chunk
5302 \end_layout
5304 \end_inset
5306  command are a name, and then a comma-seperated list of key-value pairs
5307  after the manner of 
5308 \begin_inset Flex CharStyle:Code
5309 status collapsed
5311 \begin_layout Plain Layout
5313 \backslash
5314 lstset
5315 \end_layout
5317 \end_inset
5320  (In fact within the LaTeX 
5321 \begin_inset Flex CharStyle:Code
5322 status collapsed
5324 \begin_layout Plain Layout
5326 \backslash
5327 Chunk
5328 \end_layout
5330 \end_inset
5332  macro (section 
5333 \begin_inset CommandInset ref
5334 LatexCommand ref
5335 reference "sub:The-chunk-command"
5337 \end_inset
5339 ) the text 
5340 \begin_inset Flex CharStyle:Code
5341 status collapsed
5343 \begin_layout Plain Layout
5344 name=
5345 \end_layout
5347 \end_inset
5349  is prefixed to the argument which is then literally passed to 
5350 \begin_inset Flex CharStyle:Code
5351 status collapsed
5353 \begin_layout Plain Layout
5355 \backslash
5356 lstset
5357 \end_layout
5359 \end_inset
5362 \end_layout
5364 \begin_layout Chunk
5365 recognize-chunk
5366 \end_layout
5368 \begin_layout Standard
5369 \begin_inset listings
5370 inline false
5371 status open
5373 \begin_layout Plain Layout
5376 \backslash
5378 \backslash
5379 Chunk{/ {
5380 \end_layout
5382 \begin_layout Plain Layout
5384   if (match($0, "^
5385 \backslash
5387 \backslash
5389 \backslash
5391 \backslash
5392 Chunk{ *([^ ,}]*),?(.*)}", line)) {
5393 \end_layout
5395 \begin_layout Plain Layout
5397     next_chunk_name = line[1];
5398 \end_layout
5400 \begin_layout Plain Layout
5402     get_chunk_args(line[2], next_chunk_args);
5403 \end_layout
5405 \begin_layout Plain Layout
5407   }
5408 \end_layout
5410 \begin_layout Plain Layout
5412   next;
5413 \end_layout
5415 \begin_layout Plain Layout
5418 \end_layout
5420 \end_inset
5423 \end_layout
5425 \begin_layout Standard
5426 We also make a basic attempt to parse the name out of the 
5427 \begin_inset Flex CharStyle:Code
5428 status collapsed
5430 \begin_layout Plain Layout
5432 \backslash
5433 lstlistings[name=
5434 \begin_inset space \hspace{}
5435 \length 0in
5436 \end_inset
5438 chunk-name]
5439 \end_layout
5441 \end_inset
5443  text, otherwise we fall back to the name found in the previous chunk command.
5444  This attempt is very basic and doesn't support commas or spaces or square
5445  brackets as part of the chunkname.
5446  We also recognize 
5447 \begin_inset Flex CharStyle:Code
5448 status collapsed
5450 \begin_layout Plain Layout
5452 \backslash
5453 begin{Chunk}
5454 \end_layout
5456 \end_inset
5458  which is convenient for some users
5459 \begin_inset Foot
5460 status open
5462 \begin_layout Plain Layout
5463 but not yet supported in the LaTeX macros
5464 \end_layout
5466 \end_inset
5469 \begin_inset Note Note
5470 status collapsed
5472 \begin_layout Plain Layout
5473 Add noweave support
5474 \end_layout
5476 \end_inset
5479 \end_layout
5481 \begin_layout Standard
5482 \begin_inset listings
5483 inline false
5484 status open
5486 \begin_layout Plain Layout
5489 \backslash
5491 \backslash
5492 begin{lstlisting}|^
5493 \backslash
5495 \backslash
5496 begin{Chunk}/ {
5497 \end_layout
5499 \begin_layout Plain Layout
5501   if (match($0, "}.*[[,] *name= *{? *([^], }]*)", line)) {
5502 \end_layout
5504 \begin_layout Plain Layout
5506     new_chunk(line[1]);
5507 \end_layout
5509 \begin_layout Plain Layout
5511   } else {
5512 \end_layout
5514 \begin_layout Plain Layout
5516     new_chunk(next_chunk_name, next_chunk_args);
5517 \end_layout
5519 \begin_layout Plain Layout
5521   }
5522 \end_layout
5524 \begin_layout Plain Layout
5526   chunking=1;
5527 \end_layout
5529 \begin_layout Plain Layout
5531   next;
5532 \end_layout
5534 \begin_layout Plain Layout
5537 \end_layout
5539 \end_inset
5542 \end_layout
5544 \begin_layout Subsection
5545 Noweb
5546 \end_layout
5548 \begin_layout Standard
5549 We recognize notangle style chunks too:
5550 \end_layout
5552 \begin_layout Chunk
5553 recognize-chunk
5554 \end_layout
5556 \begin_layout Standard
5557 \begin_inset listings
5558 inline false
5559 status open
5561 \begin_layout Plain Layout
5563 /^[<]<.*[>]>=/ {
5564 \end_layout
5566 \begin_layout Plain Layout
5568   if (match($0, "^[<]<(.*)[>]>= *$", line)) {
5569 \end_layout
5571 \begin_layout Plain Layout
5573     chunking=1;
5574 \end_layout
5576 \begin_layout Plain Layout
5578     notangle_mode=1;
5579 \end_layout
5581 \begin_layout Plain Layout
5583     new_chunk(line[1]);
5584 \end_layout
5586 \begin_layout Plain Layout
5588     next;
5589 \end_layout
5591 \begin_layout Plain Layout
5593   }
5594 \end_layout
5596 \begin_layout Plain Layout
5599 \end_layout
5601 \end_inset
5604 \end_layout
5606 \begin_layout Section
5607 Chunk end
5608 \end_layout
5610 \begin_layout Standard
5611 Likewise, we need to recognize when a chunk ends.
5612 \end_layout
5614 \begin_layout Subsection
5615 lstlistings
5616 \end_layout
5618 \begin_layout Standard
5619 The 
5620 \begin_inset Flex CharStyle:Code
5621 status collapsed
5623 \begin_layout Plain Layout
5625 \end_layout
5627 \end_inset
5629  in 
5630 \begin_inset Flex CharStyle:Code
5631 status collapsed
5633 \begin_layout Plain Layout
5634 [e]end{lislisting}
5635 \end_layout
5637 \end_inset
5639  is surrounded by square brackets so that when this document is processed,
5640  this chunk doesn't terminate early when the lstlistings package recognizes
5641  it's own end-string! 
5642 \begin_inset Note Greyedout
5643 status collapsed
5645 \begin_layout Plain Layout
5646 This doesn't make sense as the regex is anchored with ^, which this line
5647  does not begin with!
5648 \end_layout
5650 \end_inset
5653 \begin_inset Note Note
5654 status open
5656 \begin_layout Plain Layout
5657 No, it doesn't.
5658 \end_layout
5660 \end_inset
5663 \end_layout
5665 \begin_layout Chunk
5666 recognize-chunk
5667 \end_layout
5669 \begin_layout Standard
5670 \begin_inset listings
5671 inline false
5672 status open
5674 \begin_layout Plain Layout
5677 \backslash
5679 \backslash
5680 [e]nd{lstlisting}|^
5681 \backslash
5683 \backslash
5684 [e]nd{Chunk}/ {
5685 \end_layout
5687 \begin_layout Plain Layout
5689   chunking=0;
5690 \end_layout
5692 \begin_layout Plain Layout
5694   active_chunk="";
5695 \end_layout
5697 \begin_layout Plain Layout
5699   next;
5700 \end_layout
5702 \begin_layout Plain Layout
5705 \end_layout
5707 \end_inset
5710 \end_layout
5712 \begin_layout Subsection
5713 noweb
5714 \end_layout
5716 \begin_layout Chunk
5717 recognize-chunk
5718 \end_layout
5720 \begin_layout Standard
5721 \begin_inset listings
5722 inline false
5723 status open
5725 \begin_layout Plain Layout
5727 /^@ *$/ {
5728 \end_layout
5730 \begin_layout Plain Layout
5732   chunking=0;
5733 \end_layout
5735 \begin_layout Plain Layout
5737   active_chunk="";
5738 \end_layout
5740 \begin_layout Plain Layout
5743 \end_layout
5745 \end_inset
5748 \end_layout
5750 \begin_layout Standard
5751 All other recognizers are only of effect if we are chunking; there's no
5752  point in looking at lines if they aren't part of a chunk, so we just ignore
5753  them as efficiently as we can.
5754 \end_layout
5756 \begin_layout Chunk
5757 recognize-chunk
5758 \end_layout
5760 \begin_layout Standard
5761 \begin_inset listings
5762 inline false
5763 status open
5765 \begin_layout Plain Layout
5767 ! chunking { next; }
5768 \end_layout
5770 \end_inset
5773 \end_layout
5775 \begin_layout Section
5776 Chunk contents
5777 \end_layout
5779 \begin_layout Standard
5780 Chunk contents are any lines read while 
5781 \begin_inset Flex CharStyle:Code
5782 status collapsed
5784 \begin_layout Plain Layout
5785 chunking
5786 \end_layout
5788 \end_inset
5790  is true.
5791  Some chunk contents are special in that they refer to other chunks, and
5792  will be replaced by the contents of these chunks when the file is generated.
5793 \end_layout
5795 \begin_layout Standard
5796 \begin_inset CommandInset label
5797 LatexCommand label
5798 name "sub:ORS-chunk-text"
5800 \end_inset
5802 We add the output record separator 
5803 \begin_inset Flex CharStyle:Code
5804 status collapsed
5806 \begin_layout Plain Layout
5808 \end_layout
5810 \end_inset
5812  to the line now, because we will set 
5813 \begin_inset Flex CharStyle:Code
5814 status collapsed
5816 \begin_layout Plain Layout
5818 \end_layout
5820 \end_inset
5822  to the empty string when we generate the output
5823 \begin_inset Foot
5824 status open
5826 \begin_layout Plain Layout
5827 So that we can print partial lines using 
5828 \begin_inset Flex CharStyle:Code
5829 status collapsed
5831 \begin_layout Plain Layout
5832 print
5833 \end_layout
5835 \end_inset
5837  instead of 
5838 \begin_inset Flex CharStyle:Code
5839 status collapsed
5841 \begin_layout Plain Layout
5842 printf
5843 \end_layout
5845 \end_inset
5848 \end_layout
5850 \end_inset
5853 \end_layout
5855 \begin_layout Chunk
5856 recognize-chunk
5857 \end_layout
5859 \begin_layout Standard
5860 \begin_inset listings
5861 inline false
5862 status open
5864 \begin_layout Plain Layout
5866 length(active_chunk) {
5867 \end_layout
5869 \begin_layout Plain Layout
5871   =<
5872 \backslash
5873 chunkref{process-chunk}>
5874 \end_layout
5876 \begin_layout Plain Layout
5879 \end_layout
5881 \end_inset
5884 \end_layout
5886 \begin_layout Standard
5887 If a chunk just consisted of plain text, we could handle the chunk like
5888  this:
5889 \end_layout
5891 \begin_layout Chunk
5892 process-chunk-simple
5893 \end_layout
5895 \begin_layout Standard
5896 \begin_inset listings
5897 inline false
5898 status open
5900 \begin_layout Plain Layout
5902 chunk_line(active_chunk, $0 ORS);
5903 \end_layout
5905 \end_inset
5908 \end_layout
5910 \begin_layout Standard
5911 but in fact a chunk can include references to other chunks.
5912  Chunk includes are traditionally written as 
5913 \begin_inset Flex CharStyle:Code
5914 status collapsed
5916 \begin_layout Plain Layout
5917 <<chunk-name>>
5918 \end_layout
5920 \end_inset
5922 , but we support other variations.
5923 \end_layout
5925 \begin_layout Subsection
5926 \begin_inset CommandInset label
5927 LatexCommand label
5928 name "sub:lstlistings-includes"
5930 \end_inset
5932 lstlistings
5933 \end_layout
5935 \begin_layout Standard
5936 If 
5937 \begin_inset Flex CharStyle:Code
5938 status collapsed
5940 \begin_layout Plain Layout
5942 \backslash
5943 lstset{escapeinside={=<}{>}}
5944 \end_layout
5946 \end_inset
5948  is set, then we can use 
5949 \begin_inset Flex CharStyle:Code
5950 status collapsed
5952 \begin_layout Plain Layout
5954 \backslash
5955 chunkref{
5956 \begin_inset space \hspace{}
5957 \length 0in
5958 \end_inset
5960 chunk-name}>
5961 \end_layout
5963 \end_inset
5965  in listings.
5966  The sequence 
5967 \begin_inset Flex CharStyle:Code
5968 status collapsed
5970 \begin_layout Plain Layout
5972 \end_layout
5974 \end_inset
5976  was chosen because:
5977 \end_layout
5979 \begin_layout Enumerate
5980 it is a better mnemonic than 
5981 \begin_inset Flex CharStyle:Code
5982 status collapsed
5984 \begin_layout Plain Layout
5985 <<chunk-name>>
5986 \end_layout
5988 \end_inset
5990  in that the = sign signifies equivalent or substitutability, 
5991 \end_layout
5993 \begin_layout Enumerate
5994 and because =< is not valid in C or in any language I can think of 
5995 \end_layout
5997 \begin_layout Enumerate
5998 and also because lstlistings doesn't like 
5999 \begin_inset Flex CharStyle:Code
6000 status collapsed
6002 \begin_layout Plain Layout
6004 \end_layout
6006 \end_inset
6008  as an end delimiter for the 
6009 \emph on
6010 texcl
6011 \emph default
6012  escape, so we must make do with a single 
6013 \begin_inset Flex CharStyle:Code
6014 status collapsed
6016 \begin_layout Plain Layout
6018 \end_layout
6020 \end_inset
6022 , which is better matched by 
6023 \begin_inset Flex CharStyle:Code
6024 status collapsed
6026 \begin_layout Plain Layout
6028 \end_layout
6030 \end_inset
6032  than 
6033 \begin_inset Flex CharStyle:Code
6034 status collapsed
6036 \begin_layout Plain Layout
6038 \end_layout
6040 \end_inset
6043 \end_layout
6045 \begin_layout Standard
6046 As each chunk line may contain more than one chunk include, we will split
6047  out chunk includes in an iterative fashion
6048 \begin_inset Foot
6049 status open
6051 \begin_layout Plain Layout
6052 Contrary to our use of 
6053 \begin_inset Flex CharStyle:Code
6054 status collapsed
6056 \begin_layout Plain Layout
6057 split
6058 \end_layout
6060 \end_inset
6062  when substituting parameters in chapter 
6063 \begin_inset CommandInset ref
6064 LatexCommand ref
6065 reference "Here-we-split"
6067 \end_inset
6070 \end_layout
6072 \end_inset
6075 \end_layout
6077 \begin_layout Standard
6078 First, as long as the chunk contains a 
6079 \begin_inset Flex CharStyle:Code
6080 status collapsed
6082 \begin_layout Plain Layout
6084 \backslash
6085 chunkref
6086 \end_layout
6088 \end_inset
6090  command we take as much as we can up to the first 
6091 \begin_inset Flex CharStyle:Code
6092 status collapsed
6094 \begin_layout Plain Layout
6096 \backslash
6097 chunkref
6098 \end_layout
6100 \end_inset
6102  command.
6103 \end_layout
6105 \begin_layout Chunk
6106 process-chunk
6107 \end_layout
6109 \begin_layout Standard
6110 \begin_inset listings
6111 inline false
6112 status open
6114 \begin_layout Plain Layout
6116 chunk = $0;
6117 \end_layout
6119 \begin_layout Plain Layout
6121 indent = 0;
6122 \end_layout
6124 \begin_layout Plain Layout
6126 while(match(chunk, 
6127 \end_layout
6129 \begin_layout Plain Layout
6131             "([=]<
6132 \backslash
6134 \backslash
6136 \backslash
6138 \backslash
6139 chunkref{([^}>]*)}(
6140 \backslash
6142 \backslash
6144 \backslash
6146 \backslash
6147 )|)>|<<([a-zA-Z_][-a-zA-Z0-9_]*)>>)", 
6148 \end_layout
6150 \begin_layout Plain Layout
6152             line)
6153 \backslash
6155 \end_layout
6157 \begin_layout Plain Layout
6159 ) {
6160 \end_layout
6162 \begin_layout Plain Layout
6164   chunklet = substr(chunk, 1, RSTART - 1);
6165 \end_layout
6167 \end_inset
6170 \end_layout
6172 \begin_layout Standard
6173 We keep track of the indent count, by counting the number of literal characters
6174  found.
6175  We can then preserve this indent on each output line when multi-line chunks
6176  are expanded.
6177 \end_layout
6179 \begin_layout Standard
6180 We then process this first part literal text, and set the chunk which is
6181  still to be processed to be the text after the 
6182 \begin_inset Flex CharStyle:Code
6183 status collapsed
6185 \begin_layout Plain Layout
6187 \backslash
6188 chunkref
6189 \end_layout
6191 \end_inset
6193  command, which we will process next as we continue around the loop.
6194 \end_layout
6196 \begin_layout Standard
6197 \begin_inset listings
6198 inline false
6199 status open
6201 \begin_layout Plain Layout
6203   indent += length(chunklet);
6204 \end_layout
6206 \begin_layout Plain Layout
6208   chunk_line(active_chunk, chunklet);
6209 \end_layout
6211 \begin_layout Plain Layout
6213   chunk = substr(chunk, RSTART + RLENGTH);
6214 \end_layout
6216 \end_inset
6219 \end_layout
6221 \begin_layout Standard
6222 We then consider the type of chunk command we have found, whether it is
6223  the newfangle style command beginning with 
6224 \begin_inset Flex CharStyle:Code
6225 status collapsed
6227 \begin_layout Plain Layout
6229 \end_layout
6231 \end_inset
6233  or the older notangle style beginning with 
6234 \begin_inset Flex CharStyle:Code
6235 status collapsed
6237 \begin_layout Plain Layout
6239 \end_layout
6241 \end_inset
6245 \end_layout
6247 \begin_layout Standard
6248 Newfangle chunks may have parameters contained within square brackets.
6249  These will be matched in 
6250 \begin_inset Flex CharStyle:Code
6251 status collapsed
6253 \begin_layout Plain Layout
6254 line[3]
6255 \end_layout
6257 \end_inset
6259  and are considered at this stage of processing to be part of the name of
6260  the chunk to be included.
6261 \end_layout
6263 \begin_layout Standard
6264 \begin_inset listings
6265 inline false
6266 status open
6268 \begin_layout Plain Layout
6270   if (substr(line[1], 1, 1) == "=") {
6271 \end_layout
6273 \begin_layout Plain Layout
6275     # chunk name up to }
6276 \end_layout
6278 \begin_layout Plain Layout
6280     chunk_include(active_chunk, line[2] line[3], indent);
6281 \end_layout
6283 \begin_layout Plain Layout
6285   } else if (substr(line[1], 1, 1) == "<") {
6286 \end_layout
6288 \begin_layout Plain Layout
6290     chunk_include(active_chunk, line[4], indent);
6291 \end_layout
6293 \begin_layout Plain Layout
6295   } else {
6296 \end_layout
6298 \begin_layout Plain Layout
6300     error("Unknown chunk fragment: " line[1]);
6301 \end_layout
6303 \begin_layout Plain Layout
6305   }
6306 \end_layout
6308 \end_inset
6311 \end_layout
6313 \begin_layout Standard
6314 The loop will continue until there are no more chunkref statements in the
6315  text, at which point we process the final part of the chunk.
6316 \end_layout
6318 \begin_layout Standard
6319 \begin_inset listings
6320 inline false
6321 status open
6323 \begin_layout Plain Layout
6326 \end_layout
6328 \begin_layout Plain Layout
6330 chunk_line(active_chunk, chunk);
6331 \end_layout
6333 \end_inset
6336 \end_layout
6338 \begin_layout Standard
6339 \begin_inset CommandInset label
6340 LatexCommand label
6341 name "lone-newline"
6343 \end_inset
6345 We add the newline character as a chunklet on it's own, to make it easier
6346  to detect new lines and thus manage indentation when processing the output.
6347 \end_layout
6349 \begin_layout Standard
6350 \begin_inset listings
6351 inline false
6352 status open
6354 \begin_layout Plain Layout
6356 chunk_line(active_chunk, "
6357 \backslash
6358 n");
6359 \end_layout
6361 \end_inset
6364 \end_layout
6366 \begin_layout Standard
6367 We will also permit a chunk-part number to follow in square brackets, so
6368  that 
6369 \begin_inset Flex CharStyle:Code
6370 status collapsed
6372 \begin_layout Plain Layout
6374 \backslash
6375 chunkref{chunk-name[1]}>
6376 \end_layout
6378 \end_inset
6380  will refer to the first part only.
6381  This can make it easy to include a C function prototype in a header file,
6382  if the first part of the chunk is just the function prototype without the
6383  trailing semi-colon.
6384  The header file would include the prototype with the trailing semi-colon,
6385  like this:
6386 \end_layout
6388 \begin_layout LyX-Code
6390 \backslash
6391 chunkref{chunk-name[1]}>;
6392 \end_layout
6394 \begin_layout Standard
6395 This is handled in section 
6396 \begin_inset CommandInset ref
6397 LatexCommand ref
6398 reference "sub:Chunk-parts"
6400 \end_inset
6403 \end_layout
6405 \begin_layout Standard
6406 We should perhaps introduce a notion of language specific chunk options;
6407  so that perhaps we could specify:
6408 \end_layout
6410 \begin_layout LyX-Code
6412 \backslash
6413 chunkref{chunk-name[function-declaration]}>;
6414 \end_layout
6416 \begin_layout Standard
6417 which applies a transform 
6418 \begin_inset Flex CharStyle:Code
6419 status collapsed
6421 \begin_layout Plain Layout
6422 function-declaration
6423 \end_layout
6425 \end_inset
6427  to the chunk --- which in this case would extract a function prototype
6428  from a function.
6429 \begin_inset Note Note
6430 status open
6432 \begin_layout Plain Layout
6433 So do it
6434 \end_layout
6436 \end_inset
6439 \end_layout
6441 \begin_layout Chapter
6442 Processing Options
6443 \end_layout
6445 \begin_layout Standard
6446 At the start, first we set the default options.
6447 \end_layout
6449 \begin_layout Chunk
6450 default-options
6451 \end_layout
6453 \begin_layout Standard
6454 \begin_inset listings
6455 inline false
6456 status open
6458 \begin_layout Plain Layout
6460 debug=0;
6461 \end_layout
6463 \begin_layout Plain Layout
6465 linenos=0;
6466 \end_layout
6468 \begin_layout Plain Layout
6470 notangle_mode=0;
6471 \end_layout
6473 \begin_layout Plain Layout
6475 SUBSEP=",";
6476 \end_layout
6478 \begin_layout Plain Layout
6480 root="*";
6481 \end_layout
6483 \end_inset
6486 \end_layout
6488 \begin_layout Standard
6489 Then we use getopt the standard way, and null out ARGV afterwards in the
6490  normal AWK fashion.
6491 \end_layout
6493 \begin_layout Chunk
6494 read-options
6495 \end_layout
6497 \begin_layout Standard
6498 \begin_inset listings
6499 inline false
6500 status open
6502 \begin_layout Plain Layout
6504 Optind = 1    # skip ARGV[0]
6505 \end_layout
6507 \begin_layout Plain Layout
6509 while(getopt(ARGC, ARGV, "R:Ldhr")!=-1) {
6510 \end_layout
6512 \begin_layout Plain Layout
6514   =<
6515 \backslash
6516 chunkref{handle-options}>
6517 \end_layout
6519 \begin_layout Plain Layout
6522 \end_layout
6524 \begin_layout Plain Layout
6526 for (i=1; i<Optind; i++) { ARGV[i]=""; }
6527 \end_layout
6529 \end_inset
6532 \end_layout
6534 \begin_layout Standard
6535 This is how we handle our options:
6536 \end_layout
6538 \begin_layout Chunk
6539 handle-options
6540 \end_layout
6542 \begin_layout Standard
6543 \begin_inset listings
6544 inline false
6545 status open
6547 \begin_layout Plain Layout
6549 if (Optopt == "R") root = Optarg;
6550 \end_layout
6552 \begin_layout Plain Layout
6554 else if (Optopt == "r") root="";
6555 \end_layout
6557 \begin_layout Plain Layout
6559 else if (Optopt == "L") linenos = 1;
6560 \end_layout
6562 \begin_layout Plain Layout
6564 else if (Optopt == "d") debug = 1;
6565 \end_layout
6567 \begin_layout Plain Layout
6569 else if (Optopt == "h") help();
6570 \end_layout
6572 \begin_layout Plain Layout
6574 else if (Optopt == "?") help();
6575 \end_layout
6577 \end_inset
6580 \end_layout
6582 \begin_layout Standard
6583 We do all of this at the beginning of the program
6584 \end_layout
6586 \begin_layout Chunk
6587 begin
6588 \end_layout
6590 \begin_layout Standard
6591 \begin_inset listings
6592 inline false
6593 status open
6595 \begin_layout Plain Layout
6597 BEGIN {
6598 \end_layout
6600 \begin_layout Plain Layout
6602   =<
6603 \backslash
6604 chunkref{constants}>
6605 \end_layout
6607 \begin_layout Plain Layout
6609   =<
6610 \backslash
6611 chunkref{default-options}>
6612 \end_layout
6614 \begin_layout Plain Layout
6616 \end_layout
6618 \begin_layout Plain Layout
6620   =<
6621 \backslash
6622 chunkref{read-options}>
6623 \end_layout
6625 \begin_layout Plain Layout
6628 \end_layout
6630 \end_inset
6633 \end_layout
6635 \begin_layout Standard
6636 And have a simple help function
6637 \end_layout
6639 \begin_layout Chunk
6640 help()
6641 \end_layout
6643 \begin_layout Standard
6644 \begin_inset listings
6645 inline false
6646 status open
6648 \begin_layout Plain Layout
6650 function help() {
6651 \end_layout
6653 \begin_layout Plain Layout
6655   print "Usage:"
6656 \end_layout
6658 \begin_layout Plain Layout
6660   print "  newfangle [-L] -R<rootname> [source.tex ...]"
6661 \end_layout
6663 \begin_layout Plain Layout
6665   print "  newfangle -r [source.tex ...]"
6666 \end_layout
6668 \begin_layout Plain Layout
6670   print "  If the filename, source.tex is not specified then stdin is used"
6671 \end_layout
6673 \begin_layout Plain Layout
6675   print
6676 \end_layout
6678 \begin_layout Plain Layout
6680   print "-L causes the C statement: #line <lineno> 
6681 \backslash
6682 "filename
6683 \backslash
6684 "" to be issued"
6685 \end_layout
6687 \begin_layout Plain Layout
6689   print "-R causes the named root to be written to stdout"
6690 \end_layout
6692 \begin_layout Plain Layout
6694   print "-r lists all roots in the file (even those used elsewhere)"
6695 \end_layout
6697 \begin_layout Plain Layout
6699   exit 1;
6700 \end_layout
6702 \begin_layout Plain Layout
6705 \end_layout
6707 \end_inset
6710 \end_layout
6712 \begin_layout Chapter
6713 Chunk Language Modes
6714 \end_layout
6716 \begin_layout Standard
6717 \begin_inset CommandInset label
6718 LatexCommand label
6719 name "cha:modes"
6721 \end_inset
6724 \begin_inset Note Greyedout
6725 status open
6727 \begin_layout Plain Layout
6728 This feature is in-development and does not work yet
6729 \end_layout
6731 \end_inset
6734 \begin_inset Note Note
6735 status open
6737 \begin_layout Plain Layout
6738 In Progress!
6739 \end_layout
6741 \end_inset
6744 \end_layout
6746 \begin_layout Standard
6747 lstlistings and newfangle both recognize source languages, and perform some
6748  basic parsing.
6749  lstlistings can detect strings and comments within a language definition
6750  and perform suitable rendering, such as italics for comments, and visible-space
6751 s within strings.
6752 \end_layout
6754 \begin_layout Standard
6755 Newfangle similarly can recognize strings, and comments, etc, within a language,
6756  so that any chunks included with 
6757 \begin_inset Flex CharStyle:Code
6758 status collapsed
6760 \begin_layout Plain Layout
6762 \backslash
6763 chunkref
6764 \end_layout
6766 \end_inset
6768  can be suitably quoted.
6769 \end_layout
6771 \begin_layout Standard
6772 For instance, consider this chunk with 
6773 \begin_inset Flex CharStyle:Code
6774 status collapsed
6776 \begin_layout Plain Layout
6777 language=perl
6778 \end_layout
6780 \end_inset
6783 \end_layout
6785 \begin_layout Chunk
6786 example-perl,language=perl
6787 \end_layout
6789 \begin_layout Standard
6790 \begin_inset listings
6791 inline false
6792 status open
6794 \begin_layout Plain Layout
6796 s/"$/'/;
6797 \end_layout
6799 \end_inset
6802 \end_layout
6804 \begin_layout Standard
6805 If it were included in a chunk with 
6806 \begin_inset Flex CharStyle:Code
6807 status collapsed
6809 \begin_layout Plain Layout
6810 language=sh
6811 \end_layout
6813 \end_inset
6815 , like this:
6816 \end_layout
6818 \begin_layout Chunk
6819 example-sh,language=sh
6820 \end_layout
6822 \begin_layout Standard
6823 \begin_inset listings
6824 inline false
6825 status open
6827 \begin_layout Plain Layout
6829 perl -pe "=<
6830 \backslash
6831 chunkref{example-perl}>"
6832 \end_layout
6834 \end_inset
6837 \end_layout
6839 \begin_layout Standard
6840 would need to generate output like this if it were to work: 
6841 \end_layout
6843 \begin_layout LyX-Code
6844 perl -pe "s/
6845 \backslash
6847 \backslash
6848 $/'/;"
6849 \end_layout
6851 \begin_layout Standard
6852 See that the double quote " as part of the regex has been quoted with a
6853  slash to protect it from shell interpretation.
6854 \end_layout
6856 \begin_layout Standard
6857 If that were then included in a chunk with 
6858 \begin_inset Flex CharStyle:Code
6859 status collapsed
6861 \begin_layout Plain Layout
6862 language=make
6863 \end_layout
6865 \end_inset
6867 , like this:
6868 \end_layout
6870 \begin_layout Chunk
6871 example-makefile,language=make
6872 \end_layout
6874 \begin_layout Standard
6875 \begin_inset listings
6876 inline false
6877 status open
6879 \begin_layout Plain Layout
6881 target: pre-req
6882 \end_layout
6884 \begin_layout Plain Layout
6886                 =<
6887 \backslash
6888 chunkref{example-sh}>
6889 \end_layout
6891 \end_inset
6894 \end_layout
6896 \begin_layout Standard
6897 We would need the output to look like this --- note the $$:
6898 \end_layout
6900 \begin_layout LyX-Code
6901 target: pre-req
6902 \end_layout
6904 \begin_layout LyX-Code
6905         perl -pe "s/
6906 \backslash
6908 \backslash
6909 $$/'/;"
6910 \end_layout
6912 \begin_layout Standard
6913 In order to make this work, we need to define a mode-tracker for each supported
6914  language, that can detect the various quoting modes, and provide a transformati
6915 on that must be applied to any included text so that included text will
6916  be interpreted correctly after the additional interpolation that it will
6917  be subject to at run-time.
6918 \end_layout
6920 \begin_layout Standard
6921 For example, the transformation for text to be inserted into sh double-quoted
6922  strings would be something like:
6923 \end_layout
6925 \begin_layout LyX-Code
6927 \backslash
6929 \backslash
6931 \backslash
6933 \backslash
6935 \backslash
6937 \backslash
6938 /g;s/$/
6939 \backslash
6941 \backslash
6942 $/g;s/"/
6943 \backslash
6945 \backslash
6946 "/g;
6947 \end_layout
6949 \begin_layout Standard
6950 which protects 
6951 \begin_inset Flex CharStyle:Code
6952 status collapsed
6954 \begin_layout Plain Layout
6956 \backslash
6957  $ "
6958 \end_layout
6960 \end_inset
6963 \end_layout
6965 \begin_layout Standard
6966 \begin_inset Note Note
6967 status collapsed
6969 \begin_layout Plain Layout
6970 I don't think this example is true
6971 \end_layout
6973 \end_inset
6975 The mode tracker must also track nested mode-changes, as in this 
6976 \begin_inset Flex CharStyle:Code
6977 status collapsed
6979 \begin_layout Plain Layout
6981 \end_layout
6983 \end_inset
6985  example.
6986 \end_layout
6988 \begin_layout LyX-Code
6989 echo "hello `id **`"
6990 \end_layout
6992 \begin_layout Standard
6993 Any literal text inserted at the point marked ** would need to be escaped
6994  in all kinds of ways, including 
6995 \begin_inset Flex CharStyle:Code
6996 status collapsed
6998 \begin_layout Plain Layout
6999 ` | *
7000 \end_layout
7002 \end_inset
7004  among others.
7005  First it would need escaping for the back-ticks `, and then for the double-quot
7006 es ".
7007 \end_layout
7009 \begin_layout Standard
7010 Escaping need not occur if the format and mode of the included chunk matches
7011  that of the including chunk, which would suggest that any back-ticks might
7012  need to be part of the included chunk and not including chunk
7013 \begin_inset Note Note
7014 status collapsed
7016 \begin_layout Plain Layout
7017 or is it the other way around?
7018 \end_layout
7020 \end_inset
7023 \end_layout
7025 \begin_layout Standard
7026 As each chunk is output a new mode tracker for that language is initialized
7027  in it's normal state.
7028  As text is output for that chunk the output mode is tracked.
7029  When a new chunk is included, a transformation appropriate to that mode
7030  is selected and pushed onto a stack of transformations.
7031  Any text to be output is first passed through this stack of transformations.
7032 \end_layout
7034 \begin_layout Standard
7035 It remains to consider if the chunk-include function should return it's
7036  generated text so that the caller can apply any transformations (and formatting
7037 ), or if it should apply the stack of transformations itself.
7038 \end_layout
7040 \begin_layout Standard
7041 Note that the transformed text should have the property of not being able
7042  to change the mode in the current chunk.
7043 \end_layout
7045 \begin_layout Standard
7046 \begin_inset Note Note
7047 status open
7049 \begin_layout Plain Layout
7050 Note chunk parameters should probably also be transformed
7051 \end_layout
7053 \end_inset
7056 \end_layout
7058 \begin_layout Chunk
7059 new_mode()
7060 \end_layout
7062 \begin_layout Standard
7063 \begin_inset listings
7064 inline false
7065 status open
7067 \begin_layout Plain Layout
7069 function new_mode(language, mode) {
7070 \end_layout
7072 \begin_layout Plain Layout
7074   mode["language"] = language;
7075 \end_layout
7077 \begin_layout Plain Layout
7079   mode["state"]="";
7080 \end_layout
7082 \begin_layout Plain Layout
7085 \end_layout
7087 \end_inset
7090 \end_layout
7092 \begin_layout Standard
7093 Because awk functions cannot return an array, we must create the array first
7094  and pass it in.
7095 \end_layout
7097 \begin_layout Chunk
7098 new-mode,params=language;mode
7099 \end_layout
7101 \begin_layout Standard
7102 \begin_inset listings
7103 inline false
7104 status open
7106 \begin_layout Plain Layout
7109 \backslash
7110 chunkref{awk-delete-array}(${mode})>
7111 \end_layout
7113 \begin_layout Plain Layout
7115 new_mode(${language}, ${mode});
7116 \end_layout
7118 \end_inset
7121 \end_layout
7123 \begin_layout Standard
7124 And for tracking modes, we dispatch to a mode-tracker action based on the
7125  current language
7126 \end_layout
7128 \begin_layout Chunk
7129 track_mode()
7130 \end_layout
7132 \begin_layout Standard
7133 \begin_inset listings
7134 inline false
7135 status open
7137 \begin_layout Plain Layout
7139 function track_mode(mode, text) {
7140 \end_layout
7142 \begin_layout Plain Layout
7144   if (mode["language"] == "C") {
7145 \end_layout
7147 \begin_layout Plain Layout
7149     =<
7150 \backslash
7151 chunkref{track-mode-C}>
7152 \end_layout
7154 \begin_layout Plain Layout
7156     return;
7157 \end_layout
7159 \begin_layout Plain Layout
7161   }
7162 \end_layout
7164 \begin_layout Plain Layout
7167 \end_layout
7169 \end_inset
7172 \end_layout
7174 \begin_layout Standard
7175 For each mode, we look for a character that has the power to change the
7176  mode.
7177 \end_layout
7179 \begin_layout Standard
7180 In plain mode:
7181 \end_layout
7183 \begin_layout List
7184 \labelwidthstring 00.00.0000
7185 \begin_inset Quotes eld
7186 \end_inset
7188  enters double-quote mode
7189 \end_layout
7191 \begin_layout List
7192 \labelwidthstring 00.00.0000
7193 ' enters single-quote mode
7194 \end_layout
7196 \begin_layout List
7197 \labelwidthstring 00.00.0000
7198 trailing-
7199 \backslash
7200  enters multi-line mode
7201 \end_layout
7203 \begin_layout List
7204 \labelwidthstring 00.00.0000
7205 # enters #define sub-mode, needs 
7206 \backslash
7207  escaping end of line too
7208 \end_layout
7210 \begin_layout List
7211 \labelwidthstring 00.00.0000
7212 /* enters comment mode
7213 \end_layout
7215 \begin_layout Standard
7216 In double-quote mode, escape 
7217 \backslash
7218  and 
7219 \begin_inset Quotes eld
7220 \end_inset
7222  and newline
7223 \end_layout
7225 \begin_layout Standard
7227 \backslash
7228  escapes prevents 
7229 \begin_inset Quotes eld
7230 \end_inset
7232  from leaving mode
7233 \end_layout
7235 \begin_layout Standard
7236 \begin_inset Quotes eld
7237 \end_inset
7239  leaves mode
7240 \end_layout
7242 \begin_layout Standard
7243 newline needs to close and re-open string or something
7244 \end_layout
7246 \begin_layout Standard
7247 in single-quote mode escape 
7248 \backslash
7249  and 
7250 \begin_inset Quotes eld
7251 \end_inset
7254 \end_layout
7256 \begin_layout Chunk
7257 track-mode-C
7258 \end_layout
7260 \begin_layout Standard
7261 \begin_inset listings
7262 inline false
7263 status open
7265 \begin_layout Plain Layout
7267 \end_layout
7269 \end_inset
7272 \end_layout
7274 \begin_layout Chunk
7275 mode-tracker
7276 \end_layout
7278 \begin_layout Standard
7279 \begin_inset listings
7280 inline false
7281 status open
7283 \begin_layout Plain Layout
7286 \backslash
7287 chunkref{new_mode()}>
7288 \end_layout
7290 \end_inset
7293 \end_layout
7295 \begin_layout Chapter
7296 Generating the output
7297 \end_layout
7299 \begin_layout Standard
7300 We generate output by calling output_chunk, or listing the chunk names.
7301 \end_layout
7303 \begin_layout Chunk
7304 generate-output
7305 \end_layout
7307 \begin_layout Standard
7308 \begin_inset listings
7309 inline false
7310 status open
7312 \begin_layout Plain Layout
7314 if (length(root)) output_chunk(root);
7315 \end_layout
7317 \begin_layout Plain Layout
7319 else output_chunk_names();
7320 \end_layout
7322 \end_inset
7325 \end_layout
7327 \begin_layout Standard
7328 We also have some other output debugging:
7329 \end_layout
7331 \begin_layout Chunk
7332 debug-output
7333 \end_layout
7335 \begin_layout Standard
7336 \begin_inset listings
7337 inline false
7338 status open
7340 \begin_layout Plain Layout
7342 if (debug) {
7343 \end_layout
7345 \begin_layout Plain Layout
7347   print "------ chunk names "
7348 \end_layout
7350 \begin_layout Plain Layout
7352   output_chunk_names();
7353 \end_layout
7355 \begin_layout Plain Layout
7357   print "====== chunks"
7358 \end_layout
7360 \begin_layout Plain Layout
7362   output_chunks();
7363 \end_layout
7365 \begin_layout Plain Layout
7367   print "++++++ debug"
7368 \end_layout
7370 \begin_layout Plain Layout
7372   for (a in chunks) {
7373 \end_layout
7375 \begin_layout Plain Layout
7377     print a "=" chunks[a];
7378 \end_layout
7380 \begin_layout Plain Layout
7382   }
7383 \end_layout
7385 \begin_layout Plain Layout
7388 \end_layout
7390 \end_inset
7393 \end_layout
7395 \begin_layout Standard
7396 We do both of these at the end.
7397  We also set 
7398 \begin_inset Flex CharStyle:Code
7399 status collapsed
7401 \begin_layout Plain Layout
7402 ORS=""
7403 \end_layout
7405 \end_inset
7407  because each chunklet is not necessarily a complete line, and we already
7408  added 
7409 \begin_inset Flex CharStyle:Code
7410 status collapsed
7412 \begin_layout Plain Layout
7414 \end_layout
7416 \end_inset
7418  to each input line in section 
7419 \begin_inset CommandInset ref
7420 LatexCommand ref
7421 reference "sub:ORS-chunk-text"
7423 \end_inset
7426 \end_layout
7428 \begin_layout Chunk
7430 \end_layout
7432 \begin_layout Standard
7433 \begin_inset listings
7434 inline false
7435 status open
7437 \begin_layout Plain Layout
7439 END {
7440 \end_layout
7442 \begin_layout Plain Layout
7444   =<
7445 \backslash
7446 chunkref{debug-output}>
7447 \end_layout
7449 \begin_layout Plain Layout
7451   ORS="";
7452 \end_layout
7454 \begin_layout Plain Layout
7456   =<
7457 \backslash
7458 chunkref{generate-output}>
7459 \end_layout
7461 \begin_layout Plain Layout
7464 \end_layout
7466 \end_inset
7469 \end_layout
7471 \begin_layout Standard
7472 We write chunk names like this.
7473  If we seem to be running in notangle compatibility mode, then we enclose
7474  the name like this 
7475 \begin_inset Flex CharStyle:Code
7476 status collapsed
7478 \begin_layout Plain Layout
7479 <<name>>
7480 \end_layout
7482 \end_inset
7484  the same way notangle does:
7485 \end_layout
7487 \begin_layout Chunk
7488 output_chunk_names()
7489 \end_layout
7491 \begin_layout Standard
7492 \begin_inset listings
7493 inline false
7494 status open
7496 \begin_layout Plain Layout
7498 function output_chunk_names(   c, prefix, suffix) 
7499 \end_layout
7501 \begin_layout Plain Layout
7504 \end_layout
7506 \begin_layout Plain Layout
7508   if (notangle_mode) {
7509 \end_layout
7511 \begin_layout Plain Layout
7513     prefix="<<";
7514 \end_layout
7516 \begin_layout Plain Layout
7518     suffix=">>";
7519 \end_layout
7521 \begin_layout Plain Layout
7523   }
7524 \end_layout
7526 \begin_layout Plain Layout
7528   for (c in chunk_names) {
7529 \end_layout
7531 \begin_layout Plain Layout
7533     print prefix c suffix "
7534 \backslash
7536 \end_layout
7538 \begin_layout Plain Layout
7540   }
7541 \end_layout
7543 \begin_layout Plain Layout
7546 \end_layout
7548 \end_inset
7551 \end_layout
7553 \begin_layout Standard
7554 This function would write out all chunks
7555 \end_layout
7557 \begin_layout Chunk
7558 output_chunks()
7559 \end_layout
7561 \begin_layout Standard
7562 \begin_inset listings
7563 inline false
7564 status open
7566 \begin_layout Plain Layout
7568 function output_chunks(  a) 
7569 \end_layout
7571 \begin_layout Plain Layout
7574 \end_layout
7576 \begin_layout Plain Layout
7578   for (a in chunk_names) {
7579 \end_layout
7581 \begin_layout Plain Layout
7583     output_chunk(chunk_names[a]);
7584 \end_layout
7586 \begin_layout Plain Layout
7588   }
7589 \end_layout
7591 \begin_layout Plain Layout
7594 \end_layout
7596 \begin_layout Plain Layout
7598 \end_layout
7600 \begin_layout Plain Layout
7602 function output_chunk(chunk) {
7603 \end_layout
7605 \begin_layout Plain Layout
7607   newline = 1;
7608 \end_layout
7610 \begin_layout Plain Layout
7612   lineno_needed = linenos;
7613 \end_layout
7615 \begin_layout Plain Layout
7617 \end_layout
7619 \begin_layout Plain Layout
7621   write_chunk(chunk);
7622 \end_layout
7624 \begin_layout Plain Layout
7627 \end_layout
7629 \begin_layout Plain Layout
7631 \end_layout
7633 \end_inset
7636 \end_layout
7638 \begin_layout Section
7639 Assembling the chunks
7640 \end_layout
7642 \begin_layout Standard
7643 \begin_inset Flex CharStyle:Code
7644 status collapsed
7646 \begin_layout Plain Layout
7647 chunk_path
7648 \end_layout
7650 \end_inset
7652  holds a string consisting of the names of all the chunks that resulted
7653  in this chunk being output.
7655 \begin_inset Note Note
7656 status collapsed
7658 \begin_layout Plain Layout
7659 Make sure it includes the line numbers too...
7661 \end_layout
7663 \end_inset
7665 It should probably also contain the source line numbers at which each inclusion
7666  also occured.
7667 \end_layout
7669 \begin_layout Chunk
7670 write_chunk(),emph={chunk_path}
7671 \end_layout
7673 \begin_layout Standard
7674 \begin_inset listings
7675 inline false
7676 status open
7678 \begin_layout Plain Layout
7680 function write_chunk(chunk_name, indent, tail,
7681 \end_layout
7683 \begin_layout Plain Layout
7685   # optional vars
7686 \end_layout
7688 \begin_layout Plain Layout
7690   chunk_path, chunk_args, 
7691 \end_layout
7693 \begin_layout Plain Layout
7695   # local vars
7696 \end_layout
7698 \begin_layout Plain Layout
7700   part, max_part, part_line, frag, max_frag, text, 
7701 \end_layout
7703 \begin_layout Plain Layout
7705   chunklet, only_part, call_chunk_args, mode)
7706 \end_layout
7708 \begin_layout Plain Layout
7711 \end_layout
7713 \end_inset
7716 \end_layout
7718 \begin_layout Subsection
7719 \begin_inset CommandInset label
7720 LatexCommand label
7721 name "sub:Chunk-parts"
7723 \end_inset
7725 Chunk parts
7726 \end_layout
7728 \begin_layout Standard
7729 As mentioned in section 
7730 \begin_inset CommandInset ref
7731 LatexCommand ref
7732 reference "sub:lstlistings-includes"
7734 \end_inset
7736 , a chunk name may contain a part specifier in square brackets, limiting
7737  the parts that should be emitted.
7738 \end_layout
7740 \begin_layout Standard
7741 \begin_inset listings
7742 inline false
7743 status open
7745 \begin_layout Plain Layout
7747   if (match(chunk_name, "^(.*)
7748 \backslash
7750 \backslash
7751 [([0-9]*)
7752 \backslash
7754 \backslash
7755 ]$", chunk_name_parts)) {
7756 \end_layout
7758 \begin_layout Plain Layout
7760     chunk_name = chunk_name_parts[1];
7761 \end_layout
7763 \begin_layout Plain Layout
7765     only_part = chunk_name_parts[2];
7766 \end_layout
7768 \begin_layout Plain Layout
7770   }
7771 \end_layout
7773 \end_inset
7776 \end_layout
7778 \begin_layout Standard
7779 We first create the mode tracker for this chunk.
7780 \end_layout
7782 \begin_layout Standard
7783 #  =<
7784 \backslash
7785 chunkref{awk-delete-array}(mode)>
7786 \end_layout
7788 \begin_layout Standard
7789 \begin_inset listings
7790 inline false
7791 status open
7793 \begin_layout Plain Layout
7795   split("", mode);
7796 \end_layout
7798 \begin_layout Plain Layout
7800   new_mode(chunks[chunk_name, "language"], mode);
7801 \end_layout
7803 \end_inset
7806 \end_layout
7808 \begin_layout Standard
7809 #  =<
7810 \backslash
7811 chunkref{new-mode}(chunks[chunk_name, "language"], mode)>
7812 \end_layout
7814 \begin_layout Standard
7815 We extract into 
7816 \begin_inset Flex CharStyle:Code
7817 status collapsed
7819 \begin_layout Plain Layout
7820 chunk_params
7821 \end_layout
7823 \end_inset
7825  the names of the parameters that this chunk accepts, whose values were
7826  (optionally) passed in 
7827 \begin_inset Flex CharStyle:Code
7828 status collapsed
7830 \begin_layout Plain Layout
7831 chunk_args
7832 \end_layout
7834 \end_inset
7837 \end_layout
7839 \begin_layout Standard
7840 \begin_inset listings
7841 inline false
7842 status open
7844 \begin_layout Plain Layout
7846   split(chunks[chunk_name, "params"], chunk_params, " *; *");
7847 \end_layout
7849 \end_inset
7852 \end_layout
7854 \begin_layout Standard
7855 To assemble a chunk, we write out each part.
7856 \end_layout
7858 \begin_layout Chunk
7859 write_chunk()
7860 \end_layout
7862 \begin_layout Standard
7863 \begin_inset listings
7864 inline false
7865 status open
7867 \begin_layout Plain Layout
7869   if (! (chunk_name in chunk_names)) {
7870 \end_layout
7872 \begin_layout Plain Layout
7874     error(sprintf(_"The root module <<%s>> was not defined.
7875 \backslash
7876 nUsed by: %s",
7877 \backslash
7879 \end_layout
7881 \begin_layout Plain Layout
7883                   chunk_name, chunk_path));
7884 \end_layout
7886 \begin_layout Plain Layout
7888   }
7889 \end_layout
7891 \begin_layout Plain Layout
7893 \end_layout
7895 \begin_layout Plain Layout
7897   max_part = chunks[chunk_name, "part"];
7898 \end_layout
7900 \begin_layout Plain Layout
7902   for(part = 1; part <= max_part; part++) {
7903 \end_layout
7905 \begin_layout Plain Layout
7907     if (! only_part || part == only_part) {
7908 \end_layout
7910 \begin_layout Plain Layout
7912       =<
7913 \backslash
7914 chunkref{write-part}>
7915 \end_layout
7917 \begin_layout Plain Layout
7919     }
7920 \end_layout
7922 \begin_layout Plain Layout
7924   }
7925 \end_layout
7927 \begin_layout Plain Layout
7930 \end_layout
7932 \end_inset
7935 \end_layout
7937 \begin_layout Standard
7938 A part can either be a chunklet of lines, or an include of another chunk.
7939 \end_layout
7941 \begin_layout Standard
7942 Chunks may also have parameters, specified in LaTeX style with braces after
7943  the chunk name --- looking like this in the document: 
7944 \begin_inset Flex CharStyle:Code
7945 status collapsed
7947 \begin_layout Plain Layout
7948 chunkname{param1, param2}
7949 \end_layout
7951 \end_inset
7954  Arguments are passed in square brackets: 
7955 \begin_inset Flex CharStyle:Code
7956 status collapsed
7958 \begin_layout Plain Layout
7960 \backslash
7961 chunkref{chunkname}[arg1, arg2]
7962 \end_layout
7964 \end_inset
7967 \end_layout
7969 \begin_layout Standard
7970 Before we process each part, we check that the source position hasn't changed
7971  unexpectedly, so that we can know if we need to output a new file-line
7972  directive.
7973 \end_layout
7975 \begin_layout Chunk
7976 write-part
7977 \end_layout
7979 \begin_layout Standard
7980 \begin_inset listings
7981 inline false
7982 status open
7984 \begin_layout Plain Layout
7987 \backslash
7988 chunkref{check-source-jump}>
7989 \end_layout
7991 \begin_layout Plain Layout
7993 \end_layout
7995 \begin_layout Plain Layout
7997 chunklet = chunks[chunk_name, "part", part];
7998 \end_layout
8000 \begin_layout Plain Layout
8002 if (chunks[chunk_name, "part", part, "type"] == part_type_chunk) {
8003 \end_layout
8005 \begin_layout Plain Layout
8007   =<
8008 \backslash
8009 chunkref{write-included-chunk}>
8010 \end_layout
8012 \begin_layout Plain Layout
8014 } else if (chunklet SUBSEP "line" in chunks) {
8015 \end_layout
8017 \begin_layout Plain Layout
8019   =<
8020 \backslash
8021 chunkref{write-chunklets}>
8022 \end_layout
8024 \begin_layout Plain Layout
8026 } else {
8027 \end_layout
8029 \begin_layout Plain Layout
8031   # empty last chunklet
8032 \end_layout
8034 \begin_layout Plain Layout
8037 \end_layout
8039 \end_inset
8042 \end_layout
8044 \begin_layout Standard
8045 To write an included chunk, we must detect any optional chunk arguments
8046  in parenthesis.
8047  Then we recurse calling 
8048 \begin_inset Flex Chunkref
8049 status collapsed
8051 \begin_layout Plain Layout
8052 write_chunk()
8053 \end_layout
8055 \end_inset
8058 \end_layout
8060 \begin_layout Chunk
8061 write-included-chunk
8062 \end_layout
8064 \begin_layout Standard
8065 \begin_inset listings
8066 inline false
8067 status open
8069 \begin_layout Plain Layout
8071 if (match(chunklet, "^([^
8072 \backslash
8074 \backslash
8075 []*)
8076 \backslash
8078 \backslash
8079 ((.*)
8080 \backslash
8082 \backslash
8083 )$", chunklet_parts)) {
8084 \end_layout
8086 \begin_layout Plain Layout
8088   chunklet = chunklet_parts[1];
8089 \end_layout
8091 \begin_layout Plain Layout
8093   get_chunk_args(chunklet_parts[2], chunk_args);
8094 \end_layout
8096 \begin_layout Plain Layout
8098 # TO BE parse_chunk_args SOON
8099 \end_layout
8101 \begin_layout Plain Layout
8103   for (c in call_chunk_args) {
8104 \end_layout
8106 \begin_layout Plain Layout
8108     call_chunk_args[c] = expand_chunk_args(call_chunk_args[c], chunk_params,
8109  chunk_args);
8110 \end_layout
8112 \begin_layout Plain Layout
8114   }
8115 \end_layout
8117 \begin_layout Plain Layout
8119 } else {
8120 \end_layout
8122 \begin_layout Plain Layout
8124   split("", call_chunk_args);
8125 \end_layout
8127 \begin_layout Plain Layout
8130 \end_layout
8132 \begin_layout Plain Layout
8134 write_chunk(chunklet,
8135 \end_layout
8137 \begin_layout Plain Layout
8139             chunks[chunk_name, "part", part, "indent"] indent,
8140 \end_layout
8142 \begin_layout Plain Layout
8144             chunks[chunk_name, "part", part, "tail"],
8145 \end_layout
8147 \begin_layout Plain Layout
8149             chunk_path "
8150 \backslash
8151 n         " chunk_name,
8152 \end_layout
8154 \begin_layout Plain Layout
8156             call_chunk_args);
8157 \end_layout
8159 \end_inset
8162 \end_layout
8164 \begin_layout Standard
8165 Before we output a chunklet of lines, we first emit the file and line number
8166  if we have one, and if it is safe to do so.
8168 \end_layout
8170 \begin_layout Standard
8171 Chunklets are generally broken up by includes, so the start of a chunklet
8172  is a good place to do this.
8173  Then we output each line of the chunklet.
8174 \end_layout
8176 \begin_layout Standard
8177 When it is not safe, such as in the middle of a multi-line macro definition,
8179 \begin_inset Flex CharStyle:Code
8180 status collapsed
8182 \begin_layout Plain Layout
8183 lineno_suppressed
8184 \end_layout
8186 \end_inset
8188  is set to true, and in such a case we note that we want to emit the line
8189  statement when it is next safe.
8190 \end_layout
8192 \begin_layout Chunk
8193 write-chunklets
8194 \end_layout
8196 \begin_layout Standard
8197 \begin_inset listings
8198 inline false
8199 status open
8201 \begin_layout Plain Layout
8203 max_frag = chunks[chunklet, "line"];
8204 \end_layout
8206 \begin_layout Plain Layout
8208 for(frag = 1; frag <= max_frag; frag++) {
8209 \end_layout
8211 \begin_layout Plain Layout
8213   =<
8214 \backslash
8215 chunkref{write-file-line}>
8216 \end_layout
8218 \end_inset
8221 \end_layout
8223 \begin_layout Standard
8224 We then extract the chunklet text and expand any arguments.
8225 \end_layout
8227 \begin_layout Standard
8228 \begin_inset listings
8229 inline false
8230 status open
8232 \begin_layout Plain Layout
8234 \end_layout
8236 \begin_layout Plain Layout
8238   text = chunks[chunklet, frag];
8239 \end_layout
8241 \begin_layout Plain Layout
8244 \end_layout
8246 \begin_layout Plain Layout
8248   /* check params */
8249 \end_layout
8251 \begin_layout Plain Layout
8253   text = expand_chunk_args(text, chunk_params, chunk_args);
8254 \end_layout
8256 \end_inset
8259 \end_layout
8261 \begin_layout Standard
8262 If the text is a single newline (which we keep separate - see 
8263 \begin_inset CommandInset ref
8264 LatexCommand ref
8265 reference "lone-newline"
8267 \end_inset
8269 ) then we increment the line number.
8270  In the case where this is the last line of a chunk and it is not a top-level
8271  chunk we replace the newline with an empty string --- because the chunk
8272  that included this chunk will have the newline at the end of the line that
8273  included this chunk.
8274 \end_layout
8276 \begin_layout Standard
8277 We also note by 
8278 \begin_inset Flex CharStyle:Code
8279 status collapsed
8281 \begin_layout Plain Layout
8282 newline = 1
8283 \end_layout
8285 \end_inset
8287  that we have started a new line, so that indentation can be managed with
8288  the following piece of text.
8289 \end_layout
8291 \begin_layout Standard
8292 \begin_inset listings
8293 inline false
8294 status open
8296 \begin_layout Plain Layout
8298 \end_layout
8300 \begin_layout Plain Layout
8302  if (text == "
8303 \backslash
8304 n") {
8305 \end_layout
8307 \begin_layout Plain Layout
8309     lineno++;
8310 \end_layout
8312 \begin_layout Plain Layout
8314     if (part == max_part && frag == max_frag && length(chunk_path)) {
8315 \end_layout
8317 \begin_layout Plain Layout
8319       text = "";
8320 \end_layout
8322 \begin_layout Plain Layout
8324       break;
8325 \end_layout
8327 \begin_layout Plain Layout
8329     } else {
8330 \end_layout
8332 \begin_layout Plain Layout
8334       newline = 1;
8335 \end_layout
8337 \begin_layout Plain Layout
8339     }
8340 \end_layout
8342 \end_inset
8345 \end_layout
8347 \begin_layout Standard
8348 If this text does not represent a newline, but we see that we are the first
8349  piece of text on a newline, then we prefix our text with the current indent.
8350  NOTE: 
8351 \begin_inset Flex CharStyle:Code
8352 status collapsed
8354 \begin_layout Plain Layout
8355 newline
8356 \end_layout
8358 \end_inset
8360  is a global output-state variable, but the 
8361 \begin_inset Flex CharStyle:Code
8362 status collapsed
8364 \begin_layout Plain Layout
8365 indent
8366 \end_layout
8368 \end_inset
8370  is not.
8372 \end_layout
8374 \begin_layout Standard
8375 \begin_inset listings
8376 inline false
8377 status open
8379 \begin_layout Plain Layout
8381   } else {
8382 \end_layout
8384 \begin_layout Plain Layout
8386     if (newline) text = indent text;
8387 \end_layout
8389 \begin_layout Plain Layout
8391     newline = 0;
8392 \end_layout
8394 \begin_layout Plain Layout
8396   }
8397 \end_layout
8399 \begin_layout Plain Layout
8401 \end_layout
8403 \end_inset
8406 \end_layout
8408 \begin_layout Standard
8409 Tail will soon no longer be relevant once mode-detection is in place.
8410 \end_layout
8412 \begin_layout Standard
8413 \begin_inset listings
8414 inline false
8415 status open
8417 \begin_layout Plain Layout
8419   text = text tail;
8420 \end_layout
8422 \begin_layout Plain Layout
8424 #  track_mode(mode, text);
8425 \end_layout
8427 \begin_layout Plain Layout
8429   print text;
8430 \end_layout
8432 \end_inset
8435 \end_layout
8437 \begin_layout Standard
8438 If a line ends in a backslash --- suggesting continuation --- then we supress
8439  outputting file-line as it would probably break the continued lines.
8441 \end_layout
8443 \begin_layout Standard
8444 \begin_inset listings
8445 inline false
8446 status open
8448 \begin_layout Plain Layout
8450   if (linenos) {
8451 \end_layout
8453 \begin_layout Plain Layout
8455     lineno_suppressed = substr(lastline, length(lastline)) == "
8456 \backslash
8458 \backslash
8460 \end_layout
8462 \begin_layout Plain Layout
8464   }
8465 \end_layout
8467 \begin_layout Plain Layout
8470 \end_layout
8472 \end_inset
8475 \end_layout
8477 \begin_layout Standard
8478 Of course there is no point in actually outputting the source filename and
8479  line number (file-line) if they don't say anything new! We only need to
8480  emit them if they aren't what is expected, or if we we not able to emit
8481  one when they had changed.
8482 \end_layout
8484 \begin_layout Chunk
8485 write-file-line
8486 \end_layout
8488 \begin_layout Standard
8489 \begin_inset listings
8490 inline false
8491 status open
8493 \begin_layout Plain Layout
8495 if (newline && lineno_needed && ! lineno_suppressed) {
8496 \end_layout
8498 \begin_layout Plain Layout
8500   filename = a_filename;
8501 \end_layout
8503 \begin_layout Plain Layout
8505   lineno = a_lineno;
8506 \end_layout
8508 \begin_layout Plain Layout
8510   print "#line " lineno " 
8511 \backslash
8512 "" filename "
8513 \backslash
8515 \backslash
8517 \end_layout
8519 \begin_layout Plain Layout
8521   lineno_needed = 0;
8522 \end_layout
8524 \begin_layout Plain Layout
8527 \end_layout
8529 \end_inset
8532 \end_layout
8534 \begin_layout Standard
8535 We check if a new file-line is needed by checking if the source line matches
8536  what we (or a compiler) would expect.
8538 \end_layout
8540 \begin_layout Chunk
8541 check-source-jump
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 && (chunk_name SUBSEP "part" SUBSEP part SUBSEP "FILENAME" in
8552  chunks)) {
8553 \end_layout
8555 \begin_layout Plain Layout
8557   a_filename = chunks[chunk_name, "part", part, "FILENAME"];
8558 \end_layout
8560 \begin_layout Plain Layout
8562   a_lineno = chunks[chunk_name, "part", part, "LINENO"];
8563 \end_layout
8565 \begin_layout Plain Layout
8567   if (a_filename != filename || a_lineno != lineno) {
8568 \end_layout
8570 \begin_layout Plain Layout
8572     lineno_needed++;
8573 \end_layout
8575 \begin_layout Plain Layout
8577   }
8578 \end_layout
8580 \begin_layout Plain Layout
8583 \end_layout
8585 \end_inset
8588 \end_layout
8590 \begin_layout Chapter
8591 Storing chunks
8592 \end_layout
8594 \begin_layout Standard
8595 Awk has pretty limited data structures, so we will use two main hashes.
8596  Uninterrupted sequences of a chunk will be stored in 
8597 \begin_inset Flex CharStyle:Code
8598 status collapsed
8600 \begin_layout Plain Layout
8601 chunklets
8602 \end_layout
8604 \end_inset
8606  and the chunklets used in a chunk will be stored in 
8607 \begin_inset Flex CharStyle:Code
8608 status collapsed
8610 \begin_layout Plain Layout
8611 chunks
8612 \end_layout
8614 \end_inset
8617 \end_layout
8619 \begin_layout Chunk
8620 constants
8621 \end_layout
8623 \begin_layout Standard
8624 \begin_inset listings
8625 inline false
8626 status open
8628 \begin_layout Plain Layout
8630 part_type_chunk=1;
8631 \end_layout
8633 \end_inset
8636 \end_layout
8638 \begin_layout Standard
8639 The 
8640 \begin_inset Flex CharStyle:Code
8641 status collapsed
8643 \begin_layout Plain Layout
8644 params
8645 \end_layout
8647 \end_inset
8649  mentioned are not chunk parameters for parameterized chunks, as mentioned
8650  in 
8651 \begin_inset CommandInset ref
8652 LatexCommand ref
8653 reference "cha:Chunk Arguments"
8655 \end_inset
8657 , but the lstlistings style parameters used in the 
8658 \begin_inset Flex CharStyle:Code
8659 status collapsed
8661 \begin_layout Plain Layout
8663 \backslash
8664 Chunk
8665 \end_layout
8667 \end_inset
8669  command
8670 \begin_inset Foot
8671 status collapsed
8673 \begin_layout Plain Layout
8674 The 
8675 \begin_inset Flex CharStyle:Code
8676 status collapsed
8678 \begin_layout Plain Layout
8679 params
8680 \end_layout
8682 \end_inset
8684  parameter is used to hold the parameters for parameterized chunks
8685 \end_layout
8687 \end_inset
8690 \end_layout
8692 \begin_layout Chunk
8693 chunk-storage-functions
8694 \end_layout
8696 \begin_layout Standard
8697 \begin_inset listings
8698 inline false
8699 status open
8701 \begin_layout Plain Layout
8703 function new_chunk(chunk_name, params,
8704 \end_layout
8706 \begin_layout Plain Layout
8708   # local vars
8709 \end_layout
8711 \begin_layout Plain Layout
8713   p )
8714 \end_layout
8716 \begin_layout Plain Layout
8719 \end_layout
8721 \begin_layout Plain Layout
8723   # HACK WHILE WE CHANGE TO ( ) for PARAM CHUNKS
8724 \end_layout
8726 \begin_layout Plain Layout
8728   gsub("
8729 \backslash
8731 \backslash
8733 \backslash
8735 \backslash
8736 )$", "", chunk_name);
8737 \end_layout
8739 \begin_layout Plain Layout
8741   active_chunk = chunk_name;
8742 \end_layout
8744 \begin_layout Plain Layout
8746   if (! (chunk_name in chunk_names)) {
8747 \end_layout
8749 \begin_layout Plain Layout
8751     if (debug) print "New chunk " chunk_name;
8752 \end_layout
8754 \begin_layout Plain Layout
8756     chunk_names[chunk_name];
8757 \end_layout
8759 \begin_layout Plain Layout
8761     for (p in params) {
8762 \end_layout
8764 \begin_layout Plain Layout
8766       chunks[chunk_name, p] = params[p];
8767 \end_layout
8769 \begin_layout Plain Layout
8771     }
8772 \end_layout
8774 \begin_layout Plain Layout
8776   }
8777 \end_layout
8779 \begin_layout Plain Layout
8781   prime_chunk(chunk_name);
8782 \end_layout
8784 \begin_layout Plain Layout
8787 \end_layout
8789 \end_inset
8792 \end_layout
8794 \begin_layout Standard
8795 \begin_inset listings
8796 inline false
8797 status open
8799 \begin_layout Plain Layout
8801 \end_layout
8803 \begin_layout Plain Layout
8805 function prime_chunk(chunk_name)
8806 \end_layout
8808 \begin_layout Plain Layout
8811 \end_layout
8813 \begin_layout Plain Layout
8815   chunks[chunk_name, "part", ++chunks[chunk_name, "part"] ] = 
8816 \backslash
8818 \end_layout
8820 \begin_layout Plain Layout
8822          chunk_name SUBSEP "chunklet" SUBSEP "" ++chunks[chunk_name, "chunklet"]
8824 \end_layout
8826 \begin_layout Plain Layout
8828   chunks[chunk_name, "part", chunks[chunk_name, "part"], "FILENAME"] = FILENAME;
8829 \end_layout
8831 \begin_layout Plain Layout
8833   chunks[chunk_name, "part", chunks[chunk_name, "part"], "LINENO"] = FNR
8834  + 1;
8835 \end_layout
8837 \begin_layout Plain Layout
8840 \end_layout
8842 \begin_layout Plain Layout
8844 \end_layout
8846 \begin_layout Plain Layout
8848 function chunk_line(chunk_name, line){
8849 \end_layout
8851 \begin_layout Plain Layout
8853   chunks[chunk_name, "chunklet", chunks[chunk_name, "chunklet"],
8854 \end_layout
8856 \begin_layout Plain Layout
8858          ++chunks[chunk_name, "chunklet", chunks[chunk_name, "chunklet"],
8859  "line"]  ] = line;
8860 \end_layout
8862 \begin_layout Plain Layout
8865 \end_layout
8867 \begin_layout Plain Layout
8869 \end_layout
8871 \end_inset
8874 \end_layout
8876 \begin_layout Standard
8877 Chunk include represents a 
8878 \emph on
8879 chunkref
8880 \emph default
8881  statement, and stores the requirement to include another chunk.
8882  The parameter indent represents the quanity of literal text characters
8883  that preceded this 
8884 \emph on
8885 chunkref
8886 \emph default
8887  statement and therefore by how much additional lines of the included chunk
8888  should be indented.
8889 \end_layout
8891 \begin_layout Standard
8892 \begin_inset listings
8893 inline false
8894 status open
8896 \begin_layout Plain Layout
8898 function chunk_include(chunk_name, chunk_ref, indent, tail)
8899 \end_layout
8901 \begin_layout Plain Layout
8904 \end_layout
8906 \begin_layout Plain Layout
8908   chunks[chunk_name, "part", ++chunks[chunk_name, "part"] ] = chunk_ref;
8909 \end_layout
8911 \begin_layout Plain Layout
8913   chunks[chunk_name, "part", chunks[chunk_name, "part"], "type" ] = part_type_ch
8914 unk;
8915 \end_layout
8917 \begin_layout Plain Layout
8919   chunks[chunk_name, "part", chunks[chunk_name, "part"], "indent" ] = indent_str
8920 ing(indent);
8921 \end_layout
8923 \begin_layout Plain Layout
8925   chunks[chunk_name, "part", chunks[chunk_name, "part"], "tail" ] = tail;
8926 \end_layout
8928 \begin_layout Plain Layout
8930   prime_chunk(chunk_name);
8931 \end_layout
8933 \begin_layout Plain Layout
8936 \end_layout
8938 \begin_layout Plain Layout
8940 \end_layout
8942 \end_inset
8945 \end_layout
8947 \begin_layout Standard
8948 The indent is calculated by indent_string, which may in future convert some
8949  spaces into tab characters.
8950  This function works by generating a printf padded format string, like 
8951 \begin_inset Flex CharStyle:Code
8952 status collapsed
8954 \begin_layout Plain Layout
8955 %22s
8956 \end_layout
8958 \end_inset
8960  for an indent of 22, and then printing an empty string using that format.
8961 \end_layout
8963 \begin_layout Standard
8964 \begin_inset listings
8965 inline false
8966 status open
8968 \begin_layout Plain Layout
8970 function indent_string(indent) {
8971 \end_layout
8973 \begin_layout Plain Layout
8975   return sprintf("%" indent "s", "");
8976 \end_layout
8978 \begin_layout Plain Layout
8981 \end_layout
8983 \end_inset
8986 \end_layout
8988 \begin_layout Chapter
8989 \begin_inset CommandInset label
8990 LatexCommand label
8991 name "cha:getopt"
8993 \end_inset
8995 getopt
8996 \end_layout
8998 \begin_layout Standard
8999 I use Arnold Robbins public domain getopt (1993 revision).
9000  This is probably the same one that is covered in chapter 12 of 
9001 \begin_inset Quotes eld
9002 \end_inset
9004 Edition 3 of GAWK: Effective AWK Programming: A User's Guide for GNU Awk
9005 \begin_inset Quotes erd
9006 \end_inset
9008  but as that is licensed under the GNU Free Documentation License, Version
9009  1.3, which conflicts with the GPL3, I can't use it from there (or it's accompany
9010 ing explanations), so I do my best to explain how it works here.
9011 \end_layout
9013 \begin_layout Standard
9014 The getopt.awk header is:
9015 \end_layout
9017 \begin_layout Chunk
9018 getopt.awk-header,language=awk,morestring=[b]{/},morekeywords=else
9019 \end_layout
9021 \begin_layout Standard
9022 \begin_inset listings
9023 inline false
9024 status open
9026 \begin_layout Plain Layout
9028 # getopt.awk --- do C library getopt(3) function in awk
9029 \end_layout
9031 \begin_layout Plain Layout
9034 \end_layout
9036 \begin_layout Plain Layout
9038 # Arnold Robbins, arnold@skeeve.com, Public Domain
9039 \end_layout
9041 \begin_layout Plain Layout
9044 \end_layout
9046 \begin_layout Plain Layout
9048 # Initial version: March, 1991
9049 \end_layout
9051 \begin_layout Plain Layout
9053 # Revised: May, 1993
9054 \end_layout
9056 \end_inset
9059 \end_layout
9061 \begin_layout Standard
9062 The provided explanation is:
9063 \end_layout
9065 \begin_layout Chunk
9066 getopt.awk-notes
9067 \end_layout
9069 \begin_layout Standard
9070 \begin_inset listings
9071 inline false
9072 status open
9074 \begin_layout Plain Layout
9076 # External variables:
9077 \end_layout
9079 \begin_layout Plain Layout
9081 #    Optind -- index in ARGV of first nonoption argument
9082 \end_layout
9084 \begin_layout Plain Layout
9086 #    Optarg -- string value of argument to current option
9087 \end_layout
9089 \begin_layout Plain Layout
9091 #    Opterr -- if nonzero, print our own diagnostic
9092 \end_layout
9094 \begin_layout Plain Layout
9096 #    Optopt -- current option letter
9097 \end_layout
9099 \begin_layout Plain Layout
9101 \end_layout
9103 \begin_layout Plain Layout
9105 # Returns:
9106 \end_layout
9108 \begin_layout Plain Layout
9110 #    -1     at end of options
9111 \end_layout
9113 \begin_layout Plain Layout
9115 #    ?      for unrecognized option
9116 \end_layout
9118 \begin_layout Plain Layout
9120 #    <c>    a character representing the current option
9121 \end_layout
9123 \begin_layout Plain Layout
9125 \end_layout
9127 \begin_layout Plain Layout
9129 # Private Data:
9130 \end_layout
9132 \begin_layout Plain Layout
9134 #    _opti  -- index in multi-flag option, e.g., -abc
9135 \end_layout
9137 \end_inset
9140 \end_layout
9142 \begin_layout Standard
9143 The function follows.
9144  The final two parameters, 
9145 \begin_inset Flex CharStyle:Code
9146 status collapsed
9148 \begin_layout Plain Layout
9149 thisopt
9150 \end_layout
9152 \end_inset
9154  and 
9155 \begin_inset Flex CharStyle:Code
9156 status collapsed
9158 \begin_layout Plain Layout
9160 \end_layout
9162 \end_inset
9164  are local variables and not parameters --- as indicated by the multiple
9165  spaces preceding them.
9166  Awk doesn't care, the multiple spaces are a convention to help us humans.
9167 \end_layout
9169 \begin_layout Chunk
9170 getopt.awk-getopt()
9171 \end_layout
9173 \begin_layout Standard
9174 \begin_inset listings
9175 inline false
9176 status open
9178 \begin_layout Plain Layout
9180 function getopt(argc, argv, options,    thisopt, i)
9181 \end_layout
9183 \begin_layout Plain Layout
9186 \end_layout
9188 \begin_layout Plain Layout
9190     if (length(options) == 0)    # no options given
9191 \end_layout
9193 \begin_layout Plain Layout
9195         return -1
9196 \end_layout
9198 \begin_layout Plain Layout
9200     if (argv[Optind] == "--") {  # all done
9201 \end_layout
9203 \begin_layout Plain Layout
9205         Optind++
9206 \end_layout
9208 \begin_layout Plain Layout
9210         _opti = 0
9211 \end_layout
9213 \begin_layout Plain Layout
9215         return -1
9216 \end_layout
9218 \begin_layout Plain Layout
9220     } else if (argv[Optind] !~ /^-[^: 
9221 \backslash
9223 \backslash
9225 \backslash
9227 \backslash
9229 \backslash
9231 \backslash
9232 b]/) {
9233 \end_layout
9235 \begin_layout Plain Layout
9237         _opti = 0
9238 \end_layout
9240 \begin_layout Plain Layout
9242         return -1
9243 \end_layout
9245 \begin_layout Plain Layout
9247     }
9248 \end_layout
9250 \begin_layout Plain Layout
9252     if (_opti == 0)
9253 \end_layout
9255 \begin_layout Plain Layout
9257         _opti = 2
9258 \end_layout
9260 \begin_layout Plain Layout
9262     thisopt = substr(argv[Optind], _opti, 1)
9263 \end_layout
9265 \begin_layout Plain Layout
9267     Optopt = thisopt
9268 \end_layout
9270 \begin_layout Plain Layout
9272     i = index(options, thisopt)
9273 \end_layout
9275 \begin_layout Plain Layout
9277     if (i == 0) {
9278 \end_layout
9280 \begin_layout Plain Layout
9282         if (Opterr)
9283 \end_layout
9285 \begin_layout Plain Layout
9287             printf("%c -- invalid option
9288 \backslash
9290 \end_layout
9292 \begin_layout Plain Layout
9294                                   thisopt) > "/dev/stderr"
9295 \end_layout
9297 \begin_layout Plain Layout
9299         if (_opti >= length(argv[Optind])) {
9300 \end_layout
9302 \begin_layout Plain Layout
9304             Optind++
9305 \end_layout
9307 \begin_layout Plain Layout
9309             _opti = 0
9310 \end_layout
9312 \begin_layout Plain Layout
9314         } else
9315 \end_layout
9317 \begin_layout Plain Layout
9319             _opti++
9320 \end_layout
9322 \begin_layout Plain Layout
9324         return "?"
9325 \end_layout
9327 \begin_layout Plain Layout
9329     }
9330 \end_layout
9332 \end_inset
9335 \end_layout
9337 \begin_layout Standard
9338 At this point, the option has been found and we need to know if it takes
9339  any arguments.
9340 \end_layout
9342 \begin_layout Standard
9343 \begin_inset listings
9344 inline false
9345 status open
9347 \begin_layout Plain Layout
9349     if (substr(options, i + 1, 1) == ":") {
9350 \end_layout
9352 \begin_layout Plain Layout
9354         # get option argument
9355 \end_layout
9357 \begin_layout Plain Layout
9359         if (length(substr(argv[Optind], _opti + 1)) > 0)
9360 \end_layout
9362 \begin_layout Plain Layout
9364             Optarg = substr(argv[Optind], _opti + 1)
9365 \end_layout
9367 \begin_layout Plain Layout
9369         else
9370 \end_layout
9372 \begin_layout Plain Layout
9374             Optarg = argv[++Optind]
9375 \end_layout
9377 \begin_layout Plain Layout
9379         _opti = 0
9380 \end_layout
9382 \begin_layout Plain Layout
9384     } else
9385 \end_layout
9387 \begin_layout Plain Layout
9389         Optarg = ""
9390 \end_layout
9392 \begin_layout Plain Layout
9394     if (_opti == 0 || _opti >= length(argv[Optind])) {
9395 \end_layout
9397 \begin_layout Plain Layout
9399         Optind++
9400 \end_layout
9402 \begin_layout Plain Layout
9404         _opti = 0
9405 \end_layout
9407 \begin_layout Plain Layout
9409     } else
9410 \end_layout
9412 \begin_layout Plain Layout
9414         _opti++
9415 \end_layout
9417 \begin_layout Plain Layout
9419     return thisopt
9420 \end_layout
9422 \begin_layout Plain Layout
9425 \end_layout
9427 \end_inset
9429 A test program is built in, too
9430 \end_layout
9432 \begin_layout Chunk
9433 getopt.awk-begin
9434 \end_layout
9436 \begin_layout Standard
9437 \begin_inset listings
9438 inline false
9439 status open
9441 \begin_layout Plain Layout
9443 BEGIN {
9444 \end_layout
9446 \begin_layout Plain Layout
9448     Opterr = 1    # default is to diagnose
9449 \end_layout
9451 \begin_layout Plain Layout
9453     Optind = 1    # skip ARGV[0]
9454 \end_layout
9456 \begin_layout Plain Layout
9458     # test program
9459 \end_layout
9461 \begin_layout Plain Layout
9463     if (_getopt_test) {
9464 \end_layout
9466 \begin_layout Plain Layout
9468         while ((_go_c = getopt(ARGC, ARGV, "ab:cd")) != -1)
9469 \end_layout
9471 \begin_layout Plain Layout
9473             printf("c = <%c>, optarg = <%s>
9474 \backslash
9476 \end_layout
9478 \begin_layout Plain Layout
9480                                        _go_c, Optarg)
9481 \end_layout
9483 \begin_layout Plain Layout
9485         printf("non-option arguments:
9486 \backslash
9488 \end_layout
9490 \begin_layout Plain Layout
9492         for (; Optind < ARGC; Optind++)
9493 \end_layout
9495 \begin_layout Plain Layout
9497             printf("
9498 \backslash
9499 tARGV[%d] = <%s>
9500 \backslash
9502 \end_layout
9504 \begin_layout Plain Layout
9506                                     Optind, ARGV[Optind])
9507 \end_layout
9509 \begin_layout Plain Layout
9511     }
9512 \end_layout
9514 \begin_layout Plain Layout
9517 \end_layout
9519 \end_inset
9522 \end_layout
9524 \begin_layout Standard
9525 The entire getopt.awk is made out of these chunks in order
9526 \end_layout
9528 \begin_layout Chunk
9529 getopt.awk
9530 \end_layout
9532 \begin_layout Standard
9533 \begin_inset listings
9534 inline false
9535 status open
9537 \begin_layout Plain Layout
9540 \backslash
9541 chunkref{getopt.awk-header}>
9542 \end_layout
9544 \begin_layout Plain Layout
9546 \end_layout
9548 \begin_layout Plain Layout
9551 \backslash
9552 chunkref{getopt.awk-notes}>
9553 \end_layout
9555 \begin_layout Plain Layout
9558 \backslash
9559 chunkref{getopt.awk-getopt()}>
9560 \end_layout
9562 \begin_layout Plain Layout
9565 \backslash
9566 chunkref{getopt.awk-begin}>
9567 \end_layout
9569 \end_inset
9572 \end_layout
9574 \begin_layout Standard
9575 Although we only want the header and function:
9576 \end_layout
9578 \begin_layout Chunk
9579 getopt
9580 \end_layout
9582 \begin_layout Standard
9583 \begin_inset listings
9584 inline false
9585 status open
9587 \begin_layout Plain Layout
9589 # try: locate getopt.awk for the full original file
9590 \end_layout
9592 \begin_layout Plain Layout
9594 # as part of your standard awk installation
9595 \end_layout
9597 \begin_layout Plain Layout
9600 \backslash
9601 chunkref{getopt.awk-header}>
9602 \end_layout
9604 \begin_layout Plain Layout
9606 \end_layout
9608 \begin_layout Plain Layout
9611 \backslash
9612 chunkref{getopt.awk-getopt()}>
9613 \end_layout
9615 \end_inset
9618 \end_layout
9620 \begin_layout Chapter
9621 Newfangle LaTeX source code
9622 \end_layout
9624 \begin_layout Section
9625 newfangle module
9626 \end_layout
9628 \begin_layout Standard
9629 Here we define a Lyx .module file that makes it convenient to use LyX for
9630  writing such literate programs.
9631 \end_layout
9633 \begin_layout Standard
9634 This file 
9635 \begin_inset Flex CharStyle:Code
9636 status collapsed
9638 \begin_layout Plain Layout
9639 ./newfangle.module
9640 \end_layout
9642 \end_inset
9644  can be installed in your personal 
9645 \begin_inset Flex CharStyle:Code
9646 status collapsed
9648 \begin_layout Plain Layout
9649 .lyx/layouts folder
9650 \end_layout
9652 \end_inset
9655  You will need to Tools Reconfigure so that LyX notices it.
9656  It adds a new format Chunk, which should precede every listing and contain
9657  the chunk name.
9659 \end_layout
9661 \begin_layout Chunk
9662 ./newfangle.module,language=
9663 \end_layout
9665 \begin_layout Standard
9666 \begin_inset listings
9667 inline false
9668 status open
9670 \begin_layout Plain Layout
9673 \backslash
9674 DeclareLyXModule{Newfangle Literate Listings}
9675 \end_layout
9677 \begin_layout Plain Layout
9679 #DescriptionBegin
9680 \end_layout
9682 \begin_layout Plain Layout
9684 #  Newfangle literate listings allow one to write
9685 \end_layout
9687 \begin_layout Plain Layout
9689 #   literate programs after the fashion of noweb, but without having
9690 \end_layout
9692 \begin_layout Plain Layout
9694 #   to use noweave to generate the documentation.
9695  Instead the listings
9696 \end_layout
9698 \begin_layout Plain Layout
9700 #   package is extended in conjunction with the noweb package to implement
9701 \end_layout
9703 \begin_layout Plain Layout
9705 #   to code formating directly as latex.
9706 \end_layout
9708 \begin_layout Plain Layout
9710 #  The newfangle awk script
9711 \end_layout
9713 \begin_layout Plain Layout
9715 #DescriptionEnd
9716 \end_layout
9718 \begin_layout Plain Layout
9720 \end_layout
9722 \begin_layout Plain Layout
9724 Format 11
9725 \end_layout
9727 \begin_layout Plain Layout
9729 \end_layout
9731 \begin_layout Plain Layout
9733 AddToPreamble
9734 \end_layout
9736 \begin_layout Plain Layout
9739 \backslash
9740 chunkref{./newfangle.sty}>
9741 \end_layout
9743 \begin_layout Plain Layout
9745 EndPreamble
9746 \end_layout
9748 \begin_layout Plain Layout
9750 \end_layout
9752 \begin_layout Plain Layout
9755 \backslash
9756 chunkref{chunkstyle}>
9757 \end_layout
9759 \begin_layout Plain Layout
9761 \end_layout
9763 \begin_layout Plain Layout
9766 \backslash
9767 chunkref{chunkref}>
9768 \end_layout
9770 \end_inset
9773 \end_layout
9775 \begin_layout Subsection
9776 The Chunk style
9777 \end_layout
9779 \begin_layout Standard
9780 The purpose of the 
9781 \noun on
9782 chunk
9783 \noun default
9784  style is to make it easier for LyX users to provide the name to 
9785 \begin_inset Flex CharStyle:Code
9786 status collapsed
9788 \begin_layout Plain Layout
9790 \backslash
9791 lstlistings
9792 \end_layout
9794 \end_inset
9797  Normally this requires right-clicking on the listing, choosing settings,
9798  advanced, and then typing 
9799 \begin_inset Flex CharStyle:Code
9800 status collapsed
9802 \begin_layout Plain Layout
9803 name=chunk-name
9804 \end_layout
9806 \end_inset
9809  This has the further disadvantage that the name (and other options) are
9810  not generally visible during document editing.
9811 \end_layout
9813 \begin_layout Standard
9814 The chunk style is defined as a LaTeX command, so that all text on the same
9815  line is passed to the LaTeX command 
9816 \begin_inset Flex CharStyle:Code
9817 status collapsed
9819 \begin_layout Plain Layout
9820 Chunk
9821 \end_layout
9823 \end_inset
9826  This makes it easy to parse using 
9827 \begin_inset Flex CharStyle:Code
9828 status collapsed
9830 \begin_layout Plain Layout
9831 newfangle
9832 \end_layout
9834 \end_inset
9836 , and easy to pass these options on to the listings package.
9837  The first word in a chunk section should be the chunk name, and will have
9839 \begin_inset Flex CharStyle:Code
9840 status collapsed
9842 \begin_layout Plain Layout
9843 name=
9844 \end_layout
9846 \end_inset
9848  prepended to it.
9849  Any other words are accepted arguments to 
9850 \begin_inset Flex CharStyle:Code
9851 status collapsed
9853 \begin_layout Plain Layout
9855 \backslash
9856 lstset
9857 \end_layout
9859 \end_inset
9862 \end_layout
9864 \begin_layout Standard
9865 We set PassThru to 1 because the user is actually entering raw latex.
9866 \end_layout
9868 \begin_layout Chunk
9869 chunkstyle
9870 \end_layout
9872 \begin_layout Standard
9873 \begin_inset listings
9874 inline false
9875 status open
9877 \begin_layout Plain Layout
9879 Style Chunk
9880 \end_layout
9882 \begin_layout Plain Layout
9884   LatexType             Command
9885 \end_layout
9887 \begin_layout Plain Layout
9889   LatexName             Chunk
9890 \end_layout
9892 \begin_layout Plain Layout
9894   Margin                First_Dynamic
9895 \end_layout
9897 \begin_layout Plain Layout
9899   LeftMargin            Chunk:xxx
9900 \end_layout
9902 \begin_layout Plain Layout
9904   LabelSep              xx
9905 \end_layout
9907 \begin_layout Plain Layout
9909   LabelType             Static
9910 \end_layout
9912 \begin_layout Plain Layout
9914   LabelString           "Chunk:"
9915 \end_layout
9917 \begin_layout Plain Layout
9919   Align                 Left
9920 \end_layout
9922 \begin_layout Plain Layout
9924   PassThru              1
9925 \end_layout
9927 \begin_layout Plain Layout
9929 \end_layout
9931 \end_inset
9934 \end_layout
9936 \begin_layout Standard
9937 To make the label very visible we choose a larger font coloured red.
9938 \end_layout
9940 \begin_layout Standard
9941 \begin_inset listings
9942 inline false
9943 status open
9945 \begin_layout Plain Layout
9947   LabelFont
9948 \end_layout
9950 \begin_layout Plain Layout
9952     Family              Sans
9953 \end_layout
9955 \begin_layout Plain Layout
9957     Size                Large
9958 \end_layout
9960 \begin_layout Plain Layout
9962     Series              Bold
9963 \end_layout
9965 \begin_layout Plain Layout
9967     Shape               Italic
9968 \end_layout
9970 \begin_layout Plain Layout
9972     Color               red
9973 \end_layout
9975 \begin_layout Plain Layout
9977   EndFont
9978 \end_layout
9980 \begin_layout Plain Layout
9983 \end_layout
9985 \end_inset
9988 \end_layout
9990 \begin_layout Subsection
9991 The chunkref style
9992 \end_layout
9994 \begin_layout Standard
9995 We also define the Chunkref style which can be used to express cross references
9996  to chunks.
9997 \end_layout
9999 \begin_layout Chunk
10000 chunkref
10001 \end_layout
10003 \begin_layout Standard
10004 \begin_inset listings
10005 inline false
10006 status open
10008 \begin_layout Plain Layout
10010 InsetLayout Chunkref
10011 \end_layout
10013 \begin_layout Plain Layout
10015   LyxType               charstyle
10016 \end_layout
10018 \begin_layout Plain Layout
10020   LatexType             Command
10021 \end_layout
10023 \begin_layout Plain Layout
10025   LatexName             chunkref
10026 \end_layout
10028 \begin_layout Plain Layout
10030   PassThru              1
10031 \end_layout
10033 \begin_layout Plain Layout
10035   LabelFont             
10036 \end_layout
10038 \begin_layout Plain Layout
10040     Shape               Italic
10041 \end_layout
10043 \begin_layout Plain Layout
10045     Color               red
10046 \end_layout
10048 \begin_layout Plain Layout
10050   EndFont
10051 \end_layout
10053 \begin_layout Plain Layout
10056 \end_layout
10058 \end_inset
10061 \end_layout
10063 \begin_layout Section
10064 \begin_inset CommandInset label
10065 LatexCommand label
10066 name "sec:Latex-Macros"
10068 \end_inset
10070 Latex Macros
10071 \end_layout
10073 \begin_layout Standard
10074 We require the 
10075 \noun on
10076 listings
10077 \noun default
10079 \noun on
10080 noweb
10081 \noun default
10082  and 
10083 \noun on
10084 xargs
10085 \noun default
10086  packages.
10087  As noweb defines it's own 
10088 \begin_inset Flex CharStyle:Code
10089 status collapsed
10091 \begin_layout Plain Layout
10093 \backslash
10094 code
10095 \end_layout
10097 \end_inset
10099  environment, we re-define the one that LyX logical markup module expects
10100  here.
10101 \end_layout
10103 \begin_layout Chunk
10104 ./newfangle.sty,language=tex,basicstyle=
10105 \backslash
10106 ttfamily
10107 \end_layout
10109 \begin_layout Standard
10110 \begin_inset listings
10111 inline false
10112 status open
10114 \begin_layout Plain Layout
10117 \backslash
10118 usepackage{listings}%
10119 \end_layout
10121 \begin_layout Plain Layout
10124 \backslash
10125 usepackage{noweb}%
10126 \end_layout
10128 \begin_layout Plain Layout
10131 \backslash
10132 usepackage{xargs}%
10133 \end_layout
10135 \begin_layout Plain Layout
10138 \backslash
10139 renewcommand{
10140 \backslash
10141 code}[1]{
10142 \backslash
10143 texttt{#1}}%
10144 \end_layout
10146 \end_inset
10149 \end_layout
10151 \begin_layout Standard
10152 We also define a 
10153 \begin_inset Flex CharStyle:Code
10154 status collapsed
10156 \begin_layout Plain Layout
10157 CChunk
10158 \end_layout
10160 \end_inset
10162  macro, for use as: 
10163 \begin_inset Flex CharStyle:Code
10164 status collapsed
10166 \begin_layout Plain Layout
10168 \backslash
10169 begin{CChunk}
10170 \end_layout
10172 \end_inset
10174  which will need renaming to 
10175 \begin_inset Flex CharStyle:Code
10176 status collapsed
10178 \begin_layout Plain Layout
10180 \backslash
10181 begin{Chunk}
10182 \end_layout
10184 \end_inset
10186  when I can do this without clashing with 
10187 \begin_inset Flex CharStyle:Code
10188 status collapsed
10190 \begin_layout Plain Layout
10192 \backslash
10193 Chunk
10194 \end_layout
10196 \end_inset
10199 \end_layout
10201 \begin_layout Standard
10202 \begin_inset listings
10203 inline false
10204 status open
10206 \begin_layout Plain Layout
10209 \backslash
10210 lstnewenvironment{Chunk}{
10211 \backslash
10212 relax}{
10213 \backslash
10214 relax}%
10215 \end_layout
10217 \end_inset
10220 \end_layout
10222 \begin_layout Standard
10223 We also define a suitable 
10224 \begin_inset Flex CharStyle:Code
10225 status collapsed
10227 \begin_layout Plain Layout
10229 \backslash
10230 lstset
10231 \end_layout
10233 \end_inset
10235  of parameters that suit the literate programming style after the fashion
10236  of 
10237 \noun on
10238 noweave
10239 \noun default
10241 \end_layout
10243 \begin_layout Standard
10244 \begin_inset listings
10245 inline false
10246 status open
10248 \begin_layout Plain Layout
10251 \backslash
10252 lstset{numbers=left, stepnumber=5, numbersep=5pt,
10253 \end_layout
10255 \begin_layout Plain Layout
10257         breaklines=false,basicstyle=
10258 \backslash
10259 ttfamily,
10260 \end_layout
10262 \begin_layout Plain Layout
10264         numberstyle=
10265 \backslash
10266 tiny, language=C}%
10267 \end_layout
10269 \end_inset
10272 \end_layout
10274 \begin_layout Standard
10275 We also define a notangle-like mechanism for 
10276 \emph on
10277 escaping
10278 \emph default
10279  to LaTeX from the listing, and by which we can refer to other listings.
10280  We declare the 
10281 \begin_inset Flex CharStyle:Code
10282 status collapsed
10284 \begin_layout Plain Layout
10285 =<\SpecialChar \ldots{}
10287 \end_layout
10289 \end_inset
10291  sequence to contain LaTeX code, and include another like this chunk: 
10292 \begin_inset Flex CharStyle:Code
10293 status collapsed
10295 \begin_layout Plain Layout
10297 \backslash
10298 chunkref{chunkname}>
10299 \end_layout
10301 \end_inset
10304  However, because 
10305 \begin_inset Flex CharStyle:Code
10306 status collapsed
10308 \begin_layout Plain Layout
10309 =<\SpecialChar \ldots{}
10311 \end_layout
10313 \end_inset
10315  is already defined to contain LaTeX code for this document --- this is
10316  a 
10317 \noun on
10318 newfangle
10319 \noun default
10320  document after all --- the code fragment below effectively contains the
10321  LaTeX code: 
10322 \begin_inset Flex CharStyle:Code
10323 status collapsed
10325 \begin_layout Plain Layout
10327 \end_layout
10329 \end_inset
10332  To avoid problems with document generation, I had to declare an lstlistings
10333  property: 
10334 \begin_inset Flex CharStyle:Code
10335 status collapsed
10337 \begin_layout Plain Layout
10338 escapeinside={}
10339 \end_layout
10341 \end_inset
10343  for this listing only; which in LyX was done by right-clicking the listings
10344  inset, choosing 
10345 \begin_inset Flex CharStyle:Code
10346 status collapsed
10348 \begin_layout Plain Layout
10349 settings
10350 \end_layout
10352 \end_inset
10354 \SpecialChar \menuseparator
10356 \begin_inset Flex CharStyle:Code
10357 status collapsed
10359 \begin_layout Plain Layout
10360 advanced
10361 \end_layout
10363 \end_inset
10366 \end_layout
10368 \begin_layout Standard
10369 \begin_inset Note Note
10370 status collapsed
10372 \begin_layout Plain Layout
10373 =< isn't enjoyed literally here, in a listing when the escape sequence is
10374  already defined as shown...
10375  we need to somehow escape this representation...
10376 \end_layout
10378 \end_inset
10381 \end_layout
10383 \begin_layout Standard
10384 \begin_inset listings
10385 lstparams "escapeinside={}"
10386 inline false
10387 status open
10389 \begin_layout Plain Layout
10392 \backslash
10393 lstset{escapeinside={=<}{>}}%
10394 \end_layout
10396 \end_inset
10399 \end_layout
10401 \begin_layout Standard
10402 Although our macros will contain the @ symbol, they will be included in
10403  a 
10404 \begin_inset Flex CharStyle:Code
10405 status collapsed
10407 \begin_layout Plain Layout
10409 \backslash
10410 makeatletter
10411 \end_layout
10413 \end_inset
10415  section by LyX; however we keep the commented out 
10416 \begin_inset Flex CharStyle:Code
10417 status collapsed
10419 \begin_layout Plain Layout
10421 \backslash
10422 makeatletter
10423 \end_layout
10425 \end_inset
10427  as a reminder.
10428  The listings package likes to centre the titles, but noweb titles are specially
10429  formatted and must be left aligned.
10430  The simplest way to do this turned out to be by removing the definition
10431  of 
10432 \begin_inset Flex CharStyle:Code
10433 status collapsed
10435 \begin_layout Plain Layout
10437 \backslash
10438 lst@maketitle
10439 \end_layout
10441 \end_inset
10444  This may interact badly if other listings want a regular title or caption.
10445  We remember the old maketitle in case we need it.
10446 \end_layout
10448 \begin_layout Standard
10449 \begin_inset listings
10450 inline false
10451 status open
10453 \begin_layout Plain Layout
10456 \backslash
10457 makeatletter
10458 \end_layout
10460 \begin_layout Plain Layout
10462 %somehow re-defining maketitle gives us a left-aligned title
10463 \end_layout
10465 \begin_layout Plain Layout
10467 %which is extactly what our specially formatted title needs!
10468 \end_layout
10470 \begin_layout Plain Layout
10473 \backslash
10474 global
10475 \backslash
10477 \backslash
10478 newfangle@lst@maketitle
10479 \backslash
10480 lst@maketitle%
10481 \end_layout
10483 \begin_layout Plain Layout
10486 \backslash
10487 global
10488 \backslash
10490 \backslash
10491 lst@maketitle{}%
10492 \end_layout
10494 \end_inset
10497 \end_layout
10499 \begin_layout Subsection
10500 \begin_inset CommandInset label
10501 LatexCommand label
10502 name "sub:The-chunk-command"
10504 \end_inset
10506 The chunk command
10507 \end_layout
10509 \begin_layout Standard
10510 Our chunk command accepts one argument, and calls 
10511 \begin_inset Flex CharStyle:Code
10512 status collapsed
10514 \begin_layout Plain Layout
10516 \backslash
10517 ltset
10518 \end_layout
10520 \end_inset
10523  Although 
10524 \begin_inset Flex CharStyle:Code
10525 status collapsed
10527 \begin_layout Plain Layout
10529 \backslash
10530 ltset
10531 \end_layout
10533 \end_inset
10535  will note the name, this is erased when the next 
10536 \begin_inset Flex CharStyle:Code
10537 status collapsed
10539 \begin_layout Plain Layout
10541 \backslash
10542 lstlisting
10543 \end_layout
10545 \end_inset
10547  starts, so we make a note of this in 
10548 \begin_inset Flex CharStyle:Code
10549 status collapsed
10551 \begin_layout Plain Layout
10553 \backslash
10554 lst@chunkname
10555 \end_layout
10557 \end_inset
10559  and restore in in lstlistings Init hook.
10560 \end_layout
10562 \begin_layout Standard
10563 \begin_inset listings
10564 inline false
10565 status open
10567 \begin_layout Plain Layout
10570 \backslash
10572 \backslash
10573 Chunk#1{%
10574 \end_layout
10576 \begin_layout Plain Layout
10578   
10579 \backslash
10580 lstset{title={
10581 \backslash
10582 newfanglecaption},name=#1}%
10583 \end_layout
10585 \begin_layout Plain Layout
10587   
10588 \backslash
10589 global
10590 \backslash
10591 edef
10592 \backslash
10593 lst@chunkname{
10594 \backslash
10595 lst@intname}%
10596 \end_layout
10598 \begin_layout Plain Layout
10601 \end_layout
10603 \begin_layout Plain Layout
10606 \backslash
10608 \backslash
10609 lst@chunkname{
10610 \backslash
10611 empty}%
10612 \end_layout
10614 \end_inset
10617 \end_layout
10619 \begin_layout Subsubsection
10620 Chunk parameters
10621 \end_layout
10623 \begin_layout Standard
10624 Newfangle permits parameterized chunks, and requires the paramters to be
10625  specified as listings options.
10626  The newfangle script uses this, and although we don't do anything with
10627  these in the LaTeX code right now, we need to stop the listings package
10628  complaining.
10629 \end_layout
10631 \begin_layout Standard
10632 \begin_inset listings
10633 inline false
10634 status open
10636 \begin_layout Plain Layout
10639 \backslash
10640 lst@Key{params}
10641 \backslash
10642 relax{
10643 \backslash
10645 \backslash
10646 newfangle@chunk@params{#1}}%
10647 \end_layout
10649 \end_inset
10652 \end_layout
10654 \begin_layout Subsection
10655 The noweb styled caption
10656 \end_layout
10658 \begin_layout Standard
10659 We define a public macro 
10660 \begin_inset Flex CharStyle:Code
10661 status collapsed
10663 \begin_layout Plain Layout
10665 \backslash
10666 newfanglecaption
10667 \end_layout
10669 \end_inset
10671  which can be set as a regular title.
10672  By means of 
10673 \begin_inset Flex CharStyle:Code
10674 status collapsed
10676 \begin_layout Plain Layout
10678 \backslash
10679 protect
10680 \end_layout
10682 \end_inset
10684 , It expands to 
10685 \begin_inset Flex CharStyle:Code
10686 status collapsed
10688 \begin_layout Plain Layout
10690 \backslash
10691 newfangle@caption
10692 \end_layout
10694 \end_inset
10696  at the appriate time when the caption is emitted.
10697 \end_layout
10699 \begin_layout Standard
10700 \begin_inset listings
10701 inline false
10702 status open
10704 \begin_layout Plain Layout
10707 \backslash
10709 \backslash
10710 newfanglecaption{
10711 \backslash
10712 protect
10713 \backslash
10714 newfangle@caption}%
10715 \end_layout
10717 \end_inset
10720 \end_layout
10722 \begin_layout Standard
10723 \begin_inset Float figure
10724 placement H
10725 wide false
10726 sideways false
10727 status collapsed
10729 \begin_layout Plain Layout
10730 \begin_inset Box Boxed
10731 position "t"
10732 hor_pos "c"
10733 has_inner_box 1
10734 inner_pos "t"
10735 use_parbox 0
10736 width "100col%"
10737 special "none"
10738 height "1in"
10739 height_special "totalheight"
10740 status open
10742 \begin_layout Plain Layout
10744 \begin_inset space \qquad{}
10745 \end_inset
10748 \shape italic
10749 some-chunk
10750 \shape default
10751  19b⟩
10752 \begin_inset Formula $\equiv+$
10753 \end_inset
10756 \begin_inset space \qquad{}
10757 \end_inset
10760 \begin_inset space \qquad{}
10761 \end_inset
10764 \begin_inset space \qquad{}
10765 \end_inset
10768 \begin_inset Formula $\triangleleft$
10769 \end_inset
10772 \begin_inset space \quad{}
10773 \end_inset
10776 \begin_inset Formula $\triangleright$
10777 \end_inset
10780 \end_layout
10782 \begin_layout Plain Layout
10784 \size footnotesize
10785 In this example, the current chunk is 22c, and therefore the third chunk
10786  on page 22.
10787 \end_layout
10789 \begin_layout Plain Layout
10791 \size footnotesize
10792 It's name is 
10793 \emph on
10794 some-chunk
10795 \emph default
10798 \end_layout
10800 \begin_layout Plain Layout
10802 \size footnotesize
10803 The first chunk with this name (19b) occurs as the second chunk on page
10804  19.
10805 \end_layout
10807 \begin_layout Plain Layout
10809 \size footnotesize
10810 The previous chunk (22d) with the same name is the second chunk on page
10811  22.
10812 \end_layout
10814 \begin_layout Plain Layout
10816 \size footnotesize
10817 The next chunk (24d) is the fourth chunk on page 24.
10818 \end_layout
10820 \begin_layout Plain Layout
10821 \begin_inset Caption
10823 \begin_layout Plain Layout
10824 noweb heading
10825 \end_layout
10827 \end_inset
10830 \end_layout
10832 \end_inset
10835 \end_layout
10837 \end_inset
10839 The general noweb output format compactly identifies the current chunk,
10840  and references to the first chunk, and the previous and next chunks that
10841  have the same name.
10843 \end_layout
10845 \begin_layout Standard
10846 This means that we need to keep a counter for each chunk-name, that we use
10847  to count chunks of the same name.
10849 \end_layout
10851 \begin_layout Subsection
10852 The chunk counter
10853 \end_layout
10855 \begin_layout Standard
10856 It would be natural to have a counter for each chunk name, but TeX would
10857  soon run out of counters
10858 \begin_inset Foot
10859 status collapsed
10861 \begin_layout Plain Layout
10862 \SpecialChar \ldots{}
10863 soon 
10864 \emph on
10866 \emph default
10867  run out of counters and so I had to re-write the LaTeX macros to share
10868  a counter as described here
10869 \end_layout
10871 \end_inset
10873 , so we have one counter which we save at the end of a chunk and restore
10874  at the beginning of a chunk.
10875 \end_layout
10877 \begin_layout Standard
10878 \begin_inset listings
10879 inline false
10880 status open
10882 \begin_layout Plain Layout
10885 \backslash
10886 newcounter{newfangle@chunkcounter}%
10887 \end_layout
10889 \end_inset
10892 \end_layout
10894 \begin_layout Standard
10895 We construct the name of this variable to store the counter to be the text
10897 \begin_inset Flex CharStyle:Code
10898 status collapsed
10900 \begin_layout Plain Layout
10901 lst-chunk-
10902 \end_layout
10904 \end_inset
10906  prefixed onto the chunks own name, and store it in 
10907 \begin_inset Flex CharStyle:Code
10908 status collapsed
10910 \begin_layout Plain Layout
10912 \backslash
10913 chunkcount
10914 \end_layout
10916 \end_inset
10920 \end_layout
10922 \begin_layout Standard
10923 We save the counter like this:
10924 \end_layout
10926 \begin_layout Chunk
10927 save-counter
10928 \end_layout
10930 \begin_layout Standard
10931 \begin_inset listings
10932 inline false
10933 status open
10935 \begin_layout Plain Layout
10938 \backslash
10939 global
10940 \backslash
10941 expandafter
10942 \backslash
10943 edef
10944 \backslash
10945 csname 
10946 \backslash
10947 chunkcount
10948 \backslash
10949 endcsname{
10950 \backslash
10951 arabic{newfangle@chunkcounter}}%
10952 \end_layout
10954 \end_inset
10957 \end_layout
10959 \begin_layout Standard
10960 and restore the counter like this:
10961 \end_layout
10963 \begin_layout Chunk
10964 restore-counter
10965 \end_layout
10967 \begin_layout Standard
10968 \begin_inset listings
10969 inline false
10970 status open
10972 \begin_layout Plain Layout
10975 \backslash
10976 setcounter{newfangle@chunkcounter}{
10977 \backslash
10978 csname 
10979 \backslash
10980 chunkcount
10981 \backslash
10982 endcsname}%
10983 \end_layout
10985 \end_inset
10988 \end_layout
10990 \begin_layout Chunk
10991 ./newfangle.sty
10992 \end_layout
10994 \begin_layout Standard
10995 If there does not already exist a variable whose name is stored in 
10996 \begin_inset Flex CharStyle:Code
10997 status collapsed
10999 \begin_layout Plain Layout
11001 \backslash
11002 chunkcount
11003 \end_layout
11005 \end_inset
11007 , then we know we are the first chunk with this name, and then define a
11008  counter.
11010 \end_layout
11012 \begin_layout Standard
11013 Although chunks of the same name share a common counter, they must still
11014  be distinguished.
11015  We use is the internal name of the listing, suffixed by the counter value.
11016  So the first chunk might be 
11017 \begin_inset Flex CharStyle:Code
11018 status collapsed
11020 \begin_layout Plain Layout
11021 something-1
11022 \end_layout
11024 \end_inset
11026  and the second chunk be 
11027 \begin_inset Flex CharStyle:Code
11028 status collapsed
11030 \begin_layout Plain Layout
11031 something-2
11032 \end_layout
11034 \end_inset
11036 , etc.
11037 \end_layout
11039 \begin_layout Standard
11040 We also calculate the name of the previous chunk if we can (before we increment
11041  the chunk counter).
11042  If this is the first chunk of that name, then 
11043 \begin_inset Flex CharStyle:Code
11044 status collapsed
11046 \begin_layout Plain Layout
11048 \backslash
11049 prevchunkname
11050 \end_layout
11052 \end_inset
11054  is set to 
11055 \begin_inset Flex CharStyle:Code
11056 status collapsed
11058 \begin_layout Plain Layout
11060 \backslash
11061 relax
11062 \end_layout
11064 \end_inset
11066  which the noweb package will interpret as not existing.
11067 \end_layout
11069 \begin_layout Standard
11070 \begin_inset listings
11071 inline false
11072 status open
11074 \begin_layout Plain Layout
11077 \backslash
11079 \backslash
11080 newfangle@caption{%
11081 \end_layout
11083 \begin_layout Plain Layout
11085   
11086 \backslash
11087 edef
11088 \backslash
11089 chunkcount{lst-chunk-
11090 \backslash
11091 lst@intname}%
11092 \end_layout
11094 \begin_layout Plain Layout
11096   
11097 \backslash
11098 @ifundefined{
11099 \backslash
11100 chunkcount}{%
11101 \end_layout
11103 \begin_layout Plain Layout
11105     
11106 \backslash
11107 expandafter
11108 \backslash
11109 gdef
11110 \backslash
11111 csname 
11112 \backslash
11113 chunkcount
11114 \backslash
11115 endcsname{0}%
11116 \end_layout
11118 \begin_layout Plain Layout
11120     
11121 \backslash
11122 setcounter{newfangle@chunkcounter}{
11123 \backslash
11124 csname 
11125 \backslash
11126 chunkcount
11127 \backslash
11128 endcsname}%
11129 \end_layout
11131 \begin_layout Plain Layout
11133     
11134 \backslash
11136 \backslash
11137 prevchunkname
11138 \backslash
11139 relax%
11140 \end_layout
11142 \begin_layout Plain Layout
11144   }{%
11145 \end_layout
11147 \begin_layout Plain Layout
11149     
11150 \backslash
11151 setcounter{newfangle@chunkcounter}{
11152 \backslash
11153 csname 
11154 \backslash
11155 chunkcount
11156 \backslash
11157 endcsname}%
11158 \end_layout
11160 \begin_layout Plain Layout
11162     
11163 \backslash
11164 edef
11165 \backslash
11166 prevchunkname{
11167 \backslash
11168 lst@intname-
11169 \backslash
11170 arabic{newfangle@chunkcounter}}%
11171 \end_layout
11173 \begin_layout Plain Layout
11175   }%
11176 \end_layout
11178 \end_inset
11181 \end_layout
11183 \begin_layout Standard
11184 After incrementing the chunk counter, we then define the name of this chunk,
11185  as well as the name of the first chunk.
11186 \end_layout
11188 \begin_layout Standard
11189 \begin_inset listings
11190 inline false
11191 status open
11193 \begin_layout Plain Layout
11195   
11196 \backslash
11197 addtocounter{newfangle@chunkcounter}{1}%
11198 \end_layout
11200 \begin_layout Plain Layout
11202   
11203 \backslash
11204 global
11205 \backslash
11206 expandafter
11207 \backslash
11208 edef
11209 \backslash
11210 csname 
11211 \backslash
11212 chunkcount
11213 \backslash
11214 endcsname{
11215 \backslash
11216 arabic{newfangle@chunkcounter}}%
11217 \end_layout
11219 \begin_layout Plain Layout
11221   
11222 \backslash
11223 edef
11224 \backslash
11225 chunkname{
11226 \backslash
11227 lst@intname-
11228 \backslash
11229 arabic{newfangle@chunkcounter}}%
11230 \end_layout
11232 \begin_layout Plain Layout
11234   
11235 \backslash
11236 edef
11237 \backslash
11238 firstchunkname{
11239 \backslash
11240 lst@intname-1}%
11241 \end_layout
11243 \end_inset
11246 \end_layout
11248 \begin_layout Standard
11249 We now need to calculate the name of the next chunk.
11250  We do this by temporarily skipping the counter on by one; however there
11251  may not actually be another chunk with this name! We detect this by also
11252  defining a label for each chunk based on the chunkname.
11253  If there is a next chunkname then it will define a label with that name.
11254  As labels are persistent, we can at least tell the second time LaTeX is
11255  run.
11256  If we don't find such a defined label then we define 
11257 \begin_inset Flex CharStyle:Code
11258 status collapsed
11260 \begin_layout Plain Layout
11262 \backslash
11263 nextchunkname
11264 \end_layout
11266 \end_inset
11268  to 
11269 \begin_inset Flex CharStyle:Code
11270 status collapsed
11272 \begin_layout Plain Layout
11274 \backslash
11275 relax
11276 \end_layout
11278 \end_inset
11281 \end_layout
11283 \begin_layout Standard
11284 \begin_inset listings
11285 inline false
11286 status open
11288 \begin_layout Plain Layout
11290   
11291 \backslash
11292 addtocounter{newfangle@chunkcounter}{1}%
11293 \end_layout
11295 \begin_layout Plain Layout
11297   
11298 \backslash
11299 edef
11300 \backslash
11301 nextchunkname{
11302 \backslash
11303 lst@intname-
11304 \backslash
11305 arabic{newfangle@chunkcounter}}%
11306 \end_layout
11308 \begin_layout Plain Layout
11310   
11311 \backslash
11312 @ifundefined{r@label-
11313 \backslash
11314 nextchunkname}{
11315 \backslash
11317 \backslash
11318 nextchunkname
11319 \backslash
11320 relax}{}%
11321 \end_layout
11323 \end_inset
11326 \end_layout
11328 \begin_layout Standard
11329 The noweb package requires that we define a 
11330 \begin_inset Flex CharStyle:Code
11331 status collapsed
11333 \begin_layout Plain Layout
11335 \backslash
11336 sublabel
11337 \end_layout
11339 \end_inset
11341  for every chunk, with a unique name, which is then used to print out it's
11342  navigation hints.
11343 \end_layout
11345 \begin_layout Standard
11346 We also define a regular label for this chunk, as was mentioned above when
11347  we calculated 
11348 \begin_inset Flex CharStyle:Code
11349 status collapsed
11351 \begin_layout Plain Layout
11353 \backslash
11354 nextchunkname
11355 \end_layout
11357 \end_inset
11360  This requires LaTeX to be run at least twice after new chunk sections are
11361  added --- but noweb requried that anyway.
11362 \end_layout
11364 \begin_layout Standard
11365 \begin_inset listings
11366 inline false
11367 status open
11369 \begin_layout Plain Layout
11371   
11372 \backslash
11373 sublabel{
11374 \backslash
11375 chunkname}%
11376 \end_layout
11378 \begin_layout Plain Layout
11380 % define this label for every chunk instance, so we
11381 \end_layout
11383 \begin_layout Plain Layout
11385 % can tell when we are the last chunk of this name
11386 \end_layout
11388 \begin_layout Plain Layout
11390   
11391 \backslash
11392 label{label-
11393 \backslash
11394 chunkname}%
11395 \end_layout
11397 \end_inset
11400 \end_layout
11402 \begin_layout Standard
11403 We also try and add the chunk to the list of listings, but I'm afraid we
11404  don't do very well.
11405  We want each chunk name listing once, with all of it's references.
11406 \end_layout
11408 \begin_layout Standard
11409 \begin_inset listings
11410 inline false
11411 status open
11413 \begin_layout Plain Layout
11415   
11416 \backslash
11417 addcontentsline{lol}{lstlisting}{
11418 \backslash
11419 lst@name~[
11420 \backslash
11421 protect
11422 \backslash
11423 subpageref{
11424 \backslash
11425 chunkname}]}%
11426 \end_layout
11428 \end_inset
11431 \end_layout
11433 \begin_layout Standard
11434 We then call the noweb output macros in the same way that noweave generates
11435  them, except that we don't need to call 
11436 \begin_inset Flex CharStyle:Code
11437 status collapsed
11439 \begin_layout Plain Layout
11441 \backslash
11442 nwstartdeflinemarkup
11443 \end_layout
11445 \end_inset
11447  or 
11448 \begin_inset Flex CharStyle:Code
11449 status collapsed
11451 \begin_layout Plain Layout
11453 \backslash
11454 nwenddeflinemarkup
11455 \end_layout
11457 \end_inset
11459  -- and if we do it messes up the output somewhat.
11460 \end_layout
11462 \begin_layout Standard
11463 \begin_inset listings
11464 inline false
11465 status open
11467 \begin_layout Plain Layout
11469   
11470 \backslash
11471 nwmargintag{%
11472 \end_layout
11474 \begin_layout Plain Layout
11476     {%
11477 \end_layout
11479 \begin_layout Plain Layout
11481       
11482 \backslash
11483 nwtagstyle{}%
11484 \end_layout
11486 \begin_layout Plain Layout
11488       
11489 \backslash
11490 subpageref{
11491 \backslash
11492 chunkname}%
11493 \end_layout
11495 \begin_layout Plain Layout
11497     }%
11498 \end_layout
11500 \begin_layout Plain Layout
11502   }%
11503 \end_layout
11505 \begin_layout Plain Layout
11508 \end_layout
11510 \begin_layout Plain Layout
11512   
11513 \backslash
11514 moddef{%
11515 \end_layout
11517 \begin_layout Plain Layout
11519     {
11520 \backslash
11521 lst@name}%
11522 \end_layout
11524 \begin_layout Plain Layout
11526     {%
11527 \end_layout
11529 \begin_layout Plain Layout
11531       
11532 \backslash
11533 nwtagstyle{}
11534 \backslash
11536 \end_layout
11538 \begin_layout Plain Layout
11540       
11541 \backslash
11542 @ifundefined{newfangle@chunk@params}{}{%
11543 \end_layout
11545 \begin_layout Plain Layout
11547         (
11548 \backslash
11549 newfangle@chunk@params)%
11550 \end_layout
11552 \begin_layout Plain Layout
11554       }%
11555 \end_layout
11557 \begin_layout Plain Layout
11559       [
11560 \backslash
11561 csname 
11562 \backslash
11563 chunkcount
11564 \backslash
11565 endcsname]~%%
11566 \end_layout
11568 \begin_layout Plain Layout
11570       
11571 \backslash
11572 subpageref{
11573 \backslash
11574 firstchunkname}%
11575 \end_layout
11577 \begin_layout Plain Layout
11579     }%
11580 \end_layout
11582 \begin_layout Plain Layout
11584   }%
11585 \end_layout
11587 \begin_layout Plain Layout
11590 \end_layout
11592 \begin_layout Plain Layout
11594   
11595 \backslash
11597 \backslash
11598 relax
11599 \backslash
11600 prevchunkname
11601 \backslash
11602 endmoddef
11603 \backslash
11604 else
11605 \backslash
11606 plusendmoddef
11607 \backslash
11609 \end_layout
11611 \begin_layout Plain Layout
11613 %  
11614 \backslash
11615 nwstartdeflinemarkup%
11616 \end_layout
11618 \begin_layout Plain Layout
11620   
11621 \backslash
11622 nwprevnextdefs{
11623 \backslash
11624 prevchunkname}{
11625 \backslash
11626 nextchunkname}%
11627 \end_layout
11629 \begin_layout Plain Layout
11631 %  
11632 \backslash
11633 nwenddeflinemarkup%
11634 \end_layout
11636 \begin_layout Plain Layout
11639 \end_layout
11641 \end_inset
11644 \end_layout
11646 \begin_layout Standard
11647 Originally this was developed as a 
11648 \begin_inset Flex CharStyle:Code
11649 status collapsed
11651 \begin_layout Plain Layout
11652 listings
11653 \end_layout
11655 \end_inset
11657  aspect, in the Init hook, but it was found easier to affect the title without
11658  using a hook --- 
11659 \begin_inset Flex CharStyle:Code
11660 status collapsed
11662 \begin_layout Plain Layout
11664 \backslash
11665 lst@AddToHookExe{PreSet}
11666 \end_layout
11668 \end_inset
11670  is still required to set the listings name to the name passed to the 
11671 \begin_inset Flex CharStyle:Code
11672 status collapsed
11674 \begin_layout Plain Layout
11676 \backslash
11677 Chunk
11678 \end_layout
11680 \end_inset
11682  command, though.
11683 \end_layout
11685 \begin_layout Standard
11686 \begin_inset listings
11687 inline false
11688 status open
11690 \begin_layout Plain Layout
11693 \backslash
11694 lst@BeginAspect{newfangle}
11695 \end_layout
11697 \begin_layout Plain Layout
11700 \backslash
11701 lst@Key{newfangle}{true}[t]{
11702 \backslash
11703 lstKV@SetIf{#1}{true}}
11704 \end_layout
11706 \begin_layout Plain Layout
11709 \backslash
11710 lst@AddToHookExe{PreSet}{
11711 \backslash
11712 global
11713 \backslash
11715 \backslash
11716 lst@intname
11717 \backslash
11718 lst@chunkname}
11719 \end_layout
11721 \begin_layout Plain Layout
11724 \backslash
11725 lst@AddToHook{Init}{}%
11726 \backslash
11727 newfangle@caption}
11728 \end_layout
11730 \begin_layout Plain Layout
11733 \backslash
11734 lst@EndAspect
11735 \end_layout
11737 \end_inset
11740 \end_layout
11742 \begin_layout Subsection
11743 Cross references
11744 \end_layout
11746 \begin_layout Standard
11747 We define the 
11748 \backslash
11749 chunkref command which makes it easy to generate visual references to different
11750  code chunks, e.g.
11751 \end_layout
11753 \begin_layout Standard
11754 \begin_inset Tabular
11755 <lyxtabular version="3" rows="4" columns="2">
11756 <features>
11757 <column alignment="center" valignment="top" width="0">
11758 <column alignment="center" valignment="top" width="0">
11759 <row>
11760 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
11761 \begin_inset Text
11763 \begin_layout Plain Layout
11764 Macro
11765 \end_layout
11767 \end_inset
11768 </cell>
11769 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
11770 \begin_inset Text
11772 \begin_layout Plain Layout
11773 Appearance
11774 \end_layout
11776 \end_inset
11777 </cell>
11778 </row>
11779 <row>
11780 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
11781 \begin_inset Text
11783 \begin_layout Plain Layout
11785 \backslash
11786 chunkref{preamble}
11787 \end_layout
11789 \end_inset
11790 </cell>
11791 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
11792 \begin_inset Text
11794 \begin_layout Plain Layout
11795 \begin_inset ERT
11796 status open
11798 \begin_layout Plain Layout
11801 \backslash
11802 chunkref{preamble}
11803 \end_layout
11805 \end_inset
11808 \end_layout
11810 \end_inset
11811 </cell>
11812 </row>
11813 <row>
11814 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
11815 \begin_inset Text
11817 \begin_layout Plain Layout
11819 \backslash
11820 chunkref[3]{preamble}
11821 \end_layout
11823 \end_inset
11824 </cell>
11825 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
11826 \begin_inset Text
11828 \begin_layout Plain Layout
11829 \begin_inset ERT
11830 status open
11832 \begin_layout Plain Layout
11835 \backslash
11836 chunkref[3]{preamble}
11837 \end_layout
11839 \end_inset
11842 \end_layout
11844 \end_inset
11845 </cell>
11846 </row>
11847 <row>
11848 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
11849 \begin_inset Text
11851 \begin_layout Plain Layout
11853 \backslash
11854 chunkref{preamble}[arg1, arg2]
11855 \end_layout
11857 \end_inset
11858 </cell>
11859 <cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
11860 \begin_inset Text
11862 \begin_layout Plain Layout
11863 \begin_inset ERT
11864 status open
11866 \begin_layout Plain Layout
11869 \backslash
11870 chunkref{preamble}[arg1, arg2]
11871 \end_layout
11873 \end_inset
11876 \end_layout
11878 \end_inset
11879 </cell>
11880 </row>
11881 </lyxtabular>
11883 \end_inset
11886 \end_layout
11888 \begin_layout Standard
11889 Chunkref can also be used within a code chunk to include another code chunk.
11890  The third optional parameter to chunkref is a comma sepatarated list of
11891  arguments, which will replace defined parameters in the chunkref.
11892 \begin_inset Note Note
11893 status open
11895 \begin_layout Plain Layout
11896 Darn it, if I have: =<
11897 \backslash
11898 chunkref{new-mode}[{chunks[chunk_name, "language"]},{mode}]> the inner braces
11899  (inside [ ]) cause _ to signify subscript even though we have lst@ReplaceIn
11900 \end_layout
11902 \end_inset
11905 \end_layout
11907 \begin_layout Standard
11908 \begin_inset listings
11909 inline false
11910 status open
11912 \begin_layout Plain Layout
11915 \backslash
11917 \backslash
11918 chunkref@args#1,{%
11919 \end_layout
11921 \begin_layout Plain Layout
11923   
11924 \backslash
11926 \backslash
11927 arg{#1}%
11928 \end_layout
11930 \begin_layout Plain Layout
11932   
11933 \backslash
11934 lst@ReplaceIn
11935 \backslash
11937 \backslash
11938 lst@filenamerpl%
11939 \end_layout
11941 \begin_layout Plain Layout
11943   
11944 \backslash
11945 arg%
11946 \end_layout
11948 \begin_layout Plain Layout
11950   
11951 \backslash
11952 @ifnextchar){
11953 \backslash
11954 relax}{, 
11955 \backslash
11956 chunkref@args}%
11957 \end_layout
11959 \begin_layout Plain Layout
11962 \end_layout
11964 \begin_layout Plain Layout
11967 \backslash
11968 newcommand
11969 \backslash
11970 chunkref[2][0]{%
11971 \end_layout
11973 \begin_layout Plain Layout
11975   
11976 \backslash
11977 @ifnextchar({
11978 \backslash
11979 chunkref@i{#1}{#2}}{
11980 \backslash
11981 chunkref@i{#1}{#2}()}%
11982 \end_layout
11984 \begin_layout Plain Layout
11987 \end_layout
11989 \begin_layout Plain Layout
11992 \backslash
11994 \backslash
11995 chunkref@i#1#2(#3){%
11996 \end_layout
11998 \begin_layout Plain Layout
12000   
12001 \backslash
12003 \backslash
12004 zero{0}%
12005 \end_layout
12007 \begin_layout Plain Layout
12009   
12010 \backslash
12012 \backslash
12013 chunk{#2}%
12014 \end_layout
12016 \begin_layout Plain Layout
12018   
12019 \backslash
12021 \backslash
12022 chunkno{#1}%
12023 \end_layout
12025 \begin_layout Plain Layout
12027   
12028 \backslash
12030 \backslash
12031 chunkargs{#3}%
12032 \end_layout
12034 \begin_layout Plain Layout
12036   
12037 \backslash
12039 \backslash
12040 chunkno
12041 \backslash
12042 zero%
12043 \end_layout
12045 \begin_layout Plain Layout
12047     
12048 \backslash
12050 \backslash
12051 chunkname{#2-1}%
12052 \end_layout
12054 \begin_layout Plain Layout
12056   
12057 \backslash
12058 else%
12059 \end_layout
12061 \begin_layout Plain Layout
12063     
12064 \backslash
12066 \backslash
12067 chunkname{#2-
12068 \backslash
12069 chunkno}%
12070 \end_layout
12072 \begin_layout Plain Layout
12074   
12075 \backslash
12077 \end_layout
12079 \begin_layout Plain Layout
12081   
12082 \backslash
12084 \backslash
12085 lst@arg
12086 \backslash
12087 chunk%
12088 \end_layout
12090 \begin_layout Plain Layout
12092   
12093 \backslash
12094 lst@ReplaceIn
12095 \backslash
12096 chunk
12097 \backslash
12098 lst@filenamerpl%
12099 \end_layout
12101 \begin_layout Plain Layout
12103   
12104 \backslash
12105 LA{%
12106 \backslash
12107 moddef{%
12108 \end_layout
12110 \begin_layout Plain Layout
12112     {
12113 \backslash
12114 chunk}%
12115 \end_layout
12117 \begin_layout Plain Layout
12119     {%
12120 \end_layout
12122 \begin_layout Plain Layout
12124       
12125 \backslash
12126 nwtagstyle{}
12127 \backslash
12129 \end_layout
12131 \begin_layout Plain Layout
12133       
12134 \backslash
12136 \backslash
12137 chunkno
12138 \backslash
12139 zero%
12140 \end_layout
12142 \begin_layout Plain Layout
12144       
12145 \backslash
12146 else%
12147 \end_layout
12149 \begin_layout Plain Layout
12151       [
12152 \backslash
12153 chunkno]%
12154 \end_layout
12156 \begin_layout Plain Layout
12158       
12159 \backslash
12161 \end_layout
12163 \begin_layout Plain Layout
12165       
12166 \backslash
12168 \backslash
12169 chunkargs
12170 \backslash
12171 empty%
12172 \end_layout
12174 \begin_layout Plain Layout
12176       
12177 \backslash
12178 else%
12179 \end_layout
12181 \begin_layout Plain Layout
12183         (
12184 \backslash
12185 chunkref@args #3,)%
12186 \end_layout
12188 \begin_layout Plain Layout
12190       
12191 \backslash
12193 \end_layout
12195 \begin_layout Plain Layout
12197       ~
12198 \backslash
12199 subpageref{
12200 \backslash
12201 chunkname}%
12202 \end_layout
12204 \begin_layout Plain Layout
12206     }%
12207 \end_layout
12209 \begin_layout Plain Layout
12211   }%
12212 \end_layout
12214 \begin_layout Plain Layout
12216   
12217 \backslash
12219 \backslash
12220 endmoddef%
12221 \end_layout
12223 \begin_layout Plain Layout
12226 \end_layout
12228 \end_inset
12231 \end_layout
12233 \begin_layout Subsection
12234 The end
12235 \end_layout
12237 \begin_layout Standard
12238 \begin_inset listings
12239 inline false
12240 status open
12242 \begin_layout Plain Layout
12245 \end_layout
12247 \begin_layout Plain Layout
12250 \backslash
12251 makeatother
12252 \end_layout
12254 \end_inset
12257 \end_layout
12259 \begin_layout Chapter
12260 Extracting newfangle
12261 \end_layout
12263 \begin_layout Section
12264 Extracting from Lyx
12265 \end_layout
12267 \begin_layout Standard
12268 To extract from LyX, you will need to configure LyX as explained in section
12270 \begin_inset CommandInset ref
12271 LatexCommand ref
12272 reference "sub:Configuring-the-build"
12274 \end_inset
12277 \end_layout
12279 \begin_layout Standard
12280 \begin_inset CommandInset label
12281 LatexCommand label
12282 name "lyx-build-script"
12284 \end_inset
12286 And this lyx-build scrap will extract newfangle for me.
12287 \end_layout
12289 \begin_layout Chunk
12290 lyx-build,language=sh
12291 \end_layout
12293 \begin_layout Standard
12294 \begin_inset listings
12295 inline false
12296 status open
12298 \begin_layout Plain Layout
12300 #! /bin/sh
12301 \end_layout
12303 \begin_layout Plain Layout
12305 set -x
12306 \end_layout
12308 \begin_layout Plain Layout
12310 \end_layout
12312 \begin_layout Plain Layout
12315 \backslash
12316 chunkref{lyx-build-helper}>
12317 \end_layout
12319 \begin_layout Plain Layout
12321 cd $PROJECT_DIR || exit 1
12322 \end_layout
12324 \begin_layout Plain Layout
12326 \end_layout
12328 \begin_layout Plain Layout
12330 /usr/local/bin/newfangle -R./newfangle $TEX_SRC > ./newfangle
12331 \end_layout
12333 \begin_layout Plain Layout
12335 /usr/local/bin/newfangle -R./newfangle.module $TEX_SRC > ./newfangle.module
12336 \end_layout
12338 \end_inset
12341 \end_layout
12343 \begin_layout Standard
12344 With a lyx-build-helper
12345 \end_layout
12347 \begin_layout Chunk
12348 lyx-build-helper,language=sh
12349 \end_layout
12351 \begin_layout Standard
12352 \begin_inset listings
12353 inline false
12354 status open
12356 \begin_layout Plain Layout
12358 PROJECT_DIR="$LYX_r"
12359 \end_layout
12361 \begin_layout Plain Layout
12363 LYX_SRC="$PROJECT_DIR/${LYX_i%.tex}.lyx"
12364 \end_layout
12366 \begin_layout Plain Layout
12368 TEX_DIR="$LYX_p"
12369 \end_layout
12371 \begin_layout Plain Layout
12373 TEX_SRC="$TEX_DIR/$LYX_i"
12374 \end_layout
12376 \end_inset
12379 \end_layout
12381 \begin_layout Section
12382 Extracting from the command line
12383 \end_layout
12385 \begin_layout Standard
12386 First you will need the tex output, then you can extract:
12387 \end_layout
12389 \begin_layout Chunk
12390 lyx-build-manual,language=sh
12391 \end_layout
12393 \begin_layout Standard
12394 \begin_inset listings
12395 inline false
12396 status open
12398 \begin_layout Plain Layout
12400 lyx -e latex newfangle.lyx
12401 \end_layout
12403 \begin_layout Plain Layout
12405 newfangle -R./newfangle newfangle.tex > ./newfangle
12406 \end_layout
12408 \begin_layout Plain Layout
12410 newfangle -R./newfangle.module newfangle.tex > ./newfangle.module
12411 \end_layout
12413 \end_inset
12416 \end_layout
12418 \begin_layout Part
12419 Tests
12420 \end_layout
12422 \begin_layout Chapter
12423 Chunk Parameters
12424 \end_layout
12426 \begin_layout Chunk
12427 tests-sub,params=THING;colour
12428 \end_layout
12430 \begin_layout Standard
12431 \begin_inset listings
12432 inline false
12433 status open
12435 \begin_layout Plain Layout
12437 I see a ${THING} of 
12438 \end_layout
12440 \begin_layout Plain Layout
12442 colour ${colour}, 
12443 \end_layout
12445 \begin_layout Plain Layout
12447 looking closer =<
12448 \backslash
12449 chunkref{tests-sub-sub}(${colour})>
12450 \end_layout
12452 \end_inset
12455 \end_layout
12457 \begin_layout Chunk
12458 tests-sub-sub,params=colour
12459 \end_layout
12461 \begin_layout Standard
12462 \begin_inset listings
12463 inline false
12464 status open
12466 \begin_layout Plain Layout
12468 a funny shade of ${colour}
12469 \end_layout
12471 \end_inset
12474 \end_layout
12476 \begin_layout Chunk
12477 tests
12478 \end_layout
12480 \begin_layout Standard
12481 \begin_inset listings
12482 inline false
12483 status open
12485 \begin_layout Plain Layout
12487 What do you see? "=<
12488 \backslash
12489 chunkref{tests-sub}(joe, red)>"
12490 \end_layout
12492 \begin_layout Plain Layout
12494 Well, fancy!
12495 \end_layout
12497 \end_inset
12500 \end_layout
12502 \begin_layout Standard
12503 Should generate output:
12504 \end_layout
12506 \begin_layout Chunk
12507 tests-result
12508 \end_layout
12510 \begin_layout Standard
12511 \begin_inset listings
12512 inline false
12513 status open
12515 \begin_layout Plain Layout
12517 What do you see? "I see a joe of 
12518 \end_layout
12520 \begin_layout Plain Layout
12522                   colour red, 
12523 \end_layout
12525 \begin_layout Plain Layout
12527                   looking closer a funny shade of red"
12528 \end_layout
12530 \begin_layout Plain Layout
12532 Well, fancy!
12533 \end_layout
12535 \begin_layout Plain Layout
12537 \end_layout
12539 \end_inset
12542 \end_layout
12544 \end_body
12545 \end_document