Index: doc/theses/mike_brooks_MMath/Makefile
===================================================================
--- doc/theses/mike_brooks_MMath/Makefile	(revision 266732e2818527a06669f666f04fb32c296a3b9f)
+++ doc/theses/mike_brooks_MMath/Makefile	(revision b64d0f4af1fe5b3c45967f89591e4e709fe89116)
@@ -67,12 +67,12 @@
 	${CFA} $< -o $@
 
-${Build}/%: ${Programs}/%.run.cfa | ${Build}
-	${CFA} $< -o $@
+${Build}/%: ${Programs}/%.run.cfa | ${Build} # cfa cannot handle pipe
+	sed -f ${Programs}/sedcmd $< > ${Build}/tmp.cfa; ${CFA} ${Build}/tmp.cfa -o $@
 
 ${Build}/%: ${Programs}/%.run.c | ${Build}
-	${CC}  $< -o $@
+	sed -f ${Programs}/sedcmd $< | ${CC} -x c -I ${Programs} -o $@ -
 
 ${Build}/%: ${Programs}/%.run.cpp | ${Build}
-	${CXX} -MMD $< -o $@
+	sed -f ${Programs}/sedcmd $< | ${CXX} -x c++ -I ${Programs} -o $@ -
 
 ${Build}/%.out: ${Build}/% | ${Build}
Index: doc/theses/mike_brooks_MMath/array.tex
===================================================================
--- doc/theses/mike_brooks_MMath/array.tex	(revision 266732e2818527a06669f666f04fb32c296a3b9f)
+++ doc/theses/mike_brooks_MMath/array.tex	(revision b64d0f4af1fe5b3c45967f89591e4e709fe89116)
@@ -80,5 +80,5 @@
 The stratification of type variables preceding object declarations makes a length referenceable everywhere that it is needed.
 For example, a declaration can share one length, @N@, among a pair of parameters and the return.
-\lstinputlisting[language=CFA, firstline=10, lastline=17]{hello-array.cfa}
+\lstinput{10-17}{hello-array.cfa}
 Here, the function @f@ does a pointwise comparison, checking if each pair of numbers is within half a percent of each other, returning the answers in a newly allocated @bool@ array.
 
@@ -94,5 +94,5 @@
 
 \begin{figure}
-\lstinputlisting[language=CFA, firstline=30, lastline=49]{hello-array.cfa}
+\lstinput{30-49}{hello-array.cfa}
 \caption{\lstinline{f} Harness}
 \label{f:fHarness}
@@ -142,5 +142,5 @@
 }
 \end{cfa}
-%\lstinputlisting[language=CFA, firstline=60, lastline=65]{hello-array.cfa}
+%\lstinput{60-65}{hello-array.cfa}
 As is common practice in C, the programmer is free to cast, to assert knowledge not shared with the type system.
 \begin{cfa}
@@ -152,15 +152,15 @@
 }
 \end{cfa}
-%\lstinputlisting[language=CFA, firstline=70, lastline=75]{hello-array.cfa}
+%\lstinput{70-75}{hello-array.cfa}
 
 Argument safety and the associated implicit communication of array length work with \CFA's generic types too.
 \CFA allows aggregate types to be generalized with multiple type parameters, including parameterized element type, so can it be defined over a parameterized length.
 Doing so gives a refinement of C's ``flexible array member'' pattern, that allows nesting structures with array members anywhere within other structures.
-\lstinputlisting[language=CFA, firstline=10, lastline=16]{hello-accordion.cfa}
+\lstinput{10-16}{hello-accordion.cfa}
 This structure's layout has the starting offset of @cost_contribs@ varying in @Nclients@, and the offset of @total_cost@ varying in both generic parameters.
 For a function that operates on a @request@ structure, the type system handles this variation transparently.
-\lstinputlisting[language=CFA, firstline=40, lastline=47]{hello-accordion.cfa}
+\lstinput{40-47}{hello-accordion.cfa}
 In the example, different runs of the program result in different offset values being used.
-\lstinputlisting[language=CFA, firstline=60, lastline=76]{hello-accordion.cfa}
+\lstinput{60-76}{hello-accordion.cfa}
 The output values show that @summarize@ and its caller agree on both the offsets (where the callee starts reading @cost_contribs@ and where the callee writes @total_cost@).
 Yet the call site still says just, ``pass the request.''
@@ -179,5 +179,5 @@
 
 Examples are shown using a $5 \times 7$ float array, @a@, loaded with increments of $0.1$ when stepping across the length-7 finely-strided dimension shown on columns, and with increments of $1.0$ when stepping across the length-5 coarsely-strided dimension shown on rows.
