Abolished $wgDBname as a unique wiki identifier, it doesn't work with the new-fangled...
[lhc/web/wiklou.git] / math / texutil.ml
index a814ea3..f7678e3 100644 (file)
@@ -13,7 +13,7 @@ let tex_part = function
 let rec render_tex = function
     TEX_FQ (a,b,c) -> (render_tex a) ^ "_{" ^ (render_tex  b) ^ "}^{" ^ (render_tex  c) ^ "}"
   | TEX_DQ (a,b) -> (render_tex a) ^ "_{" ^ (render_tex  b) ^ "}"
-  | TEX_UQ (a,b) -> (render_tex a) ^ "^{" ^ (render_tex  b) ^ "}" 
+  | TEX_UQ (a,b) -> (render_tex a) ^ "^{" ^ (render_tex  b) ^ "}"
   | TEX_LITERAL s -> tex_part s
   | TEX_FUN1 (f,a) -> "{" ^ f ^ " " ^ (render_tex a) ^ "}"
   | TEX_FUN1hl (f,_,a) -> "{" ^ f ^ " " ^ (render_tex a) ^ "}"
@@ -36,10 +36,12 @@ type encoding_t = LATIN1 | LATIN2 | UTF8
 let modules_ams = ref false
 let modules_nonascii = ref false
 let modules_encoding = ref UTF8
+let modules_color = ref false
 
 let tex_use_ams ()     = modules_ams := true
 let tex_use_nonascii () = modules_nonascii := true
-let tex_mod_reset ()   = (modules_ams := false; modules_nonascii := false; modules_encoding := UTF8)
+let tex_use_color ()  = modules_color := true
+let tex_mod_reset ()   = (modules_ams := false; modules_nonascii := false; modules_encoding := UTF8; modules_color := false)
 
 let get_encoding = function
     UTF8 -> "\\usepackage{ucs}\n\\usepackage[utf8]{inputenc}\n"
@@ -47,9 +49,10 @@ let get_encoding = function
   | LATIN2 -> "\\usepackage[latin2]{inputenc}\n"
 
 let get_preface ()  = "\\nonstopmode\n\\documentclass[12pt]{article}\n" ^
-                     (if !modules_nonascii then get_encoding !modules_encoding else "") ^
-                     (if !modules_ams then "\\usepackage{amsmath}\n\\usepackage{amsfonts}\n\\usepackage{amssymb}\n" else "") ^
-                     "\\pagestyle{empty}\n\\begin{document}\n$$\n"
+              (if !modules_nonascii then get_encoding !modules_encoding else "") ^
+              (if !modules_ams then "\\usepackage{amsmath}\n\\usepackage{amsfonts}\n\\usepackage{amssymb}\n" else "") ^
+              (if !modules_color then "\\usepackage[dvips,usenames]{color}\n" else "") ^
+              "\\pagestyle{empty}\n\\begin{document}\n$$\n"
 let get_footer  ()  = "\n$$\n\\end{document}\n"
 
 let set_encoding = function
@@ -97,6 +100,7 @@ let find = function
     | "\\rho"              -> LITERAL (HTMLABLEC (FONT_UF,  "\\rho ", "ρ"))
     | "\\Rho"              -> LITERAL (HTMLABLEC (FONT_RTI, "P", "Ρ"))
     | "\\varrho"           -> LITERAL (TEX_ONLY "\\varrho ")
+    | "\\sim"              -> LITERAL (HTMLABLEC (FONT_UF,  "\\sim ", "˜"))
     | "\\sigma"            -> LITERAL (HTMLABLEC (FONT_UF,  "\\sigma ", "σ"))
     | "\\Sigma"            -> LITERAL (HTMLABLEC (FONT_RTI, "\\Sigma ", "Σ"))
     | "\\varsigma"         -> LITERAL (TEX_ONLY "\\varsigma ")
