Comments (2)
Because the v4 fonts include many more characters than the original MathJax fonts, they are broken into smaller pieces so that web users don't have to download the entire font and all the data about it even though the page they are reading uses only a few characters.
The accented Latin characters are one of the batches that are loaded dynamically when needed, and that is what is happening in your case. Because you are not using MathJax components, but rather are using direct access to the MathJax modules, you need to take these issues into account yourself. The node examples haven't been updated to v4 yet (since v4 is only in alpha release), which is one reason you are seeing this.
The "MathJax retry" error is because the tex2svg-page
example isn't designed to handle dynamically loaded components like those used in the v4 fonts, since they weren't available in v3 and so didn't need to be taken into account. With v4, you now need to use promise-based methods that are used for dynamically loading MathJax components. MathJax throws a "retry" error when it has to wait for something to load and then try to typeset an expression again, and the mathjax.handleRetriesFor()
function is used to properly wait for and handle those retry requests.
The is the first issue that you are seeing. The second is the "No asyncLoad method" error. Because the means used to access dynamically loaded content is very different in a browser than in node (the former uses script
tags, while the latter used require()
calls), MathJax needs to be told how to do that. This is done by specifying an asyncLoad
function. For node programs, you use require('mathjax-full/js/util/asyncLoad/node.js')
to cause that function to be defined.
Finally, you will also need to tell MathJax where to find the dynamic font files that you are using (these were originally stored in mathjax-full/js/output/fonts
but with the fonts now being in individually loaded npm packages, MathJax will look in the wrong place unless you tell it otherwise (this will be fixed in the official v4 release). You do that by specifying the dynamicPrefix
option for the SVG output jax that you create.
Here is a version of tex2svg-page
that includes the needed changes.
#! /usr/bin/env node -r esm
/*************************************************************************
*
* direct/tex2svg-page
*
* Uses MathJax v3 to convert all TeX in an HTML document.
*
* ----------------------------------------------------------------------
*
* Copyright (c) 2018 The MathJax Consortium
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
//
// Load the packages needed for MathJax
//
const {mathjax} = require('mathjax-full/js/mathjax.js');
const {TeX} = require('mathjax-full/js/input/tex.js');
const {SVG} = require('mathjax-full/js/output/svg.js');
const {liteAdaptor} = require('mathjax-full/js/adaptors/liteAdaptor.js');
const {RegisterHTMLHandler} = require('mathjax-full/js/handlers/html.js');
const {AssistiveMmlHandler} = require('mathjax-full/js/a11y/assistive-mml.js');
require('mathjax-full/js/util/asyncLoad/node.js');
const {AllPackages} = require('mathjax-full/js/input/tex/AllPackages.js');
require('mathjax-full/js/util/entities/all.js');
//
// Get the command-line arguments
//
var argv = require('yargs')
.demand(1).strict()
.usage('$0 [options] file.html > converted.html')
.options({
em: {
default: 16,
describe: 'em-size in pixels'
},
ex: {
default: 8,
describe: 'ex-size in pixels'
},
packages: {
default: AllPackages.sort().join(', '),
describe: 'the packages to use, e.g. "base, ams"'
},
fontCache: {
default: 'global',
describe: 'cache type: local, global, none'
}
})
.argv;
//
// Read the HTML file
//
const htmlfile = require('fs').readFileSync(argv._[0], 'utf8');
//
// Create DOM adaptor and register it for HTML documents
//
const adaptor = liteAdaptor({fontSize: argv.em});
AssistiveMmlHandler(RegisterHTMLHandler(adaptor));
//
// Create input and output jax and a document using them on the content from the HTML file
//
const tex = new TeX({packages: argv.packages.split(/\s*,\s*/)});
const svg = new SVG({
fontCache: argv.fontCache,
exFactor: argv.ex / argv.em,
dynamicPrefix: 'mathjax-modern-font/js/output/fonts/mathjax-modern/svg/dynamic'
});
const html = mathjax.document(htmlfile, {InputJax: tex, OutputJax: svg});
//
// Typeset the document
//
mathjax.handleRetriesFor(() => { html.render(); }).then(() => {
//
// If no math was found on the page, remove the stylesheet and font cache (if any)
//
if (Array.from(html.math).length === 0) {
adaptor.remove(html.outputJax.svgStyles);
const cache = adaptor.elementById(adaptor.body(html.document), 'MJX-SVG-global-cache');
if (cache) adaptor.remove(cache);
}
//
// Output the resulting HTML
//
console.log(adaptor.doctype(html.document));
console.log(adaptor.outerHTML(adaptor.root(html.document)));
}).catch((err) => console.log(err));
from mathjax-demos-node.
@dpvc Thank you very much for the code. It is working now :)
from mathjax-demos-node.
Related Issues (20)
- How can I load my external package by mathjax-full v3.0.5 in Node Env HOT 2
- tex2svg-page: global svg cache not rendering in safari HOT 2
- simple/tex2mml-page HOT 3
- Chrome language preference affects chtml output HOT 4
- How to use mathjax tex2svg-page without separate components? HOT 1
- Rendering Multiple Pages HOT 4
- MathML symbols are not converted correctly HOT 3
- 'No version information available...' messages output when using simple/tex2chtml.js HOT 2
- why mathjax in node 16, after init , mathjax is null HOT 1
- Numbers without text don't render when using tex2svg HOT 3
- Using MathJax node in an ES module HOT 2
- v4 beta 2 fails to find (dynamic parts of the) default font HOT 2
- Force MathJax to try to render the equation even though there are syntax errors (and ideally: to automatically fix the errors it self) HOT 8
- SVG output not showing in XHTML HOT 21
- Many demos fail to run on Node version 21 with "Function.prototype.apply was called on undefined" errors HOT 8
- Unable to add contextual menus when using component/tex2svg-page HOT 3
- let wrapper = MathJax.tex2svg('y', {display: true}); 字符y获取到的svg,右上角缺少 HOT 4
- tex2mml-page with inlineMath HOT 2
- text2svg cannot fully show formula HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from mathjax-demos-node.