-%\lstinputlisting[language=CFA, firstline=120, lastline=126]{hello-md.cfa}
+%\lstinput{120-126}{hello-md.cfa}
 The memory layout of @a@ has strictly increasing numbers along its 35 contiguous positions.
 
@@ -185,6 +185,6 @@
 Like with the C array, a lesser-dimensional array reference can be bound to the result of subscripting a greater-dimensional array, by a prefix of its dimensions.
 This action first subscripts away the most coarsely strided dimensions, leaving a result that expects to be be subscripted by the more finely strided dimensions.
-\lstinputlisting[language=CFA, firstline=60, lastline=66]{hello-md.cfa}
-\lstinputlisting[aboveskip=0pt, language=CFA, firstline=140, lastline=140]{hello-md.cfa}
+\lstinput{60-66}{hello-md.cfa}
+\lstinput[aboveskip=0pt]{140-140}{hello-md.cfa}
 
 This function declaration is asserting too much knowledge about its parameter @c@, for it to be usable for printing either a row slice or a column slice.
@@ -194,11 +194,11 @@
 The new-array library provides the trait @ix@, so-defined.
 With it, the original declaration can be generalized, while still implemented with the same body, to the latter declaration:
-\lstinputlisting[language=CFA, firstline=40, lastline=44]{hello-md.cfa}
-\lstinputlisting[aboveskip=0pt, language=CFA, firstline=145, lastline=145]{hello-md.cfa}
+\lstinput{40-44}{hello-md.cfa}
+\lstinput[aboveskip=0pt]{145-145}{hello-md.cfa}
 
 Nontrivial slicing, in this example, means passing a noncontiguous slice to @print1d@.
 The new-array library provides a ``subscript by all'' operation for this purpose.
 In a multi-dimensional subscript operation, any dimension given as @all@ is left ``not yet subscripted by a value,'' implementing the @ix@ trait, waiting for such a value.
-\lstinputlisting[language=CFA, firstline=150, lastline=151]{hello-md.cfa}
+\lstinput{150-151}{hello-md.cfa}
 
 The example has shown that @a[2]@ and @a[[2, all]]@ both refer to the same, ``2.*'' slice.
Index: doc/theses/mike_brooks_MMath/background.tex
===================================================================
--- doc/theses/mike_brooks_MMath/background.tex	(revision 266732e2818527a06669f666f04fb32c296a3b9f)
+++ doc/theses/mike_brooks_MMath/background.tex	(revision b64d0f4af1fe5b3c45967f89591e4e709fe89116)
@@ -503,4 +503,11 @@
 \subsection{The pointer-to-array type has been noticed before}
 
+\subsection{Multi-Dimensional}
+
+As in the last section, we inspect the declaration ...
+\lstinput{16-18}{bkgd-carray-mdim.c}
+The significant axis of deriving expressions from @a@ is now ``itself,'' ``first element'' or ``first grand-element (meaning, first element of first element).''
+\lstinput{20-44}{bkgd-carray-mdim.c}
+
 
 \section{\CFA}
Index: doc/theses/mike_brooks_MMath/conclusion.tex
===================================================================
--- doc/theses/mike_brooks_MMath/conclusion.tex	(revision 266732e2818527a06669f666f04fb32c296a3b9f)
+++ doc/theses/mike_brooks_MMath/conclusion.tex	(revision b64d0f4af1fe5b3c45967f89591e4e709fe89116)
@@ -1,3 +1,5 @@
 \chapter{Conclusion}
+
+\section{Lists}
 
 \section{Arrays}
Index: doc/theses/mike_brooks_MMath/list.tex
===================================================================
--- doc/theses/mike_brooks_MMath/list.tex	(revision 266732e2818527a06669f666f04fb32c296a3b9f)
+++ doc/theses/mike_brooks_MMath/list.tex	(revision b64d0f4af1fe5b3c45967f89591e4e709fe89116)
@@ -64,7 +64,8 @@
 \begin{comment}
 \begin{figure}
-    \begin{tabularx}{\textwidth}{Y|Y|Y}\lstinputlisting[language=C  , firstline=20, lastline=39]{lst-issues-intrusive.run.c}
-        &\lstinputlisting[language=C++, firstline=20, lastline=39]{lst-issues-wrapped-byref.run.cpp}
-        &\lstinputlisting[language=C++, firstline=20, lastline=39]{lst-issues-wrapped-emplaced.run.cpp}
+    \begin{tabularx}{\textwidth}{Y|Y|Y}
+		\lstinput[language=C]{20-39}{lst-issues-intrusive.run.c}
+        &\lstinputlisting[language=C++]{20-39}{lst-issues-wrapped-byref.run.cpp}
+        &\lstinputlisting[language=C++]{20-39}{lst-issues-wrapped-emplaced.run.cpp}
       \\ & &
       \\
