math_ml-1.0.0/0000755000004100000410000000000014700510662013162 5ustar www-datawww-datamath_ml-1.0.0/lib/0000755000004100000410000000000014700510662013730 5ustar www-datawww-datamath_ml-1.0.0/lib/math_ml.rb0000644000004100000410000000101014700510662015666 0ustar www-datawww-data# MathML Library # # Copyright (C) 2005, KURODA Hiraku # You can redistribute it and/or modify it under GPL2. require 'strscan' module MathML require 'eim_xml' class XMLElement < EimXML::Element def pop @contents.pop end end def self.pcstring(s, encoded = false) s.is_a?(EimXML::PCString) ? s : EimXML::PCString.new(s, encoded) end class Error < StandardError; end end require 'math_ml/element' require 'math_ml/symbol/entity_reference' require 'math_ml/latex' math_ml-1.0.0/lib/math_ml/0000755000004100000410000000000014700510662015351 5ustar www-datawww-datamath_ml-1.0.0/lib/math_ml/string.rb0000755000004100000410000000131614700510662017210 0ustar www-datawww-data#!/usr/bin/ruby # # Extension of String class by MathML Library # # Copyright (C) 2007, KURODA Hiraku # You can redistribute it and/or modify it under GPL2. # require 'math_ml' module MathML module String @@mathml_latex_parser = nil def self.mathml_latex_parser @@mathml_latex_parser ||= MathML::LaTeX::Parser.new @@mathml_latex_parser end def self.mathml_latex_parser=(mlp) raise TypeError unless mlp.is_a?(MathML::LaTeX::Parser) || mlp.nil? @@mathml_latex_parser = mlp end def to_mathml(displaystyle = false) MathML::String.mathml_latex_parser.parse(self, displaystyle) end end end class String include MathML::String end math_ml-1.0.0/lib/math_ml/util.rb0000755000004100000410000002346114700510662016664 0ustar www-datawww-data#!/usr/bin/ruby # # Utility for MathML Library # # Copyright (C) 2006, KURODA Hiraku # You can redistribute it and/or modify it under GPL2. # require 'math_ml' module MathML::Util ESCAPES = { '<' => 'lt', '>' => 'gt', '&' => 'amp', '"' => 'quot', "'" => 'apos' } INVALID_RE = /(?!)/ EQNARRAY_RE = /\\begin\s*\{eqnarray\}(#{MathML::LaTeX::MBEC}*?)\\end\s*\{eqnarray\}/ SINGLE_COMMAND_RE = /(\\([a-zA-Z]+))[ \t]?/ def self.escapeXML(s, br = false) r = s.gsub(/[<>&"']/) { |m| "&#{ESCAPES[m]};" } br ? r.gsub(/\n/, "
\n") : r end def escapeXML(s, br = false) MathML::Util.escapeXML(s, br) end def self.collect_regexp(a) if a a = [a].flatten if a.size > 0 Regexp.new(a.inject('') { |r, i| i.is_a?(Regexp) ? "#{r}#{i}|" : r }.chop) else INVALID_RE end else INVALID_RE end end def collect_regexp(a) MathML::Util.collect_regexp(a) end class MathData attr_reader :math_list, :msrc_list, :dmath_list, :dsrc_list, :escape_list, :esrc_list, :user_list, :usrc_list def initialize @math_list = [] @msrc_list = [] @dmath_list = [] @dsrc_list = [] @escape_list = [] @esrc_list = [] @user_list = [] @usrc_list = [] end def update(s) @math_list.concat(s.math_list) @msrc_list.concat(s.msrc_list) @dmath_list.concat(s.dmath_list) @dsrc_list.concat(s.dsrc_list) @escape_list.concat(s.escape_list) @esrc_list.concat(s.esrc_list) @user_list.concat(s.user_list) @usrc_list.concat(s.usrc_list) end end class SimpleLaTeX include MathML::Util @@default_latex = nil DEFAULT = { delimiter: "\001", math_env_list: [ /\$((?:\\.|[^\\$])#{MathML::LaTeX::MBEC}*?)\$/m, /\\\((#{MathML::LaTeX::MBEC}*?)\\\)/m ], dmath_env_list: [ /\$\$(#{MathML::LaTeX::MBEC}*?)\$\$/m, /\\\[(#{MathML::LaTeX::MBEC}*?)\\\]/m ], escape_list: [ /\\(.)/m ], through_list: [], escape_any: false, without_parse: false } def initialize(options = {}) @params = DEFAULT.merge(options) @params[:parser] = MathML::LaTeX::Parser.new unless @params[:parser] || @params[:without_parse] @params[:math_envs] = collect_regexp(@params[:math_env_list]) @params[:dmath_envs] = collect_regexp(@params[:dmath_env_list]) @params[:escapes] = collect_regexp(@params[:escape_list]) @params[:throughs] = collect_regexp(@params[:through_list]) reset_encode_proc reset_rescue_proc reset_decode_proc reset_unencode_proc end def reset_encode_proc @encode_proc_re = INVALID_RE @encode_proc = nil end def set_encode_proc(*re, &proc) @encode_proc_re = collect_regexp(re) @encode_proc = proc end def reset_rescue_proc @rescue_proc = nil end def set_rescue_proc(&proc) @rescue_proc = proc end def reset_decode_proc @decode_proc = nil end def set_decode_proc(&proc) @decode_proc = proc end def set_unencode_proc(&proc) @unencode_proc = proc end def reset_unencode_proc @unencode_proc = nil end def encode(src, *proc_re, &proc) data = if proc_re.size > 0 && proc_re[0].is_a?(MathData) proc_re.shift else MathData.new end proc_re = proc_re.size == 0 ? @encode_proc_re : collect_regexp(proc_re) proc ||= @encode_proc s = StringScanner.new(src) encoded = '' until s.eos? if s.scan(/ (.*?) (((((#{@params[:throughs]})| #{@params[:dmath_envs]})| #{@params[:math_envs]})| #{proc_re})| #{@params[:escapes]}) /mx) encoded << s[1] if s[6] encoded << s[6] elsif s[5] || s[4] env_src = s[5] || s[4] if @params[:dmath_envs] =~ env_src encoded << "#{@params[:delimiter]}d#{data.dsrc_list.size}#{@params[:delimiter]}" data.dsrc_list << env_src else encoded << "#{@params[:delimiter]}m#{data.msrc_list.size}#{@params[:delimiter]}" data.msrc_list << env_src end elsif s[3] size = s[3].size s.pos = left = s.pos - size if r = proc.call(s) right = s.pos encoded << "#{@params[:delimiter]}u#{data.user_list.size}#{@params[:delimiter]}" data.user_list << r data.usrc_list << s.string[left...right] else encoded << s.peek(size) s.pos = s.pos + size end elsif s[2] encoded << "#{@params[:delimiter]}e#{data.escape_list.size}#{@params[:delimiter]}" @params[:escapes] =~ s[2] data.esrc_list << s[2] data.escape_list << escapeXML($+, true) end else encoded << s.rest s.terminate end end parse(data, @params[:parser]) unless @params[:without_parse] [encoded, data] end def error_to_html(e) "
\n#{escapeXML(e.message)}
\n#{escapeXML(e.done).gsub(/\n/, "
\n")}" \ "#{escapeXML(e.rest).gsub(/\n/, "
\n")}

