Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • M MathJax
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 304
    • Issues 304
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 15
    • Merge requests 15
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • MathJax
  • MathJax
  • Wiki
  • Single file built

Single file built · Changes

Page history
created authored Apr 21, 2014 by Peter Krautzberger's avatar Peter Krautzberger
Hide whitespace changes
Inline Side-by-side
Single-file-built.md 0 → 100644
View page @ 6d04dd70
This page documents an experiment to [[Improve loading behavior]]: building a single-file MathJax version.
## Word of caution
Strictly speaking, it is neither possible nor desirable to build a single-file version of MathJax. Not possible, because MathJax is not just JavaScript (but also fonts and images). Not desirable because it extremely unlikely that the reader will need to load *all* of MathJax -- all inputs, all outputs, all extensions, all fonts in all formats, all locales etc.
That being said, there are situations where a developer might prefer a single file built (e.g. on mobile apps where the developer has tight control over the reader's options and wants to consciously limit them).
## Tools
The [MathJax-dev](https://github.com/mathjax/MathJax-dev) repository contains the combiner for combined configuration files. We will build on it so make sure you have a working copy on your system.
## Single-file built for MathML input, SVG output using MathJax TeX fonts.
There are **three problems** we'll have to deal with.
First, the combiner only builds configuration files, i.e., we'd have at least 2 files to load. We need to merge the combined configuration file with `MathJax.js` (note: it cannot be simply appended).
Second, the combined configuration combiner does not check the order in which MathJax components are combined. However, certain components need to load before others. We need to put them in the correct order.
Third, the SVG font data files are not set up to be loaded out of sequence. We need to fix them after packing.
### mathjax-dev/combiner/lists
The following list file for the combiner includes everything needed for MML input, SVG output, with Mathjax TeX fonts as well as the extensions for ContentMathML and webfonts matching; the components are of course listed in the right order.
jax/input/MathML/config.js
jax/output/SVG/config.js
extensions/mml2jax.js
extensions/MathEvents.js
extensions/MathZoom.js
extensions/MathMenu.js
jax/element/mml/jax.js
extensions/toMathML.js
jax/input/MathML/jax.js
jax/output/SVG/jax.js
jax/output/SVG/fonts/TeX/fontdata.js
jax/output/SVG/fonts/TeX/fontdata-extra.js
jax/output/SVG/autoload/mtable.js
jax/output/SVG/autoload/mglyph.js
jax/output/SVG/autoload/mmultiscripts.js
jax/output/SVG/autoload/annotation-xml.js
jax/output/SVG/autoload/maction.js
jax/output/SVG/autoload/multiline.js
jax/output/SVG/autoload/menclose.js
jax/output/SVG/autoload/ms.js
extensions/MathML/content-mathml.js
jax/input/MathML/entities/scr.js
jax/input/MathML/entities/opf.js
jax/input/MathML/entities/z.js
jax/input/MathML/entities/g.js
jax/input/MathML/entities/r.js
jax/input/MathML/entities/p.js
jax/input/MathML/entities/m.js
jax/input/MathML/entities/q.js
jax/input/MathML/entities/t.js
jax/input/MathML/entities/w.js
jax/input/MathML/entities/f.js
jax/input/MathML/entities/v.js
jax/input/MathML/entities/e.js
jax/input/MathML/entities/k.js
jax/input/MathML/entities/x.js
jax/input/MathML/entities/c.js
jax/input/MathML/entities/n.js
jax/input/MathML/entities/a.js
jax/input/MathML/entities/j.js
jax/input/MathML/entities/u.js
jax/input/MathML/entities/b.js
jax/input/MathML/entities/i.js
jax/input/MathML/entities/l.js
jax/input/MathML/entities/y.js
jax/input/MathML/entities/fr.js
jax/input/MathML/entities/o.js
jax/input/MathML/entities/s.js
jax/input/MathML/entities/d.js
jax/input/MathML/entities/h.js
jax/element/mml/optable/Arrows.js
jax/element/mml/optable/MiscMathSymbolsA.js
jax/element/mml/optable/Dingbats.js
jax/element/mml/optable/GeneralPunctuation.js
jax/element/mml/optable/SpacingModLetters.js
jax/element/mml/optable/MiscTechnical.js
jax/element/mml/optable/SupplementalArrowsA.js
jax/element/mml/optable/GreekAndCoptic.js
jax/element/mml/optable/LetterlikeSymbols.js
jax/element/mml/optable/SupplementalArrowsB.js
jax/element/mml/optable/BasicLatin.js
jax/element/mml/optable/MiscSymbolsAndArrows.js
jax/element/mml/optable/CombDiacritMarks.js
jax/element/mml/optable/GeometricShapes.js
jax/element/mml/optable/MathOperators.js
jax/element/mml/optable/MiscMathSymbolsB.js
jax/element/mml/optable/SuppMathOperators.js
jax/element/mml/optable/CombDiactForSymbols.js
jax/element/mml/optable/Latin1Supplement.js
extensions/MatchWebFonts.js
extensions/HelpDialog.js
jax/output/SVG/fonts/TeX/Main/Regular/LatinExtendedA.js
jax/output/SVG/fonts/TeX/Main/Regular/MiscSymbols.js
jax/output/SVG/fonts/TeX/Main/Regular/SpacingModLetters.js
jax/output/SVG/fonts/TeX/Main/Regular/GreekAndCoptic.js
jax/output/SVG/fonts/TeX/Main/Regular/LetterlikeSymbols.js
jax/output/SVG/fonts/TeX/Main/Regular/LatinExtendedB.js
jax/output/SVG/fonts/TeX/Main/Regular/BasicLatin.js
jax/output/SVG/fonts/TeX/Main/Regular/CombDiacritMarks.js
jax/output/SVG/fonts/TeX/Main/Regular/GeometricShapes.js
jax/output/SVG/fonts/TeX/Main/Regular/MathOperators.js
jax/output/SVG/fonts/TeX/Main/Regular/SuppMathOperators.js
jax/output/SVG/fonts/TeX/AMS/Regular/Main.js
jax/output/SVG/fonts/TeX/AMS/Regular/Arrows.js
jax/output/SVG/fonts/TeX/AMS/Regular/PUA.js
jax/output/SVG/fonts/TeX/AMS/Regular/Dingbats.js
jax/output/SVG/fonts/TeX/AMS/Regular/LatinExtendedA.js
jax/output/SVG/fonts/TeX/AMS/Regular/GeneralPunctuation.js
jax/output/SVG/fonts/TeX/AMS/Regular/MiscSymbols.js
jax/output/SVG/fonts/TeX/AMS/Regular/SpacingModLetters.js
jax/output/SVG/fonts/TeX/AMS/Regular/MiscTechnical.js
jax/output/SVG/fonts/TeX/AMS/Regular/GreekAndCoptic.js
jax/output/SVG/fonts/TeX/AMS/Regular/LetterlikeSymbols.js
jax/output/SVG/fonts/TeX/AMS/Regular/BoxDrawing.js
jax/output/SVG/fonts/TeX/AMS/Regular/CombDiacritMarks.js
jax/output/SVG/fonts/TeX/AMS/Regular/GeometricShapes.js
jax/output/SVG/fonts/TeX/AMS/Regular/MathOperators.js
jax/output/SVG/fonts/TeX/AMS/Regular/MiscMathSymbolsB.js
jax/output/SVG/fonts/TeX/AMS/Regular/SuppMathOperators.js
jax/output/SVG/fonts/TeX/AMS/Regular/Latin1Supplement.js
jax/output/SVG/fonts/TeX/AMS/Regular/EnclosedAlphanum.js
jax/output/SVG/fonts/TeX/Typewriter/Regular/Main.js
jax/output/SVG/fonts/TeX/Typewriter/Regular/Other.js
jax/output/SVG/fonts/TeX/Typewriter/Regular/BasicLatin.js
jax/output/SVG/fonts/TeX/Typewriter/Regular/CombDiacritMarks.js
jax/output/SVG/fonts/TeX/Fraktur/Regular/Main.js
jax/output/SVG/fonts/TeX/Fraktur/Regular/PUA.js
jax/output/SVG/fonts/TeX/Fraktur/Regular/Other.js
jax/output/SVG/fonts/TeX/Fraktur/Regular/BasicLatin.js
jax/output/SVG/fonts/TeX/Fraktur/Bold/Main.js
jax/output/SVG/fonts/TeX/Fraktur/Bold/PUA.js
jax/output/SVG/fonts/TeX/Fraktur/Bold/Other.js
jax/output/SVG/fonts/TeX/Fraktur/Bold/BasicLatin.js
jax/output/SVG/fonts/TeX/Math/BoldItalic/Main.js
jax/output/SVG/fonts/TeX/Caligraphic/Regular/Main.js
jax/output/SVG/fonts/TeX/Caligraphic/Bold/Main.js
jax/output/SVG/fonts/TeX/Main/Italic/Main.js
jax/output/SVG/fonts/TeX/Main/Italic/LatinExtendedA.js
jax/output/SVG/fonts/TeX/Main/Italic/GeneralPunctuation.js
jax/output/SVG/fonts/TeX/Main/Italic/GreekAndCoptic.js
jax/output/SVG/fonts/TeX/Main/Italic/LetterlikeSymbols.js
jax/output/SVG/fonts/TeX/Main/Italic/LatinExtendedB.js
jax/output/SVG/fonts/TeX/Main/Italic/BasicLatin.js
jax/output/SVG/fonts/TeX/Main/Italic/CombDiacritMarks.js
jax/output/SVG/fonts/TeX/Main/Italic/MathOperators.js
jax/output/SVG/fonts/TeX/Main/Bold/Main.js
jax/output/SVG/fonts/TeX/Main/Bold/Arrows.js
jax/output/SVG/fonts/TeX/Main/Bold/MiscMathSymbolsA.js
jax/output/SVG/fonts/TeX/Main/Bold/LatinExtendedA.js
jax/output/SVG/fonts/TeX/Main/Bold/GeneralPunctuation.js
jax/output/SVG/fonts/TeX/Main/Bold/MiscSymbols.js
jax/output/SVG/fonts/TeX/Main/Bold/SpacingModLetters.js
jax/output/SVG/fonts/TeX/Main/Bold/MiscTechnical.js
jax/output/SVG/fonts/TeX/Main/Bold/SupplementalArrowsA.js
jax/output/SVG/fonts/TeX/Main/Bold/GreekAndCoptic.js
jax/output/SVG/fonts/TeX/Main/Bold/LetterlikeSymbols.js
jax/output/SVG/fonts/TeX/Main/Bold/LatinExtendedB.js
jax/output/SVG/fonts/TeX/Main/Bold/BasicLatin.js
jax/output/SVG/fonts/TeX/Main/Bold/CombDiacritMarks.js
jax/output/SVG/fonts/TeX/Main/Bold/GeometricShapes.js
jax/output/SVG/fonts/TeX/Main/Bold/MathOperators.js
jax/output/SVG/fonts/TeX/Main/Bold/SuppMathOperators.js
jax/output/SVG/fonts/TeX/Main/Bold/CombDiactForSymbols.js
jax/output/SVG/fonts/TeX/Main/Bold/Latin1Supplement.js
jax/output/SVG/fonts/TeX/Size3/Regular/Main.js
jax/output/SVG/fonts/TeX/Size2/Regular/Main.js
jax/output/SVG/fonts/TeX/Script/Regular/Main.js
jax/output/SVG/fonts/TeX/Script/Regular/BasicLatin.js
jax/output/SVG/fonts/TeX/Size1/Regular/Main.js
jax/output/SVG/fonts/TeX/SansSerif/Italic/Main.js
jax/output/SVG/fonts/TeX/SansSerif/Italic/Other.js
jax/output/SVG/fonts/TeX/SansSerif/Italic/BasicLatin.js
jax/output/SVG/fonts/TeX/SansSerif/Italic/CombDiacritMarks.js
jax/output/SVG/fonts/TeX/SansSerif/Regular/Main.js
jax/output/SVG/fonts/TeX/SansSerif/Regular/Other.js
jax/output/SVG/fonts/TeX/SansSerif/Regular/BasicLatin.js
jax/output/SVG/fonts/TeX/SansSerif/Regular/CombDiacritMarks.js
jax/output/SVG/fonts/TeX/SansSerif/Bold/Main.js
jax/output/SVG/fonts/TeX/SansSerif/Bold/Other.js
jax/output/SVG/fonts/TeX/SansSerif/Bold/BasicLatin.js
jax/output/SVG/fonts/TeX/SansSerif/Bold/CombDiacritMarks.js
jax/output/SVG/fonts/TeX/Size4/Regular/Main.js
Save this as a `lis` file in `MathJax-dev/combiner/lists/` and run the combiner. The resulting configuration file should be about 1.2MB.
#### Notes
* SVG font file order. You need to load the Main.js file first, and then the others. For SVG you should NOT load Main.js for MathJax_Main-Regular or MathJax_Math-Italic, as these are already in the fontdata.js file.
### Fixing SVG font data files
#### Background
The SVG font data files are not set up to be loaded out of sequence. The creation of the `SVG.FONTDATA` value is done inside a signal handler that isn't triggered immediately, but the adding of data to `SVG.FONTDATA` by the font data files is done immediately (since they usually aren't loaded until much later, after SVG.FONTDATA is ready). So the information about the font information is being overwritten when `SVG` sets up `FONTDATA` later on. So the SVG jax thinks it needs to load the data, so it tries to, but the file is already loaded, so it doesn't load it again, so SVG thinks it needs to load it, and tries to ... and so on. Infinite loop.
#### Solution.
One solution is to put
MathJax.Hub.Register.StartupHook("SVG Jax Ready",function () {
before the first font data file -- it starts with
MathJax.Hub.Insert(MathJax.OutputJax.SVG.FONTDATA.FONTS.MathJax_Main
and put
});
just before the `MathJax.Ajax.loadComplete` call at the bottom of the file. This will cause the action of these files to be postponed until after the SVG jax has set up the `FONTDATA`. Note that these edits are in the resulting configuration file, not the combiner list file.
(The combiner doesn't have a means of inserting commands like this automatically (perhaps it should).)
### Merging the combined configuration file with `MathJax.js`
#### Problem
The combined configuration file cannot be simply appended to `MathJax.js`.
#### Solution
Insert the content of the combined configuration file after
HUB.Browser.Select(MathJax.Message.browsers);
and before
if (BASE.AuthorConfig && typeof BASE.AuthorConfig.AuthorInit === "function") {BASE.AuthorConfig.AuthorInit()}
in `MathJax.js`.
\ No newline at end of file
Clone repository

MathJax Wiki

  • Contributing
    • Contributor License Agreement etc
    • Quick guide to translating mathjax
  • Development
    • Development Process
      • Release Process Checklist
      • Documentation Update Process
      • Source Control Policies
    • Design Documents
      • MathJax Roadmap
      • CDN Hosting
        • Managing Rackspace Cloud Files & CDN
        • Directory Structure
        • .htaccess settings
        • CDN requirements
        • CDN Hosting at Google Cloud Storage
      • Performance Discussion
      • Profiling and Diagnostics Tools
      • Configuration Options
      • Documentation generation guide
      • Testing
        • Platforms supported
        • Test Machines
  • MathJax web presence
  • Drafts