Index: doc/LaTeXmacros/common.tex
===================================================================
--- doc/LaTeXmacros/common.tex	(revision 540de412b77591cc4fdbb16932060ef6229a3f1d)
+++ doc/LaTeXmacros/common.tex	(revision fbfde8435d0e43f43b9de0e5a9cd67aa994139a5)
@@ -11,6 +11,6 @@
 %% Created On       : Sat Apr  9 10:06:17 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Sat Apr  9 10:06:39 2016
-%% Update Count     : 1
+%% Last Modified On : Sat Apr 30 13:52:12 2016
+%% Update Count     : 41
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -19,6 +19,6 @@
 % Names used in the document.
 
-\newcommand{\CFA}{C$\mathbf\forall$\xspace}				% set language symbolic name
-\newcommand{\CFL}{Cforall\xspace}						% set language text name
+\newcommand{\CFA}{C$\mathbf\forall$\xspace}              % set language symbolic name
+\newcommand{\CFL}{Cforall\xspace}                        % set language text name
 \newcommand{\CC}{C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name
 \def\c11{ISO/IEC C} % C11 name (cannot have numbers in latex command name)
@@ -43,5 +43,5 @@
    \belowdisplayskip \abovedisplayskip
 }
-\usepackage{relsize}									% must be after change to small or selects old size
+\usepackage{relsize}                                    % must be after change to small or selects old size
 
 % reduce size of chapter/section titles
@@ -66,6 +66,6 @@
     \vskip 50\p@
   }}