@@ -158,6 +162,9 @@ let find = function
     | "\\hAar"             -> LITERAL (HTMLABLE  (FONT_UF,  "\\Leftrightarrow ", "⇔"))
     | "\\Longleftrightarrow"->LITERAL (HTMLABLE  (FONT_UF,  "\\Longleftrightarrow ", "↔"))
     | "\\iff"              -> LITERAL (HTMLABLE  (FONT_UF,  "\\iff ", "↔"))
+    | "\\ll"              -> LITERAL (TEX_ONLY "\\ll ")
+    | "\\gg"              -> LITERAL (TEX_ONLY "\\gg ")
+    | "\\div"             -> LITERAL (TEX_ONLY "\\div ")
     | "\\searrow"          -> LITERAL (TEX_ONLY "\\searrow ")
     | "\\nearrow"          -> LITERAL (TEX_ONLY "\\nearrow ")
     | "\\swarrow"          -> LITERAL (TEX_ONLY "\\swarrow ")
@@ -175,52 +182,56 @@ let find = function
     | "\\bigotimes"        -> LITERAL (TEX_ONLY "\\bigotimes ")
     | "\\coprod"           -> LITERAL (TEX_ONLY "\\coprod ")
     | "\\bigsqcup"         -> LITERAL (TEX_ONLY "\\bigsqcup ")
-    | "\\bigoplus"         -> LITERAL (TEX_ONLY "\\bigoplus ") 
-    | "\\bigvee"           -> LITERAL (TEX_ONLY "\\bigvee ") 
+    | "\\bigoplus"         -> LITERAL (TEX_ONLY "\\bigoplus ")
+    | "\\bigvee"           -> LITERAL (TEX_ONLY "\\bigvee ")
     | "\\biguplus"         -> LITERAL (TEX_ONLY "\\biguplus ")
-    | "\\oint"            -> LITERAL (TEX_ONLY "\\oint ")
+    | "\\oint"             -> LITERAL (TEX_ONLY "\\oint ")
     | "\\bigwedge"         -> LITERAL (TEX_ONLY "\\bigwedge ")
     | "\\models"           -> LITERAL (TEX_ONLY "\\models ")
     | "\\vdash"            -> LITERAL (TEX_ONLY "\\vdash ")
     | "\\triangle"         -> LITERAL (TEX_ONLY "\\triangle ")
-    | "\\wr"              -> LITERAL (TEX_ONLY "\\wr ")
+       | "\\bowtie"           -> LITERAL (TEX_ONLY "\\bowtie ")
+    | "\\wr"               -> LITERAL (TEX_ONLY "\\wr ")
     | "\\triangleleft"     -> LITERAL (TEX_ONLY "\\triangleleft ")
     | "\\triangleright"    -> LITERAL (TEX_ONLY "\\triangleright ")
     | "\\textvisiblespace" -> LITERAL (TEX_ONLY "\\textvisiblespace ")
-    | "\\ker"             -> LITERAL (TEX_ONLY "\\ker ")
-    | "\\lim"             -> LITERAL (TEX_ONLY "\\lim ")
+    | "\\ker"              -> LITERAL (TEX_ONLY "\\ker ")
+    | "\\lim"              -> LITERAL (TEX_ONLY "\\lim ")
     | "\\limsup"           -> LITERAL (TEX_ONLY "\\limsup ")
     | "\\liminf"           -> LITERAL (TEX_ONLY "\\liminf ")
-    | "\\sup"             -> LITERAL (TEX_ONLY "\\sup ")
-    | "\\Pr"              -> LITERAL (TEX_ONLY "\\Pr ")
-    | "\\hom"             -> LITERAL (TEX_ONLY "\\hom ")
-    | "\\arg"             -> LITERAL (TEX_ONLY "\\arg ")
-    | "\\dim"             -> LITERAL (TEX_ONLY "\\dim ")
-    | "\\inf"             -> LITERAL (TEX_ONLY "\\inf ")
-    | "\\circ"            -> LITERAL (TEX_ONLY "\\circ ")
-    | "\\hbar"            -> LITERAL (TEX_ONLY "\\hbar ")
-    | "\\imath"                   -> LITERAL (TEX_ONLY "\\imath ")
-    | "\\lnot"            -> LITERAL (TEX_ONLY "\\lnot ")
+    | "\\sup"              -> LITERAL (TEX_ONLY "\\sup ")
+    | "\\Pr"               -> LITERAL (TEX_ONLY "\\Pr ")
+    | "\\hom"              -> LITERAL (TEX_ONLY "\\hom ")
+    | "\\arg"              -> LITERAL (TEX_ONLY "\\arg ")
+    | "\\dim"              -> LITERAL (TEX_ONLY "\\dim ")
+    | "\\inf"              -> LITERAL (TEX_ONLY "\\inf ")
+    | "\\circ"             -> LITERAL (TEX_ONLY "\\circ ")
+    | "\\hbar"             -> LITERAL (TEX_ONLY "\\hbar ")
+    | "\\imath"            -> LITERAL (TEX_ONLY "\\imath ")
+    | "\\lnot"             -> LITERAL (TEX_ONLY "\\lnot ")
     | "\\hookrightarrow"   -> LITERAL (TEX_ONLY "\\hookrightarrow ")
     | "\\hookleftarrow"    -> LITERAL (TEX_ONLY "\\hookleftarrow ")
     | "\\mp"               -> LITERAL (TEX_ONLY "\\mp ")
     | "\\approx"           -> LITERAL (TEX_ONLY "\\approx ")
+    | "\\propto"           -> LITERAL (TEX_ONLY "\\propto ")
     | "\\flat"             -> LITERAL (TEX_ONLY "\\flat ")
     | "\\sharp"            -> LITERAL (TEX_ONLY "\\sharp ")
     | "\\natural"          -> LITERAL (TEX_ONLY "\\natural ")
-    | "\\int"             -> LITERAL (HTMLABLE_BIG ("\\int ", "∫"))
-    | "\\sum"             -> LITERAL (HTMLABLE_BIG ("\\sum ", "∑"))
-    | "\\prod"            -> LITERAL (HTMLABLE_BIG ("\\prod ", "∏"))
+    | "\\int"              -> LITERAL (HTMLABLE_BIG ("\\int ", "∫"))
+    | "\\sum"              -> LITERAL (HTMLABLE_BIG ("\\sum ", "∑"))
+    | "\\prod"             -> LITERAL (HTMLABLE_BIG ("\\prod ", "∏"))
     | "\\vdots"            -> LITERAL (TEX_ONLY "\\vdots ")
+    | "\\limits"           -> LITERAL (TEX_ONLY "\\limits ")
+    | "\\nolimits"         -> LITERAL (TEX_ONLY "\\nolimits ")
     | "\\top"              -> LITERAL (TEX_ONLY "\\top ")
-    | "\\sin"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\sin ","sin"))
-    | "\\cos"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\cos ","cos"))
-    | "\\sinh"            -> LITERAL (HTMLABLEC(FONT_UFH,"\\sinh ","sinh"))
-    | "\\cosh"            -> LITERAL (HTMLABLEC(FONT_UFH,"\\cosh ","cosh"))
-    | "\\tan"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\tan ","tan"))
-    | "\\tanh"            -> LITERAL (HTMLABLEC(FONT_UFH,"\\tanh ","tanh"))
-    | "\\sec"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\sec ","sec"))
-    | "\\csc"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\csc ","csc"))
+    | "\\sin"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\sin ","sin"))
+    | "\\cos"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\cos ","cos"))
+    | "\\sinh"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\sinh ","sinh"))
+    | "\\cosh"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\cosh ","cosh"))
+    | "\\tan"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\tan ","tan"))
+    | "\\tanh"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\tanh ","tanh"))
+    | "\\sec"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\sec ","sec"))
+    | "\\csc"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\csc ","csc"))
     | "\\arcsin"           -> LITERAL (HTMLABLEC(FONT_UFH,"\\arcsin ","arcsin"))
     | "\\arctan"           -> LITERAL (HTMLABLEC(FONT_UFH,"\\arctan ","arctan"))
     | "\\arccos"           -> (tex_use_ams (); LITERAL (HTMLABLEC(FONT_UFH,"\\mathop{\\mathrm{arccos}}","arccos")))
