# Merge afm and "raw" font files # (raw font file is pfb converted to plain text by t1disasm) afmhead <- c("StartFontMetrics 2.0", "Comment Creation Date: December 2005", "Comment UniqueID 5000820", # Same as cmsy10.afm # ASE stands for Adobe Symbol Encoding "FontName CMSYASE", "EncodingScheme FontSpecific", "FullName CMSYASE", # Name altered as per request at # http://www.ams.org/tex/type1-fonts.html "FamilyName CM Symbol", "Weight Medium", "ItalicAngle -14.035", "IsFixedPitch false", "Version 1.00", # AMS Copyright removed as per request at # http://www.ams.org/tex/type1-fonts.html "Comment Computer Modern fonts were designed by Donald E. Knuth", # FIXME: Update metrics below "FontBBox -29 -960 1116 775", "CapHeight 683.333", "XHeight 430.556", "Ascender 694.444", "Descender -960", "Comment FontID CMSYASE", "Comment DesignSize 10 (pts)", "Comment CharacterCodingScheme Adobe Symbol Encoding", "Comment Space 0 0 0 ", "Comment ExtraSpace 0", "Comment Quad 1000", "Comment Num 676.508 393.732 443.731", "Comment Denom 685.951 344.841", "Comment Sup 412.892 362.892 288.889", "Comment Sub 150 247.217", "Comment Supdrop 386.108", "Comment Subdrop 50", "Comment Delim 2390 1010", "Comment Axisheight 250") rawhead <- c("%!PS-AdobeFont-1.1: CMSYASE 1.00B", paste("%%CreationDate:", date()), "", # AMS Copyright removed as per request at # http://www.ams.org/tex/type1-fonts.html "11 dict begin", # changed 7 to 6 because AMS copyright removed "/FontInfo 6 dict dup begin", "/version (1.00B) readonly def", # AMS Copyright removed as per request at # http://www.ams.org/tex/type1-fonts.html "/FullName (CMSYASE) readonly def", # Name altered as per request at # http://www.ams.org/tex/type1-fonts.html "/FamilyName (CM Symbol) readonly def", "/Weight (Medium) readonly def", "/ItalicAngle 0 def", "/isFixedPitch false def", "end readonly def", "/FontName /CMSYASE def", "/PaintType 0 def", "/FontType 1 def", "/FontMatrix [0.001 0 0 0.001 0 0] readonly def", "/Encoding 256 array", "0 1 255 {1 index exch /.notdef put} for", # Adobe Symbol Encoding "dup 32 /space put", "dup 33 /exclam put", "dup 34 /universal put", "dup 35 /numbersign put", "dup 36 /existential put", "dup 37 /percent put", "dup 38 /ampersand put", "dup 39 /suchthat put", "dup 40 /parenleft put", "dup 41 /parenright put", "dup 42 /asteriskmath put", "dup 43 /plus put", "dup 44 /comma put", "dup 45 /minus put", "dup 46 /period put", "dup 47 /slash put", "dup 48 /zero put", "dup 49 /one put", "dup 50 /two put", "dup 51 /three put", "dup 52 /four put", "dup 53 /five put", "dup 54 /six put", "dup 55 /seven put", "dup 56 /eight put", "dup 57 /nine put", "dup 58 /colon put", "dup 59 /semicolon put", "dup 60 /less put", "dup 61 /equal put", "dup 62 /greater put", "dup 63 /question put", "dup 64 /congruent put", "dup 65 /Alpha put", "dup 66 /Beta put", "dup 67 /Chi put", "dup 68 /Delta put", "dup 69 /Epsilon put", "dup 70 /Phi put", "dup 71 /Gamma put", "dup 72 /Eta put", "dup 73 /Iota put", "dup 74 /theta1 put", "dup 75 /Kappa put", "dup 76 /Lambda put", "dup 77 /Mu put", "dup 78 /Nu put", "dup 79 /Omicron put", "dup 80 /Pi put", "dup 81 /Theta put", "dup 82 /Rho put", "dup 83 /Sigma put", "dup 84 /Tau put", "dup 85 /Upsilon put", "dup 86 /sigma1 put", "dup 87 /Omega put", "dup 88 /Xi put", "dup 89 /Psi put", "dup 90 /Zeta put", "dup 91 /bracketleft put", "dup 92 /therefore put", "dup 93 /bracketright put", "dup 94 /perpendicular put", # "dup 95 /underscore put", # "dup 96 /radicalex put", "dup 97 /alpha put", "dup 98 /beta put", "dup 99 /chi put", "dup 100 /delta put", "dup 101 /epsilon put", "dup 102 /phi put", "dup 103 /gamma put", "dup 104 /eta put", "dup 105 /iota put", "dup 106 /phi1 put", "dup 107 /kappa put", "dup 108 /lambda put", "dup 109 /mu put", "dup 110 /nu put", "dup 111 /omicron put", "dup 112 /pi put", "dup 113 /theta put", "dup 114 /rho put", "dup 115 /sigma put", "dup 116 /tau put", "dup 117 /upsilon put", "dup 118 /omega1 put", "dup 119 /omega put", "dup 120 /xi put", "dup 121 /psi put", "dup 122 /zeta put", "dup 123 /braceleft put", "dup 124 /bar put", "dup 125 /braceright put", "dup 126 /similar put", # "dup 160 /Euro put", "dup 161 /Upsilon1 put", "dup 162 /minute put", "dup 163 /lessequal put", "dup 164 /fraction put", "dup 165 /infinity put", "dup 166 /florin put", "dup 167 /club put", "dup 168 /diamond put", "dup 169 /heart put", "dup 170 /spade put", "dup 171 /arrowboth put", "dup 172 /arrowleft put", "dup 173 /arrowup put", "dup 174 /arrowright put", "dup 175 /arrowdown put", "dup 176 /degree put", "dup 177 /plusminus put", "dup 178 /second put", "dup 179 /greaterequal put", "dup 180 /multiply put", "dup 181 /proportional put", "dup 182 /partialdiff put", "dup 183 /bullet put", "dup 184 /divide put", "dup 185 /notequal put", "dup 186 /equivalence put", "dup 187 /approxequal put", "dup 188 /ellipsis put", "dup 189 /arrowvertex put", "dup 190 /arrowhorizex put", # "dup 191 /carriagereturn put", "dup 192 /aleph put", "dup 193 /Ifraktur put", "dup 194 /Rfraktur put", "dup 195 /weierstrass put", "dup 196 /circlemultiply put", "dup 197 /circleplus put", "dup 198 /emptyset put", "dup 199 /intersection put", "dup 200 /union put", "dup 201 /propersuperset put", "dup 202 /reflexsuperset put", "dup 203 /notsubset put", "dup 204 /propersubset put", "dup 205 /reflexsubset put", "dup 206 /element put", "dup 207 /notelement put", "dup 208 /angle put", "dup 209 /gradient put", # "dup 210 /registerserif put", "dup 211 /copyrightserif put", # "dup 212 /trademarkserif put", "dup 213 /product put", "dup 214 /radical put", "dup 215 /dotmath put", "dup 216 /logicalnot put", "dup 217 /logicaland put", "dup 218 /logicalor put", "dup 219 /arrowdblboth put", "dup 220 /arrowdblleft put", "dup 221 /arrowdblup put", "dup 222 /arrowdblright put", "dup 223 /arrowdbldown put", "dup 224 /lozenge put", "dup 225 /angleleft put", # "dup 226 /registersans put", # "dup 227 /copyrightsans put", # "dup 228 /trademarksans put", "dup 229 /summation put", "dup 230 /parenlefttp put", "dup 231 /parenleftex put", "dup 232 /parenleftbt put", "dup 233 /bracketlefttp put", "dup 234 /bracketleftex put", "dup 235 /bracketleftbt put", "dup 236 /bracelefttp put", "dup 237 /braceleftmid put", "dup 238 /braceleftbt put", "dup 239 /braceex put", "dup 241 /angleright put", "dup 242 /integral put", "dup 243 /integraltp put", "dup 244 /integralex put", "dup 245 /integralbt put", "dup 246 /parenrighttp put", "dup 247 /parenrightex put", "dup 248 /parenrightbt put", "dup 249 /bracketrighttp put", "dup 250 /bracketrightex put", "dup 251 /bracketrightbt put", "dup 252 /bracerighttp put", "dup 253 /bracerightmid put", "dup 254 /bracerightbt put", # FIXME: Update metrics below "readonly def", "/FontBBox{-29 -960 1116 775}readonly def", "/UniqueID 5000820 def", "currentdict end", "currentfile eexec", # Changed 13 to 16 because added # a) NP def # b) StemSnapV # c) OtherSubrs "dup/Private 16 dict dup begin", "/RD{string currentfile exch readstring pop}executeonly def", "/ND{noaccess def}executeonly def", "/NP{noaccess put}executeonly def", "/BlueValues [-22 0 683 705] def", "/OtherBlues [-124 -119] def", "/StdHW [40] def", "/StdVW [85] def", "/StemSnapH [40 55] def", "/StemSnapV [69 89] def", "/BlueScale 0.04379 def", "/ForceBold false def", "/MinFeature{16 16}def", "/password 5839 def", "/UniqueID 5000820 def") # same as cmsy10.raw rawfoot <- c("/.notdef {", "0 1000 3 div", "hsbw", "endchar", "} ND", "", "end", "end", "readonly put", "noaccess put", "dup/FontName get exch definefont pop", "mark currentfile closefile", "cleartomark") cmr10afm <- readLines("cmr10.afm") cmr10raw <- readLines("cmr10.raw") cmsy10afm <- readLines("cmsy10.afm") cmsy10raw <- readLines("cmsy10.raw") cmmi10afm <- readLines("cmmi10.afm") cmmi10raw <- readLines("cmmi10.raw") cmex10afm <- readLines("cmex10.afm") cmex10raw <- readLines("cmex10.raw") msam10afm <- readLines("msam10.afm") msam10raw <- readLines("msam10.raw") # Subrs for RAW # Use this just to eyeball /OtherSubrs in each RAW file getOtherSubr <- function(font) { font[grep("^/OtherSubrs", font):(grep("^/Subrs", font) - 1)] } # Looks like we are LUCKY that ALL /OtherSubrs are identical # in the fonts we are merging (cmr, cmmi, cmex, msam [cmsy has none]) # SO we can just use the one from cmr othersubrs <- getOtherSubr(cmr10raw) nSubrs <- function(font) { as.numeric(strsplit(font[grep("^/Subrs", font)], " ")[[1]][2]) } getSubrs <- function(font) { subrs <- font[(grep("^/Subrs", font) + 1):(grep("CharStrings", font) - 1)] subrs <- subrs[1:(grep("ND", subrs) - 1)] } incSubrs <- function(subrs, n) { subs <- grep("^dup", subrs) subrs[subs] <- paste("dup", 1:length(subs) + n - 1, "{") subrs } subrInc <- function(fontname) { switch(fontname, cmr10raw=0, cmmi10raw=nSubrs(cmr10raw), cmex10raw=nSubrs(cmr10raw) + nSubrs(cmmi10raw), msam10raw=nSubrs(cmr10raw) + nSubrs(cmmi10raw) + nSubrs(cmex10raw)) } # Start with subrs from cmr # For simplicity, load ALL of them # Increment the subroutine number for later fonts subrs <- getSubrs(cmr10raw) nsub <- nSubrs(cmr10raw) subrs <- c(subrs, incSubrs(getSubrs(cmmi10raw), nsub)) nsub <- nsub + nSubrs(cmmi10raw) subrs <- c(subrs, incSubrs(getSubrs(cmex10raw), nsub)) nsub <- nsub + nSubrs(cmex10raw) subrs <- c(subrs, incSubrs(getSubrs(msam10raw), nsub)) nsub <- nsub + nSubrs(msam10raw) # Subroutine numbers changed for some fonts, so # need to update any callsubr calls addAFMchar <- function(newafm, i, name, src, srcname=name) { afmline <- src[grep(paste(" N ", srcname, " ", sep=""), src)] # Change char number afmline <- sub("^C -?[0-9]+ ", paste("C ", i, " ", sep=""), afmline) # Change char name if (srcname != name) afmline <- sub(paste(" N ", srcname, " ", sep=""), paste(" N ", name, " ", sep=""), afmline) c(newafm, afmline) } addRAWchar <- function(newraw, name, src, srcname=name) { # Get char outline charstr <- src[grep(paste("^[/]", srcname, " ", sep=""), src):length(src)] charstr <- charstr[1:grep("ND", charstr)[1]] # Change char name if (srcname != name) { charstr[1] <- sub(paste("^[/]", srcname, " ", sep=""), paste("/", name, " ", sep=""), charstr[1]) } # If any callsubr calls, increment the subr number callsubr <- grep("callsubr", charstr) if (length(callsubr) > 0) { for (i in callsubr) { line <- charstr[i] bits <- strsplit(line, " ")[[1]] nbits <- length(bits) subNum <- as.numeric(bits[nbits - 1]) charstr[i] <- paste(paste(bits[1:(nbits - 2)], collapse=" "), subNum + subrInc(deparse(substitute(src))), "callsubr") } } c(newraw, charstr, "") } # Database of characters used to create CM version of Adobe Symbol # Start with [afm|raw]head then add characters ONE at a time from # relevant font, IN ADOBE SYMBOL ENCODING ORDER # Add char metrics to AFM and char outlines to RAW # Code points 0-31 are /.notdef charmetric <- NULL charstr <- NULL # 32 = /space = cmr10 /space charmetric <- addAFMchar(charmetric, 32, "space", cmr10afm) charstr <- addRAWchar(charstr, "space", cmr10raw) # 33 = /exclam = cmr10 /exclam charmetric <- addAFMchar(charmetric, 33, "exclam", cmr10afm) charstr <- addRAWchar(charstr, "exclam", cmr10raw) # 34 = /universal = cmsy10 /universal charmetric <- addAFMchar(charmetric, 34, "universal", cmsy10afm) charstr <- addRAWchar(charstr, "universal", cmsy10raw) # 35 = /numbersign = cmr10 /numbersign charmetric <- addAFMchar(charmetric, 35, "numbersign", cmr10afm) charstr <- addRAWchar(charstr, "numbersign", cmr10raw) # 36 = /existental = cmsy10 /existential charmetric <- addAFMchar(charmetric, 36, "existential", cmsy10afm) charstr <- addRAWchar(charstr, "existential", cmsy10raw) # 37 = /percent = cmr10 /percent charmetric <- addAFMchar(charmetric, 37, "percent", cmr10afm) charstr <- addRAWchar(charstr, "percent", cmr10raw) # 38 = /ampersand = crm10 /ampersand charmetric <- addAFMchar(charmetric, 38, "ampersand", cmr10afm) charstr <- addRAWchar(charstr, "ampersand", cmr10raw) # 39 = /suchthat = cmsy10 /owner charmetric <- addAFMchar(charmetric, 39, "suchthat", cmsy10afm, "owner") charstr <- addRAWchar(charstr, "suchthat", cmsy10raw, "owner") # 40 = /parenleft = cmr10 /parenleft charmetric <- addAFMchar(charmetric, 40, "parenleft", cmr10afm) charstr <- addRAWchar(charstr, "parenleft", cmr10raw) # 41 = /parenright = cmr10 /parenright charmetric <- addAFMchar(charmetric, 41, "parenright", cmr10afm) charstr <- addRAWchar(charstr, "parenright", cmr10raw) # 42 = /asteriskmath = cmsy10 /asteriskmath charmetric <- addAFMchar(charmetric, 42, "asteriskmath", cmsy10afm) charstr <- addRAWchar(charstr, "asteriskmath", cmsy10raw) # 43 = /plus = cmr10 /plus charmetric <- addAFMchar(charmetric, 43, "plus", cmr10afm) charstr <- addRAWchar(charstr, "plus", cmr10raw) # 44 = /comma = cmr10 /comma charmetric <- addAFMchar(charmetric, 44, "comma", cmr10afm) charstr <- addRAWchar(charstr, "comma", cmr10raw) # 45 = /minus = cmsy10 /minus charmetric <- addAFMchar(charmetric, 45, "minus", cmsy10afm) charstr <- addRAWchar(charstr, "minus", cmsy10raw) # 46 = /period = cmr10 /period charmetric <- addAFMchar(charmetric, 46, "period", cmr10afm) charstr <- addRAWchar(charstr, "period", cmr10raw) # 47 = /slash = cmr10 /slash charmetric <- addAFMchar(charmetric, 46, "slash", cmr10afm) charstr <- addRAWchar(charstr, "slash", cmr10raw) # 48 to 57 n <- 48 for (i in c("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine")) { charmetric <- addAFMchar(charmetric, n, i, cmr10afm) charstr <- addRAWchar(charstr, i, cmr10raw) n <- n + 1 } # 58 = /colon = cmr10 /colon charmetric <- addAFMchar(charmetric, 58, "colon", cmr10afm) charstr <- addRAWchar(charstr, "colon", cmr10raw) # 59 = /semicolon = cmr10 /semicolon charmetric <- addAFMchar(charmetric, 59, "semicolon", cmr10afm) charstr <- addRAWchar(charstr, "semicolon", cmr10raw) # 60 = /less = cmmi10 /less charmetric <- addAFMchar(charmetric, 60, "less", cmmi10afm) charstr <- addRAWchar(charstr, "less", cmmi10raw) # 61 = /equal = cmr10 /equal charmetric <- addAFMchar(charmetric, 61, "equal", cmr10afm) charstr <- addRAWchar(charstr, "equal", cmr10raw) # 62 = /greater = cmmi10 /greater charmetric <- addAFMchar(charmetric, 62, "greater", cmmi10afm) charstr <- addRAWchar(charstr, "greater", cmmi10raw) # 63 = /question = cmr10 /question charmetric <- addAFMchar(charmetric, 63, "question", cmr10afm) charstr <- addRAWchar(charstr, "question", cmr10raw) # 64 = /congruent = cmsy10 /similarequal # Not perfect match; perhaps construct custom character? # Unicode U+2245 charmetric <- addAFMchar(charmetric, 64, "congruent", cmsy10afm, "similarequal") charstr <- addRAWchar(charstr, "congruent", cmsy10raw, "similarequal") # 65 = /Alpha = cmr10 /A # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 65, "Alpha", cmr10afm, "A") charstr <- addRAWchar(charstr, "Alpha", cmr10raw, "A") # 66 = /Beta = cmr10 /B # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 66, "Beta", cmr10afm, "B") charstr <- addRAWchar(charstr, "Beta", cmr10raw, "B") # 67 = /Chi = cmr10 /X # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 67, "Chi", cmr10afm, "X") charstr <- addRAWchar(charstr, "Chi", cmr10raw, "X") # 68 = /Delta = cmr10 /Delta charmetric <- addAFMchar(charmetric, 68, "Delta", cmr10afm) charstr <- addRAWchar(charstr, "Delta", cmr10raw) # 69 = /Epsilon = cmr10 /E # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 69, "Epsilon", cmr10afm, "E") charstr <- addRAWchar(charstr, "Epsilon", cmr10raw, "E") # 70 = /Phi = cmr10 /Phi charmetric <- addAFMchar(charmetric, 70, "Phi", cmr10afm) charstr <- addRAWchar(charstr, "Phi", cmr10raw) # 71 = /Gamma = cmr10 /Gamma charmetric <- addAFMchar(charmetric, 71, "Gamma", cmr10afm) charstr <- addRAWchar(charstr, "Gamma", cmr10raw) # 72 = /Eta = cmr10 /H # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 72, "Eta", cmr10afm, "H") charstr <- addRAWchar(charstr, "Eta", cmr10raw, "H") # 73 = /Iota = cmr /I # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 73, "Iota", cmr10afm, "I") charstr <- addRAWchar(charstr, "Iota", cmr10raw, "I") # 74 = /theta1 = cmmi /theta1 charmetric <- addAFMchar(charmetric, 74, "theta1", cmmi10afm) charstr <- addRAWchar(charstr, "theta1", cmmi10raw) # 75 = /Kappa = cmr10 /K # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 75, "Kappa", cmr10afm, "K") charstr <- addRAWchar(charstr, "Kappa", cmr10raw, "K") # 76 = /Lambda = cmr10 /Lambda charmetric <- addAFMchar(charmetric, 76, "Lambda", cmr10afm) charstr <- addRAWchar(charstr, "Lambda", cmr10raw) # 77 = /Mu = cmr10 /M # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 77, "Mu", cmr10afm, "M") charstr <- addRAWchar(charstr, "Mu", cmr10raw, "M") # 78 = /Nu = cmr10 /N # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 78, "Nu", cmr10afm, "N") charstr <- addRAWchar(charstr, "Nu", cmr10raw, "N") # 79 = /Omicron = cmr10 /O # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 79, "Omicron", cmr10afm, "O") charstr <- addRAWchar(charstr, "Omicron", cmr10raw, "O") # 80 = /Pi = cmr10 /Pi charmetric <- addAFMchar(charmetric, 80, "Pi", cmr10afm) charstr <- addRAWchar(charstr, "Pi", cmr10raw) # 81 = /Theta = cmr10 /Theta charmetric <- addAFMchar(charmetric, 81, "Theta", cmr10afm) charstr <- addRAWchar(charstr, "Theta", cmr10raw) # 82 = /Rho = cmr10 /R # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 82, "Rho", cmr10afm, "R") charstr <- addRAWchar(charstr, "Rho", cmr10raw, "R") # 83 /Sigma = cmr10 /Sigma charmetric <- addAFMchar(charmetric, 83, "Sigma", cmr10afm) charstr <- addRAWchar(charstr, "Sigma", cmr10raw) # 84 = /Tau = cmr10 /T # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 84, "Tau", cmr10afm, "T") charstr <- addRAWchar(charstr, "Tau", cmr10raw, "T") # 85 /Upsilon = cmr10 /Y charmetric <- addAFMchar(charmetric, 85, "Upsilon", cmr10afm, "Y") charstr <- addRAWchar(charstr, "Upsilon", cmr10raw, "Y") # 86 = /sigma1 = cmmi /sigma1 charmetric <- addAFMchar(charmetric, 86, "sigma1", cmmi10afm) charstr <- addRAWchar(charstr, "sigma1", cmmi10raw) # 87 /Omega = cmr10 /Omega charmetric <- addAFMchar(charmetric, 87, "Omega", cmr10afm) charstr <- addRAWchar(charstr, "Omega", cmr10raw) # 88 /Xi = cmr10 /Xi charmetric <- addAFMchar(charmetric, 88, "Xi", cmr10afm) charstr <- addRAWchar(charstr, "Xi", cmr10raw) # 89 /Psi = cmr10 /Psi charmetric <- addAFMchar(charmetric, 89, "Psi", cmr10afm) charstr <- addRAWchar(charstr, "Psi", cmr10raw) # 90 = /Zeta = cmr10 /Z # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 90, "Zeta", cmr10afm, "Z") charstr <- addRAWchar(charstr, "Zeta", cmr10raw, "Z") # 91 = /brackleft = cmr10 /bracketleft charmetric <- addAFMchar(charmetric, 91, "bracketleft", cmr10afm) charstr <- addRAWchar(charstr, "bracketleft", cmr10raw) # 92 = /therefore = msam10 /therefore charmetric <- addAFMchar(charmetric, 92, "therefore", msam10afm) charstr <- addRAWchar(charstr, "therefore", msam10raw) # 93 = /bracketright = cmr10 /bracketright charmetric <- addAFMchar(charmetric, 93, "bracketright", cmr10afm) charstr <- addRAWchar(charstr, "bracketright", cmr10raw) # 94 = /perpendicular = cmsy10 /perpendicular charmetric <- addAFMchar(charmetric, 94, "perpendicular", cmsy10afm) charstr <- addRAWchar(charstr, "perpendicular", cmsy10raw) # 95 = /underscore # 96 = /radicalex # 97 to 110 n <- 97 for (i in c("alpha", "beta", "chi", "delta", "epsilon", "phi", "gamma", "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu")) { charmetric <- addAFMchar(charmetric, n, i, cmmi10afm) charstr <- addRAWchar(charstr, i, cmmi10raw) n <- n + 1 } # 111 = /omicron = cmr10 /o # Not perfect, but a reasonable approximation? charmetric <- addAFMchar(charmetric, 111, "omicron", cmr10afm, "o") charstr <- addRAWchar(charstr, "omicron", cmr10raw, "o") # 112 to 117 n <- 112 for (i in c("pi", "theta", "rho", "sigma", "tau", "upsilon")) { charmetric <- addAFMchar(charmetric, n, i, cmmi10afm) charstr <- addRAWchar(charstr, i, cmmi10raw) n <- n + 1 } # 118 = /omega1 = cmmi10 /pi1 charmetric <- addAFMchar(charmetric, 118, "omega1", cmmi10afm, "pi1") charstr <- addRAWchar(charstr, "omega1", cmmi10raw, "pi1") # 119 to 122 n <- 119 for (i in c("omega", "xi", "psi", "zeta")) { charmetric <- addAFMchar(charmetric, n, i, cmmi10afm) charstr <- addRAWchar(charstr, i, cmmi10raw) n <- n + 1 } # 123 = /braceleft = cmsy10 /braceleft charmetric <- addAFMchar(charmetric, 123, "braceleft", cmsy10afm) charstr <- addRAWchar(charstr, "braceleft", cmsy10raw) # 124 = /bar = cmsy10 /bar charmetric <- addAFMchar(charmetric, 124, "bar", cmsy10afm) charstr <- addRAWchar(charstr, "bar", cmsy10raw) # 125 = /braceright = cmsy10 /braceright charmetric <- addAFMchar(charmetric, 125, "braceright", cmsy10afm) charstr <- addRAWchar(charstr, "braceright", cmsy10raw) # 126 = /similar = cmsy10 /similar charmetric <- addAFMchar(charmetric, 126, "similar", cmsy10afm) charstr <- addRAWchar(charstr, "similar", cmsy10raw) # 127 = /.notdef # 160 = /Euro # 161 = /Upsilon1 = cmr10 /Upsilon charmetric <- addAFMchar(charmetric, 161, "Upsilon1", cmr10afm, "Upsilon") charstr <- addRAWchar(charstr, "Upsilon1", cmr10raw, "Upsilon") # 162 = /minute = cmr10 /acute # Not sure about this one (esp. for spacing/kerning) charmetric <- addAFMchar(charmetric, 162, "minute", cmr10afm, "acute") charstr <- addRAWchar(charstr, "minute", cmr10raw, "acute") # 163 = /lessequal = cmsy10 /lessequal charmetric <- addAFMchar(charmetric, 163, "lessequal", cmsy10afm) charstr <- addRAWchar(charstr, "lessequal", cmsy10raw) # 164 = /fraction = cmsy10 /negationslash charmetric <- addAFMchar(charmetric, 164, "fraction", cmsy10afm, "negationslash") charstr <- addRAWchar(charstr, "fraction", cmsy10raw, "negationslash") # 165 = /infinity = cmys10 /infinity charmetric <- addAFMchar(charmetric, 165, "infinity", cmsy10afm) charstr <- addRAWchar(charstr, "infinity", cmsy10raw) # 166 = /florin = cmmi10 /f charmetric <- addAFMchar(charmetric, 166, "florin", cmmi10afm, "f") charstr <- addRAWchar(charstr, "florin", cmmi10raw, "f") # 167 to 175 n <- 167 for (i in c("club", "diamond", "heart", "spade", "arrowboth", "arrowleft", "arrowup", "arrowright", "arrowdown")) { charmetric <- addAFMchar(charmetric, n, i, cmsy10afm) charstr <- addRAWchar(charstr, i, cmsy10raw) n <- n + 1 } # 176 = /degree = cmr10 /ring # Not sure about this one (esp. for spacing/kerning) charmetric <- addAFMchar(charmetric, 176, "degree", cmr10afm, "ring") charstr <- addRAWchar(charstr, "degree", cmr10raw, "ring") # 177 = /plusminus = cmys10 /plusminus charmetric <- addAFMchar(charmetric, 177, "plusminus", cmsy10afm) charstr <- addRAWchar(charstr, "plusminus", cmsy10raw) # 178 = /second = cmr10 /hungarumlaut # Not sure about this one (esp. for spacing/kerning) charmetric <- addAFMchar(charmetric, 178, "second", cmr10afm, "hungarumlaut") charstr <- addRAWchar(charstr, "second", cmr10raw, "hungarumlaut") # 179 = /greaterequal = cmys10 /greaterequal charmetric <- addAFMchar(charmetric, 179, "greaterequal", cmsy10afm) charstr <- addRAWchar(charstr, "greaterequal", cmsy10raw) # 180 = /multiply = cmys10 /multiply charmetric <- addAFMchar(charmetric, 180, "multiply", cmsy10afm) charstr <- addRAWchar(charstr, "multiply", cmsy10raw) # 181 = /proportional = cmys10 /proportional charmetric <- addAFMchar(charmetric, 181, "proportional", cmsy10afm) charstr <- addRAWchar(charstr, "proportional", cmsy10raw) # 182 = /partialdiff = cmmi10 /partialdiff charmetric <- addAFMchar(charmetric, 182, "partialdiff", cmmi10afm) charstr <- addRAWchar(charstr, "partialdiff", cmmi10raw) # 183 = /bullet = cmsy10 /bullet charmetric <- addAFMchar(charmetric, 183, "bullet", cmsy10afm) charstr <- addRAWchar(charstr, "bullet", cmsy10raw) # 184 = /divide = cmsy10 /divide charmetric <- addAFMchar(charmetric, 184, "divide", cmsy10afm) charstr <- addRAWchar(charstr, "divide", cmsy10raw) # 185 = /notequal # /notequal is combination of /equal in cmr and /negationslash # The actual path has been hand-edited; it is NOT sufficient # to draw the /equal path and then draw the /negationslash path # because they overlap so you end up with white bits # where the slash and the equals overlap. # The modifications are based on viewing and clicking on # a drawing of the original paths (see viewchar.R and # oldnotequalchar.txt and newnotequalchar.txt charmetric <- c(charmetric, "C 185 ; WX 777.778 ; N notequal ; B 56 -216 721 716 ;") charstr <- c(charstr, # Use x extent from /equal and y extent from /fraction "/notequal {", " 56 7000 9 div", " hsbw", " 133 40 hstem", " 327 40 hstem", " 0 665 vstem", " 631 327 rmoveto", " 15 19 0 20 hvcurveto", " 20 -19 0 -14 vhcurveto", " -215 hlineto", " 159 310 rlineto", " 6 12 1 2 0 4 rrcurveto", " 7 -6 13 -14 vhcurveto", " -10 0 -6 -6 -6 -12 rrcurveto", " -174 -330 rlineto", " -333 hlineto", " -14 -19 0 -20 hvcurveto", " -20 19 0 15 vhcurveto", " 315 hlineto", " -79 -154 rlineto", " -235 hlineto", " -15 -19 0 -20 hvcurveto", " -20 19 0 14 vhcurveto", " 216 hlineto", " -159 -311 rlineto", " -6 -12 -1 -2 0 -4 rrcurveto", " -7 6 -13 14 vhcurveto", " 10 0 6 6 6 12 rrcurveto", " 171 331 rlineto", " 336 hlineto", " 14 19 0 20 hvcurveto", " 20 -19 0 -15 vhcurveto", " -315 hlineto", " 80 154 rlineto", " closepath", " endchar", " } ND\n") # 186 = /equivalence = cmsy10 /equivalence charmetric <- addAFMchar(charmetric, 186, "equivalence", cmsy10afm) charstr <- addRAWchar(charstr, "equivalence", cmsy10raw) # 187 = /approxequal = cmsy10 /approxequal charmetric <- addAFMchar(charmetric, 187, "approxequal", cmsy10afm) charstr <- addRAWchar(charstr, "approxequal", cmsy10raw) # 188 = /ellipsis # Based on period: # left space = right space = 86 # width of dot = 106 # gap between dots = 167 # gap between is TeX interword stretch (for 10pt roman is 1.666pt) # [see The TeXBook p.75 and the 'ellipsis' LaTeX package] charmetric <- c(charmetric, "C 188 ; WX 824 ; N ellipsis ; B 86 0 738 106 ;") charstr <- c(charstr, "/ellipsis {", " 86 824 hsbw", " 0 106 hstem", " 0 106 vstem", " 106 53 rmoveto", " 29 -24 24 -29 vhcurveto", " -29 -24 -24 -29 hvcurveto", " -29 24 -24 29 vhcurveto", " 29 24 24 29 hvcurveto", " closepath", " 273 0 rmoveto", " 29 -24 24 -29 vhcurveto", " -29 -24 -24 -29 hvcurveto", " -29 24 -24 29 vhcurveto", " 29 24 24 29 hvcurveto", " closepath", " 273 0 rmoveto", " 29 -24 24 -29 vhcurveto", " -29 -24 -24 -29 hvcurveto", " -29 24 -24 29 vhcurveto", " 29 24 24 29 hvcurveto", " closepath", " endchar", " } ND\n") # Add kerning info for ellipsis before [.][,][:][;][!][?] # 189 = /arrowvertex = cmex10 /arrowvertex charmetric <- addAFMchar(charmetric, 189, "arrowvertex", cmex10afm) charstr <- addRAWchar(charstr, "arrowvertex", cmex10raw) # 190 = /arrowhorizex = cmr10 /endash # Does this "line up" with /arrowleft and /arrowright charmetric <- addAFMchar(charmetric, 190, "arrowhorizex", cmr10afm, "endash") charstr <- addRAWchar(charstr, "arrowhorizex", cmr10raw, "endash") # 191 = /carriagereturn # 192 = /aleph = cmsy10 /aleph charmetric <- addAFMchar(charmetric, 192, "aleph", cmsy10afm) charstr <- addRAWchar(charstr, "aleph", cmsy10raw) # 193 = /Ifraktur = cmsy10 /Ifractur charmetric <- addAFMchar(charmetric, 193, "Ifraktur", cmsy10afm, "Ifractur") charstr <- addRAWchar(charstr, "Ifraktur", cmsy10raw, "Ifractur") # 194 = /Rfraktur = cmsy10 /Rfractur charmetric <- addAFMchar(charmetric, 194, "Rfraktur", cmsy10afm, "Rfractur") charstr <- addRAWchar(charstr, "Rfraktur", cmsy10raw, "Rfractur") # 195 = /weierstrass = cmmi10 /weierstrass charmetric <- addAFMchar(charmetric, 195, "weierstrass", cmmi10afm) charstr <- addRAWchar(charstr, "weierstrass", cmmi10raw) # 196 to 202 n <- 196 for (i in c("circlemultiply", "circleplus", "emptyset", "intersection", "union", "propersuperset", "reflexsuperset")) { charmetric <- addAFMchar(charmetric, n, i, cmsy10afm) charstr <- addRAWchar(charstr, i, cmsy10raw) n <- n + 1 } # 203 = /notsubset # /notsubset is combination of /propersubset in cmsy and /negationslash # Hand-edited path; see /notequal for details charmetric <- c(charmetric, "C 203 ; WX 777.778 ; N notsubset ; B 83 -216 694 716 ;") charstr <- c(charstr, "/notsubset {", " 83 7000 9 div", " hsbw", " -40 40 hstem", " 500 40 hstem", " 0 40 vstem", " 578 500 rmoveto", " 14 19 0 20 hvcurveto", " 20 -19 0 -14 vhcurveto", " -101 hlineto", " 71 138 rlineto", " 6 12 1 2 0 4 rrcurveto", " 7 -6 13 -14 vhcurveto", " -10 0 -6 -6 -6 -12 rrcurveto", " -81 -158 rlineto", " -128 hlineto", " -160 -144 -122 -168 hvcurveto", " 0 -168 130 -96 15 -5 rrcurveto", " -82 -159 rlineto", " -6 -12 -1 -2 0 -4 rrcurveto", " -7 6 -13 14 vhcurveto", " 10 0 6 6 6 12 rrcurveto", " 85 168 rlineto", " 0 0 60 -10 61 0 rrcurveto", " 274 hlineto", " 14 19 0 20 hvcurveto", " 20 -19 0 -14 vhcurveto", " -271 hlineto", " -54 3 -50 5 0 0 rrcurveto", " 252 492 rlineto", " closepath", " -46 0 rmoveto", " -246 -481 rlineto", " -15 3 -108 89 0 139 rrcurveto", " 139 117 111 150 vhcurveto", " closepath", " endchar", " } ND\n") # 204 to 206 n <- 204 for (i in c("propersubset", "reflexsubset", "element")) { charmetric <- addAFMchar(charmetric, n, i, cmsy10afm) charstr <- addRAWchar(charstr, i, cmsy10raw) n <- n + 1 } # 207 = /notelement # /notelement is combination of /element in cmsy and /negationslash # Hand-edited path; see /notequal for details charmetric <- c(charmetric, "C 207 ; WX 666.667 ; N notelement ; B 83 -216 638 716 ;") charstr <- c(charstr, "/notelement {", " 83 2000 3 div", " hsbw", " -40 40 230 40 500 40 hstem3", " 0 41 vstem", " 467 230 rmoveto", " 14 19 0 20 hvcurveto", " 20 -19 0 -14 vhcurveto", " -130 hlineto", " 118 230 rlineto", " 12 hlineto", " 14 19 0 20 hvcurveto", " 20 -19 0 -4 vhcurveto", " 71 138 rlineto", " 6 12 1 2 0 4 rrcurveto", " 7 -6 13 -14 vhcurveto", " -10 0 -6 -6 -6 -12 rrcurveto", " -81 -158 rlineto", " -128 hlineto", " -160 -144 -122 -168 hvcurveto", " 0 -168 130 -96 15 -5 rrcurveto", " -82 -159 rlineto", " -6 -12 -1 -2 0 -4 rrcurveto", " -7 6 -13 14 vhcurveto", " 10 0 6 6 6 12 rrcurveto", " 85 168 rlineto", " 0 0 60 -10 61 0 rrcurveto", " 162 hlineto", " 14 19 0 20 hvcurveto", " 20 -19 0 -14 vhcurveto", " -159 hlineto", " -54 3 -50 5 0 0 rrcurveto", " 115 222 rlineto", " closepath", " -47 0 rmoveto", " -108 -211 rlineto", " 0 0 -110 77 -12 134 rrcurveto", " closepath", " 0 40 rmoveto", " 12 136 118 94 136 0 rrcurveto", " 102 hlineto", " -116 -230 rlineto ", " closepath", " endchar", " } ND\n") # 208 = /angle = msam10 /angle charmetric <- addAFMchar(charmetric, 208, "angle", msam10afm) charstr <- addRAWchar(charstr, "angle", msam10raw) # 208 = /gradient = cmsy10 /nabla charmetric <- addAFMchar(charmetric, 209, "gradient", cmsy10afm, "nabla") charstr <- addRAWchar(charstr, "gradient", cmsy10raw, "nabla") # 210 = /registerserif # 211 = /copyrightserif # Combination of /circlecopyrt from cmsy10 and /c from cmr10 # Take metric from /circlecopyrt charmetric <- c(charmetric, "C 211 ; WX 1000 ; N copyrightserif ; B 56 -216 943 716 ;") charstr <- c(charstr, "/copyrightserif {", # "/circlecopyrt {", " 56 1000 hsbw", " -216 40 hstem", " 676 40 hstem", " 0 40 vstem", " 847 40 vstem", " 887 250 rmoveto", " 261 -202 205 -241 vhcurveto", " -245 -199 -207 -259 hvcurveto", " -259 199 -207 245 vhcurveto", " 242 201 205 261 hvcurveto", " closepath", " -443 -426 rmoveto", " -223 -181 189 237 hvcurveto", " 239 184 187 219 vhcurveto", " 223 181 -189 -237 hvcurveto", " -239 -184 -187 -219 vhcurveto", " closepath", # " endchar", # "/c {", # " 34 4000 9 div", # " hsbw", # " -11 25 hstem", # " 294 92 hstem", # " 423 25 hstem", # " 0 83 vstem", # " 278 92 vstem", # Change the first moveto # " 325 386 rmoveto", " 109 562 rmoveto", " -41 -3 -6 -30 0 -13 rrcurveto", " -26 18 -20 28 vhcurveto", " 26 20 17 30 hvcurveto", " 68 -76 39 -77 vhcurveto", " -125 -92 -108 -124 hvcurveto", " -128 99 -99 116 vhcurveto", " 134 32 120 10 hvcurveto", " 10 -10 0 -3 vhcurveto", " -9 0 -2 -4 -2 -6 rrcurveto", " -29 -93 -65 -12 -37 0 rrcurveto", " -53 -88 43 161 hvcurveto", " 163 82 42 53 vhcurveto", " 9 0 63 -1 35 -36 rrcurveto", " closepath", " endchar", " } ND") # 212 = /trademarkserif # 213 = /product = cmex10 /producttext # Pretty much verbatim from cmex, but I've modified the bounding box, # and first move in the char outline, so that it sits slightly below # baseline rather than completely below baseline # (drop is .125 of char height, based roughly on proportional drop # of summation symbol in Adobe symbol font afm) # (and changed the char number to 213) # (and changed the name from producttext to product) charmetric <- c(charmetric, "C 213 ; WX 944.444 ; N producttext ; B 56 -125 887 875 ;") charstr <- c(charstr, c("/product {", "56 8500 9 div", "hsbw", "-1000 40 hstem", "-40 40 hstem", "103 97 vstem", "631 97 vstem", # "728 -119 rmoveto", "728 756 rmoveto", "30 0 49 103 vhcurveto", "40 vlineto", "-831 hlineto", "-40 vlineto", "103 0 -49 -30 hvcurveto", "-762 vlineto", "-30 0 -49 -103 vhcurveto", "-40 vlineto", "303 hlineto", "40 vlineto", "-103 0 49 30 hvcurveto", "841 vlineto", "431 hlineto", "-841 vlineto", "-30 0 -49 -103 vhcurveto", "-40 vlineto", "303 hlineto", "40 vlineto", "-103 0 49 30 hvcurveto", "closepath", "endchar", "} ND")) # 214 = /radical = cmsy10 /radical charmetric <- addAFMchar(charmetric, 214, "radical", cmsy10afm) charstr <- addRAWchar(charstr, "radical", cmsy10raw) # 215 = /dotmath = cmsy10 /periodcentered charmetric <- addAFMchar(charmetric, 215, "dotmath", cmsy10afm, "periodcentered") charstr <- addRAWchar(charstr, "dotmath", cmsy10raw, "periodcentered") # 216 to 223 n <- 216 for (i in c("logicalnot", "logicaland", "logicalor", "arrowdblboth", "arrowdblleft", "arrowdblup", "arrowdblright", "arrowdbldown")) { charmetric <- addAFMchar(charmetric, n, i, cmsy10afm) charstr <- addRAWchar(charstr, i, cmsy10raw) n <- n + 1 } # 224 = /lozenge = msam10 /diamond charmetric <- addAFMchar(charmetric, 224, "lozenge", msam10afm, "diamond") charstr <- addRAWchar(charstr, "lozenge", msam10raw, "diamond") # 225 = /angleleft = cmsy10 /angbracketleft charmetric <- addAFMchar(charmetric, 225, "angleleft", cmsy10afm, "angbracketleft") charstr <- addRAWchar(charstr, "angleleft", cmsy10raw, "angbracketleft") # 226 = /registersans # 227 = /copyrightsans # 228 = /trademarksans # 229 = /summation = cmex10 /summationtext # Pretty much verbatim from cmex, but I've modified the bounding box, # and first move in the char outline, so that it sits slightly below # baseline rather than completely below baseline # (drop is .125 of char height, based roughly on proportional drop # of summation symbol in Adobe symbol font afm) # (and changed the char number to 229) # (and changed the name from summationtext to summation) charmetric <- c(charmetric, "C 229 ; WX 1055.56 ; N summation ; B 56 -125 999 875 ;") charstr <- c(charstr, c("/summation {", "56 26389 25 div", "hsbw", "-1000 55 hstem", "-40 40 hstem", # "431 -516 rmoveto", "431 359 rmoveto", "7 9 2 3 0 4 rrcurveto", "0 4 -1 1 -6 9 rrcurveto", "-325 446 rlineto", "396 hlineto", "114 0 230 -7 70 -187 rrcurveto", "25 hlineto", "-86 234 rlineto", "-829 hlineto", "-27 -1 -1 -31 hvcurveto", "365 -502 rlineto", "-355 -439 rlineto", "-8 -10 -1 -2 0 -4 rrcurveto", "-11 9 0 18 vhcurveto", "829 hlineto", "86 249 rlineto", "-25 hlineto", "-25 -75 -67 -61 -85 -29 rrcurveto", "-16 -5 -69 -24 -147 0 rrcurveto", "-425 hlineto", "closepath", "endchar", "} ND")) # 230 = /parenlefttp # Just verbatim copy of /brace[left|right][tp|bt] and /braceex from cmex # Added rather than renamed because need original /bracelefttp etc as well # Use these rather than the Computer Modern parenlefttp, etc because # the Computer Modern parenlefttp etc are too big; CM has several sizes # of parentheses before it has to resort to extensible parentheses so # the extensible ones are quite huge charmetric <- c(charmetric, "C 230 ; WX 888.889 ; N parenlefttp ; B 384 -910 718 -1 ;") charstr <- c(charstr, "/parenlefttp {", " 384 8000 9 div", " hsbw", " -900 21 hstem", " -21 20 hstem", " 0 120 vstem", " 120 -453 rmoveto", " 0 82 22 191 178 126 rrcurveto", " 13 10 1 1 0 18 rrcurveto", " 23 -1 1 -25 vhcurveto", " -16 hlineto", " -215 -116 -77 -189 0 -147 rrcurveto", " -430 vlineto", " -26 1 -1 27 vhcurveto", " 64 hlineto", " 27 1 1 26 hvcurveto", " closepath", " endchar", " } ND") # 231 = /parenleftex charmetric <- c(charmetric, "C 231 ; WX 888.889 ; N parenleftex ; B 384 -310 504 10 ;") charstr <- c(charstr, "/parenleftex {", " 384 8000 9 div", " hsbw", " -300 21 hstem", " -20 20 hstem", " 0 120 vstem", " 120 -17 rmoveto", " 26 -1 1 -27 vhcurveto", " -64 hlineto", " -27 -1 -1 -26 hvcurveto", " -266 vlineto", " -26 1 -1 27 vhcurveto", " 64 hlineto", " 27 1 1 26 hvcurveto", " closepath", " endchar", " } ND") # 232 = /parenleftbt charmetric <- c(charmetric, "C 232 ; WX 888.889 ; N parenleftbt ; B 384 -899 718 10 ;") charstr <- c(charstr, "/parenleftbt {", " 384 8000 9 div", " hsbw", " -899 21 hstem", " -20 20 hstem", " 0 120 vstem", " 120 -17 rmoveto", " 26 -1 1 -27 vhcurveto", " -64 hlineto", " -27 -1 -1 -26 hvcurveto", " -430 vlineto", " 0 -148 77 -189 215 -115 rrcurveto", " 16 hlineto", " 25 1 1 23 hvcurveto", " 0 18 -1 1 -4 3 rrcurveto", " -31 23 -72 51 -47 92 rrcurveto", " -39 76 -20 77 0 87 rrcurveto", " closepath", " endchar", " } ND") # 233 = /bracketlefttp # Almost verbatim copy of cmex /[floor|ceiling][left|right]big # renamed as /bracket[left|right][bt|tp] # Just to shift the whole character up to positive character coordinates # so can draw it just as a normal char charmetric <- c(charmetric, "C 233 ; WX 472.222 ; N bracketlefttp ; B 202 -40 449 1159 ;") charstr <- c(charstr, "/bracketlefttp {", " 202 4250 9 div", " hsbw", # Modify stem hint " -21 1159 hstem", " 0 40 hstem", " 0 40 vstem", # Modify first moveto " -40 vmoveto", " 40 hlineto", " 1159 vlineto", " 207 hlineto", " 40 vlineto", " -247 hlineto", " closepath", " endchar", " } ND\n") # 234 = /bracketleftex charmetric <- addAFMchar(charmetric, 234, "bracketleftex", cmex10afm) charstr <- addRAWchar(charstr, "bracketleftex", cmex10raw) # 235 = /brackeleftbt charmetric <- c(charmetric, "C 235 ; WX 472.222 ; N bracketleftbt ; B 202 -40 449 1159 ;") charstr <- c(charstr, "/bracketleftbt {", " 202 4250 9 div", " hsbw", # Modify stem hint " -40 1159 hstem", " 20 20 hstem", " 0 40 vstem", # Modify first moveto " -40 vmoveto", " 247 hlineto", " 40 vlineto", " -207 hlineto", " 1159 vlineto", " -40 hlineto", " closepath", " endchar", " } ND\n") # 236 = /bracelefttp = cmex10 /bracelefttp charmetric <- addAFMchar(charmetric, 236, "bracelefttp", cmex10afm) charstr <- addRAWchar(charstr, "bracelefttp", cmex10raw) # 237 = /braceleftmid = cmex10 /braceleftmid charmetric <- addAFMchar(charmetric, 237, "braceleftmid", cmex10afm) charstr <- addRAWchar(charstr, "braceleftmid", cmex10raw) # 238 = /braceleftbt = cmex10 /braceleftbt charmetric <- addAFMchar(charmetric, 238, "braceleftbt", cmex10afm) charstr <- addRAWchar(charstr, "braceleftbt", cmex10raw) # 239 = /braceex = cmex10 /braceex charmetric <- addAFMchar(charmetric, 239, "braceex", cmex10afm) charstr <- addRAWchar(charstr, "braceex", cmex10raw) # 240 = /.notdef # 241 = /angleright = cmsy10 /angbracketright charmetric <- addAFMchar(charmetric, 241, "angleright", cmsy10afm, "angbracketright") charstr <- addRAWchar(charstr, "angleright", cmsy10raw, "angbracketright") # 242 = /integral = cmsy10 /integral charmetric <- addAFMchar(charmetric, 242, "integral", cmsy10afm) charstr <- addRAWchar(charstr, "integral", cmsy10raw) # 243 = /integraltp # Hack cmex /integraltext to produce integraltp and integralbt (and integralex) charmetric <- c(charmetric, # bottom at -480, width reduced by 14 "C 243 ; WX 439.222 ; N integraltp ; B 56 -480 576 0 ;") charstr <- c(charstr, "/integraltp {", " 56 3953 9 div", " hsbw", " -1111 22 hstem", " -1066 81 hstem", " -126 81 hstem", " -22 22 hstem", " 0 83 vstem", " 470 83 vstem", " 318 -231 rmoveto", " 14 184 34 25 45 0 rrcurveto", " 10 0 31 -2 22 -19 rrcurveto", " -29 -4 -8 -23 0 -14 rrcurveto", " -29 22 -13 19 vhcurveto", " 20 22 13 30 hvcurveto", " 48 -50 35 -60 vhcurveto", " -95 0 -39 -97 -17 -76 rrcurveto", " -12 -55 -12 -252 0 0 rrcurveto", # square off " 83 hlineto", " closepath", " endchar", " } ND") # 244 = /integralex charmetric <- c(charmetric, # top at -480, bottom at -631, width reduced by 33 "C 244 ; WX 439.222 ; N integralex ; B 56 -631 576 -480 ;") charstr <- c(charstr, "/integralex {", " 56 3953 9 div", " hsbw", " -1111 22 hstem", " -1066 81 hstem", " -126 81 hstem", " -22 22 hstem", " 0 83 vstem", " 470 83 vstem", # new outline " 235 -480 rmoveto", " -151 vlineto", " 83 hlineto", " 151 vlineto", " closepath", " endchar", " } ND") # 245 = /integralbt charmetric <- c(charmetric, # top at -631, width reduced 14 "C 245 ; WX 439.222 ; N integralbt ; B 56 -1111 576 -631 ;") charstr <- c(charstr, "/integralbt {", " 56 3953 9 div", " hsbw", " -1111 22 hstem", " -1066 81 hstem", " -126 81 hstem", " -22 22 hstem", " 0 83 vstem", " 470 83 vstem", # new start point " 235 -631 rmoveto", # original integral outline " 0 -249 rlineto", " -13 -164 -36 -45 -57 0 rrcurveto", " -13 0 -30 3 -21 18 rrcurveto", " 29 4 8 23 0 14 rrcurveto", " 29 -22 13 -19 vhcurveto", " -20 -22 -13 -30 hvcurveto", " -48 50 -35 60 vhcurveto", " 95 0 48 87 22 90 rrcurveto", " 13 52 11 251 0 0 rrcurveto", " closepath", " endchar", " } ND") # 246 = /parenrighttp # Just verbatim copy of /brace[left|right][tp|bt] and /braceex from cmex # Added rather than renamed because need original /bracelefttp etc as well # Use these rather than the Computer Modern parenlefttp, etc because # the Computer Modern parenlefttp etc are too big; CM has several sizes # of parentheses before it has to resort to extensible parentheses so # the extensible ones are quite huge charmetric <- c(charmetric, "C 246 ; WX 888.889 ; N parenrighttp ; B 170 -910 504 -1 ;") charstr <- c(charstr, "/parenrighttp {", " 170 8000 9 div", " hsbw", " -900 21 hstem", " -21 20 hstem", " 214 120 vstem", " 334 -453 rmoveto", " 0 147 -77 189 -215 116 rrcurveto", " -15 hlineto", " -26 -1 -1 -23 hvcurveto", " 0 -18 1 -1 4 -3 rrcurveto", " 31 -23 72 -51 47 -92 rrcurveto", " 27 -54 32 -78 0 -108 rrcurveto", " -430 vlineto", " -26 1 -1 27 vhcurveto", " 64 hlineto", " 27 1 1 26 hvcurveto", " closepath", " endchar", " } ND") # 247 = /parenrightex charmetric <- c(charmetric, "C 247 ; WX 888.889 ; N parenrightex ; B 384 -310 504 10 ;") charstr <- c(charstr, "/parenrightex {", " 384 8000 9 div", " hsbw", " -300 21 hstem", " -20 20 hstem", " 0 120 vstem", " 120 -17 rmoveto", " 26 -1 1 -27 vhcurveto", " -64 hlineto", " -27 -1 -1 -26 hvcurveto", " -266 vlineto", " -26 1 -1 27 vhcurveto", " 64 hlineto", " 27 1 1 26 hvcurveto", " closepath", " endchar", " } ND") # 248 = /parenrightbt charmetric <- c(charmetric, "C 248 ; WX 888.889 ; N parenrightbt ; B 170 -899 504 10 ;") charstr <- c(charstr, "/parenrightbt {", " 170 8000 9 div", " hsbw", " -899 21 hstem", " -20 20 hstem", " 214 120 vstem", " 214 -447 rmoveto", " 0 -87 -24 -188 -176 -124 rrcurveto", " -13 -10 -1 -1 0 -18 rrcurveto", " -23 1 -1 26 vhcurveto", " 15 hlineto", " 216 116 76 189 0 147 rrcurveto", " 430 vlineto", " 26 -1 1 -27 vhcurveto", " -64 hlineto", " -27 -1 -1 -26 hvcurveto", " closepath", " endchar", " } ND") # 249 = /bracketrighttp charmetric <- c(charmetric, "C 249 ; WX 472.222 ; N bracketrighttp ; B 22 -40 269 1159 ;") charstr <- c(charstr, "/bracketrighttp {", " 22 4250 9 div", " hsbw", # Modify stem hint " -21 1159 hstem", " 0 40 hstem", " 207 40 vstem", # Modify first moveto " 207 -40 rmoveto", " 40 hlineto", " 1199 vlineto", " -247 hlineto", " -40 vlineto", " 207 hlineto", " closepath", " endchar", " } ND\n") # 250 = /bracketrightex = cmex /bracketrightex charmetric <- addAFMchar(charmetric, 250, "bracketrightex", cmex10afm) charstr <- addRAWchar(charstr, "bracketrightex", cmex10raw) # 251 = /bracketrightbt charmetric <- c(charmetric, "C 251 ; WX 472.222 ; N bracketrightbt ; B 22 -40 269 1159 ;") charstr <- c(charstr, "/bracketrightbt {", " 22 4250 9 div", " hsbw", # Modify stem hint " -40 1159 hstem", " 20 20 hstem", " 207 40 vstem", # Modify first moveto " 207 0 rmoveto", " -207 hlineto", " -40 vlineto", " 247 hlineto", " 1199 vlineto", " -40 hlineto", " closepath", " endchar", " } ND\n") # 252 = /bracerighttp charmetric <- addAFMchar(charmetric, 252, "bracerighttp", cmex10afm) charstr <- addRAWchar(charstr, "bracerighttp", cmex10raw) # 253 = /bracerightmid charmetric <- addAFMchar(charmetric, 253, "bracerightmid", cmex10afm) charstr <- addRAWchar(charstr, "bracerightmid", cmex10raw) # 254 = /bracerightbt charmetric <- addAFMchar(charmetric, 254, "bracerightbt", cmex10afm) charstr <- addRAWchar(charstr, "bracerightbt", cmex10raw) # 255 = /.notdef # Kern info for AFM # (order not important) # list(list(charnum, charname, source, sourcecharname), ...) chars <- list(list(32, "space", "cmr"), list(33, "exclam", "cmr"), list(34, "universal", "cmsy"), list(35, "numbersign", "cmr"), list(36, "existential", "cmsy"), list(37, "percent", "cmr"), list(38, "ampersand", "cmr"), list(39, "suchthat", "cmsy", "owner"), list(40, "parenleft", "cmr"), list(41, "parenright", "cmr"), list(42, "asteriskmath", "cmsy"), list(43, "plus", "cmr"), list(44, "comma", "cmr"), list(45, "minus", "cmsy"), list(46, "period", "cmr"), list(47, "slash", "cmr"), list(48, "zero", "cmr"), list(49, "one", "cmr"), list(50, "two", "cmr"), list(51, "three", "cmr"), list(52, "four", "cmr"), list(53, "five", "cmr"), list(54, "six", "cmr"), list(55, "seven", "cmr"), list(56, "eight", "cmr"), list(57, "nine", "cmr"), list(58, "colon", "cmr"), list(59, "semicolon", "cmr"), list(60, "less", "cmmi"), list(61, "equal", "cmr"), list(62, "greater", "cmmi"), list(63, "question", "cmr"), list(64, "congruent", "cmsy", "similarequal"), list(65, "Alpha", "cmr", "A"), list(66, "Beta", "cmr", "B"), list(67, "Chi", "cmr", "X"), list(68, "Delta", "cmr"), list(69, "Epsilon", "cmr", "E"), list(70, "Phi", "cmr"), list(71, "Gamma", "cmr"), list(72, "Eta", "cmr", "H"), list(73, "Iota", "cmr", "I"), list(74, "theta1", "cmmi"), list(75, "Kappa", "cmr", "K"), list(76, "Lambda", "cmr"), list(77, "Mu", "cmr", "M"), list(78, "Nu", "cmr", "N"), list(79, "Omicron", "cmr", "O"), list(80, "Pi", "cmr"), list(81, "Theta", "cmr"), list(82, "Rho", "cmr", "R"), list(83, "Sigma", "cmr"), list(84, "Tau", "cmr", "T"), list(85, "Upsilon", "cmr", "Y"), list(86, "sigma1", "cmmi"), list(87, "Omega", "cmr", "O"), list(88, "Xi", "cmr"), list(89, "Psi", "cmr"), list(90, "Zeta", "cmr", "Z"), list(91, "bracketleft", "cmr"), list(92, "therefore", "msam"), list(93, "bracketright", "cmr"), list(94, "perpendicular", "cmsy"), # list(95, "underscore", # list(96, "radicalex", list(97, "alpha", "cmmi"), list(98, "beta", "cmmi"), list(99, "chi", "cmmi"), list(100, "delta", "cmmi"), list(101, "epsilon", "cmmi"), list(102, "phi", "cmmi"), list(103, "gamma", "cmmi"), list(104, "eta", "cmmi"), list(105, "iota", "cmmi"), list(106, "phi1", "cmmi"), list(107, "kappa", "cmmi"), list(108, "lambda", "cmmi"), list(109, "mu", "cmmi"), list(110, "nu", "cmmi"), list(111, "omicron", "cmr", "o"), list(112, "pi", "cmmi"), list(113, "theta", "cmmi"), list(114, "rho", "cmmi"), list(115, "sigma", "cmmi"), list(116, "tau", "cmmi"), list(117, "upsilon", "cmmi"), list(118, "omega1", "cmmi", "pi1"), list(119, "omega", "cmmi"), list(120, "xi", "cmmi"), list(121, "psi", "cmmi"), list(122, "zeta", "cmmi"), list(123, "braceleft", "cmsy"), list(124, "bar", "cmsy"), list(125, "braceright", "cmsy"), list(126, "similar", "cmsy"), # list(160, "Euro", list(161, "Upsilon1", "cmr", "Upsilon"), list(162, "minute", "cmr", "acute"), list(163, "lessequal", "cmsy"), list(164, "fraction", "cmsy", "negationslash"), list(165, "infinity", "cmsy"), list(166, "florin", "cmmi", "f"), list(167, "club", "cmsy"), list(168, "diamond", "cmsy"), list(169, "heart", "cmsy"), list(170, "spade", "cmsy"), list(171, "arrowboth", "cmsy"), list(172, "arrowleft", "cmsy"), list(173, "arrowup", "cmsy"), list(174, "arrowright", "cmsy"), list(175, "arrowdown", "cmsy"), list(176, "degree", "cmr", "ring"), list(177, "plusminus", "cmsy"), list(178, "second", "cmr", "hungarumlaut"), list(179, "greaterequal", "cmsy"), list(180, "multiply", "cmsy"), list(181, "proportional", "cmsy"), list(182, "partialdiff", "cmmi"), list(183, "bullet", "cmsy"), list(184, "divide", "cmsy"), #CUSTOM list(185, "notequal", list(186, "equivalence", "cmsy"), list(187, "approxequal", "cmsy"), #CUSTOM list(188, "ellipsis", list(189, "arrowvertex", "cmex"), list(190, "arrowhorizex", "cmr", "endash"), # list(191, "carriagereturn", list(192, "aleph", "cmsy"), list(193, "Ifraktur", "cmsy", "Ifractur"), list(194, "Rfraktur", "cmsy", "Rfractur"), list(195, "weierstrass", "cmmi"), list(196, "circlemultiply", "cmsy"), list(197, "circleplus", "cmsy"), list(198, "emptyset", "cmsy"), list(199, "intersection", "cmsy"), list(200, "union", "cmsy"), list(201, "propersuperset", "cmsy"), list(202, "reflexsuperset", "cmsy"), #CUSTOM list(203, "notsubset", list(204, "propersubset", "cmsy"), list(205, "reflexsubset", "cmsy"), list(206, "element", "cmsy"), #CUSTOM list(207, "notelement", list(208, "angle", "msam"), list(209, "gradient", "cmsy", "nabla"), # list(210, "registerserif", #CUSTOM list(211, "copyrightserif", # list(212, "trademarkserif", #CUSTOM list(213, "product", "cmex", "producttext"), list(214, "radical", "cmsy"), list(215, "dotmath", "cmsy", "periodcentered"), list(216, "logicalnot", "cmsy"), list(217, "logicaland", "cmsy"), list(218, "logicalor", "cmsy"), list(219, "arrowdblboth", "cmsy"), list(220, "arrowdblleft", "cmsy"), list(221, "arrowdblup", "cmsy"), list(222, "arrowdblright", "cmsy"), list(223, "arrowdbldown", "cmsy"), list(224, "lozenge", "msam", "diamond"), list(225, "angleleft", "cmsy", "angbracketleft"), # list(226, "registersans", # list(227, "copyrightsans", # list(228, "trademarksans", #CUSTOM list(229, "summation", #CUSTOM list(230, "parenlefttp", #CUSTOM list(231, "parenleftex", #CUSTOM list(232, "parenleftbt", #CUSTOM list(233, "bracketlefttp", list(234, "bracketleftex", "cmex"), #CUSTOM list(235, "bracketleftbt", list(236, "bracelefttp", "cmex"), list(237, "braceleftmid", "cmex"), list(238, "braceleftbt", "cmex"), list(239, "braceex", "cmex"), list(241, "angleright", "cmsy", "angbracketright"), list(242, "integral", "cmsy"), #CUSTOM list(243, "integraltp", #CUSTOM list(244, "integralex", #CUSTOM list(245, "integralbt", #CUSTOM list(246, "parenrighttp", #CUSTOM list(247, "parenrightex", #CUSTOM list(248, "parenrightbt", #CUSTOM list(249, "bracketrighttp", list(250, "bracketrightex", "cmex"), #CUSTOM list(251, "bracketrightbt", list(252, "bracerighttp", "cmex"), list(253, "bracerightmid", "cmex"), list(254, "bracerightbt", "cmex")) # for each char in 'chars', look for original name in kern data # in original file. If there is any, retain any kern # information that involves any other character also used from # that original file. kernpairs <- NULL # Tell me the names of characters in chars from the same font as 'font' charsInSameFont <- function(char, font) { if (char[[3]] == font) { if (length(char) > 3) char[[4]] else char[[2]] } else { NULL } } getKerns <- function(char) { afm <- get(paste(char[[3]], "10afm", sep="")) if (length(char) > 3) charname <- char[[4]] else charname <- char[[2]] kerns <- grep(paste("^KPX (", charname, "|[a-z]+ ", charname, ")", sep=""), afm) if (length(kerns) > 0) { # Only keep kerns involving otherChars in same font otherChars <- unlist(lapply(chars, charsInSameFont, char[[3]])) kerns <- kerns[sub("^KPX ", "", sub(paste("( ", charname, "|", charname, " )", sep=""), "", sub(" [0-9.]+", "", afm[kerns]))) %in% otherChars] } if (length(kerns) > 1) afm[kerns] else NULL } # Currently produces nothing, but leave in here in case # something turns up in a character added later kernpairs <- unlist(lapply(chars, getKerns)) # Put it all together newafm <- c(afmhead, paste("StartCharMetrics", length(charmetric)), charmetric, "EndCharMetrics") if (length(kernpairs > 0)) newafm <- c(newafm, "StartKernData", paste("StartKernPairs", length(kernpairs)), kernpairs, "EndKernPairs", "EndKernData") newafm <- c(newafm, "EndFontMetrics") newraw <- c(rawhead, othersubrs, paste("/Subrs", nsub, "array"), subrs, "ND", # Assume same number of char outlines as char metrics(!) # + 1 for .notdef paste("2 index /CharStrings", length(charmetric) + 1, "dict dup begin"), charstr, rawfoot) writeLines(newafm, "cmsyase.afm") writeLines(newraw, "cmsyase.raw") # Don't forget to remake .pfb using t1asm ! (see log.txt) system("t1utils-1.32/t1asm -b cmsyase.raw cmsyase.pfb")