" end def latex_parser @params[:parser] = MathML::LaTeX::Parser.new unless @params[:parser] @params[:parser] end def parse(data, parser = nil) parser ||= latex_parser (data.math_list.size...data.msrc_list.size).each do |i| @params[:math_envs] =~ data.msrc_list[i] data.math_list[i] = parser.parse($+) rescue MathML::LaTeX::ParseError => e data.math_list[i] = if @rescue_proc @rescue_proc.call(e) else error_to_html(e) end end (data.dmath_list.size...data.dsrc_list.size).each do |i| @params[:dmath_envs] =~ data.dsrc_list[i] data.dmath_list[i] = parser.parse($+, true) rescue MathML::LaTeX::ParseError => e data.dmath_list[i] = if @rescue_proc @rescue_proc.call(e) else error_to_html(e) end end end def decode(encoded, data, without_parsed = false, &proc) return nil if encoded.nil? proc ||= @decode_proc encoded.gsub(/#{Regexp.escape(@params[:delimiter])}([demu])(\d+)#{Regexp.escape(@params[:delimiter])}/) do i = $2.to_i t, d, s = case $1 when 'd' [:dmath, without_parsed ? escapeXML(data.dsrc_list[i], true) : data.dmath_list[i], data.dsrc_list[i]] when 'e' [:escape, data.escape_list[i], data.esrc_list[i]] when 'm' [:math, without_parsed ? escapeXML(data.msrc_list[i], true) : data.math_list[i], data.msrc_list[i]] when 'u' [:user, data.user_list[i], data.usrc_list[i]] end if proc proc.call(d, type: t, index: i, src: s) || d else d end end end def decode_partial(type, encoded, data, &proc) return nil if encoded.nil? head = case type when :math 'm' when :dmath 'd' when :escape 'e' when :user 'u' else return end encoded.gsub(/#{Regexp.escape(@params[:delimiter])}#{head}(\d+)#{Regexp.escape(@params[:delimiter])}/) do i = $1.to_i t, d, s = case head when 'd' [:dmath, data.dmath_list[i], data.dsrc_list[i]] when 'e' [:escape, data.escape_list[i], data.esrc_list[i]] when 'm' [:math, data.math_list[i], data.msrc_list[i]] when 'u' [:user, data.user_list[i], data.usrc_list[i]] end if proc proc.call(d, type: t, index: i, src: s) || "#{@params[:delimiter]}#{head}#{i}#{@params[:delimiter]}" else d end end end def unencode(encoded, data, without_escape = false, &proc) return nil if encoded.nil? proc ||= @unencode_proc encoded.gsub(/#{Regexp.escape(@params[:delimiter])}([demu])(\d+)#{Regexp.escape(@params[:delimiter])}/) do i = $2.to_i t, s = case $1 when 'd' [:dmath, data.dsrc_list[i]] when 'e' [:escape, data.esrc_list[i]] when 'm' [:math, data.msrc_list[i]] when 'u' [:user, data.usrc_list[i]] end s = escapeXML(s, true) unless without_escape if proc proc.call(s, type: t, index: i) || s else s end end end def self.encode(src) @@default_latex ||= new @@default_latex.encode(src) end def self.decode(src, data) @@default_latex.decode(src, data) end def parse_eqnarray(src, parser = nil) src = "\\begin{array}{ccc}#{src}\\end{array}" parser ||= latex_parser begin parser.parse(src, true) rescue MathML::LaTeX::ParseError => e e = MathML::LaTeX::ParseError.new( e.message, e.rest.sub(/\\end\{array\}\z/, '\end{eqnarray}'), e.done.sub(/\A\\begin\{array\}\{ccc\}/, '\begin{eqnarray}') ) @rescue_proc ? @rescue_proc.call(e) : error_to_html(e) end end def parse_single_command(src, parser = nil) s = src[SINGLE_COMMAND_RE, 1] parser ||= latex_parser begin parser.parse(s) rescue MathML::LaTeX::ParseError => e src[SINGLE_COMMAND_RE, 2] end end end end math_ml-1.0.0/lib/math_ml/latex/0000755000004100000410000000000014700510662016466 5ustar www-datawww-datamath_ml-1.0.0/lib/math_ml/latex/builtin.rb0000644000004100000410000000012714700510662020461 0ustar www-datawww-datamodule MathML::LaTeX module Builtin end end require 'math_ml/latex/builtin/symbol' math_ml-1.0.0/lib/math_ml/latex/builtin/0000755000004100000410000000000014700510662020134 5ustar www-datawww-datamath_ml-1.0.0/lib/math_ml/latex/builtin/symbol.rb0000644000004100000410000003735514700510662022003 0ustar www-datawww-datamodule MathML::LaTeX::Builtin module Symbol MAP = { '{' => [%i[s o], ''], '}' => [%i[s o], ''], '#' => [%i[s o], ''], '$' => [%i[s o], ''], '&' => [%i[s o], :amp], '_' => [%i[s o], ''], '%' => [%i[s o], ''], ',' => nil, 'varepsilon' => [%i[s I]], 'mathdollar' => [%i[s o], '$'], 'lbrace' => [[:s]], 'rbrace' => [[:s]], 'P' => [%i[s o], :para], 'mathparagraph' => [%i[s o], :para], 'S' => [%i[s o], :sect], 'mathsection' => [%i[s o], :sect], 'dag' => [%i[s o], :dagger], 'dagger' => [[:s]], 'ddag' => [%i[s o], :ddagger], 'ddagger' => [[:s]], 'copyright' => [%i[s o], :copy], 'pounds' => [%i[s o], :pound], 'mathsterling' => [%i[s o], :pound], 'dots' => [%i[s o], :mldr], 'mathellipsis' => [%i[s o], :mldr], 'ldots' => [%i[s o], :mldr], 'ensuremath' => nil, '|' => [%i[s o], :DoubleVerticalBar], 'mho' => [[:s]], 'Join' => [%i[s o], :bowtie], 'Box' => [%i[s o], :square], 'Diamond' => [[:s]], 'leadsto' => [%i[s o], :zigrarr], 'sqsubset' => [[:s]], 'sqsupset' => [[:s]], 'lhd' => [%i[s o], :vltri], 'unlhd' => [%i[s o], :ltrie], 'rhd' => [%i[s o], :vrtri], 'unrhd' => [%i[s o], :rtrie], 'log' => [%i[s i], ''], 'lg' => [%i[s i], ''], 'ln' => [%i[s i], ''], 'lim' => [%i[u i], ''], 'limsup' => [%i[u i], 'lim sup'], 'liminf' => [%i[u i], 'lim inf'], 'sin' => [%i[s i], ''], 'arcsin' => [%i[s i], ''], 'sinh' => [%i[s i], ''], 'cos' => [%i[s i], ''], 'arccos' => [%i[s i], ''], 'cosh' => [%i[s i], ''], 'tan' => [%i[s i], ''], 'arctan' => [%i[s i], ''], 'tanh' => [%i[s i], ''], 'cot' => [%i[s i], ''], 'coth' => [%i[s i], ''], 'sec' => [%i[s i], ''], 'csc' => [%i[s i], ''], 'max' => [%i[u i], ''], 'min' => [%i[u i], ''], 'sup' => [%i[u i], ''], 'inf' => [%i[u i], ''], 'arg' => [%i[s i], ''], 'ker' => [%i[s i], ''], 'dim' => [%i[s i], ''], 'hom' => [%i[s i], ''], 'det' => [%i[u i], ''], 'exp' => [%i[s i], ''], 'Pr' => [%i[u i], ''], 'gcd' => [%i[u i], ''], 'deg' => [%i[s i], ''], 'prime' => [[:s]], 'alpha' => [%i[s I]], 'beta' => [%i[s I]], 'gamma' => [%i[s I]], 'delta' => [%i[s I]], 'epsilon' => [%i[s I]], 'zeta' => [%i[s I]], 'eta' => [%i[s I]], 'theta' => [%i[s I]], 'iota' => [%i[s I]], 'kappa' => [%i[s I]], 'lambda' => [%i[s I]], 'mu' => [%i[s I]], 'nu' => [%i[s I]], 'xi' => [%i[s I]], 'pi' => [%i[s I]], 'rho' => [%i[s I]], 'sigma' => [%i[s I]], 'tau' => [%i[s I]], 'upsilon' => [%i[s I]], 'phi' => [%i[s I]], 'chi' => [%i[s I]], 'psi' => [%i[s I]], 'omega' => [%i[s I]], 'vartheta' => [%i[s I]], 'varpi' => [%i[s I]], 'varrho' => [%i[s I]], 'varsigma' => [%i[s I]], 'varphi' => [%i[s I]], 'Gamma' => [%i[s i]], 'Delta' => [%i[s i]], 'Theta' => [%i[s i]], 'Lambda' => [%i[s i]], 'Xi' => [%i[s i]], 'Pi' => [%i[s i]], 'Sigma' => [%i[s i]], 'Upsilon' => [%i[s i], :Upsi], 'Phi' => [%i[s i]], 'Psi' => [%i[s i]], 'Omega' => [%i[s i]], 'aleph' => [%i[s i]], 'hbar' => [%i[s i], :hslash], 'imath' => [%i[s i]], 'jmath' => [%i[s i]], 'ell' => [[:s]], 'wp' => [[:s]], 'Re' => [%i[s i]], 'Im' => [%i[s i]], 'partial' => [%i[s o], :part], 'infty' => [%i[s n], :infin], 'emptyset' => [%i[s i], :empty], 'nabla' => [%i[s i]], 'surd' => [%i[s o], :Sqrt], 'top' => [[:s]], 'bot' => [[:s]], 'angle' => [[:s]], 'not' => [[:s]], 'triangle' => [[:s]], 'forall' => [[:s]], 'exists' => [%i[s o], :exist], 'neg' => [%i[s o], :not], 'lnot' => [%i[s o], :not], 'flat' => [[:s]], 'natural' => [[:s]], 'sharp' => [[:s]], 'clubsuit' => [[:s]], 'diamondsuit' => [[:s]], 'heartsuit' => [[:s]], 'spadesuit' => [[:s]], 'coprod' => [[:u]], 'bigvee' => [[:u]], 'bigwedge' => [[:u]], 'biguplus' => [[:u]], 'bigcap' => [[:u]], 'bigcup' => [[:u]], 'intop' => [%i[u o], :int], 'int' => [%i[s o]], 'prod' => [[:u]], 'sum' => [[:u]], 'bigotimes' => [[:u]], 'bigoplus' => [[:u]], 'bigodot' => [[:u]], 'ointop' => [%i[u o], :oint], 'oint' => [[:s]], 'bigsqcup' => [[:u]], 'smallint' => [%i[u o], :int], 'triangleleft' => [[:s]], 'triangleright' => [[:s]], 'bigtriangleup' => [[:s]], 'bigtriangledown' => [[:s]], 'wedge' => [[:s]], 'land' => [%i[s o], :wedge], 'vee' => [[:s]], 'lor' => [%i[s o], :vee], 'cap' => [[:s]], 'cup' => [[:s]], 'sqcap' => [[:s]], 'sqcup' => [[:s]], 'uplus' => [[:s]], 'amalg' => [[:s]], 'diamond' => [[:s]], 'bullet' => [[:s]], 'wr' => [[:s]], 'div' => [[:s]], 'odot' => [[:s]], 'oslash' => [[:s]], 'otimes' => [[:s]], 'ominus' => [[:s]], 'oplus' => [[:s]], 'mp' => [[:s]], 'pm' => [[:s]], 'circ' => [%i[s o], :cir], 'bigcirc' => [[:s]], 'setminus' => [[:s]], 'cdot' => [%i[s o], :sdot], 'ast' => [[:s]], 'times' => [[:s]], 'star' => [[:s]], 'propto' => [[:s]], 'sqsubseteq' => [[:s]], 'sqsupseteq' => [[:s]], 'parallel' => [[:s]], 'mid' => [[:s]], 'dashv' => [[:s]], 'vdash' => [[:s]], 'nearrow' => [[:s]], 'searrow' => [[:s]], 'nwarrow' => [[:s]], 'swarrow' => [[:s]], 'Leftrightarrow' => [[:s]], 'Leftarrow' => [[:s]], 'Rightarrow' => [[:s]], 'neq' => [%i[s o], :ne], 'ne' => [[:s]], 'leq' => [[:s]], 'le' => [[:s]], 'geq' => [[:s]], 'ge' => [[:s]], 'succ' => [[:s]], 'prec' => [[:s]], 'approx' => [[:s]], 'succeq' => [%i[s o], :sccue], 'preceq' => [%i[s o], :prcue], 'supset' => [[:s]], 'subset' => [[:s]], 'supseteq' => [[:s]], 'subseteq' => [[:s]], 'in' => [[:s]], 'ni' => [[:s]], 'owns' => [%i[s o], :ni], 'gg' => [[:s]], 'll' => [[:s]], 'leftrightarrow' => [[:s]], 'leftarrow' => [[:s]], 'gets' => [%i[s o], :leftarrow], 'rightarrow' => [[:s]], 'to' => [%i[s o], :rightarrow], 'mapstochar' => [%i[s o], :vdash], 'mapsto' => [[:s]], 'sim' => [[:s]], 'simeq' => [[:s]], 'perp' => [[:s]], 'equiv' => [[:s]], 'asymp' => [[:s]], 'smile' => [[:s]], 'frown' => [[:s]], 'leftharpoonup' => [[:s]], 'leftharpoondown' => [[:s]], 'rightharpoonup' => [[:s]], 'rightharpoondown' => [[:s]], 'cong' => [[:s]], 'notin' => [[:s]], 'rightleftharpoons' => [[:s]], 'doteq' => [[:s]], 'joinrel' => nil, 'relbar' => [%i[s o], '-'], 'Relbar' => [%i[s o], '='], 'lhook' => [%i[s o], :sub], 'hookrightarrow' => [[:s]], 'rhook' => [%i[s o], :sup], 'hookleftarrow' => [[:s]], 'bowtie' => [[:s]], 'models' => [[:s]], 'Longrightarrow' => [[:s]], 'longrightarrow' => [[:s]], 'longleftarrow' => [[:s]], 'Longleftarrow' => [[:s]], 'longmapsto' => [%i[s o], :mapsto], 'longleftrightarrow' => [[:s]], 'Longleftrightarrow' => [[:s]], 'iff' => [[:s]], 'ldotp' => [%i[s o], '.'], 'cdotp' => [%i[s o], :cdot], 'colon' => [[:s]], 'cdots' => [%i[s o], :ctdot], 'vdots' => [%i[s o], :vellip], 'ddots' => [%i[s o], :dtdot], 'braceld' => [%i[s o], 0x25dc], 'bracerd' => [%i[s o], 0x25dd], 'bracelu' => [%i[s o], 0x25df], 'braceru' => [%i[s o], 0x25de], 'lmoustache' => [[:s]], 'rmoustache' => [[:s]], 'arrowvert' => [%i[s o], :vert], 'Arrowvert' => [%i[s o], :DoubleVerticalBar], 'Vert' => [%i[s o], :DoubleVerticalBar], 'vert' => [[:s]], 'uparrow' => [[:s]], 'downarrow' => [[:s]], 'updownarrow' => [[:s]], 'Uparrow' => [[:s]], 'Downarrow' => [[:s]], 'Updownarrow' => [[:s]], 'backslash' => [%i[s o], '\\'], 'rangle' => [[:s]], 'langle' => [[:s]], 'rceil' => [[:s]], 'lceil' => [[:s]], 'rfloor' => [[:s]], 'lfloor' => [[:s]], 'lgroup' => [%i[s o], 0x2570], 'rgroup' => [%i[s o], 0x256f], 'bracevert' => [%i[s o], :vert], 'mathunderscore' => [%i[s o], '_'], 'square' => [[:s]], 'rightsquigarrow' => [[:s]], 'lozenge' => [[:s]], 'vartriangleright' => [[:s]], 'vartriangleleft' => [[:s]], 'trianglerighteq' => [[:s]], 'trianglelefteq' => [[:s]], 'boxdot' => [%i[s o], :dotsquare], 'boxplus' => [[:s]], 'boxtimes' => [[:s]], 'blacksquare' => [[:s]], 'centerdot' => [[:s]], 'blacklozenge' => [[:s]], 'circlearrowright' => [[:s]], 'circlearrowleft' => [[:s]], 'leftrightharpoons' => [[:s]], 'boxminus' => [[:s]], 'Vdash' => [[:s]], 'Vvdash' => [[:s]], 'vDash' => [[:s]], 'twoheadrightarrow' => [[:s]], 'twoheadleftarrow' => [[:s]], 'leftleftarrows' => [[:s]], 'rightrightarrows' => [[:s]], 'upuparrows' => [[:s]], 'downdownarrows' => [[:s]], 'upharpoonright' => [[:s]], 'restriction' => [%i[s o], :upharpoonright], 'downharpoonright' => [[:s]], 'upharpoonleft' => [[:s]], 'downharpoonleft' => [[:s]], 'rightarrowtail' => [[:s]], 'leftarrowtail' => [[:s]], 'leftrightarrows' => [[:s]], 'rightleftarrows' => [[:s]], 'Lsh' => [[:s]], 'Rsh' => [[:s]], 'leftrightsquigarrow' => [[:s]], 'looparrowleft' => [[:s]], 'looparrowright' => [[:s]], 'circeq' => [[:s]], 'succsim' => [[:s]], 'gtrsim' => [[:s]], 'gtrapprox' => [[:s]], 'multimap' => [[:s]], 'therefore' => [[:s]], 'because' => [[:s]], 'doteqdot' => [[:s]], 'Doteq' => [%i[s o], :doteqdot], 'triangleq' => [[:s]], 'precsim' => [[:s]], 'lesssim' => [[:s]], 'lessapprox' => [[:s]], 'eqslantless' => [[:s]], 'eqslantgtr' => [[:s]], 'curlyeqprec' => [[:s]], 'curlyeqsucc' => [[:s]], 'preccurlyeq' => [[:s]], 'leqq' => [[:s]], 'leqslant' => [%i[s o], :leq], 'lessgtr' => [[:s]], 'backprime' => [[:s]], 'risingdotseq' => [[:s]], 'fallingdotseq' => [[:s]], 'succcurlyeq' => [[:s]], 'geqq' => [[:s]], 'geqslant' => [%i[s o], :geq], 'gtrless' => [[:s]], 'bigstar' => [[:s]], 'between' => [[:s]], 'blacktriangledown' => [[:s]], 'blacktriangleright' => [[:s]], 'blacktriangleleft' => [[:s]], 'vartriangle' => [%i[s o], :triangle], 'blacktriangle' => [[:s]], 'triangledown' => [[:s]], 'eqcirc' => [[:s]], 'lesseqgtr' => [[:s]], 'gtreqless' => [[:s]], 'lesseqqgtr' => [[:s]], 'gtreqqless' => [[:s]], 'Rrightarrow' => [[:s]], 'Lleftarrow' => [[:s]], 'veebar' => [[:s]], 'barwedge' => [[:s]], 'doublebarwedge' => [[:s]], 'measuredangle' => [[:s]], 'sphericalangle' => [%i[s o], :angsph], 'varpropto' => [[:s]], 'smallsmile' => [%i[s o], :smile], 'smallfrown' => [%i[s o], :frown], 'Subset' => [[:s]], 'Supset' => [[:s]], 'Cup' => [[:s]], 'doublecup' => [%i[s o], :Cup], 'Cap' => [[:s]], 'doublecap' => [%i[s o], :Cap], 'curlywedge' => [[:s]], 'curlyvee' => [[:s]], 'leftthreetimes' => [[:s]], 'rightthreetimes' => [[:s]], 'subseteqq' => [[:s]], 'supseteqq' => [[:s]], 'bumpeq' => [[:s]], 'Bumpeq' => [[:s]], 'lll' => [%i[s o], :Ll], 'llless' => [%i[s o], :Ll], 'ggg' => [[:s]], 'gggtr' => [%i[s o], :ggg], 'circledS' => [[:s]], 'pitchfork' => [[:s]], 'dotplus' => [[:s]], 'backsim' => [[:s]], 'backsimeq' => [[:s]], 'complement' => [[:s]], 'intercal' => [[:s]], 'circledcirc' => [[:s]], 'circledast' => [[:s]], 'circleddash' => [[:s]], 'lvertneqq' => [%i[s o], :lneqq], 'gvertneqq' => [%i[s o], :gneqq], 'nleq' => [%i[s o], 0x2270], 'ngeq' => [%i[s o], 0x2271], 'nless' => [[:s]], 'ngtr' => [[:s]], 'nprec' => [[:s]], 'nsucc' => [[:s]], 'lneqq' => [[:s]], 'gneqq' => [[:s]], 'nleqslant' => [[:s]], 'ngeqslant' => [[:s]], 'lneq' => [[:s]], 'gneq' => [[:s]], 'npreceq' => [%i[s o], :nprcue], 'nsucceq' => [%i[s o], :nsccue], 'precnsim' => [[:s]], 'succnsim' => [[:s]], 'lnsim' => [[:s]], 'gnsim' => [[:s]], 'nleqq' => [[:s]], 'ngeqq' => [[:s]], 'precneqq' => [%i[s o], 0x2ab5], 'succneqq' => [%i[s o], 0x2ab6], 'precnapprox' => [[:s]], 'succnapprox' => [[:s]], 'lnapprox' => [%i[s o], 0x2a89], 'gnapprox' => [%i[s o], 0x2a8a], 'nsim' => [[:s]], 'ncong' => [[:s]], 'diagup' => [%i[s o], 0x2571], 'diagdown' => [%i[s o], 0x2572], 'varsubsetneq' => [%i[s o], :subsetneq], 'varsupsetneq' => [%i[s o], :supsetneq], 'nsubseteqq' => [[:s]], 'nsupseteqq' => [[:s]], 'subsetneqq' => [[:s]], 'supsetneqq' => [[:s]], 'varsubsetneqq' => [%i[s o], :subsetneqq], 'varsupsetneqq' => [%i[s o], :supsetneqq], 'subsetneq' => [[:s]], 'supsetneq' => [[:s]], 'nsubseteq' => [[:s]], 'nsupseteq' => [[:s]], 'nparallel' => [[:s]], 'nmid' => [[:s]], 'nshortmid' => [%i[s o], :nmid], 'nshortparallel' => [%i[s o], :nparallel], 'nvdash' => [[:s]], 'nVdash' => [[:s]], 'nvDash' => [[:s]], 'nVDash' => [[:s]], 'ntrianglerighteq' => [[:s]], 'ntrianglelefteq' => [[:s]], 'ntriangleleft' => [[:s]], 'ntriangleright' => [[:s]], 'nleftarrow' => [[:s]], 'nrightarrow' => [[:s]], 'nLeftarrow' => [[:s]], 'nRightarrow' => [[:s]], 'nLeftrightarrow' => [[:s]], 'nleftrightarrow' => [[:s]], 'divideontimes' => [[:s]], 'varnothing' => [[:s]], 'nexists' => [[:s]], 'Finv' => [%i[s o], 0x2132], 'Game' => [%i[s o], 'G'], 'eth' => [[:s]], 'eqsim' => [[:s]], 'beth' => [[:s]], 'gimel' => [[:s]], 'daleth' => [[:s]], 'lessdot' => [[:s]], 'gtrdot' => [[:s]], 'ltimes' => [[:s]], 'rtimes' => [[:s]], 'shortmid' => [%i[s o], :mid], 'shortparallel' => [[:s]], 'smallsetminus' => [%i[s o], :setminus], 'thicksim' => [%i[s o], :sim], 'thickapprox' => [%i[s o], :approx], 'approxeq' => [[:s]], 'succapprox' => [[:s]], 'precapprox' => [[:s]], 'curvearrowleft' => [[:s]], 'curvearrowright' => [[:s]], 'digamma' => [[:s]], 'varkappa' => [[:s]], 'Bbbk' => [%i[s i], :kopf], 'hslash' => [[:s]], 'backepsilon' => [[:s]], 'ulcorner' => [%i[s o], :boxdr], 'urcorner' => [%i[s o], :boxdl], 'llcorner' => [%i[s o], :boxur], 'lrcorner' => [%i[s o], :boxul] } DELIMITERS = [ 'lmoustache', 'rmoustache', 'arrowvert', 'Arrowvert', 'Vert', 'vert', 'uparrow', 'downarrow', 'updownarrow', 'Uparrow', 'Downarrow', 'Updownarrow', 'backslash', 'rangle', 'langle', 'rbrace', 'lbrace', 'rceil', 'lceil', 'rfloor', 'lfloor', 'lgroup', 'rgroup', 'bracevert', 'ulcorner', 'urcorner', 'llcorner', 'lrcorner', '{', '|', '}' ] end end math_ml-1.0.0/lib/math_ml/symbol/0000755000004100000410000000000014700510662016656 5ustar www-datawww-datamath_ml-1.0.0/lib/math_ml/symbol/entity_reference.rb0000644000004100000410000011041614700510662022540 0ustar www-datawww-datamodule MathML module Symbol MAP = {} unless const_defined?(:MAP) module EntityReference Symbol::Default = self unless Symbol.const_defined?(:Default) Symbol::MAP[:entity] = self def self.convert(name) MathML.pcstring("&#{name};", true) end NAMES = %i[ AElig Aacute Abreve Acirc Acy Afr Agrave Amacr And Aogon Aopf ApplyFunction Aring Ascr Assign Atilde Auml Backslash Barv Barwed Bcy Because Bernoullis Bfr Bopf Breve Bscr Bumpeq CHcy Cacute Cap CapitalDifferentialD Cayleys Ccaron Ccedil Ccirc Cconint Cdot Cedilla CenterDot Cfr CircleDot CircleMinus CirclePlus CircleTimes ClockwiseContourIntegral CloseCurlyDoubleQuote CloseCurlyQuote Colon Colone Congruent Conint ContourIntegral Copf Coproduct CounterClockwiseContourIntegral Cross Cscr Cup CupCap DD DDotrahd DJcy DScy DZcy Dagger Darr Dashv Dcaron Dcy Del Delta Dfr DiacriticalAcute DiacriticalDot DiacriticalDoubleAcute DiacriticalGrave DiacriticalTilde Diamond DifferentialD Dopf Dot DotDot DotEqual DoubleContourIntegral DoubleDot DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DownArrow DownArrowBar DownArrowUpArrow DownBreve DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar DownTee DownTeeArrow Downarrow Dscr Dstrok ENG ETH Eacute Ecaron Ecirc Ecy Edot Efr Egrave Element Emacr EmptySmallSquare EmptyVerySmallSquare Eogon Eopf Equal EqualTilde Equilibrium Escr Esim Euml Exists ExponentialE Fcy Ffr FilledSmallSquare FilledVerySmallSquare Fopf ForAll Fouriertrf Fscr GJcy Gamma Gammad Gbreve Gcedil Gcirc Gcy Gdot Gfr Gg Gopf GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Gscr Gt HARDcy Hacek Hat Hcirc Hfr HilbertSpace Hopf HorizontalLine Hscr Hstrok HumpDownHump HumpEqual IEcy IJlig IOcy Iacute Icirc Icy Idot Ifr Igrave Im Imacr ImaginaryI Implies Int Integral Intersection InvisibleComma InvisibleTimes Iogon Iopf Iscr Itilde Iukcy Iuml Jcirc Jcy Jfr Jopf Jscr Jsercy Jukcy KHcy KJcy Kcedil Kcy Kfr Kopf Kscr LJcy Lacute Lambda Lang Laplacetrf Larr Lcaron Lcedil Lcy LeftAngleBracket LeftArrow LeftArrowBar LeftArrowRightArrow LeftCeiling LeftDoubleBracket LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftFloor LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar Leftarrow Leftrightarrow LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde Lfr Ll Lleftarrow Lmidot LongLeftArrow LongLeftRightArrow LongRightArrow Longleftarrow Longleftrightarrow Longrightarrow Lopf LowerLeftArrow LowerRightArrow Lscr Lsh Lstrok Lt Map Mcy MediumSpace Mellintrf Mfr MinusPlus Mopf Mscr NJcy Nacute Ncaron Ncedil Ncy NegativeMediumSpace NegativeThickSpace NegativeThinSpace NegativeVeryThinSpace NestedGreaterGreater NestedLessLess NewLine Nfr NoBreak NonBreakingSpace Nopf Not NotCongruent NotCupCap NotDoubleVerticalBar NotElement NotEqual NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar Nscr Ntilde OElig Oacute Ocirc Ocy Odblac Ofr Ograve Omacr Omega Oopf OpenCurlyDoubleQuote OpenCurlyQuote Or Oscr Oslash Otilde Otimes Ouml OverBar OverBrace OverBracket OverParenthesis PartialD Pcy Pfr Phi Pi PlusMinus Poincareplane Popf Pr Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Prime Product Proportion Proportional Pscr Psi Qfr Qopf Qscr RBarr Racute Rang Rarr Rarrtl Rcaron Rcedil Rcy Re ReverseElement ReverseEquilibrium ReverseUpEquilibrium Rfr RightAngleBracket RightArrow RightArrowBar RightArrowLeftArrow RightCeiling RightDoubleBracket RightDownTeeVector RightDownVector RightDownVectorBar RightFloor RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar Rightarrow Ropf RoundImplies Rrightarrow Rscr Rsh RuleDelayed SHCHcy SHcy SOFTcy Sacute Sc Scaron Scedil Scirc Scy Sfr ShortDownArrow ShortLeftArrow ShortRightArrow ShortUpArrow Sigma SmallCircle Sopf Sqrt Square SquareIntersection SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion Sscr Star Sub Subset SubsetEqual Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum Sup Superset SupersetEqual Supset THORN TSHcy TScy Tab Tcaron Tcedil Tcy Tfr Therefore Theta ThickSpace ThinSpace Tilde TildeEqual TildeFullEqual TildeTilde Topf TripleDot Tscr Tstrok Uacute Uarr Uarrocir Ubrcy Ubreve Ucirc Ucy Udblac Ufr Ugrave Umacr UnderBar UnderBrace UnderBracket UnderParenthesis Union UnionPlus Uogon Uopf UpArrow UpArrowBar UpArrowDownArrow UpDownArrow UpEquilibrium UpTee UpTeeArrow Uparrow Updownarrow UpperLeftArrow UpperRightArrow Upsi Upsilon Uring Uscr Utilde Uuml VDash Vbar Vcy Vdash Vdashl Vee Verbar Vert VerticalBar VerticalLine VerticalSeparator VerticalTilde VeryThinSpace Vfr Vopf Vscr Vvdash Wcirc Wedge Wfr Wopf Wscr Xfr Xi Xopf Xscr YAcy YIcy YUcy Yacute Ycirc Ycy Yfr Yopf Yscr Yuml ZHcy Zacute Zcaron Zcy Zdot ZeroWidthSpace Zfr Zopf Zscr aacute abreve ac acE acd acirc acute acy aelig af afr agrave aleph alpha amacr amalg amp and andand andd andslope andv ang ange angle angmsd angmsdaa angmsdab angmsdac angmsdad angmsdae angmsdaf angmsdag angmsdah angrt angrtvb angrtvbd angsph angst angzarr aogon aopf ap apE apacir ape apid apos approx approxeq aring ascr ast asymp asympeq atilde auml awconint awint bNot backcong backepsilon backprime backsim backsimeq barvee barwed barwedge bbrk bbrktbrk bcong bcy becaus because bemptyv bepsi bernou beta beth between bfr bigcap bigcirc bigcup bigodot bigoplus bigotimes bigsqcup bigstar bigtriangledown bigtriangleup biguplus bigvee bigwedge bkarow blacklozenge blacksquare blacktriangle blacktriangledown blacktriangleleft blacktriangleright blank blk12 blk14 blk34 block bne bnequiv bnot bopf bot bottom bowtie boxDL boxDR boxDl boxDr boxH boxHD boxHU boxHd boxHu boxUL boxUR boxUl boxUr boxV boxVH boxVL boxVR boxVh boxVl boxVr boxbox boxdL boxdR boxdl boxdr boxh boxhD boxhU boxhd boxhu boxminus boxplus boxtimes boxuL boxuR boxul boxur boxv boxvH boxvL boxvR boxvh boxvl boxvr bprime breve brvbar bscr bsemi bsim bsime bsol bsolb bsolhsub bull bullet bump bumpE bumpe bumpeq cacute cap capand capbrcup capcap capcup capdot caps caret caron ccaps ccaron ccedil ccirc ccups ccupssm cdot cedil cemptyv cent centerdot cfr chcy check checkmark chi cir cirE circ circeq circlearrowleft circlearrowright circledR circledS circledast circledcirc circleddash cire cirfnint cirmid cirscir clubs clubsuit colon colone coloneq comma commat comp compfn complement complexes cong congdot conint copf coprod copy copysr cross cscr csub csube csup csupe ctdot cudarrl cudarrr cuepr cuesc cularr cularrp cup cupbrcap cupcap cupcup cupdot cupor cups curarr curarrm curlyeqprec curlyeqsucc curlyvee curlywedge curren curvearrowleft curvearrowright cuvee cuwed cwconint cwint cylcty dArr dHar dagger daleth darr dash dashv dbkarow dblac dcaron dcy dd ddagger ddarr ddotseq deg delta demptyv dfisht dfr dharl dharr diam diamond diamondsuit diams die digamma disin div divide divideontimes divonx djcy dlcorn dlcrop dollar dopf dot doteq doteqdot dotminus dotplus dotsquare doublebarwedge downarrow downdownarrows downharpoonleft downharpoonright drbkarow drcorn drcrop dscr dscy dsol dstrok dtdot dtri dtrif duarr duhar dwangle dzcy dzigrarr eDDot eDot eacute easter ecaron ecir ecirc ecolon ecy edot ee efDot efr eg egrave egs egsdot el elinters ell els elsdot emacr empty emptyset emptyv emsp emsp13 emsp14 eng ensp eogon eopf epar eparsl eplus epsi epsiv eqcirc eqcolon eqsim eqslantgtr eqslantless equals equest equiv equivDD eqvparsl erDot erarr escr esdot esim eta eth euml excl exist expectation exponentiale fallingdotseq fcy female ffilig fflig ffllig ffr filig flat fllig fltns fnof fopf forall fork forkv fpartint frac12 frac13 frac14 frac15 frac16 frac18 frac23 frac25 frac34 frac35 frac38 frac45 frac56 frac58 frac78 frown fscr gE gEl gacute gamma gammad gap gbreve gcirc gcy gdot ge gel geq geqq geqslant ges gescc gesdot gesdoto gesdotol gesl gesles gfr gg ggg gimel gjcy gl glE gla glj gnE gnap gnapprox gne gneq gneqq gnsim gopf grave gscr gsim gsime gsiml gt gtcc gtcir gtdot gtlPar gtquest gtrapprox gtrarr gtrdot gtreqless gtreqqless gtrless gtrsim gvertneqq gvnE hArr hairsp half hamilt hardcy harr harrcir harrw hbar hcirc hearts heartsuit hellip hercon hfr hksearow hkswarow hoarr homtht hookleftarrow hookrightarrow hopf horbar hscr hslash hstrok hybull hyphen iacute ic icirc icy iecy iexcl iff ifr igrave ii iiiint iiint iinfin iiota ijlig imacr image imagline imagpart imath imof imped in incare infin infintie inodot int intcal integers intercal intlarhk intprod iocy iogon iopf iota iprod iquest iscr isin isinE isindot isins isinsv isinv it itilde iukcy iuml jcirc jcy jfr jmath jopf jscr jsercy jukcy kappa kappav kcedil kcy kfr kgreen khcy kjcy kopf kscr lAarr lArr lAtail lBarr lE lEg lHar lacute laemptyv lagran lambda lang langd langle lap laquo larr larrb larrbfs larrfs larrhk larrlp larrpl larrsim larrtl lat latail late lates lbarr lbbrk lbrace lbrack lbrke lbrksld lbrkslu lcaron lcedil lceil lcub lcy ldca ldquo ldquor ldrdhar ldrushar ldsh le leftarrow leftarrowtail leftharpoondown leftharpoonup leftleftarrows leftrightarrow leftrightarrows leftrightharpoons leftrightsquigarrow leftthreetimes leg leq leqq leqslant les lescc lesdot lesdoto lesdotor lesg lesges lessapprox lessdot lesseqgtr lesseqqgtr lessgtr lesssim lfisht lfloor lfr lg lgE lhard lharu lharul lhblk ljcy ll llarr llcorner llhard lltri lmidot lmoust lmoustache lnE lnap lnapprox lne lneq lneqq lnsim loang loarr lobrk longleftarrow longleftrightarrow longmapsto longrightarrow looparrowleft looparrowright lopar lopf loplus lotimes lowast lowbar loz lozenge lozf lpar lparlt lrarr lrcorner lrhar lrhard lrtri lscr lsh lsim lsime lsimg lsqb lsquo lsquor lstrok lt ltcc ltcir ltdot lthree ltimes ltlarr ltquest ltrPar ltri ltrie ltrif lurdshar luruhar lvertneqq lvnE mDDot macr male malt maltese map mapsto mapstodown mapstoleft mapstoup marker mcomma mcy mdash measuredangle mfr mho micro mid midast midcir middot minus minusb minusd minusdu mlcp mldr mnplus models mopf mp mscr mstpos mu multimap mumap nGg nGt nGtv nLeftarrow nLeftrightarrow nLl nLt nLtv nRightarrow nVDash nVdash nabla nacute nang nap napE napid napos napprox natur natural naturals nbsp nbump nbumpe ncap ncaron ncedil ncong ncongdot ncup ncy ndash ne neArr nearhk nearr nearrow nedot nequiv nesear nesim nexist nexists nfr ngE nge ngeq ngeqq ngeqslant nges ngsim ngt ngtr nhArr nharr nhpar ni nis nisd niv njcy nlArr nlE nlarr nldr nle nleftarrow nleftrightarrow nleq nleqq nleqslant nles nless nlsim nlt nltri nltrie nmid nopf not notin notinE notindot notinva notinvb notinvc notni notniva notnivb notnivc npar nparallel nparsl npart npolint npr nprcue npre nprec npreceq nrArr nrarr nrarrc nrarrw nrightarrow nrtri nrtrie nsc nsccue nsce nscr nshortmid nshortparallel nsim nsime nsimeq nsmid nspar nsqsube nsqsupe nsub nsubE nsube nsubset nsubseteq nsubseteqq nsucc nsucceq nsup nsupE nsupe nsupset nsupseteq nsupseteqq ntgl ntilde ntlg ntriangleleft ntrianglelefteq ntriangleright ntrianglerighteq nu num numero numsp nvDash nvHarr nvap nvdash nvge nvgt nvinfin nvlArr nvle nvlt nvltrie nvrArr nvrtrie nvsim nwArr nwarhk nwarr nwarrow nwnear oS oacute oast ocir ocirc ocy odash odblac odiv odot odsold oelig ofcir ofr ogon ograve ogt ohbar ohm oint olarr olcir olcross olt omacr omega omid ominus oopf opar operp oplus or orarr ord order orderof ordf ordm origof oror orslope orv oscr oslash osol otilde otimes otimesas ouml ovbar par para parallel parsim parsl part pcy percnt period permil perp pertenk pfr phi phiv phmmat phone pi pitchfork piv planck planckh plankv plus plusacir plusb pluscir plusdo plusdu pluse plusmn plussim plustwo pm pointint popf pound pr prE prap prcue pre prec precapprox preccurlyeq preceq precnapprox precneqq precnsim precsim prime primes prnE prnap prnsim prod profalar profline profsurf prop propto prsim prurel pscr psi puncsp qfr qint qopf qprime qscr quaternions quatint quest questeq quot rAarr rArr rAtail rBarr rHar race racute radic raemptyv rang rangd range rangle raquo rarr rarrap rarrb rarrbfs rarrc rarrfs rarrhk rarrlp rarrpl rarrsim rarrtl rarrw ratail ratio rationals rbarr rbbrk rbrace rbrack rbrke rbrksld rbrkslu rcaron rcedil rceil rcub rcy rdca rdldhar rdquo rdquor rdsh real realine realpart reals rect reg rfisht rfloor rfr rhard rharu rharul rho rhov rightarrow rightarrowtail rightharpoondown rightharpoonup rightleftarrows rightleftharpoons rightrightarrows rightsquigarrow rightthreetimes ring risingdotseq rlarr rlhar rmoust rmoustache rnmid roang roarr robrk ropar ropf roplus rotimes rpar rpargt rppolint rrarr rscr rsh rsqb rsquo rsquor rthree rtimes rtri rtrie rtrif rtriltri ruluhar rx sacute sc scE scap scaron sccue sce scedil scirc scnE scnap scnsim scpolint scsim scy sdot sdotb sdote seArr searhk searr searrow sect semi seswar setminus setmn sext sfr sfrown sharp shchcy shcy shortmid shortparallel shy sigma sigmav sim simdot sime simeq simg simgE siml simlE simne simplus simrarr slarr smallsetminus smashp smeparsl smid smile smt smte smtes softcy sol solb solbar sopf spades spadesuit spar sqcap sqcaps sqcup sqcups sqsub sqsube sqsubset sqsubseteq sqsup sqsupe sqsupset sqsupseteq squ square squarf squf srarr sscr ssetmn ssmile sstarf star starf straightepsilon straightphi strns sub subE subdot sube subedot submult subnE subne subplus subrarr subset subseteq subseteqq subsetneq subsetneqq subsim subsub subsup succ succapprox succcurlyeq succeq succnapprox succneqq succnsim succsim sum sung sup sup1 sup2 sup3 supE supdot supdsub supe supedot suphsol suphsub suplarr supmult supnE supne supplus supset supseteq supseteqq supsetneq supsetneqq supsim supsub supsup swArr swarhk swarr swarrow swnwar szlig target tau tbrk tcaron tcedil tcy tdot telrec tfr there4 therefore theta thetav thickapprox thicksim thinsp thkap thksim thorn tilde times timesb timesbar timesd tint toea top topbot topcir topf topfork tosa tprime trade triangle triangledown triangleleft trianglelefteq triangleq triangleright trianglerighteq tridot trie triminus triplus trisb tritime trpezium tscr tscy tshcy tstrok twixt twoheadleftarrow twoheadrightarrow uArr uHar uacute uarr ubrcy ubreve ucirc ucy udarr udblac udhar ufisht ufr ugrave uharl uharr uhblk ulcorn ulcorner ulcrop ultri umacr uml uogon uopf uparrow updownarrow upharpoonleft upharpoonright uplus upsi upsilon upuparrows urcorn urcorner urcrop uring urtri uscr utdot utilde utri utrif uuarr uuml uwangle vArr vBar vBarv vDash vangrt varepsilon varkappa varnothing varphi varpi varpropto varr varrho varsigma varsubsetneq varsubsetneqq varsupsetneq varsupsetneqq vartheta vartriangleleft vartriangleright vcy vdash vee veebar veeeq vellip verbar vert vfr vltri vnsub vnsup vopf vprop vrtri vscr vsubnE vsubne vsupnE vsupne vzigzag wcirc wedbar wedge wedgeq weierp wfr wopf wp wr wreath wscr xcap xcirc xcup xdtri xfr xhArr xharr xi xlArr xlarr xmap xnis xodot xopf xoplus xotime xrArr xrarr xscr xsqcup xuplus xutri xvee xwedge yacute yacy ycirc ycy yen yfr yicy yopf yscr yucy yuml zacute zcaron zcy zdot zeetrf zeta zfr zhcy zigrarr zopf zscr ] end end end require 'math_ml' math_ml-1.0.0/lib/math_ml/symbol/utf8.rb0000644000004100000410000015064514700510662020104 0ustar www-datawww-datamodule MathML module Symbol MAP = {} unless const_defined?(:MAP) module UTF8 Symbol::Default = self unless Symbol.const_defined?(:Default) Symbol::MAP[:utf8] = self def self.convert(name) MAP[name.to_s.to_sym] end MAP = { AElig: 'Æ', Aacute: 'Á', Abreve: 'Ă', Acirc: 'Â', Acy: 'А', Afr: '𝔄', Agrave: 'À', Amacr: 'Ā', And: '⩓', Aogon: 'Ą', Aopf: '𝔸', ApplyFunction: '⁡', Aring: 'Å', Ascr: '𝒜', Assign: '≔', Atilde: 'Ã', Auml: 'Ä', Backslash: '∖', Barv: '⫧', Barwed: '⌆', Bcy: 'Б', Because: '∵', Bernoullis: 'ℬ', Bfr: '𝔅', Bopf: '𝔹', Breve: '˘', Bscr: 'ℬ', Bumpeq: '≎', CHcy: 'Ч', Cacute: 'Ć', Cap: '⋒', CapitalDifferentialD: 'ⅅ', Cayleys: 'ℭ', Ccaron: 'Č', Ccedil: 'Ç', Ccirc: 'Ĉ', Cconint: '∰', Cdot: 'Ċ', Cedilla: '¸', CenterDot: '·', Cfr: 'ℭ', CircleDot: '⊙', CircleMinus: '⊖', CirclePlus: '⊕', CircleTimes: '⊗', ClockwiseContourIntegral: '∲', CloseCurlyDoubleQuote: '”', CloseCurlyQuote: '’', Colon: '∷', Colone: '⩴', Congruent: '≡', Conint: '∯', ContourIntegral: '∮', Copf: 'ℂ', Coproduct: '∐', CounterClockwiseContourIntegral: '∳', Cross: '⨯', Cscr: '𝒞', Cup: '⋓', CupCap: '≍', DD: 'ⅅ', DDotrahd: '⤑', DJcy: 'Ђ', DScy: 'Ѕ', DZcy: 'Џ', Dagger: '‡', Darr: '↡', Dashv: '⫤', Dcaron: 'Ď', Dcy: 'Д', Del: '∇', Delta: 'Δ', Dfr: '𝔇', DiacriticalAcute: '´', DiacriticalDot: '˙', DiacriticalDoubleAcute: '˝', DiacriticalGrave: '`', DiacriticalTilde: '˜', Diamond: '⋄', DifferentialD: 'ⅆ', Dopf: '𝔻', Dot: '¨', DotDot: '⃜', DotEqual: '≐', DoubleContourIntegral: '∯', DoubleDot: '¨', DoubleDownArrow: '⇓', DoubleLeftArrow: '⇐', DoubleLeftRightArrow: '⇔', DoubleLeftTee: '⫤', DoubleLongLeftArrow: '⟸', DoubleLongLeftRightArrow: '⟺', DoubleLongRightArrow: '⟹', DoubleRightArrow: '⇒', DoubleRightTee: '⊨', DoubleUpArrow: '⇑', DoubleUpDownArrow: '⇕', DoubleVerticalBar: '∥', DownArrow: '↓', DownArrowBar: '⤓', DownArrowUpArrow: '⇵', DownBreve: '̑', DownLeftRightVector: '⥐', DownLeftTeeVector: '⥞', DownLeftVector: '↽', DownLeftVectorBar: '⥖', DownRightTeeVector: '⥟', DownRightVector: '⇁', DownRightVectorBar: '⥗', DownTee: '⊤', DownTeeArrow: '↧', Downarrow: '⇓', Dscr: '𝒟', Dstrok: 'Đ', ENG: 'Ŋ', ETH: 'Ð', Eacute: 'É', Ecaron: 'Ě', Ecirc: 'Ê', Ecy: 'Э', Edot: 'Ė', Efr: '𝔈', Egrave: 'È', Element: '∈', Emacr: 'Ē', EmptySmallSquare: '◻', EmptyVerySmallSquare: '▫', Eogon: 'Ę', Eopf: '𝔼', Equal: '⩵', EqualTilde: '≂', Equilibrium: '⇌', Escr: 'ℰ', Esim: '⩳', Euml: 'Ë', Exists: '∃', ExponentialE: 'ⅇ', Fcy: 'Ф', Ffr: '𝔉', FilledSmallSquare: '◼', FilledVerySmallSquare: '▪', Fopf: '𝔽', ForAll: '∀', Fouriertrf: 'ℱ', Fscr: 'ℱ', GJcy: 'Ѓ', Gamma: 'Γ', Gammad: 'Ϝ', Gbreve: 'Ğ', Gcedil: 'Ģ', Gcirc: 'Ĝ', Gcy: 'Г', Gdot: 'Ġ', Gfr: '𝔊', Gg: '⋙', Gopf: '𝔾', GreaterEqual: '≥', GreaterEqualLess: '⋛', GreaterFullEqual: '≧', GreaterGreater: '⪢', GreaterLess: '≷', GreaterSlantEqual: '⩾', GreaterTilde: '≳', Gscr: '𝒢', Gt: '≫', HARDcy: 'Ъ', Hacek: 'ˇ', Hat: '^', Hcirc: 'Ĥ', Hfr: 'ℌ', HilbertSpace: 'ℋ', Hopf: 'ℍ', HorizontalLine: '─', Hscr: 'ℋ', Hstrok: 'Ħ', HumpDownHump: '≎', HumpEqual: '≏', IEcy: 'Е', IJlig: 'IJ', IOcy: 'Ё', Iacute: 'Í', Icirc: 'Î', Icy: 'И', Idot: 'İ', Ifr: 'ℑ', Igrave: 'Ì', Im: 'ℑ', Imacr: 'Ī', ImaginaryI: 'ⅈ', Implies: '⇒', Int: '∬', Integral: '∫', Intersection: '⋂', InvisibleComma: '⁣', InvisibleTimes: '⁢', Iogon: 'Į', Iopf: '𝕀', Iscr: 'ℐ', Itilde: 'Ĩ', Iukcy: 'І', Iuml: 'Ï', Jcirc: 'Ĵ', Jcy: 'Й', Jfr: '𝔍', Jopf: '𝕁', Jscr: '𝒥', Jsercy: 'Ј', Jukcy: 'Є', KHcy: 'Х', KJcy: 'Ќ', Kcedil: 'Ķ', Kcy: 'К', Kfr: '𝔎', Kopf: '𝕂', Kscr: '𝒦', LJcy: 'Љ', Lacute: 'Ĺ', Lambda: 'Λ', Lang: '《', Laplacetrf: 'ℒ', Larr: '↞', Lcaron: 'Ľ', Lcedil: 'Ļ', Lcy: 'Л', LeftAngleBracket: '〈', LeftArrow: '←', LeftArrowBar: '⇤', LeftArrowRightArrow: '⇆', LeftCeiling: '⌈', LeftDoubleBracket: '〚', LeftDownTeeVector: '⥡', LeftDownVector: '⇃', LeftDownVectorBar: '⥙', LeftFloor: '⌊', LeftRightArrow: '↔', LeftRightVector: '⥎', LeftTee: '⊣', LeftTeeArrow: '↤', LeftTeeVector: '⥚', LeftTriangle: '⊲', LeftTriangleBar: '⧏', LeftTriangleEqual: '⊴', LeftUpDownVector: '⥑', LeftUpTeeVector: '⥠', LeftUpVector: '↿', LeftUpVectorBar: '⥘', LeftVector: '↼', LeftVectorBar: '⥒', Leftarrow: '⇐', Leftrightarrow: '⇔', LessEqualGreater: '⋚', LessFullEqual: '≦', LessGreater: '≶', LessLess: '⪡', LessSlantEqual: '⩽', LessTilde: '≲', Lfr: '𝔏', Ll: '⋘', Lleftarrow: '⇚', Lmidot: 'Ŀ', LongLeftArrow: '⟵', LongLeftRightArrow: '⟷', LongRightArrow: '⟶', Longleftarrow: '⟸', Longleftrightarrow: '⟺', Longrightarrow: '⟹', Lopf: '𝕃', LowerLeftArrow: '↙', LowerRightArrow: '↘', Lscr: 'ℒ', Lsh: '↰', Lstrok: 'Ł', Lt: '≪', Map: '⤅', Mcy: 'М', MediumSpace: ' ', Mellintrf: 'ℳ', Mfr: '𝔐', MinusPlus: '∓', Mopf: '𝕄', Mscr: 'ℳ', NJcy: 'Њ', Nacute: 'Ń', Ncaron: 'Ň', Ncedil: 'Ņ', Ncy: 'Н', NegativeMediumSpace: '​', NegativeThickSpace: '​', NegativeThinSpace: '​', NegativeVeryThinSpace: '​', NestedGreaterGreater: '≫', NestedLessLess: '≪', NewLine: "\n", Nfr: '𝔑', NoBreak: '⁠', NonBreakingSpace: ' ', Nopf: 'ℕ', Not: '⫬', NotCongruent: '≢', NotCupCap: '≭', NotDoubleVerticalBar: '∦', NotElement: '∉', NotEqual: '≠', NotEqualTilde: '≂̸', NotExists: '∄', NotGreater: '≯', NotGreaterEqual: '≱', NotGreaterFullEqual: '≦̸', NotGreaterGreater: '≫̸', NotGreaterLess: '≹', NotGreaterSlantEqual: '⩾̸', NotGreaterTilde: '≵', NotHumpDownHump: '≎̸', NotHumpEqual: '≏̸', NotLeftTriangle: '⋪', NotLeftTriangleBar: '⧏̸', NotLeftTriangleEqual: '⋬', NotLess: '≮', NotLessEqual: '≰', NotLessGreater: '≸', NotLessLess: '≪̸', NotLessSlantEqual: '⩽̸', NotLessTilde: '≴', NotNestedGreaterGreater: '⪢̸', NotNestedLessLess: '⪡̸', NotPrecedes: '⊀', NotPrecedesEqual: '⪯̸', NotPrecedesSlantEqual: '⋠', NotReverseElement: '∌', NotRightTriangle: '⋫', NotRightTriangleBar: '⧐̸', NotRightTriangleEqual: '⋭', NotSquareSubset: '⊏̸', NotSquareSubsetEqual: '⋢', NotSquareSuperset: '⊐̸', NotSquareSupersetEqual: '⋣', NotSubset: '⊂⃒', NotSubsetEqual: '⊈', NotSucceeds: '⊁', NotSucceedsEqual: '⪰̸', NotSucceedsSlantEqual: '⋡', NotSucceedsTilde: '≿̸', NotSuperset: '⊃⃒', NotSupersetEqual: '⊉', NotTilde: '≁', NotTildeEqual: '≄', NotTildeFullEqual: '≇', NotTildeTilde: '≉', NotVerticalBar: '∤', Nscr: '𝒩', Ntilde: 'Ñ', OElig: 'Œ', Oacute: 'Ó', Ocirc: 'Ô', Ocy: 'О', Odblac: 'Ő', Ofr: '𝔒', Ograve: 'Ò', Omacr: 'Ō', Omega: 'Ω', Oopf: '𝕆', OpenCurlyDoubleQuote: '“', OpenCurlyQuote: '‘', Or: '⩔', Oscr: '𝒪', Oslash: 'Ø', Otilde: 'Õ', Otimes: '⨷', Ouml: 'Ö', OverBar: '¯', OverBrace: '︷', OverBracket: '⎴', OverParenthesis: '︵', PartialD: '∂', Pcy: 'П', Pfr: '𝔓', Phi: 'Φ', Pi: 'Π', PlusMinus: '±', Poincareplane: 'ℌ', Popf: 'ℙ', Pr: '⪻', Precedes: '≺', PrecedesEqual: '⪯', PrecedesSlantEqual: '≼', PrecedesTilde: '≾', Prime: '″', Product: '∏', Proportion: '∷', Proportional: '∝', Pscr: '𝒫', Psi: 'Ψ', Qfr: '𝔔', Qopf: 'ℚ', Qscr: '𝒬', RBarr: '⤐', Racute: 'Ŕ', Rang: '》', Rarr: '↠', Rarrtl: '⤖', Rcaron: 'Ř', Rcedil: 'Ŗ', Rcy: 'Р', Re: 'ℜ', ReverseElement: '∋', ReverseEquilibrium: '⇋', ReverseUpEquilibrium: '⥯', Rfr: 'ℜ', RightAngleBracket: '〉', RightArrow: '→', RightArrowBar: '⇥', RightArrowLeftArrow: '⇄', RightCeiling: '⌉', RightDoubleBracket: '〛', RightDownTeeVector: '⥝', RightDownVector: '⇂', RightDownVectorBar: '⥕', RightFloor: '⌋', RightTee: '⊢', RightTeeArrow: '↦', RightTeeVector: '⥛', RightTriangle: '⊳', RightTriangleBar: '⧐', RightTriangleEqual: '⊵', RightUpDownVector: '⥏', RightUpTeeVector: '⥜', RightUpVector: '↾', RightUpVectorBar: '⥔', RightVector: '⇀', RightVectorBar: '⥓', Rightarrow: '⇒', Ropf: 'ℝ', RoundImplies: '⥰', Rrightarrow: '⇛', Rscr: 'ℛ', Rsh: '↱', RuleDelayed: '⧴', SHCHcy: 'Щ', SHcy: 'Ш', SOFTcy: 'Ь', Sacute: 'Ś', Sc: '⪼', Scaron: 'Š', Scedil: 'Ş', Scirc: 'Ŝ', Scy: 'С', Sfr: '𝔖', ShortDownArrow: '↓', ShortLeftArrow: '←', ShortRightArrow: '→', ShortUpArrow: '↑', Sigma: 'Σ', SmallCircle: '∘', Sopf: '𝕊', Sqrt: '√', Square: '□', SquareIntersection: '⊓', SquareSubset: '⊏', SquareSubsetEqual: '⊑', SquareSuperset: '⊐', SquareSupersetEqual: '⊒', SquareUnion: '⊔', Sscr: '𝒮', Star: '⋆', Sub: '⋐', Subset: '⋐', SubsetEqual: '⊆', Succeeds: '≻', SucceedsEqual: '⪰', SucceedsSlantEqual: '≽', SucceedsTilde: '≿', SuchThat: '∋', Sum: '∑', Sup: '⋑', Superset: '⊃', SupersetEqual: '⊇', Supset: '⋑', THORN: 'Þ', TSHcy: 'Ћ', TScy: 'Ц', Tab: "\t", Tcaron: 'Ť', Tcedil: 'Ţ', Tcy: 'Т', Tfr: '𝔗', Therefore: '∴', Theta: 'Θ', ThickSpace: '   ', ThinSpace: ' ', Tilde: '∼', TildeEqual: '≃', TildeFullEqual: '≅', TildeTilde: '≈', Topf: '𝕋', TripleDot: '⃛', Tscr: '𝒯', Tstrok: 'Ŧ', Uacute: 'Ú', Uarr: '↟', Uarrocir: '⥉', Ubrcy: 'Ў', Ubreve: 'Ŭ', Ucirc: 'Û', Ucy: 'У', Udblac: 'Ű', Ufr: '𝔘', Ugrave: 'Ù', Umacr: 'Ū', UnderBar: '̲', UnderBrace: '︸', UnderBracket: '⎵', UnderParenthesis: '︶', Union: '⋃', UnionPlus: '⊎', Uogon: 'Ų', Uopf: '𝕌', UpArrow: '↑', UpArrowBar: '⤒', UpArrowDownArrow: '⇅', UpDownArrow: '↕', UpEquilibrium: '⥮', UpTee: '⊥', UpTeeArrow: '↥', Uparrow: '⇑', Updownarrow: '⇕', UpperLeftArrow: '↖', UpperRightArrow: '↗', Upsi: 'ϒ', Upsilon: 'Υ', Uring: 'Ů', Uscr: '𝒰', Utilde: 'Ũ', Uuml: 'Ü', VDash: '⊫', Vbar: '⫫', Vcy: 'В', Vdash: '⊩', Vdashl: '⫦', Vee: '⋁', Verbar: '‖', Vert: '‖', VerticalBar: '∣', VerticalLine: '|', VerticalSeparator: '❘', VerticalTilde: '≀', VeryThinSpace: ' ', Vfr: '𝔙', Vopf: '𝕍', Vscr: '𝒱', Vvdash: '⊪', Wcirc: 'Ŵ', Wedge: '⋀', Wfr: '𝔚', Wopf: '𝕎', Wscr: '𝒲', Xfr: '𝔛', Xi: 'Ξ', Xopf: '𝕏', Xscr: '𝒳', YAcy: 'Я', YIcy: 'Ї', YUcy: 'Ю', Yacute: 'Ý', Ycirc: 'Ŷ', Ycy: 'Ы', Yfr: '𝔜', Yopf: '𝕐', Yscr: '𝒴', Yuml: 'Ÿ', ZHcy: 'Ж', Zacute: 'Ź', Zcaron: 'Ž', Zcy: 'З', Zdot: 'Ż', ZeroWidthSpace: '​', Zfr: 'ℨ', Zopf: 'ℤ', Zscr: '𝒵', aacute: 'á', abreve: 'ă', ac: '∾', acE: '∾̳', acd: '∿', acirc: 'â', acute: '´', acy: 'а', aelig: 'æ', af: '⁡', afr: '𝔞', agrave: 'à', aleph: 'ℵ', alpha: 'α', amacr: 'ā', amalg: '⨿', amp: '&', and: '∧', andand: '⩕', andd: '⩜', andslope: '⩘', andv: '⩚', ang: '∠', ange: '⦤', angle: '∠', angmsd: '∡', angmsdaa: '⦨', angmsdab: '⦩', angmsdac: '⦪', angmsdad: '⦫', angmsdae: '⦬', angmsdaf: '⦭', angmsdag: '⦮', angmsdah: '⦯', angrt: '∟', angrtvb: '⊾', angrtvbd: '⦝', angsph: '∢', angst: 'Å', angzarr: '⍼', aogon: 'ą', aopf: '𝕒', ap: '≈', apE: '⩰', apacir: '⩯', ape: '≊', apid: '≋', apos: "'", approx: '≈', approxeq: '≊', aring: 'å', ascr: '𝒶', ast: '*', asymp: '≈', asympeq: '≍', atilde: 'ã', auml: 'ä', awconint: '∳', awint: '⨑', bNot: '⫭', backcong: '≌', backepsilon: '϶', backprime: '‵', backsim: '∽', backsimeq: '⋍', barvee: '⊽', barwed: '⌅', barwedge: '⌅', bbrk: '⎵', bbrktbrk: '⎶', bcong: '≌', bcy: 'б', becaus: '∵', because: '∵', bemptyv: '⦰', bepsi: '϶', bernou: 'ℬ', beta: 'β', beth: 'ℶ', between: '≬', bfr: '𝔟', bigcap: '⋂', bigcirc: '◯', bigcup: '⋃', bigodot: '⨀', bigoplus: '⨁', bigotimes: '⨂', bigsqcup: '⨆', bigstar: '★', bigtriangledown: '▽', bigtriangleup: '△', biguplus: '⨄', bigvee: '⋁', bigwedge: '⋀', bkarow: '⤍', blacklozenge: '⧫', blacksquare: '▪', blacktriangle: '▴', blacktriangledown: '▾', blacktriangleleft: '◂', blacktriangleright: '▸', blank: '␣', blk12: '▒', blk14: '░', blk34: '▓', block: '█', bne: '=⃥', bnequiv: '≡⃥', bnot: '⌐', bopf: '𝕓', bot: '⊥', bottom: '⊥', bowtie: '⋈', boxDL: '╗', boxDR: '╔', boxDl: '╖', boxDr: '╓', boxH: '═', boxHD: '╦', boxHU: '╩', boxHd: '╤', boxHu: '╧', boxUL: '╝', boxUR: '╚', boxUl: '╜', boxUr: '╙', boxV: '║', boxVH: '╬', boxVL: '╣', boxVR: '╠', boxVh: '╫', boxVl: '╢', boxVr: '╟', boxbox: '⧉', boxdL: '╕', boxdR: '╒', boxdl: '┐', boxdr: '┌', boxh: '─', boxhD: '╥', boxhU: '╨', boxhd: '┬', boxhu: '┴', boxminus: '⊟', boxplus: '⊞', boxtimes: '⊠', boxuL: '╛', boxuR: '╘', boxul: '┘', boxur: '└', boxv: '│', boxvH: '╪', boxvL: '╡', boxvR: '╞', boxvh: '┼', boxvl: '┤', boxvr: '├', bprime: '‵', breve: '˘', brvbar: '¦', bscr: '𝒷', bsemi: '⁏', bsim: '∽', bsime: '⋍', bsol: '\\', bsolb: '⧅', bsolhsub: '\\⊂', bull: '•', bullet: '•', bump: '≎', bumpE: '⪮', bumpe: '≏', bumpeq: '≏', cacute: 'ć', cap: '∩', capand: '⩄', capbrcup: '⩉', capcap: '⩋', capcup: '⩇', capdot: '⩀', caps: '∩︀', caret: '⁁', caron: 'ˇ', ccaps: '⩍', ccaron: 'č', ccedil: 'ç', ccirc: 'ĉ', ccups: '⩌', ccupssm: '⩐', cdot: 'ċ', cedil: '¸', cemptyv: '⦲', cent: '¢', centerdot: '·', cfr: '𝔠', chcy: 'ч', check: '✓', checkmark: '✓', chi: 'χ', cir: '○', cirE: '⧃', circ: 'ˆ', circeq: '≗', circlearrowleft: '↺', circlearrowright: '↻', circledR: '®', circledS: 'Ⓢ', circledast: '⊛', circledcirc: '⊚', circleddash: '⊝', cire: '≗', cirfnint: '⨐', cirmid: '⫯', cirscir: '⧂', clubs: '♣', clubsuit: '♣', colon: ':', colone: '≔', coloneq: '≔', comma: ',', commat: '@', comp: '∁', compfn: '∘', complement: '∁', complexes: 'ℂ', cong: '≅', congdot: '⩭', conint: '∮', copf: '𝕔', coprod: '∐', copy: '©', copysr: '℗', cross: '✗', cscr: '𝒸', csub: '⫏', csube: '⫑', csup: '⫐', csupe: '⫒', ctdot: '⋯', cudarrl: '⤸', cudarrr: '⤵', cuepr: '⋞', cuesc: '⋟', cularr: '↶', cularrp: '⤽', cup: '∪', cupbrcap: '⩈', cupcap: '⩆', cupcup: '⩊', cupdot: '⊍', cupor: '⩅', cups: '∪︀', curarr: '↷', curarrm: '⤼', curlyeqprec: '⋞', curlyeqsucc: '⋟', curlyvee: '⋎', curlywedge: '⋏', curren: '¤', curvearrowleft: '↶', curvearrowright: '↷', cuvee: '⋎', cuwed: '⋏', cwconint: '∲', cwint: '∱', cylcty: '⌭', dArr: '⇓', dHar: '⥥', dagger: '†', daleth: 'ℸ', darr: '↓', dash: '‐', dashv: '⊣', dbkarow: '⤏', dblac: '˝', dcaron: 'ď', dcy: 'д', dd: 'ⅆ', ddagger: '‡', ddarr: '⇊', ddotseq: '⩷', deg: '°', delta: 'δ', demptyv: '⦱', dfisht: '⥿', dfr: '𝔡', dharl: '⇃', dharr: '⇂', diam: '⋄', diamond: '⋄', diamondsuit: '♦', diams: '♦', die: '¨', digamma: 'ϝ', disin: '⋲', div: '÷', divide: '÷', divideontimes: '⋇', divonx: '⋇', djcy: 'ђ', dlcorn: '⌞', dlcrop: '⌍', dollar: '$', dopf: '𝕕', dot: '˙', doteq: '≐', doteqdot: '≑', dotminus: '∸', dotplus: '∔', dotsquare: '⊡', doublebarwedge: '⌆', downarrow: '↓', downdownarrows: '⇊', downharpoonleft: '⇃', downharpoonright: '⇂', drbkarow: '⤐', drcorn: '⌟', drcrop: '⌌', dscr: '𝒹', dscy: 'ѕ', dsol: '⧶', dstrok: 'đ', dtdot: '⋱', dtri: '▿', dtrif: '▾', duarr: '⇵', duhar: '⥯', dwangle: '⦦', dzcy: 'џ', dzigrarr: '⟿', eDDot: '⩷', eDot: '≑', eacute: 'é', easter: '⩮', ecaron: 'ě', ecir: '≖', ecirc: 'ê', ecolon: '≕', ecy: 'э', edot: 'ė', ee: 'ⅇ', efDot: '≒', efr: '𝔢', eg: '⪚', egrave: 'è', egs: '⪖', egsdot: '⪘', el: '⪙', elinters: '�', ell: 'ℓ', els: '⪕', elsdot: '⪗', emacr: 'ē', empty: '∅', emptyset: '∅', emptyv: '∅', emsp: ' ', emsp13: ' ', emsp14: ' ', eng: 'ŋ', ensp: ' ', eogon: 'ę', eopf: '𝕖', epar: '⋕', eparsl: '⧣', eplus: '⩱', epsi: 'ϵ', epsiv: 'ε', eqcirc: '≖', eqcolon: '≕', eqsim: '≂', eqslantgtr: '⪖', eqslantless: '⪕', equals: '=', equest: '≟', equiv: '≡', equivDD: '⩸', eqvparsl: '⧥', erDot: '≓', erarr: '⥱', escr: 'ℯ', esdot: '≐', esim: '≂', eta: 'η', eth: 'ð', euml: 'ë', excl: '!', exist: '∃', expectation: 'ℰ', exponentiale: 'ⅇ', fallingdotseq: '≒', fcy: 'ф', female: '♀', ffilig: 'ffi', fflig: 'ff', ffllig: 'ffl', ffr: '𝔣', filig: 'fi', flat: '♭', fllig: 'fl', fltns: '▱', fnof: 'ƒ', fopf: '𝕗', forall: '∀', fork: '⋔', forkv: '⫙', fpartint: '⨍', frac12: '½', frac13: '⅓', frac14: '¼', frac15: '⅕', frac16: '⅙', frac18: '⅛', frac23: '⅔', frac25: '⅖', frac34: '¾', frac35: '⅗', frac38: '⅜', frac45: '⅘', frac56: '⅚', frac58: '⅝', frac78: '⅞', frown: '⌢', fscr: '𝒻', gE: '≧', gEl: '⪌', gacute: 'ǵ', gamma: 'γ', gammad: 'ϝ', gap: '⪆', gbreve: 'ğ', gcirc: 'ĝ', gcy: 'г', gdot: 'ġ', ge: '≥', gel: '⋛', geq: '≥', geqq: '≧', geqslant: '⩾', ges: '⩾', gescc: '⪩', gesdot: '⪀', gesdoto: '⪂', gesdotol: '⪄', gesl: '⋛︀', gesles: '⪔', gfr: '𝔤', gg: '≫', ggg: '⋙', gimel: 'ℷ', gjcy: 'ѓ', gl: '≷', glE: '⪒', gla: '⪥', glj: '⪤', gnE: '≩', gnap: '⪊', gnapprox: '⪊', gne: '⪈', gneq: '⪈', gneqq: '≩', gnsim: '⋧', gopf: '𝕘', grave: '`', gscr: 'ℊ', gsim: '≳', gsime: '⪎', gsiml: '⪐', gt: '>', gtcc: '⪧', gtcir: '⩺', gtdot: '⋗', gtlPar: '⦕', gtquest: '⩼', gtrapprox: '⪆', gtrarr: '⥸', gtrdot: '⋗', gtreqless: '⋛', gtreqqless: '⪌', gtrless: '≷', gtrsim: '≳', gvertneqq: '≩︀', gvnE: '≩︀', hArr: '⇔', hairsp: ' ', half: '½', hamilt: 'ℋ', hardcy: 'ъ', harr: '↔', harrcir: '⥈', harrw: '↭', hbar: 'ℏ', hcirc: 'ĥ', hearts: '♥', heartsuit: '♥', hellip: '…', hercon: '⊹', hfr: '𝔥', hksearow: '⤥', hkswarow: '⤦', hoarr: '⇿', homtht: '∻', hookleftarrow: '↩', hookrightarrow: '↪', hopf: '𝕙', horbar: '―', hscr: '𝒽', hslash: 'ℏ', hstrok: 'ħ', hybull: '⁃', hyphen: '‐', iacute: 'í', ic: '⁣', icirc: 'î', icy: 'и', iecy: 'е', iexcl: '¡', iff: '⇔', ifr: '𝔦', igrave: 'ì', ii: 'ⅈ', iiiint: '⨌', iiint: '∭', iinfin: '⧜', iiota: '℩', ijlig: 'ij', imacr: 'ī', image: 'ℑ', imagline: 'ℐ', imagpart: 'ℑ', imath: 'ı', imof: '⊷', imped: 'Ƶ', in: '∈', incare: '℅', infin: '∞', infintie: '⧝', inodot: 'ı', int: '∫', intcal: '⊺', integers: 'ℤ', intercal: '⊺', intlarhk: '⨗', intprod: '⨼', iocy: 'ё', iogon: 'į', iopf: '𝕚', iota: 'ι', iprod: '⨼', iquest: '¿', iscr: '𝒾', isin: '∈', isinE: '⋹', isindot: '⋵', isins: '⋴', isinsv: '⋳', isinv: '∈', it: '⁢', itilde: 'ĩ', iukcy: 'і', iuml: 'ï', jcirc: 'ĵ', jcy: 'й', jfr: '𝔧', jmath: 'j', jopf: '𝕛', jscr: '𝒿', jsercy: 'ј', jukcy: 'є', kappa: 'κ', kappav: 'ϰ', kcedil: 'ķ', kcy: 'к', kfr: '𝔨', kgreen: 'ĸ', khcy: 'х', kjcy: 'ќ', kopf: '𝕜', kscr: '𝓀', lAarr: '⇚', lArr: '⇐', lAtail: '⤛', lBarr: '⤎', lE: '≦', lEg: '⪋', lHar: '⥢', lacute: 'ĺ', laemptyv: '⦴', lagran: 'ℒ', lambda: 'λ', lang: '〈', langd: '⦑', langle: '〈', lap: '⪅', laquo: '«', larr: '←', larrb: '⇤', larrbfs: '⤟', larrfs: '⤝', larrhk: '↩', larrlp: '↫', larrpl: '⤹', larrsim: '⥳', larrtl: '↢', lat: '⪫', latail: '⤙', late: '⪭', lates: '⪭︀', lbarr: '⤌', lbbrk: '〔', lbrace: '{', lbrack: '[', lbrke: '⦋', lbrksld: '⦏', lbrkslu: '⦍', lcaron: 'ľ', lcedil: 'ļ', lceil: '⌈', lcub: '{', lcy: 'л', ldca: '⤶', ldquo: '“', ldquor: '„', ldrdhar: '⥧', ldrushar: '⥋', ldsh: '↲', le: '≤', leftarrow: '←', leftarrowtail: '↢', leftharpoondown: '↽', leftharpoonup: '↼', leftleftarrows: '⇇', leftrightarrow: '↔', leftrightarrows: '⇆', leftrightharpoons: '⇋', leftrightsquigarrow: '↭', leftthreetimes: '⋋', leg: '⋚', leq: '≤', leqq: '≦', leqslant: '⩽', les: '⩽', lescc: '⪨', lesdot: '⩿', lesdoto: '⪁', lesdotor: '⪃', lesg: '⋚︀', lesges: '⪓', lessapprox: '⪅', lessdot: '⋖', lesseqgtr: '⋚', lesseqqgtr: '⪋', lessgtr: '≶', lesssim: '≲', lfisht: '⥼', lfloor: '⌊', lfr: '𝔩', lg: '≶', lgE: '⪑', lhard: '↽', lharu: '↼', lharul: '⥪', lhblk: '▄', ljcy: 'љ', ll: '≪', llarr: '⇇', llcorner: '⌞', llhard: '⥫', lltri: '◺', lmidot: 'ŀ', lmoust: '⎰', lmoustache: '⎰', lnE: '≨', lnap: '⪉', lnapprox: '⪉', lne: '⪇', lneq: '⪇', lneqq: '≨', lnsim: '⋦', loang: '〘', loarr: '⇽', lobrk: '〚', longleftarrow: '⟵', longleftrightarrow: '⟷', longmapsto: '⟼', longrightarrow: '⟶', looparrowleft: '↫', looparrowright: '↬', lopar: '⦅', lopf: '𝕝', loplus: '⨭', lotimes: '⨴', lowast: '∗', lowbar: '_', loz: '◊', lozenge: '◊', lozf: '⧫', lpar: '(', lparlt: '⦓', lrarr: '⇆', lrcorner: '⌟', lrhar: '⇋', lrhard: '⥭', lrtri: '⊿', lscr: '𝓁', lsh: '↰', lsim: '≲', lsime: '⪍', lsimg: '⪏', lsqb: '[', lsquo: '‘', lsquor: '‚', lstrok: 'ł', lt: '<', ltcc: '⪦', ltcir: '⩹', ltdot: '⋖', lthree: '⋋', ltimes: '⋉', ltlarr: '⥶', ltquest: '⩻', ltrPar: '⦖', ltri: '◃', ltrie: '⊴', ltrif: '◂', lurdshar: '⥊', luruhar: '⥦', lvertneqq: '≨︀', lvnE: '≨︀', mDDot: '∺', macr: '¯', male: '♂', malt: '✠', maltese: '✠', map: '↦', mapsto: '↦', mapstodown: '↧', mapstoleft: '↤', mapstoup: '↥', marker: '▮', mcomma: '⨩', mcy: 'м', mdash: '—', measuredangle: '∡', mfr: '𝔪', mho: '℧', micro: 'µ', mid: '∣', midast: '*', midcir: '⫰', middot: '·', minus: '−', minusb: '⊟', minusd: '∸', minusdu: '⨪', mlcp: '⫛', mldr: '…', mnplus: '∓', models: '⊧', mopf: '𝕞', mp: '∓', mscr: '𝓂', mstpos: '∾', mu: 'μ', multimap: '⊸', mumap: '⊸', nGg: '⋙̸', nGt: '≫⃒', nGtv: '≫̸', nLeftarrow: '⇍', nLeftrightarrow: '⇎', nLl: '⋘̸', nLt: '≪⃒', nLtv: '≪̸', nRightarrow: '⇏', nVDash: '⊯', nVdash: '⊮', nabla: '∇', nacute: 'ń', nang: '∠⃒', nap: '≉', napE: '⩰̸', napid: '≋̸', napos: 'ʼn', napprox: '≉', natur: '♮', natural: '♮', naturals: 'ℕ', nbsp: ' ', nbump: '≎̸', nbumpe: '≏̸', ncap: '⩃', ncaron: 'ň', ncedil: 'ņ', ncong: '≇', ncongdot: '⩭̸', ncup: '⩂', ncy: 'н', ndash: '–', ne: '≠', neArr: '⇗', nearhk: '⤤', nearr: '↗', nearrow: '↗', nedot: '≐̸', nequiv: '≢', nesear: '⤨', nesim: '≂̸', nexist: '∄', nexists: '∄', nfr: '𝔫', ngE: '≧̸', nge: '≱', ngeq: '≱', ngeqq: '≧̸', ngeqslant: '⩾̸', nges: '⩾̸', ngsim: '≵', ngt: '≯', ngtr: '≯', nhArr: '⇎', nharr: '↮', nhpar: '⫲', ni: '∋', nis: '⋼', nisd: '⋺', niv: '∋', njcy: 'њ', nlArr: '⇍', nlE: '≦̸', nlarr: '↚', nldr: '‥', nle: '≰', nleftarrow: '↚', nleftrightarrow: '↮', nleq: '≰', nleqq: '≦̸', nleqslant: '⩽̸', nles: '⩽̸', nless: '≮', nlsim: '≴', nlt: '≮', nltri: '⋪', nltrie: '⋬', nmid: '∤', nopf: '𝕟', not: '¬', notin: '∉', notinE: '⋹̸', notindot: '⋵̸', notinva: '∉', notinvb: '⋷', notinvc: '⋶', notni: '∌', notniva: '∌', notnivb: '⋾', notnivc: '⋽', npar: '∦', nparallel: '∦', nparsl: '⫽⃥', npart: '∂̸', npolint: '⨔', npr: '⊀', nprcue: '⋠', npre: '⪯̸', nprec: '⊀', npreceq: '⪯̸', nrArr: '⇏', nrarr: '↛', nrarrc: '⤳̸', nrarrw: '↝̸', nrightarrow: '↛', nrtri: '⋫', nrtrie: '⋭', nsc: '⊁', nsccue: '⋡', nsce: '⪰̸', nscr: '𝓃', nshortmid: '∤', nshortparallel: '∦', nsim: '≁', nsime: '≄', nsimeq: '≄', nsmid: '∤', nspar: '∦', nsqsube: '⋢', nsqsupe: '⋣', nsub: '⊄', nsubE: '⫅̸', nsube: '⊈', nsubset: '⊂⃒', nsubseteq: '⊈', nsubseteqq: '⫅̸', nsucc: '⊁', nsucceq: '⪰̸', nsup: '⊅', nsupE: '⫆̸', nsupe: '⊉', nsupset: '⊃⃒', nsupseteq: '⊉', nsupseteqq: '⫆̸', ntgl: '≹', ntilde: 'ñ', ntlg: '≸', ntriangleleft: '⋪', ntrianglelefteq: '⋬', ntriangleright: '⋫', ntrianglerighteq: '⋭', nu: 'ν', num: '#', numero: '№', numsp: ' ', nvDash: '⊭', nvHarr: '⤄', nvap: '≍⃒', nvdash: '⊬', nvge: '≥⃒', nvgt: '>⃒', nvinfin: '⧞', nvlArr: '⤂', nvle: '≤⃒', nvlt: '<⃒', nvltrie: '⊴⃒', nvrArr: '⤃', nvrtrie: '⊵⃒', nvsim: '∼⃒', nwArr: '⇖', nwarhk: '⤣', nwarr: '↖', nwarrow: '↖', nwnear: '⤧', oS: 'Ⓢ', oacute: 'ó', oast: '⊛', ocir: '⊚', ocirc: 'ô', ocy: 'о', odash: '⊝', odblac: 'ő', odiv: '⨸', odot: '⊙', odsold: '⦼', oelig: 'œ', ofcir: '⦿', ofr: '𝔬', ogon: '˛', ograve: 'ò', ogt: '⧁', ohbar: '⦵', ohm: 'Ω', oint: '∮', olarr: '↺', olcir: '⦾', olcross: '⦻', olt: '⧀', omacr: 'ō', omega: 'ω', omid: '⦶', ominus: '⊖', oopf: '𝕠', opar: '⦷', operp: '⦹', oplus: '⊕', or: '∨', orarr: '↻', ord: '⩝', order: 'ℴ', orderof: 'ℴ', ordf: 'ª', ordm: 'º', origof: '⊶', oror: '⩖', orslope: '⩗', orv: '⩛', oscr: 'ℴ', oslash: 'ø', osol: '⊘', otilde: 'õ', otimes: '⊗', otimesas: '⨶', ouml: 'ö', ovbar: '⌽', par: '∥', para: '¶', parallel: '∥', parsim: '⫳', parsl: '⫽', part: '∂', pcy: 'п', percnt: '%', period: '.', permil: '‰', perp: '⊥', pertenk: '‱', pfr: '𝔭', phi: 'ϕ', phiv: 'φ', phmmat: 'ℳ', phone: '☎', pi: 'π', pitchfork: '⋔', piv: 'ϖ', planck: 'ℏ', planckh: 'ℎ', plankv: 'ℏ', plus: '+', plusacir: '⨣', plusb: '⊞', pluscir: '⨢', plusdo: '∔', plusdu: '⨥', pluse: '⩲', plusmn: '±', plussim: '⨦', plustwo: '⨧', pm: '±', pointint: '⨕', popf: '𝕡', pound: '£', pr: '≺', prE: '⪳', prap: '⪷', prcue: '≼', pre: '⪯', prec: '≺', precapprox: '⪷', preccurlyeq: '≼', preceq: '⪯', precnapprox: '⪹', precneqq: '⪵', precnsim: '⋨', precsim: '≾', prime: '′', primes: 'ℙ', prnE: '⪵', prnap: '⪹', prnsim: '⋨', prod: '∏', profalar: '⌮', profline: '⌒', profsurf: '⌓', prop: '∝', propto: '∝', prsim: '≾', prurel: '⊰', pscr: '𝓅', psi: 'ψ', puncsp: ' ', qfr: '𝔮', qint: '⨌', qopf: '𝕢', qprime: '⁗', qscr: '𝓆', quaternions: 'ℍ', quatint: '⨖', quest: '?', questeq: '≟', quot: '"', rAarr: '⇛', rArr: '⇒', rAtail: '⤜', rBarr: '⤏', rHar: '⥤', race: '⧚', racute: 'ŕ', radic: '√', raemptyv: '⦳', rang: '〉', rangd: '⦒', range: '⦥', rangle: '〉', raquo: '»', rarr: '→', rarrap: '⥵', rarrb: '⇥', rarrbfs: '⤠', rarrc: '⤳', rarrfs: '⤞', rarrhk: '↪', rarrlp: '↬', rarrpl: '⥅', rarrsim: '⥴', rarrtl: '↣', rarrw: '↝', ratail: '⤚', ratio: '∶', rationals: 'ℚ', rbarr: '⤍', rbbrk: '〕', rbrace: '}', rbrack: ']', rbrke: '⦌', rbrksld: '⦎', rbrkslu: '⦐', rcaron: 'ř', rcedil: 'ŗ', rceil: '⌉', rcub: '}', rcy: 'р', rdca: '⤷', rdldhar: '⥩', rdquo: '”', rdquor: '”', rdsh: '↳', real: 'ℜ', realine: 'ℛ', realpart: 'ℜ', reals: 'ℝ', rect: '▭', reg: '®', rfisht: '⥽', rfloor: '⌋', rfr: '𝔯', rhard: '⇁', rharu: '⇀', rharul: '⥬', rho: 'ρ', rhov: 'ϱ', rightarrow: '→', rightarrowtail: '↣', rightharpoondown: '⇁', rightharpoonup: '⇀', rightleftarrows: '⇄', rightleftharpoons: '⇌', rightrightarrows: '⇉', rightsquigarrow: '↝', rightthreetimes: '⋌', ring: '˚', risingdotseq: '≓', rlarr: '⇄', rlhar: '⇌', rmoust: '⎱', rmoustache: '⎱', rnmid: '⫮', roang: '〙', roarr: '⇾', robrk: '〛', ropar: '⦆', ropf: '𝕣', roplus: '⨮', rotimes: '⨵', rpar: ')', rpargt: '⦔', rppolint: '⨒', rrarr: '⇉', rscr: '𝓇', rsh: '↱', rsqb: ']', rsquo: '’', rsquor: '’', rthree: '⋌', rtimes: '⋊', rtri: '▹', rtrie: '⊵', rtrif: '▸', rtriltri: '⧎', ruluhar: '⥨', rx: '℞', sacute: 'ś', sc: '≻', scE: '⪴', scap: '⪸', scaron: 'š', sccue: '≽', sce: '⪰', scedil: 'ş', scirc: 'ŝ', scnE: '⪶', scnap: '⪺', scnsim: '⋩', scpolint: '⨓', scsim: '≿', scy: 'с', sdot: '⋅', sdotb: '⊡', sdote: '⩦', seArr: '⇘', searhk: '⤥', searr: '↘', searrow: '↘', sect: '§', semi: ';', seswar: '⤩', setminus: '∖', setmn: '∖', sext: '✶', sfr: '𝔰', sfrown: '⌢', sharp: '♯', shchcy: 'щ', shcy: 'ш', shortmid: '∣', shortparallel: '∥', shy: '­', sigma: 'σ', sigmav: 'ς', sim: '∼', simdot: '⩪', sime: '≃', simeq: '≃', simg: '⪞', simgE: '⪠', siml: '⪝', simlE: '⪟', simne: '≆', simplus: '⨤', simrarr: '⥲', slarr: '←', smallsetminus: '∖', smashp: '⨳', smeparsl: '⧤', smid: '∣', smile: '⌣', smt: '⪪', smte: '⪬', smtes: '⪬︀', softcy: 'ь', sol: '/', solb: '⧄', solbar: '⌿', sopf: '𝕤', spades: '♠', spadesuit: '♠', spar: '∥', sqcap: '⊓', sqcaps: '⊓︀', sqcup: '⊔', sqcups: '⊔︀', sqsub: '⊏', sqsube: '⊑', sqsubset: '⊏', sqsubseteq: '⊑', sqsup: '⊐', sqsupe: '⊒', sqsupset: '⊐', sqsupseteq: '⊒', squ: '□', square: '□', squarf: '▪', squf: '▪', srarr: '→', sscr: '𝓈', ssetmn: '∖', ssmile: '⌣', sstarf: '⋆', star: '☆', starf: '★', straightepsilon: 'ϵ', straightphi: 'ϕ', strns: '¯', sub: '⊂', subE: '⫅', subdot: '⪽', sube: '⊆', subedot: '⫃', submult: '⫁', subnE: '⫋', subne: '⊊', subplus: '⪿', subrarr: '⥹', subset: '⊂', subseteq: '⊆', subseteqq: '⫅', subsetneq: '⊊', subsetneqq: '⫋', subsim: '⫇', subsub: '⫕', subsup: '⫓', succ: '≻', succapprox: '⪸', succcurlyeq: '≽', succeq: '⪰', succnapprox: '⪺', succneqq: '⪶', succnsim: '⋩', succsim: '≿', sum: '∑', sung: '♪', sup: '⊃', sup1: '¹', sup2: '²', sup3: '³', supE: '⫆', supdot: '⪾', supdsub: '⫘', supe: '⊇', supedot: '⫄', suphsol: '⊃/', suphsub: '⫗', suplarr: '⥻', supmult: '⫂', supnE: '⫌', supne: '⊋', supplus: '⫀', supset: '⊃', supseteq: '⊇', supseteqq: '⫆', supsetneq: '⊋', supsetneqq: '⫌', supsim: '⫈', supsub: '⫔', supsup: '⫖', swArr: '⇙', swarhk: '⤦', swarr: '↙', swarrow: '↙', swnwar: '⤪', szlig: 'ß', target: '⌖', tau: 'τ', tbrk: '⎴', tcaron: 'ť', tcedil: 'ţ', tcy: 'т', tdot: '⃛', telrec: '⌕', tfr: '𝔱', there4: '∴', therefore: '∴', theta: 'θ', thetav: 'ϑ', thickapprox: '≈', thicksim: '∼', thinsp: ' ', thkap: '≈', thksim: '∼', thorn: 'þ', tilde: '˜', times: '×', timesb: '⊠', timesbar: '⨱', timesd: '⨰', tint: '∭', toea: '⤨', top: '⊤', topbot: '⌶', topcir: '⫱', topf: '𝕥', topfork: '⫚', tosa: '⤩', tprime: '‴', trade: '™', triangle: '▵', triangledown: '▿', triangleleft: '◃', trianglelefteq: '⊴', triangleq: '≜', triangleright: '▹', trianglerighteq: '⊵', tridot: '◬', trie: '≜', triminus: '⨺', triplus: '⨹', trisb: '⧍', tritime: '⨻', trpezium: '�', tscr: '𝓉', tscy: 'ц', tshcy: 'ћ', tstrok: 'ŧ', twixt: '≬', twoheadleftarrow: '↞', twoheadrightarrow: '↠', uArr: '⇑', uHar: '⥣', uacute: 'ú', uarr: '↑', ubrcy: 'ў', ubreve: 'ŭ', ucirc: 'û', ucy: 'у', udarr: '⇅', udblac: 'ű', udhar: '⥮', ufisht: '⥾', ufr: '𝔲', ugrave: 'ù', uharl: '↿', uharr: '↾', uhblk: '▀', ulcorn: '⌜', ulcorner: '⌜', ulcrop: '⌏', ultri: '◸', umacr: 'ū', uml: '¨', uogon: 'ų', uopf: '𝕦', uparrow: '↑', updownarrow: '↕', upharpoonleft: '↿', upharpoonright: '↾', uplus: '⊎', upsi: 'υ', upsilon: 'υ', upuparrows: '⇈', urcorn: '⌝', urcorner: '⌝', urcrop: '⌎', uring: 'ů', urtri: '◹', uscr: '𝓊', utdot: '⋰', utilde: 'ũ', utri: '▵', utrif: '▴', uuarr: '⇈', uuml: 'ü', uwangle: '⦧', vArr: '⇕', vBar: '⫨', vBarv: '⫩', vDash: '⊨', vangrt: '⦜', varepsilon: 'ε', varkappa: 'ϰ', varnothing: '∅', varphi: 'φ', varpi: 'ϖ', varpropto: '∝', varr: '↕', varrho: 'ϱ', varsigma: 'ς', varsubsetneq: '⊊︀', varsubsetneqq: '⫋︀', varsupsetneq: '⊋︀', varsupsetneqq: '⫌︀', vartheta: 'ϑ', vartriangleleft: '⊲', vartriangleright: '⊳', vcy: 'в', vdash: '⊢', vee: '∨', veebar: '⊻', veeeq: '≚', vellip: '⋮', verbar: '|', vert: '|', vfr: '𝔳', vltri: '⊲', vnsub: '⊂⃒', vnsup: '⊃⃒', vopf: '𝕧', vprop: '∝', vrtri: '⊳', vscr: '𝓋', vsubnE: '⫋︀', vsubne: '⊊︀', vsupnE: '⫌︀', vsupne: '⊋︀', vzigzag: '⦚', wcirc: 'ŵ', wedbar: '⩟', wedge: '∧', wedgeq: '≙', weierp: '℘', wfr: '𝔴', wopf: '𝕨', wp: '℘', wr: '≀', wreath: '≀', wscr: '𝓌', xcap: '⋂', xcirc: '◯', xcup: '⋃', xdtri: '▽', xfr: '𝔵', xhArr: '⟺', xharr: '⟷', xi: 'ξ', xlArr: '⟸', xlarr: '⟵', xmap: '⟼', xnis: '⋻', xodot: '⨀', xopf: '𝕩', xoplus: '⨁', xotime: '⨂', xrArr: '⟹', xrarr: '⟶', xscr: '𝓍', xsqcup: '⨆', xuplus: '⨄', xutri: '△', xvee: '⋁', xwedge: '⋀', yacute: 'ý', yacy: 'я', ycirc: 'ŷ', ycy: 'ы', yen: '¥', yfr: '𝔶', yicy: 'ї', yopf: '𝕪', yscr: '𝓎', yucy: 'ю', yuml: 'ÿ', zacute: 'ź', zcaron: 'ž', zcy: 'з', zdot: 'ż', zeetrf: 'ℨ', zeta: 'ζ', zfr: '𝔷', zhcy: 'ж', zigrarr: '⇝', zopf: '𝕫', zscr: '𝓏' } end end end require 'math_ml' math_ml-1.0.0/lib/math_ml/symbol/character_reference.rb0000644000004100000410000017575614700510662023202 0ustar www-datawww-datamodule MathML module Symbol MAP = {} unless const_defined?(:MAP) module CharacterReference Symbol::Default = self unless Symbol.const_defined?(:Default) Symbol::MAP[:character] = self def self.convert(name) MathML.pcstring(MAP[name.to_s.to_sym], true) end MAP = { AElig: 'Æ', Aacute: 'Á', Abreve: 'Ă', Acirc: 'Â', Acy: 'А', Afr: '𝔄', Agrave: 'À', Amacr: 'Ā', And: '⩓', Aogon: 'Ą', Aopf: '𝔸', ApplyFunction: '⁡', Aring: 'Å', Ascr: '𝒜', Assign: '≔', Atilde: 'Ã', Auml: 'Ä', Backslash: '∖', Barv: '⫧', Barwed: '⌆', Bcy: 'Б', Because: '∵', Bernoullis: 'ℬ', Bfr: '𝔅', Bopf: '𝔹', Breve: '˘', Bscr: 'ℬ', Bumpeq: '≎', CHcy: 'Ч', Cacute: 'Ć', Cap: '⋒', CapitalDifferentialD: 'ⅅ', Cayleys: 'ℭ', Ccaron: 'Č', Ccedil: 'Ç', Ccirc: 'Ĉ', Cconint: '∰', Cdot: 'Ċ', Cedilla: '¸', CenterDot: '·', Cfr: 'ℭ', CircleDot: '⊙', CircleMinus: '⊖', CirclePlus: '⊕', CircleTimes: '⊗', ClockwiseContourIntegral: '∲', CloseCurlyDoubleQuote: '”', CloseCurlyQuote: '’', Colon: '∷', Colone: '⩴', Congruent: '≡', Conint: '∯', ContourIntegral: '∮', Copf: 'ℂ', Coproduct: '∐', CounterClockwiseContourIntegral: '∳', Cross: '⨯', Cscr: '𝒞', Cup: '⋓', CupCap: '≍', DD: 'ⅅ', DDotrahd: '⤑', DJcy: 'Ђ', DScy: 'Ѕ', DZcy: 'Џ', Dagger: '‡', Darr: '↡', Dashv: '⫤', Dcaron: 'Ď', Dcy: 'Д', Del: '∇', Delta: 'Δ', Dfr: '𝔇', DiacriticalAcute: '´', DiacriticalDot: '˙', DiacriticalDoubleAcute: '˝', DiacriticalGrave: '`', DiacriticalTilde: '˜', Diamond: '⋄', DifferentialD: 'ⅆ', Dopf: '𝔻', Dot: '¨', DotDot: '⃜', DotEqual: '≐', DoubleContourIntegral: '∯', DoubleDot: '¨', DoubleDownArrow: '⇓', DoubleLeftArrow: '⇐', DoubleLeftRightArrow: '⇔', DoubleLeftTee: '⫤', DoubleLongLeftArrow: '⟸', DoubleLongLeftRightArrow: '⟺', DoubleLongRightArrow: '⟹', DoubleRightArrow: '⇒', DoubleRightTee: '⊨', DoubleUpArrow: '⇑', DoubleUpDownArrow: '⇕', DoubleVerticalBar: '∥', DownArrow: '↓', DownArrowBar: '⤓', DownArrowUpArrow: '⇵', DownBreve: '̑', DownLeftRightVector: '⥐', DownLeftTeeVector: '⥞', DownLeftVector: '↽', DownLeftVectorBar: '⥖', DownRightTeeVector: '⥟', DownRightVector: '⇁', DownRightVectorBar: '⥗', DownTee: '⊤', DownTeeArrow: '↧', Downarrow: '⇓', Dscr: '𝒟', Dstrok: 'Đ', ENG: 'Ŋ', ETH: 'Ð', Eacute: 'É', Ecaron: 'Ě', Ecirc: 'Ê', Ecy: 'Э', Edot: 'Ė', Efr: '𝔈', Egrave: 'È', Element: '∈', Emacr: 'Ē', EmptySmallSquare: '◻', EmptyVerySmallSquare: '▫', Eogon: 'Ę', Eopf: '𝔼', Equal: '⩵', EqualTilde: '≂', Equilibrium: '⇌', Escr: 'ℰ', Esim: '⩳', Euml: 'Ë', Exists: '∃', ExponentialE: 'ⅇ', Fcy: 'Ф', Ffr: '𝔉', FilledSmallSquare: '◼', FilledVerySmallSquare: '▪', Fopf: '𝔽', ForAll: '∀', Fouriertrf: 'ℱ', Fscr: 'ℱ', GJcy: 'Ѓ', Gamma: 'Γ', Gammad: 'Ϝ', Gbreve: 'Ğ', Gcedil: 'Ģ', Gcirc: 'Ĝ', Gcy: 'Г', Gdot: 'Ġ', Gfr: '𝔊', Gg: '⋙', Gopf: '𝔾', GreaterEqual: '≥', GreaterEqualLess: '⋛', GreaterFullEqual: '≧', GreaterGreater: '⪢', GreaterLess: '≷', GreaterSlantEqual: '⩾', GreaterTilde: '≳', Gscr: '𝒢', Gt: '≫', HARDcy: 'Ъ', Hacek: 'ˇ', Hat: '^', Hcirc: 'Ĥ', Hfr: 'ℌ', HilbertSpace: 'ℋ', Hopf: 'ℍ', HorizontalLine: '─', Hscr: 'ℋ', Hstrok: 'Ħ', HumpDownHump: '≎', HumpEqual: '≏', IEcy: 'Е', IJlig: 'IJ', IOcy: 'Ё', Iacute: 'Í', Icirc: 'Î', Icy: 'И', Idot: 'İ', Ifr: 'ℑ', Igrave: 'Ì', Im: 'ℑ', Imacr: 'Ī', ImaginaryI: 'ⅈ', Implies: '⇒', Int: '∬', Integral: '∫', Intersection: '⋂', InvisibleComma: '⁣', InvisibleTimes: '⁢', Iogon: 'Į', Iopf: '𝕀', Iscr: 'ℐ', Itilde: 'Ĩ', Iukcy: 'І', Iuml: 'Ï', Jcirc: 'Ĵ', Jcy: 'Й', Jfr: '𝔍', Jopf: '𝕁', Jscr: '𝒥', Jsercy: 'Ј', Jukcy: 'Є', KHcy: 'Х', KJcy: 'Ќ', Kcedil: 'Ķ', Kcy: 'К', Kfr: '𝔎', Kopf: '𝕂', Kscr: '𝒦', LJcy: 'Љ', Lacute: 'Ĺ', Lambda: 'Λ', Lang: '《', Laplacetrf: 'ℒ', Larr: '↞', Lcaron: 'Ľ', Lcedil: 'Ļ', Lcy: 'Л', LeftAngleBracket: '〈', LeftArrow: '←', LeftArrowBar: '⇤', LeftArrowRightArrow: '⇆', LeftCeiling: '⌈', LeftDoubleBracket: '〚', LeftDownTeeVector: '⥡', LeftDownVector: '⇃', LeftDownVectorBar: '⥙', LeftFloor: '⌊', LeftRightArrow: '↔', LeftRightVector: '⥎', LeftTee: '⊣', LeftTeeArrow: '↤', LeftTeeVector: '⥚', LeftTriangle: '⊲', LeftTriangleBar: '⧏', LeftTriangleEqual: '⊴', LeftUpDownVector: '⥑', LeftUpTeeVector: '⥠', LeftUpVector: '↿', LeftUpVectorBar: '⥘', LeftVector: '↼', LeftVectorBar: '⥒', Leftarrow: '⇐', Leftrightarrow: '⇔', LessEqualGreater: '⋚', LessFullEqual: '≦', LessGreater: '≶', LessLess: '⪡', LessSlantEqual: '⩽', LessTilde: '≲', Lfr: '𝔏', Ll: '⋘', Lleftarrow: '⇚', Lmidot: 'Ŀ', LongLeftArrow: '⟵', LongLeftRightArrow: '⟷', LongRightArrow: '⟶', Longleftarrow: '⟸', Longleftrightarrow: '⟺', Longrightarrow: '⟹', Lopf: '𝕃', LowerLeftArrow: '↙', LowerRightArrow: '↘', Lscr: 'ℒ', Lsh: '↰', Lstrok: 'Ł', Lt: '≪', Map: '⤅', Mcy: 'М', MediumSpace: ' ', Mellintrf: 'ℳ', Mfr: '𝔐', MinusPlus: '∓', Mopf: '𝕄', Mscr: 'ℳ', NJcy: 'Њ', Nacute: 'Ń', Ncaron: 'Ň', Ncedil: 'Ņ', Ncy: 'Н', NegativeMediumSpace: '​', NegativeThickSpace: '​', NegativeThinSpace: '​', NegativeVeryThinSpace: '​', NestedGreaterGreater: '≫', NestedLessLess: '≪', NewLine: ' ', Nfr: '𝔑', NoBreak: '⁠', NonBreakingSpace: ' ', Nopf: 'ℕ', Not: '⫬', NotCongruent: '≢', NotCupCap: '≭', NotDoubleVerticalBar: '∦', NotElement: '∉', NotEqual: '≠', NotEqualTilde: '≂̸', NotExists: '∄', NotGreater: '≯', NotGreaterEqual: '≱', NotGreaterFullEqual: '≦̸', NotGreaterGreater: '≫̸', NotGreaterLess: '≹', NotGreaterSlantEqual: '⩾̸', NotGreaterTilde: '≵', NotHumpDownHump: '≎̸', NotHumpEqual: '≏̸', NotLeftTriangle: '⋪', NotLeftTriangleBar: '⧏̸', NotLeftTriangleEqual: '⋬', NotLess: '≮', NotLessEqual: '≰', NotLessGreater: '≸', NotLessLess: '≪̸', NotLessSlantEqual: '⩽̸', NotLessTilde: '≴', NotNestedGreaterGreater: '⪢̸', NotNestedLessLess: '⪡̸', NotPrecedes: '⊀', NotPrecedesEqual: '⪯̸', NotPrecedesSlantEqual: '⋠', NotReverseElement: '∌', NotRightTriangle: '⋫', NotRightTriangleBar: '⧐̸', NotRightTriangleEqual: '⋭', NotSquareSubset: '⊏̸', NotSquareSubsetEqual: '⋢', NotSquareSuperset: '⊐̸', NotSquareSupersetEqual: '⋣', NotSubset: '⊂⃒', NotSubsetEqual: '⊈', NotSucceeds: '⊁', NotSucceedsEqual: '⪰̸', NotSucceedsSlantEqual: '⋡', NotSucceedsTilde: '≿̸', NotSuperset: '⊃⃒', NotSupersetEqual: '⊉', NotTilde: '≁', NotTildeEqual: '≄', NotTildeFullEqual: '≇', NotTildeTilde: '≉', NotVerticalBar: '∤', Nscr: '𝒩', Ntilde: 'Ñ', OElig: 'Œ', Oacute: 'Ó', Ocirc: 'Ô', Ocy: 'О', Odblac: 'Ő', Ofr: '𝔒', Ograve: 'Ò', Omacr: 'Ō', Omega: 'Ω', Oopf: '𝕆', OpenCurlyDoubleQuote: '“', OpenCurlyQuote: '‘', Or: '⩔', Oscr: '𝒪', Oslash: 'Ø', Otilde: 'Õ', Otimes: '⨷', Ouml: 'Ö', OverBar: '¯', OverBrace: '︷', OverBracket: '⎴', OverParenthesis: '︵', PartialD: '∂', Pcy: 'П', Pfr: '𝔓', Phi: 'Φ', Pi: 'Π', PlusMinus: '±', Poincareplane: 'ℌ', Popf: 'ℙ', Pr: '⪻', Precedes: '≺', PrecedesEqual: '⪯', PrecedesSlantEqual: '≼', PrecedesTilde: '≾', Prime: '″', Product: '∏', Proportion: '∷', Proportional: '∝', Pscr: '𝒫', Psi: 'Ψ', Qfr: '𝔔', Qopf: 'ℚ', Qscr: '𝒬', RBarr: '⤐', Racute: 'Ŕ', Rang: '》', Rarr: '↠', Rarrtl: '⤖', Rcaron: 'Ř', Rcedil: 'Ŗ', Rcy: 'Р', Re: 'ℜ', ReverseElement: '∋', ReverseEquilibrium: '⇋', ReverseUpEquilibrium: '⥯', Rfr: 'ℜ', RightAngleBracket: '〉', RightArrow: '→', RightArrowBar: '⇥', RightArrowLeftArrow: '⇄', RightCeiling: '⌉', RightDoubleBracket: '〛', RightDownTeeVector: '⥝', RightDownVector: '⇂', RightDownVectorBar: '⥕', RightFloor: '⌋', RightTee: '⊢', RightTeeArrow: '↦', RightTeeVector: '⥛', RightTriangle: '⊳', RightTriangleBar: '⧐', RightTriangleEqual: '⊵', RightUpDownVector: '⥏', RightUpTeeVector: '⥜', RightUpVector: '↾', RightUpVectorBar: '⥔', RightVector: '⇀', RightVectorBar: '⥓', Rightarrow: '⇒', Ropf: 'ℝ', RoundImplies: '⥰', Rrightarrow: '⇛', Rscr: 'ℛ', Rsh: '↱', RuleDelayed: '⧴', SHCHcy: 'Щ', SHcy: 'Ш', SOFTcy: 'Ь', Sacute: 'Ś', Sc: '⪼', Scaron: 'Š', Scedil: 'Ş', Scirc: 'Ŝ', Scy: 'С', Sfr: '𝔖', ShortDownArrow: '↓', ShortLeftArrow: '←', ShortRightArrow: '→', ShortUpArrow: '↑', Sigma: 'Σ', SmallCircle: '∘', Sopf: '𝕊', Sqrt: '√', Square: '□', SquareIntersection: '⊓', SquareSubset: '⊏', SquareSubsetEqual: '⊑', SquareSuperset: '⊐', SquareSupersetEqual: '⊒', SquareUnion: '⊔', Sscr: '𝒮', Star: '⋆', Sub: '⋐', Subset: '⋐', SubsetEqual: '⊆', Succeeds: '≻', SucceedsEqual: '⪰', SucceedsSlantEqual: '≽', SucceedsTilde: '≿', SuchThat: '∋', Sum: '∑', Sup: '⋑', Superset: '⊃', SupersetEqual: '⊇', Supset: '⋑', THORN: 'Þ', TSHcy: 'Ћ', TScy: 'Ц', Tab: ' ', Tcaron: 'Ť', Tcedil: 'Ţ', Tcy: 'Т', Tfr: '𝔗', Therefore: '∴', Theta: 'Θ', ThickSpace: '   ', ThinSpace: ' ', Tilde: '∼', TildeEqual: '≃', TildeFullEqual: '≅', TildeTilde: '≈', Topf: '𝕋', TripleDot: '⃛', Tscr: '𝒯', Tstrok: 'Ŧ', Uacute: 'Ú', Uarr: '↟', Uarrocir: '⥉', Ubrcy: 'Ў', Ubreve: 'Ŭ', Ucirc: 'Û', Ucy: 'У', Udblac: 'Ű', Ufr: '𝔘', Ugrave: 'Ù', Umacr: 'Ū', UnderBar: '̲', UnderBrace: '︸', UnderBracket: '⎵', UnderParenthesis: '︶', Union: '⋃', UnionPlus: '⊎', Uogon: 'Ų', Uopf: '𝕌', UpArrow: '↑', UpArrowBar: '⤒', UpArrowDownArrow: '⇅', UpDownArrow: '↕', UpEquilibrium: '⥮', UpTee: '⊥', UpTeeArrow: '↥', Uparrow: '⇑', Updownarrow: '⇕', UpperLeftArrow: '↖', UpperRightArrow: '↗', Upsi: 'ϒ', Upsilon: 'Υ', Uring: 'Ů', Uscr: '𝒰', Utilde: 'Ũ', Uuml: 'Ü', VDash: '⊫', Vbar: '⫫', Vcy: 'В', Vdash: '⊩', Vdashl: '⫦', Vee: '⋁', Verbar: '‖', Vert: '‖', VerticalBar: '∣', VerticalLine: '|', VerticalSeparator: '❘', VerticalTilde: '≀', VeryThinSpace: ' ', Vfr: '𝔙', Vopf: '𝕍', Vscr: '𝒱', Vvdash: '⊪', Wcirc: 'Ŵ', Wedge: '⋀', Wfr: '𝔚', Wopf: '𝕎', Wscr: '𝒲', Xfr: '𝔛', Xi: 'Ξ', Xopf: '𝕏', Xscr: '𝒳', YAcy: 'Я', YIcy: 'Ї', YUcy: 'Ю', Yacute: 'Ý', Ycirc: 'Ŷ', Ycy: 'Ы', Yfr: '𝔜', Yopf: '𝕐', Yscr: '𝒴', Yuml: 'Ÿ', ZHcy: 'Ж', Zacute: 'Ź', Zcaron: 'Ž', Zcy: 'З', Zdot: 'Ż', ZeroWidthSpace: '​', Zfr: 'ℨ', Zopf: 'ℤ', Zscr: '𝒵', aacute: 'á', abreve: 'ă', ac: '∾', acE: '∾̳', acd: '∿', acirc: 'â', acute: '´', acy: 'а', aelig: 'æ', af: '⁡', afr: '𝔞', agrave: 'à', aleph: 'ℵ', alpha: 'α', amacr: 'ā', amalg: '⨿', amp: '&', and: '∧', andand: '⩕', andd: '⩜', andslope: '⩘', andv: '⩚', ang: '∠', ange: '⦤', angle: '∠', angmsd: '∡', angmsdaa: '⦨', angmsdab: '⦩', angmsdac: '⦪', angmsdad: '⦫', angmsdae: '⦬', angmsdaf: '⦭', angmsdag: '⦮', angmsdah: '⦯', angrt: '∟', angrtvb: '⊾', angrtvbd: '⦝', angsph: '∢', angst: 'Å', angzarr: '⍼', aogon: 'ą', aopf: '𝕒', ap: '≈', apE: '⩰', apacir: '⩯', ape: '≊', apid: '≋', apos: ''', approx: '≈', approxeq: '≊', aring: 'å', ascr: '𝒶', ast: '*', asymp: '≈', asympeq: '≍', atilde: 'ã', auml: 'ä', awconint: '∳', awint: '⨑', bNot: '⫭', backcong: '≌', backepsilon: '϶', backprime: '‵', backsim: '∽', backsimeq: '⋍', barvee: '⊽', barwed: '⌅', barwedge: '⌅', bbrk: '⎵', bbrktbrk: '⎶', bcong: '≌', bcy: 'б', becaus: '∵', because: '∵', bemptyv: '⦰', bepsi: '϶', bernou: 'ℬ', beta: 'β', beth: 'ℶ', between: '≬', bfr: '𝔟', bigcap: '⋂', bigcirc: '◯', bigcup: '⋃', bigodot: '⨀', bigoplus: '⨁', bigotimes: '⨂', bigsqcup: '⨆', bigstar: '★', bigtriangledown: '▽', bigtriangleup: '△', biguplus: '⨄', bigvee: '⋁', bigwedge: '⋀', bkarow: '⤍', blacklozenge: '⧫', blacksquare: '▪', blacktriangle: '▴', blacktriangledown: '▾', blacktriangleleft: '◂', blacktriangleright: '▸', blank: '␣', blk12: '▒', blk14: '░', blk34: '▓', block: '█', bne: '=⃥', bnequiv: '≡⃥', bnot: '⌐', bopf: '𝕓', bot: '⊥', bottom: '⊥', bowtie: '⋈', boxDL: '╗', boxDR: '╔', boxDl: '╖', boxDr: '╓', boxH: '═', boxHD: '╦', boxHU: '╩', boxHd: '╤', boxHu: '╧', boxUL: '╝', boxUR: '╚', boxUl: '╜', boxUr: '╙', boxV: '║', boxVH: '╬', boxVL: '╣', boxVR: '╠', boxVh: '╫', boxVl: '╢', boxVr: '╟', boxbox: '⧉', boxdL: '╕', boxdR: '╒', boxdl: '┐', boxdr: '┌', boxh: '─', boxhD: '╥', boxhU: '╨', boxhd: '┬', boxhu: '┴', boxminus: '⊟', boxplus: '⊞', boxtimes: '⊠', boxuL: '╛', boxuR: '╘', boxul: '┘', boxur: '└', boxv: '│', boxvH: '╪', boxvL: '╡', boxvR: '╞', boxvh: '┼', boxvl: '┤', boxvr: '├', bprime: '‵', breve: '˘', brvbar: '¦', bscr: '𝒷', bsemi: '⁏', bsim: '∽', bsime: '⋍', bsol: '\', bsolb: '⧅', bsolhsub: '\⊂', bull: '•', bullet: '•', bump: '≎', bumpE: '⪮', bumpe: '≏', bumpeq: '≏', cacute: 'ć', cap: '∩', capand: '⩄', capbrcup: '⩉', capcap: '⩋', capcup: '⩇', capdot: '⩀', caps: '∩︀', caret: '⁁', caron: 'ˇ', ccaps: '⩍', ccaron: 'č', ccedil: 'ç', ccirc: 'ĉ', ccups: '⩌', ccupssm: '⩐', cdot: 'ċ', cedil: '¸', cemptyv: '⦲', cent: '¢', centerdot: '·', cfr: '𝔠', chcy: 'ч', check: '✓', checkmark: '✓', chi: 'χ', cir: '○', cirE: '⧃', circ: 'ˆ', circeq: '≗', circlearrowleft: '↺', circlearrowright: '↻', circledR: '®', circledS: 'Ⓢ', circledast: '⊛', circledcirc: '⊚', circleddash: '⊝', cire: '≗', cirfnint: '⨐', cirmid: '⫯', cirscir: '⧂', clubs: '♣', clubsuit: '♣', colon: ':', colone: '≔', coloneq: '≔', comma: ',', commat: '@', comp: '∁', compfn: '∘', complement: '∁', complexes: 'ℂ', cong: '≅', congdot: '⩭', conint: '∮', copf: '𝕔', coprod: '∐', copy: '©', copysr: '℗', cross: '✗', cscr: '𝒸', csub: '⫏', csube: '⫑', csup: '⫐', csupe: '⫒', ctdot: '⋯', cudarrl: '⤸', cudarrr: '⤵', cuepr: '⋞', cuesc: '⋟', cularr: '↶', cularrp: '⤽', cup: '∪', cupbrcap: '⩈', cupcap: '⩆', cupcup: '⩊', cupdot: '⊍', cupor: '⩅', cups: '∪︀', curarr: '↷', curarrm: '⤼', curlyeqprec: '⋞', curlyeqsucc: '⋟', curlyvee: '⋎', curlywedge: '⋏', curren: '¤', curvearrowleft: '↶', curvearrowright: '↷', cuvee: '⋎', cuwed: '⋏', cwconint: '∲', cwint: '∱', cylcty: '⌭', dArr: '⇓', dHar: '⥥', dagger: '†', daleth: 'ℸ', darr: '↓', dash: '‐', dashv: '⊣', dbkarow: '⤏', dblac: '˝', dcaron: 'ď', dcy: 'д', dd: 'ⅆ', ddagger: '‡', ddarr: '⇊', ddotseq: '⩷', deg: '°', delta: 'δ', demptyv: '⦱', dfisht: '⥿', dfr: '𝔡', dharl: '⇃', dharr: '⇂', diam: '⋄', diamond: '⋄', diamondsuit: '♦', diams: '♦', die: '¨', digamma: 'ϝ', disin: '⋲', div: '÷', divide: '÷', divideontimes: '⋇', divonx: '⋇', djcy: 'ђ', dlcorn: '⌞', dlcrop: '⌍', dollar: '$', dopf: '𝕕', dot: '˙', doteq: '≐', doteqdot: '≑', dotminus: '∸', dotplus: '∔', dotsquare: '⊡', doublebarwedge: '⌆', downarrow: '↓', downdownarrows: '⇊', downharpoonleft: '⇃', downharpoonright: '⇂', drbkarow: '⤐', drcorn: '⌟', drcrop: '⌌', dscr: '𝒹', dscy: 'ѕ', dsol: '⧶', dstrok: 'đ', dtdot: '⋱', dtri: '▿', dtrif: '▾', duarr: '⇵', duhar: '⥯', dwangle: '⦦', dzcy: 'џ', dzigrarr: '⟿', eDDot: '⩷', eDot: '≑', eacute: 'é', easter: '⩮', ecaron: 'ě', ecir: '≖', ecirc: 'ê', ecolon: '≕', ecy: 'э', edot: 'ė', ee: 'ⅇ', efDot: '≒', efr: '𝔢', eg: '⪚', egrave: 'è', egs: '⪖', egsdot: '⪘', el: '⪙', elinters: '�', ell: 'ℓ', els: '⪕', elsdot: '⪗', emacr: 'ē', empty: '∅', emptyset: '∅', emptyv: '∅', emsp: ' ', emsp13: ' ', emsp14: ' ', eng: 'ŋ', ensp: ' ', eogon: 'ę', eopf: '𝕖', epar: '⋕', eparsl: '⧣', eplus: '⩱', epsi: 'ϵ', epsiv: 'ε', eqcirc: '≖', eqcolon: '≕', eqsim: '≂', eqslantgtr: '⪖', eqslantless: '⪕', equals: '=', equest: '≟', equiv: '≡', equivDD: '⩸', eqvparsl: '⧥', erDot: '≓', erarr: '⥱', escr: 'ℯ', esdot: '≐', esim: '≂', eta: 'η', eth: 'ð', euml: 'ë', excl: '!', exist: '∃', expectation: 'ℰ', exponentiale: 'ⅇ', fallingdotseq: '≒', fcy: 'ф', female: '♀', ffilig: 'ffi', fflig: 'ff', ffllig: 'ffl', ffr: '𝔣', filig: 'fi', flat: '♭', fllig: 'fl', fltns: '▱', fnof: 'ƒ', fopf: '𝕗', forall: '∀', fork: '⋔', forkv: '⫙', fpartint: '⨍', frac12: '½', frac13: '⅓', frac14: '¼', frac15: '⅕', frac16: '⅙', frac18: '⅛', frac23: '⅔', frac25: '⅖', frac34: '¾', frac35: '⅗', frac38: '⅜', frac45: '⅘', frac56: '⅚', frac58: '⅝', frac78: '⅞', frown: '⌢', fscr: '𝒻', gE: '≧', gEl: '⪌', gacute: 'ǵ', gamma: 'γ', gammad: 'ϝ', gap: '⪆', gbreve: 'ğ', gcirc: 'ĝ', gcy: 'г', gdot: 'ġ', ge: '≥', gel: '⋛', geq: '≥', geqq: '≧', geqslant: '⩾', ges: '⩾', gescc: '⪩', gesdot: '⪀', gesdoto: '⪂', gesdotol: '⪄', gesl: '⋛︀', gesles: '⪔', gfr: '𝔤', gg: '≫', ggg: '⋙', gimel: 'ℷ', gjcy: 'ѓ', gl: '≷', glE: '⪒', gla: '⪥', glj: '⪤', gnE: '≩', gnap: '⪊', gnapprox: '⪊', gne: '⪈', gneq: '⪈', gneqq: '≩', gnsim: '⋧', gopf: '𝕘', grave: '`', gscr: 'ℊ', gsim: '≳', gsime: '⪎', gsiml: '⪐', gt: '>', gtcc: '⪧', gtcir: '⩺', gtdot: '⋗', gtlPar: '⦕', gtquest: '⩼', gtrapprox: '⪆', gtrarr: '⥸', gtrdot: '⋗', gtreqless: '⋛', gtreqqless: '⪌', gtrless: '≷', gtrsim: '≳', gvertneqq: '≩︀', gvnE: '≩︀', hArr: '⇔', hairsp: ' ', half: '½', hamilt: 'ℋ', hardcy: 'ъ', harr: '↔', harrcir: '⥈', harrw: '↭', hbar: 'ℏ', hcirc: 'ĥ', hearts: '♥', heartsuit: '♥', hellip: '…', hercon: '⊹', hfr: '𝔥', hksearow: '⤥', hkswarow: '⤦', hoarr: '⇿', homtht: '∻', hookleftarrow: '↩', hookrightarrow: '↪', hopf: '𝕙', horbar: '―', hscr: '𝒽', hslash: 'ℏ', hstrok: 'ħ', hybull: '⁃', hyphen: '‐', iacute: 'í', ic: '⁣', icirc: 'î', icy: 'и', iecy: 'е', iexcl: '¡', iff: '⇔', ifr: '𝔦', igrave: 'ì', ii: 'ⅈ', iiiint: '⨌', iiint: '∭', iinfin: '⧜', iiota: '℩', ijlig: 'ij', imacr: 'ī', image: 'ℑ', imagline: 'ℐ', imagpart: 'ℑ', imath: 'ı', imof: '⊷', imped: 'Ƶ', in: '∈', incare: '℅', infin: '∞', infintie: '⧝', inodot: 'ı', int: '∫', intcal: '⊺', integers: 'ℤ', intercal: '⊺', intlarhk: '⨗', intprod: '⨼', iocy: 'ё', iogon: 'į', iopf: '𝕚', iota: 'ι', iprod: '⨼', iquest: '¿', iscr: '𝒾', isin: '∈', isinE: '⋹', isindot: '⋵', isins: '⋴', isinsv: '⋳', isinv: '∈', it: '⁢', itilde: 'ĩ', iukcy: 'і', iuml: 'ï', jcirc: 'ĵ', jcy: 'й', jfr: '𝔧', jmath: 'j', jopf: '𝕛', jscr: '𝒿', jsercy: 'ј', jukcy: 'є', kappa: 'κ', kappav: 'ϰ', kcedil: 'ķ', kcy: 'к', kfr: '𝔨', kgreen: 'ĸ', khcy: 'х', kjcy: 'ќ', kopf: '𝕜', kscr: '𝓀', lAarr: '⇚', lArr: '⇐', lAtail: '⤛', lBarr: '⤎', lE: '≦', lEg: '⪋', lHar: '⥢', lacute: 'ĺ', laemptyv: '⦴', lagran: 'ℒ', lambda: 'λ', lang: '〈', langd: '⦑', langle: '〈', lap: '⪅', laquo: '«', larr: '←', larrb: '⇤', larrbfs: '⤟', larrfs: '⤝', larrhk: '↩', larrlp: '↫', larrpl: '⤹', larrsim: '⥳', larrtl: '↢', lat: '⪫', latail: '⤙', late: '⪭', lates: '⪭︀', lbarr: '⤌', lbbrk: '〔', lbrace: '{', lbrack: '[', lbrke: '⦋', lbrksld: '⦏', lbrkslu: '⦍', lcaron: 'ľ', lcedil: 'ļ', lceil: '⌈', lcub: '{', lcy: 'л', ldca: '⤶', ldquo: '“', ldquor: '„', ldrdhar: '⥧', ldrushar: '⥋', ldsh: '↲', le: '≤', leftarrow: '←', leftarrowtail: '↢', leftharpoondown: '↽', leftharpoonup: '↼', leftleftarrows: '⇇', leftrightarrow: '↔', leftrightarrows: '⇆', leftrightharpoons: '⇋', leftrightsquigarrow: '↭', leftthreetimes: '⋋', leg: '⋚', leq: '≤', leqq: '≦', leqslant: '⩽', les: '⩽', lescc: '⪨', lesdot: '⩿', lesdoto: '⪁', lesdotor: '⪃', lesg: '⋚︀', lesges: '⪓', lessapprox: '⪅', lessdot: '⋖', lesseqgtr: '⋚', lesseqqgtr: '⪋', lessgtr: '≶', lesssim: '≲', lfisht: '⥼', lfloor: '⌊', lfr: '𝔩', lg: '≶', lgE: '⪑', lhard: '↽', lharu: '↼', lharul: '⥪', lhblk: '▄', ljcy: 'љ', ll: '≪', llarr: '⇇', llcorner: '⌞', llhard: '⥫', lltri: '◺', lmidot: 'ŀ', lmoust: '⎰', lmoustache: '⎰', lnE: '≨', lnap: '⪉', lnapprox: '⪉', lne: '⪇', lneq: '⪇', lneqq: '≨', lnsim: '⋦', loang: '〘', loarr: '⇽', lobrk: '〚', longleftarrow: '⟵', longleftrightarrow: '⟷', longmapsto: '⟼', longrightarrow: '⟶', looparrowleft: '↫', looparrowright: '↬', lopar: '⦅', lopf: '𝕝', loplus: '⨭', lotimes: '⨴', lowast: '∗', lowbar: '_', loz: '◊', lozenge: '◊', lozf: '⧫', lpar: '(', lparlt: '⦓', lrarr: '⇆', lrcorner: '⌟', lrhar: '⇋', lrhard: '⥭', lrtri: '⊿', lscr: '𝓁', lsh: '↰', lsim: '≲', lsime: '⪍', lsimg: '⪏', lsqb: '[', lsquo: '‘', lsquor: '‚', lstrok: 'ł', lt: '<', ltcc: '⪦', ltcir: '⩹', ltdot: '⋖', lthree: '⋋', ltimes: '⋉', ltlarr: '⥶', ltquest: '⩻', ltrPar: '⦖', ltri: '◃', ltrie: '⊴', ltrif: '◂', lurdshar: '⥊', luruhar: '⥦', lvertneqq: '≨︀', lvnE: '≨︀', mDDot: '∺', macr: '¯', male: '♂', malt: '✠', maltese: '✠', map: '↦', mapsto: '↦', mapstodown: '↧', mapstoleft: '↤', mapstoup: '↥', marker: '▮', mcomma: '⨩', mcy: 'м', mdash: '—', measuredangle: '∡', mfr: '𝔪', mho: '℧', micro: 'µ', mid: '∣', midast: '*', midcir: '⫰', middot: '·', minus: '−', minusb: '⊟', minusd: '∸', minusdu: '⨪', mlcp: '⫛', mldr: '…', mnplus: '∓', models: '⊧', mopf: '𝕞', mp: '∓', mscr: '𝓂', mstpos: '∾', mu: 'μ', multimap: '⊸', mumap: '⊸', nGg: '⋙̸', nGt: '≫⃒', nGtv: '≫̸', nLeftarrow: '⇍', nLeftrightarrow: '⇎', nLl: '⋘̸', nLt: '≪⃒', nLtv: '≪̸', nRightarrow: '⇏', nVDash: '⊯', nVdash: '⊮', nabla: '∇', nacute: 'ń', nang: '∠⃒', nap: '≉', napE: '⩰̸', napid: '≋̸', napos: 'ʼn', napprox: '≉', natur: '♮', natural: '♮', naturals: 'ℕ', nbsp: ' ', nbump: '≎̸', nbumpe: '≏̸', ncap: '⩃', ncaron: 'ň', ncedil: 'ņ', ncong: '≇', ncongdot: '⩭̸', ncup: '⩂', ncy: 'н', ndash: '–', ne: '≠', neArr: '⇗', nearhk: '⤤', nearr: '↗', nearrow: '↗', nedot: '≐̸', nequiv: '≢', nesear: '⤨', nesim: '≂̸', nexist: '∄', nexists: '∄', nfr: '𝔫', ngE: '≧̸', nge: '≱', ngeq: '≱', ngeqq: '≧̸', ngeqslant: '⩾̸', nges: '⩾̸', ngsim: '≵', ngt: '≯', ngtr: '≯', nhArr: '⇎', nharr: '↮', nhpar: '⫲', ni: '∋', nis: '⋼', nisd: '⋺', niv: '∋', njcy: 'њ', nlArr: '⇍', nlE: '≦̸', nlarr: '↚', nldr: '‥', nle: '≰', nleftarrow: '↚', nleftrightarrow: '↮', nleq: '≰', nleqq: '≦̸', nleqslant: '⩽̸', nles: '⩽̸', nless: '≮', nlsim: '≴', nlt: '≮', nltri: '⋪', nltrie: '⋬', nmid: '∤', nopf: '𝕟', not: '¬', notin: '∉', notinE: '⋹̸', notindot: '⋵̸', notinva: '∉', notinvb: '⋷', notinvc: '⋶', notni: '∌', notniva: '∌', notnivb: '⋾', notnivc: '⋽', npar: '∦', nparallel: '∦', nparsl: '⫽⃥', npart: '∂̸', npolint: '⨔', npr: '⊀', nprcue: '⋠', npre: '⪯̸', nprec: '⊀', npreceq: '⪯̸', nrArr: '⇏', nrarr: '↛', nrarrc: '⤳̸', nrarrw: '↝̸', nrightarrow: '↛', nrtri: '⋫', nrtrie: '⋭', nsc: '⊁', nsccue: '⋡', nsce: '⪰̸', nscr: '𝓃', nshortmid: '∤', nshortparallel: '∦', nsim: '≁', nsime: '≄', nsimeq: '≄', nsmid: '∤', nspar: '∦', nsqsube: '⋢', nsqsupe: '⋣', nsub: '⊄', nsubE: '⫅̸', nsube: '⊈', nsubset: '⊂⃒', nsubseteq: '⊈', nsubseteqq: '⫅̸', nsucc: '⊁', nsucceq: '⪰̸', nsup: '⊅', nsupE: '⫆̸', nsupe: '⊉', nsupset: '⊃⃒', nsupseteq: '⊉', nsupseteqq: '⫆̸', ntgl: '≹', ntilde: 'ñ', ntlg: '≸', ntriangleleft: '⋪', ntrianglelefteq: '⋬', ntriangleright: '⋫', ntrianglerighteq: '⋭', nu: 'ν', num: '#', numero: '№', numsp: ' ', nvDash: '⊭', nvHarr: '⤄', nvap: '≍⃒', nvdash: '⊬', nvge: '≥⃒', nvgt: '>⃒', nvinfin: '⧞', nvlArr: '⤂', nvle: '≤⃒', nvlt: '<⃒', nvltrie: '⊴⃒', nvrArr: '⤃', nvrtrie: '⊵⃒', nvsim: '∼⃒', nwArr: '⇖', nwarhk: '⤣', nwarr: '↖', nwarrow: '↖', nwnear: '⤧', oS: 'Ⓢ', oacute: 'ó', oast: '⊛', ocir: '⊚', ocirc: 'ô', ocy: 'о', odash: '⊝', odblac: 'ő', odiv: '⨸', odot: '⊙', odsold: '⦼', oelig: 'œ', ofcir: '⦿', ofr: '𝔬', ogon: '˛', ograve: 'ò', ogt: '⧁', ohbar: '⦵', ohm: 'Ω', oint: '∮', olarr: '↺', olcir: '⦾', olcross: '⦻', olt: '⧀', omacr: 'ō', omega: 'ω', omid: '⦶', ominus: '⊖', oopf: '𝕠', opar: '⦷', operp: '⦹', oplus: '⊕', or: '∨', orarr: '↻', ord: '⩝', order: 'ℴ', orderof: 'ℴ', ordf: 'ª', ordm: 'º', origof: '⊶', oror: '⩖', orslope: '⩗', orv: '⩛', oscr: 'ℴ', oslash: 'ø', osol: '⊘', otilde: 'õ', otimes: '⊗', otimesas: '⨶', ouml: 'ö', ovbar: '⌽', par: '∥', para: '¶', parallel: '∥', parsim: '⫳', parsl: '⫽', part: '∂', pcy: 'п', percnt: '%', period: '.', permil: '‰', perp: '⊥', pertenk: '‱', pfr: '𝔭', phi: 'ϕ', phiv: 'φ', phmmat: 'ℳ', phone: '☎', pi: 'π', pitchfork: '⋔', piv: 'ϖ', planck: 'ℏ', planckh: 'ℎ', plankv: 'ℏ', plus: '+', plusacir: '⨣', plusb: '⊞', pluscir: '⨢', plusdo: '∔', plusdu: '⨥', pluse: '⩲', plusmn: '±', plussim: '⨦', plustwo: '⨧', pm: '±', pointint: '⨕', popf: '𝕡', pound: '£', pr: '≺', prE: '⪳', prap: '⪷', prcue: '≼', pre: '⪯', prec: '≺', precapprox: '⪷', preccurlyeq: '≼', preceq: '⪯', precnapprox: '⪹', precneqq: '⪵', precnsim: '⋨', precsim: '≾', prime: '′', primes: 'ℙ', prnE: '⪵', prnap: '⪹', prnsim: '⋨', prod: '∏', profalar: '⌮', profline: '⌒', profsurf: '⌓', prop: '∝', propto: '∝', prsim: '≾', prurel: '⊰', pscr: '𝓅', psi: 'ψ', puncsp: ' ', qfr: '𝔮', qint: '⨌', qopf: '𝕢', qprime: '⁗', qscr: '𝓆', quaternions: 'ℍ', quatint: '⨖', quest: '?', questeq: '≟', quot: '"', rAarr: '⇛', rArr: '⇒', rAtail: '⤜', rBarr: '⤏', rHar: '⥤', race: '⧚', racute: 'ŕ', radic: '√', raemptyv: '⦳', rang: '〉', rangd: '⦒', range: '⦥', rangle: '〉', raquo: '»', rarr: '→', rarrap: '⥵', rarrb: '⇥', rarrbfs: '⤠', rarrc: '⤳', rarrfs: '⤞', rarrhk: '↪', rarrlp: '↬', rarrpl: '⥅', rarrsim: '⥴', rarrtl: '↣', rarrw: '↝', ratail: '⤚', ratio: '∶', rationals: 'ℚ', rbarr: '⤍', rbbrk: '〕', rbrace: '}', rbrack: ']', rbrke: '⦌', rbrksld: '⦎', rbrkslu: '⦐', rcaron: 'ř', rcedil: 'ŗ', rceil: '⌉', rcub: '}', rcy: 'р', rdca: '⤷', rdldhar: '⥩', rdquo: '”', rdquor: '”', rdsh: '↳', real: 'ℜ', realine: 'ℛ', realpart: 'ℜ', reals: 'ℝ', rect: '▭', reg: '®', rfisht: '⥽', rfloor: '⌋', rfr: '𝔯', rhard: '⇁', rharu: '⇀', rharul: '⥬', rho: 'ρ', rhov: 'ϱ', rightarrow: '→', rightarrowtail: '↣', rightharpoondown: '⇁', rightharpoonup: '⇀', rightleftarrows: '⇄', rightleftharpoons: '⇌', rightrightarrows: '⇉', rightsquigarrow: '↝', rightthreetimes: '⋌', ring: '˚', risingdotseq: '≓', rlarr: '⇄', rlhar: '⇌', rmoust: '⎱', rmoustache: '⎱', rnmid: '⫮', roang: '〙', roarr: '⇾', robrk: '〛', ropar: '⦆', ropf: '𝕣', roplus: '⨮', rotimes: '⨵', rpar: ')', rpargt: '⦔', rppolint: '⨒', rrarr: '⇉', rscr: '𝓇', rsh: '↱', rsqb: ']', rsquo: '’', rsquor: '’', rthree: '⋌', rtimes: '⋊', rtri: '▹', rtrie: '⊵', rtrif: '▸', rtriltri: '⧎', ruluhar: '⥨', rx: '℞', sacute: 'ś', sc: '≻', scE: '⪴', scap: '⪸', scaron: 'š', sccue: '≽', sce: '⪰', scedil: 'ş', scirc: 'ŝ', scnE: '⪶', scnap: '⪺', scnsim: '⋩', scpolint: '⨓', scsim: '≿', scy: 'с', sdot: '⋅', sdotb: '⊡', sdote: '⩦', seArr: '⇘', searhk: '⤥', searr: '↘', searrow: '↘', sect: '§', semi: ';', seswar: '⤩', setminus: '∖', setmn: '∖', sext: '✶', sfr: '𝔰', sfrown: '⌢', sharp: '♯', shchcy: 'щ', shcy: 'ш', shortmid: '∣', shortparallel: '∥', shy: '­', sigma: 'σ', sigmav: 'ς', sim: '∼', simdot: '⩪', sime: '≃', simeq: '≃', simg: '⪞', simgE: '⪠', siml: '⪝', simlE: '⪟', simne: '≆', simplus: '⨤', simrarr: '⥲', slarr: '←', smallsetminus: '∖', smashp: '⨳', smeparsl: '⧤', smid: '∣', smile: '⌣', smt: '⪪', smte: '⪬', smtes: '⪬︀', softcy: 'ь', sol: '/', solb: '⧄', solbar: '⌿', sopf: '𝕤', spades: '♠', spadesuit: '♠', spar: '∥', sqcap: '⊓', sqcaps: '⊓︀', sqcup: '⊔', sqcups: '⊔︀', sqsub: '⊏', sqsube: '⊑', sqsubset: '⊏', sqsubseteq: '⊑', sqsup: '⊐', sqsupe: '⊒', sqsupset: '⊐', sqsupseteq: '⊒', squ: '□', square: '□', squarf: '▪', squf: '▪', srarr: '→', sscr: '𝓈', ssetmn: '∖', ssmile: '⌣', sstarf: '⋆', star: '☆', starf: '★', straightepsilon: 'ϵ', straightphi: 'ϕ', strns: '¯', sub: '⊂', subE: '⫅', subdot: '⪽', sube: '⊆', subedot: '⫃', submult: '⫁', subnE: '⫋', subne: '⊊', subplus: '⪿', subrarr: '⥹', subset: '⊂', subseteq: '⊆', subseteqq: '⫅', subsetneq: '⊊', subsetneqq: '⫋', subsim: '⫇', subsub: '⫕', subsup: '⫓', succ: '≻', succapprox: '⪸', succcurlyeq: '≽', succeq: '⪰', succnapprox: '⪺', succneqq: '⪶', succnsim: '⋩', succsim: '≿', sum: '∑', sung: '♪', sup: '⊃', sup1: '¹', sup2: '²', sup3: '³', supE: '⫆', supdot: '⪾', supdsub: '⫘', supe: '⊇', supedot: '⫄', suphsol: '⊃/', suphsub: '⫗', suplarr: '⥻', supmult: '⫂', supnE: '⫌', supne: '⊋', supplus: '⫀', supset: '⊃', supseteq: '⊇', supseteqq: '⫆', supsetneq: '⊋', supsetneqq: '⫌', supsim: '⫈', supsub: '⫔', supsup: '⫖', swArr: '⇙', swarhk: '⤦', swarr: '↙', swarrow: '↙', swnwar: '⤪', szlig: 'ß', target: '⌖', tau: 'τ', tbrk: '⎴', tcaron: 'ť', tcedil: 'ţ', tcy: 'т', tdot: '⃛', telrec: '⌕', tfr: '𝔱', there4: '∴', therefore: '∴', theta: 'θ', thetav: 'ϑ', thickapprox: '≈', thicksim: '∼', thinsp: ' ', thkap: '≈', thksim: '∼', thorn: 'þ', tilde: '˜', times: '×', timesb: '⊠', timesbar: '⨱', timesd: '⨰', tint: '∭', toea: '⤨', top: '⊤', topbot: '⌶', topcir: '⫱', topf: '𝕥', topfork: '⫚', tosa: '⤩', tprime: '‴', trade: '™', triangle: '▵', triangledown: '▿', triangleleft: '◃', trianglelefteq: '⊴', triangleq: '≜', triangleright: '▹', trianglerighteq: '⊵', tridot: '◬', trie: '≜', triminus: '⨺', triplus: '⨹', trisb: '⧍', tritime: '⨻', trpezium: '�', tscr: '𝓉', tscy: 'ц', tshcy: 'ћ', tstrok: 'ŧ', twixt: '≬', twoheadleftarrow: '↞', twoheadrightarrow: '↠', uArr: '⇑', uHar: '⥣', uacute: 'ú', uarr: '↑', ubrcy: 'ў', ubreve: 'ŭ', ucirc: 'û', ucy: 'у', udarr: '⇅', udblac: 'ű', udhar: '⥮', ufisht: '⥾', ufr: '𝔲', ugrave: 'ù', uharl: '↿', uharr: '↾', uhblk: '▀', ulcorn: '⌜', ulcorner: '⌜', ulcrop: '⌏', ultri: '◸', umacr: 'ū', uml: '¨', uogon: 'ų', uopf: '𝕦', uparrow: '↑', updownarrow: '↕', upharpoonleft: '↿', upharpoonright: '↾', uplus: '⊎', upsi: 'υ', upsilon: 'υ', upuparrows: '⇈', urcorn: '⌝', urcorner: '⌝', urcrop: '⌎', uring: 'ů', urtri: '◹', uscr: '𝓊', utdot: '⋰', utilde: 'ũ', utri: '▵', utrif: '▴', uuarr: '⇈', uuml: 'ü', uwangle: '⦧', vArr: '⇕', vBar: '⫨', vBarv: '⫩', vDash: '⊨', vangrt: '⦜', varepsilon: 'ε', varkappa: 'ϰ', varnothing: '∅', varphi: 'φ', varpi: 'ϖ', varpropto: '∝', varr: '↕', varrho: 'ϱ', varsigma: 'ς', varsubsetneq: '⊊︀', varsubsetneqq: '⫋︀', varsupsetneq: '⊋︀', varsupsetneqq: '⫌︀', vartheta: 'ϑ', vartriangleleft: '⊲', vartriangleright: '⊳', vcy: 'в', vdash: '⊢', vee: '∨', veebar: '⊻', veeeq: '≚', vellip: '⋮', verbar: '|', vert: '|', vfr: '𝔳', vltri: '⊲', vnsub: '⊂⃒', vnsup: '⊃⃒', vopf: '𝕧', vprop: '∝', vrtri: '⊳', vscr: '𝓋', vsubnE: '⫋︀', vsubne: '⊊︀', vsupnE: '⫌︀', vsupne: '⊋︀', vzigzag: '⦚', wcirc: 'ŵ', wedbar: '⩟', wedge: '∧', wedgeq: '≙', weierp: '℘', wfr: '𝔴', wopf: '𝕨', wp: '℘', wr: '≀', wreath: '≀', wscr: '𝓌', xcap: '⋂', xcirc: '◯', xcup: '⋃', xdtri: '▽', xfr: '𝔵', xhArr: '⟺', xharr: '⟷', xi: 'ξ', xlArr: '⟸', xlarr: '⟵', xmap: '⟼', xnis: '⋻', xodot: '⨀', xopf: '𝕩', xoplus: '⨁', xotime: '⨂', xrArr: '⟹', xrarr: '⟶', xscr: '𝓍', xsqcup: '⨆', xuplus: '⨄', xutri: '△', xvee: '⋁', xwedge: '⋀', yacute: 'ý', yacy: 'я', ycirc: 'ŷ', ycy: 'ы', yen: '¥', yfr: '𝔶', yicy: 'ї', yopf: '𝕪', yscr: '𝓎', yucy: 'ю', yuml: 'ÿ', zacute: 'ź', zcaron: 'ž', zcy: 'з', zdot: 'ż', zeetrf: 'ℨ', zeta: 'ζ', zfr: '𝔷', zhcy: 'ж', zigrarr: '⇝', zopf: '𝕫', zscr: '𝓏' } end end end require 'math_ml' math_ml-1.0.0/lib/math_ml/latex.rb0000644000004100000410000007601614700510662017025 0ustar www-datawww-datarequire 'math_ml/latex/builtin' module MathML module LaTeX MBEC = /\\.|[^\\]/m module RE SPACE = /(?:\s|%.*$)/ NUMERICS = /(?:\.\d+)|(?:\d+(\.\d+)?)/ OPERATORS = %r{[,.+\-*=/()\[\]<>"|;:!]} ALPHABETS = /[a-zA-Z]/ BLOCK = /\A\{(.*?)\}\z/m OPTION = /\A\[(.*)\]\z/m COMMANDS = /\\([a-zA-Z]+|[^a-zA-Z])/ WBSLASH = /\\\\/ BRACES = /\A([.|\[\]()<>])\z/ end module Font NORMAL = 0 BOLD = 1 BLACKBOLD = 2 SCRIPT = 3 FRAKTUR = 4 ROMAN = 5 BOLD_ITALIC = 6 end class BlockNotClosed < StandardError; end class NotEnvironment < StandardError; end class EnvironmentNotEnd < StandardError; end class NeedParameter < StandardError; end class EndMismatchToBegin < StandardError; end class OptionNotClosed < StandardError; end class Scanner < StringScanner def done string[0, pos] end def scan_space _scan(/#{RE::SPACE}+/) end def skip_space_and(check_mode) opos = pos scan_space r = yield self.pos = opos if check_mode || !r r end unless instance_methods.include?('_eos?') alias _eos? eos? alias _check check alias _scan scan end def check(re) skip_space_and(true) { _check(re) } end def scan(re) skip_space_and(false) { _scan(re) } end def eos? _eos? || _check(/#{RE::SPACE}+\z/) end def check_command check(RE::COMMANDS) end def scan_command scan(RE::COMMANDS) end def peek_command check_command ? self[1] : nil end def check_block skip_space_and(true) { scan_block } end def scan_block return nil unless scan(/\{/) block = '{' bpos = pos - 1 nest = 1 while _scan(/(#{MBEC}*?)([{}])/) block << matched case self[2] when '{' nest += 1 when '}' nest -= 1 break if nest == 0 end end if nest > 0 self.pos = bpos raise BlockNotClosed end self.pos = bpos _scan(/\A\{(#{Regexp.escape(block[RE::BLOCK, 1].to_s)})\}/) end def check_any(remain_space = false) skip_space_and(true) { scan_any(remain_space) } end def scan_any(remain_space = false) p = pos scan_space r = remain_space ? matched.to_s : '' case when s = scan_block when s = scan_command else unless _scan(/./) || remain_space self.pos = p return nil end s = matched.to_s end r + s end def scan_option return nil unless scan(/\[/) opt = '[' p = pos - 1 until (s = scan_any(true)) =~ /\A#{RE::SPACE}*\]\z/ opt << s if eos? self.pos = p raise OptionNotClosed end end opt << s self.pos = p _scan(/\A\[(#{Regexp.escape(opt[RE::OPTION, 1].to_s)})\]/) end def check_option skip_space_and(true) { scan_option } end end class ParseError < StandardError attr_accessor :rest, :done def initialize(message, rest = '', done = '') @done = done @rest = rest super(message) end def inspect "#{message} : '#{@done}' / '#{@rest}'\n" + backtrace[0..5].join("\n") end end class Macro class Command attr_reader :num, :body, :option def initialize(n, b, o) @num = n @body = b @option = o end end class Environment attr_reader :num, :beginning, :ending, :option def initialize(n, b, e, o) @num = n @beginning = b @ending = e @option = o end end def initialize @commands = {} @environments = {} end def parse_error(message, rest = '', whole = nil) rest = whole[/\A.*?(#{Regexp.escape(rest)}.*\z)/, 1] if whole rest << @scanner.rest done = @scanner.string[0, @scanner.string.size - rest.size] ParseError.new(message, rest, done) end def parse(src) @scanner = Scanner.new(src) until @scanner.eos? unless @scanner.scan_command @scanner.scan_space raise parse_error('Syntax error.') end case @scanner[1] when 'newcommand' parse_newcommand when 'newenvironment' parse_newenvironment else raise parse_error('Syntax error.', @scanner.matched) end end rescue BlockNotClosed => e raise parse_error('Block not closed.') rescue OptionNotClosed => e raise parse_error('Option not closed.') end def scan_num_of_parameter if @scanner.scan_option unless @scanner[1] =~ /\A#{RE::SPACE}*\d+#{RE::SPACE}*\z/ raise parse_error('Need positive number.', @scanner[1] + ']') end @scanner[1].to_i else 0 end end def check_parameter_numbers(src, opt, whole) s = Scanner.new(src) until s.eos? case when s.scan(/#{MBEC}*?\#(\d+|.)/) raise parse_error('Need positive number.') unless s[1] =~ /\d+/ raise parse_error("Parameter \# too large.", s[1] + s.rest, whole) if s[1].to_i > opt else return nil end end end def parse_newcommand if @scanner.scan_block s = Scanner.new(@scanner[1]) raise parse_error('Need newcommand.', s.rest + '}') unless s.scan_command com = s[1] raise parse_error('Syntax error.', s.rest + '}') unless s.eos? elsif @scanner.scan_command s = Scanner.new(@scanner[1]) com = s.scan_command else raise parse_error('Need newcommand.') end optnum = scan_num_of_parameter opt = @scanner.scan_option ? @scanner[1] : nil body = if @scanner.scan_block @scanner[1] elsif @scanner.scan_command @scanner.matched else @scanner.scan(/./) end raise parse_error('Need parameter.') unless body check_parameter_numbers(body, optnum, @scanner.matched) optnum -= 1 if opt @commands[com] = Command.new(optnum, body, opt) end def parse_newenvironment if @scanner.scan_block env = @scanner[1] elsif @scanner.scan_command raise ParseError elsif @scanner.scan(/./) env = @scanner.matched end raise parse_error('Syntax error.', env[/\A.*?(\\.*\z)/, 1], @scanner.matched) if env =~ /\\/ optnum = scan_num_of_parameter opt = @scanner.scan_option ? @scanner[1] : nil b = @scanner.scan_block ? @scanner[1] : @scanner.scan_any raise parse_error('Need begin block.') unless b check_parameter_numbers(b, optnum, @scanner.matched) e = @scanner.scan_block ? @scanner[1] : @scanner.scan_any raise parse_error('Need end block.') unless e check_parameter_numbers(e, optnum, @scanner.matched) optnum -= 1 if opt @environments[env] = Environment.new(optnum, b, e, opt) end def commands(com) @commands[com] end def expand_command(com, params, opt = nil) return nil unless @commands.has_key?(com) c = @commands[com] opt = c.option if c.option && !opt params.unshift(opt) if c.option raise ParseError, 'Need more parameter.' if params.size < c.num c.body.gsub(/(#{MBEC}*?)\#(\d+)/) do $1.to_s << params[$2.to_i - 1] end end def environments(env) @environments[env] end def expand_environment(env, body, params, opt = nil) return nil unless @environments.has_key?(env) e = @environments[env] opt = e.option if e.option && !opt params.unshift(opt) if e.option raise ParseError, 'Need more parameter.' if params.size < e.num bg = e.beginning.gsub(/(#{MBEC}*?)\#(\d+)/) do $1.to_s << params[$2.to_i - 1] end en = e.ending.gsub(/(#{MBEC}*?)\#(\d+)/) do $1.to_s << params[$2.to_i - 1] end " #{bg} #{body} #{en} " end end module BuiltinCommands; end module BuiltinGroups; end module BuiltinEnvironments; end class Parser class CircularReferenceCommand < StandardError; end include LaTeX include BuiltinEnvironments include BuiltinGroups include BuiltinCommands BUILTIN_MACRO = <<~'EOS' \newenvironment{smallmatrix}{\begin{matrix}}{\end{matrix}} \newenvironment{pmatrix}{\left(\begin{matrix}}{\end{matrix}\right)} \newenvironment{bmatrix}{\left[\begin{matrix}}{\end{matrix}\right]} \newenvironment{Bmatrix}{\left\{\begin{matrix}}{\end{matrix}\right\}} \newenvironment{vmatrix}{\left|\begin{matrix}}{\end{matrix}\right|} \newenvironment{Vmatrix}{\left\|\begin{matrix}}{\end{matrix}\right\|} EOS attr_accessor :unsecure_entity attr_reader :macro, :symbol_table def initialize(opt = {}) @unsecure_entity = false @entities = {} @commands = {} @symbols = {} @delimiters = [] @group_begins = {} @group_ends = {} @macro = Macro.new @macro.parse(BUILTIN_MACRO) @expanded_command = [] @expanded_environment = [] @symbol_table = opt[:symbol] || MathML::Symbol::Default @symbol_table = MathML::Symbol::MAP[@symbol_table] if @symbol_table.is_a?(::Symbol) super() end def add_entity(list) list.each do |i| @entities[i] = true end end def parse(src, displaystyle = false) @ds = displaystyle begin parse_into(src, Math.new(@ds), Font::NORMAL) rescue ParseError => e e.done = src[0...(src.size - e.rest.size)] raise end end def push_container(container, scanner = @scanner, font = @font) data = [@container, @scanner, @font] @container = container @scanner = scanner @font = font begin yield container container ensure @container, @scanner, @font = data end end def add_plugin(plugin) extend(plugin) end def add_commands(*a) if a.size == 1 && a[0].is_a?(Hash) @commands.merge!(a[0]) else a.each { |i| @commands[i] = false } end end def add_multi_command(m, *a) a.each { |i| @commands[i] = m } end def add_sym_cmd(hash) @symbols.merge!(hash) end def add_delimiter(list) @delimiters.concat(list) end def add_group(begin_name, end_name, method = nil) @group_begins[begin_name] = method @group_ends[end_name] = begin_name end private def parse_into(src, parent, font = nil) orig = [@scanner, @container, @font, @ds] @scanner = Scanner.new(src) @container = parent @font = font if font begin @container << parse_to_element(true) until @scanner.eos? @container rescue BlockNotClosed => e raise ParseError.new('Block not closed.', @scanner.rest) rescue NotEnvironment => e raise ParseError.new('Not environment.', @scanner.rest) rescue EnvironmentNotEnd => e raise ParseError.new('Environment not end.', @scanner.rest) rescue OptionNotClosed => e raise ParseError.new('Option not closed.', @scanner.rest) rescue ParseError => e e.rest += @scanner.rest.to_s raise ensure @scanner, @container, @font, @ds = orig end end def parse_any(message = 'Syntax error.') raise ParseError, message unless @scanner.scan_any s = @scanner @scanner = Scanner.new(@scanner.matched) begin parse_to_element ensure @scanner = s end end def parse_to_element(whole_group = false) if whole_group && @group_begins.has_key?(@scanner.peek_command) @scanner.scan_command parse_group elsif @scanner.scan(RE::NUMERICS) parse_num elsif @scanner.scan(RE::ALPHABETS) parse_char elsif @scanner.scan(RE::OPERATORS) parse_operator elsif @scanner.scan_block parse_block elsif @scanner.scan(/_/) parse_sub elsif @scanner.scan(/'+|\^/) parse_sup elsif @scanner.scan(/~/) Space.new('1em') elsif @scanner.scan_command parse_command else raise ParseError, 'Syntax error.' end end def parse_num n = Number.new n.extend(Variant).variant = Variant::BOLD if @font == Font::BOLD n << @scanner.matched end def parse_char c = @scanner.matched i = Identifier.new case @font when Font::ROMAN i.extend(Variant).variant = Variant::NORMAL when Font::BOLD i.extend(Variant).variant = Variant::BOLD when Font::BOLD_ITALIC i.extend(Variant).variant = Variant::BOLD_ITALIC when Font::BLACKBOLD c = symbol_table.convert("#{c}opf") when Font::SCRIPT c = symbol_table.convert("#{c}scr") when Font::FRAKTUR c = symbol_table.convert("#{c}fr") end i << c end def parse_operator o = @scanner.matched Operator.new.tap { |op| op[:stretchy] = 'false' } << o end def parse_block os = @scanner @scanner = Scanner.new(@scanner[1]) begin push_container(Row.new) do |r| r << parse_to_element(true) until @scanner.eos? end rescue ParseError => e e.rest << '}' raise ensure @scanner = os end end def parse_sub e = @container.pop e ||= None.new e = SubSup.new(@ds && e.display_style, e) unless e.is_a?(SubSup) raise ParseError.new('Double subscript.', '_') if e.sub e.sub = parse_any('Subscript not exist.') e end def parse_sup e = @container.pop e ||= None.new e = SubSup.new(@ds && e.display_style, e) unless e.is_a?(SubSup) raise ParseError.new('Double superscript.', @scanner[0]) if e.sup if /'+/=~@scanner[0] prime = Operator.new @scanner[0].size.times do prime << symbol_table.convert('prime') end unless @scanner.scan(/\^/) e.sup = prime return e end end sup = parse_any('Superscript not exist.') if prime unless sup.is_a?(Row) r = Row.new r << sup sup = r end sup.contents.insert(0, prime) end e.sup = sup e end def entitize(str) MathML.pcstring(str.sub(/^(.*)$/) { "&#{$1};" }, true) end def parse_symbol_command(com, plain = false) unless @symbols.include?(com) @scanner.pos = @scanner.pos - (com.size + 1) raise ParseError, 'Undefined command.' end data = @symbols[com] return nil unless data data, s = data su = data[0] el = data[1] el ||= :o s ||= com.dup.to_sym s = com if s.is_a?(String) && s.length == 0 case el when :I el = Identifier.new when :i el = Identifier.new el.extend(Variant).variant = Variant::NORMAL unless s.is_a?(String) && s.length > 1 when :o el = Operator.new el[:stretchy] = 'false' when :n el = Number.new else raise ParseError, 'Inner data broken.' end case s when Integer s = MathML.pcstring("&\#x#{s.to_s(16)};", true) when ::Symbol s = symbol_table.convert(s) else MathML.pcstring(s, true) end return s if plain el << s el.as_display_style if su == :u el end def parse_command com = @scanner[1] matched = @scanner.matched pos = @scanner.pos - matched.size macro = @macro.commands(com) if macro begin flg = @expanded_command.include?(com) @expanded_command.push(com) raise CircularReferenceCommand if flg option = macro.option && @scanner.scan_option ? @scanner[1] : nil params = [] (1..macro.num).each do params << (@scanner.scan_block ? @scanner[1] : @scanner.scan_any) raise ParseError, 'Need more parameter.' unless params.last end r = parse_into(@macro.expand_command(com, params, option), []) return r rescue CircularReferenceCommand if @expanded_command.size > 1 raise else @scanner.pos = pos raise ParseError, 'Circular reference.' end rescue ParseError => e if @expanded_command.size > 1 raise else @scanner.pos = pos raise ParseError, %[Error in macro(#{e.message} "#{e.rest.strip}").] end ensure @expanded_command.pop end elsif @commands.key?(com) m = @commands[com] m ||= com return __send__("cmd_#{m}") end parse_symbol_command(com) end def parse_mathfont(font) f = @font @font = font begin push_container(Row.new) { |r| r << parse_any } ensure @font = f end end def parse_group font = @font begin g = @group_begins[@scanner[1]] g ||= @scanner[1] __send__("grp_#{g}") ensure @font = font end end end module BuiltinCommands OVERS = { 'hat' => 'circ', 'breve' => 'smile', 'grave' => 'grave', 'acute' => 'acute', 'dot' => 'sdot', 'ddot' => 'nldr', 'dddot' => 'mldr', 'tilde' => 'tilde', 'bar' => 'macr', 'vec' => 'rightarrow', 'check' => 'vee', 'widehat' => 'circ', 'overline' => 'macr', 'widetilde' => 'tilde', 'overbrace' => 'OverBrace' } UNDERS = { 'underbrace' => 'UnderBrace', 'underline' => 'macr' } def initialize add_commands('\\' => :backslash) add_commands('entity', 'stackrel', 'frac', 'sqrt', 'mbox') add_multi_command(:hat_etc, *OVERS.keys) add_multi_command(:underbrace_etc, *UNDERS.keys) add_multi_command(:quad_etc, ' ', 'quad', 'qquad', ',', ':', ';', '!') add_multi_command(:it_etc, 'it', 'rm', 'bf') add_multi_command(:mathit_etc, 'mathit', 'mathrm', 'mathbf', 'bm', 'mathbb', 'mathscr', 'mathfrak') add_sym_cmd(Builtin::Symbol::MAP) add_delimiter(Builtin::Symbol::DELIMITERS) super end def cmd_backslash @ds ? nil : XMLElement.new('br', 'xmlns' => 'http://www.w3.org/1999/xhtml') end def cmd_hat_etc com = @scanner[1] Over.new(parse_any, Operator.new << entitize(OVERS[com])) end def cmd_underbrace_etc com = @scanner[1] Under.new(parse_any, Operator.new << entitize(UNDERS[com])) end def cmd_entity param = @scanner.scan_block ? @scanner[1] : @scanner.scan(/./) raise ParseError, 'Need parameter.' unless param unless @unsecure_entity || @entities[param] param = @scanner.matched[/\A\{#{RE::SPACE}*(.*\})\z/, 1] if @scanner.matched =~ RE::BLOCK @scanner.pos = @scanner.pos - param.size raise ParseError, 'Unregistered entity.' end Operator.new << entitize(param) end def cmd_stackrel o = parse_any b = parse_any Over.new(b, o) end def cmd_quad_etc case @scanner[1] when ' ' Space.new('1em') when 'quad' Space.new('1em') when 'qquad' Space.new('2em') when ',' Space.new('0.167em') when ':' Space.new('0.222em') when ';' Space.new('0.278em') when '!' Space.new('-0.167em') end end def cmd_it_etc case @scanner[1] when 'it' @font = Font::NORMAL when 'rm' @font = Font::ROMAN when 'bf' @font = Font::BOLD end nil end def cmd_mathit_etc case @scanner[1] when 'mathit' parse_mathfont(Font::NORMAL) when 'mathrm' parse_mathfont(Font::ROMAN) when 'mathbf' parse_mathfont(Font::BOLD) when 'bm' parse_mathfont(Font::BOLD_ITALIC) when 'mathbb' parse_mathfont(Font::BLACKBOLD) when 'mathscr' parse_mathfont(Font::SCRIPT) when 'mathfrak' parse_mathfont(Font::FRAKTUR) end end def cmd_frac n = parse_any d = parse_any Frac.new(n, d) end def cmd_sqrt if @scanner.scan_option i = parse_into(@scanner[1], []) i = i.size == 1 ? i[0] : (Row.new << i) b = parse_any Root.new(i, b) else Sqrt.new << parse_any end end def cmd_mbox @scanner.scan_any Text.new << (@scanner.matched =~ RE::BLOCK ? @scanner[1] : @scanner.matched) end end module BuiltinGroups class CircularReferenceEnvironment < StandardError; end def initialize add_group('begin', 'end') add_group('left', 'right', :left_etc) add_group('bigg', 'bigg', :left_etc) @environments = {} super end def add_environment(*a) @environments ||= {} if a.size == 1 && a[0].is_a?(Hash) @environments.merge!(hash) else a.each { |i| @environments[i] = false } end end def grp_begin matched = @scanner.matched begin_pos = @scanner.pos - matched.size en = @scanner.scan_block ? @scanner[1] : @scanner.scan_any raise ParseError, 'Environment name not exist.' unless en macro = @macro.environments(en) if macro begin flg = @expanded_environment.include?(en) @expanded_environment.push(en) raise CircularReferenceEnvironment if flg pos = @scanner.pos option = macro.option && @scanner.scan_option ? @scanner[1] : nil params = [] (1..macro.num).each do params << (@scanner.scan_block ? @scanner[1] : @scanner.scan_any) raise ParseError, 'Need more parameter.' unless params.last end body = '' grpnest = 0 until @scanner.peek_command == 'end' && grpnest == 0 if @scanner.eos? @scanner.pos = pos raise ParseError, 'Matching \end not exist.' end com = @scanner.peek_command grpnest += 1 if @group_begins.has_key?(com) grpnest -= 1 if @group_ends.has_key?(com) && @group_begins[com] raise ParseError, 'Syntax error.' if grpnest < 0 body << @scanner.scan_any(true) end @scanner.scan_command unless en == (@scanner.scan_block ? @scanner[1] : @scanner.scan_any) raise ParseError.new('Environment mismatched.', @scanner.matched) end begin return parse_into(@macro.expand_environment(en, body, params, option), []) rescue CircularReferenceEnvironment if @expanded_environment.size > 1 raise else @scanner.pos = begin_pos raise ParseError, 'Circular reference.' end rescue ParseError => e if @expanded_environment.size > 1 raise else @scanner.pos = begin_pos raise ParseError, %[Error in macro(#{e.message} "#{e.rest.strip}").] end end ensure @expanded_environment.pop end end raise ParseError, 'Undefined environment.' unless @environments.has_key?(en) e = @environments[en] e ||= en # default method name __send__("env_#{e}") end def grp_left_etc right = case @scanner[1] when 'left' 'right' when 'bigg' 'bigg' end f = Fenced.new p = @scanner.pos o = @scanner.scan_any raise ParseError, 'Need brace here.' unless o && (o =~ RE::BRACES || @delimiters.include?(o[RE::COMMANDS, 1])) f.open = (o =~ RE::BRACES ? o : parse_symbol_command(o[RE::COMMANDS, 1], true)) f << push_container(Row.new) do |r| until @scanner.peek_command == right if @scanner.eos? @scanner.pos = p raise ParseError, 'Brace not closed.' end r << parse_to_element(true) end end @scanner.scan_command # skip right c = @scanner.scan_any raise ParseError, 'Need brace here.' unless c =~ RE::BRACES || @delimiters.include?(c[RE::COMMANDS, 1]) f.close = (c =~ RE::BRACES ? c : parse_symbol_command(c[RE::COMMANDS, 1], true)) f end end module BuiltinEnvironments def initialize add_environment('array', 'matrix') super end def env_array layout = @scanner.scan_block ? @scanner.matched : @scanner.scan(/./) l = Scanner.new(layout =~ RE::BLOCK ? layout[RE::BLOCK, 1] : layout) t = Table.new aligns = [] vlines = [] vlined = l.check(/\|/) columned = false until l.eos? c = l.scan_any unless c =~ /[clr|@]/ raise ParseError.new( 'Syntax error.', layout[/\A.*(#{Regexp.escape(c + l.rest)}.*\z)/m, 1] ) end if c == '|' aligns << Align::CENTER if vlined vlines << Line::SOLID vlined = true columned = false else vlines << Line::NONE if columned vlined = false columned = true case c when 'l' aligns << Align::LEFT when 'c' aligns << Align::CENTER when 'r' aligns << Align::RIGHT when '@' aligns << Align::CENTER l.scan_any end end end t.aligns = aligns t.vlines = vlines layout = layout[RE::BLOCK, 1] if layout =~ RE::BLOCK raise ParseError, 'Need parameter here.' if layout == '' hlines = [] row_parsed = false hlined = false until @scanner.peek_command == 'end' raise ParseError, 'Matching \end not exist.' if @scanner.eos? if @scanner.peek_command == 'hline' @scanner.scan_command t << Tr.new unless row_parsed hlines << Line::SOLID row_parsed = false hlined = true else hlines << Line::NONE if row_parsed t << env_array_row(l.string) @scanner.scan(RE::WBSLASH) row_parsed = true hlined = false end end t.hlines = hlines if hlined tr = Tr.new (0..vlines.size).each { |_i| tr << Td.new } t << tr end @scanner.scan_command raise ParseError, 'Environment mismatched.' unless @scanner.check_block && @scanner[1] == 'array' @scanner.scan_block t end def env_array_row(layout) l = Scanner.new(layout) r = Tr.new first_column = true vlined = l.check(/\|/) until l.eos? c = l.scan(/./) if c == '|' r << Td.new if vlined vlined = true next else vlined = false case c when 'r', 'l', 'c' when '@' r << parse_into(l.scan_any, Td.new) next end if first_column first_column = false else raise ParseError.new('Need more column.', @scanner.matched.to_s) unless @scanner.scan(/&/) end r << push_container(Td.new) do |td| td << parse_to_element(true) until @scanner.peek_command == 'end' || @scanner.check(/(&|\\\\)/) || @scanner.eos? end end end r << Td.new if vlined raise ParseError, 'Too many column.' if @scanner.check(/&/) r end def env_matrix t = Table.new hlines = [] hlined = false row_parsed = false until @scanner.peek_command == 'end' raise ParseError, 'Matching \end not exist.' if @scanner.eos? if @scanner.peek_command == 'hline' @scanner.scan_command t << Tr.new unless row_parsed hlines << Line::SOLID row_parsed = false hlined = true else hlines << Line::NONE if row_parsed t << (r = Tr.new) r << (td = Td.new) until @scanner.check(RE::WBSLASH) || @scanner.peek_command == 'end' || @scanner.eos? push_container(td) do |e| e << parse_to_element(true) until @scanner.peek_command == 'end' || @scanner.check(/(&|\\\\)/) || @scanner.eos? end r << (td = Td.new) if @scanner.scan(/&/) end @scanner.scan(RE::WBSLASH) row_parsed = true hlined = false end end t.hlines = hlines t << Tr.new if hlined raise ParseError, 'Need \\end{array}.' unless @scanner.peek_command == 'end' @scanner.scan_command raise ParseError, 'Environment mismatched.' unless @scanner.check_block && @scanner[1] == 'matrix' @scanner.scan_block t end def env_matrix_row r = Tr.new until @scanner.check(RE::WBSLASH) || @scanner.peek_command == 'end' r << push_container(Td.new) do |td| td << parse_to_element(true) until @scanner.peek_command == 'end' || @scanner.check(/(&|\\\\)/) || @scanner.eos? end end end end end end math_ml-1.0.0/lib/math_ml/element.rb0000644000004100000410000000775514700510662017345 0ustar www-datawww-datamodule MathML class Element < XMLElement attr_reader :display_style def as_display_style @display_style = true self end end module Variant NORMAL = 'normal' BOLD = 'bold' BOLD_ITALIC = 'bold-italic' def variant=(v) self['mathvariant'] = v end end module Align CENTER = 'center' LEFT = 'left' RIGHT = 'right' end module Line SOLID = 'solid' NONE = 'none' end class Math < XMLElement def initialize(display_style) super('math', 'xmlns' => 'http://www.w3.org/1998/Math/MathML') self[:display] = display_style ? 'block' : 'inline' end end class Row < Element def initialize super('mrow') end end class None < Element def initialize super('none') end end class Space < Element def initialize(width) super('mspace', 'width' => width) end end class Fenced < Element attr_reader :open, :close def initialize super('mfenced') end def open=(o) o = '' if o.to_s == '.' || !o o = '{' if o.to_s == '\\{' self[:open] = MathML.pcstring(o, true) end def close=(c) c = '' if c.to_s == '.' || !c c = '}' if c.to_s == '\\}' self[:close] = MathML.pcstring(c, true) end end class Frac < Element def initialize(numerator, denominator) super('mfrac') self << numerator self << denominator end end class SubSup < Element attr_reader :sub, :sup, :body def initialize(display_style, body) super('mrow') as_display_style if display_style @body = body end def update_name if @sub || @sup name = 'm' name << (if @sub @display_style ? 'under' : 'sub' else '' end) name << (if @sup @display_style ? 'over' : 'sup' else '' end) else name = 'mrow' end self.name = name end private :update_name def update_contents contents.clear contents << @body contents << @sub if @sub contents << @sup if @sup end private :update_contents def update update_name update_contents end private :update def sub=(sub) @sub = sub update end def sup=(sup) @sup = sup update end end class Over < Element def initialize(base, over) super('mover') self << base << over end end class Under < Element def initialize(base, under) super('munder') self << base << under end end class Number < Element def initialize super('mn') end end class Identifier < Element def initialize super('mi') end end class Operator < Element def initialize super('mo') end end class Text < Element def initialize super('mtext') end end class Sqrt < Element def initialize super('msqrt') end end class Root < Element def initialize(index, base) super('mroot') self << base self << index end end class Table < Element def initialize super('mtable') end def set_align_attribute(name, a, default) if a.is_a?(Array) && a.size > 0 value = '' a.each do |i| value << (' ' + i) end if value =~ /^( #{default})*$/ @attributes.delete(name) else @attributes[name] = value.strip end else @attributes.delete(name) end end def aligns=(a) set_align_attribute('columnalign', a, Align::CENTER) end def vlines=(a) set_align_attribute('columnlines', a, Line::NONE) end def hlines=(a) set_align_attribute('rowlines', a, Line::NONE) end end class Tr < Element def initialize super('mtr') end end class Td < Element def initialize super('mtd') end end end math_ml-1.0.0/math_ml.gemspec0000644000004100000410000000303414700510662016150 0ustar www-datawww-data######################################################### # This file has been automatically generated by gem2tgz # ######################################################### # -*- encoding: utf-8 -*- # stub: math_ml 1.0.0 ruby lib Gem::Specification.new do |s| s.name = "math_ml".freeze s.version = "1.0.0" s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= s.metadata = { "rubygems_mfa_required" => "true" } if s.respond_to? :metadata= s.require_paths = ["lib".freeze] s.authors = ["KURODA Hiraku".freeze] s.date = "2024-08-03" s.email = "hirakuro@gmail.com".freeze s.files = ["LICENSE".freeze, "lib/math_ml.rb".freeze, "lib/math_ml/element.rb".freeze, "lib/math_ml/latex.rb".freeze, "lib/math_ml/latex/builtin.rb".freeze, "lib/math_ml/latex/builtin/symbol.rb".freeze, "lib/math_ml/string.rb".freeze, "lib/math_ml/symbol/character_reference.rb".freeze, "lib/math_ml/symbol/entity_reference.rb".freeze, "lib/math_ml/symbol/utf8.rb".freeze, "lib/math_ml/util.rb".freeze] s.homepage = "https://github.com/hirakuro/math_ml".freeze s.licenses = ["GPL-2.0-only".freeze] s.required_ruby_version = Gem::Requirement.new(">= 3.2.0".freeze) s.rubygems_version = "3.3.15".freeze s.summary = "MathML Library".freeze if s.respond_to? :specification_version then s.specification_version = 4 end if s.respond_to? :add_runtime_dependency then s.add_runtime_dependency(%q.freeze, ["~> 1.0.0"]) else s.add_dependency(%q.freeze, ["~> 1.0.0"]) end end math_ml-1.0.0/LICENSE0000644000004100000410000004325414700510662014177 0ustar www-datawww-data GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.