-\renewcommand\section{\@startsection{section}{1}{\z@}{-3.0ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\large\bfseries}}
-\renewcommand\subsection{\@startsection{subsection}{2}{\z@}{-2.5ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
+\renewcommand\section{\@startsection{section}{1}{\z@}{-3.5ex \@plus -1ex \@minus -.2ex}{2.3ex \@plus .2ex}{\normalfont\large\bfseries}}
+\renewcommand\subsection{\@startsection{subsection}{2}{\z@}{-3.25ex \@plus -1ex \@minus -.2ex}{1.5ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
 \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}{-2.5ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
 \renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}{-2.0ex \@plus -1ex \@minus -.2ex}{-1em}{\normalfont\normalsize\bfseries}}
@@ -109,4 +109,7 @@
 \newcommand{\@sIndex}[2][\@empty]{#2\ifx#1\@empty\index{#2}\else\index{#1@{\protect#2}}\fi}
 
+\newcommand{\Indexc}[1]{\lstinline$#1$\index{#1@\lstinline$#1$}}
+\newcommand{\indexc}[1]{\index{#1@\lstinline$#1$}}
+
 \newcommand{\newtermFontInline}{\emph}
 \newcommand{\newterm}{\@ifstar\@snewterm\@newterm}
@@ -179,5 +182,4 @@
 		fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,otype,restrict,_Static_assert,
 		_Thread_local,throw,throwResume,trait,try,typeof,__typeof,__typeof__,},
-	moredelim=**[is][\color{red}]{`}{`}, % red highlighting of program text
 }%
 
@@ -186,14 +188,19 @@
 columns=flexible,
 basicstyle=\sf\relsize{-1},
+stringstyle=\tt,
 tabsize=4,
 xleftmargin=\parindent,
-escapechar=@,
+extendedchars=true,
+escapechar=§,
 mathescape=true,
 keepspaces=true,
 showstringspaces=false,
 showlines=true,
-aboveskip=6pt,
-belowskip=4pt,
-literate={\\`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}1, % escape \`, otherwise used for red highlighting
+aboveskip=4pt,
+belowskip=2pt,
+moredelim=**[is][\color{red}]{®}{®}, % red highlighting
+moredelim=**[is][\color{blue}]{©}{©}, % blue highlighting
+moredelim=[is][\lstset{keywords={}}]{¶}{¶}, % temporarily turn off keywords
+% literate={\\`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}1, % escape \`, otherwise used for red highlighting
 }%
 
@@ -203,7 +210,7 @@
 \lst@ProcessOther{"22}{\lst@ttfamily{"}{\raisebox{0.3ex}{\ttfamily\upshape "}}} % replace double quote
 \lst@ProcessOther{"27}{\lst@ttfamily{'}{\raisebox{0.3ex}{\ttfamily\upshape '\hspace*{-2pt}}}} % replace single quote
-\lst@ProcessOther{"2D}{\lst@ttfamily{-}{\ttfamily\upshape -}} % replace minus
-\lst@ProcessOther{"3C}{\lst@ttfamily{<}{\texttt{<}}} % replace less than
-\lst@ProcessOther{"3E}{\lst@ttfamily{<}{\texttt{>}}} % replace greater than
+\lst@ProcessOther{"2D}{\lst@ttfamily{-}{\textbf{\texttt{-}}}} % replace minus
+\lst@ProcessOther{"3C}{\lst@ttfamily{<}{\textbf{\texttt{<}}}} % replace less than
+\lst@ProcessOther{"3E}{\lst@ttfamily{>}{\textbf{\texttt{>}}}} % replace greater than
 \lst@ProcessOther{"5E}{\raisebox{0.4ex}{$\scriptstyle\land\,$}} % replace circumflex
 \lst@ProcessOther{"5F}{\lst@ttfamily{\char95}{{\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}}} % replace underscore
Index: doc/refrat/refrat.tex
===================================================================
--- doc/refrat/refrat.tex	(revision 540de412b77591cc4fdbb16932060ef6229a3f1d)
+++ doc/refrat/refrat.tex	(revision fbfde8435d0e43f43b9de0e5a9cd67aa994139a5)
@@ -11,9 +11,15 @@
 %% Created On       : Wed Apr  6 14:52:25 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Sat Apr  9 10:19:12 2016
-%% Update Count     : 8
+%% Last Modified On : Sat Apr 30 13:45:40 2016
+%% Update Count     : 29
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 % requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended
+
+% red highlighting ®...® (registered trademark sumbol)
+% blue highlighting ©...© (copyright symbol)
+% latex escape §...§ (section symbol)
+% keyword escape ¶...¶ (pilcrow symbol)
+% math escape $...$ (dollar symbol)
 
 \documentclass[openright,twoside]{report}
@@ -125,9 +131,9 @@
 \CFA's scope rules differ from C's in one major respect: a declaration of an identifier may overload\index{overloading} outer declarations of lexically identical identifiers in the same
 \Index{name space}, instead of hiding them.
-The outer declaration is hidden if the two declarations have \Index{compatible type}, or if one declares an array type and the other declares a pointer type and the element type and pointed-at type are compatible, or if one has function type and the other is a pointer to a compatible function type, or if one declaration is a \lstinline$type$\use{type} or
-\lstinline$typedef$\use{typedef} declaration and the other is not.  The outer declaration becomes
+The outer declaration is hidden if the two declarations have \Index{compatible type}, or if one declares an array type and the other declares a pointer type and the element type and pointed-at type are compatible, or if one has function type and the other is a pointer to a compatible function type, or if one declaration is a \lstinline@type@\use{type} or
+\lstinline@typedef@\use{typedef} declaration and the other is not.  The outer declaration becomes
 \Index{visible} when the scope of the inner declaration terminates.
 \begin{rationale}
-Hence, a \CFA program can declare an \lstinline$int v$ and a \lstinline$float v$ in the same scope;
+Hence, a \CFA program can declare an \lstinline@int v@ and a \lstinline@float v@ in the same scope;
 a {\CC} program can not.
 \end{rationale}
@@ -143,5 +149,5 @@
 Identifiers with \Index{no linkage} always denote unique entities.
 \begin{rationale}
-A \CFA program can declare an \lstinline$extern int v$ and an \lstinline$extern float v$;
+A \CFA program can declare an \lstinline@extern int v@ and an \lstinline@extern float v@;
 a C program cannot.
 \end{rationale}
@@ -166,5 +172,5 @@
 \end{lstlisting}
 
-The type parameters in an instantiation of a generic type must satisfy any constraints in the forall specifier on the type generator declaration, e.g., \lstinline$sumable$.
+The type parameters in an instantiation of a generic type must satisfy any constraints in the forall specifier on the type generator declaration, e.g., \lstinline@sumable@.
 The instantiation then has the semantics that would result if the type parameters were substituted into the type generator declaration by macro substitution.
 
@@ -227,6 +233,6 @@
 In \CFA, these conversions play a role in overload resolution, and collectively are called the \define{safe arithmetic conversion}s.
 
-Let \(int_r\) and \(unsigned_r\) be the signed and unsigned integer types with integer conversion rank\index{integer conversion rank}\index{rank|see{integer conversion rank}} $r$.
-Let \(unsigned_{mr}\) be the unsigned integer type with maximal rank.
+Let \lstinline@int$_r$@ and \lstinline@unsigned$_r$@ be the signed and unsigned integer types with integer conversion rank\index{integer conversion rank}\index{rank|see{integer conversion rank}} $r$.
+Let \lstinline@unsigned$_{mr}$@ be the unsigned integer type with maximal rank.
 
 The following conversions are \emph{direct} safe arithmetic conversions.
@@ -235,22 +241,22 @@
 The \Index{integer promotion}s.
 \item
-For every rank $r$ greater than or equal to the rank of \lstinline$int$, conversion from \(int_r\) to \(unsigned_r\).
-\item
-For every rank $r$ greater than or equal to the rank of \lstinline$int$, where \(int_{r+1}\) exists and can represent all values of \(unsigned_r\), conversion from \(unsigned_r\) to \(int_{r+1}\).
-\item
-Conversion from \(unsigned_{mr}\) to \lstinline$float$.
+For every rank $r$ greater than or equal to the rank of \lstinline@int@, conversion from \lstinline@int$_r$@ to \lstinline@unsigned$_r$@.
+\item
+For every rank $r$ greater than or equal to the rank of \lstinline@int@, where \lstinline@int$_{r+1}$@ exists and can represent all values of \lstinline@unsigned$_r$@, conversion from \lstinline@unsigned$_r$@ to \lstinline@int$_{r+1}$@.
+\item
+Conversion from \lstinline@unsigned$_{mr}$@ to \lstinline@float@.
 \item
 Conversion from an enumerated type to its compatible integer type.
 \item
-Conversion from \lstinline$float$ to \lstinline$double$, and from \lstinline$double$ to \lstinline$long double$.
-\item
-Conversion from \lstinline$float _Complex$ to \lstinline$double _Complex$, and from \lstinline$double _Complex$ to \lstinline$long double _Complex$.
+Conversion from \lstinline@float@ to \lstinline@double@, and from \lstinline@double@ to \lstinline@long double@.
+\item
+Conversion from \lstinline@float _Complex@ to \lstinline@double _Complex@, and from \lstinline@double _Complex@ to \lstinline@long double _Complex@.
 \begin{sloppypar}
 \item
-Conversion from \lstinline$float _Imaginary$ to \lstinline$double _Imaginary$, and from \lstinline$double _Imaginary$ to \lstinline$long double$ \lstinline$_Imaginary$, if the implementation supports imaginary types.
+Conversion from \lstinline@float _Imaginary@ to \lstinline@double _Imaginary@, and from \lstinline@double _Imaginary@ to \lstinline@long double _Imaginary@, if the implementation supports imaginary types.
 \end{sloppypar}
 \end{itemize}
 
-If type \lstinline$T$ can be converted to type \lstinline$U$ by a safe direct arithmetic conversion and type \lstinline$U$ can be converted to type \lstinline$V$ by a safe arithmetic conversion, then the conversion from \lstinline$T$ to type \lstinline$V$ is an \emph{indirect} safe arithmetic conversion.
+If type \lstinline@T@ can be converted to type \lstinline@U@ by a safe direct arithmetic conversion and type \lstinline@U@ can be converted to type \lstinline@V@ by a safe arithmetic conversion, then the conversion from \lstinline@T@ to type \lstinline@V@ is an \emph{indirect} safe arithmetic conversion.
 
 \begin{rationale}
@@ -275,5 +281,5 @@
 	int x, y;
 };
-void move_by( struct point * p1, struct point * p2 ) {@\impl{move_by}@
+void move_by( struct point * p1, struct point * p2 ) {§\impl{move_by}§
 	p1->x += p2.x;
 	p1->y += p2.y;
@@ -285,6 +291,6 @@
 move_to( &cp1, &cp2 );
 \end{lstlisting}
-Thanks to implicit conversion, the two arguments that \lstinline$move_by()$ receives are pointers to
-\lstinline$cp1$'s second member and \lstinline$cp2$'s second member.
+Thanks to implicit conversion, the two arguments that \lstinline@move_by()@ receives are pointers to
+\lstinline@cp1@'s second member and \lstinline@cp2@'s second member.
 
 
@@ -328,7 +334,7 @@
 a direct safe arithmetic conversion;
 \item
-from any object type or incomplete type to \lstinline$void$;
-\item
-from a pointer to any non-\lstinline$void$ type to a pointer to \lstinline$void$;
+from any object type or incomplete type to \lstinline@void@;
+\item
+from a pointer to any non-\lstinline@void@ type to a pointer to \lstinline@void@;
 \item
 from a pointer to any type to a pointer to a more qualified version of the type\index{qualified type};
@@ -341,5 +347,5 @@
 Conversions that are not safe conversions are \define{unsafe conversion}s.
 \begin{rationale}
-As in C, there is an implicit conversion from \lstinline$void *$ to any pointer type.
+As in C, there is an implicit conversion from \lstinline@void *@ to any pointer type.
 This is clearly dangerous, and {\CC} does not have this implicit conversion.
 \CFA\index{deficiencies!void * conversion} keeps it, in the interest of remaining as pure a superset of C as possible, but discourages it by making it unsafe.
@@ -367,14 +373,14 @@
 \begin{itemize}
 \item
-The cost of an implicit conversion from \lstinline$int$ to \lstinline$long$ is 1.
-The cost of an implicit conversion from \lstinline$long$ to \lstinline$double$ is 3, because it is defined in terms of conversions from \lstinline$long$ to \lstinline$unsigned long$, then to \lstinline$float$, and then to \lstinline$double$.
-
-\item
-If \lstinline$int$ can represent all the values of \lstinline$unsigned short$, then the cost of an implicit conversion from \lstinline$unsigned short$ to \lstinline$unsigned$ is 2:
-\lstinline$unsigned short$ to \lstinline$int$ to \lstinline$unsigned$.
-Otherwise, \lstinline$unsigned short$ is converted directly to \lstinline$unsigned$, and the cost is 1.
-
-\item
-If \lstinline$long$ can represent all the values of \lstinline$unsigned$, then the conversion cost of \lstinline$unsigned$ to \lstinline$long$ is 1.
+The cost of an implicit conversion from \lstinline@int@ to \lstinline@long@ is 1.
+The cost of an implicit conversion from \lstinline@long@ to \lstinline@double@ is 3, because it is defined in terms of conversions from \lstinline@long@ to \lstinline@unsigned long@, then to \lstinline@float@, and then to \lstinline@double@.
+
+\item
+If \lstinline@int@ can represent all the values of \lstinline@unsigned short@, then the cost of an implicit conversion from \lstinline@unsigned short@ to \lstinline@unsigned@ is 2:
+\lstinline@unsigned short@ to \lstinline@int@ to \lstinline@unsigned@.
+Otherwise, \lstinline@unsigned short@ is converted directly to \lstinline@unsigned@, and the cost is 1.
+
+\item
+If \lstinline@long@ can represent all the values of \lstinline@unsigned@, then the conversion cost of \lstinline@unsigned@ to \lstinline@long@ is 1.
 Otherwise, the conversion is an unsafe conversion, and its conversion cost is undefined.
 \end{itemize}
@@ -384,10 +390,10 @@
 \begin{syntax}
 \oldlhs{keyword}
-	\rhs \lstinline$forall$
-	\rhs \lstinline$lvalue$
-	\rhs \lstinline$trait$
-	\rhs \lstinline$dtype$
-	\rhs \lstinline$ftype$
-	\rhs \lstinline$type$
+	\rhs \lstinline@forall@
+	\rhs \lstinline@lvalue@
+	\rhs \lstinline@trait@
+	\rhs \lstinline@dtype@
+	\rhs \lstinline@ftype@
+	\rhs \lstinline@otype@
 \end{syntax}
 
@@ -396,5 +402,5 @@
 
 \CFA allows operator \Index{overloading} by associating operators with special function identifiers.
-Furthermore, the constants ``\lstinline$0$'' and ``\lstinline$1$'' have special status for many of C's data types (and for many programmer-defined data types as well), so \CFA treats them as overloadable identifiers.
+Furthermore, the constants ``\lstinline@0@'' and ``\lstinline@1@'' have special status for many of C's data types (and for many programmer-defined data types as well), so \CFA treats them as overloadable identifiers.
 Programmers can use these identifiers to declare functions and objects that implement operators and constants for their own types.
 
@@ -405,22 +411,22 @@
 \begin{syntax}
 \oldlhs{identifier}
-\rhs \lstinline$0$
-\rhs \lstinline$1$
+\rhs \lstinline@0@
+\rhs \lstinline@1@
 \end{syntax}
 
-\index{constant identifiers}\index{identifiers!for constants} The tokens ``\lstinline$0$''\impl{0} and ``\lstinline$1$''\impl{1} are identifiers.
+\index{constant identifiers}\index{identifiers!for constants} The tokens ``\lstinline@0@''\impl{0} and ``\lstinline@1@''\impl{1} are identifiers.
 No other tokens defined by the rules for integer constants are considered to be identifiers.
 \begin{rationale}
-Why ``\lstinline$0$'' and ``\lstinline$1$''? Those integers have special status in C.
+Why ``\lstinline@0@'' and ``\lstinline@1@''? Those integers have special status in C.
 All scalar types can be incremented and decremented, which is defined in terms of adding or subtracting 1.
-The operations ``\lstinline$&&$'', ``\lstinline$||$'', and ``\lstinline$!$'' can be applied to any scalar arguments, and are defined in terms of comparison against 0.
+The operations ``\lstinline@&&@'', ``\lstinline@||@'', and ``\lstinline@!@'' can be applied to any scalar arguments, and are defined in terms of comparison against 0.
 A \nonterm{constant-expression} that evaluates to 0 is effectively compatible with every pointer type.
 
 In C, the integer constants 0 and 1 suffice because the integer promotion rules can convert them to any arithmetic type, and the rules for pointer expressions treat constant expressions evaluating to 0 as a special case.
 However, user-defined arithmetic types often need the equivalent of a 1 or 0 for their functions or operators, polymorphic functions often need 0 and 1 constants of a type matching their polymorphic parameters, and user-defined pointer-like types may need a null value.
-Defining special constants for a user-defined type is more efficient than defining a conversion to the type from \lstinline$_Bool$.
-
-Why \emph{just} ``\lstinline$0$'' and ``\lstinline$1$''? Why not other integers? No other integers have special status in C.
-A facility that let programmers declare specific constants---``\lstinline$const Rational 12$'', for instance---would not be much of an improvement.
+Defining special constants for a user-defined type is more efficient than defining a conversion to the type from \lstinline@_Bool@.
+
+Why \emph{just} ``\lstinline@0@'' and ``\lstinline@1@''? Why not other integers? No other integers have special status in C.
+A facility that let programmers declare specific constants---``\lstinline@const Rational 12@'', for instance---would not be much of an improvement.
 Some facility for defining the creation of values of programmer-defined types from arbitrary integer tokens would be needed.
 The complexity of such a feature doesn't seem worth the gain.
@@ -438,48 +444,48 @@
 \begin{tabular}[t]{ll}
 %identifier & operation \\ \hline
-\lstinline$?[?]$ & subscripting \impl{?[?]}\\
-\lstinline$?()$ & function call \impl{?()}\\
-\lstinline$?++$ & postfix increment \impl{?++}\\
-\lstinline$?--$ & postfix decrement \impl{?--}\\
-\lstinline$++?$ & prefix increment \impl{++?}\\
-\lstinline$--?$ & prefix decrement \impl{--?}\\
-\lstinline$*?$ & dereference \impl{*?}\\
-\lstinline$+?$ & unary plus \impl{+?}\\
-\lstinline$-?$ & arithmetic negation \impl{-?}\\
-\lstinline$~?$ & bitwise negation \impl{~?}\\
-\lstinline$!?$ & logical complement \impl{"!?}\\
-\lstinline$?*?$ & multiplication \impl{?*?}\\
-\lstinline$?/?$ & division \impl{?/?}\\
+\lstinline@?[?]@ & subscripting \impl{?[?]}\\
+\lstinline@?()@ & function call \impl{?()}\\
+\lstinline@?++@ & postfix increment \impl{?++}\\
+\lstinline@?--@ & postfix decrement \impl{?--}\\
+\lstinline@++?@ & prefix increment \impl{++?}\\
+\lstinline@--?@ & prefix decrement \impl{--?}\\
+\lstinline@*?@ & dereference \impl{*?}\\
+\lstinline@+?@ & unary plus \impl{+?}\\
+\lstinline@-?@ & arithmetic negation \impl{-?}\\
+\lstinline@~?@ & bitwise negation \impl{~?}\\
+\lstinline@!?@ & logical complement \impl{"!?}\\
+\lstinline@?*?@ & multiplication \impl{?*?}\\
+\lstinline@?/?@ & division \impl{?/?}\\
 \end{tabular}\hfil
 \begin{tabular}[t]{ll}
 %identifier & operation \\ \hline
-\lstinline$?%?$ & remainder \impl{?%?}\\
-\lstinline$?+?$ & addition \impl{?+?}\\
-\lstinline$?-?$ & subtraction \impl{?-?}\\
-\lstinline$?<<?$ & left shift \impl{?<<?}\\
-\lstinline$?>>?$ & right shift \impl{?>>?}\\
-\lstinline$?<?$ & less than \impl{?<?}\\
-\lstinline$?<=?$ & less than or equal \impl{?<=?}\\
-\lstinline$?>=?$ & greater than or equal \impl{?>=?}\\
-\lstinline$?>?$ & greater than \impl{?>?}\\
-\lstinline$?==?$ & equality \impl{?==?}\\
-\lstinline$?!=?$ & inequality \impl{?"!=?}\\
-\lstinline$?&?$ & bitwise AND \impl{?&?}\\
+\lstinline@?%?@ & remainder \impl{?%?}\\
+\lstinline@?+?@ & addition \impl{?+?}\\
+\lstinline@?-?@ & subtraction \impl{?-?}\\
+\lstinline@?<<?@ & left shift \impl{?<<?}\\
+\lstinline@?>>?@ & right shift \impl{?>>?}\\
+\lstinline@?<?@ & less than \impl{?<?}\\
+\lstinline@?<=?@ & less than or equal \impl{?<=?}\\
+\lstinline@?>=?@ & greater than or equal \impl{?>=?}\\
+\lstinline@?>?@ & greater than \impl{?>?}\\
+\lstinline@?==?@ & equality \impl{?==?}\\
+\lstinline@?!=?@ & inequality \impl{?"!=?}\\
+\lstinline@?&?@ & bitwise AND \impl{?&?}\\
 \end{tabular}\hfil
 \begin{tabular}[t]{ll}
 %identifier & operation \\ \hline
-\lstinline$?^?$ & exclusive OR \impl{?^?}\\
-\lstinline$?|?$ & inclusive OR \impl{?"|?}\\
-\lstinline$?=?$ & simple assignment \impl{?=?}\\
-\lstinline$?*=?$ & multiplication assignment \impl{?*=?}\\
-\lstinline$?/=?$ & division assignment \impl{?/=?}\\
-\lstinline$?%=?$ & remainder assignment \impl{?%=?}\\
-\lstinline$?+=?$ & addition assignment \impl{?+=?}\\
-\lstinline$?-=?$ & subtraction assignment \impl{?-=?}\\
-\lstinline$?<<=?$ & left-shift assignment \impl{?<<=?}\\
-\lstinline$?>>=?$ & right-shift assignment \impl{?>>=?}\\
-\lstinline$?&=?$ & bitwise AND assignment \impl{?&=?}\\
-\lstinline$?^=?$ & exclusive OR assignment \impl{?^=?}\\
-\lstinline$?|=?$ & inclusive OR assignment \impl{?"|=?}\\
+\lstinline@?^?@ & exclusive OR \impl{?^?}\\
+\lstinline@?|?@ & inclusive OR \impl{?"|?}\\
+\lstinline@?=?@ & simple assignment \impl{?=?}\\
+\lstinline@?*=?@ & multiplication assignment \impl{?*=?}\\
+\lstinline@?/=?@ & division assignment \impl{?/=?}\\
+\lstinline@?%=?@ & remainder assignment \impl{?%=?}\\
+\lstinline@?+=?@ & addition assignment \impl{?+=?}\\
+\lstinline@?-=?@ & subtraction assignment \impl{?-=?}\\
+\lstinline@?<<=?@ & left-shift assignment \impl{?<<=?}\\
+\lstinline@?>>=?@ & right-shift assignment \impl{?>>=?}\\
+\lstinline@?&=?@ & bitwise AND assignment \impl{?&=?}\\
+\lstinline@?^=?@ & exclusive OR assignment \impl{?^=?}\\
+\lstinline@?|=?@ & inclusive OR assignment \impl{?"|=?}\\
 \end{tabular}
 \hfil
@@ -496,6 +502,6 @@
 
 \begin{rationale}
-The use of ``\lstinline$?$'' in identifiers means that some C programs are not \CFA programs.  For instance, the sequence of characters ``\lstinline$(i < 0)?--i:i$'' is legal in a C program, but a
-\CFA compiler detects a syntax error because it treats ``\lstinline$?--$'' as an identifier, not as the two tokens ``\lstinline$?$'' and ``\lstinline$--$''.
+The use of ``\lstinline@?@'' in identifiers means that some C programs are not \CFA programs.  For instance, the sequence of characters ``\lstinline@(i < 0)?--i:i@'' is legal in a C program, but a
+\CFA compiler detects a syntax error because it treats ``\lstinline@?--@'' as an identifier, not as the two tokens ``\lstinline@?@'' and ``\lstinline@--@''.
 \end{rationale}
 
@@ -504,8 +510,8 @@
 \begin{itemize}
 \item
-The logical operators ``\lstinline$&&$'' and ``\lstinline$||$'', and the conditional operator
-``\lstinline$?:$''.
+The logical operators ``\lstinline@&&@'' and ``\lstinline@||@'', and the conditional operator
+``\lstinline@?:@''.
 These operators do not always evaluate their operands, and hence can not be properly defined by functions unless some mechanism like call-by-name is added to the language.
-Note that the definitions of ``\lstinline$&&$'' and ``\lstinline$||$'' say that they work by checking that their arguments are unequal to 0, so defining ``\lstinline$!=$'' and ``\lstinline$0$'' for user-defined types is enough to allow them to be used in logical expressions.
+Note that the definitions of ``\lstinline@&&@'' and ``\lstinline@||@'' say that they work by checking that their arguments are unequal to 0, so defining ``\lstinline@!=@'' and ``\lstinline@0@'' for user-defined types is enough to allow them to be used in logical expressions.
 
 \item
@@ -516,24 +522,24 @@
 \item
 The ``address of'' operator.
-It would seem useful to define a unary ``\lstinline$&$'' operator that returns values of some programmer-defined pointer-like type.
+It would seem useful to define a unary ``\lstinline@&@'' operator that returns values of some programmer-defined pointer-like type.
 The problem lies with the type of the operator.
-Consider the expression ``\lstinline$p = &x$'', where \lstinline$x$ is of type
-\lstinline$T$ and \lstinline$p$ has the programmer-defined type \lstinline$T_ptr$.
-The expression might be treated as a call to the unary function ``\lstinline$&?$''.
-Now what is the type of the function's parameter? It can not be \lstinline$T$, because then \lstinline$x$ would be passed by value, and there is no way to create a useful pointer-like result from a value.
-Hence the parameter must have type \lstinline$T *$.
-But then the expression must be rewritten as ``\lstinline$p = &?( &x )$''
+Consider the expression ``\lstinline@p = &x@'', where \lstinline@x@ is of type
+\lstinline@T@ and \lstinline@p@ has the programmer-defined type \lstinline@T_ptr@.
+The expression might be treated as a call to the unary function ``\lstinline@&?@''.
+Now what is the type of the function's parameter? It can not be \lstinline@T@, because then \lstinline@x@ would be passed by value, and there is no way to create a useful pointer-like result from a value.
+Hence the parameter must have type \lstinline@T *@.
+But then the expression must be rewritten as ``\lstinline@p = &?( &x )@''
 ---which doesn't seem like progress!
 
 The rule for address-of expressions would have to be something like ``keep applying address-of functions until you get one that takes a pointer argument, then use the built-in operator and stop''.
-It seems simpler to define a conversion function from \lstinline$T *$ to \lstinline$T_ptr$.
-
-\item
-The \lstinline$sizeof$ operator.
+It seems simpler to define a conversion function from \lstinline@T *@ to \lstinline@T_ptr@.
+
+\item
+The \lstinline@sizeof@ operator.
 It is already defined for every object type, and intimately tied into the language's storage allocation model.
 Redefining it seems pointless.
 
 \item
-The ``member of'' operators ``\lstinline$.$'' and ``\lstinline$->$''.
+The ``member of'' operators ``\lstinline@.@'' and ``\lstinline@->@''.
 These are not really infix operators, since their right ``operand'' is not a value or object.
 
@@ -572,10 +578,10 @@
 The ``fewest unsafe conversions'' rule ensures that the usual conversions are done, if possible.
 The ``lowest total expression cost'' rule chooses the proper common type.
-The odd-looking ``highest argument conversion cost'' rule ensures that, when unary expressions must be converted, conversions of function results are preferred to conversion of function arguments: \lstinline$(double)-i$ will be preferred to \lstinline$-(double)i$.
+The odd-looking ``highest argument conversion cost'' rule ensures that, when unary expressions must be converted, conversions of function results are preferred to conversion of function arguments: \lstinline@(double)-i@ will be preferred to \lstinline@-(double)i@.
 
 The ``least polymorphic'' rule reduces the number of polymorphic function calls, since such functions are presumably more expensive than monomorphic functions and since the more specific function is presumably more appropriate.
 It also gives preference to monomorphic values (such as the
-\lstinline$int$ \lstinline$0$) over polymorphic values (such as the \Index{null pointer}
-\lstinline$0$\use{0}).
+\lstinline@int@ \lstinline@0@) over polymorphic values (such as the \Index{null pointer}
+\lstinline@0@\use{0}).
 However, interpretations that call polymorphic functions are preferred to interpretations that perform unsafe conversions, because those conversions potentially lose accuracy or violate strong typing.
 
@@ -597,5 +603,5 @@
 \begin{rationale}
 Predefined functions and constants have internal linkage because that simplifies optimization in traditional compile-and-link environments.
-For instance, ``\lstinline$an_int + an_int$'' is equivalent to ``\lstinline$?+?(an_int, an_int)$''.
+For instance, ``\lstinline@an_int + an_int@'' is equivalent to ``\lstinline@?+?(an_int, an_int)@''.
 If integer addition has not been redefined in the current scope, a compiler can generate code to perform the addition directly.
 If predefined functions had external linkage, this optimization would be difficult.
@@ -623,5 +629,5 @@
 \rhs \nonterm{constant}
 \rhs \nonterm{string-literal}
-\rhs \lstinline$($ \nonterm{expression} \lstinline$)$
+\rhs \lstinline@(@ \nonterm{expression} \lstinline@)@
 \rhs \nonterm{generic-selection}
 \end{syntax}
@@ -629,6 +635,6 @@
 \predefined
 \begin{lstlisting}
-const int 1;@\use{1}@
-const int 0;@\use{0}@
+const int 1;§\use{1}§
+const int 0;§\use{0}§
 forall( dtype DT ) DT * const 0;
 forall( ftype FT ) FT * const 0;
@@ -639,13 +645,13 @@
 
 A \nonterm{constant} or \nonterm{string-literal} has one valid interpretation, which has the type and value defined by {\c11}.
-The predefined integer identifiers ``\lstinline$1$'' and ``\lstinline$0$'' have the integer values 1 and 0, respectively.
-The other two predefined ``\lstinline$0$'' identifiers are bound to polymorphic pointer values that, when specialized\index{specialization} with a data type or function type respectively, produce a null pointer of that type.
+The predefined integer identifiers ``\lstinline@1@'' and ``\lstinline@0@'' have the integer values 1 and 0, respectively.
+The other two predefined ``\lstinline@0@'' identifiers are bound to polymorphic pointer values that, when specialized\index{specialization} with a data type or function type respectively, produce a null pointer of that type.
 
 A parenthesised expression has the same interpretations as the contained \nonterm{expression}.
 
 \examples
-The expression \lstinline$(void *)0$\use{0} specializes the (polymorphic) null pointer to a null pointer to \lstinline$void$. \lstinline$(const void *)0$ does the same, and also uses a safe conversion from \lstinline$void *$ to \lstinline$const void *$.
+The expression \lstinline@(void *)0@\use{0} specializes the (polymorphic) null pointer to a null pointer to \lstinline@void@. \lstinline@(const void *)0@ does the same, and also uses a safe conversion from \lstinline@void *@ to \lstinline@const void *@.
 In each case, the null pointer conversion is better\index{best valid interpretations} than the unsafe conversion of the integer
-\lstinline$0$ to a pointer.
+\lstinline@0@ to a pointer.
 
 \begin{rationale}
@@ -653,8 +659,8 @@
 
 \CFA does not have C's concept of ``null pointer constants'', which are not typed values but special strings of tokens.
-The C token ``\lstinline$0$'' is an expression of type \lstinline$int$ with the value ``zero'', and it \emph{also} is a null pointer constant.
+The C token ``\lstinline@0@'' is an expression of type \lstinline@int@ with the value ``zero'', and it \emph{also} is a null pointer constant.
 Similarly,
-``\lstinline$(void *)0$ is an expression of type \lstinline$(void *)$ whose value is a null pointer, and it also is a null pointer constant.
-However, in C, ``\lstinline$(void *)(void *)0$'' is
+``\lstinline@(void *)0@ is an expression of type \lstinline@(void *)@ whose value is a null pointer, and it also is a null pointer constant.
+However, in C, ``\lstinline@(void *)(void *)0@'' is
 \emph{not} a null pointer constant, even though it is null-valued, a pointer, and constant! The semantics of C expressions contain many special cases to deal with subexpressions that are null pointer constants.
 
@@ -663,5 +669,5 @@
 \begin{lstlisting}
 forall( dtype DT ) DT * const 0;
-\end{lstlisting} means that \lstinline$0$ is a polymorphic object, and contains a value that can have \emph{any} pointer-to-object type or pointer-to-incomplete type.
+\end{lstlisting} means that \lstinline@0@ is a polymorphic object, and contains a value that can have \emph{any} pointer-to-object type or pointer-to-incomplete type.
 The only such value is the null pointer.
 Therefore the type \emph{alone} is enough to identify a null pointer.
@@ -673,5 +679,5 @@
 
 \constraints The best interpretation of the controlling expression shall be unambiguous\index{ambiguous interpretation}, and shall have type compatible with at most one of the types named in its generic association list.
-If a generic selection has no \lstinline$default$ generic association, the best interpretation of its controlling expression shall have type compatible with exactly one of the types named in its generic association list.
+If a generic selection has no \lstinline@default@ generic association, the best interpretation of its controlling expression shall have type compatible with exactly one of the types named in its generic association list.
 
 \semantics
@@ -684,16 +690,16 @@
 \lhs{postfix-expression}
 \rhs \nonterm{primary-expression}
-\rhs \nonterm{postfix-expression} \lstinline$[$ \nonterm{expression} \lstinline$]$
-\rhs \nonterm{postfix-expression} \lstinline$($ 
-	 \nonterm{argument-expression-list}\opt \lstinline$)$
-\rhs \nonterm{postfix-expression} \lstinline$.$ \nonterm{identifier}
-\rhs \nonterm{postfix-expression} \lstinline$->$ \nonterm{identifier}
-\rhs \nonterm{postfix-expression} \lstinline$++$
-\rhs \nonterm{postfix-expression} \lstinline$--$
-\rhs \lstinline$($ \nonterm{type-name} \lstinline$)$ \lstinline${$ \nonterm{initializer-list} \lstinline$}$
-\rhs \lstinline$($ \nonterm{type-name} \lstinline$)$ \lstinline${$ \nonterm{initializer-list} \lstinline$,$ \lstinline$}$
+\rhs \nonterm{postfix-expression} \lstinline@[@ \nonterm{expression} \lstinline@]@
+\rhs \nonterm{postfix-expression} \lstinline@(@ 
+	 \nonterm{argument-expression-list}\opt \lstinline@)@
+\rhs \nonterm{postfix-expression} \lstinline@.@ \nonterm{identifier}
+\rhs \nonterm{postfix-expression} \lstinline@->@ \nonterm{identifier}
+\rhs \nonterm{postfix-expression} \lstinline@++@
+\rhs \nonterm{postfix-expression} \lstinline@--@
+\rhs \lstinline@(@ \nonterm{type-name} \lstinline@)@ \lstinline@{@ \nonterm{initializer-list} \lstinline@}@
+\rhs \lstinline@(@ \nonterm{type-name} \lstinline@)@ \lstinline@{@ \nonterm{initializer-list} \lstinline@,@ \lstinline@}@
 \lhs{argument-expression-list}
 \rhs \nonterm{assignment-expression}
-\rhs \nonterm{argument-expression-list} \lstinline$,$
+\rhs \nonterm{argument-expression-list} \lstinline@,@
 	 \nonterm{assignment-expression}
 \end{syntax}
@@ -701,9 +707,9 @@
 \rewriterules
 \begin{lstlisting}
-a[b] @\rewrite@ ?[?]( b, a ) // if a has integer type@\use{?[?]}@
-a[b] @\rewrite@ ?[?]( a, b ) // otherwise
-a( @\emph{arguments}@ ) @\rewrite@ ?()( a, @\emph{arguments}@ )@\use{?()}@
-a++ @\rewrite@ ?++(&( a ))@\use{?++}@
-a-- @\rewrite@ ?--(&( a ))@\use{?--}@
+a[b] §\rewrite§ ?[?]( b, a ) // if a has integer type§\use{?[?]}§
+a[b] §\rewrite§ ?[?]( a, b ) // otherwise
+a( §\emph{arguments}§ ) §\rewrite§ ?()( a, §\emph{arguments}§ )§\use{?()}§
+a++ §\rewrite§ ?++(&( a ))§\use{?++}§
+a-- §\rewrite§ ?--(&( a ))§\use{?--}§
 \end{lstlisting}
 
@@ -713,5 +719,5 @@
 \predefined
 \begin{lstlisting}
-forall( otype T ) lvalue T ?[?]( T *, ptrdiff_t );@\use{ptrdiff_t}@
+forall( otype T ) lvalue T ?[?]( T *, ptrdiff_t );§\use{ptrdiff_t}§
 forall( otype T ) lvalue _Atomic T ?[?]( _Atomic T *, ptrdiff_t );
 forall( otype T ) lvalue const T ?[?]( const T *, ptrdiff_t );
@@ -733,11 +739,11 @@
 The interpretations of subscript expressions are the interpretations of the corresponding function call expressions.
 \begin{rationale}
-C defines subscripting as pointer arithmetic in a way that makes \lstinline$a[i]$ and
-\lstinline$i[a]$ equivalent. \CFA provides the equivalence through a rewrite rule to reduce the number of overloadings of \lstinline$?[?]$.
+C defines subscripting as pointer arithmetic in a way that makes \lstinline@a[i]@ and
+\lstinline@i[a]@ equivalent. \CFA provides the equivalence through a rewrite rule to reduce the number of overloadings of \lstinline@?[?]@.
 
 Subscript expressions are rewritten as function calls that pass the first parameter by value.
 This is somewhat unfortunate, since array-like types tend to be large.
-The alternative is to use the rewrite rule ``\lstinline$a[b]$ \rewrite \lstinline$?[?](&(a), b)$''.
-However, C semantics forbid this approach: the \lstinline$a$ in ``\lstinline$a[b]$'' can be an arbitrary pointer value, which does not have an address.
+The alternative is to use the rewrite rule ``\lstinline@a[b]@ \rewrite \lstinline@?[?](&(a), b)@''.
+However, C semantics forbid this approach: the \lstinline@a@ in ``\lstinline@a[b]@'' can be an arbitrary pointer value, which does not have an address.
 
 The repetitive form of the predefined identifiers shows up a deficiency\index{deficiencies!pointers
@@ -754,5 +760,5 @@
 \nonterm{postfix-expression} in a function call may have some interpretations that are function designators and some that are not.
 
-For those interpretations of the \nonterm{postfix-expression} that are not function designators, the expression is rewritten and becomes a call of a function named ``\lstinline$?()$''.
+For those interpretations of the \nonterm{postfix-expression} that are not function designators, the expression is rewritten and becomes a call of a function named ``\lstinline@?()@''.
 The valid interpretations of the rewritten expression are determined in the manner described below.
 
@@ -762,5 +768,5 @@
 \item if the argument corresponds to a parameter in the function designator's prototype, the argument interpretation must have the same type as the corresponding parameter, or be implicitly convertible to the parameter's type
 \item if the function designator's type does not include a prototype or if the argument corresponds to
-``\lstinline$...$'' in a prototype, a \Index{default argument promotion} is applied to it.
+``\lstinline@...@'' in a prototype, a \Index{default argument promotion} is applied to it.
 \end{itemize}
 The type of the valid interpretation is the return type of the function designator.
@@ -770,7 +776,7 @@
 \begin{itemize}
 \item
-If the declaration of the implicit parameter uses \Index{type-class} \lstinline$type$\use{type}, the implicit argument must be an object type;
-if it uses \lstinline$dtype$, the implicit argument must be an object type or an incomplete type;
-and if it uses \lstinline$ftype$, the implicit argument must be a function type.
+If the declaration of the implicit parameter uses \Index{type-class} \lstinline@type@\use{type}, the implicit argument must be an object type;
+if it uses \lstinline@dtype@, the implicit argument must be an object type or an incomplete type;
+and if it uses \lstinline@ftype@, the implicit argument must be a function type.
 
 \item if an explicit parameter's type uses any implicit parameters, then the corresponding explicit argument must have a type that is (or can be safely converted\index{safe conversion} to) the type produced by substituting the implicit arguments for the implicit parameters in the explicit parameter type.
@@ -791,5 +797,5 @@
 \begin{rationale}
 One desirable property of a polymorphic programming language is \define{generalizability}: the ability to replace an abstraction with a more general but equivalent abstraction without requiring changes in any of the uses of the original\cite{Cormack90}.
-For instance, it should be possible to replace a function ``\lstinline$int f( int );$'' with ``\lstinline$forall( otype T ) T f( T );$'' without affecting any calls of \lstinline$f$.
+For instance, it should be possible to replace a function ``\lstinline@int f( int );@'' with ``\lstinline@forall( otype T ) T f( T );@'' without affecting any calls of \lstinline@f@.
 
 \CFA\index{deficiencies!generalizability} does not fully possess this property, because
@@ -805,16 +811,16 @@
 f = g( d, f );		// (3) (unsafe conversion to float) 
 \end{lstlisting}
-If \lstinline$g$ was replaced by ``\lstinline$forall( otype T ) T g( T, T );$'', the first and second calls would be unaffected, but the third would change: \lstinline$f$ would be converted to
-\lstinline$double$, and the result would be a \lstinline$double$.
-
-Another example is the function ``\lstinline$void h( int *);$''.
+If \lstinline@g@ was replaced by ``\lstinline@forall( otype T ) T g( T, T );@'', the first and second calls would be unaffected, but the third would change: \lstinline@f@ would be converted to
+\lstinline@double@, and the result would be a \lstinline@double@.
+
+Another example is the function ``\lstinline@void h( int *);@''.
 This function can be passed a
-\lstinline$void *$ argument, but the generalization ``\lstinline$forall( otype T ) void h( T *);$'' can not.
-In this case, \lstinline$void$ is not a valid value for \lstinline$T$ because it is not an object type.
-If unsafe conversions were allowed, \lstinline$T$ could be inferred to be \emph{any} object type, which is undesirable.
+\lstinline@void *@ argument, but the generalization ``\lstinline@forall( otype T ) void h( T *);@'' can not.
+In this case, \lstinline@void@ is not a valid value for \lstinline@T@ because it is not an object type.
+If unsafe conversions were allowed, \lstinline@T@ could be inferred to be \emph{any} object type, which is undesirable.
 \end{rationale}
 
 \examples
-A function called ``\lstinline$?()$'' might be part of a numerical differentiation package.
+A function called ``\lstinline@?()@'' might be part of a numerical differentiation package.
 \begin{lstlisting}
 extern otype Derivative;
@@ -827,6 +833,6 @@
 d = sin_dx( 12.9 );
 \end{lstlisting}
-Here, the only interpretation of \lstinline$sin_dx$ is as an object of type \lstinline$Derivative$.
-For that interpretation, the function call is treated as ``\lstinline$?()( sin_dx, 12.9 )$''.
+Here, the only interpretation of \lstinline@sin_dx@ is as an object of type \lstinline@Derivative@.
+For that interpretation, the function call is treated as ``\lstinline@?()( sin_dx, 12.9 )@''.
 \begin{lstlisting}
 int f( long );		// (1)
@@ -835,6 +841,6 @@
 int i = f( 5 );		// calls (1) 
 \end{lstlisting}
-Function (1) provides a valid interpretation of ``\lstinline$f( 5 )$'', using an implicit \lstinline$int$ to \lstinline$long$ conversion.
-The other functions do not, since the second requires two arguments, and since there is no implicit conversion from \lstinline$int$ to \lstinline$int *$ that could be used with the third function.
+Function (1) provides a valid interpretation of ``\lstinline@f( 5 )@'', using an implicit \lstinline@int@ to \lstinline@long@ conversion.
+The other functions do not, since the second requires two arguments, and since there is no implicit conversion from \lstinline@int@ to \lstinline@int *@ that could be used with the third function.
 
 \begin{lstlisting}
@@ -842,6 +848,6 @@
 double d = h( 1.5 );
 \end{lstlisting}
-``\lstinline$1.5$'' is a \lstinline$double$ constant, so \lstinline$T$ is inferred to be
-\lstinline$double$, and the result of the function call is a \lstinline$double$.
+``\lstinline@1.5@'' is a \lstinline@double@ constant, so \lstinline@T@ is inferred to be
+\lstinline@double@, and the result of the function call is a \lstinline@double@.
 
 \begin{lstlisting}
@@ -858,8 +864,8 @@
 g( i, p );			// calls (4) 
 \end{lstlisting}
-The first call has valid interpretations for all four versions of \lstinline$g$. (6) and (7) are discarded because they involve unsafe \lstinline$double$-to-\lstinline$long$ conversions. (5) is chosen because it is less polymorphic than (4).
+The first call has valid interpretations for all four versions of \lstinline@g@. (6) and (7) are discarded because they involve unsafe \lstinline@double@-to-\lstinline@long@ conversions. (5) is chosen because it is less polymorphic than (4).
 
 For the second call, (7) is again discarded.
-Of the remaining interpretations for (4), (5), and (6) (with \lstinline$i$ converted to \lstinline$long$), (6) is chosen because it is the least polymorphic.
+Of the remaining interpretations for (4), (5), and (6) (with \lstinline@i@ converted to \lstinline@long@), (6) is chosen because it is the least polymorphic.
 
 The third call has valid interpretations for all of the functions;
@@ -870,5 +876,5 @@
 forall( otype T ) T min( T, T );
 double max( double, double );
-trait min_max( T ) {@\impl{min_max}@
+trait min_max( T ) {§\impl{min_max}§
 	T min( T, T );
 	T max( T, T );
@@ -877,6 +883,6 @@
 shuffle( 9, 10 );
 \end{lstlisting}
-The only possibility for \lstinline$U$ is \lstinline$double$, because that is the type used in the only visible \lstinline$max$ function. 9 and 10 must be converted to \lstinline$double$, and
-\lstinline$min$ must be specialized with \lstinline$T$ bound to \lstinline$double$.
+The only possibility for \lstinline@U@ is \lstinline@double@, because that is the type used in the only visible \lstinline@max@ function. 9 and 10 must be converted to \lstinline@double@, and
+\lstinline@min@ must be specialized with \lstinline@T@ bound to \lstinline@double@.
 \begin{lstlisting}
 extern void q( int );		// (8)
@@ -886,20 +892,19 @@
 r( 0 );
 \end{lstlisting}
-The \lstinline$int 0$ could be passed to (8), or the \lstinline$(void *)$ \Index{specialization} of the null pointer\index{null pointer} \lstinline$0$\use{0} could be passed to (9).
-The former is chosen because the \lstinline$int$ \lstinline$0$ is \Index{less polymorphic}.
-For the same reason, \lstinline$int$ \lstinline$0$ is passed to \lstinline$r()$, even though it has \emph{no} declared parameter types.
+The \lstinline@int 0@ could be passed to (8), or the \lstinline@(void *)@ \Index{specialization} of the null pointer\index{null pointer} \lstinline@0@\use{0} could be passed to (9).
+The former is chosen because the \lstinline@int@ \lstinline@0@ is \Index{less polymorphic}.
+For the same reason, \lstinline@int@ \lstinline@0@ is passed to \lstinline@r()@, even though it has \emph{no} declared parameter types.
 
 
 \subsubsection{Structure and union members}
 
-\semantics In the member selection expression ``\lstinline$s$.\lstinline$m$'', there shall be at least one interpretation of \lstinline$s$ whose type is a structure type or union type containing a member named \lstinline$m$.
-If two or more interpretations of \lstinline$s$ have members named
-\lstinline$m$ with mutually compatible types, then the expression has an \Index{ambiguous interpretation} whose type is the composite type of the types of the members.
-If an interpretation of \lstinline$s$ has a member \lstinline$m$ whose type is not compatible with any other
-\lstinline$s$'s \lstinline$m$, then the expression has an interpretation with the member's type.
+\semantics In the member selection expression ``\lstinline@s@.\lstinline@m@'', there shall be at least one interpretation of \lstinline@s@ whose type is a structure type or union type containing a member named \lstinline@m@.
+If two or more interpretations of \lstinline@s@ have members named
+\lstinline@m@ with mutually compatible types, then the expression has an \Index{ambiguous interpretation} whose type is the composite type of the types of the members.
+If an interpretation of \lstinline@s@ has a member \lstinline@m@ whose type is not compatible with any other
+\lstinline@s@'s \lstinline@m@, then the expression has an interpretation with the member's type.
 The expression has no other interpretations.
 
-The expression ``\lstinline$p->m$'' has the same interpretations as the expression
-``\lstinline$(*p).m$''.
+The expression ``\lstinline@p->m@'' has the same interpretations as the expression ``\lstinline@(*p).m@''.
 
 
@@ -996,5 +1001,5 @@
 	* ?--( _Atomic const restrict volatile T * _Atomic restrict volatile * );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ there exist
+For every extended integer type \lstinline@X@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1002,5 +1007,5 @@
   ?--( volatile X * ), ?--( _Atomic volatile X * );
 \end{lstlisting}
-For every complete enumerated type \lstinline$E$ there exist
+For every complete enumerated type \lstinline@E@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1010,5 +1015,5 @@
 
 \begin{rationale}
-Note that ``\lstinline$++$'' and ``\lstinline$--$'' are rewritten as function calls that are given a pointer to that operand. (This is true of all operators that modify an operand.) As Hamish Macdonald has pointed out, this forces the modified operand of such expressions to be an lvalue.
+Note that ``\lstinline@++@'' and ``\lstinline@--@'' are rewritten as function calls that are given a pointer to that operand. (This is true of all operators that modify an operand.) As Hamish Macdonald has pointed out, this forces the modified operand of such expressions to be an lvalue.
 This partially enforces the C semantic rule that such operands must be \emph{modifiable} lvalues.
 \end{rationale}
@@ -1016,12 +1021,11 @@
 \begin{rationale}
 In C, a semantic rule requires that pointer operands of increment and decrement be pointers to object types.
-Hence, \lstinline$void *$ objects cannot be incremented.
-In \CFA, the restriction follows from the use of a \lstinline$type$ parameter in the predefined function definitions, as opposed to \lstinline$dtype$, since only object types can be inferred arguments corresponding to the type parameter \lstinline$T$.
+Hence, \lstinline@void *@ objects cannot be incremented.
+In \CFA, the restriction follows from the use of a \lstinline@type@ parameter in the predefined function definitions, as opposed to \lstinline@dtype@, since only object types can be inferred arguments corresponding to the type parameter \lstinline@T@.
 \end{rationale}
 
 \semantics
 First, each interpretation of the operand of an increment or decrement expression is considered separately.
-For each interpretation that is a bit-field or is declared with the
-\lstinline$register$\index{register@{\lstinline$register$}} \index{Itorage-class specifier}, the expression has one valid interpretation, with the type of the operand, and the expression is ambiguous if the operand is.
+For each interpretation that is a bit-field or is declared with the \Indexc{register}\index{storage-class specifier}, the expression has one valid interpretation, with the type of the operand, and the expression is ambiguous if the operand is.
 
 For the remaining interpretations, the expression is rewritten, and the interpretations of the expression are the interpretations of the corresponding function call.
@@ -1036,14 +1040,13 @@
 \end{lstlisting}
 \begin{sloppypar}
-Since \lstinline$&(vs)$ has type \lstinline$volatile short int *$, the best valid interpretation of
-\lstinline$vs++$ calls the \lstinline$?++$ function with the \lstinline$volatile short *$ parameter.
-\lstinline$s++$ does the same, applying the safe conversion from \lstinline$short int *$ to
-\lstinline$volatile short int *$.
-Note that there is no conversion that adds an \lstinline$_Atomic$ qualifier, so the \lstinline$_Atomic volatile short int$ overloading does not provide a valid interpretation.
+Since \lstinline@&(vs)@ has type \lstinline@volatile short int *@, the best valid interpretation of
+\lstinline@vs++@ calls the \lstinline@?++@ function with the \lstinline@volatile short *@ parameter.
+\lstinline@s++@ does the same, applying the safe conversion from \lstinline@short int *@ to \lstinline@volatile short int *@.
+Note that there is no conversion that adds an \lstinline@_Atomic@ qualifier, so the \lstinline@_Atomic volatile short int@ overloading does not provide a valid interpretation.
 \end{sloppypar}
 
-There is no safe conversion from \lstinline$const short int *$ to \lstinline$volatile short int *$, and no \lstinline$?++$ function that accepts a \lstinline$const *$ parameter, so \lstinline$cs++$ has no valid interpretations.
-
-The best valid interpretation of \lstinline$as++$ calls the \lstinline$short ?++$ function with the \lstinline$_Atomic volatile short int *$ parameter, applying a safe conversion to add the \lstinline$volatile$ qualifier.
+There is no safe conversion from \lstinline@const short int *@ to \lstinline@volatile short int *@, and no \lstinline@?++@ function that accepts a \lstinline@const *@ parameter, so \lstinline@cs++@ has no valid interpretations.
+
+The best valid interpretation of \lstinline@as++@ calls the \lstinline@short ?++@ function with the \lstinline@_Atomic volatile short int *@ parameter, applying a safe conversion to add the \lstinline@volatile@ qualifier.
 \begin{lstlisting}
 char * const restrict volatile * restrict volatile pqpc;
@@ -1052,7 +1055,7 @@
 ppc++;
 \end{lstlisting}
-Since \lstinline$&(pqpc)$ has type \lstinline$char * const restrict volatile * restrict volatile *$, the best valid interpretation of \lstinline$pqpc++$ calls the polymorphic \lstinline$?++$ function with the \lstinline$const restrict volatile T * restrict volatile *$ parameter, inferring \lstinline$T$ to be \lstinline$char *$.
-
-\lstinline$ppc++$ calls the same function, again inferring \lstinline$T$ to be \lstinline$char *$, and using the safe conversions from \lstinline$T$ to \lstinline$T const$ \lstinline$restrict volatile$.
+Since \lstinline@&(pqpc)@ has type \lstinline@char * const restrict volatile * restrict volatile *@, the best valid interpretation of \lstinline@pqpc++@ calls the polymorphic \lstinline@?++@ function with the \lstinline@const restrict volatile T * restrict volatile *@ parameter, inferring \lstinline@T@ to be \lstinline@char *@.
+
+\lstinline@ppc++@ calls the same function, again inferring \lstinline@T@ to be \lstinline@char *@, and using the safe conversions from \lstinline@T@ to \lstinline@T const@ \lstinline@restrict volatile@.
 
 \begin{rationale}
@@ -1068,29 +1071,29 @@
 \begin{enumerate}
 \item
-``\lstinline$char * p; p++;$''.
-The argument to \lstinline$?++$ has type \lstinline$char * *$, and the result has type \lstinline$char *$.
-The expression would be valid if \lstinline$?++$ were declared by
+``\lstinline@char * p; p++;@''.
+The argument to \lstinline@?++@ has type \lstinline@char * *@, and the result has type \lstinline@char *@.
+The expression would be valid if \lstinline@?++@ were declared by
 \begin{lstlisting}
 forall( otype T ) T * ?++( T * * );
-\end{lstlisting} with \lstinline$T$ inferred to be \lstinline$char$.
-
-\item
-``\lstinline$char *restrict volatile qp; qp++$''.
-The result again has type \lstinline$char *$, but the argument now has type \lstinline$char *restrict volatile *$, so it cannot be passed to the hypothetical function declared in point 1.
+\end{lstlisting} with \lstinline@T@ inferred to be \lstinline@char@.
+
+\item
+``\lstinline@char *restrict volatile qp; qp++@''.
+The result again has type \lstinline@char *@, but the argument now has type \lstinline@char *restrict volatile *@, so it cannot be passed to the hypothetical function declared in point 1.
 Hence the actual predefined function is
 \begin{lstlisting}
 forall( otype T ) T * ?++( T * restrict volatile * );
-\end{lstlisting} which also accepts a \lstinline$char * *$ argument, because of the safe conversions that add
-\lstinline$volatile$ and \lstinline$restrict$ qualifiers. (The parameter is not const-qualified, so constant pointers cannot be incremented.)
-
-\item
-``\lstinline$char *_Atomic ap; ap++$''.
-The result again has type \lstinline$char *$, but no safe conversion adds an \lstinline$_Atomic$ qualifier, so the function in point 2 is not applicable.
-A separate overloading of \lstinline$?++$ is required.
-
-\item
-``\lstinline$char const volatile * pq; pq++$''.
+\end{lstlisting} which also accepts a \lstinline@char * *@ argument, because of the safe conversions that add
+\lstinline@volatile@ and \lstinline@restrict@ qualifiers. (The parameter is not const-qualified, so constant pointers cannot be incremented.)
+
+\item
+``\lstinline@char *_Atomic ap; ap++@''.
+The result again has type \lstinline@char *@, but no safe conversion adds an \lstinline@_Atomic@ qualifier, so the function in point 2 is not applicable.
+A separate overloading of \lstinline@?++@ is required.
+
+\item
+``\lstinline@char const volatile * pq; pq++@''.
 Here the result has type
-\lstinline$char const volatile *$, so a new overloading is needed:
+\lstinline@char const volatile *@, so a new overloading is needed:
 \begin{lstlisting}
 forall( otype T ) T const volatile * ?++( T const volatile *restrict volatile * );
@@ -1099,10 +1102,10 @@
  
 \item
-``\lstinline$float *restrict * prp; prp++$''.
-The \lstinline$restrict$ qualifier is handled just like \lstinline$const$ and \lstinline$volatile$ in the previous case:
+``\lstinline@float *restrict * prp; prp++@''.
+The \lstinline@restrict@ qualifier is handled just like \lstinline@const@ and \lstinline@volatile@ in the previous case:
 \begin{lstlisting}
 forall( otype T ) T restrict * ?++( T restrict *restrict volatile * );
-\end{lstlisting} with \lstinline$T$ inferred to be \lstinline$float *$.
-This looks odd, because {\c11} contains a constraint that requires restrict-qualified types to be pointer-to-object types, and \lstinline$T$ is not syntactically a pointer type. \CFA loosens the constraint.
+\end{lstlisting} with \lstinline@T@ inferred to be \lstinline@float *@.
+This looks odd, because {\c11} contains a constraint that requires restrict-qualified types to be pointer-to-object types, and \lstinline@T@ is not syntactically a pointer type. \CFA loosens the constraint.
 \end{enumerate}
 \end{rationale}
@@ -1120,21 +1123,21 @@
 \lhs{unary-expression}
 \rhs \nonterm{postfix-expression}
-\rhs \lstinline$++$ \nonterm{unary-expression}
-\rhs \lstinline$--$ \nonterm{unary-expression}
+\rhs \lstinline@++@ \nonterm{unary-expression}
+\rhs \lstinline@--@ \nonterm{unary-expression}
 \rhs \nonterm{unary-operator} \nonterm{cast-expression}
-\rhs \lstinline$sizeof$ \nonterm{unary-expression}
-\rhs \lstinline$sizeof$ \lstinline$($ \nonterm{type-name} \lstinline$)$
-\lhs{unary-operator} one of \rhs \lstinline$&$ \lstinline$*$ \lstinline$+$ \lstinline$-$ \lstinline$~$ \lstinline$!$
+\rhs \lstinline@sizeof@ \nonterm{unary-expression}
+\rhs \lstinline@sizeof@ \lstinline@(@ \nonterm{type-name} \lstinline@)@
+\lhs{unary-operator} one of \rhs \lstinline@&@ \lstinline@*@ \lstinline@+@ \lstinline@-@ \lstinline@~@ \lstinline@!@
 \end{syntax}
 
 \rewriterules
 \begin{lstlisting}
-*a	@\rewrite@ *?( a ) @\use{*?}@
-+a	@\rewrite@ +?( a ) @\use{+?}@
--a	@\rewrite@ -?( a ) @\use{-?}@
-~a	@\rewrite@ ~?( a ) @\use{~?}@
-!a	@\rewrite@ !?( a ) @\use{"!?}@
-++a	@\rewrite@ ++?(&( a )) @\use{++?}@
---a	@\rewrite@ --?(&( a )) @\use{--?}@
+*a	§\rewrite§ *?( a ) §\use{*?}§
++a	§\rewrite§ +?( a ) §\use{+?}§
+-a	§\rewrite§ -?( a ) §\use{-?}§
+~a	§\rewrite§ ~?( a ) §\use{~?}§
+!a	§\rewrite§ !?( a ) §\use{"!?}§
+++a	§\rewrite§ ++?(&( a )) §\use{++?}§
+--a	§\rewrite§ --?(&( a )) §\use{--?}§
 \end{lstlisting}
 
@@ -1232,5 +1235,5 @@
 	* --?( _Atomic const restrict volatile T * _Atomic restrict volatile * );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ there exist
+For every extended integer type \lstinline@X@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1240,5 +1243,5 @@
 	--?( _Atomic volatile X * );
 \end{lstlisting}
-For every complete enumerated type \lstinline$E$ there exist
+For every complete enumerated type \lstinline@E@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1277,10 +1280,10 @@
 
 \constraints
-The operand of the unary ``\lstinline$&$'' operator shall have exactly one
+The operand of the unary ``\lstinline@&@'' operator shall have exactly one
 \Index{interpretation}\index{ambiguous interpretation}, which shall be unambiguous.
 
 \semantics
-The ``\lstinline$&$'' expression has one interpretation which is of type \lstinline$T *$, where
-\lstinline$T$ is the type of the operand.
+The ``\lstinline@&@'' expression has one interpretation which is of type \lstinline@T *@, where
+\lstinline@T@ is the type of the operand.
 
 The interpretations of an indirection expression are the interpretations of the corresponding function call.
@@ -1311,5 +1314,5 @@
 forall( ftype FT ) int !?( FT * );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
+For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1324,63 +1327,62 @@
 \begin{lstlisting}
 long int li;
-void eat_double( double );@\use{eat_double}@
-eat_double(-li ); // @\rewrite@ eat_double( -?( li ) );
-\end{lstlisting}
-The valid interpretations of ``\lstinline$-li$'' (assuming no extended integer types exist) are
+void eat_double( double );§\use{eat_double}§
+eat_double(-li ); // §\rewrite§ eat_double( -?( li ) );
+\end{lstlisting}
+The valid interpretations of ``\lstinline@-li@'' (assuming no extended integer types exist) are
 \begin{center}
 \begin{tabular}{llc} interpretation & result type & expression conversion cost \\
 \hline
-\lstinline$-?( (int)li )$					& \lstinline$int$					& (unsafe) \\
-\lstinline$-?( (unsigned)li)$				& \lstinline$unsigned int$			& (unsafe) \\
-\lstinline$-?( (long)li)$					& \lstinline$long$					& 0 \\
-\lstinline$-?( (long unsigned int)li)$		& \lstinline$long unsigned int$		& 1 \\
-\lstinline$-?( (long long int)li)$			& \lstinline$long long int$			& 2 \\
-\lstinline$-?( (long long unsigned int)li)$	& \lstinline$long long unsigned int$& 3 \\
-\lstinline$-?( (float)li)$					& \lstinline$float$					& 4 \\
-\lstinline$-?( (double)li)$					& \lstinline$double$				& 5 \\
-\lstinline$-?( (long double)li)$			& \lstinline$long double$			& 6 \\
-\lstinline$-?( (_Complex float)li)$			& \lstinline$float$					& (unsafe) \\
-\lstinline$-?( (_Complex double)li)$		& \lstinline$double$				& (unsafe) \\
-\lstinline$-?( (_Complex long double)li)$	& \lstinline$long double$			& (unsafe) \\
+\lstinline@-?( (int)li )@					& \lstinline@int@					& (unsafe) \\
+\lstinline@-?( (unsigned)li)@				& \lstinline@unsigned int@			& (unsafe) \\
+\lstinline@-?( (long)li)@					& \lstinline@long@					& 0 \\
+\lstinline@-?( (long unsigned int)li)@		& \lstinline@long unsigned int@		& 1 \\
+\lstinline@-?( (long long int)li)@			& \lstinline@long long int@			& 2 \\
+\lstinline@-?( (long long unsigned int)li)@	& \lstinline@long long unsigned int@& 3 \\
+\lstinline@-?( (float)li)@					& \lstinline@float@					& 4 \\
+\lstinline@-?( (double)li)@					& \lstinline@double@				& 5 \\
+\lstinline@-?( (long double)li)@			& \lstinline@long double@			& 6 \\
+\lstinline@-?( (_Complex float)li)@			& \lstinline@float@					& (unsafe) \\
+\lstinline@-?( (_Complex double)li)@		& \lstinline@double@				& (unsafe) \\
+\lstinline@-?( (_Complex long double)li)@	& \lstinline@long double@			& (unsafe) \\
 \end{tabular}
 \end{center}
-The valid interpretations of the \lstinline$eat_double$ call, with the cost of the argument conversion and the cost of the entire expression, are
+The valid interpretations of the \lstinline@eat_double@ call, with the cost of the argument conversion and the cost of the entire expression, are
 \begin{center}
 \begin{tabular}{lcc} interpretation & argument cost & expression cost \\
 \hline
-\lstinline$eat_double( (double)-?( (int)li) )$					& 7			& (unsafe) \\
-\lstinline$eat_double( (double)-?( (unsigned)li) )$				& 6			& (unsafe) \\
-\lstinline$eat_double( (double)-?(li) )$						& 5			& \(0+5=5\) \\
-\lstinline$eat_double( (double)-?( (long unsigned int)li) )$	& 4			& \(1+4=5\) \\
-\lstinline$eat_double( (double)-?( (long long int)li) )$ 		& 3			& \(2+3=5\) \\
-\lstinline$eat_double( (double)-?( (long long unsigned int)li) )$& 2		& \(3+2=5\) \\
-\lstinline$eat_double( (double)-?( (float)li) )$				& 1			& \(4+1=5\) \\
-\lstinline$eat_double( (double)-?( (double)li) )$				& 0			& \(5+0=5\) \\
-\lstinline$eat_double( (double)-?( (long double)li) )$			& (unsafe)	& (unsafe) \\
-\lstinline$eat_double( (double)-?( (_Complex float)li) )$		& (unsafe)	& (unsafe) \\
-\lstinline$eat_double( (double)-?( (_Complex double)li) )$		& (unsafe)	& (unsafe) \\
-\lstinline$eat_double( (double)-?( (_Complex long double)li) )$	& (unsafe)	& (unsafe) \\
+\lstinline@eat_double( (double)-?( (int)li) )@					& 7			& (unsafe) \\
+\lstinline@eat_double( (double)-?( (unsigned)li) )@				& 6			& (unsafe) \\
+\lstinline@eat_double( (double)-?(li) )@						& 5			& \(0+5=5\) \\
+\lstinline@eat_double( (double)-?( (long unsigned int)li) )@	& 4			& \(1+4=5\) \\
+\lstinline@eat_double( (double)-?( (long long int)li) )@ 		& 3			& \(2+3=5\) \\
+\lstinline@eat_double( (double)-?( (long long unsigned int)li) )@& 2		& \(3+2=5\) \\
+\lstinline@eat_double( (double)-?( (float)li) )@				& 1			& \(4+1=5\) \\
+\lstinline@eat_double( (double)-?( (double)li) )@				& 0			& \(5+0=5\) \\
+\lstinline@eat_double( (double)-?( (long double)li) )@			& (unsafe)	& (unsafe) \\
+\lstinline@eat_double( (double)-?( (_Complex float)li) )@		& (unsafe)	& (unsafe) \\
+\lstinline@eat_double( (double)-?( (_Complex double)li) )@		& (unsafe)	& (unsafe) \\
+\lstinline@eat_double( (double)-?( (_Complex long double)li) )@	& (unsafe)	& (unsafe) \\
 \end{tabular}
 \end{center}
-Each has result type \lstinline$void$, so the best must be selected.
+Each has result type \lstinline@void@, so the best must be selected.
 The interpretations involving unsafe conversions are discarded.
 The remainder have equal expression conversion costs, so the
 ``highest argument conversion cost'' rule is invoked, and the chosen interpretation is
-\lstinline$eat_double( (double)-?(li) )$.
-
-
-\subsubsection{The \lstinline$sizeof$ and \lstinline$_Alignof$ operators}
+\lstinline@eat_double( (double)-?(li) )@.
+
+
+\subsubsection[The sizeof and \_Alignof operators]{The \lstinline@sizeof@ and \lstinline@_Alignof@ operators}
 
 \constraints
-The operand of \lstinline$sizeof$ or \lstinline$_Alignof$ shall not be \lstinline$type$,
-\lstinline$dtype$, or \lstinline$ftype$.
-
-When the \lstinline$sizeof$\use{sizeof} operator is applied to an expression, the expression shall have exactly one \Index{interpretation}\index{ambiguous interpretation}, which shall be unambiguous. \semantics A \lstinline$sizeof$ or \lstinline$_Alignof$ expression has one interpretation, of type \lstinline$size_t$.
-
-When \lstinline$sizeof$ is applied to an identifier declared by a \nonterm{type-declaration} or a
+The operand of \lstinline@sizeof@ or \lstinline@_Alignof@ shall not be \lstinline@type@, \lstinline@dtype@, or \lstinline@ftype@.
+
+When the \lstinline@sizeof@\use{sizeof} operator is applied to an expression, the expression shall have exactly one \Index{interpretation}\index{ambiguous interpretation}, which shall be unambiguous. \semantics A \lstinline@sizeof@ or \lstinline@_Alignof@ expression has one interpretation, of type \lstinline@size_t@.
+
+When \lstinline@sizeof@ is applied to an identifier declared by a \nonterm{type-declaration} or a
 \nonterm{type-parameter}, it yields the size in bytes of the type that implements the operand.
 When the operand is an opaque type or an inferred type parameter\index{inferred parameter}, the expression is not a constant expression.
 
-When \lstinline$_Alignof$ is applied to an identifier declared by a \nonterm{type-declaration} or a
+When \lstinline@_Alignof@ is applied to an identifier declared by a \nonterm{type-declaration} or a
 \nonterm{type-parameter}, it yields the alignment requirement of the type that implements the operand.
 When the operand is an opaque type or an inferred type parameter\index{inferred parameter}, the expression is not a constant expression.
@@ -1389,5 +1391,5 @@
 otype Pair = struct { int first, second; };
 size_t p_size = sizeof(Pair);		// constant expression 
-extern otype Rational;@\use{Rational}@
+extern otype Rational;§\use{Rational}§
 size_t c_size = sizeof(Rational);	// non-constant expression 
 forall(type T) T f(T p1, T p2) {
@@ -1396,7 +1398,7 @@
 }
 \end{lstlisting}
-``\lstinline$sizeof Rational$'', although not statically known, is fixed.
-Within \lstinline$f()$,
-``\lstinline$sizeof(T)$'' is fixed for each call of \lstinline$f()$, but may vary from call to call.
+``\lstinline@sizeof Rational@'', although not statically known, is fixed.
+Within \lstinline@f()@,
+``\lstinline@sizeof(T)@'' is fixed for each call of \lstinline@f()@, but may vary from call to call.
 \end{rationale}
 
@@ -1407,16 +1409,16 @@
 \lhs{cast-expression}
 \rhs \nonterm{unary-expression}
-\rhs \lstinline$($ \nonterm{type-name} \lstinline$)$ \nonterm{cast-expression}
+\rhs \lstinline@(@ \nonterm{type-name} \lstinline@)@ \nonterm{cast-expression}
 \end{syntax}
 
 \constraints
-The \nonterm{type-name} in a \nonterm{cast-expression} shall not be \lstinline$type$,
-\lstinline$dtype$, or \lstinline$ftype$.
+The \nonterm{type-name} in a \nonterm{cast-expression} shall not be \lstinline@type@,
+\lstinline@dtype@, or \lstinline@ftype@.
 
 \semantics
 
-In a \Index{cast expression} ``\lstinline$($\nonterm{type-name}\lstinline$)e$'', if
-\nonterm{type-name} is the type of an interpretation of \lstinline$e$, then that interpretation is the only interpretation of the cast expression;
-otherwise, \lstinline$e$ shall have some interpretation that can be converted to \nonterm{type-name}, and the interpretation of the cast expression is the cast of the interpretation that can be converted at the lowest cost.
+In a \Index{cast expression} ``\lstinline@(@\nonterm{type-name}\lstinline@)e@'', if
+\nonterm{type-name} is the type of an interpretation of \lstinline@e@, then that interpretation is the only interpretation of the cast expression;
+otherwise, \lstinline@e@ shall have some interpretation that can be converted to \nonterm{type-name}, and the interpretation of the cast expression is the cast of the interpretation that can be converted at the lowest cost.
 The cast expression's interpretation is ambiguous\index{ambiguous interpretation} if more than one interpretation can be converted at the lowest cost or if the selected interpretation is ambiguous.
 
@@ -1431,14 +1433,14 @@
 \lhs{multiplicative-expression}
 \rhs \nonterm{cast-expression}
-\rhs \nonterm{multiplicative-expression} \lstinline$*$ \nonterm{cast-expression}
-\rhs \nonterm{multiplicative-expression} \lstinline$/$ \nonterm{cast-expression}
-\rhs \nonterm{multiplicative-expression} \lstinline$%$ \nonterm{cast-expression}
+\rhs \nonterm{multiplicative-expression} \lstinline@*@ \nonterm{cast-expression}
+\rhs \nonterm{multiplicative-expression} \lstinline@/@ \nonterm{cast-expression}
+\rhs \nonterm{multiplicative-expression} \lstinline@%@ \nonterm{cast-expression}
 \end{syntax}
 
 \rewriterules
 \begin{lstlisting}
-a * b @\rewrite@ ?*?( a, b )@\use{?*?}@
-a / b @\rewrite@ ?/?( a, b )@\use{?/?}@
-a % b @\rewrite@ ?%?( a, b )@\use{?%?}@
+a * b §\rewrite§ ?*?( a, b )§\use{?*?}§
+a / b §\rewrite§ ?/?( a, b )§\use{?/?}§
+a % b §\rewrite§ ?%?( a, b )§\use{?%?}§
 \end{lstlisting}
 
@@ -1467,5 +1469,5 @@
 	?*?( _Complex long double, _Complex long double ), ?/?( _Complex long double, _Complex long double );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
+For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1485,28 +1487,28 @@
 int i;
 long li;
-void eat_double( double );@\use{eat_double}@
+void eat_double( double );§\use{eat_double}§
 eat_double( li % i );
 \end{lstlisting}
-``\lstinline$li % i$'' is rewritten as ``\lstinline$?%?(li, i )$''.
-The valid interpretations of \lstinline$?%?(li, i )$, the cost\index{conversion cost} of converting their arguments, and the cost of converting the result to \lstinline$double$ (assuming no extended integer types are present ) are
+``\lstinline@li % i@'' is rewritten as ``\lstinline@?%?(li, i )@''.
+The valid interpretations of \lstinline@?%?(li, i )@, the cost\index{conversion cost} of converting their arguments, and the cost of converting the result to \lstinline@double@ (assuming no extended integer types are present ) are
 \begin{center}
 \begin{tabular}{lcc} interpretation & argument cost & result cost \\
 \hline 
-\lstinline$ ?%?( (int)li, i )$										& (unsafe)	& 6	\\
-\lstinline$ ?%?( (unsigned)li,(unsigned)i )$						& (unsafe)	& 5	\\
-\lstinline$ ?%?( li, (long)i )$										& 1			& 4	\\
-\lstinline$ ?%?( (long unsigned)li,(long unsigned)i )$				& 3			& 3	\\
-\lstinline$ ?%?( (long long)li,(long long)i )$						& 5			& 2	\\
-\lstinline$ ?%?( (long long unsigned)li, (long long unsigned)i )$	& 7			& 1	\\
+\lstinline@ ?%?( (int)li, i )@										& (unsafe)	& 6	\\
+\lstinline@ ?%?( (unsigned)li,(unsigned)i )@						& (unsafe)	& 5	\\
+\lstinline@ ?%?( li, (long)i )@										& 1			& 4	\\
+\lstinline@ ?%?( (long unsigned)li,(long unsigned)i )@				& 3			& 3	\\
+\lstinline@ ?%?( (long long)li,(long long)i )@						& 5			& 2	\\
+\lstinline@ ?%?( (long long unsigned)li, (long long unsigned)i )@	& 7			& 1	\\
 \end{tabular}
 \end{center}
-The best interpretation of \lstinline$eat_double( li, i )$ is
-\lstinline$eat_double( (double)?%?(li, (long)i ))$, which has no unsafe conversions and the lowest total cost.
-
-\begin{rationale}
-{\c11} defines most arithmetic operations to apply an \Index{integer promotion} to any argument that belongs to a type that has an \Index{integer conversion rank} less than that of \lstinline$int$.If
-\lstinline$s$ is a \lstinline$short int$, ``\lstinline$s *s$'' does not have type \lstinline$short int$;
-it is treated as ``\lstinline$( (int)s ) * ( (int)s )$'', and has type \lstinline$int$. \CFA matches that pattern;
-it does not predefine ``\lstinline$short ?*?( short, short )$''.
+The best interpretation of \lstinline@eat_double( li, i )@ is
+\lstinline@eat_double( (double)?%?(li, (long)i ))@, which has no unsafe conversions and the lowest total cost.
+
+\begin{rationale}
+{\c11} defines most arithmetic operations to apply an \Index{integer promotion} to any argument that belongs to a type that has an \Index{integer conversion rank} less than that of \lstinline@int@.If
+\lstinline@s@ is a \lstinline@short int@, ``\lstinline@s *s@'' does not have type \lstinline@short int@;
+it is treated as ``\lstinline@( (int)s ) * ( (int)s )@'', and has type \lstinline@int@. \CFA matches that pattern;
+it does not predefine ``\lstinline@short ?*?( short, short )@''.
 
 These ``missing'' operators limit polymorphism.
@@ -1517,7 +1519,7 @@
 square( s );
 \end{lstlisting}
-Since \CFA does not define a multiplication operator for \lstinline$short int$,
-\lstinline$square( s )$ is treated as \lstinline$square( (int)s )$, and the result has type
-\lstinline$int$.
+Since \CFA does not define a multiplication operator for \lstinline@short int@,
+\lstinline@square( s )@ is treated as \lstinline@square( (int)s )@, and the result has type
+\lstinline@int@.
 This is mildly surprising, but it follows the {\c11} operator pattern.
 
@@ -1529,15 +1531,15 @@
 \end{lstlisting}
 This has no valid interpretations, because \CFA has no conversion from ``array of
-\lstinline$short int$'' to ``array of \lstinline$int$''.
+\lstinline@short int@'' to ``array of \lstinline@int@''.
 The alternatives in such situations include
 \begin{itemize}
 \item
-Defining monomorphic overloadings of \lstinline$product$ for \lstinline$short$ and the other
+Defining monomorphic overloadings of \lstinline@product@ for \lstinline@short@ and the other
 ``small'' types.
 \item
-Defining ``\lstinline$short ?*?( short, short )$'' within the scope containing the call to
-\lstinline$product$.
-\item
-Defining \lstinline$product$ to take as an argument a conversion function from the ``small'' type to the operator's argument type.
+Defining ``\lstinline@short ?*?( short, short )@'' within the scope containing the call to
+\lstinline@product@.
+\item
+Defining \lstinline@product@ to take as an argument a conversion function from the ``small'' type to the operator's argument type.
 \end{itemize}
 \end{rationale}
@@ -1549,12 +1551,12 @@
 \lhs{additive-expression}
 \rhs \nonterm{multiplicative-expression}
-\rhs \nonterm{additive-expression} \lstinline$+$ \nonterm{multiplicative-expression}
-\rhs \nonterm{additive-expression} \lstinline$-$ \nonterm{multiplicative-expression}
+\rhs \nonterm{additive-expression} \lstinline@+@ \nonterm{multiplicative-expression}
+\rhs \nonterm{additive-expression} \lstinline@-@ \nonterm{multiplicative-expression}
 \end{syntax}
 
 \rewriterules
 \begin{lstlisting}
-a + b @\rewrite@ ?+?( a, b )@\use{?+?}@
-a - b @\rewrite@ ?-?( a, b )@\use{?-?}@
+a + b §\rewrite§ ?+?( a, b )§\use{?+?}§
+a - b §\rewrite§ ?-?( a, b )§\use{?-?}§
 \end{lstlisting}
 
@@ -1609,5 +1611,5 @@
 	* ?-?( _Atomic const restrict volatile T *, _Atomic const restrict volatile T * );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
+For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1619,7 +1621,7 @@
 
 \begin{rationale}
-\lstinline$ptrdiff_t$ is an implementation-defined identifier defined in \lstinline$<stddef.h>$ that is synonymous with a signed integral type that is large enough to hold the difference between two pointers.
+\lstinline@ptrdiff_t@ is an implementation-defined identifier defined in \lstinline@<stddef.h>@ that is synonymous with a signed integral type that is large enough to hold the difference between two pointers.
 It seems reasonable to use it for pointer addition as well. (This is technically a difference between \CFA and C, which only specifies that pointer addition uses an \emph{integral} argument.) Hence it is also used for subscripting, which is defined in terms of pointer addition.
-The {\c11} standard uses \lstinline$size_t$ in several cases where a library function takes an argument that is used as a subscript, but \lstinline$size_t$ is unsuitable here because it is an unsigned type.
+The {\c11} standard uses \lstinline@size_t@ in several cases where a library function takes an argument that is used as a subscript, but \lstinline@size_t@ is unsuitable here because it is an unsigned type.
 \end{rationale}
 
@@ -1630,12 +1632,12 @@
 \lhs{shift-expression}
 \rhs \nonterm{additive-expression}
-\rhs \nonterm{shift-expression} \lstinline$<<$ \nonterm{additive-expression}
-\rhs \nonterm{shift-expression} \lstinline$>>$ \nonterm{additive-expression}
+\rhs \nonterm{shift-expression} \lstinline@<<@ \nonterm{additive-expression}
+\rhs \nonterm{shift-expression} \lstinline@>>@ \nonterm{additive-expression}
 \end{syntax}
 
 \rewriterules \use{?>>?}%use{?<<?}
 \begin{lstlisting}
-a << b @\rewrite@ ?<<?( a, b )
-a >> b @\rewrite@ ?>>?( a, b )
+a << b §\rewrite§ ?<<?( a, b )
+a >> b §\rewrite§ ?>>?( a, b )
 \end{lstlisting}
 
@@ -1649,5 +1651,5 @@
 long long unsigned int ?<<?( long long unsigned int, int ), ?>>?( long long unsigned int, int);
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
+For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1669,16 +1671,16 @@
 \lhs{relational-expression}
 \rhs \nonterm{shift-expression}
-\rhs \nonterm{relational-expression} \lstinline$< $ \nonterm{shift-expression}
-\rhs \nonterm{relational-expression} \lstinline$> $ \nonterm{shift-expression}
-\rhs \nonterm{relational-expression} \lstinline$<=$ \nonterm{shift-expression}
-\rhs \nonterm{relational-expression} \lstinline$>=$ \nonterm{shift-expression}
+\rhs \nonterm{relational-expression} \lstinline@< @ \nonterm{shift-expression}
+\rhs \nonterm{relational-expression} \lstinline@> @ \nonterm{shift-expression}
+\rhs \nonterm{relational-expression} \lstinline@<=@ \nonterm{shift-expression}
+\rhs \nonterm{relational-expression} \lstinline@>=@ \nonterm{shift-expression}
 \end{syntax}
 
 \rewriterules\use{?>?}\use{?>=?}%use{?<?}%use{?<=?}
 \begin{lstlisting}
-a < b @\rewrite@ ?<?( a, b )
-a > b @\rewrite@ ?>?( a, b )
-a <= b @\rewrite@ ?<=?( a, b )
-a >= b @\rewrite@ ?>=?( a, b )
+a < b §\rewrite§ ?<?( a, b )
+a > b §\rewrite§ ?>?( a, b )
+a <= b §\rewrite§ ?<=?( a, b )
+a >= b §\rewrite§ ?>=?( a, b )
 \end{lstlisting}
 
@@ -1712,5 +1714,5 @@
 	?>=?( _Atomic const restrict volatile DT *, _Atomic const restrict volatile DT * );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
+For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1730,12 +1732,12 @@
 \lhs{equality-expression}
 \rhs \nonterm{relational-expression}
-\rhs \nonterm{equality-expression} \lstinline$==$ \nonterm{relational-expression}
-\rhs \nonterm{equality-expression} \lstinline$!=$ \nonterm{relational-expression}
+\rhs \nonterm{equality-expression} \lstinline@==@ \nonterm{relational-expression}
+\rhs \nonterm{equality-expression} \lstinline@!=@ \nonterm{relational-expression}
 \end{syntax}
 
 \rewriterules
 \begin{lstlisting}
-a == b @\rewrite@ ?==?( a, b )@\use{?==?}@
-a != b @\rewrite@ ?!=?( a, b )@\use{?"!=?}@
+a == b §\rewrite§ ?==?( a, b )§\use{?==?}§
+a != b §\rewrite§ ?!=?( a, b )§\use{?"!=?}§
 \end{lstlisting}
 
@@ -1790,5 +1792,5 @@
 	?==?( forall( ftype FT2) FT2*, forall( ftype FT3) FT3 * ), ?!=?( forall( ftype FT2) FT2*, forall( ftype FT3) FT3 * );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
+For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1798,5 +1800,5 @@
 
 \begin{rationale}
-The polymorphic equality operations come in three styles: comparisons between pointers of compatible types, between pointers to \lstinline$void$ and pointers to object types or incomplete types, and between the \Index{null pointer} constant and pointers to any type.
+The polymorphic equality operations come in three styles: comparisons between pointers of compatible types, between pointers to \lstinline@void@ and pointers to object types or incomplete types, and between the \Index{null pointer} constant and pointers to any type.
 In the last case, a special constraint rule for null pointer constant operands has been replaced by a consequence of the \CFA type system.
 \end{rationale}
@@ -1819,10 +1821,10 @@
 \lhs{AND-expression}
 \rhs \nonterm{equality-expression}
-\rhs \nonterm{AND-expression} \lstinline$&$ \nonterm{equality-expression}
+\rhs \nonterm{AND-expression} \lstinline@&@ \nonterm{equality-expression}
 \end{syntax}
 
 \rewriterules
 \begin{lstlisting}
-a & b @\rewrite@ ?&?( a, b )@\use{?&?}@
+a & b §\rewrite§ ?&?( a, b )§\use{?&?}§
 \end{lstlisting}
 
@@ -1836,5 +1838,5 @@
 long long unsigned int ?&?( long long unsigned int, long long unsigned int );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
+For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1851,10 +1853,10 @@
 \lhs{exclusive-OR-expression}
 \rhs \nonterm{AND-expression}
-\rhs \nonterm{exclusive-OR-expression} \lstinline$^$ \nonterm{AND-expression}
+\rhs \nonterm{exclusive-OR-expression} \lstinline@^@ \nonterm{AND-expression}
 \end{syntax}
 
 \rewriterules
 \begin{lstlisting}
-a ^ b @\rewrite@ ?^?( a, b )@\use{?^?}@
+a ^ b §\rewrite§ ?^?( a, b )§\use{?^?}§
 \end{lstlisting}
 
@@ -1868,5 +1870,5 @@
 long long unsigned int ?^?( long long unsigned int, long long unsigned int );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
+For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1883,10 +1885,10 @@
 \lhs{inclusive-OR-expression}
 \rhs \nonterm{exclusive-OR-expression}
-\rhs \nonterm{inclusive-OR-expression} \lstinline$|$ \nonterm{exclusive-OR-expression}
+\rhs \nonterm{inclusive-OR-expression} \lstinline@|@ \nonterm{exclusive-OR-expression}
 \end{syntax}
 
 \rewriterules\use{?"|?}
 \begin{lstlisting}
-a | b @\rewrite@ ?|?( a, b )
+a | b §\rewrite§ ?|?( a, b )
 \end{lstlisting}
 
@@ -1900,5 +1902,5 @@
 long long unsigned int ?|?( long long unsigned int, long long unsigned int );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
+For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1915,27 +1917,27 @@
 \lhs{logical-AND-expression}
 \rhs \nonterm{inclusive-OR-expression}
-\rhs \nonterm{logical-AND-expression} \lstinline$&&$ \nonterm{inclusive-OR-expression}
+\rhs \nonterm{logical-AND-expression} \lstinline@&&@ \nonterm{inclusive-OR-expression}
 \end{syntax}
 
-\semantics The operands of the expression ``\lstinline$a && b$'' are treated as
-``\lstinline$(int)((a)!=0)$'' and ``\lstinline$(int)((b)!=0)$'', which shall both be unambiguous.
-The expression has only one interpretation, which is of type \lstinline$int$.
-\begin{rationale}
-When the operands of a logical expression are values of built-in types, and ``\lstinline$!=$'' has not been redefined for those types, the compiler can optimize away the function calls.
-
-A common C idiom omits comparisons to \lstinline$0$ in the controlling expressions of loops and
-\lstinline$if$ statements.
-For instance, the loop below iterates as long as \lstinline$rp$ points at a \lstinline$Rational$ value that is non-zero.
-
-\begin{lstlisting}
-extern otype Rational;@\use{Rational}@
-extern const Rational 0;@\use{0}@
+\semantics The operands of the expression ``\lstinline@a && b@'' are treated as
+``\lstinline@(int)((a)!=0)@'' and ``\lstinline@(int)((b)!=0)@'', which shall both be unambiguous.
+The expression has only one interpretation, which is of type \lstinline@int@.
+\begin{rationale}
+When the operands of a logical expression are values of built-in types, and ``\lstinline@!=@'' has not been redefined for those types, the compiler can optimize away the function calls.
+
+A common C idiom omits comparisons to \lstinline@0@ in the controlling expressions of loops and
+\lstinline@if@ statements.
+For instance, the loop below iterates as long as \lstinline@rp@ points at a \lstinline@Rational@ value that is non-zero.
+
+\begin{lstlisting}
+extern otype Rational;§\use{Rational}§
+extern const Rational 0;§\use{0}§
 extern int ?!=?( Rational, Rational );
 Rational *rp;
 while ( rp && *rp ) { ... }
 \end{lstlisting}
-The logical expression calls the \lstinline$Rational$ inequality operator, passing it \lstinline$*rp$ and the \lstinline$Rational 0$, and getting a 1 or 0 as a result.
-In contrast, {\CC} would apply a programmer-defined \lstinline$Rational$-to-\lstinline$int$ conversion to \lstinline$*rp$ in the equivalent situation.
-The conversion to \lstinline$int$ would produce a general integer value, which is unfortunate, and possibly dangerous if the conversion was not written with this situation in mind.
+The logical expression calls the \lstinline@Rational@ inequality operator, passing it \lstinline@*rp@ and the \lstinline@Rational 0@, and getting a 1 or 0 as a result.
+In contrast, {\CC} would apply a programmer-defined \lstinline@Rational@-to-\lstinline@int@ conversion to \lstinline@*rp@ in the equivalent situation.
+The conversion to \lstinline@int@ would produce a general integer value, which is unfortunate, and possibly dangerous if the conversion was not written with this situation in mind.
 \end{rationale}
 
@@ -1946,11 +1948,11 @@
 \lhs{logical-OR-expression}
 \rhs \nonterm{logical-AND-expression}
-\rhs \nonterm{logical-OR-expression} \lstinline$||$ \nonterm{logical-AND-expression}
+\rhs \nonterm{logical-OR-expression} \lstinline@||@ \nonterm{logical-AND-expression}
 \end{syntax}
 
 \semantics
 
-The operands of the expression ``\lstinline$a || b$'' are treated as ``\lstinline$(int)((a)!=0)$'' and ``\lstinline$(int)((b))!=0)$'', which shall both be unambiguous.
-The expression has only one interpretation, which is of type \lstinline$int$.
+The operands of the expression ``\lstinline@a || b@'' are treated as ``\lstinline@(int)((a)!=0)@'' and ``\lstinline@(int)((b))!=0)@'', which shall both be unambiguous.
+The expression has only one interpretation, which is of type \lstinline@int@.
 
 
@@ -1960,15 +1962,15 @@
 \lhs{conditional-expression}
 \rhs \nonterm{logical-OR-expression}
-\rhs \nonterm{logical-OR-expression} \lstinline$?$ \nonterm{expression}
-	 \lstinline$:$ \nonterm{conditional-expression}
+\rhs \nonterm{logical-OR-expression} \lstinline@?@ \nonterm{expression}
+	 \lstinline@:@ \nonterm{conditional-expression}
 \end{syntax}
 
 \semantics
-In the conditional expression\use{?:} ``\lstinline$a?b:c$'', if the second and third operands both have an interpretation with \lstinline$void$ type, then the expression has an interpretation with type \lstinline$void$, equivalent to
+In the conditional expression\use{?:} ``\lstinline@a?b:c@'', if the second and third operands both have an interpretation with \lstinline@void@ type, then the expression has an interpretation with type \lstinline@void@, equivalent to
 \begin{lstlisting}
 ( int)(( a)!=0) ? ( void)( b) : ( void)( c)
 \end{lstlisting}
 
-If the second and third operands both have interpretations with non-\lstinline$void$ types, the expression is treated as if it were the call ``\lstinline$cond((a)!=0, b, c)$'', with \lstinline$cond$ declared as
+If the second and third operands both have interpretations with non-\lstinline@void@ types, the expression is treated as if it were the call ``\lstinline@cond((a)!=0, b, c)@'', with \lstinline@cond@ declared as
 \begin{lstlisting}
 forall( otype T ) T cond( int, T, T );
@@ -2022,6 +2024,6 @@
 rand() ? i : l;
 \end{lstlisting}
-The best interpretation infers the expression's type to be \lstinline$long$ and applies the safe
-\lstinline$int$-to-\lstinline$long$ conversion to \lstinline$i$.
+The best interpretation infers the expression's type to be \lstinline@long@ and applies the safe
+\lstinline@int@-to-\lstinline@long@ conversion to \lstinline@i@.
 
 \begin{lstlisting}
@@ -2030,11 +2032,11 @@
 rand() ? cip : vip;
 \end{lstlisting}
-The expression has type \lstinline$const volatile int *$, with safe conversions applied to the second and third operands to add \lstinline$volatile$ and \lstinline$const$ qualifiers, respectively.
+The expression has type \lstinline@const volatile int *@, with safe conversions applied to the second and third operands to add \lstinline@volatile@ and \lstinline@const@ qualifiers, respectively.
 
 \begin{lstlisting}
 rand() ? cip : 0;
 \end{lstlisting}
-The expression has type \lstinline$const int *$, with a specialization conversion applied to
-\lstinline$0$.
+The expression has type \lstinline@const int *@, with a specialization conversion applied to
+\lstinline@0@.
 
 
@@ -2047,6 +2049,6 @@
 	 \nonterm{assignment-expression}
 \lhs{assignment-operator} one of
-\rhs \lstinline$=$\ \ \lstinline$*=$\ \ \lstinline$/=$\ \ \lstinline$%=$\ \ \lstinline$+=$\ \ \lstinline$-=$\ \  
-	 \lstinline$<<=$\ \ \lstinline$>>=$\ \ \lstinline$&=$\ \ \lstinline$^=$\ \ \lstinline$|=$
+\rhs \lstinline@=@\ \ \lstinline@*=@\ \ \lstinline@/=@\ \ \lstinline@%=@\ \ \lstinline@+=@\ \ \lstinline@-=@\ \  
+	 \lstinline@<<=@\ \ \lstinline@>>=@\ \ \lstinline@&=@\ \ \lstinline@^=@\ \ \lstinline@|=@
 \end{syntax}
 
@@ -2057,10 +2059,10 @@
 \use{?>>=?}\use{?&=?}\use{?^=?}\use{?"|=?}%use{?<<=?}
 \begin{lstlisting}
-a @$\leftarrow$@ b @\rewrite@ ?@$\leftarrow$@?( &( a ), b )
+a §$\leftarrow$§ b §\rewrite§ ?§$\leftarrow$§?( &( a ), b )
 \end{lstlisting}
 
 \semantics
 Each interpretation of the left operand of an assignment expression is considered separately.
-For each interpretation that is a bit-field or is declared with the \lstinline$register$ storage class specifier, the expression has one valid interpretation, with the type of the left operand.
+For each interpretation that is a bit-field or is declared with the \lstinline@register@ storage class specifier, the expression has one valid interpretation, with the type of the left operand.
 The right operand is cast to that type, and the assignment expression is ambiguous if either operand is.
 For the remaining interpretations, the expression is rewritten, and the interpretations of the assignment expression are the interpretations of the corresponding function call.
@@ -2295,8 +2297,8 @@
 \end{lstlisting}
 \begin{rationale}
-The pattern of overloadings for simple assignment resembles that of pointer increment and decrement, except that the polymorphic pointer assignment functions declare a \lstinline$dtype$ parameter, instead of a \lstinline$type$ parameter, because the left operand may be a pointer to an incomplete type.
-\end{rationale}
-
-For every complete structure or union type \lstinline$S$ there exist
+The pattern of overloadings for simple assignment resembles that of pointer increment and decrement, except that the polymorphic pointer assignment functions declare a \lstinline@dtype@ parameter, instead of a \lstinline@type@ parameter, because the left operand may be a pointer to an incomplete type.
+\end{rationale}
+
+For every complete structure or union type \lstinline@S@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -2304,5 +2306,5 @@
 \end{lstlisting}
 
-For every extended integer type \lstinline$X$ there exist
+For every extended integer type \lstinline@X@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -2310,5 +2312,5 @@
 \end{lstlisting}
 
-For every complete enumerated type \lstinline$E$ there exist
+For every complete enumerated type \lstinline@E@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -2316,5 +2318,5 @@
 \end{lstlisting}
 \begin{rationale}
-The right-hand argument is \lstinline$int$ because enumeration constants have type \lstinline$int$.
+The right-hand argument is \lstinline@int@ because enumeration constants have type \lstinline@int@.
 \end{rationale}
 
@@ -2577,5 +2579,5 @@
 \end{lstlisting}
 
-For every extended integer type \lstinline$X$ there exist
+For every extended integer type \lstinline@X@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -2592,5 +2594,5 @@
 \end{lstlisting}
 
-For every complete enumerated type \lstinline$E$ there exist
+For every complete enumerated type \lstinline@E@ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -2613,10 +2615,10 @@
 \lhs{expression}
 \rhs \nonterm{assignment-expression}
-\rhs \nonterm{expression} \lstinline$,$ \nonterm{assignment-expression}
+\rhs \nonterm{expression} \lstinline@,@ \nonterm{assignment-expression}
 \end{syntax}
 
 \semantics
-In the comma expression ``\lstinline$a, b$'', the first operand is interpreted as
-``\lstinline$( void )(a)$'', which shall be unambiguous\index{ambiguous interpretation}.
+In the comma expression ``\lstinline@a, b@'', the first operand is interpreted as
+``\lstinline@( void )(a)@'', which shall be unambiguous\index{ambiguous interpretation}.
 The interpretations of the expression are the interpretations of the second operand.
 
@@ -2653,5 +2655,5 @@
 { ... }
 \end{lstlisting}
-Without the rule, \lstinline$Complex$ would be a type in the first case, and a parameter name in the second.
+Without the rule, \lstinline@Complex@ would be a type in the first case, and a parameter name in the second.
 \end{rationale}
 
@@ -2679,8 +2681,8 @@
 \examples
 \begin{lstlisting}
-struct point {@\impl{point}@
+struct point {§\impl{point}§
 	int x, y;
 };
-struct color_point {@\impl{color_point}@
+struct color_point {§\impl{color_point}§
 	enum { RED, BLUE, GREEN } color;
 	struct point;
@@ -2689,5 +2691,5 @@
 cp.x = 0;
 cp.color = RED;
-struct literal {@\impl{literal}@
+struct literal {§\impl{literal}§
 	enum { NUMBER, STRING } tag;
 	union {
@@ -2710,5 +2712,5 @@
 \begin{syntax}
 \lhs{forall-specifier}
-\rhs \lstinline$forall$ \lstinline$($ \nonterm{type-parameter-list} \lstinline$)$
+\rhs \lstinline@forall@ \lstinline@(@ \nonterm{type-parameter-list} \lstinline@)@
 \end{syntax}
 
@@ -2722,5 +2724,5 @@
 } mkPair( T, T ); // illegal 
 \end{lstlisting}
-If an instance of \lstinline$struct Pair$ was declared later in the current scope, what would the members' type be?
+If an instance of \lstinline@struct Pair@ was declared later in the current scope, what would the members' type be?
 \end{rationale}
 \end{comment}
@@ -2729,9 +2731,9 @@
 The \nonterm{type-parameter-list}s and assertions of the \nonterm{forall-specifier}s declare type identifiers, function and object identifiers with \Index{no linkage}.
 
-If, in the declaration ``\lstinline$T D$'', \lstinline$T$ contains \nonterm{forall-specifier}s and
-\lstinline$D$ has the form
-\begin{lstlisting}
-D( @\normalsize\nonterm{parameter-type-list}@ )
-\end{lstlisting} then a type identifier declared by one of the \nonterm{forall-specifier}s is an \define{inferred parameter} of the function declarator if and only if it is not an inferred parameter of a function declarator in \lstinline$D$, and it is used in the type of a parameter in the following
+If, in the declaration ``\lstinline@T D@'', \lstinline@T@ contains \nonterm{forall-specifier}s and
+\lstinline@D@ has the form
+\begin{lstlisting}
+D( §\normalsize\nonterm{parameter-type-list}§ )
+\end{lstlisting} then a type identifier declared by one of the \nonterm{forall-specifier}s is an \define{inferred parameter} of the function declarator if and only if it is not an inferred parameter of a function declarator in \lstinline@D@, and it is used in the type of a parameter in the following
 \nonterm{type-parameter-list} or it and an inferred parameter are used as arguments of a
 \Index{specification} in one of the \nonterm{forall-specifier}s.
@@ -2744,14 +2746,14 @@
 If this restriction were lifted, it would be possible to write
 \begin{lstlisting}
-forall( otype T ) T * alloc( void );@\use{alloc}@ int *p = alloc();
-\end{lstlisting}
-Here \lstinline$alloc()$ would receive \lstinline$int$ as an inferred argument, and return an
-\lstinline$int *$.
-In general, if a call to \lstinline$alloc()$ is a subexpression of an expression involving polymorphic functions and overloaded identifiers, there could be considerable distance between the call and the subexpression that causes \lstinline$T$ to be bound.
-
-With the current restriction, \lstinline$alloc()$ must be given an argument that determines
-\lstinline$T$:
-\begin{lstlisting}
-forall( otype T ) T * alloc( T initial_value );@\use{alloc}@
+forall( otype T ) T * alloc( void );§\use{alloc}§ int *p = alloc();
+\end{lstlisting}
+Here \lstinline@alloc()@ would receive \lstinline@int@ as an inferred argument, and return an
+\lstinline@int *@.
+In general, if a call to \lstinline@alloc()@ is a subexpression of an expression involving polymorphic functions and overloaded identifiers, there could be considerable distance between the call and the subexpression that causes \lstinline@T@ to be bound.
+
+With the current restriction, \lstinline@alloc()@ must be given an argument that determines
+\lstinline@T@:
+\begin{lstlisting}
+forall( otype T ) T * alloc( T initial_value );§\use{alloc}§
 \end{lstlisting}
 \end{rationale}
@@ -2778,11 +2780,11 @@
 forall( otype T ) T fT( T );
 \end{lstlisting}
-\lstinline$fi()$ takes an \lstinline$int$ and returns an \lstinline$int$. \lstinline$fT()$ takes a
-\lstinline$T$ and returns a \lstinline$T$, for any type \lstinline$T$.
+\lstinline@fi()@ takes an \lstinline@int@ and returns an \lstinline@int@. \lstinline@fT()@ takes a
+\lstinline@T@ and returns a \lstinline@T@, for any type \lstinline@T@.
 \begin{lstlisting}
 int (*pfi )( int ) = fi;
 forall( otype T ) T (*pfT )( T ) = fT;
 \end{lstlisting}
-\lstinline$pfi$ and \lstinline$pfT$ are pointers to functions. \lstinline$pfT$ is not polymorphic, but the function it points at is.
+\lstinline@pfi@ and \lstinline@pfT@ are pointers to functions. \lstinline@pfT@ is not polymorphic, but the function it points at is.
 \begin{lstlisting}
 int (*fvpfi( void ))( int ) {
@@ -2793,5 +2795,5 @@
 }
 \end{lstlisting}
-\lstinline$fvpfi()$ and \lstinline$fvpfT()$ are functions taking no arguments and returning pointers to functions. \lstinline$fvpfT()$ is monomorphic, but the function that its return value points at is polymorphic.
+\lstinline@fvpfi()@ and \lstinline@fvpfT()@ are functions taking no arguments and returning pointers to functions. \lstinline@fvpfT()@ is monomorphic, but the function that its return value points at is polymorphic.
 \begin{lstlisting}
 forall( otype T ) int ( *fTpfi( T ) )( int );
@@ -2799,19 +2801,19 @@
 forall( otype T, otype U ) U ( *fTpfU( T ) )( U );
 \end{lstlisting}
-\lstinline$fTpfi()$ is a polymorphic function that returns a pointer to a monomorphic function taking an integer and returning an integer.
-It could return \lstinline$pfi$. \lstinline$fTpfT()$ is subtle: it is a polymorphic function returning a \emph{monomorphic} function taking and returning
-\lstinline$T$, where \lstinline$T$ is an inferred parameter of \lstinline$fTpfT()$.
-For instance, in the expression ``\lstinline$fTpfT(17)$'', \lstinline$T$ is inferred to be \lstinline$int$, and the returned value would have type \lstinline$int ( * )( int )$. ``\lstinline$fTpfT(17)(13)$'' and
-``\lstinline$fTpfT("yes")("no")$'' are legal, but ``\lstinline$fTpfT(17)("no")$'' is illegal.
-\lstinline$fTpfU()$ is polymorphic ( in type \lstinline$T$), and returns a pointer to a function that is polymorphic ( in type \lstinline$U$). ``\lstinline$f5(17)("no")$'' is a legal expression of type
-\lstinline$char *$.
+\lstinline@fTpfi()@ is a polymorphic function that returns a pointer to a monomorphic function taking an integer and returning an integer.
+It could return \lstinline@pfi@. \lstinline@fTpfT()@ is subtle: it is a polymorphic function returning a \emph{monomorphic} function taking and returning
+\lstinline@T@, where \lstinline@T@ is an inferred parameter of \lstinline@fTpfT()@.
+For instance, in the expression ``\lstinline@fTpfT(17)@'', \lstinline@T@ is inferred to be \lstinline@int@, and the returned value would have type \lstinline@int ( * )( int )@. ``\lstinline@fTpfT(17)(13)@'' and
+``\lstinline@fTpfT("yes")("no")@'' are legal, but ``\lstinline@fTpfT(17)("no")@'' is illegal.
+\lstinline@fTpfU()@ is polymorphic ( in type \lstinline@T@), and returns a pointer to a function that is polymorphic ( in type \lstinline@U@). ``\lstinline@f5(17)("no")@'' is a legal expression of type
+\lstinline@char *@.
 \begin{lstlisting}
 forall( otype T, otype U, otype V ) U * f( T *, U, V * const );
 forall( otype U, otype V, otype W ) U * g( V *, U, W * const );
 \end{lstlisting}
-The functions \lstinline$f()$ and \lstinline$g()$ have compatible types.
+The functions \lstinline@f()@ and \lstinline@g()@ have compatible types.
 Let \(f\) and \(g\) be their types;
-then \(f_1\) = \lstinline$T$, \(f_2\) = \lstinline$U$, \(f_3\) = \lstinline$V$, \(g_1\)
-= \lstinline$V$, \(g_2\) = \lstinline$U$, and \(g_3\) = \lstinline$W$.
+then \(f_1\) = \lstinline@T@, \(f_2\) = \lstinline@U@, \(f_3\) = \lstinline@V@, \(g_1\)
+= \lstinline@V@, \(g_2\) = \lstinline@U@, and \(g_3\) = \lstinline@W@.
 Replacing every \(f_i\) by \(g_i\) in \(f\) gives
 \begin{lstlisting}
@@ -2819,5 +2821,5 @@
 \end{lstlisting} which has a return type and parameter list that is compatible with \(g\).
 \begin{rationale}
-The word ``\lstinline$type$'' in a forall specifier is redundant at the moment, but I want to leave room for inferred parameters of ordinary types in case parameterized types get added one day.
+The word ``\lstinline@type@'' in a forall specifier is redundant at the moment, but I want to leave room for inferred parameters of ordinary types in case parameterized types get added one day.
 
 Even without parameterized types, I might try to allow
@@ -2845,15 +2847,16 @@
 \subsection{Type qualifiers}
 
-\CFA defines a new type qualifier \lstinline$lvalue$\impl{lvalue}\index{lvalue}.
+\CFA defines a new type qualifier \lstinline@lvalue@\impl{lvalue}\index{lvalue}.
 \begin{syntax}
 \oldlhs{type-qualifier}
-\rhs \lstinline$lvalue$
+\rhs \lstinline@lvalue@
 \end{syntax}
 
 \constraints
-\lstinline$restrict$\index{register@{\lstinline$restrict$}} Types other than type parameters and pointer types whose referenced type is an object type shall not be restrict-qualified.
+\Indexc{restrict} Types other than type parameters and pointer types whose referenced type is an object type shall not be restrict-qualified.
 
 \semantics
-An object's type may be a restrict-qualified type parameter. \lstinline$restrict$ does not establish any special semantics in that case.
+An object's type may be a restrict-qualified type parameter.
+\lstinline@restrict@ does not establish any special semantics in that case.
 
 \begin{rationale}
@@ -2861,11 +2864,11 @@
 \end{rationale}
 
-\lstinline$lvalue$ may be used to qualify the return type of a function type.
-Let \lstinline$T$ be an unqualified version of a type;
+\lstinline@lvalue@ may be used to qualify the return type of a function type.
+Let \lstinline@T@ be an unqualified version of a type;
 then the result of calling a function with return type
-\lstinline$lvalue T$ is a \Index{modifiable lvalue} of type \lstinline$T$.
-\lstinline$const$\use{const} and \lstinline$volatile$\use{volatile} qualifiers may also be added to indicate that the function result is a constant or volatile lvalue.
-\begin{rationale}
-The \lstinline$const$ and \lstinline$volatile$ qualifiers can only be sensibly used to qualify the return type of a function if the \lstinline$lvalue$ qualifier is also used.
+\lstinline@lvalue T@ is a \Index{modifiable lvalue} of type \lstinline@T@.
+\lstinline@const@\use{const} and \lstinline@volatile@\use{volatile} qualifiers may also be added to indicate that the function result is a constant or volatile lvalue.
+\begin{rationale}
+The \lstinline@const@ and \lstinline@volatile@ qualifiers can only be sensibly used to qualify the return type of a function if the \lstinline@lvalue@ qualifier is also used.
 \end{rationale}
 
@@ -2874,13 +2877,12 @@
 
 \begin{rationale}
-\lstinline$lvalue$ provides some of the functionality of {\CC}'s ``\lstinline$T&$'' ( reference to object of type \lstinline$T$) type.
+\lstinline@lvalue@ provides some of the functionality of {\CC}'s ``\lstinline@T&@'' ( reference to object of type \lstinline@T@) type.
 Reference types have four uses in {\CC}.
 \begin{itemize}
 \item
-They are necessary for user-defined operators that return lvalues, such as ``subscript'' and
-``dereference''.
-
-\item
-A reference can be used to define an alias for a complicated lvalue expression, as a way of getting some of the functionality of the Pascal \lstinline$with$ statement.
+They are necessary for user-defined operators that return lvalues, such as ``subscript'' and ``dereference''.
+
+\item
+A reference can be used to define an alias for a complicated lvalue expression, as a way of getting some of the functionality of the Pascal \lstinline@with@ statement.
 The following {\CC} code gives an example.
 \begin{lstlisting}
@@ -2895,28 +2897,28 @@
 A reference parameter can be used to allow a function to modify an argument without forcing the caller to pass the address of the argument.
 This is most useful for user-defined assignment operators.
-In {\CC}, plain assignment is done by a function called ``\lstinline$operator=$'', and the two expressions
+In {\CC}, plain assignment is done by a function called ``\lstinline@operator=@'', and the two expressions
 \begin{lstlisting}
 a = b;
 operator=( a, b );
 \end{lstlisting} are equivalent.
-If \lstinline$a$ and \lstinline$b$ are of type \lstinline$T$, then the first parameter of \lstinline$operator=$ must have type ``\lstinline$T&$''.
+If \lstinline@a@ and \lstinline@b@ are of type \lstinline@T@, then the first parameter of \lstinline@operator=@ must have type ``\lstinline@T&@''.
 It cannot have type
-\lstinline$T$, because then assignment couldn't alter the variable, and it can't have type
-``\lstinline$T *$'', because the assignment would have to be written ``\lstinline$&a = b;$''.
-
-In the case of user-defined operators, this could just as well be handled by using pointer types and by changing the rewrite rules so that ``\lstinline$a = b;$'' is equivalent to
-``\lstinline$operator=(&( a), b )$''.
-Reference parameters of ``normal'' functions are Bad Things, because they remove a useful property of C function calls: an argument can only be modified by a function if it is preceded by ``\lstinline$&$''.
+\lstinline@T@, because then assignment couldn't alter the variable, and it can't have type
+``\lstinline@T *@'', because the assignment would have to be written ``\lstinline@&a = b;@''.
+
+In the case of user-defined operators, this could just as well be handled by using pointer types and by changing the rewrite rules so that ``\lstinline@a = b;@'' is equivalent to
+``\lstinline@operator=(&( a), b )@''.
+Reference parameters of ``normal'' functions are Bad Things, because they remove a useful property of C function calls: an argument can only be modified by a function if it is preceded by ``\lstinline@&@''.
 
 \item
 References to \Index{const-qualified} types can be used instead of value parameters.  Given the
-{\CC} function call ``\lstinline$fiddle( a_thing )$'', where the type of \lstinline$a_thing$ is
-\lstinline$Thing$, the type of \lstinline$fiddle$ could be either of
+{\CC} function call ``\lstinline@fiddle( a_thing )@'', where the type of \lstinline@a_thing@ is
+\lstinline@Thing@, the type of \lstinline@fiddle@ could be either of
 \begin{lstlisting}
 void fiddle( Thing );
 void fiddle( const Thing & );
 \end{lstlisting}
-If the second form is used, then constructors and destructors are not invoked to create a temporary variable at the call site ( and it is bad style for the caller to make any assumptions about such things), and within \lstinline$fiddle$ the parameter is subject to the usual problems caused by aliases.
-The reference form might be chosen for efficiency's sake if \lstinline$Thing$s are too large or their constructors or destructors are too expensive.
+If the second form is used, then constructors and destructors are not invoked to create a temporary variable at the call site ( and it is bad style for the caller to make any assumptions about such things), and within \lstinline@fiddle@ the parameter is subject to the usual problems caused by aliases.
+The reference form might be chosen for efficiency's sake if \lstinline@Thing@s are too large or their constructors or destructors are too expensive.
 An implementation may switch between them without causing trouble for well-behaved clients.
 This leaves the implementor to define ``too large'' and ``too expensive''.
@@ -2926,5 +2928,5 @@
 void fiddle( const volatile Thing );
 \end{lstlisting} with call-by-reference.
-Since it knows all about the size of \lstinline$Thing$s and the parameter passing mechanism, it should be able to come up with a better definition of ``too large'', and may be able to make a good guess at ``too expensive''.
+Since it knows all about the size of \lstinline@Thing@s and the parameter passing mechanism, it should be able to come up with a better definition of ``too large'', and may be able to make a good guess at ``too expensive''.
 \end{itemize}
 
@@ -2946,15 +2948,15 @@
 \begin{syntax}
 \lhs{spec-definition}
-\rhs \lstinline$spec$ \nonterm{identifier} 
-	\lstinline$($ \nonterm{type-parameter-list} \lstinline$)$
-	\lstinline${$ \nonterm{spec-declaration-list}\opt \lstinline$}$
+\rhs \lstinline@spec@ \nonterm{identifier} 
+	\lstinline@(@ \nonterm{type-parameter-list} \lstinline@)@
+	\lstinline@{@ \nonterm{spec-declaration-list}\opt \lstinline@}@
 \lhs{spec-declaration-list}
-\rhs \nonterm{spec-declaration} \lstinline$;$
-\rhs \nonterm{spec-declaration-list} \nonterm{spec-declaration} \lstinline$;$
+\rhs \nonterm{spec-declaration} \lstinline@;@
+\rhs \nonterm{spec-declaration-list} \nonterm{spec-declaration} \lstinline@;@
 \lhs{spec-declaration}
 \rhs \nonterm{specifier-qualifier-list} \nonterm{declarator-list}
 \lhs{declarator-list}
 \rhs \nonterm{declarator}
-\rhs \nonterm{declarator-list} \lstinline$,$ \nonterm{declarator}
+\rhs \nonterm{declarator-list} \lstinline@,@ \nonterm{declarator}
 \end{syntax}
 \begin{rationale}
@@ -2978,9 +2980,9 @@
 \rhs \nonterm{assertion-list} \nonterm{assertion}
 \lhs{assertion}
-\rhs \lstinline$|$ \nonterm{identifier} \lstinline$($ \nonterm{type-name-list} \lstinline$)$
-\rhs \lstinline$|$ \nonterm{spec-declaration}
+\rhs \lstinline@|@ \nonterm{identifier} \lstinline@(@ \nonterm{type-name-list} \lstinline@)@
+\rhs \lstinline@|@ \nonterm{spec-declaration}
 \lhs{type-name-list}
 \rhs \nonterm{type-name}
-\rhs \nonterm{type-name-list} \lstinline$,$ \nonterm{type-name}
+\rhs \nonterm{type-name-list} \lstinline@,@ \nonterm{type-name}
 \end{syntax}
 
@@ -2989,7 +2991,7 @@
 The \nonterm{type-name-list} shall contain one \nonterm{type-name} argument for each \nonterm{type-parameter} in that specification's \nonterm{spec-parameter-list}.
 If the
-\nonterm{type-parameter} uses type-class \lstinline$type$\use{type}, the argument shall be the type name of an \Index{object type};
-if it uses \lstinline$dtype$, the argument shall be the type name of an object type or an \Index{incomplete type};
-and if it uses \lstinline$ftype$, the argument shall be the type name of a \Index{function type}.
+\nonterm{type-parameter} uses type-class \lstinline@type@\use{type}, the argument shall be the type name of an \Index{object type};
+if it uses \lstinline@dtype@, the argument shall be the type name of an object type or an \Index{incomplete type};
+and if it uses \lstinline@ftype@, the argument shall be the type name of a \Index{function type}.
 
 \semantics
@@ -3004,13 +3006,13 @@
 \examples
 \begin{lstlisting}
-forall( otype T | T ?*?( T, T ))@\use{?*?}@
-T square( T val ) {@\impl{square}@
+forall( otype T | T ?*?( T, T ))§\use{?*?}§
+T square( T val ) {§\impl{square}§
 	return val + val;
 }
-trait summable( otype T ) {@\impl{summable}@
-	T ?+=?( T *, T );@\use{?+=?}@
-	const T 0;@\use{0}@
+trait summable( otype T ) {§\impl{summable}§
+	T ?+=?( T *, T );§\use{?+=?}§
+	const T 0;§\use{0}§
 };
-trait list_of( otype List, otype Element ) {@\impl{list_of}@
+trait list_of( otype List, otype Element ) {§\impl{list_of}§
 	Element car( List );
 	List cdr( List );
@@ -3021,6 +3023,6 @@
 trait sum_list( otype List, otype Element | summable( Element ) | list_of( List, Element ) ) {};
 \end{lstlisting}
-\lstinline$sum_list$ contains seven declarations, which describe a list whose elements can be added up.
-The assertion ``\lstinline$|sum_list( i_list, int )$''\use{sum_list} produces the assertion parameters
+\lstinline@sum_list@ contains seven declarations, which describe a list whose elements can be added up.
+The assertion ``\lstinline@|sum_list( i_list, int )@''\use{sum_list} produces the assertion parameters
 \begin{lstlisting}
 int ?+=?( int *, int );
@@ -3039,18 +3041,18 @@
 \lhs{type-parameter-list}
 \rhs \nonterm{type-parameter}
-\rhs \nonterm{type-parameter-list} \lstinline$,$ \nonterm{type-parameter}
+\rhs \nonterm{type-parameter-list} \lstinline@,@ \nonterm{type-parameter}
 \lhs{type-parameter}
 \rhs \nonterm{type-class} \nonterm{identifier} \nonterm{assertion-list}\opt
 \lhs{type-class}
-\rhs \lstinline$type$
-\rhs \lstinline$dtype$
-\rhs \lstinline$ftype$
+\rhs \lstinline@type@
+\rhs \lstinline@dtype@
+\rhs \lstinline@ftype@
 \lhs{type-declaration}
-\rhs \nonterm{storage-class-specifier}\opt \lstinline$type$ \nonterm{type-declarator-list} \verb|;|
+\rhs \nonterm{storage-class-specifier}\opt \lstinline@type@ \nonterm{type-declarator-list} \verb|;|
 \lhs{type-declarator-list}
 \rhs \nonterm{type-declarator}
-\rhs \nonterm{type-declarator-list} \lstinline$,$ \nonterm{type-declarator}
+\rhs \nonterm{type-declarator-list} \lstinline@,@ \nonterm{type-declarator}
 \lhs{type-declarator}
-\rhs \nonterm{identifier} \nonterm{assertion-list}\opt \lstinline$=$ \nonterm{type-name}
+\rhs \nonterm{identifier} \nonterm{assertion-list}\opt \lstinline@=@ \nonterm{type-name}
 \rhs \nonterm{identifier} \nonterm{assertion-list}\opt
 \end{syntax}
@@ -3063,9 +3065,9 @@
 
 An identifier declared by a \nonterm{type-parameter} has \Index{no linkage}.
-Identifiers declared with type-class \lstinline$type$\use{type} are \Index{object type}s;
+Identifiers declared with type-class \lstinline@type@\use{type} are \Index{object type}s;
 those declared with type-class
-\lstinline$dtype$\use{dtype} are \Index{incomplete type}s;
+\lstinline@dtype@\use{dtype} are \Index{incomplete type}s;
 and those declared with type-class
-\lstinline$ftype$\use{ftype} are \Index{function type}s.
+\lstinline@ftype@\use{ftype} are \Index{function type}s.
 The identifier has \Index{block scope} that terminates at the end of the \nonterm{spec-declaration-list} or polymorphic function that contains the \nonterm{type-parameter}.
 
@@ -3075,5 +3077,5 @@
 Within the scope of the declaration, \Index{implicit conversion}s can be performed between the defined type and the implementation type, and between pointers to the defined type and pointers to the implementation type.
 
-A type declaration without an \Index{initializer} and without a \Index{storage-class specifier} or with storage-class specifier \lstinline$static$\use{static} defines an \Index{incomplete type}.
+A type declaration without an \Index{initializer} and without a \Index{storage-class specifier} or with storage-class specifier \lstinline@static@\use{static} defines an \Index{incomplete type}.
 If a
 \Index{translation unit} or \Index{block} contains one or more such declarations for an identifier, it must contain exactly one definition of the identifier ( but not in an enclosed block, which would define a new type known only within that block).
@@ -3095,5 +3097,5 @@
 
 A type declaration without an initializer and with \Index{storage-class specifier}
-\lstinline$extern$\use{extern} is an \define{opaque type declaration}.
+\lstinline@extern@\use{extern} is an \define{opaque type declaration}.
 Opaque types are
 \Index{object type}s.
@@ -3110,8 +3112,8 @@
 \end{rationale}
 
-An \Index{incomplete type} which is not a qualified version\index{qualified type} of a type is a value of \Index{type-class} \lstinline$dtype$.
-An object type\index{object types} which is not a qualified version of a type is a value of type-classes \lstinline$type$ and \lstinline$dtype$.
+An \Index{incomplete type} which is not a qualified version\index{qualified type} of a type is a value of \Index{type-class} \lstinline@dtype@.
+An object type\index{object types} which is not a qualified version of a type is a value of type-classes \lstinline@type@ and \lstinline@dtype@.
 A
-\Index{function type} is a value of type-class \lstinline$ftype$.
+\Index{function type} is a value of type-class \lstinline@ftype@.
 \begin{rationale}
 Syntactically, a type value is a \nonterm{type-name}, which is a declaration for an object which omits the identifier being declared.
@@ -3123,7 +3125,7 @@
 Type qualifiers are a weak point of C's type system.
 Consider the standard library function
-\lstinline$strchr()$ which, given a string and a character, returns a pointer to the first occurrence of the character in the string.
-\begin{lstlisting}
-char *strchr( const char *s, int c ) {@\impl{strchr}@
+\lstinline@strchr()@ which, given a string and a character, returns a pointer to the first occurrence of the character in the string.
+\begin{lstlisting}
+char *strchr( const char *s, int c ) {§\impl{strchr}§
 	char real_c = c; // done because c was declared as int. 
 	for ( ; *s != real_c; s++ )
@@ -3132,10 +3134,10 @@
 }
 \end{lstlisting}
-The parameter \lstinline$s$ must be \lstinline$const char *$, because \lstinline$strchr()$ might be used to search a constant string, but the return type must be \lstinline$char *$, because the result might be used to modify a non-constant string.
+The parameter \lstinline@s@ must be \lstinline@const char *@, because \lstinline@strchr()@ might be used to search a constant string, but the return type must be \lstinline@char *@, because the result might be used to modify a non-constant string.
 Hence the body must perform a cast, and ( even worse)
-\lstinline$strchr()$ provides a type-safe way to attempt to modify constant strings.
-What is needed is some way to say that \lstinline$s$'s type might contain qualifiers, and the result type has exactly the same qualifiers.
+\lstinline@strchr()@ provides a type-safe way to attempt to modify constant strings.
+What is needed is some way to say that \lstinline@s@'s type might contain qualifiers, and the result type has exactly the same qualifiers.
 Polymorphic functions do not provide a fix for this deficiency\index{deficiencies!pointers to qualified types}, because type qualifiers are not part of type values.
-Instead, overloading can be used to define \lstinline$strchr()$ for each combination of qualifiers.
+Instead, overloading can be used to define \lstinline@strchr()@ for each combination of qualifiers.
 \end{rationale}
 
@@ -3162,5 +3164,5 @@
 \end{lstlisting}
 Without this restriction, \CFA might require ``module initialization'' code ( since
-\lstinline$Rational$ has external linkage, it must be created before any other translation unit instantiates it), and would force an ordering on the initialization of the translation unit that defines \lstinline$Huge$ and the translation that declares \lstinline$Rational$.
+\lstinline@Rational@ has external linkage, it must be created before any other translation unit instantiates it), and would force an ordering on the initialization of the translation unit that defines \lstinline@Huge@ and the translation that declares \lstinline@Rational@.
 
 A benefit of the restriction is that it prevents the declaration in separate translation units of types that contain each other, which would be hard to prevent otherwise.
@@ -3179,5 +3181,5 @@
 \nonterm{struct-declaration}, type declarations can not be structure members.
 The form of
-\nonterm{type-declaration} forbids arrays of, pointers to, and functions returning \lstinline$type$.
+\nonterm{type-declaration} forbids arrays of, pointers to, and functions returning \lstinline@type@.
 Hence the syntax of \nonterm{type-specifier} does not have to be extended to allow type-valued expressions.
 It also side-steps the problem of type-valued expressions producing different values in different declarations.
@@ -3194,7 +3196,7 @@
 #include <stdlib.h>
 T * new( otype T ) { return ( T * )malloc( sizeof( T) ); };
-@\ldots@ int * ip = new( int );
-\end{lstlisting}
-This looks sensible, but \CFA's declaration-before-use rules mean that ``\lstinline$T$'' in the function body refers to the parameter, but the ``\lstinline$T$'' in the return type refers to the meaning of \lstinline$T$ in the scope that contains \lstinline$new$;
+§\ldots§ int * ip = new( int );
+\end{lstlisting}
+This looks sensible, but \CFA's declaration-before-use rules mean that ``\lstinline@T@'' in the function body refers to the parameter, but the ``\lstinline@T@'' in the return type refers to the meaning of \lstinline@T@ in the scope that contains \lstinline@new@;
 it could be undefined, or a type name, or a function or variable name.
 Nothing good can result from such a situation.
@@ -3213,43 +3215,43 @@
 f2( v2 );
 \end{lstlisting}
-\lstinline$V1$ is passed by value, so \lstinline$f1()$'s assignment to \lstinline$a[0]$ does not modify v1.  \lstinline$V2$ is converted to a pointer, so \lstinline$f2()$ modifies \lstinline$v2[0]$.
+\lstinline@V1@ is passed by value, so \lstinline@f1()@'s assignment to \lstinline@a[0]@ does not modify v1.  \lstinline@V2@ is converted to a pointer, so \lstinline@f2()@ modifies \lstinline@v2[0]@.
 
 A translation unit containing the declarations
 \begin{lstlisting}
-extern type Complex;@\use{Complex}@ // opaque type declaration
-extern float abs( Complex );@\use{abs}@
-\end{lstlisting} can contain declarations of complex numbers, which can be passed to \lstinline$abs$.
-Some other translation unit must implement \lstinline$Complex$ and \lstinline$abs$.
+extern type Complex;§\use{Complex}§ // opaque type declaration
+extern float abs( Complex );§\use{abs}§
+\end{lstlisting} can contain declarations of complex numbers, which can be passed to \lstinline@abs@.
+Some other translation unit must implement \lstinline@Complex@ and \lstinline@abs@.
 That unit might contain the declarations
 \begin{lstlisting}
-otype Complex = struct { float re, im; };@\impl{Complex}@
-Complex cplx_i = { 0.0, 1.0 };@\impl{cplx_i}@
-float abs( Complex c ) {@\impl{abs( Complex )}@
+otype Complex = struct { float re, im; };§\impl{Complex}§
+Complex cplx_i = { 0.0, 1.0 };§\impl{cplx_i}§
+float abs( Complex c ) {§\impl{abs( Complex )}§
 	return sqrt( c.re * c.re + c.im * c.im );
 }
 \end{lstlisting}
-Note that \lstinline$c$ is implicitly converted to a \lstinline$struct$ so that its components can be retrieved.
-
-\begin{lstlisting}
-otype Time_of_day = int;@\impl{Time_of_day}@ // seconds since midnight. 
-Time_of_day ?+?( Time_of_day t1, int seconds ) {@\impl{?+?}@
+Note that \lstinline@c@ is implicitly converted to a \lstinline@struct@ so that its components can be retrieved.
+
+\begin{lstlisting}
+otype Time_of_day = int;§\impl{Time_of_day}§ // seconds since midnight. 
+Time_of_day ?+?( Time_of_day t1, int seconds ) {§\impl{?+?}§
 	return (( int)t1 + seconds ) % 86400;
 }
 \end{lstlisting}
-\lstinline$t1$ must be cast to its implementation type to prevent infinite recursion.
+\lstinline@t1@ must be cast to its implementation type to prevent infinite recursion.
 
 \begin{rationale}
 Within the scope of a type definition, an instance of the type can be viewed as having that type or as having the implementation type.
-In the \lstinline$Time_of_day$ example, the difference is important.
+In the \lstinline@Time_of_day@ example, the difference is important.
 Different languages have treated the distinction between the abstraction and the implementation in different ways.
 \begin{itemize}
 \item
 Inside a Clu cluster \cite{CLU}, the declaration of an instance states which view applies.
-Two primitives called \lstinline$up$ and \lstinline$down$ can be used to convert between the views.
+Two primitives called \lstinline@up@ and \lstinline@down@ can be used to convert between the views.
 \item
 The Simula class \cite{SIMULA87} is essentially a record type.
 Since the only operations on a record are member selection and assignment, which can not be overloaded, there is never any ambiguity as to whether the abstraction or the implementation view is being used.
 In {\CC}
-\cite{C++}, operations on class instances include assignment and ``\lstinline$&$'', which can be overloaded.
+\cite{C++}, operations on class instances include assignment and ``\lstinline@&@'', which can be overloaded.
 A ``scope resolution'' operator can be used inside the class to specify whether the abstract or implementation version of the operation should be used.
 \item
@@ -3264,5 +3266,5 @@
 In this case, explicit conversions between the derived type and the old type can be used.
 \end{itemize}
-\CFA's rules are like Clu's, except that implicit conversions and conversion costs allow it to do away with most uses of \lstinline$up$ and \lstinline$down$. 
+\CFA's rules are like Clu's, except that implicit conversions and conversion costs allow it to do away with most uses of \lstinline@up@ and \lstinline@down@. 
 \end{rationale}
 
@@ -3270,31 +3272,31 @@
 \subsubsection{Default functions and objects}
 
-A declaration\index{type declaration} of a type identifier \lstinline$T$ with type-class
-\lstinline$type$ implicitly declares a \define{default assignment} function
-\lstinline$T ?=?( T *, T )$\use{?=?}, with the same \Index{scope} and \Index{linkage} as the identifier \lstinline$T$.
+A declaration\index{type declaration} of a type identifier \lstinline@T@ with type-class
+\lstinline@type@ implicitly declares a \define{default assignment} function
+\lstinline@T ?=?( T *, T )@\use{?=?}, with the same \Index{scope} and \Index{linkage} as the identifier \lstinline@T@.
 \begin{rationale}
 Assignment is central to C's imperative programming style, and every existing C object type has assignment defined for it ( except for array types, which are treated as pointer types for purposes of assignment).
 Without this rule, nearly every inferred type parameter would need an accompanying assignment assertion parameter.
 If a type parameter should not have an assignment operation,
-\lstinline$dtype$ should be used.
+\lstinline@dtype@ should be used.
 If a type should not have assignment defined, the user can define an assignment function that causes a run-time error, or provide an external declaration but no definition and thus cause a link-time error.
 \end{rationale}
 
-A definition\index{type definition} of a type identifier \lstinline$T$ with \Index{implementation type} \lstinline$I$ and type-class \lstinline$type$ implicitly defines a default assignment function.
-A definition\index{type definition} of a type identifier \lstinline$T$ with implementation type \lstinline$I$ and an assertion list implicitly defines \define{default function}s and
+A definition\index{type definition} of a type identifier \lstinline@T@ with \Index{implementation type} \lstinline@I@ and type-class \lstinline@type@ implicitly defines a default assignment function.
+A definition\index{type definition} of a type identifier \lstinline@T@ with implementation type \lstinline@I@ and an assertion list implicitly defines \define{default function}s and
 \define{default object}s as declared by the assertion declarations.
-The default objects and functions have the same \Index{scope} and \Index{linkage} as the identifier \lstinline$T$.
+The default objects and functions have the same \Index{scope} and \Index{linkage} as the identifier \lstinline@T@.
 Their values are determined as follows:
 \begin{itemize}
 \item
-If at the definition of \lstinline$T$ there is visible a declaration of an object with the same name as the default object, and if the type of that object with all occurrence of \lstinline$I$ replaced by \lstinline$T$ is compatible with the type of the default object, then the default object is initialized with that object.
-Otherwise the scope of the declaration of \lstinline$T$ must contain a definition of the default object.
+If at the definition of \lstinline@T@ there is visible a declaration of an object with the same name as the default object, and if the type of that object with all occurrence of \lstinline@I@ replaced by \lstinline@T@ is compatible with the type of the default object, then the default object is initialized with that object.
+Otherwise the scope of the declaration of \lstinline@T@ must contain a definition of the default object.
 
 \item 
-If at the definition of \lstinline$T$ there is visible a declaration of a function with the same name as the default function, and if the type of that function with all occurrence of \lstinline$I$ replaced by \lstinline$T$ is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the converted result.
-
-Otherwise, if \lstinline$I$ contains exactly one anonymous member\index{anonymous member} such that at the definition of \lstinline$T$ there is visible a declaration of a function with the same name as the default function, and the type of that function with all occurrences of the anonymous member's type in its parameter list replaced by \lstinline$T$ is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the result.
-
-Otherwise the scope of the declaration of \lstinline$T$ must contain a definition of the default function.
+If at the definition of \lstinline@T@ there is visible a declaration of a function with the same name as the default function, and if the type of that function with all occurrence of \lstinline@I@ replaced by \lstinline@T@ is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the converted result.
+
+Otherwise, if \lstinline@I@ contains exactly one anonymous member\index{anonymous member} such that at the definition of \lstinline@T@ there is visible a declaration of a function with the same name as the default function, and the type of that function with all occurrences of the anonymous member's type in its parameter list replaced by \lstinline@T@ is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the result.
+
+Otherwise the scope of the declaration of \lstinline@T@ must contain a definition of the default function.
 \end{itemize}
 \begin{rationale}
@@ -3302,5 +3304,5 @@
 \end{rationale}
 
-A function or object with the same type and name as a default function or object that is declared within the scope of the definition of \lstinline$T$ replaces the default function or object.
+A function or object with the same type and name as a default function or object that is declared within the scope of the definition of \lstinline@T@ replaces the default function or object.
 
 \examples
@@ -3312,8 +3314,8 @@
 Pair b = { 1, 1 };
 \end{lstlisting}
-The definition of \lstinline$Pair$ implicitly defines two objects \lstinline$a$ and \lstinline$b$.
-\lstinline$Pair a$ inherits its value from the \lstinline$struct impl a$.
+The definition of \lstinline@Pair@ implicitly defines two objects \lstinline@a@ and \lstinline@b@.
+\lstinline@Pair a@ inherits its value from the \lstinline@struct impl a@.
 The definition of
-\lstinline$Pair b$ is compulsory because there is no \lstinline$struct impl b$ to construct a value from.
+\lstinline@Pair b@ is compulsory because there is no \lstinline@struct impl b@ to construct a value from.
 \begin{lstlisting}
 trait ss( otype T ) {
@@ -3321,6 +3323,6 @@
 	void munge( T * );
 }
-otype Whatsit | ss( Whatsit );@\use{Whatsit}@
-otype Doodad | ss( Doodad ) = struct doodad {@\use{Doodad}@
+otype Whatsit | ss( Whatsit );§\use{Whatsit}§
+otype Doodad | ss( Doodad ) = struct doodad {§\use{Doodad}§
 	Whatsit; // anonymous member 
 	int extra;
@@ -3328,5 +3330,5 @@
 Doodad clone( Doodad ) { ... }
 \end{lstlisting}
-The definition of \lstinline$Doodad$ implicitly defines three functions:
+The definition of \lstinline@Doodad@ implicitly defines three functions:
 \begin{lstlisting}
 Doodad ?=?( Doodad *, Doodad );
@@ -3334,17 +3336,17 @@
 void munge( Doodad * );
 \end{lstlisting}
-The assignment function inherits \lstinline$struct doodad$'s assignment function because the types match when \lstinline$struct doodad$ is replaced by \lstinline$Doodad$ throughout.
-\lstinline$munge()$ inherits \lstinline$Whatsit$'s \lstinline$munge()$ because the types match when
-\lstinline$Whatsit$ is replaced by \lstinline$Doodad$ in the parameter list. \lstinline$clone()$ does \emph{not} inherit \lstinline$Whatsit$'s \lstinline$clone()$: replacement in the parameter list yields ``\lstinline$Whatsit clone( Doodad )$'', which is not compatible with
-\lstinline$Doodad$'s \lstinline$clone()$'s type.
+The assignment function inherits \lstinline@struct doodad@'s assignment function because the types match when \lstinline@struct doodad@ is replaced by \lstinline@Doodad@ throughout.
+\lstinline@munge()@ inherits \lstinline@Whatsit@'s \lstinline@munge()@ because the types match when
+\lstinline@Whatsit@ is replaced by \lstinline@Doodad@ in the parameter list. \lstinline@clone()@ does \emph{not} inherit \lstinline@Whatsit@'s \lstinline@clone()@: replacement in the parameter list yields ``\lstinline@Whatsit clone( Doodad )@'', which is not compatible with
+\lstinline@Doodad@'s \lstinline@clone()@'s type.
 Hence the definition of
-``\lstinline$Doodad clone( Doodad )$'' is necessary.
+``\lstinline@Doodad clone( Doodad )@'' is necessary.
 
 Default functions and objects are subject to the normal scope rules.
 \begin{lstlisting}
-otype T = @\ldots@;
-T a_T = @\ldots@;		// Default assignment used. 
+otype T = §\ldots§;
+T a_T = §\ldots§;		// Default assignment used. 
 T ?=?( T *, T );
-T a_T = @\ldots@;		// Programmer-defined assignment called. 
+T a_T = §\ldots§;		// Programmer-defined assignment called. 
 \end{lstlisting}
 \begin{rationale}
@@ -3379,13 +3381,13 @@
 \begin{syntax}
 \oldlhs{labeled-statement}
-\rhs \lstinline$case$ \nonterm{case-value-list} : \nonterm{statement}
+\rhs \lstinline@case@ \nonterm{case-value-list} : \nonterm{statement}
 \lhs{case-value-list}
 \rhs \nonterm{case-value}
-\rhs \nonterm{case-value-list} \lstinline$,$ \nonterm{case-value}
+\rhs \nonterm{case-value-list} \lstinline@,@ \nonterm{case-value}
 \lhs{case-value}
 \rhs \nonterm{constant-expression}
 \rhs \nonterm{subrange}
 \lhs{subrange}
-\rhs \nonterm{constant-expression} \lstinline$~$ \nonterm{constant-expression}
+\rhs \nonterm{constant-expression} \lstinline@~@ \nonterm{constant-expression}
 \end{syntax}
 
@@ -3400,10 +3402,10 @@
 case 1~4, 9~14, 27~32:
 \end{lstlisting}
-The \lstinline$case$ and \lstinline$default$ clauses are restricted within the \lstinline$switch$ and \lstinline$choose$ statements, precluding Duff's device.
+The \lstinline@case@ and \lstinline@default@ clauses are restricted within the \lstinline@switch@ and \lstinline@choose@ statements, precluding Duff's device.
 
 
 \subsection{Expression and null statements}
 
-The expression in an expression statement is treated as being cast to \lstinline$void$.
+The expression in an expression statement is treated as being cast to \lstinline@void@.
 
 
@@ -3412,8 +3414,8 @@
 \begin{syntax}
 \oldlhs{selection-statement}
-\rhs \lstinline$choose$ \lstinline$($ \nonterm{expression} \lstinline$)$ \nonterm{statement}
+\rhs \lstinline@choose@ \lstinline@(@ \nonterm{expression} \lstinline@)@ \nonterm{statement}
 \end{syntax}
 
-The controlling expression \lstinline$E$ in the \lstinline$switch$ and \lstinline$choose$ statement:
+The controlling expression \lstinline@E@ in the \lstinline@switch@ and \lstinline@choose@ statement:
 \begin{lstlisting}
 switch ( E ) ...
@@ -3421,12 +3423,12 @@
 \end{lstlisting} may have more than one interpretation, but it shall have only one interpretation with an integral type.
 An \Index{integer promotion} is performed on the expression if necessary.
-The constant expressions in \lstinline$case$ statements with the switch are converted to the promoted type.
+The constant expressions in \lstinline@case@ statements with the switch are converted to the promoted type.
 
 
 \setcounter{subsubsection}{3}
-\subsubsection{The \lstinline$choose$ statement}
-
-The \lstinline$choose$ statement is the same as the \lstinline$switch$ statement except control transfers to the end of the \lstinline$choose$ statement at a \lstinline$case$ or \lstinline$default$ labeled statement.
-The \lstinline$fallthru$ statement is used to fall through to the next \lstinline$case$ or \lstinline$default$ labeled statement.
+\subsubsection[The choose statement]{The \lstinline@choose@ statement}
+
+The \lstinline@choose@ statement is the same as the \lstinline@switch@ statement except control transfers to the end of the \lstinline@choose@ statement at a \lstinline@case@ or \lstinline@default@ labeled statement.
+The \lstinline@fallthru@ statement is used to fall through to the next \lstinline@case@ or \lstinline@default@ labeled statement.
 The following have identical meaning:
 \begin{flushleft}
@@ -3453,19 +3455,19 @@
 \end{tabular}
 \end{flushleft}
-The \lstinline$choose$ statement addresses the problem of accidental fall-through associated with the \lstinline$switch$ statement.
+The \lstinline@choose@ statement addresses the problem of accidental fall-through associated with the \lstinline@switch@ statement.
 
 
 \subsection{Iteration statements}
 
-The controlling expression \lstinline$E$ in the loops
+The controlling expression \lstinline@E@ in the loops
 \begin{lstlisting}
 if ( E ) ...
 while ( E ) ...
 do ... while ( E );
-\end{lstlisting} is treated as ``\lstinline$( int )((E)!=0)$''.
+\end{lstlisting} is treated as ``\lstinline@( int )((E)!=0)@''.
 
 The statement 
 \begin{lstlisting}
-for ( a; b; c ) @\ldots@
+for ( a; b; c ) §\ldots§
 \end{lstlisting} is treated as
 \begin{lstlisting}
@@ -3478,13 +3480,13 @@
 \begin{syntax}
 \oldlhs{jump-statement}
-\rhs \lstinline$continue$ \nonterm{identifier}\opt
-\rhs \lstinline$break$ \nonterm{identifier}\opt
+\rhs \lstinline@continue@ \nonterm{identifier}\opt
+\rhs \lstinline@break@ \nonterm{identifier}\opt
 \rhs \ldots
-\rhs \lstinline$throw$ \nonterm{assignment-expression}\opt
-\rhs \lstinline$throwResume$ \nonterm{assignment-expression}\opt \nonterm{at-expression}\opt
-\lhs{at-expression} \lstinline$_At$ \nonterm{assignment-expression}
+\rhs \lstinline@throw@ \nonterm{assignment-expression}\opt
+\rhs \lstinline@throwResume@ \nonterm{assignment-expression}\opt \nonterm{at-expression}\opt
+\lhs{at-expression} \lstinline@_At@ \nonterm{assignment-expression}
 \end{syntax}
 
-Labeled \lstinline$continue$ and \lstinline$break$ allow useful but restricted control-flow that reduces the need for the \lstinline$goto$ statement for exiting multiple nested control-structures.
+Labeled \lstinline@continue@ and \lstinline@break@ allow useful but restricted control-flow that reduces the need for the \lstinline@goto@ statement for exiting multiple nested control-structures.
 \begin{lstlisting}
 L1: {							// compound
@@ -3513,25 +3515,25 @@
 
 \setcounter{subsubsection}{1}
-\subsubsection{The \lstinline$continue$ statement}
-
-The identifier in a \lstinline$continue$ statement shall name a label located on an enclosing iteration statement.
-
-
-\subsubsection{The \lstinline$break$ statement}
-
-The identifier in a \lstinline$break$ statement shall name a label located on an enclosing compound, selection or iteration statement.
-
-
-\subsubsection{The \lstinline$return$ statement}
-
-An expression in a \lstinline$return$ statement is treated as being cast to the result type of the function.
-
-
-\subsubsection{The \lstinline$throw$ statement}
+\subsubsection[The continue statement]{The \lstinline@continue@ statement}
+
+The identifier in a \lstinline@continue@ statement shall name a label located on an enclosing iteration statement.
+
+
+\subsubsection[The break statement]{The \lstinline@break@ statement}
+
+The identifier in a \lstinline@break@ statement shall name a label located on an enclosing compound, selection or iteration statement.
+
+
+\subsubsection[The return statement]{The \lstinline@return@ statement}
+
+An expression in a \lstinline@return@ statement is treated as being cast to the result type of the function.
+
+
+\subsubsection[The throw statement]{The \lstinline@throw@ statement}
 
 When an exception is raised, \Index{propagation} directs control from a raise in the source execution to a handler in the faulting execution.
 
 
-\subsubsection{The \lstinline$throwResume$ statement}
+\subsubsection[The throwResume statement]{The \lstinline@throwResume@ statement}
 
 
@@ -3540,20 +3542,20 @@
 \begin{syntax}
 \lhs{exception-statement}
-\rhs \lstinline$try$ \nonterm{compound-statement} \nonterm{handler-list}
-\rhs \lstinline$try$ \nonterm{compound-statement} \nonterm{finally-clause}
-\rhs \lstinline$try$ \nonterm{compound-statement} \nonterm{handler-list} \nonterm{finally-clause}
+\rhs \lstinline@try@ \nonterm{compound-statement} \nonterm{handler-list}
+\rhs \lstinline@try@ \nonterm{compound-statement} \nonterm{finally-clause}
+\rhs \lstinline@try@ \nonterm{compound-statement} \nonterm{handler-list} \nonterm{finally-clause}
 \lhs{handler-list}
 \rhs \nonterm{handler-clause}
-\rhs \lstinline$catch$ \lstinline$($ \ldots \lstinline$)$ \nonterm{compound-statement}
-\rhs \nonterm{handler-clause} \lstinline$catch$ \lstinline$($ \ldots \lstinline$)$ \nonterm{compound-statement}
-\rhs \lstinline$catchResume$ \lstinline$($ \ldots \lstinline$)$ \nonterm{compound-statement}
-\rhs \nonterm{handler-clause} \lstinline$catchResume$ \lstinline$($ \ldots \lstinline$)$ \nonterm{compound-statement}
+\rhs \lstinline@catch@ \lstinline@(@ \ldots \lstinline@)@ \nonterm{compound-statement}
+\rhs \nonterm{handler-clause} \lstinline@catch@ \lstinline@(@ \ldots \lstinline@)@ \nonterm{compound-statement}
+\rhs \lstinline@catchResume@ \lstinline@(@ \ldots \lstinline@)@ \nonterm{compound-statement}
+\rhs \nonterm{handler-clause} \lstinline@catchResume@ \lstinline@(@ \ldots \lstinline@)@ \nonterm{compound-statement}
 \lhs{handler-clause}
-\rhs \lstinline$catch$ \lstinline$($ \nonterm{exception-declaration} \lstinline$)$ \nonterm{compound-statement}
-\rhs \nonterm{handler-clause} \lstinline$catch$ \lstinline$($ \nonterm{exception-declaration} \lstinline$)$ \nonterm{compound-statement}
-\rhs \lstinline$catchResume$ \lstinline$($ \nonterm{exception-declaration} \lstinline$)$ \nonterm{compound-statement}
-\rhs \nonterm{handler-clause} \lstinline$catchResume$ \lstinline$($ \nonterm{exception-declaration} \lstinline$)$ \nonterm{compound-statement}
+\rhs \lstinline@catch@ \lstinline@(@ \nonterm{exception-declaration} \lstinline@)@ \nonterm{compound-statement}
+\rhs \nonterm{handler-clause} \lstinline@catch@ \lstinline@(@ \nonterm{exception-declaration} \lstinline@)@ \nonterm{compound-statement}
+\rhs \lstinline@catchResume@ \lstinline@(@ \nonterm{exception-declaration} \lstinline@)@ \nonterm{compound-statement}
+\rhs \nonterm{handler-clause} \lstinline@catchResume@ \lstinline@(@ \nonterm{exception-declaration} \lstinline@)@ \nonterm{compound-statement}
 \lhs{finally-clause}
-\rhs \lstinline$finally$ \nonterm{compound-statement}
+\rhs \lstinline@finally@ \nonterm{compound-statement}
 \lhs{exception-declaration}
 \rhs \nonterm{type-specifier}
@@ -3563,6 +3565,6 @@
 \rhs \nonterm{new-abstract-declarator-tuple}
 \lhs{asynchronous-statement}
-\rhs \lstinline$enable$ \nonterm{identifier-list} \nonterm{compound-statement}
-\rhs \lstinline$disable$ \nonterm{identifier-list} \nonterm{compound-statement}
+\rhs \lstinline@enable@ \nonterm{identifier-list} \nonterm{compound-statement}
+\rhs \lstinline@disable@ \nonterm{identifier-list} \nonterm{compound-statement}
 \end{syntax}
 
@@ -3570,14 +3572,14 @@
 
 
-\subsubsection{The \lstinline$try$ statement}
-
-The \lstinline$try$ statement is a block with associated handlers, called a \Index{guarded block};
+\subsubsection[The try statement]{The \lstinline@try@ statement}
+
+The \lstinline@try@ statement is a block with associated handlers, called a \Index{guarded block};
 all other blocks are \Index{unguarded block}s.
-A \lstinline$goto$, \lstinline$break$, \lstinline$return$, or \lstinline$continue$ statement can be used to transfer control out of a try block or handler, but not into one.
-
-
-\subsubsection{The \lstinline$enable$/\lstinline$disable$ statements}
-
-The \lstinline$enable$/\lstinline$disable$ statements toggle delivery of \Index{asynchronous exception}s.
+A \lstinline@goto@, \lstinline@break@, \lstinline@return@, or \lstinline@continue@ statement can be used to transfer control out of a try block or handler, but not into one.
+
+
+\subsubsection[The enable/disable statements]{The \lstinline@enable@/\lstinline@disable@ statements}
+
+The \lstinline@enable@/\lstinline@disable@ statements toggle delivery of \Index{asynchronous exception}s.
 
 
@@ -3589,9 +3591,9 @@
 \subsection{Predefined macro names}
 
-The implementation shall define the macro names \lstinline$__LINE__$, \lstinline$__FILE__$,
-\lstinline$__DATE__$, and \lstinline$__TIME__$, as in the {\c11} standard.
-It shall not define the macro name \lstinline$__STDC__$.
-
-In addition, the implementation shall define the macro name \lstinline$__CFORALL__$ to be the decimal constant 1.
+The implementation shall define the macro names \lstinline@__LINE__@, \lstinline@__FILE__@,
+\lstinline@__DATE__@, and \lstinline@__TIME__@, as in the {\c11} standard.
+It shall not define the macro name \lstinline@__STDC__@.
+
+In addition, the implementation shall define the macro name \lstinline@__CFORALL__@ to be the decimal constant 1.
 
 
@@ -3610,7 +3612,7 @@
 The pointer, integral, and floating-point types are all \define{scalar types}.
 All of these types can be logically negated and compared.
-The assertion ``\lstinline$scalar( Complex )$'' should be read as ``type \lstinline$Complex$ is scalar''.
-\begin{lstlisting}
-trait scalar( otype T ) {@\impl{scalar}@
+The assertion ``\lstinline@scalar( Complex )@'' should be read as ``type \lstinline@Complex@ is scalar''.
+\begin{lstlisting}
+trait scalar( otype T ) {§\impl{scalar}§
 	int !?( T );
 	int ?<?( T, T ), ?<=?( T, T ), ?==?( T, T ), ?>=?( T, T ), ?>?( T, T ), ?!=?( T, T );
@@ -3622,5 +3624,5 @@
 This is equivalent to inheritance of specifications.
 \begin{lstlisting}
-trait arithmetic( otype T | scalar( T ) ) {@\impl{arithmetic}@@\use{scalar}@
+trait arithmetic( otype T | scalar( T ) ) {§\impl{arithmetic}§§\use{scalar}§
 	T +?( T ), -?( T );
 	T ?*?( T, T ), ?/?( T, T ), ?+?( T, T ), ?-?( T, T );
@@ -3628,8 +3630,8 @@
 \end{lstlisting}
 
-The various flavors of \lstinline$char$ and \lstinline$int$ and the enumerated types make up the
+The various flavors of \lstinline@char@ and \lstinline@int@ and the enumerated types make up the
 \define{integral types}.
 \begin{lstlisting}
-trait integral( otype T | arithmetic( T ) ) {@\impl{integral}@@\use{arithmetic}@
+trait integral( otype T | arithmetic( T ) ) {§\impl{integral}§§\use{arithmetic}§
 	T ~?( T );
 	T ?&?( T, T ), ?|?( T, T ), ?^?( T, T );
@@ -3645,5 +3647,5 @@
 The only operation that can be applied to all modifiable lvalues is simple assignment.
 \begin{lstlisting}
-trait m_lvalue( otype T ) {@\impl{m_lvalue}@
+trait m_lvalue( otype T ) {§\impl{m_lvalue}§
 	T ?=?( T *, T );
 };
@@ -3655,6 +3657,6 @@
 Scalars can also be incremented and decremented.
 \begin{lstlisting}
-trait m_l_scalar( otype T | scalar( T ) | m_lvalue( T ) ) {@\impl{m_l_scalar}@
-	T ?++( T * ), ?--( T * );@\use{scalar}@@\use{m_lvalue}@
+trait m_l_scalar( otype T | scalar( T ) | m_lvalue( T ) ) {§\impl{m_l_scalar}§
+	T ?++( T * ), ?--( T * );§\use{scalar}§§\use{m_lvalue}§
 	T ++?( T * ), --?( T * );
 };
@@ -3662,13 +3664,13 @@
 
 Modifiable arithmetic lvalues are both modifiable scalar lvalues and arithmetic.
-Note that this results in the ``inheritance'' of \lstinline$scalar$ along both paths.
-\begin{lstlisting}
-trait m_l_arithmetic( otype T | m_l_scalar( T ) | arithmetic( T ) ) {@\impl{m_l_arithmetic}@
-	T ?/=?( T *, T ), ?*=?( T *, T );@\use{m_l_scalar}@@\use{arithmetic}@
+Note that this results in the ``inheritance'' of \lstinline@scalar@ along both paths.
+\begin{lstlisting}
+trait m_l_arithmetic( otype T | m_l_scalar( T ) | arithmetic( T ) ) {§\impl{m_l_arithmetic}§
+	T ?/=?( T *, T ), ?*=?( T *, T );§\use{m_l_scalar}§§\use{arithmetic}§
 	T ?+=?( T *, T ), ?-=?( T *, T );
 };
-trait m_l_integral( otype T | m_l_arithmetic( T ) | integral( T ) ) {@\impl{m_l_integral}@
-	T ?&=?( T *, T ), ?|=?( T *, T ), ?^=?( T *, T );@\use{m_l_arithmetic}@
-	T ?%=?( T *, T ), ?<<=?( T *, T ), ?>>=?( T *, T );@\use{integral}@
+trait m_l_integral( otype T | m_l_arithmetic( T ) | integral( T ) ) {§\impl{m_l_integral}§
+	T ?&=?( T *, T ), ?|=?( T *, T ), ?^=?( T *, T );§\use{m_l_arithmetic}§
+	T ?%=?( T *, T ), ?<<=?( T *, T ), ?>>=?( T *, T );§\use{integral}§
 };
 \end{lstlisting}
@@ -3678,19 +3680,19 @@
 
 Array types can barely be said to exist in {\c11}, since in most cases an array name is treated as a constant pointer to the first element of the array, and the subscript expression
-``\lstinline$a[i]$'' is equivalent to the dereferencing expression ``\lstinline$(*( a+( i )))$''.
-Technically, pointer arithmetic and pointer comparisons other than ``\lstinline$==$'' and
-``\lstinline$!=$'' are only defined for pointers to array elements, but the type system does not enforce those restrictions.
+``\lstinline@a[i]@'' is equivalent to the dereferencing expression ``\lstinline@(*( a+( i )))@''.
+Technically, pointer arithmetic and pointer comparisons other than ``\lstinline@==@'' and
+``\lstinline@!=@'' are only defined for pointers to array elements, but the type system does not enforce those restrictions.
 Consequently, there is no need for a separate ``array type'' specification.
 
 Pointer types are scalar types.
-Like other scalar types, they have ``\lstinline$+$'' and
-``\lstinline$-$'' operators, but the types do not match the types of the operations in
-\lstinline$arithmetic$, so these operators cannot be consolidated in \lstinline$scalar$.
-\begin{lstlisting}
-trait pointer( type P | scalar( P ) ) {@\impl{pointer}@@\use{scalar}@
+Like other scalar types, they have ``\lstinline@+@'' and
+``\lstinline@-@'' operators, but the types do not match the types of the operations in
+\lstinline@arithmetic@, so these operators cannot be consolidated in \lstinline@scalar@.
+\begin{lstlisting}
+trait pointer( type P | scalar( P ) ) {§\impl{pointer}§§\use{scalar}§
 	P ?+?( P, long int ), ?+?( long int, P ), ?-?( P, long int );
 	ptrdiff_t ?-?( P, P );
 };
-trait m_l_pointer( type P | pointer( P ) | m_l_scalar( P ) ) {@\impl{m_l_pointer}@
+trait m_l_pointer( type P | pointer( P ) | m_l_scalar( P ) ) {§\impl{m_l_pointer}§
 	P ?+=?( P *, long int ), ?-=?( P *, long int );
 	P ?=?( P *, void * );
@@ -3701,43 +3703,43 @@
 Specifications that define the dereference operator ( or subscript operator ) require two parameters, one for the pointer type and one for the pointed-at ( or element ) type.
 Different specifications are needed for each set of \Index{type qualifier}s, because qualifiers are not included in types.
-The assertion ``\lstinline$|ptr_to( Safe_pointer, int )$'' should be read as
-``\lstinline$Safe_pointer$ acts like a pointer to \lstinline$int$''.
-\begin{lstlisting}
-trait ptr_to( otype P | pointer( P ), otype T ) {@\impl{ptr_to}@@\use{pointer}@
+The assertion ``\lstinline@|ptr_to( Safe_pointer, int )@'' should be read as
+``\lstinline@Safe_pointer@ acts like a pointer to \lstinline@int@''.
+\begin{lstlisting}
+trait ptr_to( otype P | pointer( P ), otype T ) {§\impl{ptr_to}§§\use{pointer}§
 	lvalue T *?( P );
 	lvalue T ?[?]( P, long int );
 };
-trait ptr_to_const( otype P | pointer( P ), otype T ) {@\impl{ptr_to_const}@
+trait ptr_to_const( otype P | pointer( P ), otype T ) {§\impl{ptr_to_const}§
 	const lvalue T *?( P );
-	const lvalue T ?[?]( P, long int );@\use{pointer}@
+	const lvalue T ?[?]( P, long int );§\use{pointer}§
 };
-trait ptr_to_volatile( otype P | pointer( P ), otype T ) }@\impl{ptr_to_volatile}@
+trait ptr_to_volatile( otype P | pointer( P ), otype T ) }§\impl{ptr_to_volatile}§
 	volatile lvalue T *?( P );
-	volatile lvalue T ?[?]( P, long int );@\use{pointer}@
+	volatile lvalue T ?[?]( P, long int );§\use{pointer}§
 };
-trait ptr_to_const_volatile( otype P | pointer( P ), otype T ) }@\impl{ptr_to_const_volatile}@
-	const volatile lvalue T *?( P );@\use{pointer}@
+trait ptr_to_const_volatile( otype P | pointer( P ), otype T ) }§\impl{ptr_to_const_volatile}§
+	const volatile lvalue T *?( P );§\use{pointer}§
 	const volatile lvalue T ?[?]( P, long int );
 };
 \end{lstlisting}
 
-Assignment to pointers is more complicated than is the case with other types, because the target's type can have extra type qualifiers in the pointed-at type: a ``\lstinline$T *$'' can be assigned to a ``\lstinline$const T *$'', a ``\lstinline$volatile T *$'', and a ``\lstinline$const volatile T *$''.
+Assignment to pointers is more complicated than is the case with other types, because the target's type can have extra type qualifiers in the pointed-at type: a ``\lstinline@T *@'' can be assigned to a ``\lstinline@const T *@'', a ``\lstinline@volatile T *@'', and a ``\lstinline@const volatile T *@''.
 Again, the pointed-at type is passed in, so that assertions can connect these specifications to the
-``\lstinline$ptr_to$'' specifications.
-\begin{lstlisting}
-trait m_l_ptr_to( otype P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to}@ otype T | ptr_to( P, T )@\use{ptr_to}@ {
+``\lstinline@ptr_to@'' specifications.
+\begin{lstlisting}
+trait m_l_ptr_to( otype P | m_l_pointer( P ),§\use{m_l_pointer}§§\impl{m_l_ptr_to}§ otype T | ptr_to( P, T )§\use{ptr_to}§ {
 	P ?=?( P *, T * );
 	T * ?=?( T **, P );
 };
-trait m_l_ptr_to_const( otype P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_const}@ otype T | ptr_to_const( P, T )@\use{ptr_to_const}@) {
+trait m_l_ptr_to_const( otype P | m_l_pointer( P ),§\use{m_l_pointer}§§\impl{m_l_ptr_to_const}§ otype T | ptr_to_const( P, T )§\use{ptr_to_const}§) {
 	P ?=?( P *, const T * );
 	const T * ?=?( const T **, P );
 };
-trait m_l_ptr_to_volatile( otype P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_volatile}@ otype T | ptr_to_volatile( P, T )) {@\use{ptr_to_volatile}@
+trait m_l_ptr_to_volatile( otype P | m_l_pointer( P ),§\use{m_l_pointer}§§\impl{m_l_ptr_to_volatile}§ otype T | ptr_to_volatile( P, T )) {§\use{ptr_to_volatile}§
 	P ?=?( P *, volatile T * );
 	volatile T * ?=?( volatile T **, P );
 };
-trait m_l_ptr_to_const_volatile( otype P | ptr_to_const_volatile( P ),@\use{ptr_to_const_volatile}@@\impl{m_l_ptr_to_const_volatile}@
-		otype T | m_l_ptr_to_volatile( P, T ) | m_l_ptr_to_const( P )) {@\use{m_l_ptr_to_const}@@\use{m_l_ptr_to_volatile}@
+trait m_l_ptr_to_const_volatile( otype P | ptr_to_const_volatile( P ),§\use{ptr_to_const_volatile}§§\impl{m_l_ptr_to_const_volatile}§
+		otype T | m_l_ptr_to_volatile( P, T ) | m_l_ptr_to_const( P )) {§\use{m_l_ptr_to_const}§§\use{m_l_ptr_to_volatile}§
 	P ?=?( P *, const volatile T * );
 	const volatile T * ?=?( const volatile T **, P );
@@ -3748,14 +3750,14 @@
 An alternative specification can make use of the fact that qualification of the pointed-at type is part of a pointer type to capture that regularity.
 \begin{lstlisting}
-trait m_l_ptr_like( type MyP | m_l_pointer( MyP ),@\use{m_l_pointer}@@\impl{m_l_ptr_like}@ type CP | m_l_pointer( CP ) ) {
+trait m_l_ptr_like( type MyP | m_l_pointer( MyP ),§\use{m_l_pointer}§§\impl{m_l_ptr_like}§ type CP | m_l_pointer( CP ) ) {
 	MyP ?=?( MyP *, CP );
 	CP ?=?( CP *, MyP );
 };
 \end{lstlisting}
-The assertion ``\lstinline$| m_l_ptr_like( Safe_ptr, const int * )$'' should be read as
-``\lstinline$Safe_ptr$ is a pointer type like \lstinline$const int *$''.
+The assertion ``\lstinline@| m_l_ptr_like( Safe_ptr, const int * )@'' should be read as
+``\lstinline@Safe_ptr@ is a pointer type like \lstinline@const int *@''.
 This specification has two defects, compared to the original four: there is no automatic assertion that dereferencing a
-\lstinline$MyP$ produces an lvalue of the type that \lstinline$CP$ points at, and the
-``\lstinline$|m_l_pointer( CP )$'' assertion provides only a weak assurance that the argument passed to \lstinline$CP$ really is a pointer type.
+\lstinline@MyP@ produces an lvalue of the type that \lstinline@CP@ points at, and the
+``\lstinline@|m_l_pointer( CP )@'' assertion provides only a weak assurance that the argument passed to \lstinline@CP@ really is a pointer type.
 
 
@@ -3763,6 +3765,6 @@
 
 Different operators often have related meanings;
-for instance, in C, ``\lstinline$+$'',
-``\lstinline$+=$'', and the two versions of ``\lstinline$++$'' perform variations of addition.
+for instance, in C, ``\lstinline@+@'',
+``\lstinline@+=@'', and the two versions of ``\lstinline@++@'' perform variations of addition.
 Languages like {\CC} and Ada allow programmers to define operators for new types, but do not require that these relationships be preserved, or even that all of the operators be implemented.
 Completeness and consistency is left to the good taste and discretion of the programmer.
@@ -3777,7 +3779,7 @@
 The different comparison operators have obvious relationships, but there is no obvious subset of the operations to use in the implementation of the others.
 However, it is usually convenient to implement a single comparison function that returns a negative integer, 0, or a positive integer if its first argument is respectively less than, equal to, or greater than its second argument;
-the library function \lstinline$strcmp$ is an example.
-
-C and \CFA have an extra, non-obvious comparison operator: ``\lstinline$!$'', logical negation, returns 1 if its operand compares equal to 0, and 0 otherwise.
+the library function \lstinline@strcmp@ is an example.
+
+C and \CFA have an extra, non-obvious comparison operator: ``\lstinline@!@'', logical negation, returns 1 if its operand compares equal to 0, and 0 otherwise.
 \begin{lstlisting}
 trait comparable( otype T ) {
@@ -3828,11 +3830,9 @@
 
 Note that, although an arithmetic type would certainly provide comparison functions, and an integral type would provide arithmetic operations, there does not have to be any relationship among
-\lstinline$int_base$, \lstinline$arith_base$ and \lstinline$comparable$.
+\lstinline@int_base@, \lstinline@arith_base@ and \lstinline@comparable@.
 Note also that these declarations provide guidance and assistance, but they do not define an absolutely minimal set of requirements.
-A truly minimal implementation of an arithmetic type might only provide
-\lstinline$0$, \lstinline$1$, and \lstinline$?-=?$, which would be used by polymorphic
-\lstinline$?+=?$, \lstinline$?*=?$, and \lstinline$?/=?$ functions.
-
-Note also that \lstinline$short$ is an integer type in C11 terms, but has no operations!
+A truly minimal implementation of an arithmetic type might only provide \lstinline@0@, \lstinline@1@, and \lstinline@?-=?@, which would be used by polymorphic \lstinline@?+=?@, \lstinline@?*=?@, and \lstinline@?/=?@ functions.
+
+Note also that \lstinline@short@ is an integer type in C11 terms, but has no operations!
 
 
@@ -3841,6 +3841,6 @@
 
 Restrict allowed to qualify anything, or type/dtype parameters, but only affects pointers.
-This gets into \lstinline$noalias$ territory.
-Qualifying anything (``\lstinline$short restrict rs$'') means pointer parameters of \lstinline$?++$, etc, would need restrict qualifiers.
+This gets into \lstinline@noalias@ territory.
+Qualifying anything (``\lstinline@short restrict rs@'') means pointer parameters of \lstinline@?++@, etc, would need restrict qualifiers.
 
 Enumerated types.
@@ -3852,5 +3852,5 @@
 Color, enum Color ) really make sense? ?++ does, but it adds (int)1.
 
-Operators on {,signed,unsigned} char and other small types. ?<? harmless;
+Operators on {,signed,unsigned} char and other small types. \lstinline@?<?@ harmless;
 ?*? questionable for chars.
 Generic selections make these choices visible.
@@ -3858,7 +3858,7 @@
 ``promotion'' function?
 
-\lstinline$register$ assignment might be handled as assignment to a temporary with copying back and forth, but copying must not be done by assignment.
-
-Don't use ptrdiff\_t by name in the predefineds.
+\lstinline@register@ assignment might be handled as assignment to a temporary with copying back and forth, but copying must not be done by assignment.
+
+Don't use \lstinline@ptrdiff_t@ by name in the predefineds.
 
 Polymorphic objects.
Index: doc/user/user.tex
===================================================================
--- doc/user/user.tex	(revision 540de412b77591cc4fdbb16932060ef6229a3f1d)
+++ doc/user/user.tex	(revision fbfde8435d0e43f43b9de0e5a9cd67aa994139a5)
@@ -11,9 +11,15 @@
 %% Created On       : Wed Apr  6 14:53:29 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Thu Apr 21 08:15:37 2016
-%% Update Count     : 131
+%% Last Modified On : Sat Apr 30 13:54:32 2016
+%% Update Count     : 221
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 % requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended
+
+% red highlighting ®...® (registered trademark sumbol)
+% blue highlighting ©...© (copyright symbol)
+% latex escape §...§ (section symbol)
+% keyword escape ¶...¶ (pilcrow symbol)
+% math escape $...$ (dollar symbol)
 
 \documentclass[openright,twoside]{article}
@@ -226,28 +232,22 @@
 
 
-\section{Compiling \CFA Program}
+\section[Compiling CFA Program]{Compiling \CFA Program}
 
 The command \lstinline@cfa@ is used to compile \CFA program(s).
 This command works like the GNU \lstinline@gcc@\index{gcc} command, e.g.:
 \begin{lstlisting}
-cfa [ gcc-options ] C/@{\CFA}@-files [ assembler/loader-files ]
-\end{lstlisting}
-\index{cfa@\lstinline$cfa$}\index{compilation!cfa@\lstinline$cfa$}
+cfa [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ]
+\end{lstlisting}
+\indexc{cfa}\index{compilation!cfa@\lstinline$cfa$}
 By default, \CFA programs having the following \lstinline@gcc@ flags turned on:
 \begin{description}
-\item
-\hspace*{-4pt}\lstinline@-std=gnu99@
-\index{-std=gnu99@{\lstinline$-std=gnu99$}}\index{compilation option!-std=gnu99@{\lstinline$-std=gnu99$}}
+\item\hspace*{-4pt}\Indexc{-std=gnu99}\index{compilation option!-std=gnu99@{\lstinline$-std=gnu99$}}
 The 1999 C standard plus GNU extensions.
-\item
-\hspace*{-4pt}\lstinline@-fgnu89-inline@
-\index{-fgnu89-inline@{\lstinline$-fgnu89-inline$}}\index{compilation option!-fgnu89-inline@{\lstinline$-fgnu89-inline$}}
+\item\hspace*{-4pt}\Indexc{-fgnu89-¶inline¶}\index{compilation option!-fgnu89-inline@{\lstinline$-fgnu89-¶inline¶$}}
 Use the traditional GNU semantics for inline routines in C99 mode.
 \end{description}
 The following new \CFA option is available:
 \begin{description}
-\item
-\hspace*{-4pt}\lstinline@-CFA@
-\index{-CFA@{\lstinline$-CFA$}}\index{compilation option!-CFA@{\lstinline$-CFA$}}
+\item\hspace*{-4pt}\Indexc{-CFA}\index{compilation option!-CFA@{\lstinline$-CFA$}}
 Only the C preprocessor and the \CFA translator steps are performed and the transformed program is written to standard output, which makes it possible to examine the code generated by the \CFA translator.
 \end{description}
@@ -255,24 +255,16 @@
 The following preprocessor variables are available:
 \begin{description}
-\item
-\hspace*{-4pt}\lstinline$__CFA__$
-\index{__CFA__@{\lstinline$__CFA__$}}\index{preprocessor variables!__CFA__@{\lstinline$__CFA__$}}
+\item\hspace*{-4pt}\Indexc{__CFA__}\index{preprocessor variables!__CFA__@{\lstinline$__CFA__$}}
 is always available during preprocessing and its value is the current major \Index{version number} of \CFA.\footnote{
 The C preprocessor allows only integer values in a preprocessor variable so a value like ``\Version'' is not allowed.
 Hence, the need to have three variables for the major, minor and patch version number.}
 
-\item
-\hspace*{-4pt}\lstinline$__CFA_MINOR__$
-\index{__CFA_MINOR__@{\lstinline$__CFA_MINOR__$}}\index{preprocessor variables!__CFA_MINOR__@{\lstinline$__CFA_MINOR__$}}
+\item\hspace*{-4pt}\Indexc{__CFA_MINOR__}\index{preprocessor variables!__CFA_MINOR__@{\lstinline$__CFA_MINOR__$}}
 is always available during preprocessing and its value is the current minor \Index{version number} of \CFA.
 
-\item
-\hspace*{-4pt}\lstinline$__CFA_PATCH__$
-\index{__CFA_PATCH__@%(__CFA_PATCH__%)}\index{preprocessor variables!__CFA_PATCH__@%(__CFA_PATCH__%)}
+\item\hspace*{-4pt}\Indexc{__CFA_PATCH__}\index{preprocessor variables!__CFA_PATCH__@\lstinline$__CFA_PATCH__$}
 is always available during preprocessing and its value is the current patch \Index{version number} of \CFA.
 
-\item
-\hspace*{-4pt}\lstinline$__CFORALL__$
-\index{__CFORALL__@%(__CFORALL__%)}\index{preprocessor variables!__CFORALL__@%(__CFORALL__%)}
+\item\hspace*{-4pt}\Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@\lstinline$__CFORALL__$}
 is always available during preprocessing and it has no value.
 \end{description}
@@ -282,7 +274,7 @@
 \begin{lstlisting}
 #ifndef __CFORALL__
-#include <stdio.h>		// C header file
+#include <stdio.h>			// C header file
 #else
-#include <fstream>		// @\CFA{}@ header file
+#include <fstream>			// §\CFA{}§ header file
 #endif
 \end{lstlisting}
@@ -294,5 +286,5 @@
 Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, e.g.:
 \begin{lstlisting}
-2`_`147`_`483`_`648;				// decimal constant
+2®_®147®_®483®_®648;				// decimal constant
 56_ul;						// decimal unsigned long constant
 0_377;						// octal constant
@@ -360,5 +352,5 @@
 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
 \begin{lstlisting}
-`* int x, y;`
+®* int x, y;®
 \end{lstlisting}
 &
@@ -488,6 +480,6 @@
 The point of the new syntax is to allow returning multiple values from a routine~\cite{CLU,Galletly96}, e.g.:
 \begin{lstlisting}
-`[ int o1, int o2, char o3 ]` f( int i1, char i2, char i3 ) {
-	@\emph{routine body}@
+®[ int o1, int o2, char o3 ]® f( int i1, char i2, char i3 ) {
+	§\emph{routine body}§
 }
 \end{lstlisting}
@@ -500,10 +492,10 @@
 Declaration qualifiers can only appear at the start of a routine definition, e.g.:
 \begin{lstlisting}
-extern [ int x ] g( int y ) {@\,@}
+extern [ int x ] g( int y ) {§\,§}
 \end{lstlisting}
 Lastly, if there are no output parameters or input parameters, the brackets and/or parentheses must still be specified;
 in both cases the type is assumed to be void as opposed to old style C defaults of int return type and unknown parameter types, respectively, as in:
 \begin{lstlisting}
-[@\,@] g(@\,@);				// no input or output parameters
+[§\,§] g();						// no input or output parameters
 [ void ] g( void );			// no input or output parameters
 \end{lstlisting}
@@ -556,7 +548,7 @@
 Because the value in the return variable is automatically returned when a \CFA routine terminates, the \lstinline@return@ statement \emph{does not} contain an expression, as in:
 \begin{lstlisting}
-`[ int x ]` f() {
+®[ int x ]® f() {
 	... x = 0; ... x = y; ...
-	`return;` // implicitly return x
+	®return;® // implicitly return x
 }
 \end{lstlisting}
@@ -781,5 +773,5 @@
 \subsection{Type Nesting}
 
-\CFA allows \Index{type nesting}, and type qualification of the nested types, where as C hoists\index{type!hoisting} (refactors) nested types into the enclosing scope and has no type qualification.
+\CFA allows \Index{type nesting}, and type qualification of the nested types, where as C hoists\index{type hoisting} (refactors) nested types into the enclosing scope and has no type qualification.
 \begin{quote2}
 \begin{tabular}{@{}l@{\hspace{30pt}}l|l@{}}
@@ -836,8 +828,8 @@
 
 int fred() {
-	s.t.c = `S.`R;	// type qualification
-	struct `S.`T t = { `S.`R, 1, 2 };
-	enum `S.`C c;
-	union `S.T.`U u;
+	s.t.c = ®S.®R;	// type qualification
+	struct ®S.®T t = { ®S.®R, 1, 2 };
+	enum ®S.®C c;
+	union ®S.T.®U u;
 }
 \end{lstlisting}
@@ -863,5 +855,5 @@
 qsort( ia, size );		// sort ascending order using builtin ?<?
 {
-	`int ?<?( int x, int y ) { return x > y; }` // nested routine
+	®int ?<?( int x, int y ) { return x > y; }® // nested routine
 	qsort( ia, size );	// sort descending order by local redefinition
 }
@@ -873,8 +865,8 @@
 \begin{lstlisting}
 [* [int]( int )] foo() {		// int (*foo())( int )
-	int `i` = 7;
+	int ®i® = 7;
 	int bar( int p ) {
-		`i` += 1;					// dependent on local variable
-		sout | `i` | endl;
+		®i® += 1;					// dependent on local variable
+		sout | ®i® | endl;
 	}
 	return bar;					// undefined because of local dependence
@@ -897,5 +889,5 @@
 The general syntax of a tuple is:
 \begin{lstlisting}
-[ $\emph{exprlist}$ ]
+[ §\emph{exprlist}§ ]
 \end{lstlisting}
 where \lstinline@$\emph{exprlist}$@ is a list of one or more expressions separated by commas.
@@ -917,5 +909,5 @@
 The general syntax of a tuple type is:
 \begin{lstlisting}
-[ @\emph{typelist}@ ]
+[ §\emph{typelist}§ ]
 \end{lstlisting}
 where \lstinline@$\emph{typelist}$@ is a list of one or more legal \CFA or C type specifications separated by commas, which may include other tuple type specifications.
@@ -1047,7 +1039,7 @@
 Mass assignment has the following form:
 \begin{lstlisting}
-[ @\emph{lvalue}@, ..., @\emph{lvalue}@ ] = @\emph{expr}@;
-\end{lstlisting}
-The left-hand side is a tuple of \lstinline@$\emph{lvalues}$@, which is a list of expressions each yielding an address, i.e., any data object that can appear on the left-hand side of a conventional assignment statement.
+[ §\emph{lvalue}§, ..., §\emph{lvalue}§ ] = §\emph{expr}§;
+\end{lstlisting}
+The left-hand side is a tuple of \emph{lvalues}, which is a list of expressions each yielding an address, i.e., any data object that can appear on the left-hand side of a conventional assignment statement.
 \lstinline@$\emph{expr}$@ is any standard arithmetic expression.
 Clearly, the types of the entities being assigned must be type compatible with the value of the expression.
@@ -1086,8 +1078,8 @@
 Multiple assignment has the following form:
 \begin{lstlisting}
-[ @\emph{lvalue}@, . . ., @\emph{lvalue}@ ] = [ @\emph{expr}@, . . ., @\emph{expr}@ ];
-\end{lstlisting}
-The left-hand side is a tuple of \lstinline@$\emph{lvalues}$@, and the right-hand side is a tuple of \lstinline@$\emph{expr}$@s.
-Each \lstinline@$\emph{expr}$@ appearing on the righthand side of a multiple assignment statement is assigned to the corresponding \lstinline@$\emph{lvalues}$@ on the left-hand side of the statement using parallel semantics for each assignment.
+[ §\emph{lvalue}§, . . ., §\emph{lvalue}§ ] = [ §\emph{expr}§, . . ., §\emph{expr}§ ];
+\end{lstlisting}
+The left-hand side is a tuple of \emph{lvalues}, and the right-hand side is a tuple of \emph{expr}s.
+Each \emph{expr} appearing on the righthand side of a multiple assignment statement is assigned to the corresponding \emph{lvalues} on the left-hand side of the statement using parallel semantics for each assignment.
 An example of multiple assignment is:
 \begin{lstlisting}
@@ -1126,5 +1118,5 @@
 Cascade assignment has the following form:
 \begin{lstlisting}
-@\emph{tuple}@ = @\emph{tuple}@ = ... = @\emph{tuple}@;
+§\emph{tuple}§ = §\emph{tuple}§ = ... = §\emph{tuple}§;
 \end{lstlisting}
 and it has the same parallel semantics as for mass and multiple assignment.
@@ -1144,9 +1136,9 @@
 Its general form is:
 \begin{lstlisting}
-@\emph{expr}@ . [ @\emph{fieldlist}@ ]
-@\emph{expr}@ -> [ @\emph{fieldlist}@ ]
-\end{lstlisting}
-\lstinline@$\emph{expr}$@ is any expression yielding a value of type record, e.g., \lstinline@struct@, \lstinline@union@.
-Each element of \lstinline@$\emph{ fieldlist}$@ is an element of the record specified by \lstinline@$\emph{expr}$@.
+§\emph{expr}§ . [ §\emph{fieldlist}§ ]
+§\emph{expr}§ -> [ §\emph{fieldlist}§ ]
+\end{lstlisting}
+\emph{expr} is any expression yielding a value of type record, e.g., \lstinline@struct@, \lstinline@union@.
+Each element of \emph{ fieldlist} is an element of the record specified by \emph{expr}.
 A record-field tuple may be used anywhere a tuple can be used. An example of the use of a record-field tuple is
 the following:
@@ -1188,10 +1180,10 @@
 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
 \begin{lstlisting}
-`L1:` for ( ... ) {
-	`L2:` for ( ... ) {
-		`L3:` for ( ... ) {
-			... break `L1`; ...
-			... break `L2`; ...
-			... break `L3`; // or break
+®L1:® for ( ... ) {
+	®L2:® for ( ... ) {
+		®L3:® for ( ... ) {
+			... break ®L1®; ...
+			... break ®L2®; ...
+			... break ®L3®; // or break
 		}
 	}
@@ -1218,10 +1210,10 @@
 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
 \begin{lstlisting}
-`L1`: for ( ... ) {
-	`L2`: for ( ... ) {
-		`L3`: for ( ... ) {
-			... continue `L1`; ...
-			... continue `L2`; ...
-			... continue `L3`; ...
+®L1®: for ( ... ) {
+	®L2®: for ( ... ) {
+		®L3®: for ( ... ) {
+			... continue ®L1®; ...
+			... continue ®L2®; ...
+			... continue ®L3®; ...
 
 		}
@@ -1459,7 +1451,7 @@
 \begin{lstlisting}
 switch ( i ) {
-  `case 1, 3, 5`:
+  ®case 1, 3, 5®:
 	...
-  `case 2, 4, 6`:
+  ®case 2, 4, 6®:
 	...
 }
@@ -1491,7 +1483,7 @@
 \begin{lstlisting}
 switch ( i ) {
-  `case 1~5:`
+  ®case 1~5:®
 	...
-  `case 10~15:`
+  ®case 10~15:®
 	...
 }
@@ -2048,9 +2040,9 @@
 For example, given
 \begin{lstlisting}
-auto j = `...`
+auto j = ®...®
 \end{lstlisting}
 and the need to write a routine to compute using \lstinline@j@
 \begin{lstlisting}
-void rtn( `...` parm );
+void rtn( ®...® parm );
 rtn( j );
 \end{lstlisting}
@@ -2372,9 +2364,9 @@
 To make this work, a space is required after the field selection:
 \begin{lstlisting}
-`s.@\textvisiblespace@0` = 0;
-`s.@\textvisiblespace@1` = 1;
+®s.§\textvisiblespace§0® = 0;
+®s.§\textvisiblespace§1® = 1;
 \end{lstlisting}
 While this sytact is awkward, it is unlikely many programers will name fields of a structure 0 or 1.
-Like the \CC lexical problem with closing template-syntax, e.g, \lstinline@Foo<Bar<int`>>`@, this issue can be solved with a more powerful lexer/parser.
+Like the \CC lexical problem with closing template-syntax, e.g, \lstinline@Foo<Bar<int®>>®@, this issue can be solved with a more powerful lexer/parser.
 
 There are several ambiguous cases with operator identifiers, e.g., \lstinline@int *?*?()@, where the string \lstinline@*?*?@ can be lexed as \lstinline@*@/\lstinline@?*?@ or \lstinline@*?@/\lstinline@*?@.
@@ -2383,6 +2375,6 @@
 The first case is for the function-call identifier \lstinline@?()@:
 \begin{lstlisting}
-int *@\textvisiblespace@?()();	// declaration: space required after '*'
-*@\textvisiblespace@?()();		// expression: space required after '*'
+int *§\textvisiblespace§?()();	// declaration: space required after '*'
+*§\textvisiblespace§?()();		// expression: space required after '*'
 \end{lstlisting}
 Without the space, the string \lstinline@*?()@ is ambiguous without N character look ahead;
@@ -2391,8 +2383,8 @@
 The 4 remaining cases occur in expressions:
 \begin{lstlisting}
-i++@\textvisiblespace@?i:0;		// space required before '?'
-i--@\textvisiblespace@?i:0;		// space required before '?'
-i@\textvisiblespace@?++i:0;		// space required after '?'
-i@\textvisiblespace@?--i:0;		// space required after '?'
+i++§\textvisiblespace§?i:0;		// space required before '?'
+i--§\textvisiblespace§?i:0;		// space required before '?'
+i§\textvisiblespace§?++i:0;		// space required after '?'
+i§\textvisiblespace§?--i:0;		// space required after '?'
 \end{lstlisting}
 In the first two cases, the string \lstinline@i++?@ is ambiguous, where this string can be lexed as \lstinline@i@ / \lstinline@++?@ or \lstinline@i++@ / \lstinline@?@;
@@ -3325,5 +3317,5 @@
 
 
-\subsection{Comparing Key Features of \CFA}
+\subsection[Comparing Key Features of CFA]{Comparing Key Features of \CFA}
 
 
@@ -3699,5 +3691,5 @@
 
 \begin{comment}
-\subsubsection{Modules/Packages}
+\subsubsection{Modules / Packages}
 
 \begin{lstlisting}
@@ -3941,5 +3933,5 @@
 
 
-\subsubsection{\CC}
+\subsubsection[C++]{\CC}
 
 \CC is a general-purpose programming language.
@@ -4079,5 +4071,4 @@
 Given that nested types in C are equivalent to not using them, i.e., they are essentially useless, it is unlikely there are any realistic usages that break because of this incompatibility.
 
-
 \item
 Change: In C++, the name of a nested class is local to its enclosing class.
@@ -4090,14 +4081,8 @@
 struct Y yy; // valid C, invalid C++
 \end{lstlisting}
-Rationale: C++ classes have member functions which require that classes establish scopes. The C rule
-would leave classes as an incomplete scope mechanism which would prevent C++ programmers from maintaining
-locality within a class. A coherent set of scope rules for C++ based on the C rule would be very
-complicated and C++ programmers would be unable to predict reliably the meanings of nontrivial examples
-involving nested or local functions.
-Effect on original feature: Change of semantics of welldefined
-feature.
-Difficulty of converting: Semantic transformation. To make the struct type name visible in the scope of
-the enclosing struct, the struct tag could be declared in the scope of the enclosing struct, before the enclosing
-struct is defined. Example:
+Rationale: C++ classes have member functions which require that classes establish scopes.
+The C rule would leave classes as an incomplete scope mechanism which would prevent C++ programmers from maintaining locality within a class. A coherent set of scope rules for C++ based on the C rule would be very complicated and C++ programmers would be unable to predict reliably the meanings of nontrivial examples involving nested or local functions.
+Effect on original feature: Change of semantics of welldefined feature.
+Difficulty of converting: Semantic transformation. To make the struct type name visible in the scope of the enclosing struct, the struct tag could be declared in the scope of the enclosing struct, before the enclosing struct is defined. Example:
 \begin{lstlisting}
 struct Y; // struct Y and struct X are at the same scope
@@ -4106,7 +4091,6 @@
 };
 \end{lstlisting}
-All the definitions of C struct types enclosed in other struct definitions and accessed outside the scope of
-the enclosing struct could be exported to the scope of the enclosing struct. Note: this is a consequence of
-the difference in scope rules, which is documented in 3.3.
+All the definitions of C struct types enclosed in other struct definitions and accessed outside the scope of the enclosing struct could be exported to the scope of the enclosing struct.
+Note: this is a consequence of the difference in scope rules, which is documented in 3.3.
 How widely used: Seldom.
 \end{enumerate}
@@ -4124,5 +4108,5 @@
 \begin{lstlisting}
 int x = 0, y = 1, z = 2;
-`sout` `|` x `|` y `|` z `| endl`;
+®sout® ®|® x ®|® y ®|® z ®| endl®;
 \end{lstlisting}
 &
@@ -4133,5 +4117,5 @@
 \end{tabular}
 \end{quote2}
-The \CFA form is half as many characters, and is similar to Python I/O with respect to implicit separators.
+The \CFA form is half as many characters, and is similar to \Index{Python} I/O with respect to implicit separators.
 
 The logical-or operator is used because it is the lowest-priority overloadable operator, other than assignment.
@@ -4160,5 +4144,5 @@
 A seperator does not appear at the start or end of a line.
 \begin{lstlisting}[belowskip=0pt]
-sout 1 | 2 | 3 | endl;
+sout | 1 | 2 | 3 | endl;
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -4179,19 +4163,19 @@
 which is a local mechanism to disable insertion of the separator character.
 \item
-A seperator does not appear before a C string starting with the \Index{extended ASCII}\index{ASCII} characters: \lstinline[mathescape=off]@([{$£¥¿«@
+A seperator does not appear before a C string starting with the (extended) \Index{ASCII}\index{ASCII!extended} characters: \lstinline[mathescape=off]@([{$£¥¡¿«@
 %$
 \begin{lstlisting}[mathescape=off]
-sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¿" | 7 | "x «" | 8 | endl;
+sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¡" | 7 | "x ¿" | 8 | "x «" | 9 | endl;
 \end{lstlisting}
 %$
 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
-x (1 x [2 x {3 x $4 x £5 x ¥6 x ¿7 x «8
+x (1 x [2 x {3 x $4 x £5 x ¥6 x ¡7 x ¿8 x «9
 \end{lstlisting}
 %$
 \item
-A seperator does not appear after a C string ending with the extended ASCII characters: \lstinline@,.:;!?)]}%¢»@
+A seperator does not appear after a C string ending with the (extended) \Index{ASCII}\index{ASCII!extended} characters: \lstinline@,.:;!?)]}%¢»@
 \begin{lstlisting}[belowskip=0pt]
 sout | 1 | ", x" | 2 | ". x" | 3 | ": x" | 4 | "; x" | 5 | "! x" | 6 | "? x" | 7 | ") x" | 8 | "] x" | 9 | "} x"
-	 | 10 | "% x" | 11 | L"¢ x" | 12 | L"» x" | endl;
+	 | 10 | "% x" | 11 | "¢ x" | 12 | "» x" | endl;
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -4199,14 +4183,10 @@
 \end{lstlisting}
 \item
-A seperator does not appear before or after a C string begining/ending with the characters: \lstinline@\f\n\r\t\v\`'"@
+A seperator does not appear before or after a C string begining/ending with the \Index{ASCII} quote or whitespace characters: \lstinline[showspaces=true]@`'" \t\v\f\r\n@
 \begin{lstlisting}[belowskip=0pt]
-sout | "x '" | 1 | "' x \`" | 2 | "\` x \"" | 3 | "\" x" | endl;
-\end{lstlisting}
-\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
-x '1' x \`2\` x "3" x
-\end{lstlisting}
-\begin{lstlisting}[showtabs=true,aboveskip=0pt]
-sout | "x\t" | 1 | "\tx" | endl;
-x	1	x
+sout | "x`" | 1 | "`x'" | 2 | "'x\"" | 3 | "\"x" | "x " | 4 | " x" | "x\t" | 1 | "\tx" | endl;
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,showspaces=true,showtabs=true,aboveskip=0pt,belowskip=0pt]
+x`1`x'2'x"3"x x 4 x x	1	x
 \end{lstlisting}
 \end{enumerate}
@@ -4240,5 +4220,5 @@
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
-1 2 3
+ 1 2 3
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,aboveskip=0pt,aboveskip=0pt,belowskip=0pt]
@@ -4251,73 +4231,32 @@
 \end{lstlisting}
 %$
-\VRef[Figure]{f:ExampleIO} shows an example of input and output I/O in \CFA.
-
-\begin{figure}
-\begin{lstlisting}[mathescape=off]
+\begin{comment}
 #include <fstream>
 
 int main() {
-	char c;														// basic types
-	short int si;
-	unsigned short int usi;
-	int i;
-	unsigned int ui;
-	long int li;
-	unsigned long int uli;
-	long long int lli;
-	unsigned long long int ulli;
-	float f;
-	double d;
-	long double ld;
-	float _Complex fc;
-	double _Complex dc;
-	long double _Complex ldc;
-	char s1[10], s2[10];
-
-	ifstream in;												// create / open file
-	open( &in, "input.data", "r" );
-
-	&in | &c													// character
-		| &si | &usi | &i | &ui | &li | &uli | &lli | &ulli		// integral
-		| &f | &d | &ld											// floating point
-		| &fc | &dc | &ldc										// floating-point complex
-		| cstr( s1 ) | cstr( s2, 10 );							// C string, length unchecked and checked
-
-	sout | c | ' ' | endl										// character
-		 | si | usi | i | ui | li | uli | lli | ulli | endl		// integral
-		 | f | d | ld | endl									// floating point
-		 | fc | dc | ldc | endl;								// complex
-	sout | endl;
-	sout | f | "" | d | "" | ld | endl							// floating point without separator
-		 | sepDisable | fc | dc | ldc | sepEnable | endl		// complex without separator
-		 | sepOn | s1 | sepOff | s2 | endl						// local separator removal
-		 | s1 | "" | s2 | endl;									// C string withou separator
-	sout | endl;
-	sepSet( sout, ", $" );										// change separator, maximum of 15 characters
-	sout | f | d | ld | endl									// floating point without separator
-		 | fc | dc | ldc | endl									// complex without separator
-		 | s1 | s2 | endl;
-}
-
-$ cat input.data 
-A 1 2 3 4 5 6 7 8 1.1 1.2 1.3 1.1+2.3 1.1-2.3 1.1-2.3 abc xyz
-$ a.out
-A 
-1 2 3 4 5 6 7 8
-1.1 1.2 1.3
-1.1+2.3i 1.1-2.3i 1.1-2.3i
-
-1.11.21.3
-1.1+2.3i1.1-2.3i1.1-2.3i
- abcxyz
-abcxyz
-
-1.1, $1.2, $1.3
-1.1+2.3i, $1.1-2.3i, $1.1-2.3i
-abc, $xyz
-\end{lstlisting}
-\caption{Example I/O}
-\label{f:ExampleIO}
-\end{figure}
+	int x = 3, y = 5, z = 7;
+	sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
+	sout | 1 | 2 | 3 | endl;
+	sout | '1' | '2' | '3' | endl;
+	sout | 1 | "" | 2 | "" | 3 | endl;
+	sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¡" | 7 | "x ¿" | 8 | "x «" | 9 | endl;
+	sout | 1 | ", x" | 2 | ". x" | 3 | ": x" | 4 | "; x" | 5 | "! x" | 6 | "? x" | 7 | ") x" | 8 | "] x" | 9 | "} x"
+		 | 10 | "% x" | 11 | "¢ x" | 12 | "» x" | endl;
+	sout | "x`" | 1 | "`x'" | 2 | "'x\"" | 3 | "\"x" | "x " | 4 | " x" | "x\t" | 1 | "\tx" | endl;
+	sout | sepOn | 1 | 2 | 3 | sepOn | endl;	// separator at start of line
+	sout | 1 | sepOff | 2 | 3 | endl;			// turn off implicit separator temporarily
+	sout | sepDisable | 1 | 2 | 3 | endl;		// turn off implicit separation, affects all subsequent prints
+	sout | 1 | sepOn | 2 | 3 | endl;			// turn on implicit separator temporarily
+	sout | sepEnable | 1 | 2 | 3 | endl;		// turn on implicit separation, affects all subsequent prints
+	sepSet( sout, ", $" );						// change separator from " " to ", $"
+	sout | 1 | 2 | 3 | endl;
+
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
+\end{comment}
+%$
 
 
@@ -4331,13 +4270,13 @@
 
 \begin{lstlisting}
-forall( otype T ) T * malloc( void );
+forall( otype T ) T * malloc( void );§\indexc{malloc}§
 forall( otype T ) T * malloc( char fill );
 forall( otype T ) T * malloc( T * ptr, size_t size );
 forall( otype T ) T * malloc( T * ptr, size_t size, unsigned char fill );
-forall( otype T ) T * calloc( size_t size );
-forall( otype T ) T * realloc( T * ptr, size_t size );
+forall( otype T ) T * calloc( size_t nmemb );§\indexc{calloc}§
+forall( otype T ) T * realloc( T * ptr, size_t size );§\indexc{ato}§
 forall( otype T ) T * realloc( T * ptr, size_t size, unsigned char fill );
 
-forall( otype T ) T * aligned_alloc( size_t alignment );
+forall( otype T ) T * aligned_alloc( size_t alignment );§\indexc{ato}§
 forall( otype T ) T * memalign( size_t alignment );		// deprecated
 forall( otype T ) int posix_memalign( T ** ptr, size_t alignment );
@@ -4348,8 +4287,8 @@
 
 
-\subsection{ato/strto}
-
-\begin{lstlisting}
-int ato( const char * ptr );
+\subsection{ato / strto}
+
+\begin{lstlisting}
+int ato( const char * ptr );§\indexc{ato}§
 unsigned int ato( const char * ptr );
 long int ato( const char * ptr );
@@ -4379,12 +4318,12 @@
 
 
-\subsection{bsearch/qsort}
+\subsection{bsearch / qsort}
 
 \begin{lstlisting}
 forall( otype T | { int ?<?( T, T ); } )
-T * bsearch( const T key, const T * arr, size_t dimension );
+T * bsearch( const T key, const T * arr, size_t dimension );§\indexc{bsearch}§
 
 forall( otype T | { int ?<?( T, T ); } )
-void qsort( const T * arr, size_t dimension );
+void qsort( const T * arr, size_t dimension );§\indexc{qsort}§
 \end{lstlisting}
 
@@ -4393,8 +4332,6 @@
 
 \begin{lstlisting}
-char abs( char );
-extern "C" {
-int abs( int );				// use default C routine for int
-} // extern "C"
+char abs( char );§\indexc{abs}§
+int abs( int );
 long int abs( long int );
 long long int abs( long long int );
@@ -4402,24 +4339,7 @@
 double abs( double );
 long double abs( long double );
-float _Complex abs( float _Complex );
-double _Complex abs( double _Complex );
-long double _Complex abs( long double _Complex );
-\end{lstlisting}
-
-
-\subsection{floor/ceil}
-
-\begin{lstlisting}
-float floor( float );
-extern "C" {
-double floor( double );		// use C routine for double
-} // extern "C"
-long double floor( long double );
-
-float ceil( float );
-extern "C" {
-double ceil( double );		// use C routine for double
-} // extern "C"
-long double ceil( long double );
+float abs( float _Complex );
+double abs( double _Complex );
+long double abs( long double _Complex );
 \end{lstlisting}
 
@@ -4428,6 +4348,6 @@
 
 \begin{lstlisting}
-void rand48seed( long int s );
-char rand48();
+void rand48seed( long int s );§\indexc{rand48seed}§
+char rand48();§\indexc{rand48}§
 int rand48();
 unsigned int rand48();
@@ -4442,15 +4362,378 @@
 
 
-\subsection{min/max/swap}
+\subsection{min / max / swap}
 
 \begin{lstlisting}
 forall( otype T | { int ?<?( T, T ); } )
-T min( const T t1, const T t2 );
+T min( const T t1, const T t2 );§\indexc{min}§
 
 forall( otype T | { int ?>?( T, T ); } )
-T max( const T t1, const T t2 );
+T max( const T t1, const T t2 );§\indexc{max}§
 
 forall( otype T )
-void swap( T * t1, T * t2 );
+void swap( T * t1, T * t2 );§\indexc{swap}§
+\end{lstlisting}
+
+
+\section{Math Library}
+\label{s:Math Library}
+
+The goal of the \CFA math-library is to wrap many of the existing C math library-routines that are explicitly polymorphic into implicitly polymorphic versions.
+
+
+\subsection{General}
+
+\begin{lstlisting}
+float fabs( float );§\indexc{fabs}§
+double fabs( double );
+long double fabs( long double );
+float cabs( float _Complex );
+double cabs( double _Complex );
+long double cabs( long double _Complex );
+
+float ?%?( float, float );§\indexc{fmod}§
+float fmod( float, float );
+double ?%?( double, double );
+double fmod( double, double );
+long double ?%?( long double, long double );
+long double fmod( long double, long double );
+
+float remainder( float, float );§\indexc{remainder}§
+double remainder( double, double );
+long double remainder( long double, long double );
+
+[ int, float ] remquo( float, float );§\indexc{remquo}§
+float remquo( float, float, int * );
+[ int, double ] remquo( double, double );
+double remquo( double, double, int * );
+[ int, long double ] remquo( long double, long double );
+long double remquo( long double, long double, int * );
+
+[ int, float ] div( float, float );						// alternative name for remquo
+float div( float, float, int * );§\indexc{div}§
+[ int, double ] div( double, double );
+double div( double, double, int * );
+[ int, long double ] div( long double, long double );
+long double div( long double, long double, int * );
+
+float fma( float, float, float );§\indexc{fma}§
+double fma( double, double, double );
+long double fma( long double, long double, long double );
+
+float fdim( float, float );§\indexc{fdim}§
+double fdim( double, double );
+long double fdim( long double, long double );
+
+float nan( const char * );§\indexc{nan}§
+double nan( const char * );
+long double nan( const char * );
+\end{lstlisting}
+
+
+\subsection{Exponential}
+
+\begin{lstlisting}
+float exp( float );§\indexc{exp}§
+double exp( double );
+long double exp( long double );
+float _Complex exp( float _Complex );
+double _Complex exp( double _Complex );
+long double _Complex exp( long double _Complex );
+
+float exp2( float );§\indexc{exp2}§
+double exp2( double );
+long double exp2( long double );
+float _Complex exp2( float _Complex );
+double _Complex exp2( double _Complex );
+long double _Complex exp2( long double _Complex );
+
+float expm1( float );§\indexc{expm1}§
+double expm1( double );
+long double expm1( long double );
+
+float log( float );§\indexc{log}§
+double log( double );
+long double log( long double );
+float _Complex log( float _Complex );
+double _Complex log( double _Complex );
+long double _Complex log( long double _Complex );
+
+float log2( float );§\indexc{log2}§
+double log2( double );
+long double log2( long double );
+float _Complex log2( float _Complex );
+double _Complex log2( double _Complex );
+long double _Complex log2( long double _Complex );
+
+float log10( float );§\indexc{log10}§
+double log10( double );
+long double log10( long double );
+float _Complex log10( float _Complex );
+double _Complex log10( double _Complex );
+long double _Complex log10( long double _Complex );
+
+float log1p( float );§\indexc{log1p}§
+double log1p( double );
+long double log1p( long double );
+
+int ilogb( float );§\indexc{ilogb}§
+int ilogb( double );
+int ilogb( long double );
+
+float logb( float );§\indexc{logb}§
+double logb( double );
+long double logb( long double );
+\end{lstlisting}
+
+
+\subsection{Power}
+
+\begin{lstlisting}
+float sqrt( float );§\indexc{sqrt}§
+double sqrt( double );
+long double sqrt( long double );
+float _Complex sqrt( float _Complex );
+double _Complex sqrt( double _Complex );
+long double _Complex sqrt( long double _Complex );
+
+float cbrt( float );§\indexc{cbrt}§
+double cbrt( double );
+long double cbrt( long double );
+
+float hypot( float, float );§\indexc{hypot}§
+double hypot( double, double );
+long double hypot( long double, long double );
+
+float pow( float, float );§\indexc{pow}§
+double pow( double, double );
+long double pow( long double, long double );
+float _Complex pow( float _Complex, float _Complex );
+double _Complex pow( double _Complex, double _Complex );
+long double _Complex pow( long double _Complex, long double _Complex );
+\end{lstlisting}
+
+
+\subsection{Trigonometric}
+
+\begin{lstlisting}
+float sin( float );§\indexc{sin}§
+double sin( double );
+long double sin( long double );
+float _Complex sin( float _Complex );
+double _Complex sin( double _Complex );
+long double _Complex sin( long double _Complex );
+
+float cos( float );§\indexc{cos}§
+double cos( double );
+long double cos( long double );
+float _Complex cos( float _Complex );
+double _Complex cos( double _Complex );
+long double _Complex cos( long double _Complex );
+
+float tan( float );§\indexc{tan}§
+double tan( double );
+long double tan( long double );
+float _Complex tan( float _Complex );
+double _Complex tan( double _Complex );
+long double _Complex tan( long double _Complex );
+
+float asin( float );§\indexc{asin}§
+double asin( double );
+long double asin( long double );
+float _Complex asin( float _Complex );
+double _Complex asin( double _Complex );
+long double _Complex asin( long double _Complex );
+
+float acos( float );§\indexc{acos}§
+double acos( double );
+long double acos( long double );
+float _Complex acos( float _Complex );
+double _Complex acos( double _Complex );
+long double _Complex acos( long double _Complex );
+
+float atan( float );§\indexc{atan}§
+double atan( double );
+long double atan( long double );
+float _Complex atan( float _Complex );
+double _Complex atan( double _Complex );
+long double _Complex atan( long double _Complex );
+
+float atan2( float, float );§\indexc{atan2}§
+double atan2( double, double );
+long double atan2( long double, long double );
+
+float atan( float, float );								// alternative name for atan2
+double atan( double, double );§\indexc{atan}§
+long double atan( long double, long double );
+\end{lstlisting}
+
+
+\subsection{Hyperbolic}
+
+\begin{lstlisting}
+float sinh( float );§\indexc{sinh}§
+double sinh( double );
+long double sinh( long double );
+float _Complex sinh( float _Complex );
+double _Complex sinh( double _Complex );
+long double _Complex sinh( long double _Complex );
+
+float cosh( float );§\indexc{cosh}§
+double cosh( double );
+long double cosh( long double );
+float _Complex cosh( float _Complex );
+double _Complex cosh( double _Complex );
+long double _Complex cosh( long double _Complex );
+
+float tanh( float );§\indexc{tanh}§
+double tanh( double );
+long double tanh( long double );
+float _Complex tanh( float _Complex );
+double _Complex tanh( double _Complex );
+long double _Complex tanh( long double _Complex );
+
+float asinh( float );§\indexc{asinh}§
+double asinh( double );
+long double asinh( long double );
+float _Complex asinh( float _Complex );
+double _Complex asinh( double _Complex );
+long double _Complex asinh( long double _Complex );
+
+float acosh( float );§\indexc{acosh}§
+double acosh( double );
+long double acosh( long double );
+float _Complex acosh( float _Complex );
+double _Complex acosh( double _Complex );
+long double _Complex acosh( long double _Complex );
+
+float atanh( float );§\indexc{atanh}§
+double atanh( double );
+long double atanh( long double );
+float _Complex atanh( float _Complex );
+double _Complex atanh( double _Complex );
+long double _Complex atanh( long double _Complex );
+\end{lstlisting}
+
+
+\subsection{Error / Gamma}
+
+\begin{lstlisting}
+float erf( float );§\indexc{erf}§
+double erf( double );
+long double erf( long double );
+float _Complex erf( float _Complex );
+double _Complex erf( double _Complex );
+long double _Complex erf( long double _Complex );
+
+float erfc( float );§\indexc{erfc}§
+double erfc( double );
+long double erfc( long double );
+float _Complex erfc( float _Complex );
+double _Complex erfc( double _Complex );
+long double _Complex erfc( long double _Complex );
+
+float lgamma( float );§\indexc{lgamma}§
+double lgamma( double );
+long double lgamma( long double );
+float lgamma( float, int * );
+double lgamma( double, int * );
+long double lgamma( long double, int * );
+
+float tgamma( float );§\indexc{tgamma}§
+double tgamma( double );
+long double tgamma( long double );
+\end{lstlisting}
+
+
+\subsection{Nearest Integer}
+
+\begin{lstlisting}
+float floor( float );§\indexc{floor}§
+double floor( double );
+long double floor( long double );
+
+float ceil( float );§\indexc{ceil}§
+double ceil( double );
+long double ceil( long double );
+
+float trunc( float );§\indexc{trunc}§
+double trunc( double );
+long double trunc( long double );
+
+float rint( float );§\indexc{rint}§
+long double rint( long double );
+long int rint( float );
+long int rint( double );
+long int rint( long double );
+long long int rint( float );
+long long int rint( double );
+long long int rint( long double );
+
+long int lrint( float );§\indexc{lrint}§
+long int lrint( double );
+long int lrint( long double );
+long long int llrint( float );
+long long int llrint( double );
+long long int llrint( long double );
+
+float nearbyint( float );§\indexc{nearbyint}§
+double nearbyint( double );
+long double nearbyint( long double );
+
+float round( float );§\indexc{round}§
+long double round( long double );
+long int round( float );
+long int round( double );
+long int round( long double );
+long long int round( float );
+long long int round( double );
+long long int round( long double );
+
+long int lround( float );§\indexc{lround}§
+long int lround( double );
+long int lround( long double );
+long long int llround( float );
+long long int llround( double );
+long long int llround( long double );
+\end{lstlisting}
+
+
+\subsection{Manipulation}
+
+\begin{lstlisting}
+float copysign( float, float );§\indexc{copysign}§
+double copysign( double, double );
+long double copysign( long double, long double );
+
+float frexp( float, int * );§\indexc{frexp}§
+double frexp( double, int * );
+long double frexp( long double, int * );
+
+float ldexp( float, int );§\indexc{ldexp}§
+double ldexp( double, int );
+long double ldexp( long double, int );
+
+[ float, float ] modf( float );§\indexc{modf}§
+float modf( float, float * );
+[ double, double ] modf( double );
+double modf( double, double * );
+[ long double, long double ] modf( long double );
+long double modf( long double, long double * );
+
+float nextafter( float, float );§\indexc{nextafter}§
+double nextafter( double, double );
+long double nextafter( long double, long double );
+
+float nexttoward( float, long double );§\indexc{nexttoward}§
+double nexttoward( double, long double );
+long double nexttoward( long double, long double );
+
+float scalbn( float, int );§\indexc{scalbn}§
+double scalbn( double, int );
+long double scalbn( long double, int );
+
+float scalbln( float, long int );§\indexc{scalbln}§
+double scalbln( double, long int );
+long double scalbln( long double, long int );
 \end{lstlisting}
 
@@ -4464,5 +4747,5 @@
 \begin{lstlisting}
 // implementation
-struct Rational {
+struct Rational {§\indexc{Rational}§
 	long int numerator, denominator;					// invariant: denominator > 0
 }; // Rational
Index: src/examples/io.c
===================================================================
--- src/examples/io.c	(revision 540de412b77591cc4fdbb16932060ef6229a3f1d)
+++ src/examples/io.c	(revision fbfde8435d0e43f43b9de0e5a9cd67aa994139a5)
@@ -11,6 +11,6 @@
 // Created On       : Wed Mar  2 16:56:02 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Apr 13 23:03:14 2016
-// Update Count     : 22
+// Last Modified On : Sat Apr 30 08:34:13 2016
+// Update Count     : 27
 // 
 
@@ -52,5 +52,5 @@
 		 | sepDisable | fc | dc | ldc | sepEnable | endl		// complex without separator
 		 | sepOn | s1 | sepOff | s2 | endl						// local separator removal
-		 | s1 | "" | s2 | endl;									// C string withou separator
+		 | s1 | "" | s2 | endl;									// C string without separator
 	sout | endl;
 
@@ -70,4 +70,5 @@
 		| "£" | 27
 		| "¥" | 27
+		| "¡" | 27
 		| "¿" | 27
 		| "«" | 27
Index: src/libcfa/fstream
===================================================================
--- src/libcfa/fstream	(revision 540de412b77591cc4fdbb16932060ef6229a3f1d)
+++ src/libcfa/fstream	(revision fbfde8435d0e43f43b9de0e5a9cd67aa994139a5)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Apr 19 20:44:10 2016
-// Update Count     : 84
+// Last Modified On : Thu Apr 28 08:08:04 2016
+// Update Count     : 88
 //
 
@@ -22,6 +22,6 @@
 struct ofstream {
 	void *file;
-	int sepDefault;
-	int sepOnOff;
+	_Bool sepDefault;
+	int sepOnOff;										// FIX ME: type should be _Bool
 	char separator[separateSize];
 }; // ofstream
Index: src/libcfa/fstream.c
===================================================================
--- src/libcfa/fstream.c	(revision 540de412b77591cc4fdbb16932060ef6229a3f1d)
+++ src/libcfa/fstream.c	(revision fbfde8435d0e43f43b9de0e5a9cd67aa994139a5)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Thu Apr 14 17:04:24 2016
-// Update Count     : 176
+// Last Modified On : Mon May 02 15:14:52 2016
+// Update Count     : 187
 //
 
@@ -93,5 +93,4 @@
 int prtfmt( ofstream * os, const char fmt[], ... ) {
     va_list args;
-
     va_start( args, fmt );
     int len = vfprintf( (FILE *)(os->file), fmt, args );
@@ -103,4 +102,6 @@
 	} // if
     va_end( args );
+
+	sepReset( os );										// reset separator
 	return len;
 } // prtfmt
Index: src/libcfa/iostream.c
===================================================================
--- src/libcfa/iostream.c	(revision 540de412b77591cc4fdbb16932060ef6229a3f1d)
+++ src/libcfa/iostream.c	(revision fbfde8435d0e43f43b9de0e5a9cd67aa994139a5)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Thu Apr 14 16:02:09 2016
-// Update Count     : 278
+// Last Modified On : Mon May 02 15:13:55 2016
+// Update Count     : 302
 //
 
@@ -34,5 +34,4 @@
 ostype * ?|?( ostype *os, short int si ) {
 	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	sepReset( os );
 	prtfmt( os, "%hd", si );
 	return os;
@@ -42,5 +41,4 @@
 ostype * ?|?( ostype *os, unsigned short int usi ) {
 	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	sepReset( os );
 	prtfmt( os, "%hu", usi );
 	return os;
@@ -50,5 +48,4 @@
 ostype * ?|?( ostype *os, int i ) {
 	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	sepReset( os );
 	prtfmt( os, "%d", i );
 	return os;
@@ -58,5 +55,4 @@
 ostype * ?|?( ostype *os, unsigned int ui ) {
 	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	sepReset( os );
 	prtfmt( os, "%u", ui );
 	return os;
@@ -66,5 +62,4 @@
 ostype * ?|?( ostype *os, long int li ) {
 	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	sepReset( os );
 	prtfmt( os, "%ld", li );
 	return os;
@@ -74,5 +69,4 @@
 ostype * ?|?( ostype *os, unsigned long int uli ) {
 	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	sepReset( os );
 	prtfmt( os, "%lu", uli );
 	return os;
@@ -82,5 +76,4 @@
 ostype * ?|?( ostype *os, long long int lli ) {
 	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	sepReset( os );
 	prtfmt( os, "%lld", lli );
 	return os;
@@ -90,5 +83,4 @@
 ostype * ?|?( ostype *os, unsigned long long int ulli ) {
 	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	sepReset( os );
 	prtfmt( os, "%llu", ulli );
 	return os;
@@ -98,5 +90,4 @@
 ostype * ?|?( ostype *os, float f ) {
 	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	sepReset( os );
 	prtfmt( os, "%g", f );
 	return os;
@@ -106,5 +97,4 @@
 ostype * ?|?( ostype *os, double d ) {
 	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	sepReset( os );
 	prtfmt( os, "%.*lg", DBL_DIG, d );
 	return os;
@@ -114,5 +104,4 @@
 ostype * ?|?( ostype *os, long double ld ) {
 	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	sepReset( os );
 	prtfmt( os, "%.*Lg", LDBL_DIG, ld );
 	return os;
@@ -155,5 +144,6 @@
 		// opening delimiters
 		['('] : Open, ['['] : Open, ['{'] : Open,
-		['$'] : Open, [(unsigned char)'£'] : Open, [(unsigned char)'¥'] : Open, [(unsigned char)'¿'] : Open, [(unsigned char)'«'] : Open,
+		['$'] : Open, [(unsigned char)'£'] : Open, [(unsigned char)'¥'] : Open,
+		[(unsigned char)'¡'] : Open, [(unsigned char)'¿'] : Open, [(unsigned char)'«'] : Open,
 		// closing delimiters
 		[','] : Close, ['.'] : Close, [':'] : Close, [';'] : Close, ['!'] : Close, ['?'] : Close,
@@ -162,10 +152,9 @@
 		// opening-closing delimiters
 		['\''] : OpenClose, ['`'] : OpenClose, ['"'] : OpenClose,
-		['\f'] : OpenClose, ['\n'] : OpenClose, ['\r'] : OpenClose, ['\t'] : OpenClose, ['\v'] : OpenClose, // isspace
+		[' '] : OpenClose, ['\f'] : OpenClose, ['\n'] : OpenClose, ['\r'] : OpenClose, ['\t'] : OpenClose, ['\v'] : OpenClose, // isspace
 	}; // mask
 
-	int len = strlen( cp );
-	// null string => no separator
-  if ( len == 0 ) { sepOff( os ); return os; }
+  if ( cp[0] == '\0' ) { sepOff( os ); return os; }		// null string => no separator
+
 	// first character IS NOT spacing or closing punctuation => add left separator
 	unsigned char ch = cp[0];							// must make unsigned
@@ -173,11 +162,15 @@
 		prtfmt( os, "%s", sepGet( os ) );
 	} // if
+
+	// if string starts line, must reset to determine open state because separator is off
+	sepReset( os );										// reset separator
+
 	// last character IS spacing or opening punctuation => turn off separator for next item
-	unsigned int posn = len - 1;
+	unsigned int len = strlen( cp ), posn = len - 1;
 	ch = cp[posn];										// must make unsigned
-	if ( mask[ ch ] == Open || mask[ ch ] == OpenClose ) {
+	if ( sepPrt( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) {
+		sepOn( os );
+	} else {
 		sepOff( os );
-	} else {
-		sepOn( os );
 	} // if
 	return write( os, cp, len );
@@ -187,5 +180,4 @@
 ostype * ?|?( ostype *os, const void *p ) {
 	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
-	sepReset( os );
 	prtfmt( os, "%p", p );
 	return os;
Index: src/libcfa/stdlib
===================================================================
--- src/libcfa/stdlib	(revision 540de412b77591cc4fdbb16932060ef6229a3f1d)
+++ src/libcfa/stdlib	(revision fbfde8435d0e43f43b9de0e5a9cd67aa994139a5)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jan 28 17:12:35 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Apr 21 07:55:21 2016
-// Update Count     : 95
+// Last Modified On : Wed Apr 27 22:03:29 2016
+// Update Count     : 96
 //
 
@@ -45,5 +45,5 @@
 
 forall( otype T ) T * aligned_alloc( size_t alignment );
-forall( otype T ) T * memalign( size_t alignment );
+forall( otype T ) T * memalign( size_t alignment );		// deprecated
 forall( otype T ) int posix_memalign( T ** ptr, size_t alignment );
 
Index: src/libcfa/stdlib.c
===================================================================
--- src/libcfa/stdlib.c	(revision 540de412b77591cc4fdbb16932060ef6229a3f1d)
+++ src/libcfa/stdlib.c	(revision fbfde8435d0e43f43b9de0e5a9cd67aa994139a5)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jan 28 17:10:29 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Apr 21 07:58:29 2016
-// Update Count     : 165
+// Last Modified On : Thu Apr 28 07:54:21 2016
+// Update Count     : 166
 //
 
@@ -213,6 +213,6 @@
 //---------------------------------------
 
-forall( otype T | { T ?/?( T, T ); T ?%?( T, T ); } )
-[ T, T ] div( T t1, T t2 ) { /* return [ t1 / t2, t1 % t2 ]; */ }
+// forall( otype T | { T ?/?( T, T ); T ?%?( T, T ); } )
+// [ T, T ] div( T t1, T t2 ) { return [ t1 / t2, t1 % t2 ]; }
 
 //---------------------------------------