@@ -228,17 +239,17 @@ let find = function
     | "\\arcsec"           -> (tex_use_ams (); LITERAL (HTMLABLEC(FONT_UFH,"\\mathop{\\mathrm{arcsec}}","arcsec")))
     | "\\arccsc"           -> (tex_use_ams (); LITERAL (HTMLABLEC(FONT_UFH,"\\mathop{\\mathrm{arccsc}}","arccsc")))
     | "\\sgn"              -> (tex_use_ams (); LITERAL (HTMLABLEC(FONT_UFH,"\\mathop{\\mathrm{sgn}}","sgn")))
-    | "\\cot"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\cot ","cot"))
-    | "\\coth"            -> LITERAL (HTMLABLEC(FONT_UFH,"\\coth ","coth"))
-    | "\\log"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\log ", "log"))
-    | "\\lg"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\lg ", "lg"))
-    | "\\ln"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\ln ", "ln"))
-    | "\\exp"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\exp ", "exp"))
-    | "\\min"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\min ", "min"))
-    | "\\max"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\max ", "max"))
-    | "\\gcd"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\gcd ", "gcd"))
-    | "\\deg"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\deg ", "deg"))
-    | "\\det"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\det ", "det"))
+    | "\\cot"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\cot ","cot"))
+    | "\\coth"             -> LITERAL (HTMLABLEC(FONT_UFH,"\\coth ","coth"))
+    | "\\log"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\log ", "log"))
+    | "\\lg"               -> LITERAL (HTMLABLEC(FONT_UFH,"\\lg ", "lg"))
+    | "\\ln"               -> LITERAL (HTMLABLEC(FONT_UFH,"\\ln ", "ln"))
+    | "\\exp"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\exp ", "exp"))
+    | "\\min"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\min ", "min"))
+    | "\\max"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\max ", "max"))
+    | "\\gcd"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\gcd ", "gcd"))
+    | "\\deg"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\deg ", "deg"))
+    | "\\det"              -> LITERAL (HTMLABLEC(FONT_UFH,"\\det ", "det"))
     | "\\bullet"           -> LITERAL (HTMLABLE (FONT_UFH, "\\bullet ", "•"))
     | "\\bull"             -> LITERAL (HTMLABLE (FONT_UFH, "\\bullet ", "•"))
     | "\\angle"            -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UF, "\\angle ", "∠")))
@@ -263,6 +274,10 @@ let find = function
     | "\\subset"           -> LITERAL (HTMLABLE (FONT_UF,  "\\subset ", "⊂"))
     | "\\supseteq"         -> LITERAL (HTMLABLE (FONT_UF,  "\\supseteq ", "⊇"))
     | "\\subseteq"         -> LITERAL (HTMLABLE (FONT_UF,  "\\subseteq ", "⊆"))
+    | "\\sqsupset"         -> (tex_use_ams (); LITERAL (TEX_ONLY "\\sqsupset "))
+    | "\\sqsubset"         -> (tex_use_ams (); LITERAL (TEX_ONLY "\\sqsubset "))
+    | "\\sqsupseteq"       -> (tex_use_ams (); LITERAL (TEX_ONLY "\\sqsupseteq "))
+    | "\\sqsubseteq"       -> (tex_use_ams (); LITERAL (TEX_ONLY "\\sqsubseteq "))
     | "\\perp"             -> LITERAL (HTMLABLE (FONT_UF,  "\\perp ", "⊥"))
     | "\\bot"              -> LITERAL (HTMLABLE (FONT_UF,  "\\bot ", "⊥"))
     | "\\lfloor"           -> DELIMITER (HTMLABLE (FONT_UF,  "\\lfloor ", "⌊"))
