diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/stex/omdoc/omdoc.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/stex/omdoc/omdoc.dtx | 695 |
1 files changed, 695 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/stex/omdoc/omdoc.dtx b/Master/texmf-dist/source/latex/stex/omdoc/omdoc.dtx new file mode 100644 index 00000000000..2503218bc51 --- /dev/null +++ b/Master/texmf-dist/source/latex/stex/omdoc/omdoc.dtx @@ -0,0 +1,695 @@ +% \iffalse meta-comment +% A LaTeX Class and Package for OMDoc Document Structures +% Copyright (c) 2009 Michael Kohlhase, all rights reserved +% this file is released under the +% LaTeX Project Public License (LPPL) +% +% The development version of this file can be found at +% $HeadURL: https://svn.kwarc.info/repos/stex/trunk/sty/omdoc/omdoc.dtx $ +% \fi +% +% \iffalse +%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%<package>\ProvidesPackage{omdoc}[2010/06/25 v1.0 OMDoc document Structure] +%<cls>\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%<cls>\ProvidesClass{omdoc}[2010/06/25 v1.0 OMDoc Documents] +% +%<*driver> +\documentclass{ltxdoc} +\usepackage{url,array,omdoc,omtext,float} +\usepackage[show]{ed} +\usepackage[hyperref=auto,style=alphabetic]{biblatex} +\bibliography{kwarc} +\usepackage[eso-foot,today]{svninfo} +\svnInfo $Id: omdoc.dtx 1502 2010-07-20 08:17:00Z kohlhase $ +\svnKeyword $HeadURL: https://svn.kwarc.info/repos/stex/trunk/sty/omdoc/omdoc.dtx $ +\usepackage{stex-logo} +\usepackage{../ctansvn} +\usepackage{hyperref} +\makeindex +\floatstyle{boxed} +\newfloat{exfig}{thp}{lop} +\floatname{exfig}{Example} +\begin{document}\DocInput{omdoc.dtx}\end{document} +%</driver> +% \fi +% +%\CheckSum{275} +% +% \changes{v0.1}{2006/1/17}{First Version} +% \changes{v0.2}{2006/7/11}{added OMDoc class} +% \changes{v0.3}{2007/09/09}{moved omtext and friends here from the statements package} +% \changes{v0.4}{2008/09/06}{added quotes} +% \changes{v0.5}{2008/03/28}{more package/class options} +% \changes{v0.7}{2009/11/24}{giving keyval arguments to the document environment} +% \changes{v1.0}{2010/05/25}{separated out \texttt{omtext.dtx}} +% +% +% \GetFileInfo{omdoc.sty} +% +% \MakeShortVerb{\|} +% +% \def\omdoc{OMDoc} +% \def\latexml{{\LaTeX}ML} +% \title{{\texttt{omdoc.sty/cls}}: Semantic Markup for Open Mathematical Documents in {\LaTeX}\thanks{Version {\fileversion} (last revised +% {\filedate})}} +% \author{Michael Kohlhase\\ +% Jacobs University, Bremen\\ +% \url{http://kwarc.info/kohlhase}} +% \maketitle +% +% \begin{abstract} +% The |omdoc| package is part of the {\sTeX} collection, a version of {\TeX/\LaTeX} that +% allows to markup {\TeX/\LaTeX} documents semantically without leaving the document +% format, essentially turning {\TeX/\LaTeX} into a document format for mathematical +% knowledge management (MKM). +% +% This package supplies an infrastructure for writing {\omdoc} documents in {\LaTeX}. +% This includes a simple structure sharing mechanism for {\sTeX} that allows to to move +% from a copy-and-paste document development model to a copy-and-reference model, which +% conserves space and simplifies document management. The augmented structure can be +% used by MKM systems for added-value services, either directly from the {\sTeX} +% sources, or after translation. +% \end{abstract} +% +%\newpage\tableofcontents\newpage +% +%\begin{omgroup}[id=sec:STR]{Introduction} +% +% The |omdoc| package supplies macros and environment that allow to label document +% fragments and to reference them later in the same document or in other documents. In +% essence, this enhances the document-as-trees model to +% documents-as-directed-acyclic-graphs (DAG) model. This structure can be used by MKM +% systems for added-value services, either directly from the {\sTeX} sources, or after +% translation. Currently, trans-document referencing provided by this package can only +% be used in the {\sTeX} collection. +% +% {\sTeX} is a version of {\TeX/\LaTeX} that allows to markup {\TeX/\LaTeX} documents +% semantically without leaving the document format, essentially turning {\TeX/\LaTeX} +% into a document format for mathematical knowledge management (MKM). The package +% supports direct translation to the {\omdoc} format~\cite{Kohlhase:omdoc1.2} +% +% DAG models of documents allow to replace the ``Copy and Paste'' in the source document +% with a label-and-reference model where document are shared in the document source and +% the formatter does the copying during document formatting/presentation.\ednote{talk +% about the advantages and give an example.}\ednote{is there a way to load documents at +% URIs in LaTeX?}\ednote{integrate with latexml's XMRef in the Math mode.} +% \end{omgroup} +% +% \begin{omgroup}[id=sec:user]{The User Interface}\ +% +% The |omdoc| package generates four files: |omdoc.cls|, |omdoc.sty| and their {\latexml} +% bindings |omdoc.cls.ltxml| and |omdoc.sty.ltxml|. We keep the corresponding code +% fragments together, since the documentation applies to both of them and to prevent them +% from getting out of sync. The {\omdoc} class is a minimally changed variant of the +% standard |article| class that includes the functionality provided by |omdoc.sty|. Most +% importantly, |omdoc.cls| sets up the {\latexml} infrastructure and thus should be used +% if {\omdoc} is to be generated from the {\sTeX} sources. The rest of the documentation +% pertains to the functionality introduced by |omdoc.sty|. +% +% \begin{omgroup}[id=sec:user:options]{Package and Class Options} +% +% |omdoc.sty| has the \DescribeMacro{noindex}|noindex| package option, which allows to +% suppress the creation of index entries. The \DescribeMacro{extrefs} option can be set +% to activate multifile support, see~\ctancite{Kohlhase:sref} for details. +% +% |omdoc.cls| accepts all options of the |omdoc.sty| (see~\sref{sec:user:options}) and +% |article.cls| and just passes them on to these. \ednote{describe them} +% \end{omgroup} +% +% \begin{omgroup}[id=sec:user:struct]{Document Structure} +% +% The top-level \DescribeEnv{document}|document| environment is augmented with an +% optional key/value argument that can be used to give metadata about the document. For +% the moment only the \DescribeMacro{id}|id| key is used to give an identifier to the +% \texttt{omdoc} element resulting from the {\latexml} transformation. +% +% \DescribeEnv{omgroup} The structure of the document is given by the |omgroup| +% environment just like in {\omdoc}. In the {\LaTeX} route, the |omgroup| environment is +% flexibly mapped to sectioning commands, inducing the proper sectioning level from the +% nesting of |omgroup| environments. Correspondingly, the |omgroup| environment takes an +% optional key/value argument for metadata followed by a regular argument for the +% (section) title of the omgroup. The optional metadata argument has the keys +% \DescribeMacro{id}|id| for an identifier, \DescribeMacro{creators}|creators| and +% \DescribeMacro{contributors}|contributors| for the Dublin Core +% metadata~\cite{DCMI:dmt03}; see~\ctancite{Kohlhase:dcm} for details of the format. The +% \DescribeMacro{short}|short| allows to give a short title for the generated section. +% \end{omgroup} +% +% \begin{omgroup}[id=sec:user:omtext]{Mathematical Text} +% +% The \DescribeEnv{ignore}|ignore| environment can be used for hiding text parts from the +% document structure. The body of the environment is not PDF or DVI output unless the +% \DescribeMacro{showignores}|showignores| option is given to the |omdoc| class or +% |package|. But in the generated {\omdoc} result, the body is marked up with a |ignore| +% element. This is useful in two situations. For +% \begin{description} +% \item[editing] One may want to hide unfinished or obsolete parts of a document +% \item[narrative/content markup] In {\stex} we mark up narrative-structured documents. In +% the generated {\omdoc} documents we want to be able to cache content objects that are +% not directly visible. For instance in the |statements| +% package~\ctancite{Kohlhase:smms} we use the |\inlinedef| macro to mark up +% phrase-level definitions, which verbalize more formal definitions. The latter can be +% hidden by an ignore and referenced by the |verbalizes| key in |\inlinedef|. +% \end{description} +% +% \end{omgroup} +% +% \begin{omgroup}[id=sec:user:sharing]{Structure Sharing} +% +% \DescribeMacro{\STRlabel}\DescribeMacro{\STRcopy} The |\STRlabel| macro takes two +% arguments: a label and the content and stores the the content for later use by +% |\STRcopy{label}|, which expands to the previously stored content. +% +% \DescribeMacro{\STRsemantics} The |\STRlabel| macro has a variant |\STRsemantics|, where +% the label argument is optional, and which takes a third argument, which is ignored in +% {\LaTeX}. This allows to specify the meaning of the content (whatever that may mean) in +% cases, where the source document is not formatted for presentation, but is transformed +% into some content markup format. \ednote{make an example} +% \end{omgroup} +% +% \begin{omgroup}[id=sec:user:phrase]{Phrase-Level Markup} +% +% \DescribeEnv{phrase} The |phrase| environment allows to mark up phrases with semantic +% information. It takes an optional |KeyVal| argument with the keys\ednote{continue} +% +% \DescribeMacro{\sinlinequote} The |sinlinequote| macro allows to mark up quotes inline and +% attribute them. The quote itself is given as the argument, possibly preceded by the a +% specification of the source in a an optional argument. For instance, we would quote +% Hamlet with +% \begin{verbatim} +% \sinlinequote[Hamlet, \cite{Shak:1603:Hamlet}]{To be or not to be} +% \end{verbatim} +% which would appear as \sinlinequote[Hamlet, (Shakespeare 1603)]{To be or not to be} in +% the text. The style in which inline quotations appear in the text can be adapted by +% specializing the macros \DescribeMacro{\@sinlinequote}|\@sinlinequote| --- for quotations +% without source and \DescribeMacro{\@@sinlinequote}|\@@sinlinequote| --- for quotations with +% source. +% \end{omgroup} +% +% \begin{omgroup}[id=sec:user:colors]{Colors} +% +% For convenience, the |omdoc| package defines a couple of color macros for the |color| +% package: For instance \DescribeMacro{\blue}|\blue| abbreviates |\textcolor{blue}|, so +% that |\blue{|\meta{something}|}| writes \meta{something} in blue. The macros +% \DescribeMacro{\red}|\red| \DescribeMacro{\green}|\green| \DescribeMacro{\cyan}|\cyan| +% \DescribeMacro{\magenta}|\magenta| \DescribeMacro{\brown}|\brown| +% \DescribeMacro{\yellow}|\yellow|, and finally \DescribeMacro{\black}|\black| are +% analogous. +% \end{omgroup} +% \end{omgroup} +% +% \StopEventually{\newpage\PrintIndex\newpage\PrintChanges\printbibliography}\newpage +% +% \begin{omgroup}[id=sec:impl:cls]{Implementation: The OMDoc Class} +% +% The |omdoc| package generates four files: |omdoc.cls| (all the code between +% {\textsf{$\langle$*cls$\rangle$}} and {\textsf{$\langle$/cls$\rangle$}}), |omdoc.sty| +% (between {\textsf{$\langle$*package$\rangle$}} and +% {\textsf{$\langle$/package$\rangle$}}) and their {\latexml} bindings (between +% {\textsf{$\langle$*ltxml.cls$\rangle$}} and {\textsf{$\langle$/ltxml.cls$\rangle$}} and +% {\textsf{$\langle$*ltxml.sty$\rangle$}} and {\textsf{$\langle$/ltxml.sty$\rangle$ +% respetively}}). 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 load |article.cls|, and the desired packages. For the {\latexml} bindings, we make +% sure the right packages are loaded. +% \begin{macrocode} +%<*cls> +\def\omdoc@class{article} +\DeclareOption{report}{\def\omdoc@class{report}\PassOptionsToPackage{\CurrentOption}{omdoc}} +\DeclareOption{book}{\def\omdoc@class{book}\PassOptionsToPackage{\CurrentOption}{omdoc}} +\DeclareOption{chapter}{\PassOptionsToPackage{\CurrentOption}{omdoc}} +\DeclareOption{part}{\PassOptionsToPackage{\CurrentOption}{omdoc}} +\DeclareOption{showignores}{\PassOptionsToPackage{\CurrentOption}{omdoc}} +\DeclareOption{extrefs}{\PassOptionsToPackage{\CurrentOption}{sref}} +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} +\ProcessOptions +\LoadClass{\omdoc@class} +\RequirePackage{omdoc} +%</cls> +%<*ltxml.cls> +# -*- CPERL -*- +package LaTeXML::Package::Pool; +use strict; +use LaTeXML::Package; +use LaTeXML::Util::Pathname; +use Cwd qw(cwd abs_path); +DeclareOption('report',sub {PassOptions('omdoc','sty',ToString(Digest(T_CS('\CurrentOption')))); }); +DeclareOption('book',sub {PassOptions('omdoc','sty',ToString(Digest(T_CS('\CurrentOption')))); }); +DeclareOption('chapter',sub {PassOptions('omdoc','sty',ToString(Digest(T_CS('\CurrentOption')))); }); +DeclareOption('part',sub {PassOptions('omdoc','sty',ToString(Digest(T_CS('\CurrentOption')))); }); +DeclareOption('showignores',sub {PassOptions('omdoc','sty',ToString(Digest(T_CS('\CurrentOption')))); }); +DeclareOption('extrefs',sub {PassOptions('sref','sty',ToString(Digest(T_CS('\CurrentOption')))); }); +DeclareOption(undef,sub {PassOptions('article','cls',ToString(Digest(T_CS('\CurrentOption')))); }); +ProcessOptions(); +LoadClass('article'); +RequirePackage('sref'); +%</ltxml.cls> +% \end{macrocode} +% Now, we also need to register the namespace prefixes for {\latexml} to use. +% \begin{macrocode} +%<*ltxml.cls> +RegisterNamespace('omdoc'=>"http://omdoc.org/ns"); +RegisterNamespace('om'=>"http://www.openmath.org/OpenMath"); +RegisterNamespace('m'=>"http://www.w3.org/1998/Math/MathML"); +RegisterNamespace('dc'=>"http://purl.org/dc/elements/1.1/"); +RegisterNamespace('cc'=>"http://creativecommons.org/ns"); +RegisterNamespace('stex'=>"http://kwarc.info/ns/sTeX"); +RegisterNamespace('ltx'=>"http://dlmf.nist.gov/LaTeXML"); +%</ltxml.cls> +% \end{macrocode} +% Since we are dealing with a class, we need to set up the document type in the {\latexml} +% bindings. +% \begin{macrocode} +%<*ltxml.cls> +RelaxNGSchema('omdoc+ltxml', + '#default'=>"http://omdoc.org/ns", + 'om'=>"http://www.openmath.org/OpenMath", + 'm'=>"http://www.w3.org/1998/Math/MathML", + 'dc'=>"http://purl.org/dc/elements/1.1/", + 'cc'=>"http://creativecommons.org/ns", + 'ltx'=>"http://dlmf.nist.gov/LaTeXML", + 'stex'=>"http://kwarc.info/ns/sTeX"); +%</ltxml.cls> +% \end{macrocode} +% Then we load the |omdoc| package, which we define separately in the next section so that +% it can be loaded separately\ednote{reword} +% \begin{macrocode} +%<*ltxml.cls> +RequirePackage('omdoc'); +%</ltxml.cls> +% \end{macrocode} +% +% Now, we will define the environments we need. The top-level one is the |document| +% environment, which we redefined so that we can provide keyval arguments. +% +% \begin{environment}{document} +% For the moment we do not use them on the {\LaTeX} level, but the document identifier +% is picked up by {\latexml}. +% \begin{macrocode} +%<*cls> +\let\orig@document=\document +\renewcommand{\document}[1][]{\orig@document} +%</cls> +%<*ltxml.cls> +sub xmlBase { + my $baseuri = LookupValue('baseuri'); + my $baselocal = LookupValue('baselocal'); + my $cdir = abs_path(cwd()); + $cdir =~ s/^$baselocal//; + my ($d,$f,$t) = pathname_split(LookupValue('SOURCEFILE')); + $t = '' if LookupValue('cooluri'); + Tokenize($baseuri.$cdir.'/'.$f.$t); } +DefEnvironment('{document} OptionalKeyVals:omdoc', + "<omdoc:omdoc " + . "?&KeyVal(#1,'id')(xml:id='&KeyVal(#1,'id')')" + . "(?&Tokenize(&LookupValue('SOURCEBASE'))" + . "(xml:id='&Tokenize(&LookupValue('SOURCEBASE')).omdoc')()) " + . "?&Tokenize(&LookupValue('baseuri'))" + . "(xml:base='&xmlBase()')() " + . "?#locator(stex:srcref='#locator')()>" + . "#body" + ."</omdoc:omdoc>", + beforeDigest=> sub { AssignValue(inPreamble=>0); }, + afterDigest=> sub { $_[0]->getGullet->flush; return; }); +%</ltxml.cls> +% \end{macrocode} +% \end{environment} +% \end{omgroup} +% +% \begin{omgroup}[id=sec:impl:sty]{Implementation: OMDoc Package} +% +% \begin{omgroup}[id=sec:impl:options]{Package Options} +% +% The initial setup for {\latexml}: +% +% \begin{macrocode} +%<*ltxml.sty> +package LaTeXML::Package::Pool; +use strict; +use LaTeXML::Package; +use Cwd qw(cwd abs_path); +%</ltxml.sty> +% \end{macrocode} +% +% We declare some switches which will modify the behavior according to the package +% options. Generally, an option |xxx| will just set the appropriate switches to true +% (otherwise they stay false).\ednote{need an implementation for {\latexml}} +% +% \begin{macrocode} +%<*package> +\newif\if@chapter\@chapterfalse +\newif\if@part\@partfalse +\newcount\section@level\section@level=3 +\newif\ifshow@ignores\show@ignoresfalse +\def\omdoc@class{article} +\DeclareOption{report}{\def\omdoc@class{report}\section@level=2} +\DeclareOption{book}{\def\omdoc@class{book}\section@level=1} +\DeclareOption{chapter}{\section@level=2\@chaptertrue} +\DeclareOption{part}{\section@level=1\@chaptertrue\@parttrue} +\DeclareOption{showignores}{\show@ignorestrue} +\DeclareOption{extrefs}{\PassOptionsToPackage{\CurrentOption}{sref}} +\ProcessOptions +%</package> +%<*ltxml.sty> +DeclareOption('report',''); +DeclareOption('book',''); +DeclareOption('chapter',''); +DeclareOption('part',''); +DeclareOption('showignores',''); +DeclareOption('extrefs',''); +%</ltxml.sty> +% \end{macrocode} +% +% Then we need to set up the packages by requiring the |sref| package to be loaded. +% +% \begin{macrocode} +%<*package> +\RequirePackage{sref} +\RequirePackage{comment} +%</package> +%<*ltxml.sty> +RequirePackage('sref'); +RequirePackage('omtext'); +%</ltxml.sty> +% \end{macrocode} +% \end{omgroup} +% +% \begin{omgroup}[id=sec:impl:struct]{Document Structure} +% +% The structure of the document is given by the |omgroup| environment just like in +% OMDoc. The hierarchy is adjusted automatically\ednote{maybe define the toplevel +% according to a param, need to know how to detect that the chapter macro exists.} +% +% \begin{environment}{omgroup} +% \begin{macrocode} +%<*package> +\srefaddidkey{omgroup} +\omdaddkey{omgroup}{creators} +\omdaddkey{omgroup}{contributors} +\omdaddkey{omgroup}{type} +\omdaddkey{omgroup}{short} +\omdaddkey{omgroup}{display} +\newenvironment{omgroup}[2][]% title +{\bgroup\omdsetkeys{omgroup}{#1}\sref@target +\ifx\omgroup@display\st@flow\noindent{\Large\textbf{#2}\\[.3ex]\noindent\ignorespaces} +\else +\if@part\ifnum\section@level=1\part{#2}\sref@label@id{Part \thepart}\fi\fi +\if@chapter\ifnum\section@level=2\chapter{#2}\sref@label@id{Chapter \thechapter}\fi\fi +\ifnum\section@level=3\section{#2}\sref@label@id{Section \thesection}\fi +\ifnum\section@level=4\subsection{#2}\sref@label@id{Subsection \thesubsection}\fi +\ifnum\section@level=5\subsubsection{#2}\sref@label@id{Subsubsection \thesubsubsection}\fi +\ifnum\section@level=6\paragraph{#2}\sref@label@id{this paragraph}\fi +\ifnum\section@level=7\subparagraph{#2}\sref@label@id{this subparagraph}\fi +\advance\section@level by 1 +\fi}{\egroup} +%</package> +%<*ltxml.sty> +DefEnvironment('{omgroup} OptionalKeyVals:omgroup {}', + "<omdoc:omgroup layout='sectioning'" + . "?&KeyVal(#1,'id')(xml:id='&KeyVal(#1,'id')')()" + . "?&KeyVal(#1,'type')(type='&KeyVal(#1,'type')')()>\n" + . "<dc:title ?#locator(stex:srcref='#locator')()>#2</dc:title>\n" + . "#body\n" + . "</omdoc:omgroup>"); +%</ltxml.sty> +% \end{macrocode} +% \end{environment} +% +% the |itemize|, |description|, and |enumerate| environments originally introduced in the +% |omtext| package do double duty in OMDoc, outside a |CMP| they are transformed into a +% |<omgroup layout='itemize|description|enumerate'>|, where the text after the macros +% |\item| come to be the children. If that is only text, then it is enclosed in an +% |<omtext><CMP>|, otherwise it is left as it is. The optional argument of the |\item| +% is transformed into the |<metadata><dc:title>| of the generated |\item| element. +% \begin{macrocode} +%<*ltxml.sty> +DefParameterType('IfBeginFollows', sub { + my ($gullet) = @_; + $gullet->skipSpaces; + my $next = $gullet->readToken; + $gullet->unread($next); + $next = ToString($next); + #Hm, falling back to regexp handling, the $gullet->ifNext approach didn't work properly + return 1 unless ($next=~/^\\begin/); + return; + }, + reversion=>'', optional=>1);#$ +Let('\group@item@maybe@unwrap','\relax'); +DefMacro('\group@item[] IfBeginFollows', sub { + my($gullet,$tag,$needswrapper)=@_; + ( T_CS('\group@item@maybe@unwrap'), + ($needswrapper ? (Invocation(T_CS('\group@item@wrap'),$tag)->unlist) : ()) ); }); +DefConstructor('\group@item@wrap {}', + "<omdoc:omtext>" + . "?#1(<dc:title>#1</dc:title>)()" + . "<omdoc:CMP><omdoc:p>", + beforeDigest=>sub { + Let('\group@item@maybe@unwrap','\group@item@unwrap'); + #$_[0]->bgroup; + useCMPItemizations(); + return; }, + properties=>sub{ RefStepItemCounter(); }); +DefConstructor('\group@item@unwrap', + "", + beforeDigest=>sub { + # $_[0]->egroup;#$ + Let('\group@item@maybe@unwrap','\relax'); }, + beforeConstruct=>sub { + $_[0]->maybeCloseElement('omdoc:p'); + $_[0]->maybeCloseElement('omdoc:CMP'); + $_[0]->maybeCloseElement('omdoc:omtext'); + }); +Let('group@item@maybe@unwrap','\relax'); +Let('\itemize@item'=>'\group@item'); +Let('\enumerate@item'=>'\group@item'); +Let('\description@item'=>'\group@item'); +DefEnvironment('{itemize}', + "<omdoc:omgroup xml:id='#id' layout='itemize'>" + . "#body" + ."</omdoc:omgroup>", + properties=>sub { beginItemize('itemize'); }, + beforeDigestEnd=>sub { Digest(T_CS('\group@item@maybe@unwrap')); }); +DefEnvironment('{enumerate}', + "<omdoc:omgroup xml:id='#id' layout='enumerate'>#body</omdoc:omgroup>", + properties=>sub { beginItemize('enumerate'); }, + beforeDigestEnd=>sub { Digest(T_CS('\group@item@maybe@unwrap')); }); +DefEnvironment('{description}', + "<omdoc:omgroup xml:id='#id' layout='description'>" + . "#body" + ."</omdoc:omgroup>", + properties=>sub { beginItemize('description'); }, + beforeDigestEnd=>sub { Digest(T_CS('\group@item@maybe@unwrap')); }); +%</ltxml.sty> +% \end{macrocode} +% \end{omgroup} +% +% \begin{environment}{ignore} +% \begin{macrocode} +%<*package> +\ifshow@ignores +\omdaddkey{ignore}{type} +\omdaddkey{ignore}{comment} +\newenvironment{ignore}[1][] +{\omdsetkeys{ignore}{#1}\textless\ignore@type\textgreater\bgroup\itshape} +{\egroup\textless/\ignore@type\textgreater} +\renewenvironment{ignore}{}{}\else\excludecomment{ignore}\fi +%</package> +%<*ltxml.sty> +DefKeyVal('ignore','type','Semiverbatim'); +DefKeyVal('ignore','comment','Semiverbatim'); +DefEnvironment('{ignore} OptionalKeyVals:ignore', + "<omdoc:ignore %&KeyVals(#1)>#body</omdoc:ignore>"); +%</ltxml.sty> +% \end{macrocode} +% \end{environment} +% \end{omgroup} +% +% \begin{omgroup}[id=sec:impl:share]{Structure Sharing} +% +% \begin{macro}{\STRlabel} +% The main macro, it it used to attach a label to some text expansion. Later on, using the +% |\STRcopy| macro, the author can use this label to get the expansion originally assigned. +% \begin{macrocode} +%<*package> +\long\def\STRlabel#1#2{\STRlabeldef{#1}{#2}{#2}} +%</package> +%<*ltxml.sty> +DefConstructor('\STRlabel{}{}', sub { + my($document,$label,$object)=@_; + $document->absorb($object); + $document->addAttribute('xml:id'=>ToString($label)) if $label; }); +%</ltxml.sty> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\STRcopy} +% The |\STRcopy| macro is used to call the expansion of a given label. In case the label is +% not defined it will issue a warning. +% \begin{macrocode} +%<*package> +\def\STRcopy#1{\expandafter\ifx\csname STR@#1\endcsname\relax +\message{STR warning: reference #1 undefined!} +\else\csname STR@#1\endcsname\fi} +%</package> +%<*ltxml.sty> +DefConstructor('\STRcopy{}',"<omdoc:ref xref='##1'/>"); +%</ltxml.sty> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\STRsemantics} +% if we have a presentation form and a semantic form, then we can use +% \begin{macrocode} +%<*package> +\newcommand{\STRsemantics}[3][]{#2\def\@test{#1}\ifx\@test\@empty\STRlabeldef{#1}{#2}\fi} +%</package> +%<*ltxml.sty> +DefConstructor('\STRsemantics[]{}{}', sub { + my($document,$label,$ignore,$object)=@_; + $document->absorb($object); + $document->addAttribute('xml:id'=>ToString($label)) if $label; }); +%</ltxml.sty>#$ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\STRlabeldef} +% This is the macro that does the actual labeling. Is it called inside |\STRlabel| +% \begin{macrocode} +%<*package> +\def\STRlabeldef#1{\expandafter\gdef\csname STR@#1\endcsname} +%</package> +%<*ltxml.sty> +DefMacro('\STRlabeldef{}{}', ""); +%</ltxml.sty> +% \end{macrocode} +% \end{macro} +% \end{omgroup} +% +% \begin{omgroup}[id=sec:impl:colors]{Colors} +% +% \begin{environment}{blue, red, green, magenta} +% We will use the following abbreviations for colors from |color.sty| +% \begin{macrocode} +%<*package> +\def\black#1{\textcolor{black}{#1}} +\def\blue#1{\textcolor{blue}{#1}} +\def\red#1{\textcolor{red}{#1}} +\def\green#1{\textcolor{green}{#1}} +\def\cyan#1{\textcolor{cyan}{#1}} +\def\magenta#1{\textcolor{magenta}{#1}} +\def\brown#1{\textcolor{brown}{#1}} +\def\yellow#1{\textcolor{yellow}{#1}} +\def\yellow#1{\textcolor{yellow}{#1}} +\def\orange#1{\textcolor{orange}{#1}} +%</package> +% \end{macrocode} +% For the {\latexml} bindings, we go a generic route, we replace |\blue{#1}| by +% |{\@omdoc@color{blue}\@omdoc@color@content{#1}}|. +% \begin{macrocode} +%<*ltxml.sty> +sub omdocColorMacro { + my ($color, @args) = @_; + my $tok_color = TokenizeInternal($color); + (T_BEGIN, T_CS('\@omdoc@color'), T_BEGIN, $tok_color->unlist, + T_END, T_CS('\@omdoc@color@content'), T_OTHER('['), $tok_color->unlist, T_OTHER(']'), + T_BEGIN, $args[1]->unlist, T_END, T_END); } +DefMacro('\@omdoc@color{}', sub { MergeFont(color=>$_[1]->toString); return; });#$ +%</ltxml.sty> +% \end{macrocode} +% Ideally, here we will remove the optional argument and have a conversion module +% add the attribute at the end (or maybe add it just for math?) +% or, we can take the attributes for style from the current font ? +% \begin{macrocode} +%<*ltxml.sty> +DefConstructor('\@omdoc@color@content[]{}', + "?#isMath(#2)(<omdoc:phrase ?#1(style='color:#1')()>#2</omdoc:phrase>)"); +foreach my $color(qw(blue red green magenta cyan brown yellow)) { + DefMacro("\\".$color.'{}', sub { omdocColorMacro($color, @_); }); }#$ +%</ltxml.sty> +% \end{macrocode} +% \end{environment} +% \end{omgroup} +% +% \begin{omgroup}{{\LaTeX} Commands we interpret differently} +% +% The reinterpretations are quite simple, we either disregard presentational markup or +% we re-interpret it in terms of {\omdoc}. +% \begin{macrocode} +%<*ltxml.sty> +DefConstructor('\newpage',''); +%</ltxml.sty> +% \end{macrocode} +% \end{omgroup} +% +% \begin{omgroup}[id=sec:impl:ids]{Providing IDs for {\omdoc} Elements} +% +% To provide default identifiers, we tag all {\omdoc} elements that allow |xml:id| +% attributes by executing the |numberIt| procedure below. +% +% \begin{macrocode} +%<*ltxml.sty> +Tag('omdoc:ignore',afterOpen=>\&numberIt,afterClose=>\&locateIt); +Tag('omdoc:ref',afterOpen=>\&numberIt,afterClose=>\&locateIt); +%</ltxml.sty> +% \end{macrocode} +% \end{omgroup} +% +% \begin{omgroup}{Leftovers} +% +% \begin{macrocode} +%<*package> +\newcommand{\baseURI}[2][]{} +%</package> +%<*ltxml.sty> +DefMacro('\baseURI []Semiverbatim', sub { + AssignValue('baselocal'=>abs_path(ToString(Expand($_[1])))); + AssignValue('baseuri'=>ToString(Expand($_[2])));}); +DefConstructor('\url Semiverbatim',"<omdoc:link href='#1'>#1</omdoc:link>"); +DefConstructor('\href Semiverbatim {}',"<omdoc:link href='#1'>#2</omdoc:link>"); +%</ltxml.sty> +% \end{macrocode} +% \ednote{this should be handled differently, omdoc.sty should include url and give a new +% macro for it, which we then use in omdoc} +% and finally, we need to terminate the file with a success mark for perl. +% \begin{macrocode} +%<ltxml.sty|ltxml.cls>1; +% \end{macrocode} +% \end{omgroup} +% \Finale +\endinput +% \iffalse +% LocalWords: GPL structuresharing STR omdoc dtx stex CPERL LoadClass url dc +%%% Local Variables: +%%% mode: doctex +%%% TeX-master: t +%%% End: +% \fi +% LocalWords: RequirePackage RegisterNamespace namespace xsl DocType ltxml dtd +% LocalWords: ltx DefEnvironment beforeDigest AssignValue inPreamble getGullet +% LocalWords: afterDigest keyval omgroup DefKeyVal Semiverbatim KeyVal locator +% LocalWords: OptionalKeyVals DefParameterType IfBeginFollows skipSpaces CMP +% LocalWords: ifNext DefMacro needwrapper unlist DefConstructor omtext bgroup +% LocalWords: useCMPItemizations RefStepItemCounter egroup beginItemize li di +% LocalWords: beforeDigestEnd dt autoclose ul ol dl env showignores srcref Cwd +% LocalWords: afterOpen LastSeenCMP autoClose DefCMPEnvironment proto ToString +% LocalWords: addAttribute nlex nlcex omdocColorMacro args tok MergeFont qw +% LocalWords: TokenizeInternal toString isMath foreach maybeCloseElement id'd +% LocalWords: autoOpen minipage footnotesize scriptsize numberIt whatsit href +% LocalWords: getAttribute setAttribute OMDoc RelaxNGSchema noindex xml lec +% LocalWords: Subsubsection useDefaultItemizations refundefinedtrue sblockquote +% LocalWords: DefCMPConstructor sinlinequote idx idt ide idp emph extrefs sref +% LocalWords: flushleft flushright DeclareOption PassOptions undef cls iffalse +% LocalWords: ProcessOptions subparagraph ignoresfalse ignorestrue texttt ttin +% LocalWords: texttt latexml fileversion maketitle newpage tableofcontents cwd +% LocalWords: newpage ednote ctancite dmt03 smms inlinedef STRlabel STRcopy +% LocalWords: STRlabel STRsemantics STRsemantics textcolor printbibliography +% LocalWords: textsf langle textsf langle respetively orig renewcommand cdir +% LocalWords: baseuri baseuri baselocal baselocal SOURCEFILE cooluri newif ifx +% LocalWords: SOURCEBASE chapterfalse partfalse newcount ifshow chaptertrue +% LocalWords: parttrue srefaddidkey omdaddkey newenvironment omdsetkeys textbf +% LocalWords: noindent noindent ignorespaces ifnum thepart thechapter regexp +% LocalWords: thesection thesubsection thesubsubsection needswrapper itshape +% LocalWords: textgreater renewenvironment excludecomment STRlabeldef csname +% LocalWords: expandafter endcsname xref newcommand gdef doctex |