bib2json
Version:
Javascript parsing of Bibtex to JSON for nodejs and the browser.
1,399 lines (1,378 loc) • 67.1 kB
JavaScript
/**
* Parser.js
* Copyright 2012-13 Mayank Lahiri
* mlahiri@gmail.com
* Released under the BSD License.
*
* A forgiving Bibtex parser that can:
*
* (1) operate in streaming or block mode, extracting entries as dictionaries.
* (2) convert Latex special characters to UTF-8.
* (3) best-effort parse malformed entries.
* (4) run in a CommonJS environment or a browser, without any dependencies.
* (5) be advanced-compiled by Google Closure Compiler.
*
* Handwritten as a labor of love, not auto-generated from a grammar.
*
* Modes of usage:
*
* (1) Synchronous, string
*
* var entries = BibtexParser(text);
* console.log(entries);
*
* (2) Asynchronous, stream
*
* var entryCallback = function(entry) { console.log(entry); }
* var parser = new BibtexParser(entryCallback);
* parser.parse(chunk1);
* parser.parse(chunk2);
* ...
*
* @param {text|function(Object)} arg Either a Bibtex string or callback
* function for processing parsed entries.
* @constructor
*/
function BibtexParser(arg0) {
// Determine how this function is to be used
if (typeof arg0 == 'string') {
// Passed a string, synchronous call without 'new'
var tempStorage = {};
var entries = [];
function accumulator(entry) {
entries.push(entry);
}
var parser = BibtexParser.call(tempStorage, accumulator);
parser.parse(arg0);
return {
'entries': entries,
'errors': parser.getErrors()
}
}
if (typeof arg0 != 'function') {
throw 'Invalid parser construction.';
}
/** @enum {number} */
this.STATES_ = {
ENTRY_OR_JUNK: 0,
OBJECT_TYPE: 1,
ENTRY_KEY: 2,
KV_KEY: 3,
EQUALS: 4,
KV_VALUE: 5
}
/** @private */ this.DATA_ = {};
/** @private */ this.CALLBACK_ = arg0;
/** @private */ this.CHAR_ = 0;
/** @private */ this.LINE_ = 1;
/** @private */ this.CHAR_IN_LINE_ = 0;
/** @private */ this.SKIPWS_ = true;
/** @private */ this.SKIPCOMMENT_ = true;
/** @private */ this.PARSETMP_ = {};
/** @private */ this.SKIPTILLEOL_ = false;
/** @private */ this.VALBRACES_ = null;
/** @private */ this.BRACETYPE_ = null;
/** @private */ this.BRACECOUNT_ = 0;
/** @private */ this.STATE_ = this.STATES_.ENTRY_OR_JUNK;
/** @private */ this.ERRORS_ = [];
/** @private */ this.ENTRY_TYPES_ = {
'inproceedings' : 1,
'proceedings' : 2,
'article' : 3,
'techreport' : 4,
'misc' : 5,
'mastersthesis' : 6,
'book' : 7,
'phdthesis' : 8,
'incollection' : 9,
'unpublished' : 10,
'inbook' : 11,
'manual' : 12,
'periodical' : 13,
'booklet' : 14,
'masterthesis' : 15,
'conference' : 16
}
/** @private */ this.MACROS_ = {
'jan' : 'January',
'feb' : 'February',
'mar' : 'March',
'apr' : 'April',
'may' : 'May',
'jun' : 'June',
'jul' : 'July',
'aug' : 'August',
'sep' : 'September',
'oct' : 'October',
'nov' : 'November',
'dec' : 'December',
'Jan' : 'January',
'Feb' : 'February',
'Mar' : 'March',
'Apr' : 'April',
'May' : 'May',
'Jun' : 'June',
'Jul' : 'July',
'Aug' : 'August',
'Sep' : 'September',
'Oct' : 'October',
'Nov' : 'November',
'Dec' : 'December'
}
/**
* Gets an array of all errors encountered during parsing.
* Array entries are of the format:
* [ line number, character in line, character in stream, error text ]
*
* @returns Array<Array>
* @public
*/
this.getErrors = function() {
return this.ERRORS_;
}
/**
* Processes a chunk of data
* @public
*/
this.parse = function(chunk) {
for (var i = 0; i < chunk.length; i++)
this.processCharacter_(chunk[i]);
}
/**
* Logs error at current stream position.
*
* @private
*/
this.error_ = function(text) {
this.ERRORS_.push([ this.LINE_,
this.CHAR_IN_LINE_,
this.CHAR_,
text ])
}
/**
* Called after an entire entry has been parsed from the stream.
* Performs post-processing and invokes the entry callback pointed to by
* this.CALLBACK_. Parsed (but unprocessed) entry data is in this.DATA_.
*/
this.processEntry_ = function() {
var data = this.DATA_;
if (data.Fields)
for (var f in data.Fields) {
var raw = data.Fields[f];
// Convert Latex/Bibtex special characters to UTF-8 equivalents
for (var i = 0; i < this.CHARCONV_.length; i++) {
var re = this.CHARCONV_[i][0];
var rep = this.CHARCONV_[i][1];
raw = raw.replace(re, rep);
}
// Basic substitutions
raw = raw.replace(/[\n\r\t]/g, ' ')
.replace(/\s\s+/g, ' ')
.replace(/^\s+|\s+$/g, '')
// Remove braces and backslashes
var len = raw.length;
var processed = '';
for (var i = 0; i < len; i++) {
var c = raw[i];
var skip = false;
if (c == '\\' && i < len-1)
c = raw[++i];
else {
if (c == '{' || c == '}')
skip = true;
}
if (!skip)
processed += c;
}
data.Fields[f] = processed
}
if (data.ObjectType == 'string') {
for (var f in data.Fields) {
this.MACROS_[f] = data.Fields[f];
}
} else {
// Parsed a new Bibtex entry
this.CALLBACK_(data);
}
}
/**
* Processes next character in the stream, invoking the callback after
* each entry has been found and processed.
*
* @private
* @param {string} c Next character in input stream
*/
this.processCharacter_ = function(c) {
// Housekeeping
this.CHAR_++;
this.CHAR_IN_LINE_++;
if (c == '\n') {
this.LINE_++;
this.CHAR_IN_LINE_ = 1;
}
// Convenience states for skipping whitespace when needed
if (this.SKIPTILLEOL_) {
if (c == '\n')
this.SKIPTILLEOL_ = false;
return;
}
if (this.SKIPCOMMENT_ && c == '%') {
this.SKIPTILLEOL_ = true;
return;
}
if (this.SKIPWS_ && /\s/.test(c))
return;
this.SKIPWS_ = false;
this.SKIPCOMMENT_ = false;
this.SKIPTILLEOL_ = false;
// Main state machine
var AnotherIteration = true;
while (AnotherIteration) {
//console.log(this.LINE_, this.CHAR_IN_LINE_, this.STATE_, c)
AnotherIteration = false;
switch(this.STATE_) {
// -- Scan for an object marker ('@')
// -- Reset temporary data structure in case previous entry was garbled
case this.STATES_.ENTRY_OR_JUNK:
if (c == '@') {
// SUCCESS: Parsed a valid start-of-object marker.
// NEXT_STATE: OBJECT_TYPE
this.STATE_ = this.STATES_.OBJECT_TYPE;
this.DATA_ = {
ObjectType : ''
};
}
this.BRACETYPE_ = null;
this.SKIPWS_ = true;
this.SKIPCOMMENT_ = true;
break;
// Start at first non-whitespace character after start-of-object '@'
// -- Accept [A-Za-z], break on non-matching character
// -- Populate this.DATA_.EntryType and this.DATA_.ObjectType
case this.STATES_.OBJECT_TYPE:
if (/[A-Za-z]/.test(c)) {
this.DATA_.ObjectType += c.toLowerCase();
this.SKIPWS_ = true;
this.SKIPCOMMENT_ = true;
} else {
// Break from state and validate object type
var ot = this.DATA_.ObjectType;
if (ot == 'comment') {
this.STATE_ = this.STATES_.ENTRY_OR_JUNK;
} else {
if (ot == 'string') {
this.DATA_.ObjectType = ot;
this.DATA_.Fields = {};
this.BRACETYPE_ = c;
this.BRACECOUNT_ = 1;
this.STATE_ = this.STATES_.KV_KEY;
this.SKIPWS_ = true;
this.SKIPCOMMENT_ = true;
this.PARSETMP_ = {
Key: ''
}
} else {
if (ot == 'preamble') {
this.STATE_ = this.STATES_.ENTRY_OR_JUNK;
} else {
if (ot in this.ENTRY_TYPES_) {
// SUCCESS: Parsed a valid object type.
// NEXT_STATE: ENTRY_KEY
this.DATA_.ObjectType = 'entry';
this.DATA_.EntryType = ot;
this.DATA_.EntryKey = '';
this.STATE_ = this.STATES_.ENTRY_KEY;
AnotherIteration = true;
} else {
// ERROR: Unrecognized object type.
// NEXT_STATE: ENTRY_OR_JUNK
this.error_('Unrecognized object type: "' +
this.DATA_.ObjectType + '"')
this.STATE_ = this.STATES_.ENTRY_OR_JUNK;
}
}
}
}
}
break;
// Start at first non-alphabetic character after an entry type
// -- Populate this.DATA_.EntryKey
case this.STATES_.ENTRY_KEY:
if ((c === '{' || c === '(') && this.BRACETYPE_ == null) {
this.BRACETYPE_ = c;
this.BRACECOUNT_ = 1;
this.SKIPWS_ = true;
this.SKIPCOMMENT_ = true;
break;
}
if (/[,%\s]/.test(c)) {
if (this.DATA_.EntryKey.length < 1) {
// Skip comments and whitespace before entry key
this.SKIPWS_ = true;
this.SKIPCOMMENT_ = true;
} else {
if (this.BRACETYPE_ == null) {
// ERROR: No opening brace for object
// NEXT_STATE: ENTRY_OR_JUNK
this.error_('No opening brace for object.');
this.STATE_ = this.STATES_.ENTRY_OR_JUNK;
} else {
// SUCCESS: Parsed an entry key
// NEXT_STATE: KV_KEY
this.SKIPWS_ = true;
this.SKIPCOMMENT_ = true;
AnotherIteration = true;
this.STATE_ = this.STATES_.KV_KEY;
this.PARSETMP_.Key= '';
this.DATA_.Fields = {};
}
}
} else {
this.DATA_.EntryKey += c;
this.SKIPWS_ = false;
this.SKIPCOMMENT_ = false;
}
break;
// Start at first non-whitespace/comment character after entry key.
// -- Populate this.PARSETMP_.Key
case this.STATES_.KV_KEY:
// Test for end of entry
if ((c == '}' && this.BRACETYPE_ == '{') ||
(c == ')' && this.BRACETYPE_ == '(')) {
// SUCCESS: Parsed an entry, possible incomplete
// NEXT_STATE: ENTRY_OR_JUNK
this.processEntry_();
this.SKIPWS_ = true;
this.SKIPCOMMENT_ = true;
this.STATE_ = this.STATES_.ENTRY_OR_JUNK;
break;
}
if (/[\-A-Za-z:]/.test(c)) {
// Add to key
this.PARSETMP_.Key += c;
this.SKIPWS_ = false;
this.SKIPCOMMENT_ = false;
} else {
// Either end of key or we haven't encountered start of key
if (this.PARSETMP_.Key.length < 1) {
// Keep going till we see a key
this.SKIPWS_ = true;
this.SKIPCOMMENT_ = true;
} else {
// SUCCESS: Found full key in K/V pair
// NEXT_STATE: EQUALS
this.SKIPWS_ = true;
this.SKIPCOMMENT_ = true;
this.STATE_ = this.STATES_.EQUALS;
AnotherIteration = true;
}
}
break;
// Start at first non-alphabetic character after K/V pair key.
case this.STATES_.EQUALS:
if ((c == '}' && this.BRACETYPE_ == '{') ||
(c == ')' && this.BRACETYPE_ == '(')) {
// ERROR: K/V pair with key but no value
// NEXT_STATE: ENTRY_OR_JUNK
this.error_('Key-value pair has key "' +
this.PARSETMP_.Key + '", but no value.');
this.processEntry_();
this.SKIPWS_ = true;
this.SKIPCOMMENT_ = true;
this.STATE_ = this.STATES_.ENTRY_OR_JUNK;
break;
}
if (c == '=') {
// SUCCESS: found an equal signs separating key and value
// NEXT_STATE: KV_VALUE
this.SKIPWS_ = true;
this.SKIPCOMMENT_ = true;
this.STATE_ = this.STATES_.KV_VALUE;
this.PARSETMP_.Value = '';
this.VALBRACES_ = { '"' : [], '{' : [] };
}
break;
// Start at first non-whitespace/comment character after '='
// -- Populate this.PARSETMP_.Value
case this.STATES_.KV_VALUE:
var delim = this.VALBRACES_;
var val = this.PARSETMP_.Value;
var doneParsingValue = false;
// Test for special characters
if (c == '"' || c == '{' || c == '}' || c == ',') {
if (c == ',') {
// This comma can mean:
// (1) just another comma literal
// (2) end of a macro reference
if (0 === delim['"'].length + delim['{'].length) {
// end of a macro reference
var macro = this.PARSETMP_.Value.trim();
if (macro in this.MACROS_) {
// Successful macro reference
this.PARSETMP_.Value = this.MACROS_[macro];
} else {
// Reference to an undefined macro
this.error_('Reference to an undefined macro: '+macro);
}
doneParsingValue = true;
}
}
if (c == '"') {
// This quote can mean:
// (1) opening delimiter
// (2) closing delimiter
// (3) literal, if we have a '{' on the stack
if (0 === delim['"'].length + delim['{'].length) {
// opening delimiter
delim['"'].push(this.CHAR_)
this.SKIPWS_ = false;
this.SKIPCOMMENT_ = false;
break;
}
if (delim['"'].length == 1 && delim['{'].length == 0 &&
(val.length==0 || val[val.length-1] != '\\')) {
// closing delimiter
doneParsingValue = true;
} else {
// literal, add to value
}
}
if (c == '{') {
// This brace can mean:
// (1) opening delimiter
// (2) stacked verbatim delimiter
if (val.length == 0 || val[val.length-1] != '\\') {
delim['{'].push(this.CHAR_)
this.SKIPWS_ = false;
this.SKIPCOMMENT_ = false;
} else {
// literal, add to value
}
}
if (c == '}') {
// This brace can mean:
// (1) closing delimiter
// (2) closing stacked verbatim delimiter
// (3) end of object definition if value was a macro
if (0 === delim['"'].length + delim['{'].length) {
// end of object definition, after macro
var macro = this.PARSETMP_.Value.trim();
if (macro in this.MACROS_) {
// Successful macro reference
this.PARSETMP_.Value = this.MACROS_[macro];
} else {
// Reference to an undefined macro
this.error_('Reference to an undefined macro: '+macro);
}
AnotherIteration = true;
doneParsingValue = true;
} else {
if (val.length == 0 || val[val.length-1] != '\\') {
if (delim['{'].length > 0) {
// pop stack for stacked verbatim delimiter
delim['{'].splice(delim['{'].length-1, 1)
if (0 == delim['{'].length + delim['"'].length) {
// closing delimiter
doneParsingValue = true;
} else {
// end verbatim block
}
}
} else {
// literal, add to value
}
}
}
}
// If here, then we are either done parsing the value or
// have a literal that should be added to the value.
if (doneParsingValue) {
// SUCCESS: value parsed
// NEXT_STATE: KV_KEY
this.SKIPWS_ = true;
this.SKIPCOMMENT_ = true;
this.STATE_ = this.STATES_.KV_KEY;
this.DATA_.Fields[this.PARSETMP_.Key] = this.PARSETMP_.Value;
this.PARSETMP_ = { Key: '' };
this.VALBRACES_ = null;
} else {
this.PARSETMP_.Value += c;
}
break;
} // end switch (this.STATE_)
} // end while(AnotherIteration)
} // end function processCharacter
/** @private */ this.CHARCONV_ = [
[ /\\space /g, '\u0020' ],
[ /\\textdollar /g, '\u0024' ],
[ /\\textquotesingle /g, '\u0027' ],
[ /\\ast /g, '\u002A' ],
[ /\\textbackslash /g, '\u005C' ],
[ /\\\^\{\}/g, '\u005E' ],
[ /\\textasciigrave /g, '\u0060' ],
[ /\\lbrace /g, '\u007B' ],
[ /\\vert /g, '\u007C' ],
[ /\\rbrace /g, '\u007D' ],
[ /\\textasciitilde /g, '\u007E' ],
[ /\\textexclamdown /g, '\u00A1' ],
[ /\\textcent /g, '\u00A2' ],
[ /\\textsterling /g, '\u00A3' ],
[ /\\textcurrency /g, '\u00A4' ],
[ /\\textyen /g, '\u00A5' ],
[ /\\textbrokenbar /g, '\u00A6' ],
[ /\\textsection /g, '\u00A7' ],
[ /\\textasciidieresis /g, '\u00A8' ],
[ /\\textcopyright /g, '\u00A9' ],
[ /\\textordfeminine /g, '\u00AA' ],
[ /\\guillemotleft /g, '\u00AB' ],
[ /\\lnot /g, '\u00AC' ],
[ /\\textregistered /g, '\u00AE' ],
[ /\\textasciimacron /g, '\u00AF' ],
[ /\\textdegree /g, '\u00B0' ],
[ /\\pm /g, '\u00B1' ],
[ /\\textasciiacute /g, '\u00B4' ],
[ /\\mathrm\{\\mu\}/g, '\u00B5' ],
[ /\\textparagraph /g, '\u00B6' ],
[ /\\cdot /g, '\u00B7' ],
[ /\\c\{\}/g, '\u00B8' ],
[ /\\textordmasculine /g, '\u00BA' ],
[ /\\guillemotright /g, '\u00BB' ],
[ /\\textonequarter /g, '\u00BC' ],
[ /\\textonehalf /g, '\u00BD' ],
[ /\\textthreequarters /g, '\u00BE' ],
[ /\\textquestiondown /g, '\u00BF' ],
[ /\\`\{A\}/g, '\u00C0' ],
[ /\\'\{A\}/g, '\u00C1' ],
[ /\\\^\{A\}/g, '\u00C2' ],
[ /\\~\{A\}/g, '\u00C3' ],
[ /\\"\{A\}/g, '\u00C4' ],
[ /\\AA /g, '\u00C5' ],
[ /\\AE /g, '\u00C6' ],
[ /\\c\{C\}/g, '\u00C7' ],
[ /\\`\{E\}/g, '\u00C8' ],
[ /\\'\{E\}/g, '\u00C9' ],
[ /\\\^\{E\}/g, '\u00CA' ],
[ /\\"\{E\}/g, '\u00CB' ],
[ /\\`\{I\}/g, '\u00CC' ],
[ /\\'\{I\}/g, '\u00CD' ],
[ /\\\^\{I\}/g, '\u00CE' ],
[ /\\"\{I\}/g, '\u00CF' ],
[ /\\DH /g, '\u00D0' ],
[ /\\~\{N\}/g, '\u00D1' ],
[ /\\`\{O\}/g, '\u00D2' ],
[ /\\'\{O\}/g, '\u00D3' ],
[ /\\\^\{O\}/g, '\u00D4' ],
[ /\\~\{O\}/g, '\u00D5' ],
[ /\\"\{O\}/g, '\u00D6' ],
[ /\\texttimes /g, '\u00D7' ],
[ /\\O /g, '\u00D8' ],
[ /\\`\{U\}/g, '\u00D9' ],
[ /\\'\{U\}/g, '\u00DA' ],
[ /\\\^\{U\}/g, '\u00DB' ],
[ /\\"\{U\}/g, '\u00DC' ],
[ /\\'\{Y\}/g, '\u00DD' ],
[ /\\TH /g, '\u00DE' ],
[ /\\ss /g, '\u00DF' ],
[ /\\`\{a\}/g, '\u00E0' ],
[ /\\'\{a\}/g, '\u00E1' ],
[ /\\\^\{a\}/g, '\u00E2' ],
[ /\\~\{a\}/g, '\u00E3' ],
[ /\\"\{a\}/g, '\u00E4' ],
[ /\\aa /g, '\u00E5' ],
[ /\\ae /g, '\u00E6' ],
[ /\\c\{c\}/g, '\u00E7' ],
[ /\\`\{e\}/g, '\u00E8' ],
[ /\\'\{e\}/g, '\u00E9' ],
[ /\\\^\{e\}/g, '\u00EA' ],
[ /\\"\{e\}/g, '\u00EB' ],
[ /\\`\{\\i\}/g, '\u00EC' ],
[ /\\'\{\\i\}/g, '\u00ED' ],
[ /\\\^\{\\i\}/g, '\u00EE' ],
[ /\\"\{\\i\}/g, '\u00EF' ],
[ /\\dh /g, '\u00F0' ],
[ /\\~\{n\}/g, '\u00F1' ],
[ /\\`\{o\}/g, '\u00F2' ],
[ /\\'\{o\}/g, '\u00F3' ],
[ /\\\^\{o\}/g, '\u00F4' ],
[ /\\~\{o\}/g, '\u00F5' ],
[ /\\"\{o\}/g, '\u00F6' ],
[ /\\div /g, '\u00F7' ],
[ /\\o /g, '\u00F8' ],
[ /\\`\{u\}/g, '\u00F9' ],
[ /\\'\{u\}/g, '\u00FA' ],
[ /\\\^\{u\}/g, '\u00FB' ],
[ /\\"\{u\}/g, '\u00FC' ],
[ /\\'\{y\}/g, '\u00FD' ],
[ /\\th /g, '\u00FE' ],
[ /\\"\{y\}/g, '\u00FF' ],
[ /\\=\{A\}/g, '\u0100' ],
[ /\\=\{a\}/g, '\u0101' ],
[ /\\u\{A\}/g, '\u0102' ],
[ /\\u\{a\}/g, '\u0103' ],
[ /\\k\{A\}/g, '\u0104' ],
[ /\\k\{a\}/g, '\u0105' ],
[ /\\'\{C\}/g, '\u0106' ],
[ /\\'\{c\}/g, '\u0107' ],
[ /\\\^\{C\}/g, '\u0108' ],
[ /\\\^\{c\}/g, '\u0109' ],
[ /\\.\{C\}/g, '\u010A' ],
[ /\\.\{c\}/g, '\u010B' ],
[ /\\v\{C\}/g, '\u010C' ],
[ /\\v\{c\}/g, '\u010D' ],
[ /\\v\{D\}/g, '\u010E' ],
[ /\\v\{d\}/g, '\u010F' ],
[ /\\DJ /g, '\u0110' ],
[ /\\dj /g, '\u0111' ],
[ /\\=\{E\}/g, '\u0112' ],
[ /\\=\{e\}/g, '\u0113' ],
[ /\\u\{E\}/g, '\u0114' ],
[ /\\u\{e\}/g, '\u0115' ],
[ /\\.\{E\}/g, '\u0116' ],
[ /\\.\{e\}/g, '\u0117' ],
[ /\\k\{E\}/g, '\u0118' ],
[ /\\k\{e\}/g, '\u0119' ],
[ /\\v\{E\}/g, '\u011A' ],
[ /\\v\{e\}/g, '\u011B' ],
[ /\\\^\{G\}/g, '\u011C' ],
[ /\\\^\{g\}/g, '\u011D' ],
[ /\\u\{G\}/g, '\u011E' ],
[ /\\u\{g\}/g, '\u011F' ],
[ /\\.\{G\}/g, '\u0120' ],
[ /\\.\{g\}/g, '\u0121' ],
[ /\\c\{G\}/g, '\u0122' ],
[ /\\c\{g\}/g, '\u0123' ],
[ /\\\^\{H\}/g, '\u0124' ],
[ /\\\^\{h\}/g, '\u0125' ],
[ /\\Elzxh /g, '\u0127' ],
[ /\\~\{I\}/g, '\u0128' ],
[ /\\~\{\\i\}/g, '\u0129' ],
[ /\\=\{I\}/g, '\u012A' ],
[ /\\=\{\\i\}/g, '\u012B' ],
[ /\\u\{I\}/g, '\u012C' ],
[ /\\u\{\\i\}/g, '\u012D' ],
[ /\\k\{I\}/g, '\u012E' ],
[ /\\k\{i\}/g, '\u012F' ],
[ /\\.\{I\}/g, '\u0130' ],
[ /\\i /g, '\u0131' ],
[ /\\\^\{J\}/g, '\u0134' ],
[ /\\\^\{\\j\}/g, '\u0135' ],
[ /\\c\{K\}/g, '\u0136' ],
[ /\\c\{k\}/g, '\u0137' ],
[ /\\'\{L\}/g, '\u0139' ],
[ /\\'\{l\}/g, '\u013A' ],
[ /\\c\{L\}/g, '\u013B' ],
[ /\\c\{l\}/g, '\u013C' ],
[ /\\v\{L\}/g, '\u013D' ],
[ /\\v\{l\}/g, '\u013E' ],
[ /\\L /g, '\u0141' ],
[ /\\l /g, '\u0142' ],
[ /\\'\{N\}/g, '\u0143' ],
[ /\\'\{n\}/g, '\u0144' ],
[ /\\c\{N\}/g, '\u0145' ],
[ /\\c\{n\}/g, '\u0146' ],
[ /\\v\{N\}/g, '\u0147' ],
[ /\\v\{n\}/g, '\u0148' ],
[ /\\NG /g, '\u014A' ],
[ /\\ng /g, '\u014B' ],
[ /\\=\{O\}/g, '\u014C' ],
[ /\\=\{o\}/g, '\u014D' ],
[ /\\u\{O\}/g, '\u014E' ],
[ /\\u\{o\}/g, '\u014F' ],
[ /\\H\{O\}/g, '\u0150' ],
[ /\\H\{o\}/g, '\u0151' ],
[ /\\OE /g, '\u0152' ],
[ /\\oe /g, '\u0153' ],
[ /\\'\{R\}/g, '\u0154' ],
[ /\\'\{r\}/g, '\u0155' ],
[ /\\c\{R\}/g, '\u0156' ],
[ /\\c\{r\}/g, '\u0157' ],
[ /\\v\{R\}/g, '\u0158' ],
[ /\\v\{r\}/g, '\u0159' ],
[ /\\'\{S\}/g, '\u015A' ],
[ /\\'\{s\}/g, '\u015B' ],
[ /\\\^\{S\}/g, '\u015C' ],
[ /\\\^\{s\}/g, '\u015D' ],
[ /\\c\{S\}/g, '\u015E' ],
[ /\\c\{s\}/g, '\u015F' ],
[ /\\v\{S\}/g, '\u0160' ],
[ /\\v\{s\}/g, '\u0161' ],
[ /\\c\{T\}/g, '\u0162' ],
[ /\\c\{t\}/g, '\u0163' ],
[ /\\v\{T\}/g, '\u0164' ],
[ /\\v\{t\}/g, '\u0165' ],
[ /\\~\{U\}/g, '\u0168' ],
[ /\\~\{u\}/g, '\u0169' ],
[ /\\=\{U\}/g, '\u016A' ],
[ /\\=\{u\}/g, '\u016B' ],
[ /\\u\{U\}/g, '\u016C' ],
[ /\\u\{u\}/g, '\u016D' ],
[ /\\r\{U\}/g, '\u016E' ],
[ /\\r\{u\}/g, '\u016F' ],
[ /\\H\{U\}/g, '\u0170' ],
[ /\\H\{u\}/g, '\u0171' ],
[ /\\k\{U\}/g, '\u0172' ],
[ /\\k\{u\}/g, '\u0173' ],
[ /\\\^\{W\}/g, '\u0174' ],
[ /\\\^\{w\}/g, '\u0175' ],
[ /\\\^\{Y\}/g, '\u0176' ],
[ /\\\^\{y\}/g, '\u0177' ],
[ /\\"\{Y\}/g, '\u0178' ],
[ /\\'\{Z\}/g, '\u0179' ],
[ /\\'\{z\}/g, '\u017A' ],
[ /\\.\{Z\}/g, '\u017B' ],
[ /\\.\{z\}/g, '\u017C' ],
[ /\\v\{Z\}/g, '\u017D' ],
[ /\\v\{z\}/g, '\u017E' ],
[ /\\texthvlig /g, '\u0195' ],
[ /\\textnrleg /g, '\u019E' ],
[ /\\eth /g, '\u01AA' ],
[ /\\textdoublepipe /g, '\u01C2' ],
[ /\\'\{g\}/g, '\u01F5' ],
[ /\\Elztrna /g, '\u0250' ],
[ /\\Elztrnsa /g, '\u0252' ],
[ /\\Elzopeno /g, '\u0254' ],
[ /\\Elzrtld /g, '\u0256' ],
[ /\\Elzschwa /g, '\u0259' ],
[ /\\varepsilon /g, '\u025B' ],
[ /\\Elzpgamma /g, '\u0263' ],
[ /\\Elzpbgam /g, '\u0264' ],
[ /\\Elztrnh /g, '\u0265' ],
[ /\\Elzbtdl /g, '\u026C' ],
[ /\\Elzrtll /g, '\u026D' ],
[ /\\Elztrnm /g, '\u026F' ],
[ /\\Elztrnmlr /g, '\u0270' ],
[ /\\Elzltlmr /g, '\u0271' ],
[ /\\Elzltln /g, '\u0272' ],
[ /\\Elzrtln /g, '\u0273' ],
[ /\\Elzclomeg /g, '\u0277' ],
[ /\\textphi /g, '\u0278' ],
[ /\\Elztrnr /g, '\u0279' ],
[ /\\Elztrnrl /g, '\u027A' ],
[ /\\Elzrttrnr /g, '\u027B' ],
[ /\\Elzrl /g, '\u027C' ],
[ /\\Elzrtlr /g, '\u027D' ],
[ /\\Elzfhr /g, '\u027E' ],
[ /\\Elzrtls /g, '\u0282' ],
[ /\\Elzesh /g, '\u0283' ],
[ /\\Elztrnt /g, '\u0287' ],
[ /\\Elzrtlt /g, '\u0288' ],
[ /\\Elzpupsil /g, '\u028A' ],
[ /\\Elzpscrv /g, '\u028B' ],
[ /\\Elzinvv /g, '\u028C' ],
[ /\\Elzinvw /g, '\u028D' ],
[ /\\Elztrny /g, '\u028E' ],
[ /\\Elzrtlz /g, '\u0290' ],
[ /\\Elzyogh /g, '\u0292' ],
[ /\\Elzglst /g, '\u0294' ],
[ /\\Elzreglst /g, '\u0295' ],
[ /\\Elzinglst /g, '\u0296' ],
[ /\\textturnk /g, '\u029E' ],
[ /\\Elzdyogh /g, '\u02A4' ],
[ /\\Elztesh /g, '\u02A7' ],
[ /\\textasciicaron /g, '\u02C7' ],
[ /\\Elzverts /g, '\u02C8' ],
[ /\\Elzverti /g, '\u02CC' ],
[ /\\Elzlmrk /g, '\u02D0' ],
[ /\\Elzhlmrk /g, '\u02D1' ],
[ /\\Elzsbrhr /g, '\u02D2' ],
[ /\\Elzsblhr /g, '\u02D3' ],
[ /\\Elzrais /g, '\u02D4' ],
[ /\\Elzlow /g, '\u02D5' ],
[ /\\textasciibreve /g, '\u02D8' ],
[ /\\textperiodcentered /g, '\u02D9' ],
[ /\\r\{\}/g, '\u02DA' ],
[ /\\k\{\}/g, '\u02DB' ],
[ /\\texttildelow /g, '\u02DC' ],
[ /\\H\{\}/g, '\u02DD' ],
[ /\\tone\{55\}/g, '\u02E5' ],
[ /\\tone\{44\}/g, '\u02E6' ],
[ /\\tone\{33\}/g, '\u02E7' ],
[ /\\tone\{22\}/g, '\u02E8' ],
[ /\\tone\{11\}/g, '\u02E9' ],
[ /\\cyrchar\\C/g, '\u030F' ],
[ /\\Elzpalh /g, '\u0321' ],
[ /\\Elzrh /g, '\u0322' ],
[ /\\Elzsbbrg /g, '\u032A' ],
[ /\\Elzxl /g, '\u0335' ],
[ /\\Elzbar /g, '\u0336' ],
[ /\\'\{A\}/g, '\u0386' ],
[ /\\'\{E\}/g, '\u0388' ],
[ /\\'\{H\}/g, '\u0389' ],
[ /\\'\{\}\{I\}/g, '\u038A' ],
[ /\\'\{\}O/g, '\u038C' ],
[ /\\mathrm\{'Y\}/g, '\u038E' ],
[ /\\mathrm\{'\\Omega\}/g, '\u038F' ],
[ /\\acute\{\\ddot\{\\iota\}\}/g, '\u0390' ],
[ /\\Alpha /g, '\u0391' ],
[ /\\Beta /g, '\u0392' ],
[ /\\Gamma /g, '\u0393' ],
[ /\\Delta /g, '\u0394' ],
[ /\\Epsilon /g, '\u0395' ],
[ /\\Zeta /g, '\u0396' ],
[ /\\Eta /g, '\u0397' ],
[ /\\Theta /g, '\u0398' ],
[ /\\Iota /g, '\u0399' ],
[ /\\Kappa /g, '\u039A' ],
[ /\\Lambda /g, '\u039B' ],
[ /\\Xi /g, '\u039E' ],
[ /\\Pi /g, '\u03A0' ],
[ /\\Rho /g, '\u03A1' ],
[ /\\Sigma /g, '\u03A3' ],
[ /\\Tau /g, '\u03A4' ],
[ /\\Upsilon /g, '\u03A5' ],
[ /\\Phi /g, '\u03A6' ],
[ /\\Chi /g, '\u03A7' ],
[ /\\Psi /g, '\u03A8' ],
[ /\\Omega /g, '\u03A9' ],
[ /\\mathrm\{\\ddot\{I\}\}/g, '\u03AA' ],
[ /\\mathrm\{\\ddot\{Y\}\}/g, '\u03AB' ],
[ /\\'\{\$\\alpha\$\}/g, '\u03AC' ],
[ /\\acute\{\\epsilon\}/g, '\u03AD' ],
[ /\\acute\{\\eta\}/g, '\u03AE' ],
[ /\\acute\{\\iota\}/g, '\u03AF' ],
[ /\\acute\{\\ddot\{\\upsilon\}\}/g, '\u03B0' ],
[ /\\alpha /g, '\u03B1' ],
[ /\\beta /g, '\u03B2' ],
[ /\\gamma /g, '\u03B3' ],
[ /\\delta /g, '\u03B4' ],
[ /\\epsilon /g, '\u03B5' ],
[ /\\zeta /g, '\u03B6' ],
[ /\\eta /g, '\u03B7' ],
[ /\\texttheta /g, '\u03B8' ],
[ /\\iota /g, '\u03B9' ],
[ /\\kappa /g, '\u03BA' ],
[ /\\lambda /g, '\u03BB' ],
[ /\\mu /g, '\u03BC' ],
[ /\\nu /g, '\u03BD' ],
[ /\\xi /g, '\u03BE' ],
[ /\\pi /g, '\u03C0' ],
[ /\\rho /g, '\u03C1' ],
[ /\\varsigma /g, '\u03C2' ],
[ /\\sigma /g, '\u03C3' ],
[ /\\tau /g, '\u03C4' ],
[ /\\upsilon /g, '\u03C5' ],
[ /\\varphi /g, '\u03C6' ],
[ /\\chi /g, '\u03C7' ],
[ /\\psi /g, '\u03C8' ],
[ /\\omega /g, '\u03C9' ],
[ /\\ddot\{\\iota\}/g, '\u03CA' ],
[ /\\ddot\{\\upsilon\}/g, '\u03CB' ],
[ /\\'\{o\}/g, '\u03CC' ],
[ /\\acute\{\\upsilon\}/g, '\u03CD' ],
[ /\\acute\{\\omega\}/g, '\u03CE' ],
[ /\\Pisymbol\{ppi022\}\{87\}/g, '\u03D0' ],
[ /\\textvartheta /g, '\u03D1' ],
[ /\\Upsilon /g, '\u03D2' ],
[ /\\phi /g, '\u03D5' ],
[ /\\varpi /g, '\u03D6' ],
[ /\\Stigma /g, '\u03DA' ],
[ /\\Digamma /g, '\u03DC' ],
[ /\\digamma /g, '\u03DD' ],
[ /\\Koppa /g, '\u03DE' ],
[ /\\Sampi /g, '\u03E0' ],
[ /\\varkappa /g, '\u03F0' ],
[ /\\varrho /g, '\u03F1' ],
[ /\\textTheta /g, '\u03F4' ],
[ /\\backepsilon /g, '\u03F6' ],
[ /\\cyrchar\\CYRYO /g, '\u0401' ],
[ /\\cyrchar\\CYRDJE /g, '\u0402' ],
[ /\\cyrchar\{\\'\\CYRG\}/g, '\u0403' ],
[ /\\cyrchar\\CYRIE /g, '\u0404' ],
[ /\\cyrchar\\CYRDZE /g, '\u0405' ],
[ /\\cyrchar\\CYRII /g, '\u0406' ],
[ /\\cyrchar\\CYRYI /g, '\u0407' ],
[ /\\cyrchar\\CYRJE /g, '\u0408' ],
[ /\\cyrchar\\CYRLJE /g, '\u0409' ],
[ /\\cyrchar\\CYRNJE /g, '\u040A' ],
[ /\\cyrchar\\CYRTSHE /g, '\u040B' ],
[ /\\cyrchar\{\\'\\CYRK\}/g, '\u040C' ],
[ /\\cyrchar\\CYRUSHRT /g, '\u040E' ],
[ /\\cyrchar\\CYRDZHE /g, '\u040F' ],
[ /\\cyrchar\\CYRA /g, '\u0410' ],
[ /\\cyrchar\\CYRB /g, '\u0411' ],
[ /\\cyrchar\\CYRV /g, '\u0412' ],
[ /\\cyrchar\\CYRG /g, '\u0413' ],
[ /\\cyrchar\\CYRD /g, '\u0414' ],
[ /\\cyrchar\\CYRE /g, '\u0415' ],
[ /\\cyrchar\\CYRZH /g, '\u0416' ],
[ /\\cyrchar\\CYRZ /g, '\u0417' ],
[ /\\cyrchar\\CYRI /g, '\u0418' ],
[ /\\cyrchar\\CYRISHRT /g, '\u0419' ],
[ /\\cyrchar\\CYRK /g, '\u041A' ],
[ /\\cyrchar\\CYRL /g, '\u041B' ],
[ /\\cyrchar\\CYRM /g, '\u041C' ],
[ /\\cyrchar\\CYRN /g, '\u041D' ],
[ /\\cyrchar\\CYRO /g, '\u041E' ],
[ /\\cyrchar\\CYRP /g, '\u041F' ],
[ /\\cyrchar\\CYRR /g, '\u0420' ],
[ /\\cyrchar\\CYRS /g, '\u0421' ],
[ /\\cyrchar\\CYRT /g, '\u0422' ],
[ /\\cyrchar\\CYRU /g, '\u0423' ],
[ /\\cyrchar\\CYRF /g, '\u0424' ],
[ /\\cyrchar\\CYRH /g, '\u0425' ],
[ /\\cyrchar\\CYRC /g, '\u0426' ],
[ /\\cyrchar\\CYRCH /g, '\u0427' ],
[ /\\cyrchar\\CYRSH /g, '\u0428' ],
[ /\\cyrchar\\CYRSHCH /g, '\u0429' ],
[ /\\cyrchar\\CYRHRDSN /g, '\u042A' ],
[ /\\cyrchar\\CYRERY /g, '\u042B' ],
[ /\\cyrchar\\CYRSFTSN /g, '\u042C' ],
[ /\\cyrchar\\CYREREV /g, '\u042D' ],
[ /\\cyrchar\\CYRYU /g, '\u042E' ],
[ /\\cyrchar\\CYRYA /g, '\u042F' ],
[ /\\cyrchar\\cyra /g, '\u0430' ],
[ /\\cyrchar\\cyrb /g, '\u0431' ],
[ /\\cyrchar\\cyrv /g, '\u0432' ],
[ /\\cyrchar\\cyrg /g, '\u0433' ],
[ /\\cyrchar\\cyrd /g, '\u0434' ],
[ /\\cyrchar\\cyre /g, '\u0435' ],
[ /\\cyrchar\\cyrzh /g, '\u0436' ],
[ /\\cyrchar\\cyrz /g, '\u0437' ],
[ /\\cyrchar\\cyri /g, '\u0438' ],
[ /\\cyrchar\\cyrishrt /g, '\u0439' ],
[ /\\cyrchar\\cyrk /g, '\u043A' ],
[ /\\cyrchar\\cyrl /g, '\u043B' ],
[ /\\cyrchar\\cyrm /g, '\u043C' ],
[ /\\cyrchar\\cyrn /g, '\u043D' ],
[ /\\cyrchar\\cyro /g, '\u043E' ],
[ /\\cyrchar\\cyrp /g, '\u043F' ],
[ /\\cyrchar\\cyrr /g, '\u0440' ],
[ /\\cyrchar\\cyrs /g, '\u0441' ],
[ /\\cyrchar\\cyrt /g, '\u0442' ],
[ /\\cyrchar\\cyru /g, '\u0443' ],
[ /\\cyrchar\\cyrf /g, '\u0444' ],
[ /\\cyrchar\\cyrh /g, '\u0445' ],
[ /\\cyrchar\\cyrc /g, '\u0446' ],
[ /\\cyrchar\\cyrch /g, '\u0447' ],
[ /\\cyrchar\\cyrsh /g, '\u0448' ],
[ /\\cyrchar\\cyrshch /g, '\u0449' ],
[ /\\cyrchar\\cyrhrdsn /g, '\u044A' ],
[ /\\cyrchar\\cyrery /g, '\u044B' ],
[ /\\cyrchar\\cyrsftsn /g, '\u044C' ],
[ /\\cyrchar\\cyrerev /g, '\u044D' ],
[ /\\cyrchar\\cyryu /g, '\u044E' ],
[ /\\cyrchar\\cyrya /g, '\u044F' ],
[ /\\cyrchar\\cyryo /g, '\u0451' ],
[ /\\cyrchar\\cyrdje /g, '\u0452' ],
[ /\\cyrchar\{\\'\\cyrg\}/g, '\u0453' ],
[ /\\cyrchar\\cyrie /g, '\u0454' ],
[ /\\cyrchar\\cyrdze /g, '\u0455' ],
[ /\\cyrchar\\cyrii /g, '\u0456' ],
[ /\\cyrchar\\cyryi /g, '\u0457' ],
[ /\\cyrchar\\cyrje /g, '\u0458' ],
[ /\\cyrchar\\cyrlje /g, '\u0459' ],
[ /\\cyrchar\\cyrnje /g, '\u045A' ],
[ /\\cyrchar\\cyrtshe /g, '\u045B' ],
[ /\\cyrchar\{\\'\\cyrk\}/g, '\u045C' ],
[ /\\cyrchar\\cyrushrt /g, '\u045E' ],
[ /\\cyrchar\\cyrdzhe /g, '\u045F' ],
[ /\\cyrchar\\CYROMEGA /g, '\u0460' ],
[ /\\cyrchar\\cyromega /g, '\u0461' ],
[ /\\cyrchar\\CYRYAT /g, '\u0462' ],
[ /\\cyrchar\\CYRIOTE /g, '\u0464' ],
[ /\\cyrchar\\cyriote /g, '\u0465' ],
[ /\\cyrchar\\CYRLYUS /g, '\u0466' ],
[ /\\cyrchar\\cyrlyus /g, '\u0467' ],
[ /\\cyrchar\\CYRIOTLYUS /g, '\u0468' ],
[ /\\cyrchar\\cyriotlyus /g, '\u0469' ],
[ /\\cyrchar\\CYRBYUS /g, '\u046A' ],
[ /\\cyrchar\\CYRIOTBYUS /g, '\u046C' ],
[ /\\cyrchar\\cyriotbyus /g, '\u046D' ],
[ /\\cyrchar\\CYRKSI /g, '\u046E' ],
[ /\\cyrchar\\cyrksi /g, '\u046F' ],
[ /\\cyrchar\\CYRPSI /g, '\u0470' ],
[ /\\cyrchar\\cyrpsi /g, '\u0471' ],
[ /\\cyrchar\\CYRFITA /g, '\u0472' ],
[ /\\cyrchar\\CYRIZH /g, '\u0474' ],
[ /\\cyrchar\\CYRUK /g, '\u0478' ],
[ /\\cyrchar\\cyruk /g, '\u0479' ],
[ /\\cyrchar\\CYROMEGARND /g, '\u047A' ],
[ /\\cyrchar\\cyromegarnd /g, '\u047B' ],
[ /\\cyrchar\\CYROMEGATITLO /g, '\u047C' ],
[ /\\cyrchar\\cyromegatitlo /g, '\u047D' ],
[ /\\cyrchar\\CYROT /g, '\u047E' ],
[ /\\cyrchar\\cyrot /g, '\u047F' ],
[ /\\cyrchar\\CYRKOPPA /g, '\u0480' ],
[ /\\cyrchar\\cyrkoppa /g, '\u0481' ],
[ /\\cyrchar\\cyrthousands /g, '\u0482' ],
[ /\\cyrchar\\cyrhundredthousands /g, '\u0488' ],
[ /\\cyrchar\\cyrmillions /g, '\u0489' ],
[ /\\cyrchar\\CYRSEMISFTSN /g, '\u048C' ],
[ /\\cyrchar\\cyrsemisftsn /g, '\u048D' ],
[ /\\cyrchar\\CYRRTICK /g, '\u048E' ],
[ /\\cyrchar\\cyrrtick /g, '\u048F' ],
[ /\\cyrchar\\CYRGUP /g, '\u0490' ],
[ /\\cyrchar\\cyrgup /g, '\u0491' ],
[ /\\cyrchar\\CYRGHCRS /g, '\u0492' ],
[ /\\cyrchar\\cyrghcrs /g, '\u0493' ],
[ /\\cyrchar\\CYRGHK /g, '\u0494' ],
[ /\\cyrchar\\cyrghk /g, '\u0495' ],
[ /\\cyrchar\\CYRZHDSC /g, '\u0496' ],
[ /\\cyrchar\\cyrzhdsc /g, '\u0497' ],
[ /\\cyrchar\\CYRZDSC /g, '\u0498' ],
[ /\\cyrchar\\cyrzdsc /g, '\u0499' ],
[ /\\cyrchar\\CYRKDSC /g, '\u049A' ],
[ /\\cyrchar\\cyrkdsc /g, '\u049B' ],
[ /\\cyrchar\\CYRKVCRS /g, '\u049C' ],
[ /\\cyrchar\\cyrkvcrs /g, '\u049D' ],
[ /\\cyrchar\\CYRKHCRS /g, '\u049E' ],
[ /\\cyrchar\\cyrkhcrs /g, '\u049F' ],
[ /\\cyrchar\\CYRKBEAK /g, '\u04A0' ],
[ /\\cyrchar\\cyrkbeak /g, '\u04A1' ],
[ /\\cyrchar\\CYRNDSC /g, '\u04A2' ],
[ /\\cyrchar\\cyrndsc /g, '\u04A3' ],
[ /\\cyrchar\\CYRNG /g, '\u04A4' ],
[ /\\cyrchar\\cyrng /g, '\u04A5' ],
[ /\\cyrchar\\CYRPHK /g, '\u04A6' ],
[ /\\cyrchar\\cyrphk /g, '\u04A7' ],
[ /\\cyrchar\\CYRABHHA /g, '\u04A8' ],
[ /\\cyrchar\\cyrabhha /g, '\u04A9' ],
[ /\\cyrchar\\CYRSDSC /g, '\u04AA' ],
[ /\\cyrchar\\cyrsdsc /g, '\u04AB' ],
[ /\\cyrchar\\CYRTDSC /g, '\u04AC' ],
[ /\\cyrchar\\cyrtdsc /g, '\u04AD' ],
[ /\\cyrchar\\CYRY /g, '\u04AE' ],
[ /\\cyrchar\\cyry /g, '\u04AF' ],
[ /\\cyrchar\\CYRYHCRS /g, '\u04B0' ],
[ /\\cyrchar\\cyryhcrs /g, '\u04B1' ],
[ /\\cyrchar\\CYRHDSC /g, '\u04B2' ],
[ /\\cyrchar\\cyrhdsc /g, '\u04B3' ],
[ /\\cyrchar\\CYRTETSE /g, '\u04B4' ],
[ /\\cyrchar\\cyrtetse /g, '\u04B5' ],
[ /\\cyrchar\\CYRCHRDSC /g, '\u04B6' ],
[ /\\cyrchar\\cyrchrdsc /g, '\u04B7' ],
[ /\\cyrchar\\CYRCHVCRS /g, '\u04B8' ],
[ /\\cyrchar\\cyrchvcrs /g, '\u04B9' ],
[ /\\cyrchar\\CYRSHHA /g, '\u04BA' ],
[ /\\cyrchar\\cyrshha /g, '\u04BB' ],
[ /\\cyrchar\\CYRABHCH /g, '\u04BC' ],
[ /\\cyrchar\\cyrabhch /g, '\u04BD' ],
[ /\\cyrchar\\CYRABHCHDSC /g, '\u04BE' ],
[ /\\cyrchar\\cyrabhchdsc /g, '\u04BF' ],
[ /\\cyrchar\\CYRpalochka /g, '\u04C0' ],
[ /\\cyrchar\\CYRKHK /g, '\u04C3' ],
[ /\\cyrchar\\cyrkhk /g, '\u04C4' ],
[ /\\cyrchar\\CYRNHK /g, '\u04C7' ],
[ /\\cyrchar\\cyrnhk /g, '\u04C8' ],
[ /\\cyrchar\\CYRCHLDSC /g, '\u04CB' ],
[ /\\cyrchar\\cyrchldsc /g, '\u04CC' ],
[ /\\cyrchar\\CYRAE /g, '\u04D4' ],
[ /\\cyrchar\\cyrae /g, '\u04D5' ],
[ /\\cyrchar\\CYRSCHWA /g, '\u04D8' ],
[ /\\cyrchar\\cyrschwa /g, '\u04D9' ],
[ /\\cyrchar\\CYRABHDZE /g, '\u04E0' ],
[ /\\cyrchar\\cyrabhdze /g, '\u04E1' ],
[ /\\cyrchar\\CYROTLD /g, '\u04E8' ],
[ /\\cyrchar\\cyrotld /g, '\u04E9' ],
[ /\\hspace\{0.6em\}/g, '\u2002' ],
[ /\\hspace\{1em\}/g, '\u2003' ],
[ /\\hspace\{0.33em\}/g, '\u2004' ],
[ /\\hspace\{0.25em\}/g, '\u2005' ],
[ /\\hspace\{0.166em\}/g, '\u2006' ],
[ /\\hphantom\{0\}/g, '\u2007' ],
[ /\\hphantom\{,\}/g, '\u2008' ],
[ /\\hspace\{0.167em\}/g, '\u2009' ],
[ /\\mkern1mu /g, '\u200A' ],
[ /\\textendash /g, '\u2013' ],
[ /\\textemdash /g, '\u2014' ],
[ /\\rule\{1em\}\{1pt\}/g, '\u2015' ],
[ /\\Vert /g, '\u2016' ],
[ /\\Elzreapos /g, '\u201B' ],
[ /\\textquotedblleft /g, '\u201C' ],
[ /\\textquotedblright /g, '\u201D' ],
[ /\\textdagger /g, '\u2020' ],
[ /\\textdaggerdbl /g, '\u2021' ],
[ /\\textbullet /g, '\u2022' ],
[ /\\ldots /g, '\u2026' ],
[ /\\textperthousand /g, '\u2030' ],
[ /\\textpertenthousand /g, '\u2031' ],
[ /\\backprime /g, '\u2035' ],
[ /\\guilsinglleft /g, '\u2039' ],
[ /\\guilsinglright /g, '\u203A' ],
[ /\\mkern4mu /g, '\u205F' ],
[ /\\nolinebreak /g, '\u2060' ],
[ /\\ensuremath\{\\Elzpes\}/g, '\u20A7' ],
[ /\\mbox\{\\texteuro\} /g, '\u20AC' ],
[ /\\dddot /g, '\u20DB' ],
[ /\\ddddot /g, '\u20DC' ],
[ /\\mathbb\{C\}/g, '\u2102' ],
[ /\\mathscr\{g\}/g, '\u210A' ],
[ /\\mathscr\{H\}/g, '\u210B' ],
[ /\\mathfrak\{H\}/g, '\u210C' ],
[ /\\mathbb\{H\}/g, '\u210D' ],
[ /\\hslash /g, '\u210F' ],
[ /\\mathscr\{I\}/g, '\u2110' ],
[ /\\mathfrak\{I\}/g, '\u2111' ],
[ /\\mathscr\{L\}/g, '\u2112' ],
[ /\\mathscr\{l\}/g, '\u2113' ],
[ /\\mathbb\{N\}/g, '\u2115' ],
[ /\\cyrchar\\textnumero /g, '\u2116' ],
[ /\\wp /g, '\u2118' ],
[ /\\mathbb\{P\}/g, '\u2119' ],
[ /\\mathbb\{Q\}/g, '\u211A' ],
[ /\\mathscr\{R\}/g, '\u211B' ],
[ /\\mathfrak\{R\}/g, '\u211C' ],
[ /\\mathbb\{R\}/g, '\u211D' ],
[ /\\Elzxrat /g, '\u211E' ],
[ /\\texttrademark /g, '\u2122' ],
[ /\\mathbb\{Z\}/g, '\u2124' ],
[ /\\Omega /g, '\u2126' ],
[ /\\mho /g, '\u2127' ],
[ /\\mathfrak\{Z\}/g, '\u2128' ],
[ /\\ElsevierGlyph\{2129\}/g, '\u2129' ],
[ /\\AA /g, '\u212B' ],
[ /\\mathscr\{B\}/g, '\u212C' ],
[ /\\mathfrak\{C\}/g, '\u212D' ],
[ /\\mathscr\{e\}/g, '\u212F' ],
[ /\\mathscr\{E\}/g, '\u2130' ],
[ /\\mathscr\{F\}/g, '\u2131' ],
[ /\\mathscr\{M\}/g, '\u2133' ],
[ /\\mathscr\{o\}/g, '\u2134' ],
[ /\\aleph /g, '\u2135' ],
[ /\\beth /g, '\u2136' ],
[ /\\gimel /g, '\u2137' ],
[ /\\daleth /g, '\u2138' ],
[ /\\textfrac\{1\}\{3\}/g, '\u2153' ],
[ /\\textfrac\{2\}\{3\}/g, '\u2154' ],
[ /\\textfrac\{1\}\{5\}/g, '\u2155' ],
[ /\\textfrac\{2\}\{5\}/g, '\u2156' ],
[ /\\textfrac\{3\}\{5\}/g, '\u2157' ],
[ /\\textfrac\{4\}\{5\}/g, '\u2158' ],
[ /\\textfrac\{1\}\{6\}/g, '\u2159' ],
[ /\\textfrac\{5\}\{6\}/g, '\u215A' ],
[ /\\textfrac\{1\}\{8\}/g, '\u215B' ],
[ /\\textfrac\{3\}\{8\}/g, '\u215C' ],
[ /\\textfrac\{5\}\{8\}/g, '\u215D' ],
[ /\\textfrac\{7\}\{8\}/g, '\u215E' ],
[ /\\leftarrow /g, '\u2190' ],
[ /\\uparrow /g, '\u2191' ],
[ /\\rightarrow /g, '\u2192' ],
[ /\\downarrow /g, '\u2193' ],
[ /\\leftrightarrow /g, '\u2194' ],
[ /\\updownarrow /g, '\u2195' ],
[ /\\nwarrow /g, '\u2196' ],
[ /\\nearrow /g, '\u2197' ],
[ /\\searrow /g, '\u2198' ],
[ /\\swarrow /g, '\u2199' ],
[ /\\nleftarrow /g, '\u219A' ],
[ /\\nrightarrow /g, '\u219B' ],
[ /\\arrowwaveright /g, '\u219C' ],
[ /\\arrowwaveright /g, '\u219D' ],
[ /\\twoheadleftarrow /g, '\u219E' ],
[ /\\twoheadrightarrow /g, '\u21A0' ],
[ /\\leftarrowtail /g, '\u21A2' ],
[ /\\rightarrowtail /g, '\u21A3' ],
[ /\\mapsto /g, '\u21A6' ],
[ /\\hookleftarrow /g, '\u21A9' ],
[ /\\hookrightarrow /g, '\u21AA' ],
[ /\\looparrowleft /g, '\u21AB' ],
[ /\\looparrowright /g, '\u21AC' ],
[ /\\leftrightsquigarrow /g, '\u21AD' ],
[ /\\nleftrightarrow /g, '\u21AE' ],
[ /\\Lsh /g, '\u21B0' ],
[ /\\Rsh /g, '\u21B1' ],
[ /\\ElsevierGlyph\{21B3\}/g, '\u21B3' ],
[ /\\curvearrowleft /g, '\u21B6' ],
[ /\\curvearrowright /g, '\u21B7' ],
[ /\\circlearrowleft /g, '\u21BA' ],
[ /\\circlearrowright /g, '\u21BB' ],
[ /\\leftharpoonup /g, '\u21BC' ],
[ /\\leftharpoondown /g, '\u21BD' ],
[ /\\upharpoonright /g, '\u21BE' ],
[ /\\upharpoonleft /g, '\u21BF' ],
[ /\\rightharpoonup /g, '\u21C0' ],
[ /\\rightharpoondown /g, '\u21C1' ],
[ /\\downharpoonright /g, '\u21C2' ],
[ /\\downharpoonleft /g, '\u21C3' ],
[ /\\rightleftarrows /g, '\u21C4' ],
[ /\\dblarrowupdown /g, '\u21C5' ],
[ /\\leftrightarrows /g, '\u21C6' ],
[ /\\leftleftarrows /g, '\u21C7' ],
[ /\\upuparrows /g, '\u21C8' ],
[ /\\rightrightarrows /g, '\u21C9' ],
[ /\\downdownarrows /g, '\u21CA' ],
[ /\\leftrightharpoons /g, '\u21CB' ],
[ /\\rightleftharpoons /g, '\u21CC' ],
[ /\\nLeftarrow /g, '\u21CD' ],
[ /\\nLeftrightarrow /g, '\u21CE' ],
[ /\\nRightarrow /g, '\u21CF' ],
[ /\\Leftarrow /g, '\u21D0' ],
[ /\\Uparrow /g, '\u21D1' ],
[ /\\Rightarrow /g, '\u21D2' ],
[ /\\Downarrow /g, '\u21D3' ],
[ /\\Leftrightarrow /g, '\u21D4' ],
[ /\\Updownarrow /g, '\u21D5' ],
[ /\\Lleftarrow /g, '\u21DA' ],
[ /\\Rrightarrow /g, '\u21DB' ],
[ /\\rightsquigarrow /g, '\u21DD' ],
[ /\\DownArrowUpArrow /g, '\u21F5' ],
[ /\\forall /g, '\u2200' ],
[ /\\complement /g, '\u2201' ],
[ /\\partial /g, '\u2202' ],
[ /\\exists /g, '\u2203' ],
[ /\\nexists /g, '\u2204' ],
[ /\\varnothing /g, '\u2205' ],
[ /\\nabla /g, '\u2207' ],
[ /\\in /g, '\u2208' ],
[ /\\not\\in /g, '\u2209' ],
[ /\\ni /g, '\u220B' ],
[ /\\not\\ni /g, '\u220C' ],
[ /\\prod /g, '\u220F' ],
[ /\\coprod /g, '\u2210' ],
[ /\\sum /g, '\u2211' ],
[ /\\mp /g, '\u2213' ],
[ /\\dotplus /g, '\u2214' ],
[ /\\setminus /g, '\u2216' ],
[ /\\circ /g, '\u2218' ],
[ /\\bullet /g, '\u2219' ],
[ /\\surd /g, '\u221A' ],
[ /\\propto /g, '\u221D' ],
[ /\\infty /g, '\u221E' ],
[ /\\rightangle /g, '\u221F' ],
[ /\\angle /g, '\u2220' ],
[ /\\measuredangle /g, '\u2221' ],
[ /\\sphericalangle /g, '\u2222' ],
[ /\\mid /g, '\u2223' ],
[ /\\nmid /g, '\u2224' ],
[ /\\parallel /g, '\u2225' ],
[ /\\nparallel /g, '\u2226' ],
[ /\\wedge /g, '\u2227' ],
[ /\\vee /g, '\u2228' ],
[ /\\cap /g, '\u2229' ],
[ /\\cup /g, '\u222A' ],
[ /\\int /g, '\u222B' ],
[ /\\int\\!\\int /g, '\u222C' ],
[ /\\int\\!\\int\\!\\int /g, '\u222D' ],
[ /\\oint /g, '\u222E' ],
[ /\\surfintegral /g, '\u222F' ],
[ /\\volintegral /g, '\u2230' ],
[ /\\clwintegral /g, '\u2231' ],
[ /\\ElsevierGlyph\{2232\}/g, '\u2232' ],
[ /\\ElsevierGlyph\{2233\}/g, '\u2233' ],
[ /\\therefore /g, '\u2234' ],
[ /\\because /g, '\u2235' ],
[ /\\Colon /g, '\u2237' ],
[ /\\ElsevierGlyph\{2238\}/g, '\u2238' ],
[ /\\mathbin\{\{:\}\\!\\!\{\-\}\\!\\!\{:\}\}/g, '\u223A' ],
[ /\\homothetic /g, '\u223B' ],
[ /\\sim /g, '\u223C' ],
[ /\\backsim /g, '\u223D' ],
[ /\\lazysinv /g, '\u223E' ],
[ /\\wr /g, '\u2240' ],
[ /\\not\\sim /g, '\u2241' ],
[ /\\ElsevierGlyph\{2242\}/g, '\u2242' ],
[ /\\NotEqualTilde /g, '\u2242-00338' ],
[ /\\simeq /g, '\u2243' ],
[ /\\not\\simeq /g, '\u2244' ],
[ /\\cong /g, '\u2245' ],
[ /\\approxnotequal /g, '\u2246' ],
[ /\\not\\cong /g, '\u2247' ],
[ /\\approx /g, '\u2248' ],
[ /\\not\\approx /g, '\u2249' ],
[ /\\approxeq /g, '\u224A' ],
[ /\\tildetrpl /g, '\u224B' ],
[ /\\not\\apid /g, '\u224B-00338' ],
[ /\\allequal /g, '\u224C' ],
[ /\\asymp /g, '\u224D' ],
[ /\\Bumpeq /g, '\u224E' ],
[ /\\NotHumpDownHump /g, '\u224E-00338' ],
[ /\\bumpeq /g, '\u224F' ],
[ /\\NotHumpEqual /g, '\u224F-00338' ],
[ /\\doteq /g, '\u2250' ],
[ /\\not\\doteq/g, '\u2250-00338' ],
[ /\\doteqdot /g, '\u2251' ],
[ /\\fallingdotseq /g, '\u2252' ],
[ /\\risingdotseq /g, '\u2253' ],
[ /\\eqcirc /g, '\u2256' ],
[ /\\circeq /g, '\u2257' ],
[ /\\estimates /g, '\u2259' ],
[ /\\ElsevierGlyph\{225A\}/g, '\u225A' ],
[ /\\starequal /g, '\u225B' ],
[ /\\triangleq /g, '\u225C' ],
[ /\\ElsevierGlyph\{225F\}/g, '\u225F' ],
[ /\\not =/g, '\u2260' ],
[ /\\equiv /g, '\u2261' ],
[ /\\not\\equiv /g, '\u2262' ],
[ /\\leq /g, '\u2264' ],
[ /\\geq /g, '\u2265' ],
[ /\\leqq /g, '\u2266' ],
[ /\\geqq /g, '\u2267' ],
[ /\\lneqq /g, '\u2268' ],
[ /\\lvertneqq /g, '\u2268-0FE00' ],
[ /\\gneqq /g, '\u2269' ],
[ /\\gvertneqq /g, '\u2269-0FE00' ],
[ /\\ll /g, '\u226A' ],
[ /\\NotLessLess /g, '\u226A-00338' ],
[ /\\gg /g, '\u226B' ],
[ /\\NotGreaterGreater /g, '\u226B-00338' ],
[ /\\between /g, '\u226C' ],
[ /\\not\\kern\-0.3em\\times /g, '\u226D' ],
[ /\\not</g, '\u226E' ],
[ /\\not>/g, '\u226F' ],
[ /\\not\\leq /g, '\u2270' ],
[ /\\not\\geq /g, '\u2271' ],
[ /\\lessequivlnt /g, '\u2272' ],
[ /\\greaterequivlnt /g, '\u2273' ],
[ /\\ElsevierGlyph\{2274\}/g, '\u2274' ],
[ /\\ElsevierGlyph\{2275\}/g, '\u2275' ],
[ /\\lessgtr /g, '\u2276' ],
[ /\\gtrless /g, '\u2277' ],
[ /\\notlessgreater /g, '\u2278' ],
[ /\\notgreaterless /g, '\u2279' ],
[ /\\prec /g, '\u227A' ],
[ /\\succ /g, '\u227B' ],
[ /\\preccurlyeq /g, '\u227C' ],
[ /\\succcurlyeq /g, '\u227D' ],
[ /\\precapprox /g, '\u227E' ],
[ /\\NotPrecedesTilde /g, '\u227E-00338' ],
[ /\\succapprox /g, '\u227F' ],
[ /\\NotSucceedsTilde /g, '\u227F-00338' ],
[ /\\not\\prec /g, '\u2280' ],
[ /\\not\\succ /g, '\u2281' ],
[ /\\subset /g, '\u2282' ],
[ /\\supset /g, '\u2283' ],
[ /\\not\\subset /g, '\u2284' ],
[ /\\not\\supset /g, '\u2285' ],
[ /\\subseteq /g, '\u2286' ],
[ /\\supseteq /g, '\u2287' ],
[ /\\not\\subseteq /g, '\u2288' ],
[ /\\not\\supseteq /g, '\u2289' ],
[ /\\subsetneq /g, '\u228A' ],
[ /\\varsubsetneqq /g, '\u228A-0FE00' ],
[ /\\supsetneq /g, '\u228B' ],
[ /\\varsupsetneq /g, '\u228B-0FE00' ],
[ /\\uplus /g, '\u228E' ],
[ /\\sqsubset /g, '\u228F' ],
[ /\\NotSquareSubset /g, '\u228F-00338' ],
[ /\\sqsupset /g, '\u2290' ],
[ /\\NotSquareSuperset /g, '\u2290-00338' ],
[ /\\sqsubseteq /g, '\u2291' ],
[ /\\sqsupseteq /g, '\u2292' ],
[ /\\sqcap /g, '\u2293' ],
[ /\\sqcup /g, '\u2294' ],
[ /\\oplus /g, '\u2295' ],
[ /\\ominus /g, '\u2296' ],
[ /\\otimes /g, '\u2297' ],
[ /\\oslash /g, '\u2298' ],
[ /\\odot /g, '\u2299' ],
[ /\\circledcirc /g, '\u229A' ],
[ /\\circledast /g, '\u229B' ],
[ /\\circleddash /g, '\u229D' ],
[ /\\boxplus /g, '\u229E' ],
[ /\\boxminus /g, '\u229F' ],
[ /\\boxtimes /g, '\u22A0' ],
[ /\\boxdot /g, '\u22A1' ],
[ /\\vdash /g, '\u22A2' ],
[ /\\dashv /g, '\u22A3' ],
[ /\\top /g, '\u22A4' ],
[ /\\perp /g, '\u22A5' ],
[ /\\truestate /g, '\u22A7' ],
[ /\\forcesextra /g, '\u22A8' ],
[ /\\Vdash /g, '\u22A9' ],
[ /\\Vvdash /g, '\u22AA' ],
[ /\\VDash /g, '\u22AB' ],
[ /\\nvdash /g, '\u22AC' ],
[ /\\nvDash /g, '\u22AD' ],
[ /\\nVdash /g, '\u22AE' ],
[ /\\nVDash /g, '\u22AF' ],
[ /\\vartri