% \iffalse meta-comment % A LaTeX Class and Package for OMDoc Text Fragments % Copyright (c) 2010 Michael Kohlhase, all rights reserved % this file is released under the % LaTeX Project Public License (LPPL) % % The original of this file is in the public repository at % http://github.com/KWARC/sTeX/ % \fi % % \iffalse %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesPackage{omtext}[2016/04/07 v1.1 OMDoc Text Fragments] % %<*driver> \documentclass{ltxdoc} \usepackage{url,array,float,amsfonts} \usepackage{omtext,omdoc} \usepackage[show]{ed} \usepackage[hyperref=auto,style=alphabetic]{biblatex} \addbibresource{kwarcpubs.bib} \addbibresource{extpubs.bib} \addbibresource{kwarccrossrefs.bib} \addbibresource{extcrossrefs.bib} \usepackage{stex-logo} \usepackage{ctangit} \usepackage{hyperref} \makeindex \floatstyle{boxed} \newfloat{exfig}{thp}{lop} \floatname{exfig}{Example} \def\tracissue#1{\cite{sTeX:online}, \hyperlink{http://trac.kwarc.info/sTeX/ticket/#1}{issue #1}} \begin{document}\DocInput{omtext.dtx}\end{document} % % \fi % %\CheckSum{411} % % \changes{v0.4}{2008/07/22}{added index markup} % \changes{v0.4}{2008/09/29}{augmenting the index macros with optional values} % \changes{v0.6}{2009/07/08}{removing {\texttt{ttin}} {\texttt{{emin}}} and friends, % they were almost never used.} % \changes{v0.6}{2009/07/08}{renmanig {\texttt{myindex}} to {\texttt{omdoc\@ index}}, % {\texttt{twin}} to {\texttt{\@ twin}}, and {\texttt{atwin}} to {\texttt{\@ atwin}} to % make them packge-local} % \changes{v0.7}{2010/02/11}{changing blockquote to sblockquote and inlinequote similarly} % \changes{v0.9}{2010/05/25}{separated out from \texttt{omdoc.dtx}} % \changes{v1.0}{2010/06/18}{fixing typos} % \changes{v1.1}{2015/10/13}{changing \texttt{\textbackslash textleadsto} to % \texttt{\textbackslash ergo} and defining inverse \texttt{\textbackslash ogre}} % \changes{v1.1}{2015/11/04}{moving MathHub support out to separate package} % % \GetFileInfo{omtext.sty} % % \MakeShortVerb{\|} % % \def\omdoc{OMDoc} % \def\latexml{{\LaTeX}ML} % \title{\texttt{omtext}: Semantic Markup for Mathematical Text Fragments in {\LaTeX}\thanks{Version {\fileversion} (last revised % {\filedate})}} % \author{Michael Kohlhase\\ % Jacobs University, Bremen\\ % \url{http://kwarc.info/kohlhase}} % \maketitle % % \begin{abstract} % The |omtext| 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} text fragments in % {\LaTeX}. % \end{abstract} % %\newpage\tableofcontents\newpage % %\begin{omgroup}[id=sec:STR]{Introduction} % % The |omtext| package supplies macros and environment that allow to mark up mathematical % texts in {\sTeX}, 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} % \end{omgroup} % % \begin{omgroup}[id=sec:user]{The User Interface} % % \begin{omgroup}[id=sec:user:options]{Package Options} % % The |omtext| package takes a single option: \DescribeMacro{showmeta}|showmeta|. If % this is set, then the metadata keys are shown (see~\cite{Kohlhase:metakeys:ctan} for % details and customization options). % \end{omgroup} % % \begin{omgroup}[id=sec:user:omtext]{Mathematical Text} % % The \DescribeEnv{omtext}|omtext| environment is used for any text fragment that has a % contribution to a text that needs to be marked up. It can have a title, which can be % specified via the \DescribeMacro{title=}|title| key. Often it is also helpful to % annotate the \DescribeMacro{type=}|type| key. The standard relations from rhetorical % structure theory |abstract|, |introduction|, |conclusion|, |thesis|, |comment|, % |antithesis|, |elaboration|, |motivation|, |evidence|, |transition|, | note|, |annote| % are recommended as values. Note that some of them are unary relations like % |introduction|, which calls for a target. In this case, a target using the % \DescribeMacro{for=}|for| key should be specified. The |transition| relation is % special in that it is binary (a ``transition between two statements''), so % additionally, a source should be specified using the \DescribeMacro{from=}|from| key. % % Note that the values of the |title| and |type| keys are often displayed in the % text. This can be turned off by setting the \DescribeMacro{display=}|display| key to % the value |flow|. Sometimes we want to specify that a text is a continuation of % another, this can be done by giving the identifier of this in the % \DescribeMacro{continues=}|continues| key. % % Finally, there is a set of keys that pertain to the mathematical formulae in the % text. The \DescribeMacro{functions=}|functions| key allows to specify a list of % identifiers that are to be interpreted as functions in the generate content % markup. The \DescribeMacro{theory=}|theory| specifies a module % (see~\cite{KohAmb:smmssl:svn}) that is to be pre-loaded in this one\ednote{this is not % implemented yet.} Finally, \DescribeMacro{verbalizes=}|verbalizes| specifies a (more) % formal statement (see~\cite{Kohlhase:smms:svn}) that this text verbalizes or % paraphrases.\ednote{MK:specify the form of the reference.} % \end{omgroup} % % \begin{omgroup}[id=sec:user:phrase]{Phrase-Level Markup} % % \DescribeMacro{\phrase} The |phrase| macro allows to mark up phrases with semantic % information. It takes an optional |KeyVal| argument with the keys % \DescribeMacro{verbalizes=}|verbalizes| and \DescribeMacro{type=}|type| as above and % \DescribeMacro{style}|style,| \DescribeMacro{class}|class|, % \DescribeMacro{index}|index| that are disregarded in the {\LaTeX}, but copied into the % generated content markup. % % We use the \DescribeMacro{\nlex}|\nlex{|\meta{phrase}|}| for marking up phrases that % serve as natural language examples and \DescribeMacro{\nlcex}|\nlcex{|\meta{phrase}|}| % for counter-examples (utterances that are not acceptable for some reason). In natural % language examples, we sometimes use ``co-reference markers'' to specify the % resolution of anaphora and the like. We use the % \DescribeMacro{\coreft}|\coreft{|\meta{phrase}|}{|\meta{mark}|}| to mark up the % ``target'' of a co-reference and analogously \DescribeMacro{\corefs}|\corefs| for % coreference source -- e.g. for an anaphoric reference. The usage is the following: % \begin{verbatim} % \nlex{If \coreft{a farmer}1 owns \coreft{a donkey}2, % \corefs{he}2 beats \corefs{it}2.} % \end{verbatim} % is formatted to % \begin{quote} % \nlex{If \coreft{a farmer}1 owns \coreft{a donkey}2, \corefs{he}2 beats \corefs{it}2.} % \end{quote} % % \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:decl]{Declarations (under development)} % % Declarations are special phrases that carry a lot of meaning in mathematics: they % introduce and further specify the indentifiers available in formulae. They are marked % up via the \DescribeMacro{\vdec}|\vdec| macro. Inside a declaration we can use the % \DescribeMacro{\vids}|\vids| macro to mark up the variable names and % \DescribeMacro{\vrest}|\vrest| to mark up the restrictions. In the simplest case we % have a single variable as in ``\ldots for all $u$'', which we mark up as. % \begin{verbatim} % ... for all \vdec{\vids[u]{$u$}}. % \end{verbatim} % A more complex example has multiple identifiers embedded in a restriction, as in ``Let % $x,y,z\in\mathbb{R}$, such that $x+2y=z$, then \ldots'', which we mark up as % \begin{verbatim} % Let \vdec{\vids[x,y,z]{$\minset{x,y,z}\Reals$}, % such that \vrest{$x+2y=z$}}, then \ldots'' % \end{verbatim} % \ednote{explain and make better examples}\ednote{unify this with the vardef macros % from (currently) the modules package.}\ednote{talk with Frederic about this see what % other examples there are.}\ednote{how do we identify the variables in complex % restriction patterns. maybe with LMXref, which we should reinstate for this.} % \end{omgroup} % % \begin{omgroup}[id=sec:user:block]{Block-Level Markup} % % \DescribeEnv{sblockquote} The |sblockquote| environment is the big brother of the % |\sinlinequote| macro. It also takes an optional argument to specify the source. Here % the four internal macros \DescribeMacro{\begin@sblockquote}|\begin@sblockquote| to % \DescribeMacro{\end@@sblockquote}|\end@@sblockquote| are used for styling and can be % adapted by package integrators. Here a quote of Hamlet would marked up as % \begin{verbatim} % \begin{sblockquote}[Hamlet, \cite{Shak:1603:Hamlet}]\obeylines % To be, or not to be: that is the question: % Whether 'tis nobler in the mind to suffer % \end{sblockquote} % \end{verbatim} % and would render as % \begin{sblockquote}[Hamlet, (Shakespeare 1603)]\obeylines % To be, or not to be: that is the question: % Whether 'tis nobler in the mind to suffer % \end{sblockquote} % % \DescribeMacro{\lec}The |\lec| macro takes one argument and sets it as a comment at the % end of the line, making sure that if the content is too long it is pushed into a new % line. We use it internally for placing the of source of the |sblockquote| environment % above. The actual appearance of the line end comment is determined by the % \DescribeMacro{\@@lec}|\@@lec| macro, which can be customized in the document class. % \end{omgroup} % % \begin{omgroup}[id=sec:user:index]{Index Markup} % % The |omtext| package provides some extensions for the well-known indexing macros of % {\LaTeX}. The main reason for introducing these macros is that index markup in % {\omdoc} wraps the indexed terms rather than just marking the spot for % cross-referencing. Furthermore the index commands only indexes words unless % the\DescribeMacro{noindex} |noindex| option is set in the |\usepackage|. The |omtext| % package and class make the usual |\index| macro undefined\ednote{implement this and % issue the respective error message}. % % The \DescribeMacro{\indextoo}|\indextoo| macro renders a word and marks it for the % index. Sometimes, we want to index a slightly different form of the word, e.g. for % non-standard plurals: while |\indextoo{word}s| works fine, we cannot use this for the % word ``datum'', which has the plural ``data''. For this we have the macro % \DescribeMacro{\indexalt}|\indexalt|, which takes another argument for the displayed % text, allowing us to use |\indexalt{data}{datum}|, which prints ``data'' but puts % ``datum'' into the index. % % The second set of macros adds an infrastructure for two-word compounds. Take for % instance the compound ``OMDoc document'', which we usually want to add into the index % under ``OMDoc'' and ``document''. \DescribeMacro{\twintoo}|\twintoo{OMDoc}{document}| % is a variant of |\indextoo| that will do just this. Again, we have a version that % prints a variant: This is useful for situations like this the one in % Figure~\ref{fig:index-markup}: % \begin{exfig} % \begin{verbatim} % We call group \twinalt{Abelian}{Abelian}{group}, iff \ldots % \end{verbatim} % \vspace*{-1em}will result in the following % \begin{quote} % We call group \twinalt{Abelian}{Abelian}{group}, iff \ldots % \end{quote} % and put ``Abelian Group'' into the index. % \caption{Index markup}\label{fig:index-markup} % \end{exfig} % % The third set of macros does the same for two-word compounds with adjectives, % e.g. ``wonderful OMDoc % document''. \DescribeMacro{\atwintoo}|\atwin{wonderful}{OMdoc}{document}| will make the % necessary index entries under ``wonderful'' and ``document''. Again, we have a variant % \DescribeMacro{\atwinalt}|\atwinalt| whose first argument is the alternative text. % % All index macros take an optional first argument that is used for ordering the % respective entries in the index. % \end{omgroup} % % \end{omgroup} % % \begin{omgroup}{Limitations}\label{sec:limitations} % % In this section we document known limitations. If you want to help alleviate them, % please feel free to contact the package author. Some of them are currently discussed in % the \sTeX GitHub repository~\cite{sTeX:github:on}. % \begin{compactenum} % \item none reported yet % \end{compactenum} % \end{omgroup} % % \StopEventually{\newpage\PrintIndex\newpage\PrintChanges\printbibliography}\newpage % % \begin{omgroup}[id=sec:impl]{Implementation} % % \begin{omgroup}[id=sec:impl:options]{Package Options} % % 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@omtext@mh@\@omtext@mh@false \DeclareOption{mh}{\@omtext@mh@true \PassOptionsToPackage{\CurrentOption}{modules}} \newif\ifindex\indextrue \DeclareOption{noindex}{\indexfalse} \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{modules}} \ProcessOptions \ifindex\makeindex\fi % \end{macrocode} % % \begin{macrocode} \if@omtext@mh@\RequirePackage{omtext-mh}\fi \RequirePackage{xspace} \RequirePackage{modules} \RequirePackage{comment} \RequirePackage{mdframed} \RequirePackage{latexsym} % \end{macrocode} % \end{omgroup} % % \begin{omgroup}[id=sec:impl:mtxt]{Mathematical Text} % % We define the actions that are undertaken, when the keys are encountered. The first % set just records metadata; this is very simple via the |\addmetakey| % infrastructure~\ctancite{Kohlhase:metakeys}. Note that we allow math in the |title| % field, so we do not declare it to be |Semiverbatim| (indeed not at all, which allows % it by default). % % \begin{macrocode} \srefaddidkey{omtext} \addmetakey[]{omtext}{functions} \addmetakey*{omtext}{display} \addmetakey{omtext}{for} \addmetakey{omtext}{from} \addmetakey{omtext}{type} \addmetakey*{omtext}{title} \addmetakey*{omtext}{start} \addmetakey{omtext}{theory} \addmetakey{omtext}{continues} \addmetakey{omtext}{verbalizes} \addmetakey{omtext}{subject} % \end{macrocode} % The next keys handle module loading (see~\ctancite{KohAmb:smmssl}). % \begin{macrocode} % \ednote{MK: need to implement these in LaTeXML, I wonder whether there is a general % mechanism like numberit.}\ednote{MK: this needs to be rethought in the light of % |\usemodule|. It is probably obsolete. Is this used? Is this documented?} \define@key{omtext}{require}{\requiremodules{#1}{sms}} \define@key{omtext}{module}{\message{module: #1}\importmodule{#1}\def\omtext@theory{#1}} % \end{macrocode} % % \begin{macro}{\st@flow} % We define this macro, so that we can test whether the |display| key has the value |flow| % \begin{macrocode} \def\st@flow{flow} % \end{macrocode} % \end{macro} % % We define a switch that allows us to see whether we are inside an |omtext| environment % or a statement. It will be used to give better error messages for inline statements. % % \begin{macrocode} \newif\if@in@omtext\@in@omtextfalse % \end{macrocode} % % \begin{environment}{omtext} % The |omtext| environment is different, it does not have a keyword that marks % it. Instead, it can have a title, which is used in a similar way. We redefine the % |\lec| macro so the trailing |\par| does not get into the way. % \begin{macrocode} \def\omtext@pre@skip{\smallskip} \def\omtext@post@skip{} \providecommand{\stDMemph}[1]{\textbf{#1}} \newenvironment{omtext}[1][]{\@in@omtexttrue% \bgroup\metasetkeys{omtext}{#1}\sref@label@id{this paragraph}% \def\lec##1{\@lec{##1}}% \ifx\omtext@display\st@flow\else\omtext@pre@skip\par\noindent% \ifx\omtext@title\@empty% \ifx\omtext@start\@empty\else\stDMemph{\omtext@start}\xspace\fi% \else\stDMemph{\omtext@title}:\xspace% \ifx\omtext@start\@empty\else\omtext@start\xspace\fi% \fi% omtext@title empty \fi% omtext@display=flow \ignorespaces} {\egroup\omtext@post@skip\@in@omtextfalse} % \end{macrocode} % \end{environment} % \end{omgroup} % % \begin{omgroup}[id=sec:impl:phrase]{Phrase-level Markup} % % \begin{macro}{\phrase} % For the moment, we do disregard the most of the keys % \begin{macrocode} \srefaddidkey{phrase} \addmetakey{phrase}{style} \addmetakey{phrase}{class} \addmetakey{phrase}{index} \addmetakey{phrase}{verbalizes} \addmetakey{phrase}{type} \addmetakey{phrase}{only} \newcommand\phrase[2][]{\metasetkeys{phrase}{#1}% \ifx\prhase@only\@empty\only<\phrase@only>{#2}\else #2\fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\coref*} % \begin{macrocode} \providecommand\textsubscript[1]{\ensuremath{_{#1}}} \newcommand\corefs[2]{#1\textsubscript{#2}} \newcommand\coreft[2]{#1\textsuperscript{#2}} % \end{macrocode} % \end{macro} % % \begin{macro}{\n*lex} % \begin{macrocode} \newcommand\nlex[1]{\green{\sl{#1}}} \newcommand\nlcex[1]{*\green{\sl{#1}}} % \end{macrocode} % \end{macro} % % \begin{macro}{sinlinequote} % \begin{macrocode} \def\@sinlinequote#1{``{\sl{#1}}''} \def\@@sinlinequote#1#2{\@sinlinequote{#2}~#1} \newcommand\sinlinequote[2][] {\def\@opt{#1}\ifx\@opt\@empty\@sinlinequote{#2}\else\@@sinlinequote\@opt{#2}\fi} % \end{macrocode} % \end{macro} % \end{omgroup} % % \begin{omgroup}[id=sec:user:decl]{Declarations (under development)} % % The declaration macros are still under development (i.e. the macros) are still under % development and may change at any time. Currently they are completely empty. % % \begin{macrocode} \newcommand\vdec[1]{#1} \newcommand\vids[2][]{#2} \newcommand\vrest[2][]{#2} % \end{macrocode} % \end{omgroup} % % \begin{omgroup}[id=sec:impl:block]{Block-Level Markup} % % \begin{environment}{sblockquote} % \begin{macrocode} \def\begin@sblockquote{\begin{quote}\sl} \def\end@sblockquote{\end{quote}} \def\begin@@sblockquote#1{\begin@sblockquote} \def\end@@sblockquote#1{\def\@@lec##1{{\rm ##1}}\@lec{#1}\end@sblockquote} \newenvironment{sblockquote}[1][] {\def\@opt{#1}\ifx\@opt\@empty\begin@sblockquote\else\begin@@sblockquote\@opt\fi} {\ifx\@opt\@empty\end@sblockquote\else\end@@sblockquote\@opt\fi} % \end{macrocode} % \end{environment} % % \begin{environment}{sboxquote} % \begin{macrocode} \newenvironment{sboxquote}[1][] {\def\@@src{#1}\begin{mdframed}[leftmargin=.5cm,rightmargin=.5cm]} {\@lec{\rm\@@src}\end{mdframed}} % \end{macrocode} % \end{environment} % % The line end comment macro makes sure that it will not be forced on the next line unless % necessary. % \begin{macro}{\lec} % The actual appearance of the line end comment is determined by the |\@@lec| macro, % which can be customized in the document class. The basic one here is provided so that % it is not missing. % \begin{macrocode} \providecommand{\@@lec}[1]{(#1)} \def\@lec#1{\strut\hfil\strut\null\nobreak\hfill\@@lec{#1}} \def\lec#1{\@lec{#1}\par} % \end{macrocode} % \end{macro} % % \begin{macro}{\my*graphics} % We set up a special treatment for including graphics to respect the intended {\omdoc} % document structure. The main work is done in the transformation stylesheet though. % \begin{macrocode} \newcommand\mygraphics[2][]{\includegraphics[#1]{#2}} \newcommand\mycgraphics[2][]{\begin{center}\mygraphics[#1]{#2}\end{center}} \newcommand\mybgraphics[2][]{\fbox{\mygraphics[#1]{#2}}} \newcommand\mycbgraphics[2][]{\begin{center}\fbox{\mygraphics[#1]{#2}}\end{center}} % \end{macrocode} % \end{macro} % \end{omgroup} % % \begin{omgroup}[id=sec:impl:index]{Index Markup} % \begin{macro}{\omdoc@index*} % these are the main internal indexing commands -- dividing them into three is awful, % but I did not get list processing running. It makes sure that the modules necessary % for interpreting the math in the index entries are loaded. If the |loadmodules| key is % given, we import the module we are in otherwise all the currently imported modules. We % do not have to require the module files, since the index is a the end of the % document. If the |at| key is given, then we use that for sorting in the index. % \begin{macrocode} \addmetakey{omdoc@index}{at} \addmetakey[false]{omdoc@index}{loadmodules}[true] \newcommand\omdoc@indexi[2][]{\ifindex% \metasetkeys{omdoc@index}{#1}% \@bsphack\begingroup\@sanitize% \protected@write\@indexfile{}{\string\indexentry% {\ifx\omdoc@index@at\@empty\else\omdoc@index@at @\fi% \ifx\omdoc@index@loadmodules\@true% \string\withusedmodules{\@ifundefined{mod@id}\used@modules\mod@id}{#2}% \else #2\fi% loadmodules }{\thepage}}% \endgroup\@esphack\fi}%ifindex \newcommand\omdoc@indexii[3][]{\ifindex% \metasetkeys{omdoc@index}{#1}% \@bsphack\begingroup\@sanitize% \protected@write\@indexfile{}{\string\indexentry% {\ifx\omdoc@index@at\@empty\else\omdoc@index@at @\fi% \ifx\omdoc@index@loadmodules\@true% \string\withusedmodules{\@ifundefined{mod@id}\used@modules\mod@id}{#2}!% \string\withusedmodules{\@ifundefined{mod@id}\used@modules\mod@id}{#3}% \else #2!#3\fi% loadmodules }{\thepage}}% \endgroup\@esphack\fi}%ifindex \newcommand\omdoc@indexiii[4][]{\ifindex% \metasetkeys{omdoc@index}{#1}% \@bsphack\begingroup\@sanitize% \protected@write\@indexfile{}{\string\indexentry% {\ifx\omdoc@index@at\@empty\else\omdoc@index@at @\fi% \ifx\omdoc@index@loadmodules\@true% \string\withusedmodules{\@ifundefined{mod@id}\used@modules\mod@id}{#2}!% \string\withusedmodules{\@ifundefined{mod@id}\used@modules\mod@id}{#3}!% \string\withusedmodules{\@ifundefined{mod@id}\used@modules\mod@id}{#4}% \else #2!#3\fi% loadmodules }{\thepage}}% \endgroup\@esphack\fi}%ifindex % \end{macrocode} % \end{macro} % % Now, we make two interface macros that make use of this: % % \begin{macro}{\indexalt} % \begin{macrocode} \newcommand\indexalt[3][]{{#2}\omdoc@indexi[#1]{#3}} % word in text and index % \end{macrocode} % \end{macro} % % \begin{macro}{\indextoo} % \begin{macrocode} \newcommand\indextoo[2][]{{#2}\omdoc@indexi[#1]{#2}} % word in text and index % \end{macrocode} % \end{macro} % % \begin{macro}{\@twin} % this puts two-compound words into the index in various permutations % \begin{macrocode} \newcommand\@twin[3][]{\omdoc@indexii[#1]{#2}{#3}\omdoc@indexii[#1]{#3}{#2}} % \end{macrocode} % \end{macro} % % And again we have two interface macros building on this % % \begin{macro}{\twinalt} % \begin{macrocode} \newcommand\twinalt[4][]{#2\@twin[#1]{#3}{#4}} % \end{macrocode} % \end{macro} % % \begin{macro}{\twinalt} % \begin{macrocode} \newcommand\twintoo[3][]{{#2 #3}\@twin[#1]{#2}{#3}} % and use the word compound too % \end{macrocode} % \end{macro} % % \begin{macro}{\@atwin} % this puts adjectivized two-compound words into the index in various % permutations\ednote{what to do with the optional argument here and below?} % \begin{macrocode} \newcommand\@atwin[4][]{\omdoc@indexiii[#1]{#2}{#3}{#4}\omdoc@indexii[#1]{#3}{#2 (#4)}} % \end{macrocode} % \end{macro} % % and the two interface macros for this case: % \begin{macro}{\@atwinalt} % \begin{macrocode} \newcommand\atwinalt[5][]{#2\@atwin[#1]{#3}{#4}{#4}} % \end{macrocode} % \end{macro} % % \begin{macro}{\atwintoo} % \begin{macrocode} \newcommand\atwintoo[4][]{{#2 #3 #4}\@atwin[#1]{#2}{#3}{#4}} % and use it too % \end{macrocode} % \end{macro} % \end{omgroup} % % \begin{omgroup}[id=sec:impl:misc]{Miscellaneous} % Some shortcuts that use math symbols but are not mathematical at all; in particular, % they should not be translated by {\latexml}. % \begin{macrocode} \newcommand\hateq{\ensuremath{\hat=}\xspace} \newcommand\hatequiv{\ensuremath{\hat\equiv}\xspace} \@ifundefined{ergo}% {\newcommand\ergo{\ensuremath{\leadsto}\xspace}}% {\renewcommand\ergo{\ensuremath{\leadsto}\xspace}}% \newcommand{\reflect@squig}[2]{\reflectbox{$\m@th#1\rightsquigarrow$}}% \newcommand\ogre{\ensuremath{\mathrel{\mathpalette\reflect@squig\relax}}\xspace}% % % \end{macrocode} % % \end{omgroup} %\end{omgroup} % \Finale \endinput % \iffalse %%% Local Variables: %%% mode: doctex %%% TeX-master: t %%% End: % \fi % LocalWords: GPL structuresharing STR omdoc dtx stex CPERL LoadClass url dc filedate sl % LocalWords: RequirePackage RegisterNamespace namespace xsl DocType ltxml dtd annote mh % LocalWords: ltx DefEnvironment beforeDigest AssignValue inPreamble getGullet indexalt % LocalWords: afterDigest keyval omgroup DefKeyVal Semiverbatim KeyVal regexp indexalt % LocalWords: OptionalKeyVals DefParameterType IfBeginFollows skipSpaces CMP rangle rel % LocalWords: ifNext DefMacro needwrapper unlist DefConstructor omtext bgroup rangle baz % LocalWords: useCMPItemizations RefStepItemCounter egroup beginItemize li di makeindex % LocalWords: beforeDigestEnd dt autoclose ul ol dl env showignores srcref def st@flow % LocalWords: afterOpen LastSeenCMP autoClose DefCMPEnvironment proto ToString KeyVals % LocalWords: addAttribute nlex nlcex omdocColorMacro args tok MergeFont qw rm XPointer % LocalWords: TokenizeInternal toString isMath foreach maybeCloseElement id'd endinput % LocalWords: autoOpen minipage footnotesize scriptsize numberIt whatsit href HorIacJuc % LocalWords: getAttribute setAttribute OMDoc RelaxNGSchema noindex xml lec sc cscpnrr11 % LocalWords: Subsubsection useDefaultItemizations refundefinedtrue sblockquote foobar % LocalWords: DefCMPConstructor sinlinequote idx idt ide idp emph extrefs sref mhrepos % LocalWords: flushleft flushright DeclareOption PassOptions undef cls iffalse mathhub % LocalWords: ProcessOptions subparagraph ignoresfalse ignorestrue raisebox tr finalpath % LocalWords: texorpdfstring latexml texttt fileversion maketitle newpage iff mh-variant % LocalWords: tableofcontents newpage ednote obeylines usepackage indextoo Cwd coreft % LocalWords: indextoo twintoo twintoo exfig vspace twinalt ldots ttin emin importmodule % LocalWords: renmanig myindex atwin atwin packge-local blockquote inlinequote coreft % LocalWords: atwintoo atwinalt atwinalt printbibliography impl cwd newif ifx mhgraphics % LocalWords: ifindex indextrue indexfalse srefaddidkey smallskip showmeta importmodules % LocalWords: providecommand stDMemph textbf newenvironment hfil showmeta NeedsTeXFormat % LocalWords: noindent ignorespaces newcommand nobreak hfill hbox mygraphics mhcgraphics % LocalWords: includegraphics mycgraphics mybgraphics fbox adjectivized hspace corefs % LocalWords: printindex jobname.ind jobname.ind omspace footnotemark thead mhcgraphics % LocalWords: footnotetext findnodes doctex textsf langle textsf langle funval corefs % LocalWords: metakeys funsymbs addmetakey metasetkeys startemph textsl textit mdframed % LocalWords: compactenum ifundefined localname localname xspace ctancite mhcurrentrepos % LocalWords: KohAmb smmssl requiremodules prhase bsphack begingroup thepage mh-variants % LocalWords: indexentry endgroup esphack SOURCEFILE baselocal BASELOCAL importmhmodule % LocalWords: mh@currentrepos mhbgraphics co-rerefence usemodule coref textsubscript % LocalWords: ensuremath textsuperscript sboxquote leftmargin rightmargin mycbgraphics % LocalWords: mhcbgraphics textleadsto customization specializing customized behavior % LocalWords: flexiformal latexsym itemize loadmodules recognize hateq hatequiv equiv % LocalWords: leadsto renewcommand reflect@squig reflectbox m@th rightsquigarrow % LocalWords: mathrel mathpalette % \endinput % Local Variables: % mode: doctex % TeX-master: t % End: