Code Monkey home page Code Monkey logo

stex's Introduction

sTeX: An Infrastructure for Semantic Preloading of LaTeX Documents

CI Status

This repository contains the sTeX package collection, a version of TeX/LaTeX that allows to markup TeX/LaTeX documents semantically without leaving the document format.

Running pdflatex over sTeX-annotated documents formats them into normal-looking PDF. But sTeX also comes with a conversion pipeline into semantically annotated HTML5, which can host semantic added-value services that make the documents active (i.e. interactive and user-adaptive) and essentially turning LaTeX into a document format for (mathematical) knowledge management (MKM).

Copyright & License

Copyright (c) 2022 Michael Kohlhase The package is distributed under the terms of the LaTeX Project Public License (LPPL)

Maintainers

Michael Kohlhase, Dennis Müller, FAU Erlangen-Nürnberg.

Documentation

The sTeX manual gives a general introduction and motivation. The sTeX package documentation gives the details of the implementation. A complete list of sTeX-related publications can be found here.

sTeX Corpus & Best Practices

sTeX comes with a large corpus of pre-annotated materials that act as evaluation grounds and regression tests for the sTeX functionality and best practices that are publicly available.

  • HelloWorld a collection of simple hello world examples the show off the best practices of sTeX annotation.
  • SMGLoM, the Semantic, Multilingual Glossary of Mathematics (and similar disciplines). SMGloM provides a large set of definitions and well-designed semantic macros for core mathematical (and computation) concepts and objects. This resource greatly facilitates "getting off the ground" in semantic annotation.
  • MiKoMH a set of semantically annotated courses in computer science and (symbolic) AI (ca. 5000 pages of slides and notes). Ca. 3000 problem/solutions exist are only available upon request.
  • sTeX3 Labs a set of experimental re-formalizations of (mostly) SMGLoM material to fully take advantage of the sTeX3 functionality and the rusTeX/MMT pipeline and knowledge managemen facilities.

