mirror of
https://github.com/Pomax/BezierInfo-2.git
synced 2025-08-29 11:10:38 +02:00
XeLaTeX interpration of LaTeX for localization
This commit is contained in:
@@ -1,72 +0,0 @@
|
||||
/**
|
||||
*
|
||||
* This script acts as support to the latex-loader for webpack.
|
||||
* The latex-loader finds and preprocesses LaTeX elements,
|
||||
* and then this script is run via execSync, to get the SVG
|
||||
* conversion happening synchronously, since Webpack doesn't
|
||||
* do async loaders (unfortunately).
|
||||
*
|
||||
*/
|
||||
var className="LaTeX SVG";
|
||||
var fs = require("fs");
|
||||
var API = require("mathjax-node/lib/mj-single");
|
||||
var cleanUp = require("./cleanup");
|
||||
|
||||
// Set up the MathJax processor
|
||||
API.config({
|
||||
MathJax: {
|
||||
SVG: {
|
||||
font: "Latin-Modern" // STIX-Web is too fat for this article
|
||||
},
|
||||
TeX: {
|
||||
extensions: [
|
||||
"AMSmath.js",
|
||||
"AMSsymbols.js",
|
||||
"autoload-all.js",
|
||||
"color.js"
|
||||
]
|
||||
}
|
||||
}
|
||||
});
|
||||
API.start();
|
||||
|
||||
// Get the LaTeX we need, either straight up or base64 encoded:
|
||||
var latex = process.argv.indexOf("--latex");
|
||||
|
||||
if (latex === -1) {
|
||||
var base64 = process.argv.indexOf("--base64");
|
||||
if (base64 === -1) {
|
||||
console.error("missing [--latex] or [--base64] runtime option");
|
||||
process.exit(1);
|
||||
}
|
||||
base64 = process.argv[base64+1];
|
||||
latex = new Buffer(base64, "base64").toString();
|
||||
} else {
|
||||
// get the --latex value
|
||||
var args = Array.from(process.argv);
|
||||
latex = args.slice(latex+1).join(" ");
|
||||
if(!latex) {
|
||||
console.error("missing [--latex] runtime option string");
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Get the filename we'll need to write:
|
||||
var hash = process.argv.indexOf("--hash");
|
||||
hash = (latex === -1) ? Date.now() : process.argv[hash+1];
|
||||
var filename = "images/latex/" + hash + ".svg";
|
||||
var destination = __dirname + "/../" + filename;
|
||||
|
||||
// Set up the MathJax options for this conversion run
|
||||
var options = { math: cleanUp(latex), format: "TeX", svg: true };
|
||||
|
||||
// Convert the passed LaTeX to SVG form
|
||||
API.typeset(options, function saveToFile(data) {
|
||||
if (data.errors) {
|
||||
console.error(data.errors);
|
||||
process.exit(1);
|
||||
}
|
||||
var filedata = ["<!--", options.math, "-->", data.svg].join("\n");
|
||||
fs.writeFileSync(destination, filedata);
|
||||
process.exit(0);
|
||||
});
|
@@ -1,5 +0,0 @@
|
||||
var LaTeX = "\\[ {\\color{blue}E} = mc^2 \\]";
|
||||
var execSync = require("child_process").execSync;
|
||||
var cmd = "node mathjax.js --latex " + LaTeX;
|
||||
var result = execSync(cmd);
|
||||
var string = result.toString();
|
134
tools/tex-to-svg.js
Normal file
134
tools/tex-to-svg.js
Normal file
@@ -0,0 +1,134 @@
|
||||
/**
|
||||
*
|
||||
* This script acts as support to the latex-loader for webpack.
|
||||
* The latex-loader finds and preprocesses LaTeX elements,
|
||||
* and then this script is run via execSync, to get the SVG
|
||||
* conversion happening synchronously, since Webpack doesn't
|
||||
* do async loaders (unfortunately).
|
||||
*
|
||||
*/
|
||||
var fs = require("fs-extra");
|
||||
var path = require("path");
|
||||
var cleanUp = require("./cleanup");
|
||||
var execSync = require("child_process").execSync;
|
||||
|
||||
// Get the LaTeX we need, either straight up or base64 encoded:
|
||||
var latex = process.argv.indexOf("--latex");
|
||||
|
||||
if (latex === -1) {
|
||||
var base64 = process.argv.indexOf("--base64");
|
||||
if (base64 === -1) {
|
||||
console.error("missing [--latex] or [--base64] runtime option");
|
||||
process.exit(1);
|
||||
}
|
||||
base64 = process.argv[base64+1];
|
||||
latex = new Buffer(base64, "base64").toString();
|
||||
} else {
|
||||
// get the --latex value
|
||||
var args = Array.from(process.argv);
|
||||
latex = args.slice(latex+1).join(" ");
|
||||
if(!latex) {
|
||||
console.error("missing [--latex] runtime option string");
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Get the filename we'll need to write:
|
||||
var hash = process.argv.indexOf("--hash");
|
||||
hash = (latex === -1) ? Date.now() : process.argv[hash+1];
|
||||
var dir = path.resolve(__dirname + "/../images/latex");
|
||||
fs.ensureDirSync(dir);
|
||||
var filename = path.join(dir, hash + ".svg");
|
||||
|
||||
// also set up a tex source copy
|
||||
dir = path.join(dir, "source");
|
||||
fs.ensureDirSync(dir);
|
||||
var TeXfilename = path.join(dir, hash + ".tex");
|
||||
|
||||
var latexSourceCode = cleanUp(latex);
|
||||
var aligned = latexSourceCode.indexOf("\\begin{aligned}") !== -1;
|
||||
|
||||
//if (aligned) {
|
||||
latexSourceCode = [
|
||||
'\\[',
|
||||
latexSourceCode,
|
||||
'\\]'
|
||||
].join('\n');
|
||||
//}
|
||||
|
||||
// Convert the passed LaTeX to SVG form
|
||||
// write the .tex source
|
||||
var filedata = [
|
||||
'\\documentclass[12pt]{article}',
|
||||
'\\usepackage[paperwidth=12in, paperheight=12in]{geometry}', // pdfcrop will remove the unused bits later
|
||||
'\\pagestyle{empty}',
|
||||
'\\usepackage{color}',
|
||||
'\\usepackage{amsmath}',
|
||||
'\\usepackage{unicode-math}'
|
||||
]
|
||||
|
||||
if (process.env.locale === 'zh-CN') {
|
||||
filedata = filedata.concat([
|
||||
'\\usepackage{xeCJK}',
|
||||
'\\xeCJKsetup{CJKmath=true}',
|
||||
'\\setCJKmainfont{SimSun}'
|
||||
]);
|
||||
}
|
||||
|
||||
if (process.env.locale === 'ja-JP') {
|
||||
filedata = filedata.concat([
|
||||
'\\usepackage{xeCJK}',
|
||||
'\\xeCJKsetup{CJKmath=true}',
|
||||
'\\setCJKmainfont{MS Mincho}'
|
||||
]);
|
||||
}
|
||||
|
||||
filedata = filedata.concat([
|
||||
'\\setmainfont[Ligatures=TeX]{TeX Gyre Pagella}',
|
||||
'\\setmathfont{TeX Gyre Pagella Math}',
|
||||
|
||||
// '\\setmainfont{XITS}',
|
||||
// '\\setmathfont{XITS Math}',
|
||||
|
||||
// '\\setmainfont[Ligatures=TeX]{Cambria}',
|
||||
// '\\setmathfont{Cambria Math}',
|
||||
|
||||
// '\\setmainfont[Ligatures=TeX]{LucidaBrightOT}',
|
||||
// '\\setmathfont{LucidaBrightMathOT}',
|
||||
|
||||
'\\begin{document}',
|
||||
latexSourceCode,
|
||||
'\\end{document}'
|
||||
]);
|
||||
|
||||
filedata = filedata.join('\n');
|
||||
fs.writeFileSync(TeXfilename, filedata);
|
||||
|
||||
var PDFfilename = TeXfilename.replace(".tex",".pdf");
|
||||
var PDFfilenameCropped = TeXfilename.replace(".tex","-crop.pdf");
|
||||
var SVGfilename = TeXfilename.replace(".tex",".svg");
|
||||
|
||||
// make the SVGfilename one dir higher
|
||||
SVGfilename = path.resolve(path.join(path.dirname(TeXfilename), '..', hash + ".svg"));
|
||||
|
||||
// run xelatex on this file
|
||||
try {
|
||||
var cmd = `npm run xelatex -- -output-directory "${path.dirname(TeXfilename)}" "${TeXfilename}"`;
|
||||
console.log(cmd);
|
||||
console.log(" - running xelatex on " + hash + ".tex");
|
||||
execSync(cmd); //, { stdio: 'inherit' });
|
||||
|
||||
var cmd = `npm run pdfcrop -- "${ PDFfilename }"`;
|
||||
console.log(" - cropping PDF to document content");
|
||||
execSync(cmd); //, { stdio: 'inherit' });
|
||||
|
||||
var cmd = `pdf2svg "${ PDFfilenameCropped }" "${ SVGfilename }"`;
|
||||
console.log(" - converting cropped PDF to SVG");
|
||||
execSync(cmd); //, { stdio: 'inherit' });
|
||||
|
||||
var cmd = `npm run svgo -- "${ SVGfilename }"`;
|
||||
console.log(" - cleaning up SVG");
|
||||
execSync(cmd); //, { stdio: 'inherit' });
|
||||
}
|
||||
|
||||
catch (e) { console.error(e); process.exit(1); }
|
Reference in New Issue
Block a user