@@ -100,5 +101,5 @@
 \begin{lrbox}{\myboxA}
 \begin{tabular}{@{}l@{}}
-\lstinputlisting[language=C, firstline=20, lastline=39]{lst-issues-intrusive.run.c} \\
+\lstinput[language=C]{20-39}{lst-issues-intrusive.run.c} \\
 \ \\
 \includegraphics[page=1]{lst-issues-attach.pdf}
@@ -108,5 +109,5 @@
 \begin{lrbox}{\myboxB}
 \begin{tabular}{@{}l@{}}
-\lstinputlisting[language=C++, firstline=20, lastline=39]{lst-issues-wrapped-byref.run.cpp} \\
+\lstinput[language=C++]{20-39}{lst-issues-wrapped-byref.run.cpp} \\
 \ \\
 \includegraphics[page=2]{lst-issues-attach.pdf}
@@ -116,5 +117,5 @@
 \begin{lrbox}{\myboxC}
 \begin{tabular}{@{}l@{}}
-\lstinputlisting[language=C++, firstline=20, lastline=39]{lst-issues-wrapped-emplaced.run.cpp} \\
+\lstinput[language=C++]{20-39}{lst-issues-wrapped-emplaced.run.cpp} \\
 \ \\
 \includegraphics[page=3]{lst-issues-attach.pdf}
@@ -180,6 +181,6 @@
 
 \begin{figure}
-    \lstinputlisting[language=C++, firstline=100, lastline=117]{lst-issues-attach-reduction.hpp}
-    \lstinputlisting[language=C++, firstline=150, lastline=150]{lst-issues-attach-reduction.hpp}
+    \lstinput[language=C++]{100-117}{lst-issues-attach-reduction.hpp}
+    \lstinput[language=C++]{150-150}{lst-issues-attach-reduction.hpp}
     \caption{
         Reduction of wrapped attachment to intrusive attachment.
@@ -228,5 +229,5 @@
 \begin{figure}
     \parbox[t]{3.5in} {
-        \lstinputlisting[language=C++, firstline=20, lastline=60]{lst-issues-multi-static.run.c}
+        \lstinput[language=C++]{20-60}{lst-issues-multi-static.run.c}
     }\parbox[t]{20in} {
         ~\\
@@ -353,5 +354,5 @@
 
 \begin{figure}
-    \lstinputlisting[language=CFA, firstline=20, lastline=32]{lst-features-intro.run.cfa}
+    \lstinput{20-32}{lst-features-intro.run.cfa}
     \caption[Multiple link directions in \CFA list library]{
         Demonstration of the running \lstinline{req} example, done using the \CFA list library.
@@ -365,9 +366,9 @@
 \begin{tabular}{@{}ll@{}}
 \begin{tabular}{@{}l@{}}
-    \lstinputlisting[language=CFA, firstline=20, lastline=25]{lst-features-multidir.run.cfa} \\
-    \lstinputlisting[language=CFA, firstline=40, lastline=67]{lst-features-multidir.run.cfa}
+    \lstinput{20-25}{lst-features-multidir.run.cfa} \\
+    \lstinput{40-67}{lst-features-multidir.run.cfa}
     \end{tabular}
 	&
-        \lstinputlisting[language=C++, firstline=20, lastline=60]{lst-issues-multi-static.run.c}
+        \lstinput[language=C++]{20-60}{lst-issues-multi-static.run.c}
 	\end{tabular}
 
Index: doc/theses/mike_brooks_MMath/uw-ethesis.tex
===================================================================
--- doc/theses/mike_brooks_MMath/uw-ethesis.tex	(revision 266732e2818527a06669f666f04fb32c296a3b9f)
+++ doc/theses/mike_brooks_MMath/uw-ethesis.tex	(revision b64d0f4af1fe5b3c45967f89591e4e709fe89116)
@@ -96,5 +96,5 @@
 
 \makeatletter
-\newcommand{\lstinput}[2]{\lstinputlisting[linerange={#1},xleftmargin=4pt,escapechar={\$},moredelim={**[is][\color{red}]{@}{@}}]{#2}}
+\newcommand{\lstinput}[3][]{\lstinputlisting[#1,linerange={#2},xleftmargin=4pt,escapechar={\$},moredelim={**[is][\color{red}]{@}{@}}]{#3}}
 \makeatother
 % cfa macros used in the document