@@ -296,12 +311,15 @@ let find = function
     | "\\pm"               -> LITERAL (HTMLABLEM(FONT_UFH,"\\pm ", "±"))
     | "\\plusmn"           -> LITERAL (HTMLABLEM(FONT_UFH,"\\pm ", "±"))
     | "\\cdot"             -> LITERAL (HTMLABLE (FONT_UFH,"\\cdot ", "⋅"))
+    | "\\AA"               -> LITERAL (HTMLABLE (FONT_UFH,"\\AA ", "Å"))
     | "\\cdots"            -> LITERAL (HTMLABLE (FONT_UFH,"\\cdots ", "⋅⋅⋅"))
     | "\\sdot"             -> LITERAL (HTMLABLE (FONT_UFH,"\\cdot ", "⋅"))
     | "\\oplus"            -> LITERAL (HTMLABLE (FONT_UF, "\\oplus ", "⊕"))
     | "\\otimes"           -> LITERAL (HTMLABLE (FONT_UF, "\\otimes ", "⊗"))
     | "\\cap"              -> LITERAL (HTMLABLEM(FONT_UF, "\\cap ", "∩"))
     | "\\cup"              -> LITERAL (HTMLABLE (FONT_UF, "\\cup ", "∪"))
+    | "\\sqcap"            -> (tex_use_ams (); LITERAL (TEX_ONLY "\\sqcap "))
+    | "\\sqcup"            -> (tex_use_ams (); LITERAL (TEX_ONLY "\\sqcup "))
     | "\\empty"            -> LITERAL (HTMLABLE (FONT_UF, "\\emptyset ", "∅"))
     | "\\emptyset"         -> LITERAL (HTMLABLE (FONT_UF, "\\emptyset ", "∅"))
     | "\\O"                -> LITERAL (HTMLABLE (FONT_UF, "\\emptyset ", "∅"))
@@ -318,16 +336,16 @@ let find = function
     | "\\partial"          -> LITERAL (HTMLABLEM(FONT_UF, "\\partial ", "∂"))
     | "\\ldots"            -> LITERAL (HTMLABLEM(FONT_UFH,"\\ldots ", "..."))
     | "\\dots"             -> LITERAL (HTMLABLEM(FONT_UFH,"\\dots ", "..."))
-    | "\\quad"                    -> LITERAL (HTMLABLE (FONT_UF, "\\quad ","  "))
-    | "\\qquad"                   -> LITERAL (HTMLABLE (FONT_UF, "\\qquad ","    "))
+    | "\\quad"             -> LITERAL (HTMLABLE (FONT_UF, "\\quad ","  "))
+    | "\\qquad"            -> LITERAL (HTMLABLE (FONT_UF, "\\qquad ","    "))
     | "\\mid"              -> LITERAL (HTMLABLEM(FONT_UFH,"\\mid ", " | "))
     | "\\neg"              -> LITERAL (HTMLABLEM(FONT_UFH,"\\neg ", "¬"))
     | "\\langle"           -> DELIMITER (HTMLABLE (FONT_UFH,"\\langle ","⟨"))
     | "\\rangle"           -> DELIMITER (HTMLABLE (FONT_UFH,"\\rangle ","⟩"))
     | "\\lang"             -> DELIMITER (HTMLABLE (FONT_UFH,"\\langle ","⟨"))
     | "\\rang"             -> DELIMITER (HTMLABLE (FONT_UFH,"\\rangle ","⟩"))