All of these are hosted on MathHub, an experimental portal for the management of active mathematical documents and flexiformal mathematics. The organization of the material into "mathematical archives" (GIT repositories with a particular standardized structure on a GitLab repository management server greatly enhances modularization and the provision of added value services.

Setup

The GIT version can just be cloned in a directory <sTeXDIR> of your choosing.

cd <sTeXDIR>
git clone https://github.com/slatex/sTeX.git

Then update your TEXINPUTS environment variable, e.g. by placing the following line in your .bashrc:

export TEXINPUTS="$(TEXINPUTS):<sTeXDIR>//:

Similarly, set your MATHHUB environment variable to where you intend to keep your sTeX archives. For details, see the documentation linked above. For a LaTeX IDE, update the directory path where pdflatex looks for paths.

For larger documents it may (rarely) be necessary to enlarge the internal memory allocation of the TEX/LATEX executables. This can be done by adding the following configurations in texmf.cnf (or changing them, if they already exist).

param_size = 20000      % simultaneous macro parameters, also applies to MP
nest_size = 1000        % simultaneous semantic levels (e.g., groups)
stack_size = 10000      % simultaneous input sources
main_memory = 12000000

Note that you will probably need sudo to do this. After that, you have to run the command

sudo fmtutil-sys --all

Manifest

The sTeX distribution contains the following directories (conformant with the CTAN organization

stex's People

Contributors

cmaeder avatar dginev avatar jazzpirate avatar jukkakohonen avatar kohlhase avatar kweide avatar pitmonticone avatar rappatoni avatar sindikat avatar slel avatar tkw1536 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

stex's Issues

make \lec work in course notes (from mikoslides.cls)

The \lec macro from omtext.sty does not work correctly in notes mode (i.e. when the mikoslides class is called with the option notes to create the course notes: instead of starting a new line if the argument of \lec is longer than the available space on the line, it just stays on the line and creates a very overfull hbox. I have no idea why this is (except that we are faking slides with
mdframed, which seems to behave differently), but we really need to fix this to make the notes more readable.

Formulas lose arguments when LaTeXML parsing fails

Formula creation seems to have a bad regression:
in smglom/smglom/source/summangoldfunction.en.tex the display formula is severely shortened (only the stuff before the = remains. (note that this is partially presentational content).
in smglom/algebra/source/commutative-ring.en.tex, the content formula \structure{R,+,0,-,\ast,1} is converted to

<om:OMA><om:OMS cd="structure" name="structure"/><om:OMV name="R"/></om:OMA>

I.e. the subsequent arguments are forgotten.

I have no idea where this could come from.

can we use relative paths in sTeX?

A couple of years ago, we standardized sTeX to use absolute paths, and I have forgotten why. The absolute paths cause a bit of problems with the docker version of lmh so may be we want to rethink this decision and try out relative paths again (or understand/document why we needed the absolute paths in the first place). Maybe @dginev can remember?

smultiling needs signature/binding structure for views

We are currently debating the structure. There is already a relatively good example in smglom/smglom/source/norm-metric.{en.,de.,}.tex but this uses the smglom package, and that functionality should be moved into smultiling.

I will continue with establishing the infrastrucutre and sTeX syntax on the LaTeX side, then @dginev can implement functionality on the LaTeXML side.

rework modules.sty.ltxml

Curently, modules.sty.ltxml it is still quite convoluted, as the low-level and high-level bits are mashed together. It is a good exercise to try and rewrite bits of modules.sty.ltxml in ways that it becomes cleaner and better structured. @dginev can give advice.

post-processing with big delimiters

A new "feature" of LaTeXML is that big delimiters are handled pseudo-semantcially. I am seeing situations like

<OMA>
   <OMS cd='latexml' and name="delimited-[]"/>
   ....
</OMA>

for \big[...\big]. This is not the OpenMath we want, It seems to me that the post-processor should add notational hints to the content MathML instead. For instance, if we have
f\big[...\big], it should generate something like

<OMA class="bigdelims-[]">
   <OMV name="f"/>
   ....
</OMA>

instead of

<OMA class="bigdelims-[]">
   <OMV name="f"/>
   <OMA>
      <OMS cd='latexml' and name="delimited-[]"/>
      ...
  </OMA>
</OMA>

This is particularly true for generating OpenMath, but should also be something to be taken into account in other LaTeXML postprocessing I guess.

\symdef makes notation definition with spurious outer brackets.

It seems that the \symdef macro makes notation definitions with spurious outer brackets. For instance in smglom/mv/source/structure.tex

  \symdef[assocarg=1]{structure}[1]{\mixfixa[nobrackets]\langle{#1}\rangle{,}}

generates

      <omdoc:rendering precedence="10000">
        <m:mrow>
          <m:mo egroup="fence" fence="true">(</m:mo>
          <m:mo cr="fun">&#x27E8;</m:mo>
          <omdoc:iterate name="args" precedence="-1000000">
            <omdoc:separator>
              <m:mo cr="fun">,</m:mo>
            </omdoc:separator>
            <omdoc:render name="arg" precedence="-1000000"/>
          </omdoc:iterate>
          <m:mo cr="fun">&#x27E9;</m:mo>
          <m:mo egroup="fence" fence="true">)</m:mo>
        </m:mrow>
      </omdoc:rendering>

there the <m:mo...>(</m:mo> and <m:mo...>)</m:mo> should be dropped.

modules.sty.ltxml for html

This is a discussion issue for implementing the html version of modules.sty.ltxml; mostly for discussion with @dginev.

  • We need to have a way to mark up module environments in LTXML. But there is no element that allows to do that, since modules can contain document structure like sections. So we need to extend the LATEXML schema for this I guess.

weird namespace prefix error in modules.sty.ltxml (html branch)

On my html branch https://github.com/kohlhase/sTeX/tree/html I get an error (below) when adding a \symdef to htmltest/thm.html (currently commented out).

Fatal:perl:die Perl died
    /Users/kohlhase/lmh/ext/sTeX/htmltest/thm.tex#textrange(from=6;0,to=6;32)
    XPath error : Undefined namespace prefix
     error : xmlXPathCompiledEval: evaluation failed
    Stack Trace:
        LaTeXML::Core::__ANON__(XPath error : Undefined namespace pre...) @ /opt/local/lib/perl5/vendor_perl/5.12.5/darwin-thread-multi-2level/XML/LibXML/Error.pm line 183
        XPath error : Undefined namespace pre...->_report_error() @ /opt/local/lib/perl5/vendor_perl/5.12.5/darwin-thread-multi-2level/XML/LibXML.pm line 1311
        <ltx:document _box="LaTeXML::Core::Wh...->findnodes('.//omdoc:notation[@name=\'mybar\' an...) @ /Users/kohlhase/localmh/ext/sTeX/sty/modules/modules.sty.ltxml line 358

But I am quite sure that htmltest/shtml.sty.ltxml declares the omdoc namespace prefix.
I am stymied, please have a look.

rethink parrayline in presentation

Currently we have a rather awkward macro \parrayline in the presentation package. It takes two arguments, the first cell and the rest. I would really like to have a simple macro \parrayline so that I can write

\symdef{matrix}[2}{\begin{array}{*{#1}}#2\end{array}}
\symdef{mrow}[1]{\varparrayline{#1}}
\matrix{3}{\mrow{1,2,3}\mrow{4,5,6}}

the macro matrix works well, I have started a macro \varparrayline but I still have problems doing the LaTeX macro. But we should have a LaTeXML binding for the time when I have solved the LaTeX problems. Then I want to refactor the \parrayline as \varparrayline.

implement local key for \symdef

The \symdef macro has had the local key that made the semantic macro local to the current group by not exporting it from the module. This has never been used much, so it has never been implemented in LaTeXML. But now it is part of the \vardef concept (see #35), which is very important for SMGloM, so we should implement it.
I do not think that this should be very difficult; I guess we should just make a conditional if the local key is set and then refrain from registering the macro from the imports list (but I cannot quite see where this is one in the code of modules.sty.ltxml.

\nappa should create variable

in functions.en.tex we have $\nappa{f}x=y$, which is supposed to mark up the fact that the function (variable) f is applied to the argument z. I want this to generate

<om:OMOBJ>
  <om:OMA>
    <om:OMS cd="equal" name="equal"/>
    <om:OMA>
      <om:OMV name="f"/>
      <om:OMV name="x"/>
    </om:OMA>
    <om:OMV name="y"/>
  </om:OMA>
</om:OMOBJ>

but it generates

<om:OMOBJ>
  <om:OMA>
    <om:OMS cd="equal" name="equal"/>
    <om:OMA>
      <om:OMS cd="latexml" name="f"/>
      <om:OMV name="x"/>
    </om:OMA>
    <om:OMV name="y"/>
  </om:OMA>
</om:OMOBJ>

because we have in cmath.sty.ltxml

# \nappa{<function>}{<(const)(,\1)*>}
# @#1(#2)
DefConstructor('\nappa[]{}{}',
  "<ltx:XMApp>"
    ."<ltx:XMTok meaning='#2' />"
    ."<ltx:XMArg>#3</ltx:XMArg>"
  ."</ltx:XMApp>");

I have tried changing the first child of the XMApp to <ltx:XMTok name='#2' />, and indeed this gives me a variable, but it has the wrong name: it is <om:OMV name="normal-f"/>
@dginev, could you have a look? I suspect this should be easy for you.

@m-iancu fixing this would solve the errors of the form

 parse error: Cannot resolve module for latexml?f from theory http://mathhub.info/smglom/sets/functions.en.omdoc?functions.en

which have been appearing lately (since I started using \nappa consistently in SMGloM).

make proof step labeling work in sproof.sty

Labeling of proof steps in sproof.sty does not work yet. We use a complex system of nested counters to generate th proof labels. The problem here is that when we use \sref@label@id, then we do not generate the labels (and later, the counters are no longer around). I have tried to use \edef in various variants, but that leads to problems with inaccessibiltiy. We need a new idea here: just using \the@pst@label is not enough.

take care of duplicate reference warnings

I often get warnings of the form

[8pdfTeX warning (ext4): destination with the same identifier (name{sre
f@{terminology}@semnet-nutshell@target}) has been already used, duplicate ignored

\AtBegShi@Output ...ipout \box \AtBeginShipoutBox 
                                                  \fi \fi 
l.112 \end{frame}

in sTeX log files. They seem spurious (i.e. I do not have duplicate ids in the source). They seem to come from the way I am passing id arguments in sref.sty. I probably have some place, where I fail to initialize and thus an old value is used again -- thus leading to the duplication. I have looked, but never had time to really track this down.

switch sTeX over to produce content MathML

Currently sTeX produces OpenMath, but we want to switch over to strict content MathML3, which is equivalent, but syntactialy more pleasing. This entails changes in modules.sty.ltxml, cmath.sty.ltxml, and presentation.sty.ltxml (maybe more; have a look). Of course, this should be developed on a branch. @dginev can give advice.

parallel markup for modules

We need to generate parallel MathML where the content
part is just as the OpenMath we are generating now, and the presentation
MathML is what we would generate normally (for html). I think that in
OMDoc2, this is the format I would prefer in any case. Note that the
content MathML can still be re-styled by the presentation process, but
does not necessarily have to be.

rewrite module loading code in modules.sty

The code in modules.sty is very convoluted and not very clean. Most specifically the module loading code (not loading things twice). This should be completely rethought and made cleaner.

I also have the feeling that some things module are loaded twice, this should be thoroughly tested.

implement precedences for \napp* and \anapp* in cmath.sty.ltxml

I have (relatively) new macros in cmath.sty.ltxml. They all have precedence keys, which need to be implemented (but are not).

But I guess that before that can be implemented, I need to get clear on what this means anyways. It seems to me that we want to have a new base case for the presentation, where something like

<OMA class="infix" p="500" p1="499">
    <OMV name="*"/>
    <OMV name="a"/>
    <OMV name="b"/>
</OMA>

that should be presented as

<mrow>
  <mi>a</mi>
  <mo>*</mi>
  <mi>b</mi>
</mrow>

given the right current precedence (otherwise enclosed by brackets).
I guess I first have to get clear on this with @m-iancu before we can really implement this in sTeX.

add key primary to symdef

I have introduced the key primary for symdef (first optional argument). If that is set, then we should add role='primar' to the <symbol element generated.

weird error in minmax

There is a weird error in MathHub/smglom/numberfields/source/minmax.tex. I have

\symdef[bvars=1,bargs=2]{bmaxval}[3]{\max_{#2}#3}
  \symtest{bmaxval}{\bmaxval{i}{i\in\mathbb{N}}{1/i}}

and that works exactly as expected, and then

\symdef[bvars=1,bargs=2]{bminval}[3]{\min_{#2}#3}
\symtest{bminval}{\bminval{i}{i\in\mathbb{N}}{1/i}}

and that throws errors:

Fatal:expected:{ Missing { in sub/super-script argument
    /Users/kohlhase/localmh/MathHub/smglom/numberfields/source/minmax.tex#textrange(from=12;0,to=12;51)
    Input is empty
    Stack Trace:
        LaTeXML::Package::Pool::scriptHandler(Core::Stomach[@0x7feffcb2ff60],'SUBSCRIPT') @ /Users/kohlhase/localmh/ext/perl5lib/lib/perl5/LaTeXML/Package/TeX.pool.ltxml line 3299
        LaTeXML::Package::Pool::__ANON__(Core::Stomach[@0x7feffcb2ff60]) @ /Users/kohlhase/localmh/ext/perl5lib/lib/perl5/LaTeXML/Core/Definition/Primitive.pm line 59
        Core::Definition::Primitive[Subscript]->invoke(Core::Stomach[@0x7feffcb2ff60]) @ /Users/kohlhase/localmh/ext/perl5lib/lib/perl5/LaTeXML/Core/Stomach.pm line 222

but the only difference is that min/max are switched.

I am stymied here.

\importmhmodule problem in LaTeXML binding (multiling branch)

I changed the interface some more for \importmhmodule from

\importmhmodule[repos=foo]{bar/baz}{cd}

to

If the path is not given then \importmhmodule just reverts to \importmodule.

When fixing up modules.sty.ltxml (I seem to have done that successfully)
I realized that the error I reported to you is is really a message of
incomplete implementation: We currently have

DefConstructor('\importmhmodule OptionalKeyVals:importmodule {}',
   "<omdoc:imports
from='?&GetKeyVal(#1,'load')(&canonical_omdoc_path(&GetKeyVal(#1,'load')))()\##2'/>",
   afterDigest => sub {
    my ($stomach, $whatsit) = @_;
    my $keyval = $whatsit->getArg(1);
    my $id = $whatsit->getArg(2);
    if (!$keyval) { Fatal(":importmhmodule Currently can't handle
missing the KeyVal argument!"); }
    my $repos = ToString($keyval->getValue('repos'));
    my $path = ToString($keyval->getValue('path'));
    my $current_repos = LookupValue('current_repos');
    if (!$repos) { # Use the implicit current repository
      $repos = $current_repos; }
    my $defpaths = LookupValue('defpath');
    my $load_path = ($$defpaths{MathHub}).$repos.'/source/'.$path;
    $keyval->setValue('load',$load_path);
    $whatsit->setArgs($keyval,$id);
    AssignValue('current_repos' => $repos, 'global');
    importmoduleI($stomach,$whatsit);
    AssignValue('current_repos' => $current_repos, 'global');
    return;
  });

We just have to treat the case where we do not have a keyval: then we
should just call importmoduleI

So something like the following should work (if there is a keyval, then
use the code we wrote, otherwise just call importmoduleI). But I do not
know enough perl to make this work. Could you have a look?

DefConstructor('\importmhmodule OptionalKeyVals:importmodule {}',
   "<omdoc:imports
from='?&GetKeyVal(#1,'load')(&canonical_omdoc_path(&GetKeyVal(#1,'load')))()\##2'/>",
   afterDigest => sub {
    my ($stomach, $whatsit) = @_;
    my $keyval = $whatsit->getArg(1);
    my $id = $whatsit->getArg(2);
    if ($keyval) {
        my $repos = ToString($keyval->getValue('repos'));
        my $path = ToString($keyval->getValue('path'));
        my $current_repos = LookupValue('current_repos');
        if (!$repos) { # Use the implicit current repository
             $repos = $current_repos; }
        my $defpaths = LookupValue('defpath');
        my $load_path = ($$defpaths{MathHub}).$repos.'/source/'.$path;
        $keyval->setValue('load',$load_path);
        $whatsit->setArgs($keyval,$id);
        AssignValue('current_repos' => $repos, 'global');
        importmoduleI($stomach,$whatsit);
        AssignValue('current_repos' => $current_repos, 'global');}
     else { importmoduleI($stomach,$whatsit);}
    return;
  });

recusing into \text

In smglom/numberfields/source/intarith.de.tex, we have

    \[\inttimes[cdot]{a,b}=\piecewise{
      \piece[de]{\nattimes[cdot]{\absolutevalue{a},\absolutevalue{b}}}
                      {\text{$\minset{a,b}\NaturalNumbers$ or $\minset{a,b}\NegativeIntegerNumbers$}}
      \otherwise[de]{\uminus{\nattimes[cdot]{\absolutevalue{a},\absolutevalue{b}}}}}
    \]

the important part of this is

\text{$\minset{a,b}\NaturalNumbers$ or $\minset{a,b}\NegativeIntegerNumbers$}

which generates

        <om:OMSTR>
          <om:OMSTR xml:id="S0.Ex2.m1.m1.om">a,bminset&#x2061;a,b, NaturalNumbers</om:OMSTR>
          <om:OMSTR> or </om:OMSTR>
          <om:OMSTR xml:id="S0.Ex2.m1.m2.om">a,bminset&#x2061;a,b, NegativeIntegerNumbers</om:OMSTR>
        </om:OMSTR>

which is not what I want. For the moment I would settle for

<om:OMFOREIGN encoding="application/omdoc+xml">
  <om:OMA>
     <om:OMS cd="set" name="minset"/>
     <om:OMV name="a" xml:id="XM5.om"/>
     <om:OMV name="b" xml:id="XM6.om"/>
     <om:OMS cd="naturalnumbers" name="natural-number"/>
   </om:OMA>
</om:OMA>
or 
<om:OMSTR>
  <om:OMA>
     <om:OMS cd="set" name="minset"/>
     <om:OMV name="a" xml:id="XM5.om"/>
     <om:OMV name="b" xml:id="XM6.om"/>
     <om:OMS cd="naturalnumbers" name="negative-natural-number"/>
   </om:OMA>
</om:OMA>
</om:OMSTR>

I am not sure how to best specify the encoding here, but OMDoc should do fine.

I have not quite been able to test extensively, since my LaTeXML installation is quite broken, but I think this is a post-processing problem. I ran the following little experiment:

\documentclass{article}
\usepackage{amstext}
\begin{document}
$f(\text{$\alpha\in N$ or $\alpha\in M$})$
\end{document}

to have some math embedded in text embedded in math. This runs through pdflatex beautifully (somewhat to my surprise). And latexml gives me

<?xml version="1.0" encoding="UTF-8"?>
<?latexml searchpaths="/Users/kohlhase/tmp"?>
<?latexml class="article"?>
<?latexml package="amstext"?>
<?latexml RelaxNGSchema="LaTeXML"?>
<document xmlns="http://dlmf.nist.gov/LaTeXML">
  <resource src="LaTeXML.css" type="text/css"/>
  <resource src="ltx-article.css" type="text/css"/>
  <para xml:id="p1">
    <p>
    <Math mode="inline" xml:id="p1.m1" tex="f(\text{$\alpha\in N$ or $\alpha\in M$})"
      text="f * [∈αN or ∈αM]">
      <XMath>
    <XMApp>
      <XMTok meaning="times" role="MULOP">⁢</XMTok>
      <XMTok possibleFunction="yes" role="UNKNOWN" font="italic">f</XMTok>
      <XMDual>
        <XMRef idref="XM1"/>
        <XMWrap>
          <XMTok role="OPEN" stretchy="false">(</XMTok>
          <XMText xml:id="XM1">
        <Math mode="inline" tex="\alpha\in N" text="alpha element-of N" xml:id="p1.m1.m1">
          <XMath>
            <XMApp>
              <XMTok meaning="element-of" name="in" role="RELOP">∈</XMTok>
              <XMTok name="alpha" role="UNKNOWN" font="italic">α</XMTok>
              <XMTok role="UNKNOWN" font="italic">N</XMTok>
            </XMApp>
          </XMath>
        </Math>
        or
        <Math mode="inline" tex="\alpha\in M" text="alpha element-of M" xml:id="p1.m1.m2">
          <XMath>
            <XMApp>
              <XMTok meaning="element-of" name="in" role="RELOP">∈</XMTok>
              <XMTok name="alpha" role="UNKNOWN" font="italic">α</XMTok>
              <XMTok role="UNKNOWN" font="italic">M</XMTok>
            </XMApp>
          </XMath>
        </Math>
          </XMText>
          <XMTok role="CLOSE" stretchy="false">)</XMTok>
        </XMWrap>
      </XMDual>
    </XMApp>
      </XMath>
    </Math>
    </p>
  </para>
</document>

which is all we can hope for. But then the postprocessors give me trouble: for HTML I get

<div id="p1" class="ltx_para">
  <p class="ltx_p">
  <math id="p1.m1" class="ltx_Math" alttext="f(\text{$\alpha\in N$ or $\alpha\in M$})"
    display="inline">
    <mrow>
      <mi>f</mi>
      <mo>�</mo>
      <mrow>
    <mo stretchy="false">(</mo>
    <mrow id="XM1">
      <mrow id="XM1a">
        <mi id="XM1b">α</mi>
        <mo id="XM1c">�</mo>
        <mi id="XM1d">N</mi>
      </mrow>
      <mtext id="XM1e"> or </mtext>
      <mrow id="XM1f">
        <mi id="XM1g">α</mi>
        <mo id="XM1h">�</mo>
        <mi id="XM1i">M</mi>
      </mrow>
    </mrow>
    <mo stretchy="false">)</mo>
      </mrow>
    </mrow>
  </math>
  </p>
</div>

where the encoding is off (but that may be my installation). And in sTeX, I get the non-standard behavior above.

I would appreciate any help.

includeassignment does not treat due and given correctly.

\includeassignment[number=3,given=Mar 6.,due=Mar10.]{a2}

does not lead to a display of the given and due dates. But if you give them on the

\begin{assignment}[given=Mar 6.,due=Mar10.]

it works.
The problem is the \given@due macro in sTeX/sty/hwexam/hwexam.dtx that does not take \inclassig@due into account.

@La-Stravaganza, this is your first real sTeX assignment. Please read the code and understand as much as you can an then we can look together.

no generation of symbols in {modnl}

LaTeXML generates <omdoc:symbol> elements from \defi and friends (if they are not present in the module). This is only good for monolingual sTeX.

In multilingual sTeX (i.e in a {modnl} environment, no <omdoc:symbol> elements should be generated.

\termref without optional argument should use $signature, if that is set.

We have a problem in SMGloM. In cases where we have a \termref without cd key, we want to use the $signature if it is set and not #module. For instance, in functions.en.tex we have

\atrefii{total}{total}{function}

(note that the expands to \termref[name=total-function]{total}) and that generates

<omdoc:term cd="functions.en" name="total-function" [...]>total</omdoc:term>

because we are in the language binding functions.en. But we need to get

<omdoc:term cd="functions" name="total-function" [...]>total</omdoc:term>

I think that in statements.sty.ltxml, we have to change

DefConstructor('\termref OptionalKeyVals:termref {}',
               "<omdoc:term "
              .  "?&GetKeyVal(#1,'cdbase')(cdbase='&GetKeyVal(#1,'cdbase')')() "
             .  "cd='?&GetKeyVal(#1,'cd')(&GetKeyVal(#1,'cd'))(#module)' "
              .  "name='&GetKeyVal(#1,'name')'>"
              .  "#2"
              ."</omdoc:term>",
      afterDigest=>sub{$_[1]->setProperty(module=>LookupValue('current_module'))});

to
something like

DefConstructor('\termref OptionalKeyVals:termref {}',
               "<omdoc:term "
              .  "?&GetKeyVal(#1,'cdbase')(cdbase='&GetKeyVal(#1,'cdbase')')() "
             .  "cd='?&GetKeyVal(#1,'cd')(&GetKeyVal(#1,'cd'))(#module)' "
              .  "name='&GetKeyVal(#1,'name')'>"
              .  "#2"
              ."</omdoc:term>",
      afterDigest=>sub{$_[1]->setProperty(module=>$signature ? $signature : LookupValue('current_module'))});

but I am not sure, @dginev could you have a look?

@m-iancu this is the source of the errors of the form

parse error: Cannot resolve module for latexml?f from theory http://mathhub.info/smglom/sets/functions.en.omdoc?functions.en 

I am expecting these kinds of errors to vanish once we fix this sTeX problem.

warning

I am getting a warning almost everywhere, I think this should be looked at.

Warning:perl:warn Perl warning
    /Users/kohlhase/localmh/ext/sTeX/sty/omtext/omtext.sty.ltxml line 148
    Subroutine numberIt redefined at /Users/kohlhase/localmh/ext/sTeX/sty/omtext/omtext.sty.ltxml line 148, <$IN> line 2.
    In Core::Gullet[@0x7fdfa901c7f8] /Users/kohlhase/localmh/ext/sTeX/sty/omtext/omtext.sty.ltxml line 148
     <= \documentclass OptionalSemiverbatim S... <= Core::Stomach[@0x7fdfa622e390] <= ...

Warning:perl:warn Perl warning
    /Users/kohlhase/localmh/ext/sTeX/sty/omtext/omtext.sty.ltxml line 174
    Subroutine locateIt redefined at /Users/kohlhase/localmh/ext/sTeX/sty/omtext/omtext.sty.ltxml line 174, <$IN> line 2.
    In Core::Gullet[@0x7fdfa901c7f8] /Users/kohlhase/localmh/ext/sTeX/sty/omtext/omtext.sty.ltxml line 174
     <= \documentclass OptionalSemiverbatim S... <= Core::Stomach[@0x7fdfa622e390] <= ...

multilinguality in sTeX

statements.sty and friends generate Math Keywords, e.g. the cue "Definition" for {definition} environments. I have already introduced a level of indirection that allows the keywords to be overdefined (almost?) everywhere. You can just do

\makeatletter
\def\st@example@kw{Beispiel}
\def\spf@proofsketch@kw{Beweis (Skizze)}
\makeatother

in a document, and get the variants. But there should be a set of "defaults" per language (they need to be collected) and they should be enabled whenever the language is switched by babel or so e.g. by \usepackage{ngerman} or \selectlanguage{german}. I am not sure what the best way to organize this. There must be standards ways to do this in LaTeX, this should be researched and sTeX should be extended to do that as well. Note that this will probably have effects on the LaTeXML side as well (we do not want to define the keywords in both sides, but latexml should read the same language configuration files; so @angerhang should be in on this as well).

real infinite precedences in LaTeXML branch

precedences should be allowed to be neginfinity and posinfinity not just numbers as they currently are. Well, for LaTeX->PDF, we will just leave them as low/high numbers, but for LaTeXML we should just report them.

selecting the ltxml+omdoc.rnc schema in html mode

@dginev please comment.

In the new approach described in #20 there is still a problem to be solved: If we want to generate OMDoc, we need set the schema omdoc+ltxml.rnc and if want to generate html, then we need ltxml+omdoc.rnc. Actually (re)-setting the schema is no problem using RelaxNGSchema, but we need to do it selectivelly, and I have a utility binding shtml.sty.ltxml (where should this go?) that does this.

I imagine the sTeX setup in the following way: The HTML workflow is the default one, to you just use

\usepackage{stex}

or a selected set of sTeX packages you need, and then just running LaTeXML over it generates html (currently, we need the insTeX.opt options for that; but maybe we can make the sTeX bindings part of the LaTeXML distribution, which would fix that).

If you use

\documentclass{omdoc}

or any derived class, then OMDoc is generated. I think we can just do that by making sure that omdoc.cls.ltxml sets the right RelaxNGSchema late enough (so that it does not get overwritten by the sTeX packages.
Maybe we need a version ProvideRelaxNGSchema which does not overwrite for the packages. Then we could just use RelaxNGSchema in omdoc.cls.ltxml.

sTeX compilation fails now with

Backslash found where operator expected at /home/costea/kwarc/localmh/ext/sTeX/sty/mikoslides/mikoslides.cls.ltxml line 29, near "DefConstructor('"
(Might be a runaway multi-line '' string starting on line 28)
In Gullet[@0x368f9d0] /home/costea/kwarc/localmh/ext/sTeX/sty/mikoslides/mikoslides.cls.ltxml line 29

implement \vardef

I have added the \vardef macro to the modules package. It is motivated and described in https://github.com/KWARC/sTeX/blob/master/sty/modules/modules.pdf?raw=true Section 2.4. The idea is that \vardef{nam}... acts just like \symdef[local]{nam}... (see #34), deposits a notation definition there and then, and defines a semantic variable. The only difference is that the generated prototype should use <OMV name="nam"/> instead of <OMS cd="#theory" name="nam"/> in the head of the binding.

@m-iancu I think that this is the right way of dealing with the arguments of structures which have been plaguing us in SMGloM. @dginev we had tried this with the \mathord earlier, but this is the more scalable, more semantic version.

stex regression on smglom/mv/piecewise.tex

I get this nasty error:

Warning:perl:warn Perl warning
    /Users/kohlhase/localmh/MathHub/smglom/mv/source/piecewise.tex#textrange(from=1;0,to=1;40)
    Odd number of elements in hash assignment at (eval 43) line 3.
    In \g@import OptionalKeyVals:importmhmod... from smglom.sty.ltxml line 27
     <= \g@import[ext={tex}, path={functions}... <= Core::Document[@0x7fee2f8e5150] <= ␍\g@import[ext={tex}, path={functions... <= ...

Error:No \symdef found for \piece! Please define symbol prior to introducing variants!: 
    /Users/kohlhase/localmh/MathHub/smglom/mv/source/piecewise.tex#textrange(from=1;0,to=1;40)
    In \@symvariant@construct {}[]{} from modules.sty.ltxml line 473
     <= \@symvariant@construct{piece}[2]{de} <= Core::Document[@0x7fee2f8e5150] <= ␍\g@import[ext={tex}, path={functions... <= Core::Document[@0x7fee2f8e5150] <= \begin{module} OptionalKeyVals:Module <= \begin{module}[id={piecewise}, creato... <= Core::Document[@0x7fee2f8e5150] <= ␍\begin{module}[id={piecewise}, creat... <= Core::Document[@0x7fee2f8e5150] <= \begin{document} OptionalKeyVals:omdoc <= \begin{document}␍\begin{module}[id={p... <= Core::Document[@0x7fee2f8e5150] <= \documentclass{smglom}\@@mhcurrentrep... <= Core::Document[@0x7fee2f8e5150]

Error:No \symdef found for \otherwise! Please define symbol prior to introducing variants!: 
    /Users/kohlhase/localmh/MathHub/smglom/mv/source/piecewise.tex#textrange(from=1;0,to=1;40)
    In \@symvariant@construct {}[]{} from modules.sty.ltxml line 473
     <= \@symvariant@construct{otherwise}[1]{de} <= Core::Document[@0x7fee2f8e5150] <= ␍\g@import[ext={tex}, path={functions... <= Core::Document[@0x7fee2f8e5150] <= \begin{module} OptionalKeyVals:Module <= \begin{module}[id={piecewise}, creato... <= Core::Document[@0x7fee2f8e5150] <= ␍\begin{module}[id={piecewise}, creat... <= Core::Document[@0x7fee2f8e5150] <= \begin{document} OptionalKeyVals:omdoc <= \begin{document}␍\begin{module}[id={p... <= Core::Document[@0x7fee2f8e5150] <= \documentclass{smglom}\@@mhcurrentrep... <= Core::Document[@0x7fee2f8e5150]
 0.19 sec)
(Rewriting... 0.00 sec)
(Finalizing... 0.02 sec)
Conversion complete: 1 warning; 2 errors.

modnl and mhmodnl forget to set the language

In our implementation of modnl and mhmodnl in smultiling.dtx we forgot to set the language. We need to call a \selectlanguage (from the babel package). But things are a bit more complicated: We have a level of indirection here, since the third argument of modnl and mhmodnl is a three-level ISO language specifier and \selectlanguage wants a babel language specifier. So we need a lookup table.
I am already maintaining one with the \smul@register@language. I have RawTeXed that, so that we only need to implement \smul@register@language and use the table to select the language.

It would be great if we could do this today, so that I have a correct language for the glossary demo in Berlin.

statements.sty.ltxml: example with title fails

in GenCS/source/memory/en/address-decoder.tex I have

    \begin{example}[title=Address decoder logic for 2-bit addresses,id=twobitdecoder,for=address-decoder.def]

and that fails with the error message that it cannot close omdoc:metadata.

And I do not understand why. without the title, things are fin.

definiendum should use the signature instead of the current module if the former exists

another adaption to the multilingual setting.

In smlgom/algebra/source/special-linear-group.de.tex we find

  Die \defiii[special-linear-group]{spezielle}{lineare}{Gruppe} 

which is transformed to

Die <omdoc:term cd="special-linear-group.de" name="special-linear-group" role="definiendum" xml:id="special-linear-group.de.definition3.CMP1.p1.term1" about="#special-linear-group.de.definition3.CMP1.p1.term1" stex:srcref="smglom/algebra/source/special-linear-group.de.tex#textrange(from=3;0,to=3;63)">spezielle lineare Gruppe</omdoc:term>

Instead of cd="special-linear-group.de" it should be cd="special-linear-group", since we want to have the signature there.

This is generated by the \definiendum constructor from statements.sty.ltxml. The

 $whatsit->setProperty(theory=>LookupValue('current_module'));

on line 181 should probably just use the $signature value/property that we put there last time.

complex bvars do not work in \symdef

In smlomg/linear-algebra/source/matrix.en we have

  \symdef[bvars={2,3},bargs={4,5,6,7}]{cmatrix}[7]{[#1]_{#4\leq{#2}\leq{#5},#6\leq{#3}\leq{#7}}}

and that generates

   <omdoc:symbol name="cmatrix" xml:id="cmatrix.sym" about="#cmatrix.sym" stex:srcref="smglom/linear-algebra/source/matrix.tex#textrange(from=11;0,to=11;96)"/>
    <omdoc:notation cd="matrix" name="cmatrix">
      <omdoc:prototype>
        <om:OMBIND>
          <om:OMA>
            <om:OMS cd="matrix" cr="fun" name="cmatrix"/>
            <omdoc:expr name="arg4"/>
            <omdoc:expr name="arg5"/>
            <omdoc:expr name="arg6"/>
            <omdoc:expr name="arg7"/>
          </om:OMA>
          <om:OMBVAR>
            <omdoc:exprlist name="args">
              <omdoc:expr name="arg"/>
            </omdoc:exprlist>
          </om:OMBVAR>
          <omdoc:expr name="arg1"/>
        </om:OMBIND>
      </omdoc:prototype>
      <omdoc:rendering>
        <m:msub>
          <m:mrow>
            <m:mo stretchy="false">[</m:mo>
            <omdoc:render name="arg1"/>
            <m:mo stretchy="false">]</m:mo>
          </m:mrow>
          <m:mrow>
            <m:mrow xml:id="XM1e.pmml">
              <omdoc:render name="arg4"/>
              <m:mo xml:id="XM1a.pmml">&#x2264;</m:mo>
              <omdoc:render name="arg2"/>
              <m:mo xml:id="XM1c.pmml">&#x2264;</m:mo>
              <omdoc:render name="arg5"/>
            </m:mrow>
            <m:mo>,</m:mo>
            <m:mrow xml:id="XM2e.pmml">
              <omdoc:render name="arg6"/>
              <m:mo xml:id="XM2a.pmml">&#x2264;</m:mo>
              <omdoc:render name="arg3"/>
              <m:mo xml:id="XM2c.pmml">&#x2264;</m:mo>
              <omdoc:render name="arg7"/>
            </m:mrow>
          </m:mrow>
        </m:msub>
      </omdoc:rendering>
  </notation>

(elided the variant, since it is similar). It seems that the treatment of bvar={2,3} is wrong, since that should generate

<om:OMBVAR>
   <omdoc:expr name="arg2"/>
   <omdoc:expr name="arg3"/>
</om:OMBVAR>

instead of an expression ist. Correspondingly, the generated semantic macro does not work, used in

 $A=\cmatrix{\livar{a}{i,j}}ij1n1m$

this generates

<om:OMOBJ stex:srcref="smglom/linear-algebra/source/matrix.en.tex#textrange(from=21;76,to=22;45)">
  <om:OME>
    <om:OMS cd="ambiguous" name="fragments"/>
    <om:OMS cd="unknown" name="A"/>
    <om:OMS cd="equal" name="equal"/>
    <om:OMBIND>
      <om:OMA>
    <om:OMS cd="matrix" name="cmatrix"/>
    <om:OMI>1</om:OMI>
    <om:OMV name="n"/>
    <om:OMI>1</om:OMI>
    <om:OMV name="m"/>
      </om:OMA>
      <om:OMBVAR>
    <om:OMV name="name.cvar.2" xml:id="cvar.2d.om"/>
      </om:OMBVAR>
      <om:OMV name="i"/>
    </om:OMBIND>
  </om:OME>
</om:OMOBJ>

statements.sty.ltxml for html

This is a discussion issue for implementing the html version of statements.sty.ltxml; mostly for discussion with @dginev.

  • We have all the statement environments, which take a common set of attributes. We would really need an analogue of \newtheorem from LaTeX.pool.ltxml, but with keyword argument passing. I guess we could just copy the code over, but that would be brittle, it would be better, if we could refactor somehow.

listings warning

In the KWARC branch of LaTeXML I get the warning

(Loading /Users/kohlhase/localmh/ext/perl5lib/lib/perl5/LaTeXML/Package/listings.sty.ltxml...
Warning:expected:<number> Missing number, treated as zero.
    /Users/kohlhase/localmh/ext/perl5lib/lib/perl5/LaTeXML/Package/listings.sty.ltxml line 1256
    while processing \lstset
    Next token is T_CS[\linewidth]
    In Core::Gullet[@0x7d5040d0] /Users/kohlhase/localmh/ext/perl5lib/lib/perl5/LaTeXML/Package/listings.sty.ltxml line 1256
     <= \lstset RequiredKeyVals:LST <= Core::Stomach[@0x7d5063a0] <= Core::Gullet[@0x7d5040d0] <= ...

(Processing definitions /usr/local/texlive/2014/texmf-dist/tex/latex/listings/listings.cfg...
(Loading /Users/kohlhase/localmh/ext/perl5lib/lib/perl5/LaTeXML/Package/LaTeX.pool.ltxml... 0.28 sec)[#25] 0.31 sec) 1.87 sec)

which is a bit annoying. It seems to me that the cause is that we preload lststex.sty.ltxml in stex-module.opt without preloading LaTeX.pool.ltxml, which defines linewidth. I am not quite sure why LaTeX.pool.ltxml is loaded exactly at this time, since stex-module.opt has the preloads sectino

preload = amsmath
preload = amssymb
preload = eurosym
preload = wasysym
preload = multirow
preload = paralist
preload = lststex
preload = lstomdoc
preload = ded
preload = calbf
preload = hwexam
preload = url
preload = wrapfig
preload = colortbl
preload = [show]ed
preload = cmath

I am not sure what to do here, would preloading LaTeX.pool.ltxml earlier fix the problem without harming?

make sTeX logs less chatty

The logs generated by sTeX under pdflatex are too chatty. One of the problems is that we have many lines of the form

\@mhcurrentrepos{smglom/sets}

in there. I think this comes from the fact that I am writing exactly that into the *.aux files (where I indeed want that), but why oh why does this automatically get into the log as well?

The same holds for the lines

\@requiremodules{/Users/kohlhase/localmh/MathHub/MiKoMH/GenCS/source/pl0/en/pl0-semantics}{sms}

I would like this quieted up.

mikoslides does not do enumerate well

The beamer.cls theme beamerthemeJacobs.sty that comes with mikoslides.cls does not do enumeration \begin{enumerate} well. This should be fixed.

@La-Stravaganza: This is a nice intro bug to beamer.cls and should be relatively easy to fix.

selectlanguage German does not work in gle environment (smglom.sty.ltxml)

In the glossary the language selection in smglom.sty.ltxml does not seem to work (any more), and does not treat the umlauts e.g. "a correctly. As we are showing the glossary on MathHub.info now, these become visible.

The culprit is the gle enviornment, which takes the language specifier as the third arg. The test case is smglom/source/identity-function.tex

\text make omdoc:text instead of mo in symdef

I have

\symdef[name=alisum]{alisumOp}{\text{s}}

in smglom/smglom/source/aliquotsum.tex, and that gives the notation

    <omdoc:notation cd="aliquotsum" macro_name="alisumOp" name="alisum" nargs="0">
      <omdoc:prototype>
        <om:OMS cd="aliquotsum" name="alisum"/>
      </omdoc:prototype>
      <omdoc:rendering>
        <omdoc:text>s</omdoc:text>
      </omdoc:rendering>
    </omdoc:notation>

not

<m:mtext>s</m:mtext>

but I can generate that with

\symdef[name=alisum]{alisumOp}{\mathop{\text{s}}}

But somehow I had thought that I would get

<m:mo><m:mtext>s</m:mtext></m:mo>

hmmm, but now I am not sure.
@dginev what do you think?

regression: \begin{modnl}{foo}{de} does not import foo.tex any more

I managed to break smultiling.sty.ltxml (again) and I do not quite understand how. It seems that the argument passing for $signature is broken in the code for \begin{modnl} ($signature appears to be empty). I have tested that via

cd ... smglom/sets/source
lmh omdoc union.de.tex

and this gives errors because no import of union.tex is taking place, and in the generated union.de.omdoc, we find

    <omdoc:imports from="#union" xml:id="union.de.imports2" about="#union.de.imports2" ...

where we woul have expected a from="union#union" or similar, which leads me to suspect that $signature might be mispassed.

I would be very grateful, if you could have a look soon (Mihnea is depending on this) for the glossary.

\importmhmodule problem in LaTeXML binding (multiling branch)

I changed the interface some more for \importmhmodule from

\importmhmodule[repos=foo]{bar/baz}{cd}

to

\importmhmodule[repos=foo,path=bar/baz}{cd}

If the path is not given then \importmhmodule just reverts to \importmodule.

When fixing up modules.sty.ltxml (I seem to have done that successfully)
I realized that the error I reported to you is is really a message of
incomplete implementation: We currently have

DefConstructor('\importmhmodule OptionalKeyVals:importmodule {}',
   "<omdoc:imports
from='?&GetKeyVal(#1,'load')(&canonical_omdoc_path(&GetKeyVal(#1,'load')))()\##2'/>",
   afterDigest => sub {
    my ($stomach, $whatsit) = @_;
    my $keyval = $whatsit->getArg(1);
    my $id = $whatsit->getArg(2);
    if (!$keyval) { Fatal(":importmhmodule Currently can't handle
missing the KeyVal argument!"); }
    my $repos = ToString($keyval->getValue('repos'));
    my $path = ToString($keyval->getValue('path'));
    my $current_repos = LookupValue('current_repos');
    if (!$repos) { # Use the implicit current repository
      $repos = $current_repos; }
    my $defpaths = LookupValue('defpath');
    my $load_path = ($$defpaths{MathHub}).$repos.'/source/'.$path;
    $keyval->setValue('load',$load_path);
    $whatsit->setArgs($keyval,$id);
    AssignValue('current_repos' => $repos, 'global');
    importmoduleI($stomach,$whatsit);
    AssignValue('current_repos' => $current_repos, 'global');
    return;
  });

We just have to treat the case where we do not have a keyval: then we
should just call importmoduleI

So something like the following should work (if there is a keyval, then
use the code we wrote, otherwise just call importmoduleI). But I do not
know enough perl to make this work. Could you have a look?

DefConstructor('\importmhmodule OptionalKeyVals:importmodule {}',
   "<omdoc:imports
from='?&GetKeyVal(#1,'load')(&canonical_omdoc_path(&GetKeyVal(#1,'load')))()\##2'/>",
   afterDigest => sub {
    my ($stomach, $whatsit) = @_;
    my $keyval = $whatsit->getArg(1);
    my $id = $whatsit->getArg(2);
    if ($keyval) {
        my $repos = ToString($keyval->getValue('repos'));
        my $path = ToString($keyval->getValue('path'));
        my $current_repos = LookupValue('current_repos');
        if (!$repos) { # Use the implicit current repository
             $repos = $current_repos; }
        my $defpaths = LookupValue('defpath');
        my $load_path = ($$defpaths{MathHub}).$repos.'/source/'.$path;
        $keyval->setValue('load',$load_path);
        $whatsit->setArgs($keyval,$id);
        AssignValue('current_repos' => $repos, 'global');
        importmoduleI($stomach,$whatsit);
        AssignValue('current_repos' => $current_repos, 'global');}
     else { importmoduleI($stomach,$whatsit);}
    return;
  });

for attribute of <omdoc:definition> needs MMT URIs with CDs.

This is something @m-iancu and I came across today as the current "top error" in MathHub.info

Currently, we generate the names of the symbols defined in a definitions into the for attribute: in MathHub/smglom/smglom/cassiniidenity.en.tex we have

\begin{modnl}[creators=jusche]{cassiniidentity}{en}
\begin{definition}
  The \defii{Cassini}{identity} is an identity for \trefi[integernumbers]{integers}

which generates

    <omdoc:definition for="Cassini-identity" xml:id="cassiniidentity.en.definition3" 

the full MMT URI for="cassiniidentity?Cassini-identity" there.

This is especially important in the multilingual case, where we cannot just assume that the symbol CD is the current CD.

I think that this should be quite easy to fix. We have access to the signature cassiniidentity from the modnl environment (.smultiling.sty.ltxml) and can pick this up in the definitionBody procedure in statements.sty.ltxml when we generate the for= attribute.

base modules.sty on etoolbox and the new LaTeX kernel

etoolbox.sty is a relatively new LaTeX package that provides useful programming primitives. I have used one or the other in sTeX, but we should make more use of this to clean up code and make it more stable. This is probably also useful in #43.

Also, the new LaTeX3 team is re-developing the LaTeX kernel, adding useful stuff there as well. We should see this and systematically renovate sTeX code.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.