/* 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, };