## set up the mapping table ## BGS (indicating bogus) means MSIE does not reliably ## render the HTML entity code. sub set_unsym { &symnum('a', '945'); #alpha &symnum('b', '946'); #beta &symnum('c', '967'); #chi &symnum('d', '948'); #delta &symnum('e', '949'); #epsilon &symnum('f', '966'); #phi (updown) &symnum('g', '947'); #gamma &symnum('h', '951'); #eta &symnum('i', '953'); #iota &symnum('j', '981', $XX::BGS); #variant phi (down) &symnum('k', '954'); #kappa &symnum('l', '955'); #lambda &symnum('m', '956'); #mu &symnum('n', '957'); #nu &symnum('o', '959'); #omicron &symnum('p', '960'); #pi &symnum('q', '952'); #theta &symnum('r', '961'); #rho ## symnum("??", "962", BGS); #sigmaf &symnum('s', '963'); #sigma &symnum('t', '964'); #tau &symnum('u', '965'); #upsilon &symnum('v', '982', $XX::BGS); #variant pi (w with squiggle) &symnum('w', '969'); #omega &symnum('x', '958'); #xi &symnum('y', '968'); #psi &symnum('z', '950'); #zeta &symnum('A', '913'); #Alpha &symnum('B', '914'); #Beta &symnum('C', '935'); #Chi &symnum('D', '916'); #Delta &symnum('E', '917'); #Epsilon &symnum('F', '934'); #Phi &symnum('G', '915'); #Gamma &symnum('H', '919'); #Eta &symnum('I', '921'); #Iota &symnum('J', '977'); ##variant lowercase theta &symnum('K', '922'); #Kappa &symnum('L', '923'); #Lambda &symnum('M', '924'); #Mu &symnum('N', '925'); #Nu &symnum('O', '927'); #Omicron &symnum('P', '928'); #Pi &symnum('Q', '920'); #Theta &symnum('R', '929'); #Rho &symnum('S', '931'); #Sigma &symnum('T', '932'); #Tau &symnum('U', '933'); #Upsilon &symnum('V', '962'); ## lowercase sigma (final) &symnum('W', '937'); #Omega &symnum('X', '926'); #Xi &symnum('Y', '936'); #Psi &symnum('Z', '918'); #Zeta &symnum("\042", '8704', $XX::BGS); ## @: forall operator &symnum("\044", '8707', $XX::BGS); ## $: there_exists operator ## \045 is % which is identity-mapped &symnum("\046", '38'); ## &: ampersand &symnum("\047", '8717', $XX::BGS); ## ': small contains_as_member operator &symnum("\074", '60'); ## <: less-than operator &symnum("\100", '8773', $XX::BGS); ## @: congruent: approx equals: squiggle bar bar &symnum("\134", '8756', $XX::BGS); ## \: therefore &symnum("\136", '8869', $XX::BGS); ## perpendicular-to (tack) &symnum("\140", '175'); ## overline &symnum("\240", '160'); ## non-breaking space &symnum("\241", '978', $XX::BGS); ## variant (hooky) upsilon 9800 = aries &symnum("\242", '8242'); ## prime &symnum("\243", '8804'); ## less than or equal to &symnum("\244", '47'); ## slash &symnum("\245", '8734'); ## infinity ## symnum("\246", "131", BGS); ## hooky f ?? &symnum("\246", '402'); ## hooky f &symnum("\247", '9827'); ## black clubs &symnum("\250", '9830'); ## black diamonds &symnum("\251", '9829'); ## black hearts &symnum("\252", '9824'); ## black spades &symnum("\253", '8596'); ## left-right arrow &symnum("\254", '8596'); ## left arrow ## symnum("\255", "", BGS); ## &symnum("\256", '8594'); ## right arrow &symnum("\257", '8595'); ## down arrow &symnum("\260", '176'); ## degree symbol &symnum("\261", '177'); ## plus-or-minus &symnum("\262", '8243'); ## double prime &symnum("\263", '8805'); ## greater than or equal to &symnum("\264", '215'); ## times (cross product) &symnum("\265", '8733', $XX::BGS); ## proportional-to &symnum("\266", '8706'); ## partial derivative &symnum("\267", '149'); ## bullet [need to find larger bullet] &symnum("\270", '247'); ## divided by &symnum("\271", '8800'); ## not equal &symnum("\272", "8801"); ## equiv == identical to &symnum("\273", '8776'); ## almost equal (double squggle) &symnum("\274", '133'); ## low horizontal ellipsis ... ## symnum("\275", "10072", BGS); ## vertical bar (dingbat not impl by MSIE) &symnum("\275", '124'); ## vertical line (too short in MSIE) &symnum("\276", '151'); ## em dash &symnum("\277", '8629', $XX::BGS); ## carriage return : arrow with corner: down then left &symnum("\300", '8501', $XX::BGS); ## aleph alef &symnum("\301", '8465', $XX::BGS); ## Imaginary part &symnum("\302", '8476', $XX::BGS); ## Real part &symnum("\303", '8472', $XX::BGS); ## Weierstrass curly P powerset &symnum("\304", '8855', $XX::BGS); ## otimes &symnum("\305", '8853', $XX::BGS); ## oplus &symnum("\306", '8709', $XX::BGS); ## empty set (oslash) &symnum("\307", '8745', $XX::BGS); ## cap &symnum("\310", '8746', $XX::BGS); ## cup &symnum("\311", '8835', $XX::BGS); ## superset &symnum("\312", '8839', $XX::BGS); ## superset or equal &symnum("\313", '8836', $XX::BGS); ## not subset &symnum("\314", '8834', $XX::BGS); ## subset &symnum("\315", '8838', $XX::BGS); ## subset or equal &symnum("\316", '8712', $XX::BGS); ## member of &symnum("\317", '8713', $XX::BGS); ## not member of &symnum("\320", '8736', $XX::BGS); ## angle ## Nabla numeric code will get replaced with stinky conditional code later &symnum("\321", '8711', $XX::BGS); ## nabla \321 = 209. in symbol font &symnum("\322", '174'); ## registered &symnum("\323", '169'); ## copyright &symnum("\324", '153'); ## tm &symnum("\325", '8719'); ## product &symnum("\326", '8730'); ## sqrt square root &symnum("\327", '183'); ## mid dot &symnum("\330", '172'); ## logical NOT ## HTML defines logical ∧ and ∨ operators, but MSIE does not ## implement them, and /\ looks nicer anyway. if ($XX::testmode eq '1') { &symnum("\331", '8896', $XX::BGS); ## Nary logical AND (not in MSIE) &symnum("\331", '8743', $XX::BGS); ## logical AND (not in MSIE) } else { &symstring("\331", "/\\"); ## logical AND, wedge product } if ($XX::testmode eq '1') { &symnum("\332", '8897', $XX::BGS); ## Nary logical OR (not in MSIE) &symnum("\332", '8744', $XX::BGS); ## logical OR (not in MSIE) } else { &symstring("\332", "\\/"); ## logical OR, vee, inverted wedge } &symnum("\333", '8660', $XX::BGS); ## double right left arrow &symnum("\334", '8656', $XX::BGS); ## double left arrow &symnum("\335", '8657', $XX::BGS); ## double up arrow &symnum("\336", '8658', $XX::BGS); ## double right arrow &symnum("\337", '8659', $XX::BGS); ## double down arrow &symnum("\340", '9826', $XX::BGS); ## white diamond &symnum("\341", '9001', $XX::BGS); ## left bracket &symnum("\342", '174'); ## registered sans-serif &symnum("\343", '169'); ## copyright sans-serif &symnum("\344", '8482'); ## tm sans-serif &symnum("\345", '8721'); ## summation operator &symnum("\346", '9115', $XX::BGS); ## large left paren top &symnum("\347", '9116', $XX::BGS); ## extender &symnum("\350", '9117', $XX::BGS); ## bottom &symnum("\351", '9121', $XX::BGS); ## large left square bracket top &symnum("\352", '9122', $XX::BGS); ## extender &symnum("\353", '9123', $XX::BGS); ## bottom &symnum("\354", '9127', $XX::BGS); ## large left brace top &symnum("\355", '9128', $XX::BGS); ## middle &symnum("\356", '9129', $XX::BGS); ## bottom &symnum("\357", '9130', $XX::BGS); ## extender ## symstring("\360", "???", BGS); ## nothing &symnum("\361", '9002', $XX::BGS); ## left angle bracket &symnum("\362", '8747'); ## integral &symnum("\363", '8992'); ## large integral top &symnum("\364", '9134', $XX::BGS); ## extender &symnum("\365", '8993'); ## bottom &symnum("\366", '9118', $XX::BGS); ## large right paren top &symnum("\367", '9119', $XX::BGS); ## extender &symnum("\370", '9129', $XX::BGS); ## bottom &symnum("\371", '9124', $XX::BGS); ## large right square bracket top &symnum("\372", '9125', $XX::BGS); ## extender &symnum("\373", '9126', $XX::BGS); ## bottom &symnum("\374", '9131', $XX::BGS); ## large right curly brace top &symnum("\375", '9132', $XX::BGS); ## middle &symnum("\376", '9133', $XX::BGS); ## bottom ## Add above here if you discover stuff trying to escape. ## some identity mappings: my ($ident) = '!#%()*+,-./0123456789:;=>?[]_{}|~'; for (my $ii = 1; $ii <= length($ident); $ii++) { my $ch = substr($ident, $ii, 1); &symstring($ch, $ch); } } ## end set_unsym() sub symstring { my($mscode, $entity) = @_; $XX::symfont{$mscode} = $entity; } sub symnum { my($mscode, $entity, $bogus) = @_; &symstring($mscode, '&#' . $entity . ';'); if ($bogus) { $XX::bogotab{$entity} = $mscode; } }