summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/xmltex/base/xmltex.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/xmltex/base/xmltex.tex')
-rw-r--r--Master/texmf-dist/tex/xmltex/base/xmltex.tex2400
1 files changed, 2400 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/xmltex/base/xmltex.tex b/Master/texmf-dist/tex/xmltex/base/xmltex.tex
new file mode 100644
index 00000000000..70a41b40e19
--- /dev/null
+++ b/Master/texmf-dist/tex/xmltex/base/xmltex.tex
@@ -0,0 +1,2400 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% xmltex.tex
+
+%% Copyright 2000 David Carlisle, NAG Ltd.
+%% re-released by Sebastian Rahtz June 2002
+%% This file is distributed under the LaTeX Project Public License
+%% (LPPL) as found at http://www.latex-project.org/lppl.txt
+%% Either version 1.0, or at your option, any later version.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\catcode`\{=1 \catcode`\}=2 \catcode`\@=11 \catcode`\#=6
+
+\gdef\XML@tempa#1: #2.tex,v #3 #4 #5 #6 #7${
+ \def\xmltexversion{#4 v#3 (#6)}}
+
+\XML@tempa
+$Id: xmltex.tex,v 1.9 2002/06/25 rahtz Exp $
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% initial setup so that xmltex independent of any existing format
+% even if normally built on top of latex
+
+\endlinechar-1
+
+\catcode`\&=4
+\catcode`\^=7
+\catcode`\_13
+\catcode`\|=14 %
+\catcode`\~=13 %
+
+\ifx\count@\@undefined
+ \countdef\count@200 % fingers crossed
+ \countdef\XML@ns@count201\relax
+ \expandafter\def\csname newcount\endcsname#1{}
+ \expandafter\def\csname newtoks\endcsname#1{}
+ \toksdef\toks@200\relax
+ \toksdef\XML@catalogue201\relax
+ \toksdef\XML@attribute@toks202\relax
+ \def\maxdimen{16383.99999pt}
+ \def\space{ }
+ \chardef\active13 %
+ \countdef\z@0 %
+\fi
+\ifx\@tempcnta\@undefined
+ \countdef\@tempcnta202 % fingers crossed
+ \countdef\@tempcntb203 % fingers crossed
+ \edef\@spaces{\space\space\space\space}
+ \begingroup
+ \catcode`\>12
+ \gdef\strip@prefix#1>{}
+ \endgroup
+\fi
+
+
+% set up 7bit range
+\count@0
+\catcode0=13
+\gdef\XML@tempa{
+ \begingroup
+ \uccode0\count@
+ \uppercase{\endgroup
+ \edef^^@{
+ \ifnum\catcode\count@=11 %
+ \noexpand\utfeightay\else\noexpand\utfeightax\fi
+ \noexpand^^@}
+ \expandafter\edef\csname 8:\string^^@\endcsname{\string^^@}}
+ \ifnum\count@<127\advance\count@1 \expandafter\XML@tempa\fi}
+\XML@tempa
+\catcode0=9
+
+\begingroup
+\catcode`\^^M=\active\gdef^^M{\utfeightay^^M}
+\catcode`\^=\active\gdef^{\utfeightay^}
+\catcode`\_=\active\gdef_{\utfeightay_}
+\catcode`\~=\active\gdef~{\utfeightay~}
+\catcode`\%=\active\gdef%{\utfeightay%}
+\catcode`\$=\active\gdef${\utfeightay$}
+\catcode`\#=\active\gdef#{\utfeightay#}
+\catcode`\(=1
+\catcode`\)=2
+\catcode`\{=\active\gdef{(\utfeightay{)
+\catcode`\}=\active\gdef}(\utfeightay})
+\catcode`\/0 \catcode`\\=\active /gdef\(/utfeightay\)
+/endgroup
+
+
+
+\long\def\@gobble#1{}
+\def\@empty{}
+
+\ifx\@@end\@undefined
+ \let\@@end\end
+\fi
+
+\ifx\nfss@catcodes\@undefined
+ \def\nfss@catcodes{
+ \catcode`\\0
+ \catcode`\{1
+ \catcode`\}2
+ \catcode`\%14
+ \catcode`\@11
+ \catcode`\#6
+ \catcode`\"12
+ \catcode`\'12
+ \catcode`\<12
+ \catcode`\=12
+ \catcode`\>12
+ \catcode`\^7 %
+ }
+\fi
+
+% This is standard in LaTeX.
+\ifx\zap@space\@undefined
+\def\zap@space#1 {#1}
+\fi
+
+\newlinechar`\^^J
+
+\ifx\@@input\@undefined
+\let\@@input\input
+\def\input#1{\@@input#1 }
+\fi
+\chardef\active=13
+\chardef\@ne=1
+
+%
+\ifx\IfFileExists\@undefined
+ \def\IfFileExists#1#2#3{\def\@filef@und{#1 }#2}
+\fi
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\immediate\write20{xmltex version: \xmltexversion}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\let\tabcellsep&
+
+\def\afterfi#1\fi{\fi#1}
+
+
+% set catcodes of low chars to 12 and hight 10 13.
+\gdef\XML@tempa#1#2{
+ \catcode\count@#2\relax
+ \ifnum\count@<#1\relax
+ \advance\count@\@ne
+ \afterfi
+ \XML@tempa{#1}{#2}
+ \fi
+ }
+\count@0\relax
+\XML@tempa{`\^^K}{12}
+
+\count@127\relax
+\XML@tempa{255}{13}
+
+
+\def\XML@catcodes{
+% white
+ \catcode`\ \active
+ \catcode`\^^M\active
+ \catcode`\^^I\active
+% xml
+ \catcode`\<\active
+ \catcode`\>\active
+ \catcode`\:\active
+ \catcode`\[\active
+ \catcode`\]\active
+ \catcode`\%\active
+ \catcode`\&\active
+ \catcode`\"\active
+ \catcode`\'\active
+ \catcode`\=\active
+% tex
+ \catcode`\/\active
+ \catcode`\!\active
+ \catcode`\?\active
+ \catcode`\-\active
+ \catcode`\$\active
+ \catcode`\{\active
+ \catcode`\}\active
+ \catcode`\#\active
+ \catcode`\_\active
+ \catcode`\\\active
+ \catcode`\~\active\def~{\utfeightay~}
+% and these are not catcodes
+ \let\XML@ns@a@\XML@ns@a@xml
+ \let\XML@ns\XML@ns@xml
+}
+
+
+\catcode`\/\active
+\catcode`\!\active
+\catcode`\?\active
+\catcode`\"\active
+\catcode`\'\active
+\catcode`\<\active
+\catcode`\>\active
+\catcode`\&\active
+\catcode`\_\active
+\catcode`\ 10
+\catcode`\^^M\active
+
+
+
+%% half baked bom and utf-16 support
+\catcode`^^ff\active
+\catcode`^^fe\active
+\catcode0=9
+
+% do this also in everyjob incase a <?xmltex dump?> has turned it iff.
+\def^^ff^^fe{
+ \def\XML@thisencoding{utf-16}}
+\def^^fe^^ff{
+ \def\XML@thisencoding{utf-16}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+%% warnings
+\def\XML@warnNI#1{
+ {\let\protect\string\utfeight@protect@typeout\message{^^J#1}}}
+\def\XML@warn#1{
+ {\let\protect\string\utfeight@protect@typeout\message{^^J\XML@w@#1}}}
+\let\XML@trace@warn\XML@warn
+\let\XML@trace@warnNI\XML@warnNI
+\let\XML@trace@warnE\message
+
+\let\XML@w@\@empty
+
+% quoted literals
+% " or '
+% #1 command to call, gets quoted string as #1
+% #2 " or '
+% " and ' assumed active
+\def\XML@quoted#1#2{
+ \ifx#2"\expandafter\XML@qq
+ \else\ifx#2'\expandafter\expandafter\expandafter\XML@q
+ \else
+ \ERROR#2
+ \fi
+ \fi
+ #1}
+
+
+\def\XML@qq#1#2"{#1{#2}}
+\def\XML@q#1#2'{#1{#2}}
+
+
+%%%%%%%%%%%%%%%%%
+
+% < handler
+
+% / ! ? assumed active
+\def\XML@lt@markup#1{
+ \catcode`\^^I=10 %
+ \catcode`\^^M=10 %
+ \catcode`\ =10 %
+ \ifx/#1\XML@getend
+ \else\ifx!#1\XML@getdecl
+ \else\ifx?#1\XML@getpi
+ \else\XML@getname#1\@}
+
+\def\XML@first@lt{
+ \let<\XML@lt@markup
+ \let^^ff\@undefined
+ \let^^fe\@undefined
+ \XML@lt@markup}
+
+
+%% reset catcodes
+\def\XML@reset{
+ \nfss@catcodes
+ \catcode`\$3
+ \catcode`\&4
+ \catcode`\^7
+ \catcode`\_8
+ \catcode`\:12
+ \catcode`\!12
+ \catcode`\=12
+ \catcode`\=12
+ \catcode`\|12
+ \catcode`\ =10
+ \catcode`\~\active\def~{\nobreakspace{}}
+% catcodes?
+ \let\XML@ns@a@\XML@ns@a@tex
+ \let\XML@ns\XML@ns@tex}
+
+
+%% begin tag
+\begingroup
+ \catcode`\^^M\active
+ \catcode`\^^I\active
+ \catcode`\ \active
+%
+% #1 first char of name
+% grab the name into an xdef so that derminating string can
+% be any of whitespace / or >
+\gdef\XML@getname#1\@{
+\fi\fi\fi
+\begingroup
+\catcode`\^^M\active
+\catcode`\^^I\active
+\catcode`\ \active
+\def {\iffalse{\fi}\XML@getname@}
+\let^^M %
+\let^^I %
+\def/{\iffalse{\fi}\XML@getname@/}
+\def>{\iffalse{\fi}\XML@getname@>}
+\unrestored@protected@xdef\XML@tempa{\iffalse}\fi#1}
+
+\endgroup
+
+% finish the special group for the name xdef, start an XML@begingroup
+% for the element, and begin processing any attributes.
+\def\XML@getname@{
+ \endgroup
+ \XML@begingroup
+ \edef\XML@w@{ \XML@w@}
+ \let\begintag\XML@tempa
+ \let\XML@parent\XML@this@element
+ \XML@attribute@toks{}
+ \XML@getattrib}
+
+% elements put in an \XML@begingroup which is a not a group at the
+% outer level to save save stack, but turns itself into a group
+% for nexted elements.
+\def\XML@begingroup{
+ \def\XML@begingroup{
+ \begingroup
+ \let\XML@begingroup\begingroup
+ \let\XML@endgroup\endgroup}}
+
+\let\XML@endgroup\@@end
+
+
+
+%% attributes
+
+% #1 first letter of attribute name, or / or > to finish.
+\def\XML@getattrib#1{
+ \ifx#1/
+ \expandafter\XML@endempty
+ \else
+ \ifx#1>
+ \expandafter\expandafter\expandafter\XML@startelement
+ \else
+ \XML@getattrib@a#1
+ \fi
+ \fi}
+
+\let\XML@@getattrib\XML@getattrib
+
+\begingroup
+\catcode`\:\active
+\catcode`\<12
+\catcode`\>12
+
+% restore normal XML whitespace regime
+% namespace check element name (has to be done after attribute handling)
+% trace the element start then `do' the element which might be
+% noop, execute package code, or grab, depending.
+
+\gdef\XML@startelement{
+ \XML@default@attributes
+ \catcode`\^^M\active
+ \catcode`\^^I\active
+ \catcode`\ \active
+ \XML@ns\begintag
+ \edef\XML@this@element{
+ \csname XMLNS@\XML@this@prefix\expandafter\endcsname\noexpand:
+ \XML@this@local}
+ \XML@trace@warn{<\XML@this@element}
+ \XML@checkknown
+ \XML@attrib@trace
+ \XML@doelement}
+
+\endgroup
+
+% This is a noop if tracing turned off, otherwise loop through
+% attlist with a typeout on each.
+\def\XML@attrib@trace{
+ \begingroup
+ \let\XML@doattribute\XML@doattribute@warn
+ \def\XMLNS@{0}
+ \utfeight@protect@typeout
+ \the\XML@attribute@toks
+ \XML@trace@warnE{ >}
+ \endgroup}
+
+% execute package code for an element start.
+\def\XML@doelement{
+ \csname
+ E:\XML@this@element
+ \endcsname
+}
+
+\begingroup
+\catcode`\:\active
+\uccode`\~`\^^I%
+
+% grab element content into a token register.
+% has to pass through xdef to normalise encodings.
+\uppercase{
+\gdef\XML@grabelement{
+\catcode`\ \active\catcode`\^^M\active\catcode`\^^I\active
+ \global\XMLgrabtoks\expandafter{
+ \the\expandafter\XMLgrabtoks
+ \expandafter<\XML@this@element~}
+% check if I can switch this just once, where grabelement switched.
+ \begingroup
+ \let\XML@doattribute\XML@grabattribute
+ \def\XMLNS@{0}
+ \expandafter\let\csname XMLNS@0\endcsname\XMLNS@
+ \the\XML@attribute@toks
+ \endgroup
+%
+\catcode`\ \active\catcode`\^^M\active\catcode`\^^I\active
+ \global\XMLgrabtoks\expandafter{
+ \the\XMLgrabtoks
+ >}
+ \XMLgrab@}
+}
+
+% #1 namespace
+% #2 local name
+% #3 value
+
+\catcode`\=\active
+\gdef\XML@grabattribute#1#2#3{
+ \protected@xdef\XML@tempa{\csname XMLNS@#1\endcsname:#2}
+ \global\XMLgrabtoks\expandafter{
+ \the\expandafter\XMLgrabtoks
+ \XML@tempa="#3" }}
+\endgroup
+
+% #1 should be empty, between the / and the >
+% probably should put some internal form here rather than literally adding
+% end tag to be reparsed, but this simplifies grab code.
+\def\XML@endempty#1>{
+ \expandafter\XML@startelement
+ \expandafter<\expandafter/\begintag>}
+
+
+%% check we know what to do with an element
+\def\XML@checkknown{
+ \expandafter\ifx
+% catcode :? \csname E:\XML@this@element\endcsname
+ \csname E:\csname XMLNS@\XML@this@prefix\endcsname:\XML@this@local\endcsname
+ \relax
+ \let\XML@use\@empty
+ \ifnum0=\csname XMLNS@\XML@this@prefix\endcsname
+ \let\XML@NAME\XML@this@local
+% prerun catalogue in this case which might coerce element into a new namespace
+ \the\XML@catalogue
+ \else
+ \edef\XML@NAMESPACE{\csname XMLNS@\XML@this@prefix\endcsname}
+ \fi
+ \let\XML@NAME\relax
+ \the\XML@catalogue
+ \inputonce\XML@use
+ \expandafter\ifx\csname E:\csname
+ XMLNS@\XML@this@prefix\endcsname:\XML@this@local\endcsname\relax
+ \XML@trace@warnE{Undefined}
+ \fi
+ \fi}
+
+
+
+%% end tag
+
+\def\XML@getend#1\@#2>{
+ \fi
+\catcode`\ \active
+% removed by Peter Housel housel@acm.org 2000/09/06
+% \catcode`\^^M\active\catcode`\^^I\active
+ \XML@getend@a#2 \@}
+
+\begingroup
+\catcode`\/=12
+\catcode`\<=12
+\catcode`\>=12
+\catcode`\:=12
+
+% namespace normalise element name in end tag.
+\gdef\XML@getend@a#1 #2\@{
+\catcode`\ \active\catcode`\^^M\active\catcode`\^^I\active
+ \def\endtag{#1}
+ \XML@ns\endtag
+ \XML@trace@warn{</\csname XMLNS@\XML@this@prefix\endcsname:\XML@this@local>}
+ \XML@doend
+}
+
+% execute package code for element end.
+\gdef\XML@doend{
+ \csname
+ E/:\csname XMLNS@\XML@this@prefix\endcsname:\XML@this@local
+ \endcsname
+ \XML@endgroup
+% added by Peter Housel housel@acm.org 2000/09/06
+ \catcode`\^^M\active \catcode`\^^I\active \catcode`\ \active}
+\endgroup
+
+% flag children: put \@empty after every child element
+% used by \xmltextwochildren and friends
+
+% need active and non active : and / so...
+\begingroup
+\catcode`\:\active
+\uccode`\*=`\:
+\uccode`\.=`\/
+\uccode`\a\z@
+\uccode`\b\z@
+\uccode`\c\z@
+\uccode`\d\z@
+\uccode`\e\z@
+\uccode`\n\z@
+\uccode`\r\z@
+\uccode`\o\z@
+\uccode`\t\z@
+
+\uppercase{
+\gdef\XML@grabend{
+ \ifx\XML@this@level\XML@w@
+% end inner group to restore \XML@doelement and friends
+ \endgroup
+ \XML@trace@warn{Grabbed content}
+ \csname
+ E.*\csname XMLNS@\XML@this@prefix\endcsname
+ *\XML@this@local
+ \expandafter\endcsname\expandafter{
+ \the\XMLgrabtoks}
+ \XML@trace@warn{End grabbed content}
+ \XML@endgroup
+% \XMLstring usage means catcode restoring varies
+% must fix this one day, for now use ifnum avoidance
+\ifnum\catcode`\^^M=10
+\catcode`\ \active\catcode`\^^M\active\catcode`\^^I\active
+\fi
+ \else
+ \xdef\XML@tempa{\noexpand<\noexpand/
+ \csname XMLNS@\XML@this@prefix\expandafter\endcsname\noexpand:
+ \XML@this@local
+ \noexpand>
+ \ifx\XML@next@level\XML@w@\noexpand\@empty\fi}
+ \global\XMLgrabtoks\expandafter{
+ \the\expandafter\XMLgrabtoks
+ \XML@tempa}
+ \XML@endgroup
+ \expandafter
+ \XMLgrab@
+ \fi}}
+\endgroup
+%%%
+
+% syntax for these will probably change.
+\def\xmltexfirstchild#1\@empty#2\@{
+ #1}
+\def\xmltextwochildren#1#2#3\@empty#4\@empty{
+ #1{#3}#2{#4}}
+\def\xmltexthreechildren#1#2#3#4\@empty#5\@empty#6\@empty{
+ #1{#4}#2{#5}#3{#6}}
+\def\xmltexforall#1#2{
+ \xmltexf@rall#1#2< >\@empty}
+
+\def\xmltexf@rall#1#2<#3 #4>#5\@empty{
+ \ifx\relax#3\relax
+ \else
+ \def\xml@name{#3}#1{<#3 #4>#5}
+ \expandafter\xmltexf@rall\expandafter#1
+ \fi}
+
+% #1 entity name (or tex macro holding same, eg from an attrbute)
+% #2 #3 inserted before each compontent
+% so #2{GIF}#3{xxx/yyy.gif}
+\begingroup
+\catcode`\&12
+\catcode`\+12
+
+\gdef\NDATAEntity#1{
+ \expandafter\expandafter\expandafter
+ \XML@ndataentity\csname+&#1\endcsname}
+
+\gdef\XML@ndataentity#1#2#3#4{
+ #3{#1}#4{#2}}
+
+\endgroup
+
+
+%%%%%%%
+
+% this relies on = being catcode 13.
+\begingroup
+\catcode`\=\active
+
+\gdef\XML@getattrib@a#1\fi\fi#2={
+ \fi\fi
+ \XML@set@this@attribute#1#2 \@
+ \XML@quoted\XML@attribval}
+
+\endgroup
+
+%% remove trailing space from `foo ='
+\def\XML@set@this@attribute#1 #2\@{
+% should probably do an edef at this point, and optimise
+% later code
+ \def\XML@this@attribute{#1}}
+
+% #1 = attribute value
+\def\XML@attribval#1{
+% allow for arbitrary catcodes.
+ \xdef\XML@tempa{\expandafter\strip@prefix\meaning\XML@this@attribute}
+ \ifx\XML@tempa\XML@ns@decl
+ \XML@ns@uri{}{#1}
+ \else
+ \XML@ns\XML@this@attribute
+% catcode avoidance
+ \edef\XML@this@prefix{\expandafter\strip@prefix\meaning\XML@this@prefix}
+ \ifx\XML@this@prefix\XML@ns@decl
+ \XML@ns@uri\XML@this@local{#1}
+ \else
+ \begingroup
+% check if this still needed with protect setting?
+% \def"{\noexpand&quot;}
+ \utfeight@protect@internal
+ \xdef\XML@tempa{
+ \the\XML@attribute@toks
+ \noexpand\XML@doattribute{\XML@this@prefix}{\XML@this@local}{#1}}
+ \endgroup
+ \XML@attribute@toks\expandafter{\XML@tempa}
+ \fi
+ \fi
+ \XML@getattrib}
+
+
+%% activate attributes
+
+% this seems over complicated and perhaps I should re-implement.
+% currently tries to avoid making a csname for each attribute.
+% declaration of attributes provides a normal tex command name
+% to access the value in the element code, could have instead
+% just had declaration of attribute name and default and used something
+% like \attributevalue{html:href} but would need to work out a way
+% of resolving prefixes at definition time if this was embedded in
+% the element code. (The prefix such as `html' used in the definition
+% file isn't known by the time the code is run.)
+\def\XML@doattribute@warn#1#2#3{
+ \XML@trace@warn{\@spaces\csname XMLNS@#1\endcsname:#2 = \string"#3\string"}}
+
+% #1 element specific attribute defaults, first token is
+% macro for namespace-global attributes (hence \expandafter)
+\def\XML@setattributes#1{
+ \let\XMLNS@@\XMLNS@
+ \def\XMLNS@{0}
+ \the\expandafter\XML@attribute@toks#1\relax\relax
+ \let\XMLNS@\XMLNS@@}
+
+% #1 prefix
+% #2 local name
+% #3 value
+\def\XML@doattribute#1#2#3{
+ \xdef\XML@tempa##1{\noexpand##1{
+ \noexpand\XML@attrib\csname XMLNS@#1\endcsname:#2\relax}}
+ \XML@tempa\XML@attrib@x{#3}
+ \XML@tempa\XML@attrib@y}
+
+% #1 \XML@attrib qname\relax
+% #2 value given in document instance
+\def\XML@attrib@x#1#2{
+ \gdef\XML@tempb##1#1##2##3##4\relax\relax{
+ \def##2{#2}
+ ##1##4\relax\relax}}
+
+% #1 \XML@attrib qname\relax
+% #2 original attribute defaults
+\def\XML@attrib@y#1#2\relax\relax{
+ \XML@tempb#2#1\XML@temp@l{6}\relax\relax}
+
+
+% if default is inherit, set it to \relax the first time, otherwise
+% let whatever value it has drop through. Note this is inheritance of the
+% tex csname declared as the internal access, not of the xml attribute name.
+% #1 = junk
+% #2 = tex csname
+% #3 = attribute default (should be encoding neutral: not normalised)
+\def\XML@attrib#1\relax#2#3{
+ \ifx\inherit#3\relax% #3 might be empty
+ \ifx#2\@undefined
+ \def#2{\relax}
+ \fi
+ \else
+ \def#2{#3}
+ \fi}
+
+% any distinguishing value would do...
+\let\inherit\XML@attrib
+
+
+\newtoks\XML@attribute@toks
+
+%%%%% namespace declarations
+
+\newcount\XML@ns@count
+
+% need to protect against active chars
+\def\XML@ns@decl{xmlns}
+\edef\XML@ns@decl{\expandafter\strip@prefix\meaning\XML@ns@decl}
+
+
+% #1 prefix (or empty)
+% #2 uri
+% globally allocate number to uri if new
+% locally alocate prefix to number
+% globally allocate number as a prefix (canonical form)
+\def\XML@ns@uri#1#2{
+ \utfeight@protect@chars
+ \XML@ns@alloc{#2}
+ \expandafter\edef\csname XMLNS@#1\endcsname
+ {\csname XML:#2\endcsname}
+ \XML@trace@warn{xmlns:#1 = \csname XMLNS@#1\endcsname}
+ \unprotect@utfeight
+ }
+
+% and the same without any prefix
+% always use in scope of utfeight protect
+% #1 uri
+\def\XML@ns@alloc#1{
+ \expandafter\ifx\csname XML:#1\endcsname\relax
+ \global\advance\XML@ns@count\@ne
+ \expandafter\xdef\csname XML:#1\endcsname{\the\XML@ns@count}
+ \global\expandafter\let\csname A:\the\XML@ns@count\endcsname\@empty
+ \XML@trace@warnNI{URI: \csname XML:#1\endcsname\space = #1}
+ \expandafter\xdef\csname XMLNS@\the\XML@ns@count\endcsname
+ {\the\XML@ns@count}
+ \fi}
+
+% and version for xmt files
+\let\DeclareNamespace\XML@ns@uri
+
+%% namespace support
+
+%% : is active in xml state but inactive in tex state, so need to do
+%% this twice, grrr...
+\begingroup
+\catcode`\:\active
+
+% #1 = qname to be split on :
+\gdef\XML@ns@xml#1{
+ \expandafter\XML@ns@a@xml#1:\@:\\}
+
+% #1 = prefix (or empty)
+% #2 = local name or \@ if no prefix
+\gdef\XML@ns@a@xml#1:#2:#3\\{
+ \ifx\@#2
+ \XML@ns@b{}{#1}
+ \else
+ \XML@ns@b{#1}{#2}
+ \fi}
+\endgroup
+
+% same with inactive :
+% #1 = qname to be split on :
+\def\XML@ns@tex#1{
+ \expandafter\XML@ns@a@tex#1:\@:\\}
+
+% #1 = prefix (or empty)
+% #2 = local name or \@ if no prefix
+\def\XML@ns@a@tex#1:#2:#3\\{
+ \ifx\@#2
+ \XML@ns@b{}{#1}
+ \else
+ \XML@ns@b{#1}{#2}
+ \fi}
+
+\let\XML@ns@a@\XML@ns@a@tex
+\let\XML@ns\XML@ns@tex
+
+%%%%%%%%%%%%%%%%%%%%
+
+% nullnamespace
+\expandafter\def\csname XML:\endcsname{0}
+\expandafter\let\csname A:0\endcsname\@empty
+\def\XMLNS@{0}
+\expandafter\gdef\csname XMLNS@0\endcsname{0}
+
+% xml namespace
+\let\utfeightax\string
+\expandafter\def\csname XML:http://www.w3.org/1998/xml\endcsname{1}
+\expandafter\let\csname A:1\endcsname\@empty
+\def\XMLNS@xml{1}
+\expandafter\gdef\csname XMLNS@1\endcsname{1}
+\XML@ns@count1
+
+% #1 = prefix or empty
+% #2 = local name
+\def\XML@ns@b#1#2{
+ \begingroup
+ \utfeight@protect@chars
+ \xdef\XML@tempa{#1}
+ \xdef\XML@tempb{#2}
+ \endgroup
+ \let\XML@this@prefix\XML@tempa
+ \let\XML@this@local\XML@tempb
+ }
+
+%%%%%
+% pi
+\begingroup
+\catcode`\?\active
+\catcode`\ \active
+\catcode`\^^M\active
+\catcode`\^^I\active
+
+\gdef\XML@getpi#1\@{
+\fi\fi\fi
+\begingroup
+\utfeight@protect@chars
+\catcode`\ \active
+\catcode`\^^M\active
+\catcode`\^^I\active
+\def?{\endcsname?}
+\let \endcsname
+\let^^M\endcsname
+\let^^I\endcsname
+\expandafter\XML@getpi@\csname
+Q:}
+
+\endgroup
+
+\def\XML@getpi@#1{
+ \endgroup
+ \catcode`\^^M\active
+ \catcode`\^^I\active
+ \catcode`\ \active
+ \ifx#1\@undefined
+ \expandafter\XML@getpi@x
+ \fi
+ #1}
+
+\def\XML@getpi@x#1#2?>{
+ \XML@dopi{Undefined}{}}
+
+% currently ? not reset by XML@reset
+\expandafter\def \csname Q:xmltex\endcsname{
+ \begingroup
+ \XML@reset
+ \catcode`\>\active
+ \XML@xmltexpi}
+
+
+\gdef\XML@xmltexpi#1?>{
+ \endgroup
+ \XML@dopi{xmltex}{#1}}
+
+
+
+% #1 = piname or `piname Undefined'
+\def\XML@dopi#1#2{
+ \XML@trace@warn{\string<?#1?>}
+ #2}
+
+\begingroup
+\catcode`\^^I\active
+
+\gdef\XML@grabpi#1#2{
+ \global\XMLgrabtoks\expandafter{
+ \the\XMLgrabtoks<?#1^^I#2?>}
+ \XMLgrab@}
+
+\endgroup
+
+
+
+%% XML and declarations
+% only care about encoding. Ignore version and standalone.
+
+% #1 content
+% #2 end of test code
+\begingroup
+\catcode`\=\active
+
+\expandafter\gdef \csname Q:xml\endcsname{
+ \catcode`\^^M10
+ \catcode`\^^I10
+ \catcode`\ 10 %
+ \XML@xmldecl}
+
+\gdef\XML@xmldecl#1?>{
+ \catcode`\^^M\active
+ \catcode`\^^I\active
+ \catcode`\ \active
+ \XML@encoding#1 e="utf-8"\relax}
+
+
+% actually encoding supposed to be after version if it comes at all
+% so I could simplify this and get rid of the loop.
+\gdef\XML@encoding#1 #2{
+ \if\noexpand#2e
+ \expandafter\XML@encoding@aux
+ \else
+ \expandafter\XML@encoding
+ \fi}
+
+\gdef\XML@encoding@aux#1={
+ \XML@quoted\XML@setenc}
+
+\endgroup
+
+% do nothing if newly specied encoding is same as old one
+% #1 is name of encoding (upper or lower case, and dubious catcodes
+% #2 is junk
+
+\def\XML@setenc#1#2\relax{
+ \lowercase{\gdef\XML@tempa{#1}}
+ \xdef\XML@tempa{\expandafter\strip@prefix\meaning\XML@tempa}
+ \ifx\XML@tempa\XML@thisencoding
+ \else
+ \ifx\XML@utfeight\XML@tempa
+ \XML@setutfeight
+ \else
+ \let\XML@thisencoding\XML@tempa
+ \XML@trace@warnNI{Encoding = \XML@thisencoding}
+ \begingroup
+ \XML@reset\input{\XML@thisencoding.xmt}
+ \endgroup
+ \fi
+ \fi}
+
+% public version of same
+\def\FileEncoding#1{
+ \XML@setenc{#1}\relax}
+
+% catcode neutral lowercase utf-8
+
+\def\XML@utfeight{utf-8}
+\edef\XML@utfeight{\expandafter\strip@prefix\meaning\XML@utfeight}
+
+%% internalise utf8 encoding as needed before every file include.
+\begingroup
+\catcode`\~13
+\catcode`\"12
+\catcode`\<12
+
+\gdef\utfeightloop{
+ \uccode`\~\count@
+ \expandafter\uppercase\XML@tempa
+ \advance\count@\@ne
+ \ifnum\count@<\@tempcnta
+ \expandafter\utfeightloop
+ \fi}
+
+\gdef\XML@setutfeight{
+ \ifx\XML@utfeight\XML@thisencoding
+ \else
+ \let\XML@thisencoding\XML@utfeight
+ \XML@trace@warnNI{Encoding = \XML@thisencoding}
+%
+ \begingroup
+%
+ \count@"C2
+ \@tempcnta"E0
+ \gdef\XML@tempa{{
+ \xdef~####1{\noexpand\utfeightb\string~####1}}}
+ \utfeightloop
+%
+ \count@"E0
+ \@tempcnta"F0
+ \gdef\XML@tempa{{
+ \xdef~####1####2{\noexpand\utfeightc\string~####1####2}}}
+ \utfeightloop
+%
+ \@tempcnta"F4
+ \gdef\XML@tempa{{
+ \xdef~####1####2####3{\noexpand\utfeightd\string~####1####2####3}}}
+ \utfeightloop
+%
+ \endgroup
+ \fi}
+
+\endgroup
+
+
+\def\xmlinput#1{
+ \IfFileExists{#1}
+ {\expandafter\XML@xmlinput\expandafter
+ \XML@setenc\expandafter{\XML@thisencoding}\relax
+ }{\XML@warn{No file: #1}}}
+
+\def\XML@xmlinput{
+ \def^^ff^^fe{\XML@setenc{utf-16}\relax}
+ \def^^fe^^ff{\XML@setenc{utf-16}\relax}
+% in principle a parsed entity might just be text with no markup
+% but the utf16 is so broken anyway don't worry about that.
+ \let<\XML@first@lt
+ \XML@setutfeight
+ \@@input\@filef@und\relax}
+
+%%%%%%%%%%%%%
+
+%% declarations
+% made safe against active chars.
+% #1 = rest of if test
+% #2#3 = first two characters after <!
+\def\XML@getdecl#1\@#2#3{
+\fi\fi
+ \if-\noexpand#2\XML@comment % --
+ \else\if N\noexpand#3\XML@entity% EN TITY
+ \else\if L\noexpand#3\XML@dec@e% EL EMENT
+ \else\if A\noexpand#2\XML@dec@a% AT TLIST
+ \else\if D\noexpand#2\XML@doctype% DO CTYPE
+ \else\if C\noexpand#3\XML@cdata% [C DATA
+ \else \XML@dec@n% NO TATION
+% could also pick up [IGNORE/[INCLUDE
+% but they not allowed in internal subset.
+@}
+
+%% Just skip element declarations
+% #1 = rest of \if
+% #2 ELEMENT declaration
+\def\XML@dec@e#1@#2>{
+ \fi\fi\fi
+ \XML@checkend@subset}
+
+
+% attribute declarations
+% #1 = rest of if test + TLIST
+% #2 = element name
+\def\XML@dec@a#1 #2 {
+ \fi\fi\fi\fi
+ \protected@xdef\XML@tempa{#2}
+ \XML@dec@a@x}
+
+\gdef\XML@dec@a@x#1 #2{
+ \protected@xdef\XML@tempb{#1}
+ \if(\noexpand#2
+ \begingroup
+ \catcode`\(\active
+ \expandafter\XML@dec@a@brack
+ \else
+ \expandafter\XML@dec@a@type
+ \fi}
+
+\begingroup
+\catcode`\(\active
+
+% #1 = enumerated attribute type tokens, up to )
+\gdef\XML@dec@a@brack#1){
+ \endgroup
+ \XML@dec@a@hash}
+
+\endgroup
+
+% #1 = junk up to next space token
+\def\XML@dec@a@type#1 {
+ \XML@dec@a@hash}
+
+\begingroup
+\catcode`\$=\catcode`\#
+\catcode`\#=12
+
+% #1 = nextchar after space, if it is # step to next space
+% otherwise look for possible " or ' or >
+\gdef\XML@dec@a@hash$1{
+ \if\noexpand$1#
+ \expandafter\XML@dec@a@type
+ \else
+ \ifx$1>
+ \let\ERROR\@undefined
+ \expandafter\expandafter\expandafter\XML@checkend@subset
+ \else
+ \let\ERROR\XML@dec@a@nodef
+ \XML@dec@a@def$1
+ \fi
+ \fi}
+
+
+\endgroup
+
+\gdef\XML@dec@a@nodef#1\fi\fi#2{
+ \fi\fi
+ \XML@dec@a@x#1}
+
+
+\def\XML@dec@a@def#1\fi\fi{
+ \fi\fi
+ \XML@quoted\XML@dec@a@default#1}
+
+\def\XML@dec@a@default#1#2{
+ \XML@warn{Default: \XML@tempa\space\XML@tempb="#1"}
+ \ifx\XML@default@attributes\relax
+ \let\XML@default@attributes\@empty
+ \fi
+ \toks@\expandafter{\XML@default@attributes}
+ \protected@xdef\XML@default@attributes{
+ \the\toks@\noexpand\XML@add@attrib{\XML@tempa}{\XML@tempb}{#1}}
+% reusing this wastes some tests but only done in local subset
+ \XML@dec@a@hash#2
+ }
+
+
+\let\XML@default@attributes\relax
+
+% this comparison is encoding normalised, but namespace unaware, grr.
+\def\XML@add@attrib#1#2#3{
+ \gdef\XML@tempa{#1}
+ \ifx\XML@tempa\begintag
+ \def\XML@this@attribute{#2}
+% stop getattrib looking for nexted xml syntax attribute setting.
+ \let\XML@getattrib\relax
+ \XML@attribval{#3}
+ \let\XML@getattrib\XML@@getattrib
+ \fi}
+
+%% comment
+% - is active
+% #1 = rest of if test
+% #2 = comment text
+\begingroup
+\catcode`\-\active
+\uppercase{\endgroup
+\def\XML@comment#1@#2-->}{
+ \fi
+ \catcode`\^^M\active
+ \catcode`\^^I\active
+ \catcode`\ \active
+ \XML@trace@warn{\string<!-- -->}
+ \XML@comment@}
+
+\def\XML@comment@{
+ \XML@checkend@subset}
+
+\def\XML@grabcomment@{
+ \XMLgrab@}
+
+%% entity defs
+
+% #1 = rest of \if test + TITY
+% #2 = % or entity name
+\begingroup
+\catcode`\&=12
+\catcode`\%=13
+
+\gdef\XML@entity#1 #2 {
+ \fi\fi
+ \ifx%#2
+ \def\XML@input{
+ \ifx\XML@use\XML@SYSTEM\expandafter\@gobble\else
+ \noexpand\inputonce\fi}
+ \expandafter\XML@p@ent
+ \else
+ \def\XML@input{\noexpand\xmlinput}
+ {\utfeight@protect@chars\xdef\XML@ename{&#2}}
+ \XML@trace@warn{\XML@ename; = }
+ \expandafter\XML@ent
+ \fi}
+
+\endgroup
+
+% input some file at most once (and ignore arguments that
+% expand to empty)
+% done in a local group
+\def\inputonce#1{
+ \expandafter\ifx\csname xmt:#1\endcsname\relax
+ \global\expandafter\let\csname xmt:#1\endcsname\@ne
+ \begingroup
+ \XML@reset
+% package files should have their own namespace declarations
+% don't want to inherit from some random point when file is loaded.
+% in principle should clear all prefix assignments in local scope
+% but I don't currently maintain a list of those, and not needed as long
+% as package files declare all prefixes used. But do set the default
+% namespace back to the null namespace.
+%
+% should force utf-8 as well.
+ \def\XMLNS@{0}
+ \input{#1}
+ \endgroup
+ \fi}
+
+% ignore include of empty filename
+\expandafter\let\csname xmt:\endcsname\@ne
+
+% \noexpand protect against active ascii
+\begingroup
+\catcode`\%12
+\gdef\XML@p@ent#1 #2{
+ {\utfeight@protect@chars\xdef\XML@ename{%#1}}
+ \XML@trace@warn{\XML@ename; = }
+ \if\noexpand#2P\XML@E@public
+ \else\if\noexpand#2S\XML@E@system
+ \else\XML@E@internal#2}
+\endgroup
+
+% #1 = next char( P or S for external entities)
+\def\XML@ent#1{
+ \if\noexpand#1P\XML@E@public
+ \else\if\noexpand#1S\XML@E@system
+ \else\XML@E@internal#1}
+
+
+\begingroup
+\catcode`\:\active
+
+% special `prefix' that just removes following colon.
+\expandafter\gdef\csname XMLNS@*\endcsname#1{}
+
+\endgroup
+
+\begingroup
+\catcode`\:=12
+
+%#1 = " or '
+\gdef\XML@E@internal#1{
+ \fi\fi
+ \begingroup
+ \let\XML@trace@warn\@gobble
+ \let\XML@endgroup\endgroup
+ \let\XML@begingroup\begingroup
+% make " or ' close the grab `element'. the nameless close tag is completed
+% by the > coming from the ENTITY declaration syntax.
+% Using a mangled grab code is a bit complicated but it allows
+% catcode 10 simplification in the normal case of element handling
+% and allows characters to be correctly normalised to utf8.
+ \def#1{</}
+ \expandafter\def\csname
+ E\string/:\endcsname{
+ \afterassignment\XML@E@internal@x
+ \expandafter\gdef\csname+\XML@ename\endcsname}
+ \begingroup
+% stop xmlns `attribute' being recognised
+ \let\XML@ns@decl\relax
+ \let\XML@this@local\@empty
+% set up special prefix to gobble colon
+ \def\XML@this@prefix{*}
+% disable these as nothing will be known until namespaces reenabled
+ \let\XML@checkknown\relax
+ \let\XML@attrib@trace\relax
+% hobble namespace code to put all name in local part.
+ \def\XML@ns##1{
+ \protected@edef\XML@this@local{##1}
+ \def\XML@this@prefix{*}}
+ \xmlgrab}
+
+\endgroup
+
+% expandafter away an \else clause in grabelement then check for ]
+\def\XML@E@internal@x{
+ \endgroup
+ \aftergroup\XML@trace@warn
+ \expandafter\aftergroup\csname+\XML@ename\endcsname
+\aftergroup\fihack
+}
+
+% this hack has to undo the one above moarked by
+% % \XMLstring usage means catcode restoring varies
+% must fix this as well one day
+\def\fihack#1\fi{\expandafter\XML@checkend@subset}
+
+% need to add (somewhere) a replacement of " to &quot; so that
+% xxx='a"b"c' doesn't end up as xxx="a"b"c"
+% #1 replacement text
+% #2 white space and >
+\begingroup
+\uccode`\~`\#
+\catcode`\~\active
+\uppercase{\endgroup
+\def\XML@E@internal@#1#2>{
+ \expandafter\protected@xdef\csname+\XML@ename\endcsname{#1}
+ \XML@trace@warn{\@spaces\string"#1\string"}
+ \XML@checkend@subset}}
+
+%% check for ]> that ends internal subset
+\begingroup
+\catcode`\]\active
+
+
+% #1 is next token in local subset (normally < or >)
+% after subset finishes % stops being markup, and the package
+% relating to any external entity in the doctype is loaded.
+\gdef\XML@checkend@subset{
+ \catcode`\^^M10
+ \catcode`\^^I10
+ \catcode`\ 10 %
+ \XML@checkend@subset@}
+
+% #1 = next character
+\catcode`\%\active
+\gdef\XML@checkend@subset@#1#2#3#4{
+ \ifx]#1
+ \let\XML@w@\@empty
+ \XML@trace@warn{]}
+ \gdef%{\utfeightay%}
+ \let\XML@checkend@subset\relax
+ \expandafter\XML@loaddoctype
+ \fi
+ #1#2#3#4}
+
+\endgroup
+
+%% #1#2 just gobble ]>
+\def\XML@loaddoctype#1#2{
+ \catcode`\^^M\active
+ \catcode`\^^I\active
+ \catcode`\ \active
+ \ifx\XML@D@dtd\relax\else
+ \XML@trace@warn{Doctype Package: \XML@D@dtd}
+ \inputonce\XML@D@dtd
+ \fi}
+
+
+% #1 = rest of \if test + PUBLIC
+\def\XML@E@public#1 {
+ \fi
+ \XML@quoted\XML@E@pubid}
+
+% #1 = FPI
+\def\XML@E@pubid#1{
+ \def\XML@PUBLIC{#1}
+ \edef\XML@PUBLIC{\expandafter\strip@prefix\meaning\XML@PUBLIC}
+ \XML@quoted\XML@E@systemid}
+
+% #1 = rest of if test up to SYSTEM
+\def\XML@E@system#1 {
+ \fi\fi
+ \def\XML@PUBLIC{}
+ \XML@quoted\XML@E@systemid}
+
+
+% #1 URL
+% #2 next token, N or >
+\def\XML@E@systemid#1#2{
+ \def\XML@SYSTEM{#1}
+ \let\XML@use\XML@SYSTEM
+ \XML@trace@warn{\@spaces Public: \XML@PUBLIC}
+ \XML@trace@warn{\@spaces System: \XML@SYSTEM}
+ \the\XML@catalogue
+ \if\noexpand#2N
+ \expandafter\XML@E@ndata
+ \else
+ \afterfi
+ \XML@E@internal@{\XML@input{\XML@use}}#2
+ \fi}
+
+
+% NDATA token terminated by > or white space
+% #1 = DATA
+% #2 ndata token with possible extra space
+\def\XML@E@ndata#1 #2>{\XML@ndata@#2 >}
+
+% #1 = ndata toke
+% #2 = junk
+\def\XML@ndata@#1 #2>{
+ \XML@E@internal@{{#1}{\XML@use}}>}
+
+
+%% DOCTYPE
+% #1 rest of \if test + OCTYPE
+% #2 document element name
+% #3 P or S or [ or >
+% noexpand for P and S, [ assumed active
+
+\begingroup
+\catcode`\[\active
+
+\gdef\XML@doctype#1 #2 #3{
+ \fi\fi\fi\fi\fi
+ \def\documentelement{#2}
+ \let\XML@D@dtd\relax
+ \XML@trace@warn{Document Element: \documentelement}
+ \if\noexpand#3P\XML@D@public
+ \else\if\noexpand#3S\XML@D@system
+ \else\ifx#3[\XML@D@internal
+ \else%must be > the end
+ \XML@D@empty
+ @}
+
+
+\gdef\XML@D@empty @{
+ \fi\fi\fi}
+
+% #1 = rest of \if test + UBLIC
+\gdef\XML@D@public#1 {
+ \fi
+ \XML@quoted\XML@pubid}
+
+% #1 = FPI
+\gdef\XML@pubid#1{
+ \def\XML@PUBLIC{#1}
+ \edef\XML@PUBLIC{\expandafter\strip@prefix\meaning\XML@PUBLIC}
+ \XML@quoted\XML@systemid}
+
+
+% #1 = rest of \if test + YSTEM
+\gdef\XML@D@system#1 {
+ \fi\fi
+ \def\XML@PUBLIC{}
+ \XML@quoted\XML@systemid}
+
+% #1 = URI
+\gdef\XML@systemid#1{
+ \protected@edef\XML@SYSTEM{#1}
+ \edef\XML@SYSTEM{\expandafter\strip@prefix\meaning\XML@SYSTEM}
+ \XML@trace@warn{Doctype Public: \XML@PUBLIC}
+ \XML@trace@warn{Doctype System: \XML@SYSTEM}
+ \let\XML@use\@empty
+ \the\XML@catalogue
+ \let\XML@D@dtd\XML@use
+ \XML@D@internal@}
+
+% #1 = rest of if test
+\gdef\XML@D@internal#1@{
+ \fi\fi\fi
+ \XML@D@internal@[}
+
+% #1 = [ for local subset or > for the end.
+\catcode`\%\active
+\gdef\XML@D@internal@#1{
+ \ifx[#1
+ \XML@trace@warn{Internal Subset[}
+ \let%\XML@pcent
+ \edef\XML@w@{ \XML@w@}
+ \expandafter\XML@checkend@subset
+ \else
+ | it had better be the closing >
+ \fi}
+
+\endgroup
+
+
+%%%%%%%%%%%%%%%
+%% catalogue support
+\newtoks\XML@catalogue
+
+%% should rationalise this code
+
+% #1 = FPI
+% #2 = xmltex package file
+\def\PUBLIC#1#2{
+ \xdef\XML@tempa{#1}
+ \xdef\XML@tempa{\noexpand\the\XML@catalogue\noexpand\XML@@PUBLIC
+ {\expandafter\strip@prefix\meaning\XML@tempa}}
+ \global\XML@catalogue\expandafter\expandafter\expandafter{
+ \XML@tempa{#2}}}
+
+
+% #1 = URI
+% #2 = xmltex package file
+\def\SYSTEM#1#2{
+ \xdef\XML@tempa{#1}
+ \xdef\XML@tempa{\noexpand\the\XML@catalogue\noexpand\XML@@SYSTEM
+ {\expandafter\strip@prefix\meaning\XML@tempa}}
+ \global\XML@catalogue\expandafter\expandafter\expandafter{
+ \XML@tempa{#2}}}
+
+% #1 = namespace URI
+% #2 = xmltex package file
+\def\NAMESPACE#1#2{
+ \utfeight@protect@chars
+ \XML@ns@alloc{#1}
+ \edef\@tempa{{\csname XML:#1\endcsname}}
+ \global\XML@catalogue\expandafter{\the\expandafter\XML@catalogue
+ \expandafter\XML@@NAMESPACE\@tempa{#2}}
+ \unprotect@utfeight}
+
+
+% #1 = unprefixed element name
+% #2 = xmltex package file
+\def\NAME#1#2{
+ \global\XML@catalogue\expandafter{\the\XML@catalogue\XML@@NAME{#1}{#2}}}
+
+% #1 = unprefixed element name
+% #2 = namespace URI
+\def\XMLNS#1#2{
+ \utfeight@protect@chars
+ \XML@ns@alloc{#2}
+ \edef\@tempa{{#1}{\csname XML:#2\endcsname}}
+ \global\XML@catalogue\expandafter{\the\expandafter\XML@catalogue
+ \expandafter\XML@@XMLNS\@tempa}
+ \unprotect@utfeight}
+
+
+
+\def\XML@@PUBLIC#1#2{
+ \gdef\XML@tempa{#1}
+ \ifx\XML@tempa\XML@PUBLIC
+ \def\XML@use{#2}
+ \fi}
+
+\def\XML@@SYSTEM#1#2{
+ \def\@tempa{#1}
+ \ifx\@tempa\XML@SYSTEM
+ \def\XML@use{#2}
+ \fi}
+
+\def\XML@@NAMESPACE#1#2{
+ \def\@tempa{#1}
+ \ifx\@tempa\XML@NAMESPACE
+ \def\XML@use{#2}
+ \fi}
+
+
+\def\XML@@NAME#1#2{
+ \def\@tempa{#1}
+ \ifx\@tempa\XML@NAME
+ \def\XML@use{#2}
+ \fi}
+
+
+
+\begingroup
+\catcode`\:\active
+
+\def\XML@@XMLNS#1#2{
+ \def\@tempa{#1}
+ \ifx\@tempa\XML@NAME
+ \edef\XMLNS@{#2}
+ \edef\XML@this@element{
+ \XMLNS@\noexpand:\XML@this@local}
+ \XML@trace@warn{ \XML@this@element}
+ \let\XML@NAMESPACE\XMLNS@
+ \fi}
+\endgroup
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% entity refs
+\begingroup
+\catcode`\$=\catcode`\#
+\catcode`\#=\active
+
+\gdef\XML@amp@markup$1$2;{
+ \ifx#$1\@empty
+ \XML@charref$2;
+ \XML@tempa
+ \else
+ \begingroup\utfeight@protect@chars
+ \expandafter\aftergroup
+ \csname+\string&$1$2\expandafter\endcsname
+ \endgroup
+ \fi}
+
+\endgroup
+
+\let&\XML@amp@markup
+
+\begingroup
+\catcode`\%=12
+\catcode`\&=12
+
+\gdef\XML@pcent#1;{
+ \csname+%#1\endcsname
+ \XML@checkend@subset}
+
+\gdef\XMLentity#1#2{
+ \expandafter\gdef\csname+&#1\endcsname{#2}}
+
+\endgroup
+
+% predefined definitions
+\begingroup
+\XMLentity{amp}{\utfeightaz&}
+\XMLentity{quot}{\utfeightax"}
+\XMLentity{apos}{\utfeightax'}
+\XMLentity{lt}{\utfeightaz<}
+\XMLentity{gt}{\utfeightax>}
+\endgroup
+
+%% character refs
+
+% longwinded way so can share code later, also need to do d case.
+% this does up to x1F FFFF which is higher than needed for XML
+% (x10 FFFF)
+\begingroup
+\catcode`\"=12
+\catcode`\<=12
+\catcode`\.=12
+\catcode`\,=12
+\catcode`\;=12
+\catcode`\!=12
+\catcode`\~=13
+
+% definition is of form
+% \utfeightX <non active char>+
+% except for non active chars below 128 which are just def of catcode 12 version.
+\gdef\XML@charref#1#2;{
+ \begingroup
+ \uppercase{\count@\if x\noexpand#1"\else#1\fi#2}\relax
+ \ifnum\count@<"80\relax
+ \uccode`\~\count@
+ \uppercase{
+ \ifnum\catcode\count@=\active
+ \gdef\XML@tempa{\utfeightay~}
+ \else
+ \gdef\XML@tempa{~}
+ \fi}
+ \else\ifnum\count@<"800\relax
+ \XML@utfeight@a,
+ \XML@utfeight@b C\utfeightb.,
+ \else\ifnum\count@<"10000\relax
+ \XML@utfeight@a;
+ \XML@utfeight@a,
+ \XML@utfeight@b E\utfeightc.{,;}
+ \else
+ \XML@utfeight@a;
+ \XML@utfeight@a,
+ \XML@utfeight@a!
+ \XML@utfeight@b F\utfeightd.{!,;}
+ \fi
+ \fi
+ \fi
+ \endgroup}
+
+% while I support mixed tex/xml files I need to have a version
+% of &#123; that always fetches the definition even if
+% character is currently non active
+\global\let\XML@@charref\XML@charref
+
+
+\gdef\XML@charref@tex#1#2;{
+ \begingroup
+ \uppercase{\count@\if x\noexpand#1"\else#1\fi#2}\relax
+ \ifnum\count@<"80\relax
+ \uccode`\~\count@
+ \uppercase{
+ \gdef\XML@tempa{\utfeightay~}}
+ \else\ifnum\count@<"800\relax
+ \XML@utfeight@a,
+ \XML@utfeight@b C\utfeightb.,
+ \else\ifnum\count@<"10000\relax
+ \XML@utfeight@a;
+ \XML@utfeight@a,
+ \XML@utfeight@b E\utfeightc.{,;}
+ \else
+ \XML@utfeight@a;
+ \XML@utfeight@a,
+ \XML@utfeight@a!
+ \XML@utfeight@b F\utfeightd.{!,;}
+ \fi
+ \fi
+ \fi
+ \endgroup}
+
+\gdef\XML@utfeight@a#1{
+ \@tempcnta\count@
+ \divide\count@64
+ \@tempcntb\count@
+ \multiply\count@64
+ \advance\@tempcnta-\count@
+ \advance\@tempcnta"80
+ \uccode`#1\@tempcnta
+ \count@\@tempcntb}
+
+\gdef\XML@utfeight@b#1#2#3#4{
+ \advance\count@"#10\relax
+ \uccode`#3\count@
+ \uppercase{\gdef\XML@tempa{#2#3#4}}}
+
+
+%%%%%%%%%%%%%%%%
+
+% #1 unicode slot, either 123 decimal or xA23 hex
+% #2 tex definition of character when used as character data.
+% code for chars below 127 somewhat experimental
+\gdef\UnicodeCharacter#1#2{
+ \begingroup
+% suppress active test in charref
+ \def\active{\catcode\count@}
+ \XML@charref#1;
+ \expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter
+ \expandafter
+ \gdef\XML@tempa{#2}
+ \endgroup}
+
+\endgroup
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newtoks\XMLgrabtoks
+
+\def\xmlgrab{
+ \begingroup
+ \global\XMLgrabtoks{}
+ \let\XML@this@level\XML@w@
+ \edef\XML@next@level{ \XML@w@}
+ \let\XML@doelement\XML@grabelement
+ \let\XML@doend\XML@grabend
+ \let\XML@docdata\XML@grabcdata
+ \let\XML@comment@\XML@grabcomment@
+ \let\XML@dopi\XML@grabpi
+ \XMLgrab@}
+
+\def\XMLgrab@{
+ \utfeight@protect@internal
+ \def<{\iffalse{\fi}\XMLgrab@@}
+ \xdef\XML@tempa{\iffalse}\fi}
+
+\def\XMLgrab@@{
+ \global\XMLgrabtoks\expandafter{\the\expandafter\XMLgrabtoks\XML@tempa}
+ \XML@lt@markup}
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% cdata
+\begingroup
+\catcode`\[\active
+\catcode`\]\active
+
+% #1 = DATA
+\gdef\XML@cdata #1[{
+ \fi\fi\fi\fi\fi\fi
+ \catcode`\^^M\active
+ \catcode`\^^I\active
+ \catcode`\ \active
+ \XML@cdata@a}
+
+% #1 = CDADA section text
+\gdef\XML@cdata@a#1]]>{
+ \begingroup
+ \XML@trace@warn{CDATA}
+ \edef<{\noexpand\utfeightaz\string<}
+ \edef&{\noexpand\utfeightaz\string&}
+ \XML@docdata{#1}}
+
+\endgroup
+
+% #1 = CDADA section text
+\def\XML@docdata#1{#1\endgroup}
+
+% #1 = CDADA section text
+\def\XML@grabcdata#1{
+ \utfeight@protect@internal
+ \edef<{\noexpand\utfeightaz\string<}
+ \edef&{\noexpand\utfeightaz\string&}
+ \xdef\XML@tempa{#1}
+ \endgroup
+ \expandafter\XMLgrab@\XML@tempa}
+
+%%%%%%%%%%
+% notation
+
+% parse past the public and system ids
+% in case they contain a >.
+% unlike entities PUBLIC need not have a system id
+% #1 junk
+% #2 notation name
+% #3 PUBLIC or SYSTEM
+\def\XML@dec@n#1N #2 #3 {
+ \fi\fi\fi\fi\fi\fi
+ \XML@trace@warn{NOTATION #2}
+ \XML@quoted\XML@notation
+ }
+
+\def\XML@notation#1#2{
+ \ifx>#2
+ \expandafter\XML@checkend@subset
+ \else
+ \afterfi
+ \XML@quoted\XML@notation#2
+ \fi}
+
+%%%%%%%%
+%% xmt definitions
+
+%% #1 element, may use prefix : using prefixes in current scope
+%% #2 attlist
+%% #3 begin code
+%% #4 end code
+%% if #3 is \xmlgrab, #4 may access the content of the element as #1
+\long\def\XMLelement#1#2#3#4{
+ \XML@ns{#1}
+ \xdef\XML@tempc{:\csname
+ XMLNS@\XML@this@prefix\endcsname:\XML@this@local}
+% attlist
+ \toks@\expandafter{\csname A:\csname
+ XMLNS@\XML@this@prefix\endcsname\endcsname}
+ #2
+ \expandafter\gdef\csname E\XML@tempc\expandafter\endcsname
+ \expandafter{\expandafter\XML@setattributes\expandafter{\the\toks@}#3}
+ \gdef\XML@tempa{#3}
+ \ifx\XML@tempa\XML@xmlgrab
+ \expandafter\gdef\csname E\string/\XML@tempc\endcsname##1
+ {#4}
+ \else
+ \expandafter\gdef\csname E\string/\XML@tempc\endcsname
+ {#4}
+ \fi}
+
+\def\XML@xmlgrab{\xmlgrab}
+
+%% #1 attribute, may use prefix : using prefixes in current scope
+%% #2 macro to access attribute in begin or end code
+%% #3 default
+
+\long\def\XMLattribute#1#2#3{
+ {\def\XMLNS@{0}
+ \XML@ns{#1}
+ \xdef\XML@tempa{\noexpand\XML@attrib
+ \csname XMLNS@\XML@this@prefix\endcsname
+ :\XML@this@local\relax\noexpand#2}}
+ \toks@\expandafter{\the\expandafter\toks@\XML@tempa{#3}}}
+
+\long\def\XMLattributeX#1#2#3{
+ {\def\XMLNS@{0}
+ \XML@ns{#1}
+ \xdef\XML@tempa{\noexpand\XML@attrib
+ \csname XMLNS@\XML@this@prefix\endcsname
+ :\XML@this@local\relax\noexpand#2}}
+ \toks@\expandafter{\the\expandafter\toks@\XML@tempa{#3}\utfeight@chardef#2}}
+
+\def\utfeight@chardef#1{
+\begingroup
+\utfeight@protect@chars
+\xdef\x@temp{#1}
+\endgroup
+\let#1\x@temp}
+
+% version for namespace global attributes, used at top level.
+%% #1 prefix for namespace this is for. using prefixes in current scope
+%% #2 attribute, may use prefix : using prefixes in current scope
+%% #3 macro to access attribute in begin or end code
+%% #4 default
+
+\long\def\XMLnamespaceattribute#1#2#3#4{
+ \toks@\expandafter\expandafter\expandafter{\csname A:\csname
+ XMLNS@#1\endcsname\endcsname}
+ \XMLattribute{#2}{#3}{#4}
+ \expandafter\xdef\csname A:\csname
+ XMLNS@#1\endcsname\endcsname{\the\toks@}}
+
+\long\def\XMLnamespaceattributeX#1#2#3#4{
+ \toks@\expandafter\expandafter\expandafter{\csname A:\csname
+ XMLNS@#1\endcsname\endcsname}
+ \XMLattributeX{#2}{#3}{#4}
+ \expandafter\xdef\csname A:\csname
+ XMLNS@#1\endcsname\endcsname{\the\toks@}}
+
+
+
+%% #1 QName, may use prefix : using prefixes in current scope
+%% #2 macro to access attribute in begin or end code
+\begingroup
+\catcode`\:\active
+
+\long\gdef\XMLname#1#2{{
+ \XML@ns{#1}
+ \xdef#2{
+ \csname XMLNS@\XML@this@prefix\endcsname
+ \noexpand:\XML@this@local}}}
+\endgroup
+
+\begingroup
+\catcode`\<=12
+\catcode`\>=12
+\catcode`\:=12
+\catcode`\/=12
+
+\gdef\XMLstring#1#2<>{
+ \begingroup
+ \let\XML@endgroup\endgroup
+ \let\XML@this@local\@empty
+ \let\XML@this@prefix\@empty
+ \expandafter\def\csname
+ E/:\XMLNS@:\endcsname{
+ \gdef#1}
+ \XML@catcodes
+ \xmlgrab}
+
+\gdef\XMLstringX#1#2<>{
+ \begingroup
+ \let\XML@endgroup\endgroup
+ \let\XML@this@local\@empty
+ \let\XML@this@prefix\@empty
+ \expandafter\def\csname
+ E/:\XMLNS@:\endcsname{
+ \xdef#1}
+ \XML@catcodes
+ \utfeight@protect@chars
+ \xmlgrab}
+
+\endgroup
+
+%% #1 name
+%% #2 code, gets data as #1
+\long\def\XMLProcessInstruction#1#2{
+ \expandafter\gdef\csname P:#1\endcsname##1{#2}}
+
+%%%%%%%%%%%
+%% xmltex format support
+\everyjob\expandafter{\the\everyjob
+ \immediate\write20{xmltex version: \xmltexversion:}
+\def^^ff^^fe{\XML@setenc{utf-16}\relax}
+\def^^fe^^ff{\XML@setenc{utf-16}\relax}
+\ActivateASCII{45}% -
+\UnicodeCharacter{45}{-\kern\z@}
+\let<\XML@first@lt
+ \IfFileExists{xmltex.cfg}
+ {\begingroup
+ \XML@reset
+ \@@input\@filef@und
+ \endgroup}{\XML@warn{No File: xmltex.cfg}}
+ \IfFileExists{\jobname.cfg}
+ {\begingroup
+ \XML@reset
+ \@@input\@filef@und
+ \endgroup}{\XML@warn{No File: \jobname.cfg}}
+}
+
+
+%%%%%%%%%%%
+%% not currently used
+%
+%\def\XML@setlatexcodes{
+%\ifnum\catcode`\&\active
+% \let\XML@restore\XML@catcodes
+% \let\XML@setlatexcodes\relax
+%\fi}
+%
+%\let\XML@restore\relax
+
+
+%% allow package and class loading with normal latex catcodes
+
+
+\def\@fileswith@pti@ns#1[#2]#3[#4]{
+ \XML@reset
+ \catcode`\^^M5 %
+ \let\@fileswith@pti@ns\@@fileswith@pti@ns
+ \@@fileswith@pti@ns{#1}[{#2}]{#3}[{#4}]
+ \XML@catcodes
+ \let\@fileswith@pti@ns\XML@@fileswith@pti@ns}
+
+\let\XML@@fileswith@pti@ns\@fileswith@pti@ns
+
+
+
+% and similar for input of aux files
+\def\@input#1{
+ \XML@reset
+ \catcode`\^^I\active
+ \catcode`\<\active
+ \catcode`\>\active
+ \catcode`\&\active
+ \catcode`\#\active
+ \catcode`\/\active
+ \catcode`\:\active
+ \catcode`\=\active
+ \let\XML@charref\XML@charref@tex
+ \IfFileExists{#1}{\@@input\@filef@und}{\typeout{No file #1.}}
+ \XML@catcodes
+ \let\XML@charref\XML@@charref
+}
+
+% and end doc
+\def\enddocument{
+ \@enddocumenthook
+ \@checkend{document}
+ \clearpage
+ \begingroup
+ \if@filesw
+ \immediate\closeout\@mainaux
+ \let\@setckpt\@gobbletwo
+ \let\@newl@bel\@testdef
+ \@tempswafalse
+\XML@reset
+ \catcode`\^^I\active
+ \catcode`\<\active
+ \catcode`\>\active
+ \catcode`\&\active
+ \catcode`\#\active
+ \catcode`\/\active
+ \catcode`\:\active
+ \catcode`\=\active
+ \let\XML@charref\XML@charref@tex
+ \makeatletter \input\jobname.aux
+ \fi
+ \@dofilelist
+ \ifdim \font@submax \string>\fontsubfuzz\relax
+ \@font@warning{Size substitutions with differences\MessageBreak
+ up to \font@submax\space have occured.\@gobbletwo}
+ \fi
+ \@defaultsubs
+ \@refundefined
+ \if@filesw
+ \ifx \@multiplelabels \relax
+ \if@tempswa
+ \@latex@warning@no@line{Label(s) may have changed.
+ Rerun to get cross-references right}
+ \fi
+ \else
+ \@multiplelabels
+ \fi
+ \fi
+ \endgroup
+ \deadcycles\z@\@@end}
+
+
+%% protected write
+\long\def \protected@write#1#2#3{
+ \begingroup
+ \let\thepage\relax
+ #2
+ \utfeight@protect@external
+ \let\protect\@unexpandable@protect
+ \edef\reserved@a{\write#1{#3}}
+ \reserved@a
+ \endgroup
+ \if@nobreak\ifvmode\nobreak\fi\fi
+}
+
+
+%% typeout etc
+\def\set@display@protect{
+ \let\protect\string
+ \utfeight@protect@typeout}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% xmltex namespace
+\expandafter\def\csname
+ XML:http://www.dcarlisle.demon.co.uk/xmltex\endcsname{2}
+\expandafter\let\csname A:2\endcsname\@empty
+\expandafter\gdef\csname XMLNS@2\endcsname{2}
+\XML@ns@count2
+
+\iffalse
+% this is some currently used code aiming at having an aux file
+% in xml syntax using commands from the xmltex namespace.
+% this would avoid some of the problems involved in having
+% mixed xml/tex aux files.
+\def\addcontentsline#1#2#3{
+ \addtocontents{#1}{
+ <2:contentsline level="#2">
+ <2:toctitle>#3</2:toctitle>
+ <2:page>\thepage</2:page>
+ </2:contentsline>}}
+
+\long\def\addtocontents#1#2{
+ \protected@write\@auxout
+ {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}
+ {<2:@writefile ext="#1">#2</2:@writefile>}}
+
+\def\numberline#1{<2:numberline>#1</2:numberline>}
+
+\fi
+% end of xml-aux code.
+
+%%%%%%%%%%%%%%%%%%
+% tracing
+\long\def\@gobble#1{}
+\long\def\@gobbletwo#1#2{}
+\long\def\@gobblethree#1#2#3{}
+
+\def\xmltraceonly{
+ \global\hfuzz\maxdimen
+ \global\nullfont
+ \global\everypar{}
+ \global\let\XML@doelement\relax
+ \global\let\wrong@fontshape\relax
+ \global\let\selectfont\relax
+ \expandafter\gdef\expandafter\XML@catcodes\expandafter{\XML@catcodes
+ \gdef\unprotect@utfeight{
+ \let<\XML@lt@markup
+ \let&\XML@amp@markup
+ \global\let\utfeightax\@gobble
+ \global\let\utfeightay\@gobble
+ \global\let\utfeightaz\@gobble
+ \global\let\utfeightb\@gobbletwo
+ \global\let\utfeightc\@gobblethree
+ \global\let\utfeightd\@gobblefour}
+ \unprotect@utfeight}
+ \gdef\XML@doend{\XML@endgroup}
+ \gdef\XML@docdata##1{\endgroup}
+ \global\let\XML@dopi\@gobbletwo
+}
+
+\def\xmltraceoff{
+ \global\let\XML@trace@warn\@gobble
+ \global\let\XML@trace@warnNI\@gobble
+ \global\let\XML@trace@warnE\@gobble
+ \global\let\XML@attrib@trace\relax}
+
+
+%%%%%
+%% xmltex PI
+%% <?xmltex tracingall ?>
+%% <?xmltex typeout {hello world!} ?>
+%% content of pi may be a latex command.
+%% Arguments may be given in {} as usual
+%% Do not use \ . First `word' (ignoring white space) taken as a tex
+%% command name. May be a standard latex command, as here,
+%% or some special command defined in a cfg file or package.
+\begingroup
+\catcode`[=1
+\catcode`]=2
+\catcode`\{\active
+\catcode`\}\active
+\XMLProcessInstruction[xmltex][
+ \XML@pi#1{\relax}]
+
+\gdef\XML@pi#1{#2}[
+ \ifx\relax#2
+ \csname\zap@space#1 \@empty\expandafter\endcsname
+ \else
+ \afterfi
+ \expandafter
+ \XML@pi@b\csname\zap@space#1 \@empty\endcsname[#2]
+ \fi]
+
+\gdef\XML@pi@b#1{#2}[
+ \ifx\relax#2
+ #1
+ \else
+ \afterfi
+ \XML@pi@b#1[#2]
+ \fi]
+
+\endgroup
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% unicode support
+
+% \utfeighta#1 1 byte utf8 char
+% \utfeightb#1#2 2 byte utf8 char
+% \utfeightc#1#2#3 3 byte utf8 char
+% \utfeightd#1#2#3#4 4 byte utf8 char
+
+\def\unprotect@utfeight{
+ \let<\XML@lt@markup
+ \let&\XML@amp@markup
+ \def\utfeightax##1{
+ \csname 8:\string##1\endcsname}
+ \let\utfeightay\utfeightax
+ \let\utfeightaz\utfeightax
+ \def\utfeightb##1##2{
+ \csname 8:##1\string##2\endcsname}
+ \def\utfeightc##1##2##3{
+ \csname 8:##1\string##2\string##3\endcsname}
+ \def\utfeightd##1##2##3##4{
+ \csname 8:##1\string##2\string##3\string##4\endcsname}}
+
+\unprotect@utfeight
+
+% do this also in everyjob
+\let<\XML@first@lt
+
+
+% for moving internal arguments (not writes)
+\def\utfeight@protect@internal{
+ \let\utfeightax\noexpand
+ \let\utfeightay\noexpand
+ \def\utfeightaz{
+ \noexpand\utfeightaz\noexpand}
+ \let<\relax\let&\relax
+ \def\utfeightb##1##2{
+ \noexpand\utfeightb##1\string##2}
+ \def\utfeightc##1##2##3{
+ \noexpand\utfeightc##1\string##2\string##3}
+ \def\utfeightd##1##2##3##4{
+ \noexpand\utfeightd##1\string##2\string##3\string##4}}
+
+
+% for external files (expands one in an edef and once in a write
+\def\utfeight@protect@external{
+ \def\utfeightax{
+ \noexpand\noexpand\noexpand}
+ \let\utfeightay\utfeighta@ref
+ \let\utfeightaz\utfeighta@ref
+ \edef<{\string<}
+ \edef&{\string&}
+ \def\utfeightb##1##2{
+ ##1\string##2}
+ \def\utfeightc##1##2##3{
+ ##1\string##2\string##3}
+ \def\utfeightd##1##2##3##4{
+ ##1\string##2\string##3\string##4}}
+
+% for typeouts and immediate writes and messages
+%\def\utfeight@protect@typeout{
+% \let\utfeightax\noexpand
+% \let\utfeightay\noexpand
+% \let\utfeightaz\utfeighta@ref
+% \let<\relax\let&\relax
+% \def\utfeightb##1##2{##1\string##2}
+% \def\utfeightc##1##2##3{##1\string##2\string##3}
+% \def\utfeightd##1##2##3##4{##1\string##2\string##3\string##4}}
+
+% plan b
+\def\utfeight@protect@typeout{
+ \utfeight@protect@chars
+ \let<\relax
+ \let&\relax}
+
+% for csname (will fall over < or & but they should not be there)
+\def\utfeight@protect@chars{
+ \let\utfeightax\string
+ \let\utfeightay\string
+ \let\utfeightaz\string
+ \def\utfeightb##1##2{
+ ##1\string##2}
+ \def\utfeightc##1##2##3{
+ ##1\string##2\string##3}
+ \def\utfeightd##1##2##3##4{
+ ##1\string##2\string##3\string##4}}
+
+
+\def\utfeighta@ref#1{
+ \string&\string##\number\expandafter`\string#1\string;}
+
+
+%%%%%%%%%%%%%%%%%%%%
+%% mapping input encodings to unicode.
+
+
+\begingroup
+\catcode`\"=12\relax
+\gdef\InputCharacter#1#2{
+ \begingroup
+ \XML@charref#2;
+ \count@"0\if\noexpand x#1\relax\else\count@#1\fi\relax
+ \uccode`\~\count@
+ \uppercase{
+ \global\let~\XML@tempa}
+ \endgroup}
+\endgroup
+
+%%%%%%%%%%%%%%%%%%%%%%%%
+% default encoding
+
+%% need to change this default if hit BOM or xml or text decl,
+\XML@setutfeight
+
+%%%%%%%%%%%%%%%%%%%%%
+% adding xmltex style protection to standard latex commands.
+% if xmltex being used with other formats this does no harm
+% except take up a bit of space.
+
+\begingroup
+\catcode`\:\active
+\catcode`\/\active
+
+\gdef\markboth#1#2{\gdef\@themark{{#1}{#2}}{
+ \utfeight@protect@internal
+ \let\protect\@unexpandable@protect
+ \let\label\relax \let\index\relax \let\glossary\relax
+ \mark{\@themark}}\if@nobreak\ifvmode\nobreak\fi\fi}
+\gdef\markright#1{{\let\protect\@unexpandable@protect
+ \utfeight@protect@internal
+ \let\label\relax \let\index\relax \let\glossary\relax
+ \expandafter\@markright\@themark
+ {#1}\mark{\@themark}}\if@nobreak\ifvmode\nobreak\fi\fi}
+
+\endgroup
+
+% this one not safe, restore not complete
+\def\protected@edef{
+ \let\@@protect\protect
+ \let\protect\@unexpandable@protect
+ \utfeight@protect@internal
+ \afterassignment\restore@protect
+ \edef
+}
+\def\protected@xdef{
+ \begingroup
+ \utfeight@protect@internal
+ \let\protect\@unexpandable@protect
+ \afterassignment\endgroup
+ \xdef
+}
+\def\unrestored@protected@xdef{
+ \utfeight@protect@internal
+ \let\protect\@unexpandable@protect
+ \xdef
+}
+
+% should really save and restore, not always back to markup
+\def\restore@protect{\let\protect\@@protect
+ \unprotect@utfeight
+}
+
+%%%%% stop this doing damage, also stops it working
+\def\MakeUppercase#1{#1}
+
+
+%%%%%%%%%%%%%%%%%%%%%
+
+% support for making 7bit characters active
+
+\begingroup
+\catcode`\"=12\relax
+\gdef\ActivateASCII#1{
+ \uppercase{\count@"0\if x\noexpand#1\relax\else\count@#1\fi\relax}
+ \toks@\expandafter{\nfss@catcodes}
+ \xdef\nfss@catcodes{
+ \catcode\the\count@=\the\catcode\the\count@\relax\the\toks@}
+ \toks@\expandafter{\XML@catcodes}
+ \xdef\XML@catcodes{
+ \catcode\the\count@\active\the\toks@}
+ \expandafter\ifx\csname8:"\endcsname\relax
+ \expandafter\gdef\csname8:"\endcsname{"}
+ \fi}
+\endgroup
+
+
+% some of these should not be active by default, but OK for now.
+% could use \ActivateASCII for most if not all of these now.
+% should probably use \UnicodeCharacter for these now
+\expandafter\def\csname8:\string<\endcsname{\ifmmode\langle\else\textless\fi}
+\expandafter\def\csname8:\string>\endcsname{\ifmmode\rangle\else\textgreater\fi}
+\expandafter\def\csname8:\string{\endcsname{\{}
+\expandafter\def\csname8:\string}\endcsname{\}}
+
+% activateacii would use ax code, want ay code so ^ not written to aux files
+% and clash with tex usage. so locally lie and make it a letter
+\ActivateASCII{94}% ^ for tex ^^ notation in aux files
+\UnicodeCharacter{94}{\textasciicircum}
+
+
+\ActivateASCII{x5C}% \
+\UnicodeCharacter{x5C}{\textbackslash}
+\ActivateASCII{x5F}% \
+\UnicodeCharacter{x5F}{\textunderscore}
+\ActivateASCII{123}% {
+\ActivateASCII{125}% {
+
+%%%%%%%%%%%%%%%%
+% white space
+
+\UnicodeCharacter{13}{ \ignorespaces}
+\UnicodeCharacter{32}{ \ignorespaces}
+\UnicodeCharacter{9}{ \ignorespaces}
+
+
+\expandafter\def\expandafter\obeylines\expandafter{
+\expandafter\def\csname 8:\string^^M\endcsname{\leavevmode\hfil \break\null}}
+
+\expandafter\def\expandafter\xmlnewlineaction\expandafter{
+\expandafter\def\csname 8:\string^^M\endcsname}
+
+\expandafter\def\expandafter\obeyspaces\expandafter{
+\expandafter\def\csname 8: \endcsname{\nobreakspace}}
+
+% tabs just do whatver the current space does.
+\catcode`\^^I\active
+\expandafter\def\csname 8:\string^^I\expandafter\endcsname
+ \expandafter{\csname 8: \endcsname}
+
+
+% tex conventions
+\XML@reset
+\IfFileExists{xmltex.cfg}
+ {
+ \@@input\expandafter\@filef@und\expandafter\relax
+ \expandafter\XML@setenc\expandafter{\XML@thisencoding}\relax
+ }{\XML@warn{No File: xmltex.cfg}}
+
+
+% get xmltex in catcode 12, for comparing with \jobname
+\gdef\XML@tempa#1>{}
+\gdef\XML@tempb{xmltex}
+\xdef\XML@tempb{\expandafter\XML@tempa\meaning\XML@tempb}
+%
+\gdef\XML@tempc{pdfxmltex}
+\xdef\XML@tempc{\expandafter\XML@tempa\meaning\XML@tempc}
+%
+\xdef\XML@tempa{\lowercase{\gdef\noexpand\XML@tempa{\jobname}}}
+\XML@tempa
+
+
+% if jobname is xmltex or pdfxmltex dump the format, otherwise
+% try to load \jobname.cfg and input \xmlfile
+% put white space back so the filename can be read off the command line
+\ifx\XML@tempa\XML@tempc
+ \let\XML@tempb\XML@tempc
+\fi
+\ifx\XML@tempa\XML@tempb
+ \def\XML@tempa{
+\catcode`\ =10\relax
+\catcode`\^^M=10\relax
+\catcode`\^^I=10\relax
+\dump}
+\else
+\IfFileExists{\jobname.cfg}
+ {
+ \@@input\expandafter\@filef@und\expandafter\relax
+ \expandafter\XML@setenc\expandafter{\XML@thisencoding}\relax
+ }{\XML@warn{No File: \jobname.cfg}}
+
+
+\ifx\xmlfile\@undefined
+ \def\XML@tempa{\catcode`\-12\relax}
+\else
+ \def\XML@tempa{\catcode`\-12\relax\input\xmlfile\relax}
+\fi
+\fi
+
+\endlinechar`\^^M \expandafter\XML@catcodes\XML@tempa