diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/stex/presentation.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/stex/presentation.dtx | 977 |
1 files changed, 0 insertions, 977 deletions
diff --git a/Master/texmf-dist/source/latex/stex/presentation.dtx b/Master/texmf-dist/source/latex/stex/presentation.dtx deleted file mode 100644 index 63038539256..00000000000 --- a/Master/texmf-dist/source/latex/stex/presentation.dtx +++ /dev/null @@ -1,977 +0,0 @@ -% \iffalse meta-comment -% An Infrastructure for Presenting Semantic Macros in sTeX -% Copyright (C) 2004-2007 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 -% https://svn.kwarc.info/repos/kwarc/projects/stex/sty/presentation.dtx -% \fi -% -% \iffalse -%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01] -%<package>\ProvidesPackage{presentation}[2007/09/03 v0.9e presentation for semantic macros] -% -%<*driver> -\documentclass{ltxdoc} -\usepackage{url,array,presentation,float} -\usepackage[show]{ed} -\usepackage{hyperref} -\makeindex -\floatstyle{boxed} -\newfloat{exfig}{thp}{lop} -\floatname{exfig}{Example} -\begin{document}\DocInput{presentation.dtx}\end{document} -%</driver> -% \fi -% -% \CheckSum{373} -% -% \changes{v0.9}{2005/06/14}{First Version with Documentation} -% \changes{v0.9a}{2005/07/01}{Completed Documentation} -% \changes{v0.9b}{2005/08/06}{Complete functionality and Updated Documentation} -% \changes{v0.9c}{2006/01/13}{more packaging} -% \changes{v0.9d}{2006/10/13}{adding mixfix declarations} -% \changes{v0.9d}{2006/10/13}{dealing with precedences in keyword arguments} -% \changes{v0.9e}{2007/09/03}{fixing argument precedences, adding LaTeXML bindings} -% \changes{v0.9f}{2007/12/09}{adding general elision} -% -% \GetFileInfo{presentation.sty} -% -% \MakeShortVerb{\|} -%\def\scsys#1{{{\sc #1}}\index{#1@{\sc #1}}} -% \def\stex{{\raisebox{-.5ex}S\kern-.5ex\TeX}} -% \def\sTeX{\stex} -% \def\xml{\scsys{Xml}} -% \def\mathml{\scsys{MathML}} -% \def\omdoc{\scsys{OMDoc}} -% \def\openmath{\scsys{OpenMath}} -% \def\latexml{\scsys{LaTeXML}} -% \def\perl{\scsys{Perl}} -% \def\cmathml{Content-{\sc MathML}\index{Content {\sc MathML}}\index{MathML@{\sc MathML}!content}} -% \def\activemath{\scsys{ActiveMath}} -% \def\twin#1#2{\index{#1!#2}\index{#2!#1}} -% \def\twintoo#1#2{{#1 #2}\twin{#1}{#2}} -% \def\atwin#1#2#3{\index{#1!#2!#3}\index{#3!#2 (#1)}} -% \def\atwintoo#1#2#3{{#1 #2 #3}\atwin{#1}{#2}{#3}} -% \title{An Infrastructure for Presenting Semantic Macros in {\stex}\thanks{Version {\fileversion} (last revised -% {\filedate})}} -% \author{Michael Kohlhase\\ -% Jacobs University, Bremen\\ -% \url{http://kwarc.info/kohlhase}} -% \maketitle -% -% \begin{abstract} -% The |presentation| packge is a central 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 that allows to specify the presentation of -% semantic macros, including preference-based bracket elision. This allows to markup the -% functional structure of mathematical formulae without having to lose high-quality -% human-oriented presentation in {\LaTeX}. Moreover, the notation definitions can be -% used by MKM systems for added-value services, either directly from the {\sTeX} -% sources, or after translation. -% \end{abstract} -% \setcounter{tocdepth}{2}\tableofcontents\newpage -% -%\section{Introduction}\label{sec:presentation} -% -% The |presentation| package supplies an infrastructure that allows to specify the -% presentation of semantic macros, including preference-based bracket elision. This allows -% to markup the functional structure of mathematical formulae without having to lose -% high-quality human-oriented presentation in {\LaTeX}. Moreover, the notation definitions -% can be used by MKM systems for added-value services, either directly from the {\sTeX} -% sources, or after translation. -% -% {\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 setup for semantic macros described in the {\stex} |modules| package works well for -% simple mathematical functions: we make use of the macro application syntax in {\TeX} to -% express function application. For a simple function called ``foo'', we would just -% declare |\symdef{foo}[1]{foo(#1)}| and have the concise and intuitive syntax |\foo{x}| -% for $foo(x)$. But mathematical notation is much more varied and interesting than just -% this. -% -% \section{The User Interface} -% -% In this package we will follow the {\sTeX} approach and assume that there are four basic -% types of mathematical expressions: symbols, variables, applications and -% binders. Presentation of the variables is relatively straightforward, so we will not -% concern ourselves with that. The application of functions in mathematics is mostly -% presented in the form $f(a_1,\ldots,a_n)$, where $f$ is the function and the $a_i$ are -% the arguments. However, many commonly-used functions from this presentational scheme: -% for instance binomial coefficients: $\bigl({n\atop k}\bigr)$, pairs: $\langle -% a,b\rangle$, sets: $\{x\in S\,\vert\, x^2\ne0\}$, or even simple addition: $3+5+7$. Note -% that in all these cases, the presentation is determined by the (functional) head of the -% expression, so we will bind the presentational infrastructure to the operator. -% -% \subsection{Mixfix Notations}\label{sec:mixfix} -% -% For the presentation of ordinary operators, we will follow the approach used by the -% Isabelle theorem prover. There, the presentation of an $n$-ary function (i.e. one that -% takes $n$ arguments) is specified as -% \meta{pre}\meta{arg$_0$}\meta{mid$_1$}$\cdots$\meta{mid$_n$}\meta{arg$_n$}\meta{post}, -% where the \meta{arg$_i$} are the arguments and \meta{pre}, \meta{post}, and the -% \meta{mid$_i$} are presentational material. For instance, in infix operators like the -% binary subset operator, \meta{pre} and $\meta{post}$ are empty, and \meta{mid$_1$} is -% $\subseteq$. For the ternary conditional operator in a programming language, we might -% have the presentation pattern -% |if|\meta{arg$_1$}|then|\meta{arg$_2$}|else|\meta{arg$_3$}|fi| that utilizes all -% presentation positions. -% -% \DescribeMacro{\mixfix*}The |presentation| package provides mixfix declaration macros -% |\mixfixi|, |\mixfixii|, and |\mixfixiii| for unary, binary, and ternary functions. This -% covers most of the cases, larger arities would need a different argument -% pattern.\footnote{If you really need larger arities, contact the author!} The call -% pattern of these macros is just the presentation pattern above. In general, the mixfix -% declaration of arity $i$ has $2n+1$ arguments, where the even-numbered ones are for the -% arguments of the functions and the odd-numbered ones are for presentation material. For -% instance, to define a semantic macro for the subset relation and the conditional, we -% would use the markup in Figure~\ref{fig:mixfix}. -% \begin{exfig} -% \begin{verbatim} -% \symdef{sseteq}[2]{\mixfixii{}{#1}{\subseteq}{#2}{}} -% \symdef{sseteq}[2]{\infix\subseteq{#1}{#2}} -% \symdef{ite}[2]{\mixfixiii{{\tt{if}}\;}{#1} -% {\;{\tt{then}}\;}{#2} -% {\;{\tt{else}}\;}{#3}{\;{\tt{fi}}}} -% \end{verbatim} -% \vspace*{-1.5em} -% \begin{center} -% \begin{tabular}{|l|l|}\hline -% source & presentation \\\hline -% |\sseteq{S}T| & $(S\subseteq T)$\\\hline -% |\ite{x<0}{-x}x| & ${\tt{if}}\,x<0\,{\tt{then}}\,-x\,{\tt{else}}\,x\,{\tt{fi}}$\\\hline -% \end{tabular} -% \end{center} -% \caption{Declaration of mixfix operators}\label{fig:mixfix} -% \end{exfig} -% -% For certain common cases, the |presentation| package provides shortcuts for the mixfix -% declarations. The \DescribeMacro{\prefix}|\prefix| macro allows to specify a prefix -% presentation for a function (the usual presentation in mathematics). Note that it is -% better to specify |\symdef{uminus}[1]{\prefix{-}{#1}}| than just -% |\symdef{uminus}[1]{-#1}|, since we can specify the bracketing behavior in the former -% (see Section~\ref{sec:elision}). -% -% The \DescribeMacro{\postfix}|\postfix| macro is similar, only that the function is -% presented after the argument as for e.g. the factorial function: $5!$ stands for the -% result of applying the factorial function to the number 5. Note that the function is -% still the first argument to the |\postfix| macro: we would specify the presentation for -% the factorial function with |\symdef{factorial}[1]{\postfix{!}{#1}}|. -% -% Finally, we provide the \DescribeMacro{\infix}|\infix| macro for binary operators that -% are written between their arguments (see Figure~\ref{fig:mixfix}). -% -% \subsection{\texorpdfstring{$n$}{n}-ary Associative Operators}\label{sec:assoc} -% -% Take for instance the operator for set union: formally, it is a binary function on -% sets that is associative (i.e. $(S_1\cup S_2)\cup S_3=S_1\cup (S_2\cup S_3)$), therefore -% the brackets are often elided, and we write $S_1\cup S_2\cup S_3$ instead (once we have -% proven associativity). Some authors even go so far to introduce set union as a $n$-ary -% operator, i.e. a function that takes an arbitrary (positive) number of arguments. We will -% call such operators {\bf{$n$-ary -% associative}\atwin{n-ary}{associative}{operator}}. -% -% Specifying the presentation\ednote{introduce the notion of presentation above} of -% $n$-ary associative operators in |\symdef| forms is not straightforward, so we provide -% some infrastructure for that. As we cannot predict the number of arguments for $n$-ary -% operators, we have to give them all at once, if we want to maintain our use of {\TeX} -% macro application to specify function application. So a semantic macro for an $n$-ary -% operator will be applied as |\nunion{|\meta{$a_1$}|,|\ldots|,|\meta{$a_n$}|}|, where the -% sequence of $n$ logical arguments \meta{$a_i$} are supplied as one {\TeX} argument which -% contains a comma-separated list. We provide variants of the mixfix declarations -% presented in section~\ref{sec:mixfix} which deal with associative arguments. For -% instance, the variant \DescribeMacro{\mixfixa}|\mixfixa| allows to specify $n$-ary -% associative operators. -% |\mixfixa{|\meta{pre}|}{|\meta{arg}|}{|\meta{post}|}{|\meta{op}|}| specifies a -% presentation, where \meta{arg} is the associative argument and \meta{op} is the -% corresponding operator that is mapped over the argument list; as above, {\meta{pre}}, -% \meta{post}, are prefix and postfix presentational material. For instance, the finite -% set constructor could be constructed as -% \begin{verbatim} -% \newcommand{\fset}[1]{\mixfixa[p=0]{\{}{#1}{\}}{,}} -% \end{verbatim} -% -% The \DescribeMacro{\assoc}|\assoc| macro is a convenient abbreviation of a |\mixfixa| -% that can be used in cases, where \meta{pre} and \meta{post} are empty (i.e. in the -% majority of cases). It takes two arguments: the presentation of a binary operator, and a -% comma-separated list of arguments, it replaces the commas in the second argument with -% the operator in the first one. For instance |\assoc\cup{S_1,S_2,S_3}| will be formatted -% to $S_1\cup S_2\cup S_3$. Thus we can use |\def\nunion#1{\assoc\cup{#1}}| or even -% |\def\nunion{\assoc\cup}|, to define the $n$-ary operator for set union in {\TeX}. For -% the definition of a semantic macro in {\stex}, we use the second form, since we are more -% conscious of the right number of arguments and would declare -% |\symdef{nunion}[1]{\assoc\cup{#1}}|.\ednote{think about big operators for ACI -% functions} -% -% These macros |\prefix| and |\postfix| have $n$-ary variants -% \DescribeMacro{\prefixa}|\prefixa| and \DescribeMacro{\postfixa}|\postfixa| that take an -% arbitrary number of arguments (mathematically; syntactically grouped into one {\TeX} -% argument). These take an extra separator argument.\ednote{think of a good example!} - -% The |\mixfixii| macro has variants \DescribeMacro{\mixfixia}|\mixfixia|, -% \DescribeMacro{\mixfixai}|\mixfixai|, and \DescribeMacro{\mixfixaa}|\mixfixaa|, which -% allow to make one or two arguments in a binary function associative\footnote{If you -% really need larger arities with associative arguments, contact the package author!}. A -% use case for the second macro is an nary function type operator |\fntype|, which can be -% defined via -% \begin{verbatim} -% \def\fntype#1#2{\mixfixai{}{#1}\rightarrow{#2}{}\times} -% \end{verbatim} -% and which will format |\fntype{\alpha,\beta,\gamma}\delta| as -% $\alpha\times\beta\times\gamma\to\delta$. -% -% \subsection{Precedence-Based Bracket Elision}\label{sec:elision} -% -% With the infrastructure supplied by the |\assoc| macro we could now try to combine -% set union and set intersection in one formula. Then, writing -% \begin{equation}\label{cupcap} -% |\nunion{\ninters{a,b},\ninters{c,d}}| -% \end{equation} -% would yield $((a\cap b)\cup (c\cap d))$, and not $a\cap b\cup c\cap d$ as we would like, -% since $\cap$ binds stronger than $\cup$. Dropping outer brackets in the presentations of -% the presentation of the operators will not help in general: it would give the desired -% form for (\ref{cupcap}) but $a\cap b\cup c\cap d$ for (\ref{capcup}), where we would -% have liked $(a\cup b)\cap(c\cup d)$ -% \begin{equation}\label{capcup} -% |\ninters{\nunion{a,b},\nunion{c,d}}| -% \end{equation} -% -% In mathematics, brackets are elided, whenever the author anticipates that the reader can -% understand the formula without them, and would be overwhelmed with them. To achieve -% this, there are set of common conventions that govern bracket elision. The most common -% is to assign precedences to all operators, and elide brackets, if the -% {\index*{precedence}} of the operator is lower than that of the context it is presented -% in. In our example above, we would assign $\cap$ a lower precedence than $\cup$ (and -% both a lower precedence than the initial precedence). To compute the presentation of -% (\ref{capcup}) we start out with the |\ninters|, elide its brackets (since the -% precedence $n$ of $\cup$ is lower than the initial precedence $i$), and set the context -% precedence for the arguments to $n$. When we present the arguments, we present the -% brackets, since the precedence of |nunion| is lower than the context precedence $n$. -% -% This algorithm, which we call {\bf{precedence-based bracket elision}} goes a long -% way towards approximating mathematical practice. Note that full bracket elision in -% mathematical practice is a reader-oriented process, it cannot be fully mechanical, -% e.g. in $(a\cap b\cap c\cap d\cap e\cap f\cap g)\cup h$ we better put the brackets -% around the septary intersection to help the reader even thoug they could have been -% elided by our algorithm. Therefore, the author has to retain full control over -% bracketing in a bracket elision architecture (otherwise it would become impossible to -% explain the concept of associativity).\ednote{think about how to implement that}. -% -% \begin{figure}[htb] -% \begin{center} -% \begin{tabular}{|l|l|l|}\hline -% Precedence & Operators & Comment\\\hline\hline -% 200 & +,- & unary \\\hline -% 200 & $\hat{}$ & exponentiation \\\hline -% 400 & $*,\land,\cap$ & multiplicative \\\hline -% 500 & $+,-,\lor,\cup$ & additive\\\hline -% 600 & / & fraction \\\hline -% 700 & $=, \ne, \leq, <, >, \geq$ & relation\\\hline -% \end{tabular} -% \end{center} -% \caption{Common Operator Precedences}\label{fig:precedence} -% \end{figure} -% -% In {\stex} we supply an optional keyval arguments to the mixfix declarations and their -% abbreviations that allow to specify precedences: The key \DescribeMacro{p}|p| key is -% used to specify the {\bf{operator precedence}}, and the keys -% \DescribeMacro{pi}\DescribeMacro{pii}\DescribeMacro{piii}|p|\meta{i} can be used to -% specify the {\bf{argument precedence}s}. The latter will set the precedence level while -% processing the arguments, while the operator precedence invokes brackets, if it is -% larger than the current precedence level --- which is set by the appropriate argument -% precedence by the dominating operators or the outer precedence. -% -% If none of the precedences is specified, then the defaults are assumed. The operator -% precedence is set to the default operator precedence, which defaults to 1000 and can be -% set by {\DescribeMacro{\setDefaultPrecedence}}|\setDefaultPrecedence{|\meta{prec}|}| -% where \meta{prec} is an integer. The argument precedences default to the operator -% precedence. -% -% Figure~\ref{fig:precedence} gives an overview over commonly used precedences. Note that -% most operators have precedences lower than the default precedence of 1000, otherwise the -% brackets would not be elided. For our examples above, we would define -% \begin{verbatim} -% \newcommand{\nunion}[1]{\assoc[p=500]{\cup}{#1}} -% \newcommand{\ninters}[1]{\assoc[p=400]{\cap}{#1}} -% \end{verbatim} -% to get the desired behavior. -% -% Note that the presentation macros uses round brackets for grouping by default. We can -% specify other brackets via two more keywords: \DescribeMacro{lbrack}|lbrack| and -% \DescribeMacro{rbrack}|rbrack|. Just as above, we can also reset the default brackets -% with {\DescribeMacro{\setDefaultLeftBracket}}|\setDefaultLeftBracket{|\meta{lb}|}|and -% {\DescribeMacro{\setDefaultRightBracket}}|\setDefaultRightBracket{|\meta{rb}|}| where -% \meta{lb} and \meta{rb} expand to the desired brackets. Note that formula parts that -% look like brackets usually are not. For instance, we should not define the finite set -% constructor via -% \begin{verbatim} -% \newcommand{\fset}[1]{\assoc[lbrack=\{,rbrack=\}]{,}{#1}} -% \end{verbatim} -% where the curly braces are used as brackets, but as presented in section~\ref{sec:assoc} -% even though both would format |\fset{a,b,c}| as $\{a,b,c\}$. In the encoding here, an -% operator with suitably high operator precedence would be able to make the brackets -% disappear. -% -% \subsection{Flexible Elision}\label{sec:flexible-elision} -% -% There are several situations in which it is desirable to display only some parts of the -% presentation: -% \begin{itemize} -% \item We have alreday seen the case of redundant brackets above -% \item Arguments that are strictly necessary are omitted to simplify the notation, and the -% reader is trusted to fill them in from the context. -% \item Arguments are omitted because they have default values. For example $\log_{10}x$ -% is often written as $\log x$. -% \item Arguments whose values can be inferred from the other arguments are usually -% omitted. For example, matrix multiplication formally takes five arguments, namely the -% dimensions of the multiplied matrices and the matrices themselves, but only the latter -% two are displayed. -% \end{itemize} -% -% Typically, these elisions are confusing for readers who are getting acquainted with a -% topic, but become more and more helpful as the reader advances. For experienced readers -% more is elided to focus on relevant material, for beginners representations are more -% explicit. In the process of writing a mathematical document for traditional (print) -% media, an author has to decide on the intended audience and design the level of elision -% (which need not be constant over the document though). With electronic media we have new -% possibilities: we can make elisions flexible. The author still chooses the elision level -% for the initial presentation, but the reader can adapt it to her level of competence and -% comfort, making details more or less explicit. -% -% \DescribeMacro{\elide} To provide this functionality, the |presentation| package -% provides the |\elide| macro allows to asociate a text with an integer -% {\bf{visibility level}} and group them into {\bf{elision groups}}. High levels -% mean high elidability. -% -% Elision can take various forms in print and digital media. In static media like -% traditional print on paper or the PostScript format, we have to fix the elision level, -% and can decide at presentation time which elidable tokens will be printed and which will -% not. In this case, the presentation algorithm will take visibility thresholds $T_g$ for -% every elidability group $g$ as a user parameter and then elide (i.e. not print) all -% tokens in visibility group $g$ with level $l>T_g$. \DescribeMacro{\setelevel} We specify -% this threshold for via the |\setelevel| macro. For instance in the example below, we -% have a two type annotations |par| for type parameters and |typ| for type annotations -% themselves. -% -% \begin{exfig}[ht] -% \begin{verbatim} -% $\mathbf{I}\elide{par}{500}{^\alpha}\elide{typ}{100}{_{\alpha\to\alpha}} -% :=\lambda{X\elide{ty}{500}{_\alpha}}.X$ -% \end{verbatim} -% \vspace{-2em} -% \end{exfig} -% -% The visibility levels in the example encode how redundant the author thinks the elided -% parts of the formula are: low values show high redundancy. In our example the intuition -% is that the type paraemter on the $\mathbf{I}$ cominator and the type annotation on the -% bound variable $X$ in the $\lambda$ expression are of the same obviousness to the -% reader. So in a document that contains |\setegroup{typ}{1000}| and -% |\setegroup{an}{1000}| will show $\mathbf{I}:=\lambda{X}.X$ eliding all redundant -% information. If we have both values at 400, then we will see -% $\mathbf{I}^\alpha:=\lambda{X_\alpha}.X$ and only if the threshold for |typ| dips below -% 100, then we see the full information: -% $\mathbf{I}^\alpha_{\alpha\to\alpha}:=\lambda{X_\alpha}.X$. -% -% In an output format that is capable of interactively changing its appearance, e.g. -% dynamic XHTML+MathML (i.e. XHTML with embedded Presentation {\mathml} formulas, which can -% be manipulated via JavaScript in browsers), an application can export the information -% about elision groups and levels to the target format, and can then dynamically change the -% visibility thresholds by user interaction. Here the visibility threshold would also be -% used, but here it only determines the default rendering; a user can then fine-tune the -% document dynamically to reveal elided material to support understanding or to elide more -% to increase conciseness. -% -% The price the author has to pay for this enhanced user experience is that she has to -% specify elided parts of a formula that would have been left out in conventional -% {\LaTeX}. Some of this can be alleviated by good coding practices. Let us consider the log -% base case. This is elided in mathematics, since the reader is expected to pick it up from -% context. Using semantic macros, we can mimic this behavior: defining two semantic macros: -% |\logC| which picks up the log base from the context via the |\logbase| -% macro and |\logB| which takes it as a (first) argument. -% -% \begin{verbatim} -% \provideEdefault{logbase}{10} -% \symdef{logB}[2]{\prefix{\mathrm{log}\elide{base}{100}{_{#1}}}{#2}} -% \abbrdef{logC}[1]{\logB{\fromEcontext{logbase}}{#1}} -% \end{verbatim} -% -% \DescribeMacro{\provideEdefault} Here we use the |\provideEdefault| macor to initialize -% a {\LaTeX} token register for the |logbase| default, which we can pick up from the -% elision context using \DescribeMacro{\fromEcontext}|\fromEcontext| in the definition of -% |\logC|. Thus |\logC{x}| would render as $\mathrm{log}_{10}(x)$ with a threshold of 50 -% for |base| and as $\mathrm{log}_2$, if the local {\TeX} group e.g. given by the -% |assertion| environment contains a -% \DescribeMacro{setEdefault}|\setEdefault{logbase}{2}|. -% -% \subsection{Hyperlinking}\label{sec:hyperlinking} -% -%\ednote{describe what we want to do here} -% -% \subsection{Variable Names} -% -% \ednote{what is the problem?} -% -% \DescribeMacro{\vname} |\vname| identifies a token sequence as a name, and provides an -% ASCII ({\xml}-compatible) identifier for it. The optional argument is the identifier, -% and the second one the LaTeX representation. The identifier can also be used with -% |\vnameref| for copy and paste.\ednote{does this really work} -% -% \StopEventually{\ednotemessage} -% -% \section{The Implementation}\label{sec:implementation} -% -% We first make sure that the KeyVal package is loaded (in the right -% version). For {\latexml}, we also initialize the package inclusions. -% \begin{macrocode} -%<package>\RequirePackage{keyval}[1997/11/10] -%<*ltxml> -# -*- CPERL -*- -package LaTeXML::Package::Pool; -use strict; -use LaTeXML::Package; -RequirePackage('keyval'); -%</ltxml> -% \end{macrocode} -% We will first specify the default precedences and brackets, together with the macros -% that allow to set them. -% \begin{macrocode} -%<*package> -\def\pres@default@precedence{1000} -\def\setDefaultPrecedence#1{\def\pres@default@precedence{#1}} -\def\pres@initial@precedence{1000} -\def\setInitialPrecedence#1{\def\pres@initial@precedence{#1}} -\def\pres@current@precedence{\pres@initial@precedence} -\def\pres@default@lbrack{(}\def\pres@lbrack{\pres@default@lbrack} -\def\pres@default@rbrack{)}\def\pres@rbrack{\pres@default@rbrack} -\def\setDefaultLeftBracket#1{\def\pres@default@lbrack{#1}} -\def\setDefaultRightBracket#1{\def\pres@default@rbrack{#1}} -%</package> -% \end{macrocode} -% -% \subsection{The System Commands}\label{sec:impl:syscommands} -% -% \begin{macro}{\PrecSet} -% |\PrecSet| will set the default precedence.\ednote{need to implement this in {\latexml}?} -% \begin{macrocode} -%<package>\def\PrecSet#1{\def\pres@default@precedence{#1}} -%<*ltxml> -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\PrecWrite} -% |\PrecWrite| will write a bracket, if the precedence mandates it, i.e. if |\pres@p| is -% greater than the current |\pres@current@precedence| -% \begin{macrocode} -%<package>\def\PrecWrite#1{\ifnum\pres@current@precedence>\pres@p\else{#1}\fi} -% \end{macrocode} -% \end{macro} -% -% \subsection{Mixfix Operators}\label{sec:impl:mixfix} -% -% \begin{macrocode} -%<*package> -\def\clearkeys{\let\pres@p@key=\relax -\let\pres@pi@key=\relax% -\let\pres@pi@key=\relax% -\let\pres@pii@key=\relax% -\let\pres@piii@key=\relax} -\define@key{mi}{lbrack}{\def\pres@lbrack@key{#1}} -\define@key{mi}{rbrack}{\def\pres@lbrack@key{#1}} -\define@key{mi}{p}{\def\pres@p@key{#1}} -\define@key{mi}{pi}{\def\pres@pi@key{#1}} -\def\prep@keys@mi% -{\edef\pres@lbrack{\@ifundefined{pres@lbrack@key}{\pres@default@lbrack}{\pres@lbrack@key}} -\edef\pres@rbrack{\@ifundefined{pres@rbrack@key}{\pres@default@rbrack}{\pres@rbrack@key}} -\edef\pres@p{\@ifundefined{pres@p@key}{\pres@default@precedence}{\pres@p@key}} -\edef\pres@pi{\@ifundefined{pres@pi@key}{\pres@p}{\pres@pi@key}}} -%</package> -%<*ltxml> -DefKeyVal('mi','lbrack','Semiverbatim'); -DefKeyVal('mi','rbrack','Semiverbatim'); -DefKeyVal('mi','p','Semiverbatim'); -DefKeyVal('mi','pi','Semiverbatim'); -%</ltxml> -% \end{macrocode} -% -% \begin{macro}{\mixfixi} -% \begin{macrocode} -%<*package> -\newcommand{\mixfixi}[4][]%key, pre, arg, post -{\setkeys{mi}{#1}\prep@keys@mi\clearkeys -\PrecWrite\pres@lbrack% write bracket if necessary -#2{\edef\pres@current@precedence{\pres@pi}#3}#4% -\PrecWrite\pres@rbrack} -%</package> -%<*ltxml> -DefConstructor('\mixfixi OptionalKeyVals:mi {}{}{}', - "<omdoc:prototype>" - . "<om:OMA>" - . "<om:OMS cd='' name=''/>"##### need to get $cd and $name here. - . "<omdoc:expr name='arg'/>" - . "</om:OMA>" - ."</omdoc:prototype>" - ."<omdoc:rendering ?&KeyVal(#1,'p')(precedence='&KeyVal(#1,'p')')>" - . "<m:mrow>" - . "<ltx:Math><ltx:XMath>#2</ltx:XMath></ltx:Math>" - . "<omdoc:render name='arg' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "<ltx:Math><ltx:XMath>#4</ltx:XMath></ltx:Math>" - . "</m:mrow>" - ."</omdoc:rendering>", - mode=>'inline_math'); -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\mixfixa} -% \begin{macrocode} -%<*package> -\newcommand{\mixfixa}[5][]%key, pre, arg, post, assocop -{\setkeys{mi}{#1}\prep@keys@mi\clearkeys% -\PrecWrite\pres@lbrack{#2}{\@assoc\pres@pi{#5}{#3}}{#4}\PrecWrite\pres@rbrack} -%</package> -%<*ltxml> -DefConstructor('\mixfixa OptionalKeyVals:mi {}{}{}{}', - "<omdoc:prototype>" - . "<om:OMA>" - . "<om:OMS cd='' name=''/>"##### need to get $cd and $name here. - . "<omdoc:exprlist name='args'>" - . "<omdoc:expr name='arg'/>" - . "</omdoc:exprlist>" - . "</om:OMA>" - ."</omdoc:prototype>" - ."<omdoc:rendering ?&KeyVal(#1,'p')(precedence='&KeyVal(#1,'p')')>" - . "<m:mrow>" - . "<ltx:Math><ltx:XMath>#2</ltx:XMath></ltx:Math>" - . "<omdoc:iterate name='args' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "<omdoc:separator>" - . "<ltx:Math><ltx:XMath>#5</ltx:XMath></ltx:Math>" - . "</omdoc:separator>" - . "<omdoc:render name='arg' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "</omdoc:iterate>" - . "<ltx:Math><ltx:XMath>#4</ltx:XMath></ltx:Math>" - . "</m:mrow>" - ."</omdoc:rendering>", - mode=>'inline_math'); -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -%<*package> -\define@key{mii}{lbrack}{\def\pres@lbrack@key{#1}} -\define@key{mii}{rbrack}{\def\pres@lbrack@key{#1}} -\define@key{mii}{p}{\def\pres@p@key{#1}} -\define@key{mii}{pi}{\def\pres@pi@key{#1}} -\define@key{mii}{pii}{\def\pres@pii@key{#1}} -\def\prep@keys@mii{\prep@keys@mi% -\edef\pres@pii{\@ifundefined{pres@pii@key}{\pres@p}{\pres@pii@key}}% -\let\pres@pii@key=\relax} -%</package> -%<*ltxml> -DefKeyVal('mii','lbrack','Semiverbatim'); -DefKeyVal('mii','rbrack','Semiverbatim'); -DefKeyVal('mii','p','Semiverbatim'); -DefKeyVal('mii','pi','Semiverbatim'); -DefKeyVal('mii','pii','Semiverbatim'); -%</ltxml> -% \end{macrocode} -% -% \begin{macro}{\mixfixii} -% \begin{macrocode} -%<*package> -\newcommand{\mixfixii}[6][]%key, pre, arg1, mid, arg2, post -{\setkeys{mii}{#1}\prep@keys@mii\clearkeys% -\PrecWrite\pres@lbrack% write bracket if necessary -#2{\edef\pres@current@precedence{\pres@pi}#3}% -#4{\edef\pres@current@precedence{\pres@pii}#5}#6% -\PrecWrite\pres@rbrack} -%</package> -%<*ltxml> -DefConstructor('\mixfixii OptionalKeyVals:mi {}{}{}{}{}', - "<omdoc:prototype>" - . "<om:OMA>" - . "<om:OMS cd='' name=''/>"##### need to get $cd and $name here. - . "<omdoc:expr name='arg1'/>" - . "<omdoc:expr name='arg2'/>" - . "</om:OMA>" - ."</omdoc:prototype>" - ."<omdoc:rendering ?&KeyVal(#1,'p')(precedence='&KeyVal(#1,'p')')>" - . "<m:mrow>" - . "<ltx:Math><ltx:XMath>#2</ltx:XMath></ltx:Math>" - . "<omdoc:render name='arg1' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "<ltx:Math><ltx:XMath>#4</ltx:XMath></ltx:Math>" - . "<omdoc:render name='arg2' ?&KeyVal(#1,'pii')(precedence='&KeyVal(#1,'pii')')/>" - . "<ltx:Math><ltx:XMath>#6</ltx:XMath></ltx:Math>" - . "</m:mrow>" - ."</omdoc:rendering>", - mode=>'inline_math'); -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\mixfixia} -% \begin{macrocode} -%<*package> -\newcommand{\mixfixia}[7][]%key, pre, arg1, mid, arg2, post, assocop -{\setkeys{mii}{#1}\prep@keys@mii\clearkeys% -\PrecWrite\pres@lbrack% write bracket if necessary -#2{\edef\pres@current@precedence{\pres@pi}#3}% -#4{\@assoc\pres@pii{#7}{#5}}#6% -\PrecWrite\pres@rbrack} -%</package> -%<*ltxml> -DefConstructor('\mixfixia OptionalKeyVals:mi {}{}{}{}{}{}', - "<omdoc:prototype>" - . "<om:OMA>" - . "<om:OMS cd='' name=''/>"##### need to get $cd and $name here. - . "<omdoc:expr name='arg1'/>" - . "<omdoc:exprlist name='args'>" - . "<omdoc:expr name='arg'/>" - . "</omdoc:exprlist>" - . "</om:OMA>" - ."</omdoc:prototype>" - ."<omdoc:rendering ?&KeyVal(#1,'p')(precedence='&KeyVal(#1,'p')')>" - . "<m:mrow>" - . "<ltx:Math><ltx:XMath>#2</ltx:XMath></ltx:Math>" - . "<omdoc:render name='arg1' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "<ltx:Math><ltx:XMath>#4</ltx:XMath></ltx:Math>" - . "<omdoc:iterate name='args' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "<omdoc:separator>" - . "<ltx:Math><ltx:XMath>#7</ltx:XMath></ltx:Math>" - . "</omdoc:separator>" - . "<omdoc:render name='arg' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "</omdoc:iterate>" - . "<ltx:Math><ltx:XMath>#6</ltx:XMath></ltx:Math>" - . "</m:mrow>" - ."</omdoc:rendering>", - mode=>'inline_math'); -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\mixfixai} -% \begin{macrocode} -%<*package> -\newcommand{\mixfixai}[7][]%key, pre, arg1, mid, arg2, post, assocop -{\setkeys{mii}{#1}\prep@keys@mii\clearkeys% -\PrecWrite\pres@lbrack% write bracket if necessary -#2{\@assoc\pres@pi{#7}{#3}}% -#4{\edef\pres@current@precedence{\pres@pii}#5}#6% -\PrecWrite\pres@rbrack} -%</package> -%<*ltxml> -DefConstructor('\mixfixai OptionalKeyVals:mi {}{}{}{}{}{}', - "<omdoc:prototype>" - . "<om:OMA>" - . "<om:OMS cd='' name=''/>"##### need to get $cd and $name here. - . "<omdoc:exprlist name='args'>" - . "<omdoc:expr name='arg'/>" - . "</omdoc:exprlist>" - . "<omdoc:expr name='arg2'/>" - . "</om:OMA>" - ."</omdoc:prototype>" - ."<omdoc:rendering ?&KeyVal(#1,'p')(precedence='&KeyVal(#1,'p')')>" - . "<m:mrow>" - . "<ltx:Math><ltx:XMath>#2</ltx:XMath></ltx:Math>" - . "<omdoc:iterate name='args' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "<omdoc:separator>" - . "<ltx:Math><ltx:XMath>#7</ltx:XMath></ltx:Math>" - . "</omdoc:separator>" - . "<omdoc:render name='arg' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "</omdoc:iterate>" - . "<ltx:Math><ltx:XMath>#4</ltx:XMath></ltx:Math>" - . "<omdoc:render name='arg2' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "<ltx:Math><ltx:XMath>#6</ltx:XMath></ltx:Math>" - . "</m:mrow>" - ."</omdoc:rendering>", - mode=>'inline_math'); -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -%<*package> -\define@key{miii}{lbrack}{\def\pres@lbrack@key{#1}} -\define@key{miii}{rbrack}{\def\pres@lbrack@key{#1}} -\define@key{miii}{p}{\def\pres@p@key{#1}} -\define@key{miii}{pi}{\def\pres@pi@key{#1}} -\define@key{miii}{pii}{\def\pres@pii@key{#1}} -\define@key{miii}{piii}{\def\pres@piii@key{#1}} -\def\prep@keys@miii{\prep@keys@mii\edef\pres@piii{\@ifundefined{pres@piii@key}{\pres@p}{\pres@piii@key}}} -%</package> -%<*ltxml> -DefKeyVal('miii','lbrack','Semiverbatim'); -DefKeyVal('miii','rbrack','Semiverbatim'); -DefKeyVal('miii','p','Semiverbatim'); -DefKeyVal('miii','pi','Semiverbatim'); -DefKeyVal('miii','pii','Semiverbatim'); -DefKeyVal('miii','piii','Semiverbatim'); -%</ltxml> -% \end{macrocode} -% -% \begin{macro}{\mixfixiii} -% \begin{macrocode} -%<*package> -\newcommand{\mixfixiii}[8][]%key, pre, arg1, mid1, arg2, mid2, arg3, post -{\setkeys{miii}{#1}\prep@keys@miii\clearkeys% -\PrecWrite\pres@lbrack% write bracket if necessary -#2{\edef\pres@current@precedence{\pres@pi}#3}% -#4{\edef\pres@current@precedence{\pres@pii}#5}% -#6{\edef\pres@current@precedence{\pres@pii}#7}#8% -\PrecWrite\pres@rbrack} -%</package> -%<*ltxml> -DefConstructor('\mixfixiii OptionalKeyVals:mi {}{}{}{}{}{}{}', - "<omdoc:prototype>" - . "<om:OMA>" - . "<om:OMS cd='' name=''/>"##### need to get $cd and $name here. - . "<omdoc:expr name='arg1'/>" - . "<omdoc:expr name='arg2'/>" - . "<omdoc:expr name='arg3'/>" - . "</om:OMA>" - ."</omdoc:prototype>" - ."<omdoc:rendering ?&KeyVal(#1,'p')(precedence='&KeyVal(#1,'p')')>" - . "<m:mrow>" - . "<ltx:Math><ltx:XMath>#2</ltx:XMath></ltx:Math>" - . "<omdoc:render name='arg1' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "<ltx:Math><ltx:XMath>#4</ltx:XMath></ltx:Math>" - . "<omdoc:render name='arg2' ?&KeyVal(#1,'pii')(precedence='&KeyVal(#1,'pii')')/>" - . "<ltx:Math><ltx:XMath>#6</ltx:XMath></ltx:Math>" - . "<omdoc:render name='arg3' ?&KeyVal(#1,'piii')(precedence='&KeyVal(#1,'piii')')/>" - . "<ltx:Math><ltx:XMath>#8</ltx:XMath></ltx:Math>" - . "</m:mrow>" - ."</omdoc:rendering>", - mode=>'inline_math'); -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\prefix, \postfix} -% |\prefix|, |\prefixa|, |\postfix| and |\postfixa|\ednote{need prefixl and postfixl as -% well, use counters for precedences here.} are simple special cases of |\mixfixi| and -% |\mixfixa|. -% \begin{macrocode} -%<*package> -\newcommand{\prefix}[3][]%key, fn, arg -{\setkeys{mi}{#1}\prep@keys@mi\clearkeys -#2\PrecWrite\pres@lbrack% write bracket if necessary -{\edef\pres@current@precedence{\pres@pi}#3}% -\PrecWrite\pres@rbrack} -\newcommand{\postfix}[3][]%key, fn, arg -{\setkeys{mi}{#1}\prep@keys@mi\clearkeys -\PrecWrite\pres@lbrack% write bracket if necessary -{\edef\pres@current@precedence{\pres@pi}#3}% -\PrecWrite\pres@rbrack{#2}} -\newcommand{\prefixa}[4][]{\mixfixa[#1]{#2}{#3}{}{#4}} -\newcommand{\postfixa}[4][]{{#1}\mixfixa[#1]{}{#3}{#2}{#4}} -%</package> -%<*ltxml> -DefConstructor('\prefix OptionalKeyVals:mi {}{}', - "<omdoc:prototype>" - . "<om:OMA>" - . "<om:OMS cd='' name=''/>"##### need to get $cd and $name here. - . "<omdoc:expr name='arg1'/>" - . "</om:OMA>" - ."</omdoc:prototype>" - ."<omdoc:rendering ?&KeyVal(#1,'p')(precedence='&KeyVal(#1,'p')')>" - . "<m:mrow>" - . "<ltx:Math><ltx:XMath>#2</ltx:XMath></ltx:Math>" - . "<omdoc:render name='arg' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "</m:mrow>" - ."</omdoc:rendering>", - mode=>'inline_math'); -DefConstructor('\postfix OptionalKeyVals:mi {}{}', - "<omdoc:prototype>" - . "<om:OMA>" - . "<om:OMS cd='' name=''/>"##### need to get $cd and $name here. - . "<omdoc:expr name='arg1'/>" - . "</om:OMA>" - ."</omdoc:prototype>" - ."<omdoc:rendering ?&KeyVal(#1,'p')(precedence='&KeyVal(#1,'p')')>" - . "<m:mrow>" - . "<omdoc:render name='arg' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "<ltx:Math><ltx:XMath>#2</ltx:XMath></ltx:Math>" - . "</m:mrow>" - ."</omdoc:rendering>", - mode=>'inline_math'); -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\infix} -% |\infix|\ednote{need infixl as well, use counters for precedences here.} is a simple -% special case of |\mixfixii|. -% \begin{macrocode} -%<*package> -\newcommand{\infix}[4][]{\mixfixii[#1]{}{#3}{#2}{#4}{}} -%</package> -%<*ltxml> -DefMacro('\infix []{}{}{}','\mixfixii[#1]{}{#3}{#2}{#4}{}'); -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \subsection{Associative Operators}\label{sec:impl:assoc} -% -% \begin{macro}{\@assoc} -% We are using functionality from the {\LaTeX} core packages here to iterate over the -% arguments. -% \begin{macrocode} -%<*package> -\def\@assoc#1#2#3{% precedence, function, argv -\let\@tmpop=\relax% do not print the function the first time round -\@for\@I:=#3\do{\@tmpop% print the function -% write the i-th argument with locally updated precedence -{\edef\pres@current@precedence{#1}\@I}% -\let\@tmpop=#2}}%update the function -%</package> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\assoc} -% With the internal macro above, associatifivity is easily specified. -% \begin{macrocode} -%<package>\newcommand{\assoc}[3][]{\mixfixa[#1]{}{#3}{}{#2}} -%<*ltxml> -DefConstructor('\assoc OptionalKeyVals:mi {}{}', - "<omdoc:prototype>" - . "<om:OMA>" - . "<om:OMS cd='' name=''/>"##### need to get $cd and $name here. - . "<omdoc:exprlist name='args'>" - . "<omdoc:expr name='arg'/>" - . "</omdoc:exprlist>" - . "</om:OMA>" - ."</omdoc:prototype>" - ."<omdoc:rendering ?&KeyVal(#1,'p')(precedence='&KeyVal(#1,'p')')>" - . "<m:mrow>" - . "<omdoc:iterate name='args' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "<omdoc:separator>" - . "<ltx:Math><ltx:XMath>#3</ltx:XMath></ltx:Math>" - . "</omdoc:separator>" - . "<omdoc:render name='arg' ?&KeyVal(#1,'pi')(precedence='&KeyVal(#1,'pi')')/>" - . "</omdoc:iterate>" - . "</m:mrow>" - ."</omdoc:rendering>", - mode=>'inline_math'); -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \subsection{General Elision}\label{sec:impl:elision} -% -% \begin{macro}{\setegroup} -% The elision macros are quite simple, a group |foo| is internally represented by a -% macro |foo@egroup|, which we set by a |\gdef|. -% \begin{macrocode} -%<package>\def\setegroup#1#2{\expandafter\def\csname #1@egroup\endcsname{#2}} -%<*ltxml> -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\setegroup} -% Then the elision command is picks up on this (flags an error) if the internal macro -% does not exist and prints the third argument, if the elision value threshold is above -% the elision group threshold in the paper. -% \begin{macrocode} -%<*package> -\def\elide#1#2#3{\@ifundefined{#1@egroup}% -{\def\@elevel{1000} -\PackageError{presentation}{undefined egroup #1, assuming value 1000}% -{When calling \protect\elide{#1}... the elision group #1 has be have\MessageBreak -been set by \protect\setegroup before, e.g. by \protect\setegroup{an}{1000}.}}% -{\edef\@elevel{\csname #1@egroup\endcsname}}% -\ifnum\@elevel>#2\else{#3}\fi} -%</package> -%<*ltxml> -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\provideEdefault} -% The |\provideEdefault| macro sets up the context for an elision default by locally -% defining the internal macro \meta{default}|@edefault| and (if necessary) exporting it -% from the module. -% \begin{macrocode} -%<*package> -\def\provideEdefault#1#2{\expandafter\def\csname#1@edefault\endcsname{#2} -\@ifundefined{this@module}{}% -{\expandafter\g@addto@macro\this@module{\expandafter\def\csname#1@edefault\endcsname{#2}}}} -%</package> -%<*ltxml> -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\setEdefault} -% The |\setEdefault| macro just redefines the internal \meta{default}|@edefault| in the -% local group -% \begin{macrocode} -%<package>\def\setEdefault#1#2{\expandafter\def\csname #1@edfault\endcsname{#2}} -%<*ltxml> -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\fromEcontext} -% The |\fromEcontext| macro just calls internal \meta{default}|@edefault| macro. -% \begin{macrocode} -%<package>\def\fromEcontext#1{\csname #1@edefault\endcsname} -%<*ltxml> -%</ltxml> -% \end{macrocode} -% \end{macro} -% -% \subsection{Variable Names} -% -% \begin{macro}{\vname} -% a name macro\ednote{add some documentation here}\ednote{maybe this should go into the -% structuresharing package?} -% \begin{macrocode} -%<*package> -\def\MOD@namedef#1{\expandafter\def\csname MOD@name@#1\endcsname} -\def\MOD@name[#1]#2{#2\def\@test{#2}\ifx\@test\empty\else\MOD@namedef{#1}{#2}\fi} -\def\vname{\@ifnextchar[\MOD@name{\MOD@name[]}} -%</package> -%<*ltxml> -%</ltxml> -% \end{macrocode} -% \end{macro} -% \begin{macro}{\vnameref} -% \begin{macrocode} -%<package>\def\vnref#1{\csname MOD@name@#1\endcsname} -% \end{macrocode} -% \end{macro} -% -% \subsection{Hyperlinking} -% -% this only works for internal links\ednote{actually not at all!} -% \begin{macrocode} -%<package>\def\hrcr#1#2{\hyperlink{#1@\mod@id}{#2}} -%<*ltxml> -%</ltxml> -% \end{macrocode} -% the following would work for external ones, if we could know the proper extension. -% except that we should use |\char????| instead of |\#|, so that it parses -% |\def\hrcr#1#2{\href{\hr@baseURL\jobname.\hr@EXT\##1@\mod@id}{#2}}| -% where |\hr@baseURL| and |\hr@EXT| are defined in the file itself (they will need to go into -% the |SMS| file as well) -% -% \subsection{Finale} -% -% Finally, we need to terminate the file with a success mark for perl. -% \begin{macrocode} -%<ltxml>1; -% \end{macrocode} -% \Finale -\endinput - -% LocalWords: dtx CPERL RequirePackage keyval lbrack rbrack DefKeyVal omdoc -% LocalWords: Semiverbatim DefConstructor OptionalKeyVals pmml ltx XMath mii -% LocalWords: inline pii miii piii KeyVal egroup namedef |