summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/stex/cnx/cnx.dtx
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2010-07-19 23:16:46 +0000
committerKarl Berry <karl@freefriends.org>2010-07-19 23:16:46 +0000
commit277ca449c86a187fe858defdcd6aa1830d3b2d0d (patch)
treea804dd4e397504655fc225e6f582554780c4115d /Master/texmf-dist/source/latex/stex/cnx/cnx.dtx
parentd515f1120311798486a522c56170bd519d9c6a7a (diff)
reinstate stex via new .tds.zip
git-svn-id: svn://tug.org/texlive/trunk@19538 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/stex/cnx/cnx.dtx')
-rw-r--r--Master/texmf-dist/source/latex/stex/cnx/cnx.dtx1176
1 files changed, 1176 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/stex/cnx/cnx.dtx b/Master/texmf-dist/source/latex/stex/cnx/cnx.dtx
new file mode 100644
index 00000000000..4a83a3702de
--- /dev/null
+++ b/Master/texmf-dist/source/latex/stex/cnx/cnx.dtx
@@ -0,0 +1,1176 @@
+% \iffalse meta-comment
+% A LaTeX Class for CNXML
+% Copyright (c) 2006 Michael Kohlhase, all rights reserved
+% this file is released under the
+% Gnu Library Public Licences (LGPL)
+%
+% The development version of this file can be found at
+% $HeadURL: https://svn.kwarc.info/repos/stex/trunk/sty/cnx/cnx.dtx $
+% \fi
+%
+% \iffalse
+%<class>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<class>\ProvidesClass{cnx}[2010/06/25 v1.0 LaTeX Bindings for CNXML]
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{url,array,float,stex-logo}
+\usepackage[show]{ed}
+\usepackage[hyperref=auto,style=alphabetic]{biblatex}
+\bibliography{kwarc}
+\usepackage{ctansvn}
+\usepackage[eso-foot,today]{svninfo}
+\svnInfo $Id: cnx.dtx 1483 2010-07-19 07:11:16Z kohlhase $
+\svnKeyword $HeadURL: https://svn.kwarc.info/repos/stex/trunk/sty/cnx/cnx.dtx $
+\makeindex
+\floatstyle{boxed}
+\newfloat{exfig}{thp}{lop}
+\floatname{exfig}{Example}
+\begin{document}\DocInput{cnx.dtx}\end{document}
+%</driver>
+% \fi
+%
+%\CheckSum{1}
+%
+% \changes{v0.1}{2005/12/06}{Initial Version}
+% \changes{v0.2}{2006/01/11}{Namespaces now work}
+% \changes{v1.0}{2006/01/11}{this is a good as it is every going to get}
+%
+% \GetFileInfo{cnx.cls}
+%
+% \MakeShortVerb{\|}
+%\def\scsys#1{{{\sc #1}}\index{#1@{\sc #1}}}
+% \def\xml{\scshape{XML}}
+% \def\cnxml{\scshape{CNXml}}
+% \def\connexions{\scshape{Connexions}}
+% \def\element#1{{\ttfamily{#1}}}
+% \def\snippet#1{{\ttfamily{#1}}}
+% \def\cnxlatex{CNX\LaTeX}
+% \def\mathml{{\scshape{MathML}}}
+% \def\latexml{\hbox{{\LaTeX}ML}}
+% \title{{\cnxlatex}: A {\LaTeX}-based Syntax for Connexions Modules\thanks{Version {\fileversion}
+% (last revised {\filedate})}}
+% \author{Michael Kohlhase\\
+% Jacobs University, Bremen\\
+% \url{http://kwarc.info/kohlhase}}
+% \maketitle
+%
+% \begin{abstract}
+% We present {\cnxlatex}, a collection of {\LaTeX} macros that allow to write
+% {\connexions} modules without leaving the {\LaTeX} workflow. Modules are authored in
+% {\cnxlatex} using only a text editor, transformed to PDF and proofread as usual. In
+% particular, the {\LaTeX} workflow is independent of having access to the {\connexions}
+% system, which makes {\cnxlatex} attractive for the initial version of single-author
+% modules.
+%
+% For publication, {\cnxlatex} modules are transformed to {\cnxml} via the {\latexml}
+% translator and can be uploaded to the {\connexions} system.
+% \end{abstract}
+%
+% \newpage\tableofcontents\newpage
+%
+%\section{Introduction}
+%
+% The Connexions project is a\ednote{continue; copy from somewhere...}
+%
+% The {\cnxml} format --- in particular the embedded content {\mathml} --- is hard to write
+% by hand, so we provide a set of environments that allow to embed the {\cnxml} document
+% model into {\LaTeX}.
+%
+%\section{The User Interface}
+%
+% This document is not a manual for the Connexions XML encoding, or a practical guide how
+% to write Connexions modules. We only document the {\LaTeX} bindings for {\cnxml} and will
+% presuppose experience with the format or familiarity with\ednote{cite the relevant stuff
+% here}. Note that formatting {\cnxlatex} documents with the {\LaTeX} formatter does
+% little to enforce the restrictions imposed by the {\cnxml} document model. You will need to
+% run the {\latexml} converter for that (it includes DTD validation) and any CNX-specific
+% quality assurance tools after that. \ednote{talk about Content {\mathml} and cmathml.sty
+% somewhere}
+%
+% The {\cnxlatex} class makes heavy use of the |KeyVal| package, which is part of your
+% {\LaTeX} distribution. This allows to add optional information to {\LaTeX} macros in the
+% form of key-value pairs: A macro |\foo| that takes a KeyVal argument and a regular one,
+% so a call might look like |\foo{bar}| (no KeyVal information given) or
+% |\foo[key1=val1,...,keyn=valn]{bar}|, where |key1|,\dots,|keyn| are predefined keywords
+% and values are {\LaTeX} token sequences that do not contain comma characters (though
+% they may contain blank characters). If a value needs to contain commas, then it must be
+% enclosed in curly braces, as in |\foo[args={a,comma,separated,list}]|. Note that the
+% order the key/value pairs appear in a KeyVal Argument is immaterial.
+%
+% \subsection{Document Structure}
+%
+% \begin{exfig}
+%\begin{verbatim}
+% \documentclass{cnx}
+% \begin{document}
+% \begin{cnxmodule}[name=Hello World,id=m4711]
+% \begin{ccontent}
+% \begin{cpara}[id=p01] Hello World\end{cpara}
+% \end{ccontent}
+% \end{cnxmodule}
+% \end{document}
+% \end{verbatim}
+% \caption{A Minimal {\cnxlatex} Document}\label{fig:minimal}
+%\end{exfig}
+%
+% The first set of {\cnxlatex} environments concern the top-level structure of the
+% modules. The minimal Connexions document in {\LaTeX} can be seen in
+% Figure~\ref{fig:minimal}: we still need the {\LaTeX} document environment, then
+% \DescribeEnv{cnxmodule}
+% the |cnxmodule| environment contains the module-specific information as a KeyVal
+% argument with the two keys: |id| for the module identifier supplied by the
+% {\connexions} system) and |name| for the title of the module.
+%
+% \DescribeEnv{ccontent}
+% The |content| environment delineates the module content from the metadata (see
+% Section~\ref{sec:metadata}). It is needed to make the conversion to {\cnxml} simpler.
+%
+% \DescribeEnv{c*section}
+% {\cnxml} knows three levels of sectioning, so the {\cnxlatex} class supplies three as
+% well: |csection|, |csubsection| and |csubsubsection|. In contrast to regular
+% {\LaTeX}, these are environments to keep the tight connection between the
+% formats. These environments take an optional KeyVal argument with key |id| for the
+% identifier and a regular argument for the title of the section (to be transformed into
+% the {\cnxml} {\element{name}} element).
+%
+% \DescribeEnv{cpara, cnote}
+% The lowest levels of the document structure are given by paragraphs and notes. The
+% |cpara| and |cnote| environment take a KeyVal argument with the |id| key for
+% identification, the latter also allows a |type| key for the note type (an unspecified
+% string\ednote{what are good values?}).
+%
+%
+% \subsection{Mathematics}
+%
+% Mathematical formulae are integrated into text via the {\LaTeX} math mode, i.e. wrapped
+% in |$| characters or between |\(| and |\)| for inline mathematics and wrapped in |$$| or
+% between |\[| and |\]| for display-style math. Note that {\cnxml} expects Content
+% {\mathml} as the representation format for mathematical formulae, while run-of-the-mill
+% {\LaTeX} only specifies the presentation (i.e. the two-dimensional layout of
+% formulae). The {\latexml} converter can usually figure out some of the content {\mathml}
+% from regular {\LaTeX}, in other cases, the author has to specify it e.g. using the
+% infrastructure supplied by the |cmathml| package.
+%
+% \DescribeEnv{cequation}
+% For numbered equations, {\cnxml} supplies the {\element{equation}} element, for which
+% {\cnxlatex} provides the |cequation| environment. This environment takes a KeyVal
+% argument with the |id| key for the (required) identifier.
+%
+%
+% \subsection{Statements}
+%
+% {\cnxml} provides special elements that make various types of claims; we
+% collectively call them statements.
+%
+% \DescribeEnv{cexample}
+% The |cexample| environment and |definition| elements take a KeyVal argument with key
+% |id| for identification.
+%
+%
+% \DescribeEnv{crule, statement, proof}
+% In {\cnxml}, the {\element{rule}} element is used to represent a general assertion
+% about the state of the world. The {\cnxlatex} |rule|\ednote{we have called this
+% ``crule'', since ``rule'' is already used by {\TeX}.} environment is its {\cnxlatex}
+% counterpart. It takes a KeyVal attribute with the keys |id| for identification, |type|
+% to specify the type of the assertion (e.g. ``Theorem'', ``Lemma'' or ``Conjecture''),
+% and |name|, if the assertion has a title. The body of the |crule| environment contains
+% the statement of assertion in the |statement| environment and (optionally) a proof in
+% the |proof| environment. Both take a KeyVal argument with an |id| key for
+% identification.
+%
+%\begin{exfig}
+%\begin{verbatim}
+% \begin{crule}[id=prop1,type=Proposition]
+% \begin{statement}[id=prop1s]
+% Sample statement
+% \end{statement}
+% \begin{proof}[id=prop1p]
+% Your favourite proof
+% \end{proof}
+% \end{crule}
+% \end{verbatim}
+% \caption{A Basic crule Example}\label{fig:crule}
+%\end{exfig}
+%
+% \DescribeEnv{definition, cmeaning} A definition defines a new technical term or concept
+% for later use. The |definition| environment takes a KeyVal argument with the keys |id|
+% for identification and |term| for the concept (definiendum) defined in this form. The
+% definition text is given in the |cmeaning| environment\footnote{we have called this
+% |cmeaning|, since |meaning| is already taken by {\TeX}}, which takes a KeyVal argument
+% with key |id| for identification. After the |cmeaning| environment, a |definition| can
+% contain arbitrarily many |cexample|s.
+%
+%\begin{exfig}
+%\begin{verbatim}
+% \begin{definition}{term=term-to-be-defined, id=termi-def]
+% \begin{cmeaning}[id=termi-meaning]
+% {\term{Term-to-be-defined}} is defined as: Sample meaning
+% \end{cmeaning}
+% \end{definition}
+%\end{verbatim}
+% \caption{A Basic {\tt{definition}} and {\tt{cmeaning}} Example}\label{fig:def-cmean}
+%\end{exfig}
+%
+% \subsection{Connexions: Links and Cross-References}
+%
+% As the name {\connexions} already suggests, links and cross-references are very
+% important for {\connexions} modules. {\cnxml} provides three kinds of them. Module
+% links, hyperlinks, and concept references.
+%
+% \DescribeMacro{cnxn}
+% Module links are specified by the |\cnxn| macro, which takes a keyval argument with
+% the keys |document|, |target|, and |strength|. The |document| key allows to specify
+% the module identifier of the desired module in the repository, if it is empty, then
+% the current module is intended. The |target| key allows to specify the document
+% fragment. Its value is the respective identifier (given by its |id| attribute in
+% {\cnxml} or the |id| key of the corresponding environment in {\cnxlatex}). Finally,
+% the |strength| key allows to specify the relevance of the link.
+%
+% The regular argument of the |\cnxn| macro is used to supply the link text.
+%
+%
+% \DescribeMacro{link}
+% Hyperlinks can be specified by the |\link| macro in {\cnxlatex}. It takes a KeyVal
+% argument with the key |src| to specify the URL of the link. The regular argument of
+% the |\link| macro is used to supply the link text.
+%
+%
+% \DescribeMacro{term}
+% The |\term| marco can be used to specify the\ednote{continue, pending Chuck's
+% investigation. }
+%
+%
+% \subsection{Metadata}\label{sec:metadata}
+%
+% Metadata is mostly managed by the system in {\connexions}, so we often do not need to
+% care about it. On the other hand, it influences the system, so if we have work on the
+% module extensively before converting it to {\cnxml}, it may be worth-wile specify some of
+% the data in advance.
+%
+% \begin{exfig}
+%\begin{verbatim}
+% \begin{metadata}[version=2.19,
+% created=2000/07/21,revised=2004/08/17 22:07:27.213 GMT-5]
+% \begin{authorlist}
+% \cnxauthor[id=miko,firstname=Michael,surname=Kohlhase,
+% email=m.kohlhase@iu-bremen.de]
+% \end{authorlist}
+% \begin{keywordlist}\keyword{Hello}\end{keywordlist}
+% \begin{cnxabstract}
+% A Minimal CNXLaTeX Document
+% \end{cnxabstract}
+% \end{metadata}
+% \end{verbatim}
+% \caption{Typical {\cnxlatex} Metadata}\label{fig:metadata}
+%\end{exfig}
+%
+% \DescribeEnv{metadata}
+% The |metadata| environment takes a KeyVal argument with the keys |version|, |created|,
+% and |revised| with the obvious meanings. The latter keys take ISO 8601 norm
+% representations for dates and times. Concretely, the format is
+% {\snippet{CCYY-MM-DDThh:mm:ss}} where ``{\snippet{CC}}'' represents the century,
+% ``{\snippet{YY}}'' the year, ``{\snippet{MM}}'' the month, and ``{\snippet{DD}}'' the
+% day, preceded by an optional leading ``{\snippet{-}}'' sign to indicate a negative
+% number. If the sign is omitted, ``{\snippet{+}}'' is assumed. The letter
+% ``{\snippet{T}}'' is the date/time separator and ``{\snippet{hh}}'',
+% ``{\snippet{mm}}'', ``{\snippet{ss}}'' represent hour, minutes, and seconds
+% respectively.
+%
+%
+% \DescribeEnv{authorlist, maintainerlist}
+% The lists of authors and maintainers can be specified in the |authorlist| and
+% |maintainerlist| environments, which take no arguments.
+%
+% \DescribeMacro{cnxauthor,maintainer}
+% The entries on this lists are specified by the |\cnxauthor| and |\maintainer|
+% macros. Which take a KeyVal argument specifying the individual. The |id| key is the
+% identifier for the person, the |honorific|, |firstname|, |other|, |surname|, and
+% |lineage| keys are used to specify the various name parts, and the |email| key is used
+% to specify the e-mail address of the person.
+%
+%
+% \DescribeEnv{keywordlist, keyword}
+% The keywords are specified with a list of |keyword| macros, which take the respective
+% keyword in their only argument, inside a |keyword| environment. Neither take any
+% KeyVal arguments.
+%
+%
+% \DescribeEnv{cnxabstract}
+% The abstract of a {\connexions} module is considered to be part of the metadata. It is
+% specified using the |cnxabstract| environment. It does not take any arguments.
+%
+%
+% \subsection{Exercises}
+%
+% \DescribeEnv{cexercise, cproblem, csolution}
+% An exercise or problem in {\connexions} is specified by the |cexercise| environment,
+% which takes an optional keyval argument with the keys |id| and |name|. It must contain
+% a |cproblem| environment for the problem statement and a (possibly) empty set of
+% |csolution| environments. Both of these take an optional keyval argument with the key
+% |id|.
+%
+% \subsection{Graphics, etc.}
+%
+% \DescribeMacro{cfigure} For graphics we will use the |cfigure|\ednote{probably better
+% call it {\tt{cgraphics}}} macro, which provides a non-floating environment for
+% including graphics into {\cnxml} files. |cfigure| takes three arguments first an
+% optional {\cnxml} keys, then the keys of the |graphicx| package in a regular argument
+% (leave that empty if you don't have any) and finally a path. So
+% \begin{center}
+% |\cfigure[id=foo,type=image/jpeg,caption=The first FOO]{width=7cm,height=2cm}{../images/foo}|
+% \end{center}
+% Would include a graphic from the file at the path |../images/foo|, equip this image with
+% a caption, and tell {\latexml} that\ednote{err, exactly what does it tell latexml?} the
+% original of the images has the MIME type |image/jpeg|.
+%
+% \StopEventually{\newpage\PrintIndex\newpage\PrintChanges\printbibliography}\newpage
+%
+% \section{The Implementation}
+%
+% The |cnx| package generates to files: the {\LaTeX} package (all the code between
+% {\textsf{$\langle$*package$\rangle$}} and {\textsf{$\langle$/package$\rangle$}}) and the
+% {\latexml} bindings (between {\textsf{$\langle$*ltxml$\rangle$}} and
+% {\textsf{$\langle$/ltxml$\rangle$}}). We keep the corresponding code fragments together,
+% since the documentation applies to both of them and to prevent them from getting out of
+% sync.
+%
+% We first make sure that the |sref|~\ctancite{Kohlhase:sref} and |graphicx| packages are
+% loaded.
+% \begin{macrocode}
+%<*cls>
+\RequirePackage{sref}
+\RequirePackage{graphicx}
+% \end{macrocode}
+%
+% The next step is to declare (a few) class options that handle the paper size; this is
+% useful for printing.
+% \begin{macrocode}
+\DeclareOption{letterpaper}
+ {\setlength\paperheight {11in}%
+ \setlength\paperwidth {8.5in}}
+\DeclareOption{a4paper}
+ {\setlength\paperheight {297mm}%
+ \setlength\paperwidth {210mm}}
+\ExecuteOptions{letterpaper}
+\ProcessOptions
+% \end{macrocode}
+% Finally, we input all the usual size settings. There is no sense to use something else,
+% and we initialize the page numbering counter and tell it to output the numbers in arabic
+% numerals (otherwise label and reference do not work).
+% \begin{macrocode}
+\input{size10.clo}
+\pagenumbering{roman}
+%</cls>
+% \end{macrocode}
+% Now comes the equivalent for {\latexml}: this is something that we will have throughout
+% this document. Every part of the {\TeX/\LaTeX} implementation has a {\latexml}
+% equivalent. We keep them together to ensure that they do not get out of sync.
+% \begin{macrocode}
+%<*ltxml>
+# -*- CPERL -*-
+package LaTeXML::Package::Pool;
+use strict;
+use LaTeXML::Package;
+RequirePackage('omd');
+% \end{macrocode}
+% We set up the necessary namespaces, the first one is the default one for {\cnxml}
+% \begin{macrocode}
+RegisterNamespace('cnx'=>"http://cnx.rice.edu/cnxml");
+RegisterNamespace('md'=>"http://cnx.rice.edu/mdml/0.4");
+RegisterNamespace('bib'=>"http://bibtexml.sf.net/");
+RegisterNamespace('m'=>"http://www.w3.org/1998/Math/MathML");
+% \end{macrocode}
+% For {\latexml} we also have to set up the correct document type information. The first line
+% gives the root element. The second gives the public identifier for the CNX DTD, then we
+% have its URL, and finally the CNX namespace.
+% \begin{macrocode}
+DocType("cnx:document",
+ "-//CNX//DTD CNXML 0.5 plus LaTeXML//EN",
+ "../dtd/cnxml+ltxml.dtd",
+ '#default'=>"http://cnx.rice.edu/cnxml",
+ 'md'=>"http://cnx.rice.edu/mdml/0.4",
+ 'bib'=>"http://bibtexml.sf.net/",
+ 'm'=>"http://www.w3.org/1998/Math/MathML",
+ 'ltx'=>"http://dlmf.nist.gov/LaTeXML");
+% \end{macrocode}
+%
+% And finally, we need to set up the counters for itemization, since we are defining a
+% class file from scratch.\ednote{this will have to change, when Bruce updates to the next
+% version (0.6?)}
+%
+% \begin{macrocode}
+NewCounter('@itemizei', 'document', idprefix=>'I');
+NewCounter('@itemizeii', '@itemizei', idprefix=>'I');
+NewCounter('@itemizeiii', '@itemizeii', idprefix=>'I');
+NewCounter('@itemizeiv', '@itemizeiii',idprefix=>'I');
+NewCounter('@itemizev', '@itemizeiv', idprefix=>'I');
+NewCounter('@itemizevi', '@itemizev', idprefix=>'I');
+
+NewCounter('enumi', '@itemizei', idprefix=>'i');
+NewCounter('enumii', '@itemizeii', idprefix=>'i');
+NewCounter('enumiii','@itemizeiii', idprefix=>'i');
+NewCounter('enumiv', '@itemizeiv', idprefix=>'i');
+# A couple of more levels, since we use these for ID's!
+NewCounter('enumv', '@itemizev', idprefix=>'i');
+NewCounter('enumvi', '@itemizevi', idprefix=>'i');
+
+DefMacro('\theenumi', '\arabic{enumi}');
+DefMacro('\theenumii', '\alph{enumii}');
+DefMacro('\theenumiii', '\roman{enumiii}');
+DefMacro('\theenumiv', '\Alph{enumiv}');
+
+NewCounter('equation', 'document', idprefix=>'E');
+DefMacro('\theequation', '\arabic{equation}');
+DefMacro('\textwidth','16cm');
+% \end{macrocode}
+%
+% And another thing that is now needed:
+%
+% \begin{macrocode}
+Let('\thedocument@ID','\@empty');
+%</ltxml>
+% \end{macrocode}
+%
+% \subsection{Document Structure}
+%
+% Now, we start with the document structure markup. The |cnxmodule| environment does not
+% add anything to the {\LaTeX} output, it's attributes only show up in the {\xml}. There
+% we have a slight complication: we have to put an |id| attribute on the |document|
+% element in {\cnxml}, but we cannot redefine the |document| environment in
+% {\LaTeX}. Therefore we specify the information in the |cnxmodule| environment. This
+% means however that we have to put in on the |document| element when we are already past
+% this. The solution here is that when we parse the |cnxmodule| environement, we store the
+% value and put it on the |document| element when we leave the |document| environment
+% (thanks for Ioan Sucan for the code).
+%
+% \begin{environment}{cnxmodule}
+% \begin{macrocode}
+%<*cls>
+\omdaddkey{cnxmodule}{name}
+\srefaddidkey{cnxmodule}{id}
+\newenvironment{cnxmodule}[1][]{\omdsetkeys{cnxmodule}{#1}}{}
+%</cls>
+%<*ltxml>
+DefKeyVal('cnxmodule','name','Semiverbatim');
+DefKeyVal('cnxmodule','id','Semiverbatim');
+DefEnvironment('{document}','<cnx:document>#body</cnx:document>',
+ beforeDigest=> sub { AssignValue(inPreamble=>0); },
+ afterDigest=> sub { $_[0]->getGullet->flush; return; });
+DefEnvironment('{cnxmodule} OptionalKeyVals:cnxmodule',
+ "<cnx:name>&KeyVal('#1','name')</cnx:name>\n#body\n",
+ afterDigestBegin => sub {
+ AssignValue('cnxmodule_id',
+ KeyVal($_[1]->getArg(1), 'id')->toString,
+ 'global');
+ });#$
+Tag('cnx:document', afterClose => sub {
+ $_[1]->setAttribute('id', LookupValue('cnxmodule_id'));
+ });
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{ccontent}
+% The |ccontent| environment is only used for transformation. Its optional |id| attribute
+% is not taken up in the {\LaTeX} bindings.
+% \begin{macrocode}
+%<*cls>
+\newenvironment{ccontent}{}{}
+%</cls>
+%<*ltxml>
+DefEnvironment('{ccontent}',"<cnx:content>#body</cnx:content>");
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{c*section}
+% The sectioning environments employ the obvious nested set of counters.
+% \begin{macrocode}
+%<*cls>
+\newcounter{section}
+\srefaddidkey{sectioning}{id}
+\newenvironment{csection}[2][]%
+{\stepcounter{section}\strut\\[1.5ex]\noindent%
+{\Large\bfseries\arabic{section}.~{#2}}\\[1.5ex]
+\omdsetkeys{sectioning}{#1}}
+{}
+\newcounter{subsection}[section]
+\newenvironment{csubsection}[2][]
+{\refstepcounter{subsection}\strut\\[1ex]\noindent%
+{\large\bfseries{\arabic{section}.\arabic{subsection}.~#2\\[1ex]}}%
+\omdsetkeys{sectioning}{#1}}%
+{}
+\newcounter{subsubsection}[subsection]
+\newenvironment{csubsubsection}[2][]
+{\refstepcounter{subsubsection}\strut\\[.5ex]\noindent
+{\bfseries\arabic{section}.\arabic{subsection}.\arabic{subsubsecction}~#2\\[.5ex]}%
+\omdsetkeys{sectioning}{#1}}{}
+%</cls>
+%<*ltxml>
+DefKeyVal('sectioning','id','Semiverbatim');
+DefEnvironment('{csection}OptionalKeyVals:sectioning{}',
+ "<cnx:section %&KeyVals(#1)>\n"
+ . "?#2(<cnx:name>#2</cnx:name>\n)()"
+ . "#body\n</cnx:section>\n");
+DefEnvironment('{csubsection}OptionalKeyVals:sectioning{}',
+ "<cnx:section %&KeyVals(#1)>\n"
+ . "?#2(<cnx:name>#2</cnx:name>\n)()"
+ . "#body\n</cnx:section>\n");
+DefEnvironment('{csubsubsection}OptionalKeyVals:sectioning{}',
+ "<cnx:section %&KeyVals(#1)>\n"
+ . "?#2(<cnx:name>#2</cnx:name>\n)()"
+ . "#body\n</cnx:section>\n");
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{cpara}
+% For the |<cnx:para>| element we have to do some work, since we want them to be
+% numbered. This handling is adapted from Bruce Miller's |LaTeX.ltxml|
+% numbered.
+% \begin{macrocode}
+%<*cls>
+\srefaddidkey{para}{id}
+\newenvironment{cpara}[1][]{\omdsetkeys{para}{#1}}{\par}
+%</cls>
+%<*ltxml>
+DefKeyVal('para','id','Semiverbatim');
+DefEnvironment('{cpara} OptionalKeyVals:para','<cnx:para %&KeyVals(#1)>#body</cnx:para>');
+sub number_para {
+ my($document,$node,$whatsit)=@_;
+ # Get prefix from first parent with an id.
+ my(@parents)=$document->findnodes('ancestor::*[@id]',$node); # find 1st id'd parent.
+ my $prefix= (@parents ? $parents[$#parents]->getAttribute('id')."." : '');
+ # Get the previous number within parent; Worried about intervening elements around para's, but...
+ my(@siblings)=$document->findnodes("preceding-sibling::cnx:para",$node);
+ my $n=1;
+ $n = $1+1 if(@siblings && $siblings[$#siblings]->getAttribute('id')=~/(\d+)$/);
+ $node->setAttribute(id=>$prefix."p$n"); }
+Tag('cnx:para',afterOpen=>\&number_para);
+DefConstructor('\par',sub { $_[0]->maybeCloseElement('cnx:para'); },alias=>"\\par\n");
+Tag('cnx:para', autoClose=>1, autoOpen=>1);
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{cnote}
+% \begin{macrocode}
+%<*cls>
+\srefaddidkey{note}
+\omdaddkey{note}{type}
+\newenvironment{cnote}[1][]%
+{\omdsetkeys{note}{#1}\par\noindent\strut\hfill\begin{minipage}{10cm}{\bfseries\note@type}:~}%
+{\end{minipage}\hfill\strut\par}
+%</cls>
+%<*ltxml>
+DefKeyVal('note','id','Semiverbatim');
+DefKeyVal('note','type','Semiverbatim');
+DefEnvironment('{cnote}OptionalKeyVals:note','<cnx:note %&KeyVals(#1)>#body</cnx:note>');
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Mathematics}
+%
+% \begin{environment}{cequation}
+% \begin{macrocode}
+%<*cls>
+\srefaddidkey{equation}{id}
+\newenvironment{cequation}[1][]%
+{\omdsetkeys{equation}{#1}\begin{displaymath}}
+{\end{displaymath}}
+%</cls>
+%<*ltxml>
+DefKeyVal('equation','id','Semiverbatim');
+DefEnvironment('{cequation} OptionalKeyVals:equation',
+ "<cnx:equation %&KeyVals(#1)>"
+ . "<ltx:Math mode='display'>"
+ . "<ltx:XMath>#body</ltx:XMath>"
+ . "</ltx:Math></cnx:equation>",
+ mode=>'display_math');
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Rich Text}
+%
+% In this section, we redefine some of {\LaTeX} commands that have their counterparts in
+% {\cnxml}.
+%
+% \begin{environment}{quote}
+% \begin{macrocode}
+%<*cls>
+\srefaddidkey{cquote}
+\omdaddkey{cquote}{type}
+\omdaddkey{cquote}{src}
+\newenvironment{cquote}[1][]{%
+\omdsetkeys{cquote}{#1}\begin{center}\begin{minipage}{.8\textwidth}}{\end{minipage}\end{center}}
+%</cls>
+%<*ltxml>
+DefKeyVal('cquote','id','Semiverbatim');
+DefKeyVal('cquote','type','Semiverbatim');
+DefKeyVal('cquote','src','Semiverbatim');
+DefEnvironment('{cquote} OptionalKeyVals:cquote',
+ "<cnx:quote %&KeyVals(#1)>#body</cnx:quote>");
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{footnote}
+% \begin{macrocode}
+%<*ltxml>
+DefConstructor('\footnote[]{}',"<cnx:note type='foot'>#2</cnx:note>");
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{emph}
+% \begin{macrocode}
+%<*ltxml>
+DefConstructor('\emph{}',"<cnx:emphasis>#1</cnx:emphasis>");
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{displaymath, eqnarray}
+% We redefine the abbreviate display math envionment and the |eqnarray| and |eqnarray*|
+% environments to use the {\cnxml} equation tags, everything else stays the same.
+%
+% \begin{macrocode}
+%<*ltxml>
+DefConstructor('\[',
+ "<cnx:equation id='#id'>"
+ . "<ltx:Math mode='display'>"
+ . "<ltx:XMath>"
+ . "#body"
+ . "</ltx:XMath>"
+ . "</ltx:Math>"
+ ."</cnx:equation>",
+ beforeDigest=> sub{ $_[0]->beginMode('display_math'); },
+ captureBody=>1,
+ properties=> sub { RefStepID('equation') });
+DefConstructor('\]' ,"",beforeDigest=> sub{ $_[0]->endMode('display_math'); });
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{displaymath}
+% We redefine the abbreviate display math envionment to use the {\cnxml} equation tags,
+% everything else stays the same.\ednote{check {\tt{LaTeX.ltxml}} frequently and try to
+% keep in sync, it would be good, if the code in LaTeXML.ltxml could be modularized,
+% so that the {\tt{cnx}}/{\tt{ltx}} namespace differences could be relegated to
+% config options}
+%
+% \begin{macrocode}
+%<*ltxml>
+DefConstructor('\[',
+ "<cnx:equation id='#id'>"
+ . "<ltx:Math mode='display'>"
+ . "<ltx:XMath>"
+ . "#body"
+ . "</ltx:XMath>"
+ . "</ltx:Math>"
+ ."</cnx:equation>",
+ beforeDigest=> sub{ $_[0]->beginMode('display_math'); },
+ captureBody=>1,
+ properties=> sub { RefStepID('equation') });
+DefConstructor('\]' ,"",beforeDigest=> sub{ $_[0]->endMode('display_math'); });
+
+DefMacro('\eqnarray', '\@@eqnarray\@start@alignment');
+DefMacro('\endeqnarray', '\@finish@alignment\end@eqnarray');
+DefMacro('\csname eqnarray*\endcsname', '\@@eqnarray*\@start@alignment');
+DefMacro('\csname endeqnarray*\endcsname', '\@finish@alignment\end@eqnarray');
+DefConstructor('\@@eqnarray OptionalMatch:* AlignmentBody:\end@eqnarray',
+ sub {
+ my($document,$star,$body,%props)=@_;
+ $document->openElement('cnx:equation',refnum=>$props{refnum},id=>$props{id});
+ $document->openElement('ltx:Math',mode=>'display');
+ $document->openElement('ltx:XMath');
+ constructAlignment($document,$body,attributes=>{name=>'eqnarray'});
+ $document->closeElement('ltx:XMath');
+ $document->closeElement('ltx:Math');
+ $document->closeElement('cnx:equation'); },
+ mode=>'display_math',
+ beforeDigest=>sub { alignmentBindings('rcl'); },
+ properties=> sub { ($_[1] ? RefStepID('equation') : RefStepCounter('equation')); },
+ afterDigest=>sub {
+ $_[1]->setProperty(body=>$_[1]->getArg(2));}, # So we get TeX
+ reversion=>'\begin{eqnarray#1}#2\end{eqnarray#1}');
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{displaymath}
+% We redefine the abbreviate display math envionment to use the {\cnxml} equation tags,
+% everything else stays the same.\ednote{check {\tt{LaTeX.ltxml}} frequently and try to
+% keep in sync, it would be good, if the code in LaTeXML.ltxml could be modularized,
+% so that the {\tt{cnx}}/{\tt{ltx}} namespace differences could be relegated to
+% config options}
+%
+% \begin{macrocode}
+%<*cls>
+\newcommand{\litem}[2][]{\item[#1]\label{#2}}
+%</cls>
+%<*ltxml>
+Tag('cnx:item', autoClose=>1);
+DefConstructor('\item[]',"<cnx:item>?#1(<cnx:name>#1</cnx:name>)");
+DefConstructor('\litem[]{}',"<cnx:item id='#2'>?#1(<cnx:name>#1</cnx:name>)");
+DefConstructor('\itemize@item[]',
+ "<cnx:item id='#id'>?#1(<cnx:name>#1</cnx:name>)",
+ properties=>sub{ RefStepItemCounter(); });
+DefConstructor('\enumerate@item[]',
+ "<cnx:item id='#id'>?#1(<cnx:name>#1</cnx:name>)",
+ properties=>sub{ RefStepItemCounter(); });
+DefConstructor('\description@item[]',
+ "<cnx::item id='#id'>?#1(<cnx:name>#1</cnx:name>)",
+ properties=>sub{ RefStepItemCounter(); });
+AssignValue(itemlevel=>0);
+DefEnvironment('{itemize}',
+ "<cnx:list id='#id' type='itemize'>#body</cnx:list>",
+ properties=>sub { beginItemize('itemize'); });
+DefEnvironment('{enumerate}',
+ "<cnx:list type='enumerate' id='#id'>#body</cnx:list>",
+ properties=>sub { beginItemize('enumerate'); });
+DefEnvironment('{description}',
+ "<cnx:list type='description' id='#id'>#body</cnx:list>",
+ properties=>sub { beginItemize('description'); });
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% The next set of commands and environments are largely presentational, so we just skip
+% them.
+%
+% \begin{macrocode}
+%<*ltxml>
+DefEnvironment('{center}','#body');
+DefEnvironment('{minipage}{}','#body');
+DefEnvironment('{small}','#body');
+DefEnvironment('{footnotesize}','#body');
+DefEnvironment('{tiny}','#body');
+DefEnvironment('{scriptsize}','#body');
+%</ltxml>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*ltxml>
+DefConstructor('\ref Semiverbatim', "<cnx:cnxn target='#1'>&LookupValue('LABEL@#1')</cnx:cnxn>");
+%</ltxml>
+% \end{macrocode}
+%
+% \subsection{Statements}
+%
+% \begin{environment}{cexample}
+% \begin{macrocode}
+%<*cls>
+\srefaddidkey{example}
+\omdaddkey{example}{name}
+\newenvironment{cexample}[1][]{\omdsetkeys{example}{#1}
+{\ifx\example@name\@empty\else\noindent\bfseries{\example@name}\fi}}
+{}
+%</cls>
+%<*ltxml>
+DefKeyVal('example','id','Semiverbatim');
+DefEnvironment('{cexample}OptionalKeyVals:example',
+ "<cnx:example %&KeyVals(#1)>#body</cnx:example>");
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{cexercise}
+% The |cexercise|, |cproblem| and |csolution| environments are very simple to set up for
+% {\LaTeX}. For the {\latexml} side, we simplify matters considerably for the moment by
+% restricting the possibilities we have on the {\cnxml} side: We assume that the content
+% is just one |<cnx:para>| element for the |<cnx:problem>| and |<cnx:solution>|
+% elements.\ednote{relax this when we have automated the generation of {\tt{cnx:para}}
+% elements}
+% \begin{macrocode}
+%<*cls>
+\newcounter{cexercise}
+\srefaddidkey{cexercise}
+\omdaddkey{cexercise}{name}
+\newenvironment{cexercise}[1][]{\omdsetkeys{cexercise}{#1}
+{\ifx\cexercise@name\@empty\else\stepcounter{cexercise}\noindent\bfseries{\cexercise@name~\arabic{cexercise}}\fi}}
+{}
+\srefaddidkey{cproblem}
+\newenvironment{cproblem}[1][]{\omdsetkeys{cproblem}{#1}}{}{}
+\srefaddidkey{csolution}
+\newenvironment{csolution}[1][]{\omdsetkeys{csolution}{#1}}{\par\noindent\bfseries{Solution}}{}
+%</cls>
+%<*ltxml>
+DefKeyVal('cexercise','id','Semiverbatim');
+DefKeyVal('cexercise','name','Semiverbatim');
+DefEnvironment('{cexercise}OptionalKeyVals:exercise',
+ "<cnx:exercise ?&defined(&KeyVal(#1,'id'))(id='&KeyVal(#1,'id')')()>"
+ . "#body"
+ . "</cnx:exercise>");
+DefKeyVal('cproblem','id','Semiverbatim');
+DefKeyVal('cproblem','name','Semiverbatim');
+DefEnvironment('{cproblem}OptionalKeyVals:cproblem',
+ "<cnx:problem ?&defined(&KeyVal(#1,'id'))(id='&KeyVal(#1,'id')')()>"
+ . "?&defined(&KeyVal(#1,'name'))(<cnx:name>&KeyVal(#1,'name')</cnx:name>\n)()"
+ . "#body"
+ . "</cnx:problem>");
+DefKeyVal('csolution','id','Semiverbatim');
+DefKeyVal('csolution','name','Semiverbatim');
+DefEnvironment('{csolution}OptionalKeyVals:cproblem',
+ "<cnx:solution ?&defined(&KeyVal(#1,'id'))(id='&KeyVal(#1,'id')')()>"
+ . "?&defined(&KeyVal(#1,'name'))(<cnx:name>&KeyVal(#1,'name')</cnx:name>\n)()"
+ . "#body"
+ . "</cnx:solution>");
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{crule}
+% \begin{macrocode}
+%<*cls>
+\srefaddidkey{rule}
+\omdaddkey{rule}{name}
+\omdaddkey{rule}{type}
+\newenvironment{crule}[1][]{\omdsetkeys{rule}{#1}%
+{\noindent\bfseries{\rule@type:}\ifx\rule@name\@empty\else~(\rule@name)\fi}}%
+{}
+%</cls>
+%<*ltxml>
+DefKeyVal('rule','id','Semiverbatim');
+DefKeyVal('rule','name','Semiverbatim');
+DefKeyVal('rule','type','Semiverbatim');
+DefEnvironment('{crule}OptionalKeyVals:rule',
+ "<cnx:rule ?&defined(&KeyVal(#1,'id'))(id='&KeyVal(#1,'id')')() type='&KeyVal(#1,'type')'>\n"
+ . "?&defined(&KeyVal(#1,'name'))(<cnx:name>&KeyVal(#1,'name')</cnx:name>\n)()"
+ . "\n#body\n"
+ . "</cnx:rule>\n");
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{statement}
+% \begin{macrocode}
+%<*cls>
+\srefaddidkey{statement}
+\newenvironment{statement}[1][]{\omdsetkeys{statement}{#1}}{}
+%</cls>
+%<*ltxml>
+DefKeyVal('statement','id','Semiverbatim');
+DefEnvironment('{statement} OptionalKeyVals:statement','<cnx:statement %&KeyVals(#1)>#body</cnx:statement>');
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{proof}
+% \begin{macrocode}
+%<*cls>
+\srefaddidkey{proof}
+\newenvironment{proof}[1][]{\omdsetkeys{proof}{#1}}{}
+%</cls>
+%<*ltxml>
+DefKeyVal('proof','id','Semiverbatim');
+DefEnvironment('{proof}OptionalKeyVals:proof','<cnx:proof %&KeyVals(#1)>#body</cnx:proof>');
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{definition}
+% \begin{macrocode}
+%<*cls>
+\srefaddidkey{definition}
+\omdaddkey{definition}{term}
+\omdaddkey{definition}{seealso}
+\newenvironment{definition}[1][]{\omdsetkeys{definition}{#1}{\noindent\bfseries{Definition:}}}{}
+%</cls>
+%<*ltxml>
+DefKeyVal('definition','id','Semiverbatim');
+DefKeyVal('definition','term','Semiverbatim');
+DefKeyVal('definition','seealso','Semiverbatim');
+DefEnvironment('{definition}OptionalKeyVals:definition',
+ "<cnx:definition ?&defined(&KeyVal(#1,'id'))(id='&KeyVal(#1,'id')')()>\n"
+ . "?&defined(&KeyVal(#1,'term'))(<cnx:term>&KeyVal(#1,'term')</cnx:term>\n)()"
+ . "\n#body\n"
+ . "?&defined(&KeyVal(#1,'seealso'))(<cnx:seealso><cnx:term>&KeyVal(#1,'term')</cnx:term></cnx:seealso>\n)()"
+ . "</cnx:definition>\n");
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{cmeaning}
+% \begin{macrocode}
+%<*cls>
+\srefaddidkey{meaning}
+\newenvironment{cmeaning}[1][]{\omdsetkeys{meaning}{#1}}{}
+%</cls>
+%<*ltxml>
+DefKeyVal('meaning','id','Semiverbatim');
+DefEnvironment('{cmeaning}OptionalKeyVals:meaning','<cnx:meaning %&KeyVals(#1)>#body</cnx:meaning>');
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Conexxions}
+%
+% \begin{macro}{cnxn}
+% \begin{macrocode}
+%<*cls>
+\omdaddkey{cnxn}{document}
+\omdaddkey{cnxn}{target}
+\omdaddkey{cnxn}{strength}
+\newcommand{\cnxn}[2][]% keys, link text
+{\omdsetkeys{cnxn}{#1}{\underline{#2}}\footnote{{\ttfamily\@ifx\cnxn@document\@empty\cnxn@document\fi\#\cnxn@target}}}
+\newcommand\@makefntext[1]{\parindent 1em\noindent\hb@xt@1.8em{\hss\@makefnmark}#1}
+%</cls>
+%<*ltxml>
+DefKeyVal('cnxn','document','Semiverbatim');
+DefKeyVal('cnxn','target','Semiverbatim');
+DefKeyVal('cnxn','strength','Semiverbatim');
+DefConstructor('\cnxn OptionalKeyVals:cnxn {}','<cnx:cnxn %&KeyVals(#1)>#1</cnx:cnxn>');
+%</ltxml>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{link}
+% \begin{macrocode}
+%<*cls>
+\omdaddkey{link}{src}
+\newcommand{\link}[2][]{\omdsetkeys{link}{#1}\underline{#2}}
+%</cls>
+%<*ltxml>
+DefKeyVal('link','src','Semiverbatim');
+DefConstructor('\link OptionalKeyVals:link {}','<cnx:link %&KeyVals(#1)>#2</cnx:link>');
+%</ltxml>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{cfigure}
+% The |cfigure| only gives us one of the possible instances of the |<figure>|
+% element\ednote{extend that}.\ednote{do more about required and optional keys in
+% arguments.} In {\LaTeX}, we just pipe the size information through to
+% |includegraphics|, in {\latexml}, we construct the {\cnxml} structure\ednote{what do
+% we do with the graphicx information about size,... CSS?}
+% \begin{macrocode}
+%<*cls>
+\srefaddidkey{cfigure}
+\omdaddkey{cfigure}{type}
+\omdaddkey{cfigure}{caption}
+\newcounter{figure}
+\newcommand{\cfigure}[3][]{% cnx_keys, graphicx_keys, path
+\begin{center}%
+\includegraphics[#2]{#3}%
+\omdsetkeys{cfigure}{#1}\sref@target%
+\ifx\cfigure@caption\@empty\else
+\par\noindent Figure\refstepcounter{figure} {\arabic{figure}}: \cfigure@caption%
+\protected@edef\@currentlabel{\arabic{figure}}%
+\sref@label@id{Figure \thefigure}\fi
+\end{center}}
+%</cls>
+%<*ltxml>
+DefKeyVal('cfigure','id','Semiverbatim');
+DefKeyVal('cfigure','name','Semiverbatim');
+DefKeyVal('cfigure','type','Semiverbatim');
+DefKeyVal('cfigure','caption','Semiverbatim');
+DefConstructor('\cfigure OptionalKeyVals:cfigure Semiverbatim Semiverbatim',
+ "<cnx:figure ?&defined(&KeyVal(#1,'id'))(id='&KeyVal(#1,'id')')()>"
+ . "?&defined(&KeyVal(#1,'name'))(<cnx:name>&KeyVal(#1,'name')</cnx:name>\n)()"
+ . "<cnx:media type='&KeyVal(#1,'type')' src='#3'/>"
+ . "?&defined(&KeyVal(#1,'caption'))(<cnx:caption>&KeyVal(#1,'caption')</cnx:caption>\n)()"
+ . "</cnx:figure>");
+%</ltxml>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ccite}
+% \begin{macrocode}
+%<*cls>
+\omdaddkey{ccite}{src}
+\newcommand{\ccite}[2][]{\omdsetkeys{ccite}{#1}\emph{#2}}
+%</cls>
+%<*ltxml>
+DefKeyVal('ccite','src','Semiverbatim');
+DefConstructor('\ccite OptionalKeyVals:ccite {}','<cnx:cite %&KeyVals(#1)>#2</cnx:cite>');
+%</ltxml>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{term}
+% \begin{macrocode}
+%<*cls>
+\newcommand{\term}[1]{{\bfseries\underline{#1}}}
+%</cls>
+%<*ltxml>
+DefConstructor('\term[]{}',"<cnx:term>#2</cnx:term>");
+%</ltxml>
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Metadata}
+%
+% \begin{environment}{metadata}
+% \begin{macrocode}
+%<*cls>
+\omdaddkey{metadata}{version}
+\omdaddkey{metadata}{created}
+\omdaddkey{metadata}{revised}
+\newsavebox{\metadatabox}
+\newenvironment{metadata}[1][]%
+{\noindent\hfill\begin{lrbox}{\metadatabox}
+\begin{minipage}{.8\textwidth}%
+{\Large\bfseries CNX Module: \cnx@name\hfill\strut}\\[2ex]}%
+{\end{minipage}\end{lrbox}\fbox{\usebox\metadatabox}\hfill}
+% \newenvironment{metadata}[1][]%
+% {\noindent\strut\hfill\begin{lrbox}{\metadatabox}\begin{minipage}{10cm}%
+% {\strut\hfill\Large\bfseries CNX Module: \cnx@name\hfill\strut}\\[2ex]}%
+% {\end{minipage}\end{lrbox}\fbox{\usebox\metadatabox}\hfill\strut\\[3ex]}
+%</cls>
+%<*ltxml>
+DefKeyVal('metadata','version','Semiverbatim');
+DefKeyVal('metadata','created','Semiverbatim');
+DefKeyVal('metadata','revised','Semiverbatim');
+DefEnvironment('{metadata}OptionalKeyVals:metadata',
+ "<cnx:metadata>\n"
+ . "<md:version>&KeyVal('#1','version')</md:version>\n"
+ . "<md:created>&KeyVal('#1','created')</md:created>\n"
+ . "<md:revised>&KeyVal('#1','revised')</md:revised>\n"
+ . "#body\n"
+ . "</cnx:metadata>");
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{authorlist}
+% \begin{macrocode}
+%<*cls>
+\newenvironment{authorlist}{{\bfseries{Authors}:~}}{\\[1ex]}
+%</cls>
+%<*ltxml>
+DefEnvironment('{authorlist}',"<md:authorlist>#body</md:authorlist>");
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{maintainerlist}
+% \begin{macrocode}
+%<*cls>
+\newenvironment{maintainerlist}{{\bfseries{Maintainers}:~}}{\\[1ex]}
+%</cls>
+%<*ltxml>
+DefEnvironment('{maintainerlist}',"<md:maintainerlist>#body</md:maintainerlist>");
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{cnxauthor}
+% \begin{macrocode}
+%<*cls>
+\srefaddidkey{auth}
+\omdaddkey{auth}{honorific}
+\omdaddkey{auth}{firstname}
+\omdaddkey{auth}{other}
+\omdaddkey{auth}{surname}
+\omdaddkey{auth}{lineage}
+\omdaddkey{auth}{email}
+\newcommand{\cnxauthor}[1][]{\omdsetkeys{auth}{#1}\auth@first~\auth@sur,}
+%</cls>
+%<*ltxml>
+DefKeyVal('auth','id','Semiverbatim');
+DefKeyVal('auth','firstname','Semiverbatim');
+DefKeyVal('auth','surname','Semiverbatim');
+DefKeyVal('auth','email','Semiverbatim');
+DefConstructor('\cnxauthor OptionalKeyVals:auth',
+ "<md:author id='&KeyVal('#1','id')'>\n"
+ . "?&defined(&KeyVal(#1,'honorific'))(<md:honorific>&KeyVal('#1','honorific')</md:honorific>\n)()"
+ . "?&defined(&KeyVal(#1,'firstname'))(<md:firstname>&KeyVal('#1','firstname')</md:firstname>\n)()"
+ . "?&defined(&KeyVal(#1,'other'))(<md:other>&KeyVal('#1','other')</md:other>\n)()"
+ . "?&defined(&KeyVal(#1,'surname'))(<md:surname>&KeyVal('#1','surname')</md:surname>\n)()"
+ . "?&defined(&KeyVal(#1,'lineage'))(<md:lineage>&KeyVal('#1','lineage')</md:lineage>\n)()"
+ . "?&defined(&KeyVal(#1,'email'))(<md:email>&KeyVal('#1','email')</md:email>\n)()"
+ . "</md:author>\n");
+%</ltxml>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{maintainer}
+% \begin{macrocode}
+%<*cls>
+\newcommand{\maintainer}[1][]{\omdsetkeys{auth}{#1}\auth@first~\auth@sur,}
+%</cls>
+%<*ltxml>
+DefConstructor('\maintainer OptionalKeyVals:auth',
+ "<md:maintainer id='&KeyVal('#1','id')'>\n"
+ . "?&defined(&KeyVal(#1,'honorific'))(<md:honorific>&KeyVal('#1','honorific')</md:honorific>\n)()"
+ . "?&defined(&KeyVal(#1,'firstname'))(<md:firstname>&KeyVal('#1','firstname')</md:firstname>\n)()"
+ . "?&defined(&KeyVal(#1,'other'))(<md:other>&KeyVal('#1','other')</md:other>\n)()"
+ . "?&defined(&KeyVal(#1,'surname'))(<md:surname>&KeyVal('#1','surname')</md:surname>\n)()"
+ . "?&defined(&KeyVal(#1,'lineage'))(<md:lineage>&KeyVal('#1','lineage')</md:lineage>\n)()"
+ . "?&defined(&KeyVal(#1,'email'))(<md:email>&KeyVal('#1','email')</md:email>\n)()"
+ . "</md:maintainer>\n");
+%</ltxml>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{keywordlist}
+% \begin{macrocode}
+%<*cls>
+\newenvironment{keywordlist}{\bfseries{Keywords}:~}{\\[1ex]}
+%</cls>
+%<*ltxml>
+DefEnvironment('{keywordlist}',"<md:keywordlist>\n#body\n</md:keywordlist>");
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{keyword}
+% \begin{macrocode}
+%<*cls>
+\newcommand{\keyword}[1]{#1,}
+%</cls>
+%<*ltxml>
+DefConstructor('\keyword {}',"<md:keyword>#1</md:keyword>");
+%</ltxml>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{cnxabstract}
+% \begin{macrocode}
+%<*cls>
+\newenvironment{cnxabstract}%
+{\par\noindent\strut\hfill\begin{minipage}{10cm}{\bfseries{Abstract}:~}}%
+{\end{minipage}\hfill}
+%</cls>
+%<*ltxml>
+DefEnvironment('{cnxabstract} OptionalKeyVals:cnxabstract',
+ "<md:abstract>\n#body\n</md:abstract>\n");
+1;
+%</ltxml>
+% \end{macrocode}
+% \end{environment}
+% \Finale
+\endinput
+
+% \iffalse
+%%% Local Variables:
+%%% mode: doctex
+%%% TeX-master: t
+%%% End:
+% \fi
+
+% LocalWords: iffalse cnx cnx.dtx cnx.cls scsys sc sc scshape cnxml ttfamily
+% LocalWords: cnxlatex mathml latexml hbox fileversion maketitle newpage foo
+% LocalWords: tableofcontents newpage ednote cmathml.sty keyn valn keyn exfig
+% LocalWords: DescribeEnv cnxmodule ccontent csection csubsection cpara cnote
+% LocalWords: csubsubsection cmathml cequation cexample crule cmeaning tt tt
+% LocalWords: def-cmean cnxn keyval hh ss authorlist maintainerlist cnxauthor
+% LocalWords: firstname keywordlist cnxabstract cexercise cproblem csolution
+% LocalWords: cfigure cfigure cgraphics graphicx printbibliography textsf sref
+% LocalWords: langle textsf langle ltxml ctancite sref cls setlength omd ltx
+% LocalWords: paperheight paperwidth size10.clo pagenumbering ltxml.dtd enumi
+% LocalWords: itemizei idprefix itemizeii itemizeiii itemizeiv itemizev enumii
+% LocalWords: itemizevi enumiii enumiv enumv enumvi theenumi theenumii Sucan
+% LocalWords: theenumiii theenumiv theequation textwidth thedocument omdaddkey
+% LocalWords: environement srefaddidkey newenvironment omdsetkeys Semiverbatim
+% LocalWords: OptionalKeyVals newcounter stepcounter noindent bfseries
+% LocalWords: refstepcounter subsubsection whatsit findnodes hfill
+% LocalWords: displaymath cquote emph eqnarray envionment endeqnarray csname
+% LocalWords: endcsname refnum refnum rcl newcommand itemlevel
+% LocalWords: footnotesize scriptsize ifx Conexxions makefntext parindent hss
+% LocalWords: makefnmark includegraphics currentlabel thefigure ccite lrbox
+% LocalWords: newsavebox metadatabox fbox usebox auth doctex