You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
4.2 KiB
148 lines
4.2 KiB
/* eslint no-unused-vars:0 */
|
|
|
|
var Style = require("./Style");
|
|
|
|
/**
|
|
* This file contains metrics regarding fonts and individual symbols. The sigma
|
|
* and xi variables, as well as the metricMap map contain data extracted from
|
|
* TeX, TeX font metrics, and the TTF files. These data are then exposed via the
|
|
* `metrics` variable and the getCharacterMetrics function.
|
|
*/
|
|
|
|
// These font metrics are extracted from TeX by using
|
|
// \font\a=cmmi10
|
|
// \showthe\fontdimenX\a
|
|
// where X is the corresponding variable number. These correspond to the font
|
|
// parameters of the symbol fonts. In TeX, there are actually three sets of
|
|
// dimensions, one for each of textstyle, scriptstyle, and scriptscriptstyle,
|
|
// but we only use the textstyle ones, and scale certain dimensions accordingly.
|
|
// See the TeXbook, page 441.
|
|
var sigma1 = 0.025;
|
|
var sigma2 = 0;
|
|
var sigma3 = 0;
|
|
var sigma4 = 0;
|
|
var sigma5 = 0.431;
|
|
var sigma6 = 1;
|
|
var sigma7 = 0;
|
|
var sigma8 = 0.677;
|
|
var sigma9 = 0.394;
|
|
var sigma10 = 0.444;
|
|
var sigma11 = 0.686;
|
|
var sigma12 = 0.345;
|
|
var sigma13 = 0.413;
|
|
var sigma14 = 0.363;
|
|
var sigma15 = 0.289;
|
|
var sigma16 = 0.150;
|
|
var sigma17 = 0.247;
|
|
var sigma18 = 0.386;
|
|
var sigma19 = 0.050;
|
|
var sigma20 = 2.390;
|
|
var sigma21 = 1.01;
|
|
var sigma21Script = 0.81;
|
|
var sigma21ScriptScript = 0.71;
|
|
var sigma22 = 0.250;
|
|
|
|
// These font metrics are extracted from TeX by using
|
|
// \font\a=cmex10
|
|
// \showthe\fontdimenX\a
|
|
// where X is the corresponding variable number. These correspond to the font
|
|
// parameters of the extension fonts (family 3). See the TeXbook, page 441.
|
|
var xi1 = 0;
|
|
var xi2 = 0;
|
|
var xi3 = 0;
|
|
var xi4 = 0;
|
|
var xi5 = 0.431;
|
|
var xi6 = 1;
|
|
var xi7 = 0;
|
|
var xi8 = 0.04;
|
|
var xi9 = 0.111;
|
|
var xi10 = 0.166;
|
|
var xi11 = 0.2;
|
|
var xi12 = 0.6;
|
|
var xi13 = 0.1;
|
|
|
|
// This value determines how large a pt is, for metrics which are defined in
|
|
// terms of pts.
|
|
// This value is also used in katex.less; if you change it make sure the values
|
|
// match.
|
|
var ptPerEm = 10.0;
|
|
|
|
// The space between adjacent `|` columns in an array definition. From
|
|
// `\showthe\doublerulesep` in LaTeX.
|
|
var doubleRuleSep = 2.0 / ptPerEm;
|
|
|
|
/**
|
|
* This is just a mapping from common names to real metrics
|
|
*/
|
|
var metrics = {
|
|
xHeight: sigma5,
|
|
quad: sigma6,
|
|
num1: sigma8,
|
|
num2: sigma9,
|
|
num3: sigma10,
|
|
denom1: sigma11,
|
|
denom2: sigma12,
|
|
sup1: sigma13,
|
|
sup2: sigma14,
|
|
sup3: sigma15,
|
|
sub1: sigma16,
|
|
sub2: sigma17,
|
|
supDrop: sigma18,
|
|
subDrop: sigma19,
|
|
axisHeight: sigma22,
|
|
defaultRuleThickness: xi8,
|
|
bigOpSpacing1: xi9,
|
|
bigOpSpacing2: xi10,
|
|
bigOpSpacing3: xi11,
|
|
bigOpSpacing4: xi12,
|
|
bigOpSpacing5: xi13,
|
|
ptPerEm: ptPerEm,
|
|
emPerEx: sigma5 / sigma6,
|
|
doubleRuleSep: doubleRuleSep,
|
|
|
|
// TODO(alpert): Missing parallel structure here. We should probably add
|
|
// style-specific metrics for all of these.
|
|
delim1: sigma20,
|
|
getDelim2: function(style) {
|
|
if (style.size === Style.TEXT.size) {
|
|
return sigma21;
|
|
} else if (style.size === Style.SCRIPT.size) {
|
|
return sigma21Script;
|
|
} else if (style.size === Style.SCRIPTSCRIPT.size) {
|
|
return sigma21ScriptScript;
|
|
}
|
|
throw new Error("Unexpected style size: " + style.size);
|
|
},
|
|
};
|
|
|
|
// This map contains a mapping from font name and character code to character
|
|
// metrics, including height, depth, italic correction, and skew (kern from the
|
|
// character to the corresponding \skewchar)
|
|
// This map is generated via `make metrics`. It should not be changed manually.
|
|
var metricMap = require("./fontMetricsData");
|
|
|
|
/**
|
|
* This function is a convenience function for looking up information in the
|
|
* metricMap table. It takes a character as a string, and a style.
|
|
*
|
|
* Note: the `width` property may be undefined if fontMetricsData.js wasn't
|
|
* built using `Make extended_metrics`.
|
|
*/
|
|
var getCharacterMetrics = function(character, style) {
|
|
var metrics = metricMap[style][character.charCodeAt(0)];
|
|
if (metrics) {
|
|
return {
|
|
depth: metrics[0],
|
|
height: metrics[1],
|
|
italic: metrics[2],
|
|
skew: metrics[3],
|
|
width: metrics[4],
|
|
};
|
|
}
|
|
};
|
|
|
|
module.exports = {
|
|
metrics: metrics,
|
|
getCharacterMetrics: getCharacterMetrics,
|
|
};
|