-    | "\\lbrack"          -> DELIMITER (HTMLABLEC(FONT_UFH,"[","["))
-    | "\\rbrack"          -> DELIMITER (HTMLABLEC(FONT_UFH,"]","]"))
+    | "\\lbrack"           -> DELIMITER (HTMLABLEC(FONT_UFH,"[","["))
+    | "\\rbrack"           -> DELIMITER (HTMLABLEC(FONT_UFH,"]","]"))
     | "\\ddots"            -> LITERAL (TEX_ONLY "\\ddots ")
     | "\\clubs"            -> LITERAL (TEX_ONLY "\\clubsuit ")
     | "\\clubsuit"         -> LITERAL (TEX_ONLY "\\clubsuit ")
@@ -338,7 +356,7 @@ let find = function
     | "\\diamonds"         -> LITERAL (TEX_ONLY "\\diamondsuit ")
     | "\\diamondsuit"      -> LITERAL (TEX_ONLY "\\diamondsuit ")
     | "\\implies"          -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UF, "\\implies ", "⇒")))
-    | "\\mod"             -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\mod ", "mod")))
+    | "\\mod"              -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\mod ", "mod")))
     | "\\Diamond"          -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UF, "\\Diamond ", "◊")))
     | "\\dotsb"            -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UF, "\\dotsb ", "⋅⋅⋅")))
     | "\\reals"            -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\mathbb{R}", "<b>R</b>")))
@@ -348,7 +366,7 @@ let find = function
     | "\\Complex"          -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\mathbb{C}", "<b>C</b>")))
     | "\\Z"                -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\mathbb{Z}", "<b>Z</b>")))
     | "\\natnums"          -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\mathbb{N}", "<b>N</b>")))
-    | "\\N"               -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\mathbb{N}", "<b>N</b>")))
+    | "\\N"                -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\mathbb{N}", "<b>N</b>")))
     | "\\lVert"            -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\lVert ", "||")))
     | "\\rVert"            -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\rVert ", "||")))
     | "\\nmid"             -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nmid "))
@@ -361,6 +379,7 @@ let find = function
     | "\\trianglelefteq"   -> (tex_use_ams (); LITERAL (TEX_ONLY "\\trianglelefteq "))
     | "\\trianglerighteq"  -> (tex_use_ams (); LITERAL (TEX_ONLY "\\trianglerighteq "))
     | "\\square"           -> (tex_use_ams (); LITERAL (TEX_ONLY "\\square "))
+    | "\\checkmark"        -> (tex_use_ams (); LITERAL (TEX_ONLY "\\checkmark "))
     | "\\supsetneq"        -> (tex_use_ams (); LITERAL (TEX_ONLY "\\supsetneq "))
     | "\\subsetneq"        -> (tex_use_ams (); LITERAL (TEX_ONLY "\\subsetneq "))
     | "\\Box"              -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Box "))
@@ -369,6 +388,10 @@ let find = function
     | "\\upharpoonleft"    -> (tex_use_ams (); LITERAL (TEX_ONLY "\\upharpoonleft "))
     | "\\downharpoonright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\downharpoonright "))
     | "\\downharpoonleft"  -> (tex_use_ams (); LITERAL (TEX_ONLY "\\downharpoonleft "))
+    | "\\rightharpoonup"   -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rightharpoonup "))
+    | "\\rightharpoondown" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rightharpoondown "))
+    | "\\leftharpoonup"    -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftharpoonup "))
+    | "\\leftharpoondown"  -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftharpoondown "))
     | "\\nless"            -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nless "))
     | "\\Vdash"            -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Vdash "))
     | "\\vDash"            -> (tex_use_ams (); LITERAL (TEX_ONLY "\\vDash "))
@@ -395,7 +418,7 @@ let find = function
     | "\\varnothing"       -> (tex_use_ams (); LITERAL (TEX_ONLY "\\varnothing "))
     | "\\left"             -> LEFT
     | "\\right"            -> RIGHT
-    | "\\hat"             -> FUN_AR1 "\\hat "
+    | "\\hat"              -> FUN_AR1 "\\hat "
     | "\\widehat"          -> FUN_AR1 "\\widehat "
     | "\\overline"         -> FUN_AR1 "\\overline "
     | "\\overbrace"        -> FUN_AR1 "\\overbrace "
@@ -404,16 +427,16 @@ let find = function
     | "\\overleftarrow"    -> FUN_AR1 "\\overleftarrow "
     | "\\overrightarrow"   -> FUN_AR1 "\\overrightarrow "
     | "\\overleftrightarrow"->FUN_AR1 "\\overleftrightarrow "
-    | "\\check"                   -> FUN_AR1 "\\check "
-    | "\\acute"                   -> FUN_AR1 "\\acute "
-    | "\\grave"                   -> FUN_AR1 "\\grave "
-    | "\\bar"             -> FUN_AR1 "\\bar "
-    | "\\vec"             -> FUN_AR1 "\\vec "
-    | "\\dot"             -> FUN_AR1 "\\dot "
-    | "\\ddot"            -> FUN_AR1 "\\ddot "
-    | "\\breve"                   -> FUN_AR1 "\\breve "
-    | "\\tilde"                   -> FUN_AR1 "\\tilde "
-    | "\\not"             -> FUN_AR1 "\\not "
+    | "\\check"            -> FUN_AR1 "\\check "
+    | "\\acute"            -> FUN_AR1 "\\acute "
+    | "\\grave"            -> FUN_AR1 "\\grave "
+    | "\\bar"              -> FUN_AR1 "\\bar "
+    | "\\vec"              -> FUN_AR1 "\\vec "
+    | "\\dot"              -> FUN_AR1 "\\dot "
+    | "\\ddot"             -> FUN_AR1 "\\ddot "
+    | "\\breve"            -> FUN_AR1 "\\breve "
+    | "\\tilde"            -> FUN_AR1 "\\tilde "
+    | "\\not"              -> LITERAL (TEX_ONLY "\\not ")
     | "\\choose"           -> FUN_INFIX "\\choose "
     | "\\atop"             -> FUN_INFIX "\\atop "
     | "\\binom"            -> FUN_AR2 "\\binom "
@@ -431,11 +454,15 @@ let find = function
     | "\\rm"               -> DECLh ("\\rm ", FONTFORCE_RM)
     | "\\it"               -> DECLh ("\\it ", FONTFORCE_IT)
     | "\\cal"              -> DECL "\\cal "
+    | "\\displaystyle"     -> LITERAL (TEX_ONLY  "\\displaystyle ")
+    | "\\scriptstyle"      -> LITERAL (TEX_ONLY "\\scriptstyle ")
+    | "\\textstyle"        -> LITERAL (TEX_ONLY "\\textstyle ")
+    | "\\scriptscriptstyle"-> LITERAL (TEX_ONLY "\\scriptscriptstyle ")
     | "\\bf"               -> DECL "\\bf "
-    | "\\big"             -> BIG "\\big "
-    | "\\Big"             -> BIG "\\Big "
-    | "\\bigg"            -> BIG "\\bigg "
-    | "\\Bigg"            -> BIG "\\Bigg "
+    | "\\big"              -> BIG "\\big "
+    | "\\Big"              -> BIG "\\Big "
+    | "\\bigg"             -> BIG "\\bigg "
+    | "\\Bigg"             -> BIG "\\Bigg "
     | "\\mathit"           -> (tex_use_ams (); FUN_AR1hf ("\\mathit ", FONTFORCE_IT))
     | "\\mathrm"           -> (tex_use_ams (); FUN_AR1hf ("\\mathrm ", FONTFORCE_RM))
     | "\\mathop"           -> (tex_use_ams (); FUN_AR1 "\\mathop ")
@@ -451,4 +478,5 @@ let find = function
     | "\\mbox"             -> raise (Failure "malformatted \\mbox")
     | "\\vbox"             -> raise (Failure "malformatted \\vbox")
     | "\\hbox"             -> raise (Failure "malformatted \\hbox")
+    | "\\color"            -> (tex_use_color (); LITERAL (TEX_ONLY "\\color"))
     | s                    -> raise (Illegal_tex_function s)