diff --git a/DESCRIPTION b/DESCRIPTION index 4c1a043a..64687eaa 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -32,7 +32,8 @@ Imports: Rcpp, stats, utils, - zip + zip, + stringi Suggests: knitr, pkgdown, diff --git a/NAMESPACE b/NAMESPACE index 34bcf493..b21bd415 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -74,6 +74,7 @@ export(writeFormula) import(grDevices) import(methods) import(stats) +import(stringi) importFrom(Rcpp,sourceCpp) importFrom(utils,download.file) importFrom(utils,head) diff --git a/R/WorkbookClass.R b/R/WorkbookClass.R index de5096df..e701731a 100644 --- a/R/WorkbookClass.R +++ b/R/WorkbookClass.R @@ -1,2945 +1,17495 @@ + #' @include class_definitions.R +#' @import stringi -Workbook$methods(initialize = function(creator = "", title = NULL, subject = NULL, category = NULL){ - - charts <<- list() - isChartSheet <<- logical(0) - - colWidths <<- list() - connections <<- NULL - Content_Types <<- genBaseContent_Type() - core <<- genBaseCore(creator = creator, title = title, subject = subject, category = category) - comments <<- list() - - - drawings <<- list() - drawings_rels <<- list() - - embeddings <<- NULL - externalLinks <<- NULL - externalLinksRels <<- NULL - - headFoot <<- NULL - - media <<- list() - - pivotTables <<- NULL - pivotTables.xml.rels <<- NULL - pivotDefinitions <<- NULL - pivotRecords <<- NULL - pivotDefinitionsRels <<- NULL - - queryTables <<- NULL - rowHeights <<- list() - - slicers <<- NULL - slicerCaches <<- NULL - - sheet_names <<- character(0) - sheetOrder <<- integer(0) - - sharedStrings <<- list() - attr(sharedStrings, "uniqueCount") <<- 0 - - styles <<- genBaseStyleSheet() - styleObjects <<- list() - - - tables <<- NULL - tables.xml.rels <<- NULL - theme <<- NULL - - - vbaProject <<- NULL - vml <<- list() - vml_rels <<- list() - - - - workbook <<- genBaseWorkbook() - workbook.xml.rels <<- genBaseWorkbook.xml.rels() - workbookProtection <<- NULL - - worksheets <<- list() - worksheets_rels <<- list() - - - -}) - - - - - - - -Workbook$methods(addWorksheet = function(sheetName - , showGridLines = TRUE - , tabColour = NULL - , zoom = 100 - , oddHeader = NULL - , oddFooter = NULL - , evenHeader = NULL - , evenFooter = NULL - , firstHeader = NULL - , firstFooter = NULL - , visible = TRUE - , paperSize = 9 - , orientation = 'portrait' - , hdpi = 300 - , vdpi = 300){ - if (!missing(sheetName)) { - if (grepl(pattern=":", x=sheetName)) stop("colon not allowed in sheet names in Excel") - } - newSheetIndex = length(worksheets) + 1L - - if(newSheetIndex > 1){ - sheetId <- max(as.integer(regmatches(workbook$sheets, regexpr('(?<=sheetId=")[0-9]+', workbook$sheets, perl = TRUE)))) + 1L - }else{ - sheetId <- 1 +Workbook$methods( + initialize = function(creator = "", + title = NULL, + subject = NULL, + category = NULL) { + charts <<- list() + isChartSheet <<- logical(0) + + colWidths <<- list() + connections <<- NULL + Content_Types <<- genBaseContent_Type() + core <<- + genBaseCore( + creator = creator, + title = title, + subject = subject, + category = category + ) + comments <<- list() + + + drawings <<- list() + drawings_rels <<- list() + + embeddings <<- NULL + externalLinks <<- NULL + externalLinksRels <<- NULL + + headFoot <<- NULL + + media <<- list() + + pivotTables <<- NULL + pivotTables.xml.rels <<- NULL + pivotDefinitions <<- NULL + pivotRecords <<- NULL + pivotDefinitionsRels <<- NULL + + queryTables <<- NULL + rowHeights <<- list() + + slicers <<- NULL + slicerCaches <<- NULL + + sheet_names <<- character(0) + sheetOrder <<- integer(0) + + sharedStrings <<- list() + attr(sharedStrings, "uniqueCount") <<- 0 + + styles <<- genBaseStyleSheet() + styleObjects <<- list() + + + tables <<- NULL + tables.xml.rels <<- NULL + theme <<- NULL + + + vbaProject <<- NULL + vml <<- list() + vml_rels <<- list() + + + + workbook <<- genBaseWorkbook() + workbook.xml.rels <<- genBaseWorkbook.xml.rels() + workbookProtection <<- NULL + + worksheets <<- list() + worksheets_rels <<- list() + + + } - - - ## fix visible value - visible <- tolower(visible) - if(visible == "true") - visible <- "visible" - - if(visible == "false") - visible <- "hidden" - - if(visible == "veryhidden") - visible <- "veryHidden" - - - ## Add sheet to workbook.xml - workbook$sheets <<- c(workbook$sheets, sprintf('', sheetName, sheetId, visible, newSheetIndex)) - - ## append to worksheets list - worksheets <<- append(worksheets, WorkSheet$new( showGridLines = showGridLines - , tabSelected = newSheetIndex == 1 - , tabColour = tabColour - , zoom = zoom - , oddHeader = oddHeader - , oddFooter = oddFooter - , evenHeader = evenHeader - , evenFooter = evenFooter - , firstHeader = firstHeader - , firstFooter = firstFooter - , paperSize = paperSize - , orientation = orientation - , hdpi = hdpi - , vdpi = vdpi)) - - - ## update content_tyes - ## add a drawing.xml for the worksheet - Content_Types <<- c(Content_Types, sprintf('', newSheetIndex), - sprintf('', newSheetIndex)) - - ## Update xl/rels - workbook.xml.rels <<- c(workbook.xml.rels, - sprintf('', newSheetIndex) - ) - - - ## create sheet.rels to simplify id assignment - worksheets_rels[[newSheetIndex]] <<- genBaseSheetRels(newSheetIndex) - drawings_rels[[newSheetIndex]] <<- list() - drawings[[newSheetIndex]] <<- list() - - vml_rels[[newSheetIndex]] <<- list() - vml[[newSheetIndex]] <<- list() - - isChartSheet[[newSheetIndex]] <<- FALSE - comments[[newSheetIndex]] <<- list() - - rowHeights[[newSheetIndex]] <<- list() - colWidths[[newSheetIndex]] <<- list() - - sheetOrder <<- c(sheetOrder, as.integer(newSheetIndex)) - sheet_names <<- c(sheet_names, sheetName) - - invisible(newSheetIndex) - -}) - - -Workbook$methods(cloneWorksheet = function(sheetName, clonedSheet){ - clonedSheet = validateSheet(clonedSheet) - if (!missing(sheetName)) { - if (grepl(pattern=":", x=sheetName)) stop("colon not allowed in sheet names in Excel") - } - newSheetIndex = length(worksheets) + 1L - if(newSheetIndex > 1){ - sheetId <- max(as.integer(regmatches(workbook$sheets, regexpr('(?<=sheetId=")[0-9]+', workbook$sheets, perl = TRUE)))) + 1L - }else{ - sheetId <- 1 +) + + + + + + + +Workbook$methods( + addWorksheet = function(sheetName + , + showGridLines = TRUE + , + tabColour = NULL + , + zoom = 100 + , + oddHeader = NULL + , + oddFooter = NULL + , + evenHeader = NULL + , + evenFooter = NULL + , + firstHeader = NULL + , + firstFooter = NULL + , + visible = TRUE + , + paperSize = 9 + , + orientation = 'portrait' + , + hdpi = 300 + , + vdpi = 300) { + if (!missing(sheetName)) { + if (grepl(pattern = ":", x = sheetName)) + stop("colon not allowed in sheet names in Excel") + } + newSheetIndex = length(worksheets) + 1L + + if (newSheetIndex > 1) { + sheetId <- + max(as.integer(regmatches( + workbook$sheets, + regexpr('(?<=sheetId=")[0-9]+', workbook$sheets, perl = TRUE) + ))) + 1L + } else{ + sheetId <- 1 + } + + + ## fix visible value + visible <- tolower(visible) + if (visible == "true") + visible <- "visible" + + if (visible == "false") + visible <- "hidden" + + if (visible == "veryhidden") + visible <- "veryHidden" + + + ## Add sheet to workbook.xml + workbook$sheets <<- + c( + workbook$sheets, + sprintf( + '', + sheetName, + sheetId, + visible, + newSheetIndex + ) + ) + + ## append to worksheets list + worksheets <<- + append( + worksheets, + WorkSheet$new( + showGridLines = showGridLines + , + tabSelected = newSheetIndex == 1 + , + tabColour = tabColour + , + zoom = zoom + , + oddHeader = oddHeader + , + oddFooter = oddFooter + , + evenHeader = evenHeader + , + evenFooter = evenFooter + , + firstHeader = firstHeader + , + firstFooter = firstFooter + , + paperSize = paperSize + , + orientation = orientation + , + hdpi = hdpi + , + vdpi = vdpi + ) + ) + + + ## update content_tyes + ## add a drawing.xml for the worksheet + Content_Types <<- + c( + Content_Types, + sprintf( + '', + newSheetIndex + ), + sprintf( + '', + newSheetIndex + ) + ) + + ## Update xl/rels + workbook.xml.rels <<- c( + workbook.xml.rels, + sprintf( + '', + newSheetIndex + ) + ) + + + ## create sheet.rels to simplify id assignment + worksheets_rels[[newSheetIndex]] <<- + genBaseSheetRels(newSheetIndex) + drawings_rels[[newSheetIndex]] <<- list() + drawings[[newSheetIndex]] <<- list() + + vml_rels[[newSheetIndex]] <<- list() + vml[[newSheetIndex]] <<- list() + + isChartSheet[[newSheetIndex]] <<- FALSE + comments[[newSheetIndex]] <<- list() + + rowHeights[[newSheetIndex]] <<- list() + colWidths[[newSheetIndex]] <<- list() + + sheetOrder <<- c(sheetOrder, as.integer(newSheetIndex)) + sheet_names <<- c(sheet_names, sheetName) + + invisible(newSheetIndex) + } - - - ## copy visibility from cloned sheet! - visible <- regmatches(workbook$sheets[[clonedSheet]], regexpr('(?<=state=")[^"]+', workbook$sheets[[clonedSheet]], perl = TRUE)) - - ## Add sheet to workbook.xml - workbook$sheets <<- c(workbook$sheets, sprintf('', sheetName, sheetId, visible, newSheetIndex)) - - ## append to worksheets list - worksheets <<- append(worksheets, worksheets[[clonedSheet]]$copy()) - - - ## update content_tyes - ## add a drawing.xml for the worksheet - Content_Types <<- c(Content_Types, sprintf('', newSheetIndex), - sprintf('', newSheetIndex)) - - ## Update xl/rels - workbook.xml.rels <<- c(workbook.xml.rels, - sprintf('', newSheetIndex) - ) - - ## create sheet.rels to simplify id assignment - worksheets_rels[[newSheetIndex]] <<- genBaseSheetRels(newSheetIndex) - drawings_rels[[newSheetIndex]] <<- drawings_rels[[clonedSheet]] - - # give each chart its own filename (images can re-use the same file, but charts can't) - drawings_rels[[newSheetIndex]] <<- sapply(drawings_rels[[newSheetIndex]], function (rl) { - chartfiles <- regmatches(rl, gregexpr('(?<=charts/)chart[0-9]+\\.xml', rl, perl = TRUE))[[1]] - for (cf in chartfiles) { - chartid <- length(charts) + 1 - newname <- paste0("chart", chartid, ".xml") - fl <- charts[cf] - - # Read the chartfile and adjust all formulas to point to the new - # sheet name instead of the clone source - # The result is saved to a new chart xml file - newfl <- file.path(dirname(fl), newname) - charts[newname] <<- newfl - chart <- readLines(fl, warn = FALSE, encoding = "UTF-8") - chart <- gsub(paste0("(?<=')", sheet_names[[clonedSheet]], "(?='!)"), paste0("'", sheetName, "'"), chart, perl = TRUE) - chart <- gsub(paste0("(?<=[^A-Za-z0-9])", sheet_names[[clonedSheet]], "(?=!)"), paste0("'", sheetName, "'"), chart, perl = TRUE) - writeLines(chart, newfl) - # file.copy(fl, newfl) - Content_Types <<- c(Content_Types, sprintf('', newname)) - rl = gsub(paste0('(?<=charts/)', cf), newname, rl, perl = TRUE) - } - rl - }, USE.NAMES = FALSE) - # The IDs in the drawings array are sheet-specific, so within the new cloned sheet - # the same IDs can be used => no need to modify drawings - drawings[[newSheetIndex]] <<- drawings[[clonedSheet]] - - vml_rels[[newSheetIndex]] <<- vml_rels[[clonedSheet]] - vml[[newSheetIndex]] <<- vml[[clonedSheet]] - - isChartSheet[[newSheetIndex]] <<- isChartSheet[[clonedSheet]] - comments[[newSheetIndex]] <<- comments[[clonedSheet]] - - rowHeights[[newSheetIndex]] <<- rowHeights[[clonedSheet]] - colWidths[[newSheetIndex]] <<- colWidths[[clonedSheet]] - - sheetOrder <<- c(sheetOrder, as.integer(newSheetIndex)) - sheet_names <<- c(sheet_names, sheetName) - - - ############################ - ## STYLE - ## ... objects are stored in a global list, so we need to get all styles - ## assigned to the cloned sheet and duplicate them - sheetStyles = Filter(function(s) {s$sheet == sheet_names[[clonedSheet]]}, styleObjects) - styleObjects <<- c(styleObjects, - Map(function(s) {s$sheet = sheetName; s}, sheetStyles) - ) - - - ############################ - ## TABLES - ## ... are stored in the $tables list, with the name and sheet as attr - ## and in the worksheets[]$tableParts list. We also need to adjust the - ## worksheets_rels and set the content type for the new table - - tbls = tables[attr(tables, "sheet") == clonedSheet] - for (t in tbls) { +) + + +Workbook$methods( + cloneWorksheet = function(sheetName, clonedSheet) { + clonedSheet = validateSheet(clonedSheet) + if (!missing(sheetName)) { + if (grepl(pattern = ":", x = sheetName)) + stop("colon not allowed in sheet names in Excel") + } + newSheetIndex = length(worksheets) + 1L + if (newSheetIndex > 1) { + sheetId <- + max(as.integer(regmatches( + workbook$sheets, + regexpr('(?<=sheetId=")[0-9]+', workbook$sheets, perl = TRUE) + ))) + 1L + } else{ + sheetId <- 1 + } + + + ## copy visibility from cloned sheet! + visible <- + regmatches(workbook$sheets[[clonedSheet]], + regexpr('(?<=state=")[^"]+', workbook$sheets[[clonedSheet]], perl = TRUE)) + + ## Add sheet to workbook.xml + workbook$sheets <<- + c( + workbook$sheets, + sprintf( + '', + sheetName, + sheetId, + visible, + newSheetIndex + ) + ) + + ## append to worksheets list + worksheets <<- + append(worksheets, worksheets[[clonedSheet]]$copy()) + + + ## update content_tyes + ## add a drawing.xml for the worksheet + Content_Types <<- + c( + Content_Types, + sprintf( + '', + newSheetIndex + ), + sprintf( + '', + newSheetIndex + ) + ) + + ## Update xl/rels + workbook.xml.rels <<- c( + workbook.xml.rels, + sprintf( + '', + newSheetIndex + ) + ) + + ## create sheet.rels to simplify id assignment + worksheets_rels[[newSheetIndex]] <<- + genBaseSheetRels(newSheetIndex) + drawings_rels[[newSheetIndex]] <<- drawings_rels[[clonedSheet]] + + # give each chart its own filename (images can re-use the same file, but charts can't) + drawings_rels[[newSheetIndex]] <<- + sapply(drawings_rels[[newSheetIndex]], function (rl) { + chartfiles <- + regmatches(rl, + gregexpr('(?<=charts/)chart[0-9]+\\.xml', rl, perl = TRUE))[[1]] + for (cf in chartfiles) { + chartid <- length(charts) + 1 + newname <- stri_join("chart", chartid, ".xml") + fl <- charts[cf] + + # Read the chartfile and adjust all formulas to point to the new + # sheet name instead of the clone source + # The result is saved to a new chart xml file + newfl <- file.path(dirname(fl), newname) + charts[newname] <<- newfl + chart <- readLines(fl, warn = FALSE, encoding = "UTF-8") + chart <- + gsub( + stri_join("(?<=')", sheet_names[[clonedSheet]], "(?='!)"), + stri_join("'", sheetName, "'"), + chart, + perl = TRUE + ) + chart <- + gsub( + stri_join("(?<=[^A-Za-z0-9])", sheet_names[[clonedSheet]], "(?=!)"), + stri_join("'", sheetName, "'"), + chart, + perl = TRUE + ) + writeLines(chart, newfl) + # file.copy(fl, newfl) + Content_Types <<- + c( + Content_Types, + sprintf( + '', + newname + ) + ) + rl = gsub(stri_join('(?<=charts/)', cf), newname, rl, perl = TRUE) + } + rl + }, USE.NAMES = FALSE) + # The IDs in the drawings array are sheet-specific, so within the new cloned sheet + # the same IDs can be used => no need to modify drawings + drawings[[newSheetIndex]] <<- drawings[[clonedSheet]] + + vml_rels[[newSheetIndex]] <<- vml_rels[[clonedSheet]] + vml[[newSheetIndex]] <<- vml[[clonedSheet]] + + isChartSheet[[newSheetIndex]] <<- isChartSheet[[clonedSheet]] + comments[[newSheetIndex]] <<- comments[[clonedSheet]] + + rowHeights[[newSheetIndex]] <<- rowHeights[[clonedSheet]] + colWidths[[newSheetIndex]] <<- colWidths[[clonedSheet]] + + sheetOrder <<- c(sheetOrder, as.integer(newSheetIndex)) + sheet_names <<- c(sheet_names, sheetName) + + + ############################ + ## STYLE + ## ... objects are stored in a global list, so we need to get all styles + ## assigned to the cloned sheet and duplicate them + sheetStyles = Filter(function(s) { + s$sheet == sheet_names[[clonedSheet]] + }, styleObjects) + styleObjects <<- c(styleObjects, + Map(function(s) { + s$sheet = sheetName + s + }, sheetStyles)) + + + ############################ + ## TABLES + ## ... are stored in the $tables list, with the name and sheet as attr + ## and in the worksheets[]$tableParts list. We also need to adjust the + ## worksheets_rels and set the content type for the new table + + tbls = tables[attr(tables, "sheet") == clonedSheet] + for (t in tbls) { # Extract table name, displayName and ID from the xml oldname = regmatches(t, regexpr('(?<= name=")[^"]+', t, perl = TRUE)) olddispname = regmatches(t, regexpr('(?<= displayName=")[^"]+', t, perl = TRUE)) oldid = regmatches(t, regexpr('(?<= id=")[^"]+', t, perl = TRUE)) ref = regmatches(t, regexpr('(?<= ref=")[^"]+', t, perl = TRUE)) - + # Find new, unused table names by appending _n, where n=1,2,... n <- 0 - while (paste0(oldname, "_", n) %in% attr(tables, "tableName")) { - n <- n + 1 + while (stri_join(oldname, "_", n) %in% attr(tables, "tableName")) { + n <- n + 1 } - newname <- paste0(oldname, "_", n) - newdispname <- paste0(olddispname, "_", n) + newname <- stri_join(oldname, "_", n) + newdispname <- stri_join(olddispname, "_", n) newid <- as.character(length(tables) + 3L) # Use the table definition from the cloned sheet and simply replace the names newt <- t - newt <- gsub(paste0(" name=\"", oldname, "\""), paste0(" name=\"", newname, "\""), newt) - newt <- gsub(paste0(" displayName=\"", olddispname, "\""), paste0(" displayName=\"", newdispname, "\""), newt) - newt <- gsub(paste0("(', newid)) - attr(worksheets[[newSheetIndex]]$tableParts, "tableName") <<- c(attr(oldparts, "tableName"), newname) - names(attr(worksheets[[newSheetIndex]]$tableParts, "tableName")) <<- c(names(attr(oldparts, "tableName")), ref) - - Content_Types <<- c(Content_Types, sprintf('', newid)) + worksheets[[newSheetIndex]]$tableParts <<- + c(oldparts, sprintf('', newid)) + attr(worksheets[[newSheetIndex]]$tableParts, "tableName") <<- + c(attr(oldparts, "tableName"), newname) + names(attr(worksheets[[newSheetIndex]]$tableParts, "tableName")) <<- + c(names(attr(oldparts, "tableName")), ref) + + Content_Types <<- + c( + Content_Types, + sprintf( + '', + newid + ) + ) tables.xml.rels <<- append(tables.xml.rels, "") - worksheets_rels[[newSheetIndex]] <<- c(worksheets_rels[[newSheetIndex]], - sprintf('', - newid, newid)) - - } - - # TODO: The following items are currently NOT copied/duplicated for the cloned sheet: - # - Comments - # - Pivot tables - - invisible(newSheetIndex) - -}) - - -Workbook$methods(addChartSheet = function(sheetName, tabColour = NULL, zoom = 100){ - - newSheetIndex <- length(worksheets) + 1L - - if(newSheetIndex > 1){ - sheetId <- max(as.integer(regmatches(workbook$sheets, regexpr('(?<=sheetId=")[0-9]+', workbook$sheets, perl = TRUE)))) + 1L - }else{ - sheetId <- 1 - } - - ## Add sheet to workbook.xml - workbook$sheets <<- c(workbook$sheets, sprintf('', sheetName, sheetId, newSheetIndex)) - - ## append to worksheets list - worksheets <<- append(worksheets, ChartSheet$new(tabSelected = newSheetIndex == 1, tabColour = tabColour, zoom = zoom)) - sheet_names <<- c(sheet_names, sheetName) - - ## update content_tyes - Content_Types <<- c(Content_Types, sprintf('', newSheetIndex)) - - ## Update xl/rels - workbook.xml.rels <<- c(workbook.xml.rels, - sprintf('', newSheetIndex) - ) - - - - ## add a drawing.xml for the worksheet - Content_Types <<- c(Content_Types, sprintf('', newSheetIndex)) - - ## create sheet.rels to simplify id assignment - worksheets_rels[[newSheetIndex]] <<- genBaseSheetRels(newSheetIndex) - drawings_rels[[newSheetIndex]] <<- list() - drawings[[newSheetIndex]] <<- list() - - isChartSheet[[newSheetIndex]] <<- TRUE - - rowHeights[[newSheetIndex]] <<- list() - colWidths[[newSheetIndex]] <<- list() - - vml_rels[[newSheetIndex]] <<- list() - vml[[newSheetIndex]] <<- list() - - sheetOrder <<- c(sheetOrder, newSheetIndex) - - invisible(newSheetIndex) - -}) - - - -Workbook$methods(saveWorkbook = function(){ - - ## temp directory to save XML files prior to compressing - tmpDir <- file.path(tempfile(pattern = "workbookTemp_")) - - if(file.exists(tmpDir)) - unlink(tmpDir, recursive = TRUE, force = TRUE) - - success <- dir.create(path = tmpDir, recursive = TRUE) - if(!success) - stop(sprintf("Failed to create temporary directory '%s'", tmpDir)) - - .self$preSaveCleanUp() - - nSheets <- length(worksheets) - nThemes <- length(theme) - nPivots <- length(pivotDefinitions) - nSlicers <- length(slicers) - nComments <- sum(sapply(comments, length) > 0) - nVML <- sum(sapply(vml, length) > 0) - - relsDir <- file.path(tmpDir, "_rels") - dir.create(path = relsDir, recursive = TRUE) - - docPropsDir <- file.path(tmpDir, "docProps") - dir.create(path = docPropsDir, recursive = TRUE) - - xlDir <- file.path(tmpDir, "xl") - dir.create(path = xlDir, recursive = TRUE) - - xlrelsDir <- file.path(tmpDir, "xl","_rels") - dir.create(path = xlrelsDir, recursive = TRUE) - - xlTablesDir <- file.path(tmpDir, "xl","tables") - dir.create(path = xlTablesDir, recursive = TRUE) - - xlTablesRelsDir <- file.path(xlTablesDir, "_rels") - dir.create(path = xlTablesRelsDir, recursive = TRUE) - - if(length(media) > 0){ - xlmediaDir <- file.path(tmpDir, "xl", "media") - dir.create(path = xlmediaDir, recursive = TRUE) - } - - - ## will always have a theme - xlthemeDir <- file.path(tmpDir, "xl", "theme") - dir.create(path = xlthemeDir, recursive = TRUE) - - if(is.null(theme)){ - con <- file(file.path(xlthemeDir, "theme1.xml"), open = "wb") - writeBin(charToRaw(genBaseTheme()), con) - close(con) - }else{ - lapply(1:nThemes, function(i){ - con <- file(file.path(xlthemeDir, paste0("theme", i, ".xml")), open = "wb") - writeBin(charToRaw(pxml(theme[[i]])), con) - close(con) - }) - } - - - - - ## will always have drawings - xlworksheetsDir <- file.path(tmpDir, "xl", "worksheets") - dir.create(path = xlworksheetsDir, recursive = TRUE) - - xlworksheetsRelsDir <- file.path(tmpDir, "xl", "worksheets", "_rels") - dir.create(path = xlworksheetsRelsDir, recursive = TRUE) - - xldrawingsDir <- file.path(tmpDir, "xl", "drawings") - dir.create(path = xldrawingsDir, recursive = TRUE) - - xldrawingsRelsDir <- file.path(tmpDir, "xl", "drawings", "_rels") - dir.create(path = xldrawingsRelsDir, recursive = TRUE) - - ## charts - if(length(charts) > 0) - file.copy(from = dirname(charts[1]), to = file.path(tmpDir, "xl"), recursive = TRUE) - - - ## xl/comments.xml - if(nComments > 0 | nVML > 0){ - for(i in 1:nSheets){ - if(length(comments[[i]]) > 0){ - - fn <- sprintf("comments%s.xml", i) - - Content_Types <<- c(Content_Types, - sprintf('', fn)) - - worksheets_rels[[i]] <<- unique(c(worksheets_rels[[i]], - sprintf('', fn))) - - writeCommentXML(comment_list = comments[[i]], file_name = file.path(tmpDir, "xl", fn)) - } + worksheets_rels[[newSheetIndex]] <<- + c( + worksheets_rels[[newSheetIndex]], + sprintf( + '', + newid, + newid + ) + ) + } - .self$writeDrawingVML(xldrawingsDir) + # TODO: The following items are currently NOT copied/duplicated for the cloned sheet: + # - Comments + # - Pivot tables - } - - if(length(embeddings) > 0){ + invisible(newSheetIndex) - embeddingsDir <- file.path(tmpDir, "xl", "embeddings") - dir.create(path = embeddingsDir, recursive = TRUE) - for(fl in embeddings) - file.copy(from = fl, to = embeddingsDir, overwrite = TRUE) } - - - if(nPivots > 0){ +) + + +Workbook$methods( + addChartSheet = function(sheetName, + tabColour = NULL, + zoom = 100) { + newSheetIndex <- length(worksheets) + 1L + + if (newSheetIndex > 1) { + sheetId <- + max(as.integer(regmatches( + workbook$sheets, + regexpr('(?<=sheetId=")[0-9]+', workbook$sheets, perl = TRUE) + ))) + 1L + } else{ + sheetId <- 1 + } + + ## Add sheet to workbook.xml + workbook$sheets <<- + c( + workbook$sheets, + sprintf( + '', + sheetName, + sheetId, + newSheetIndex + ) + ) + + ## append to worksheets list + worksheets <<- + append( + worksheets, + ChartSheet$new( + tabSelected = newSheetIndex == 1, + tabColour = tabColour, + zoom = zoom + ) + ) + sheet_names <<- c(sheet_names, sheetName) - pivotTablesDir <- file.path(tmpDir, "xl", "pivotTables") - dir.create(path = pivotTablesDir, recursive = TRUE) + ## update content_tyes + Content_Types <<- + c( + Content_Types, + sprintf( + '', + newSheetIndex + ) + ) - pivotTablesRelsDir <- file.path(tmpDir, "xl", "pivotTables", "_rels") - dir.create(path = pivotTablesRelsDir, recursive = TRUE) + ## Update xl/rels + workbook.xml.rels <<- c( + workbook.xml.rels, + sprintf( + '', + newSheetIndex + ) + ) - pivotCacheDir <- file.path(tmpDir, "xl", "pivotCache") - dir.create(path = pivotCacheDir, recursive = TRUE) - pivotCacheRelsDir <- file.path(tmpDir, "xl", "pivotCache", "_rels") - dir.create(path = pivotCacheRelsDir, recursive = TRUE) - for(i in 1:length(pivotTables)) - file.copy(from = pivotTables[i], to = file.path(pivotTablesDir, sprintf("pivotTable%s.xml", i)), overwrite = TRUE, copy.date = TRUE) + ## add a drawing.xml for the worksheet + Content_Types <<- + c( + Content_Types, + sprintf( + '', + newSheetIndex + ) + ) - for(i in 1:length(pivotDefinitions)) - file.copy(from = pivotDefinitions[i], to = file.path(pivotCacheDir, sprintf("pivotCacheDefinition%s.xml", i)), overwrite = TRUE, copy.date = TRUE) + ## create sheet.rels to simplify id assignment + worksheets_rels[[newSheetIndex]] <<- + genBaseSheetRels(newSheetIndex) + drawings_rels[[newSheetIndex]] <<- list() + drawings[[newSheetIndex]] <<- list() - for(i in 1:length(pivotRecords)) - file.copy(from = pivotRecords[i], to = file.path(pivotCacheDir, sprintf("pivotCacheRecords%s.xml", i)), overwrite = TRUE, copy.date = TRUE) + isChartSheet[[newSheetIndex]] <<- TRUE - for(i in 1:length(pivotDefinitionsRels)) - file.copy(from = pivotDefinitionsRels[i], to = file.path(pivotCacheRelsDir, sprintf("pivotCacheDefinition%s.xml.rels", i)), overwrite = TRUE, copy.date = TRUE) + rowHeights[[newSheetIndex]] <<- list() + colWidths[[newSheetIndex]] <<- list() - for(i in 1:length(pivotTables.xml.rels)) - write_file(body = pivotTables.xml.rels[[i]], fl = file.path(pivotTablesRelsDir, sprintf("pivotTable%s.xml.rels", i))) + vml_rels[[newSheetIndex]] <<- list() + vml[[newSheetIndex]] <<- list() + sheetOrder <<- c(sheetOrder, newSheetIndex) + invisible(newSheetIndex) } - - ## slicers - if(nSlicers > 0){ +) + + + +Workbook$methods( + saveWorkbook = function() { + ## temp directory to save XML files prior to compressing + tmpDir <- file.path(tempfile(pattern = "workbookTemp_")) + + if (file.exists(tmpDir)) + unlink(tmpDir, recursive = TRUE, force = TRUE) + + success <- dir.create(path = tmpDir, recursive = TRUE) + if (!success) + stop(sprintf("Failed to create temporary directory '%s'", tmpDir)) - slicersDir <- file.path(tmpDir, "xl", "slicers") - dir.create(path = slicersDir, recursive = TRUE) + .self$preSaveCleanUp() - slicerCachesDir <- file.path(tmpDir, "xl", "slicerCaches") - dir.create(path = slicerCachesDir, recursive = TRUE) + nSheets <- length(worksheets) + nThemes <- length(theme) + nPivots <- length(pivotDefinitions) + nSlicers <- length(slicers) + nComments <- sum(sapply(comments, length) > 0) + nVML <- sum(sapply(vml, length) > 0) - for(i in 1:length(slicers)){ - if(nchar(slicers[i]) > 0) - file.copy(from = slicers[i], to = file.path(slicersDir, sprintf("slicer%s.xml", i))) + relsDir <- file.path(tmpDir, "_rels") + dir.create(path = relsDir, recursive = TRUE) + + docPropsDir <- file.path(tmpDir, "docProps") + dir.create(path = docPropsDir, recursive = TRUE) + + xlDir <- file.path(tmpDir, "xl") + dir.create(path = xlDir, recursive = TRUE) + + xlrelsDir <- file.path(tmpDir, "xl", "_rels") + dir.create(path = xlrelsDir, recursive = TRUE) + + xlTablesDir <- file.path(tmpDir, "xl", "tables") + dir.create(path = xlTablesDir, recursive = TRUE) + + xlTablesRelsDir <- file.path(xlTablesDir, "_rels") + dir.create(path = xlTablesRelsDir, recursive = TRUE) + + if (length(media) > 0) { + xlmediaDir <- file.path(tmpDir, "xl", "media") + dir.create(path = xlmediaDir, recursive = TRUE) } + ## will always have a theme + xlthemeDir <- file.path(tmpDir, "xl", "theme") + dir.create(path = xlthemeDir, recursive = TRUE) - for(i in 1:length(slicerCaches)) - write_file(body = slicerCaches[[i]], fl = file.path(slicerCachesDir, sprintf("slicerCache%s.xml", i))) + if (is.null(theme)) { + con <- file(file.path(xlthemeDir, "theme1.xml"), open = "wb") + writeBin(charToRaw(genBaseTheme()), con) + close(con) + } else{ + lapply(1:nThemes, function(i) { + con <- + file(file.path(xlthemeDir, stri_join("theme", i, ".xml")), open = "wb") + writeBin(charToRaw(pxml(theme[[i]])), con) + close(con) + }) + } - } - - - ## Write content - - ## write .rels - write_file(head = '', - body = ' - - ', - tail = '', - fl = file.path(relsDir, ".rels")) - - - ## write app.xml - write_file(head = '', - body = 'Microsoft Excel', - tail = '', - fl = file.path(docPropsDir, "app.xml")) - - ## write core.xml - write_file(head = "", body = pxml(core), tail = "", fl = file.path(docPropsDir, "core.xml")) - - ## write workbook.xml.rels - write_file(head = '', - body = pxml(workbook.xml.rels), - tail = '', - fl = file.path(xlrelsDir, "workbook.xml.rels")) - - ## write tables - if(length(unlist(tables, use.names = FALSE)) > 0){ - for(i in 1:length(unlist(tables, use.names = FALSE))){ - - if(!grepl("openxlsx_deleted", attr(tables, "tableName")[i], fixed = TRUE)){ - write_file(body = pxml(unlist(tables, use.names = FALSE)[[i]]), fl = file.path(xlTablesDir, sprintf("table%s.xml", i+2))) - if(tables.xml.rels[[i]] != "") - write_file(body = tables.xml.rels[[i]], fl = file.path(xlTablesRelsDir, sprintf("table%s.xml.rels", i+2))) + + + ## will always have drawings + xlworksheetsDir <- file.path(tmpDir, "xl", "worksheets") + dir.create(path = xlworksheetsDir, recursive = TRUE) + + xlworksheetsRelsDir <- + file.path(tmpDir, "xl", "worksheets", "_rels") + dir.create(path = xlworksheetsRelsDir, recursive = TRUE) + + xldrawingsDir <- file.path(tmpDir, "xl", "drawings") + dir.create(path = xldrawingsDir, recursive = TRUE) + + xldrawingsRelsDir <- file.path(tmpDir, "xl", "drawings", "_rels") + dir.create(path = xldrawingsRelsDir, recursive = TRUE) + + ## charts + if (length(charts) > 0) + file.copy( + from = dirname(charts[1]), + to = file.path(tmpDir, "xl"), + recursive = TRUE + ) + + + ## xl/comments.xml + if (nComments > 0 | nVML > 0) { + for (i in 1:nSheets) { + if (length(comments[[i]]) > 0) { + fn <- sprintf("comments%s.xml", i) + + Content_Types <<- c( + Content_Types, + sprintf( + '', + fn + ) + ) + + worksheets_rels[[i]] <<- unique(c( + worksheets_rels[[i]], + sprintf( + '', + fn + ) + )) + + writeCommentXML(comment_list = comments[[i]], + file_name = file.path(tmpDir, "xl", fn)) + } } + .self$writeDrawingVML(xldrawingsDir) + } - } - - - ## write query tables - if(length(queryTables) > 0){ - xlqueryTablesDir <- file.path(tmpDir, "xl","queryTables") - dir.create(path = xlqueryTablesDir, recursive = TRUE) - - for(i in 1:length(queryTables)) - write_file(body = queryTables[[i]], fl = file.path(xlqueryTablesDir, sprintf("queryTable%s.xml", i))) - } - - ## connections - if(length(connections) > 0) - write_file(body = connections, fl = file.path(xlDir,"connections.xml")) - - ## externalLinks - if(length(externalLinks)){ - externalLinksDir <- file.path(tmpDir, "xl","externalLinks") - dir.create(path = externalLinksDir, recursive = TRUE) - - for(i in 1:length(externalLinks)) - write_file(body = externalLinks[[i]], fl = file.path(externalLinksDir, sprintf("externalLink%s.xml", i))) - } - - ## externalLinks rels - if(length(externalLinksRels)){ - externalLinksRelsDir <- file.path(tmpDir, "xl","externalLinks", "_rels") - dir.create(path = externalLinksRelsDir, recursive = TRUE) - - for(i in 1:length(externalLinksRels)) - write_file(body = externalLinksRels[[i]], fl = file.path(externalLinksRelsDir, sprintf("externalLink%s.xml.rels", i))) - } - - # printerSettings - printDir <- file.path(tmpDir, "xl", "printerSettings") - dir.create(path = printDir, recursive = TRUE) - for(i in 1:nSheets) - writeLines(genPrinterSettings(), file.path(printDir, sprintf("printerSettings%s.bin", i))) - - ## media (copy file from origin to destination) - for(x in media) - file.copy(x, file.path(xlmediaDir, names(media)[which(media == x)])) - - ## VBA Macro - if(!is.null(vbaProject)) - file.copy(vbaProject, xlDir) - - ## write worksheet, worksheet_rels, drawings, drawing_rels - .self$writeSheetDataXML(xldrawingsDir, xldrawingsRelsDir, xlworksheetsDir, xlworksheetsRelsDir) - - ## write sharedStrings.xml - ct <- Content_Types - if(length(sharedStrings) > 0){ - write_file(head = sprintf('', length(sharedStrings), attr(sharedStrings, "uniqueCount")), - body = paste(sharedStrings, collapse = ""), - tail = "", - fl = file.path(xlDir,"sharedStrings.xml")) - }else{ - - ## Remove relationship to sharedStrings - ct <- ct[!grepl("sharedStrings", ct)] - } - - if(nComments > 0) - ct <- c(ct, '') - - ## write [Content_type] - write_file(head = '', - body = pxml(ct), - tail = '', - fl = file.path(tmpDir, "[Content_Types].xml")) - - - styleXML <- styles - styleXML$numFmts <- paste0(sprintf('', length(styles$numFmts)), pxml(styles$numFmts), '') - styleXML$fonts <- paste0(sprintf('', length(styles$fonts)), pxml(styles$fonts), '') - styleXML$fills <- paste0(sprintf('', length(styles$fills)), pxml(styles$fills), '') - styleXML$borders <- paste0(sprintf('', length(styles$borders)), pxml(styles$borders), '') - styleXML$cellStyleXfs <- c(sprintf('', length(styles$cellStyleXfs)), pxml(styles$cellStyleXfs), '') - styleXML$cellXfs <- paste0(sprintf('', length(styles$cellXfs)), pxml(styles$cellXfs), '') - styleXML$cellStyles <- paste0(sprintf('', length(styles$cellStyles)), pxml(styles$cellStyles), '') - styleXML$dxfs <- ifelse(length(styles$dxfs) == 0, '', paste0(sprintf('', length(styles$dxfs)), paste(unlist(styles$dxfs), collapse = ""), '')) - - ## write styles.xml - write_file(head = '', - body = pxml(styleXML), - tail = '', - fl = file.path(xlDir,"styles.xml")) - - ## write workbook.xml - workbookXML <- workbook - workbookXML$sheets <- paste0("", pxml(workbookXML$sheets), "") - if(length(workbookXML$definedNames) > 0) - workbookXML$definedNames <- paste0("", pxml(workbookXML$definedNames), "") - - - - if (length(workbookProtection) > 0) { - # Worksheet protection needs to be right after fileVersion, fileSharing and workbookPr, otherwise Excel will complain - workbookXML <- append(workbookXML, list(workbookProtection = workbookProtection), - after = max(which(names(workbookXML) %in% c("fileVersion", "fileSharing", "workbookPr")))) - } - - - write_file(head = '', - body = pxml(workbookXML), - tail = '', - fl = file.path(xlDir,"workbook.xml")) - workbook$sheets <<- workbook$sheets[order(sheetOrder)] ## Need to reset sheet order to allow multiple savings - - ## compress to xlsx - wd <- getwd() - tmpFile <- basename(tempfile(fileext = ifelse(is.null(vbaProject), ".xlsx", ".xlsm"))) - on.exit(expr = setwd(wd), add = TRUE) - - ## zip it - setwd(dir = tmpDir) - cl <- ifelse(!is.null(getOption("openxlsx.compresssionLevel")), getOption("openxlsx.compresssionLevel"), getOption("openxlsx.compresssionevel", 6)) - zip::zip(zipfile = tmpFile, files = list.files(tmpDir, full.names = FALSE, recursive = TRUE, include.dirs = FALSE, all.files=TRUE), compression_level = cl) - - ## reset styles - maintain any changes to base font - baseFont <- styles$fonts[[1]] - styles <<- genBaseStyleSheet(styles$dxfs, tableStyles = styles$tableStyles, extLst = styles$extLst) - styles$fonts[[1]] <<- baseFont - - - return(file.path(tmpDir, tmpFile)) - -}) - - - -Workbook$methods(updateSharedStrings = function(uNewStr){ - - ## Function will return named list of references to new strings - uStr <- uNewStr[which(!uNewStr %in% sharedStrings)] - uCount <- attr(sharedStrings, "uniqueCount") - sharedStrings <<- append(sharedStrings, uStr) - - attr(sharedStrings, "uniqueCount") <<- uCount + length(uStr) - -}) - - - -Workbook$methods(validateSheet = function(sheetName){ - - if(!is.numeric(sheetName)) - sheetName <- replaceIllegalCharacters(sheetName) - - if(is.null(sheet_names)) - stop("Workbook does not contain any worksheets.", call.=FALSE) - - if(is.numeric(sheetName)){ - if(sheetName > length(sheet_names)) - stop(sprintf("This Workbook only has %s sheets.", length(sheet_names)), call.=FALSE) - - return(sheetName) - - }else if(!sheetName %in% sheet_names){ - stop(sprintf("Sheet '%s' does not exist.", sheetName), call.=FALSE) - } - - return(which(sheet_names == sheetName)) - -}) - - - -Workbook$methods(getSheetName = function(sheetIndex){ - - if(any(length(sheet_names) < sheetIndex)) - stop(sprintf("Workbook only contains %s sheet(s).", length(sheet_names))) - - sheet_names[sheetIndex] - -}) - - - -Workbook$methods(buildTable = function(sheet, colNames, ref, showColNames, tableStyle, tableName, withFilter - , totalsRowCount = 0 - , showFirstColumn = 0 - , showLastColumn = 0 - , showRowStripes = 1 - , showColumnStripes = 0){ - - ## id will start at 3 and drawing will always be 1, printer Settings at 2 (printer settings has been removed) - id <- as.character(length(tables) + 3L) - sheet <- validateSheet(sheet) - - ## build table XML and save to tables field - table <- sprintf('
', - tableStyle, as.integer(showFirstColumn), as.integer(showLastColumn), as.integer(showRowStripes), as.integer(showColumnStripes)) - - - tables <<- c(tables, build_table_xml(table = table, tableStyleXML = tableStyleXML, ref = ref, colNames = gsub("\n|\r", "_x000a_", colNames), showColNames = showColNames, withFilter = withFilter)) - names(tables) <<- c(nms, ref) - attr(tables, "sheet") <<- c(tSheets, sheet) - attr(tables, "tableName") <<- c(tNames, tableName) - - worksheets[[sheet]]$tableParts <<- append(worksheets[[sheet]]$tableParts, sprintf('', id)) - attr(worksheets[[sheet]]$tableParts, "tableName") <<- c(tNames[tSheets == sheet & !grepl("openxlsx_deleted", tNames, fixed = TRUE)], tableName) - - - - ## update Content_Types - Content_Types <<- c(Content_Types, sprintf('', id)) - - ## create a table.xml.rels - tables.xml.rels <<- append(tables.xml.rels, "") - - ## update worksheets_rels - worksheets_rels[[sheet]] <<- c(worksheets_rels[[sheet]], - sprintf('', id, id)) - - -}) - - - - - - - - - -Workbook$methods(writeDrawingVML = function(dir){ - - for(i in 1:length(comments)){ - - id <- 1025 - - cd <- unlist(lapply(comments[[i]],"[[", "clientData")) - nComments <- length(cd) - - ## write head - if(nComments > 0 | length(vml[[i]]) > 0){ - - write(x = paste(' - - - - - - - '), file = file.path(dir, sprintf("vmlDrawing%s.vml", i))) + + if (length(embeddings) > 0) { + embeddingsDir <- file.path(tmpDir, "xl", "embeddings") + dir.create(path = embeddingsDir, recursive = TRUE) + for (fl in embeddings) + file.copy(from = fl, + to = embeddingsDir, + overwrite = TRUE) + } + + + if (nPivots > 0) { + pivotTablesDir <- file.path(tmpDir, "xl", "pivotTables") + dir.create(path = pivotTablesDir, recursive = TRUE) + + pivotTablesRelsDir <- + file.path(tmpDir, "xl", "pivotTables", "_rels") + dir.create(path = pivotTablesRelsDir, recursive = TRUE) + + pivotCacheDir <- file.path(tmpDir, "xl", "pivotCache") + dir.create(path = pivotCacheDir, recursive = TRUE) + + pivotCacheRelsDir <- + file.path(tmpDir, "xl", "pivotCache", "_rels") + dir.create(path = pivotCacheRelsDir, recursive = TRUE) + + for (i in 1:length(pivotTables)) + file.copy( + from = pivotTables[i], + to = file.path(pivotTablesDir, sprintf("pivotTable%s.xml", i)), + overwrite = TRUE, + copy.date = TRUE + ) + + for (i in 1:length(pivotDefinitions)) + file.copy( + from = pivotDefinitions[i], + to = file.path(pivotCacheDir, sprintf("pivotCacheDefinition%s.xml", i)), + overwrite = TRUE, + copy.date = TRUE + ) + + for (i in 1:length(pivotRecords)) + file.copy( + from = pivotRecords[i], + to = file.path(pivotCacheDir, sprintf("pivotCacheRecords%s.xml", i)), + overwrite = TRUE, + copy.date = TRUE + ) + + for (i in 1:length(pivotDefinitionsRels)) + file.copy( + from = pivotDefinitionsRels[i], + to = file.path( + pivotCacheRelsDir, + sprintf("pivotCacheDefinition%s.xml.rels", i) + ), + overwrite = TRUE, + copy.date = TRUE + ) + + for (i in 1:length(pivotTables.xml.rels)) + write_file(body = pivotTables.xml.rels[[i]], + fl = file.path(pivotTablesRelsDir, sprintf("pivotTable%s.xml.rels", i))) + + } - if(nComments > 0){ - for(j in 1:nComments){ - id <- id + 1L - write(x = genBaseShapeVML(cd[j], id), file = file.path(dir, sprintf("vmlDrawing%s.vml", i)), append = TRUE) + ## slicers + if (nSlicers > 0) { + slicersDir <- file.path(tmpDir, "xl", "slicers") + dir.create(path = slicersDir, recursive = TRUE) + + slicerCachesDir <- file.path(tmpDir, "xl", "slicerCaches") + dir.create(path = slicerCachesDir, recursive = TRUE) + + for (i in 1:length(slicers)) { + if (nchar(slicers[i]) > 0) + file.copy(from = slicers[i], to = file.path(slicersDir, sprintf("slicer%s.xml", i))) } + + + + for (i in 1:length(slicerCaches)) + write_file(body = slicerCaches[[i]], + fl = file.path(slicerCachesDir, sprintf("slicerCache%s.xml", i))) + + } - if(length(vml[[i]]) > 0) - write(x = vml[[i]], file = file.path(dir, sprintf("vmlDrawing%s.vml", i)), append = TRUE) - if(nComments > 0 | length(vml[[i]]) > 0){ - write(x = '', file = file.path(dir, sprintf("vmlDrawing%s.vml", i)), append = TRUE) - worksheets[[i]]$legacyDrawing <<- '' - } + ## Write content - } -}) - - - -Workbook$methods(updateStyles = function(style){ - - - ## Updates styles.xml - xfNode <- list(numFmtId = 0, - fontId = 0, - fillId = 0, - borderId = 0, - xfId = 0) - - - alignmentFlag <- FALSE - - ## Font - if(!is.null(style$fontName) | - !is.null(style$fontSize) | - !is.null(style$fontColour) | - !is.null(style$fontDecoration) | - !is.null(style$fontFamily) | - !is.null(style$fontScheme)){ + ## write .rels + write_file( + head = '', + body = ' + + ', + tail = '', + fl = file.path(relsDir, ".rels") + ) - fontNode <- .self$createFontNode(style) - fontId <- which(styles$fonts == fontNode) - 1L - if(length(fontId) == 0){ + ## write app.xml + write_file( + head = '', + body = 'Microsoft Excel', + tail = '', + fl = file.path(docPropsDir, "app.xml") + ) + + ## write core.xml + write_file( + head = "", + body = pxml(core), + tail = "", + fl = file.path(docPropsDir, "core.xml") + ) + + ## write workbook.xml.rels + write_file( + head = '', + body = pxml(workbook.xml.rels), + tail = '', + fl = file.path(xlrelsDir, "workbook.xml.rels") + ) + + ## write tables + if (length(unlist(tables, use.names = FALSE)) > 0) { + for (i in 1:length(unlist(tables, use.names = FALSE))) { + if (!grepl("openxlsx_deleted", attr(tables, "tableName")[i], fixed = TRUE)) { + write_file(body = pxml(unlist(tables, use.names = FALSE)[[i]]), + fl = file.path(xlTablesDir, sprintf("table%s.xml", i + 2))) + if (tables.xml.rels[[i]] != "") + write_file(body = tables.xml.rels[[i]], + fl = file.path(xlTablesRelsDir, sprintf("table%s.xml.rels", i + 2))) + } + + } + } + + + ## write query tables + if (length(queryTables) > 0) { + xlqueryTablesDir <- file.path(tmpDir, "xl", "queryTables") + dir.create(path = xlqueryTablesDir, recursive = TRUE) - fontId <- length(styles$fonts) - styles$fonts <<- append(styles[["fonts"]], fontNode) + for (i in 1:length(queryTables)) + write_file(body = queryTables[[i]], + fl = file.path(xlqueryTablesDir, sprintf("queryTable%s.xml", i))) + } + + ## connections + if (length(connections) > 0) + write_file(body = connections, fl = file.path(xlDir, "connections.xml")) + + ## externalLinks + if (length(externalLinks)) { + externalLinksDir <- file.path(tmpDir, "xl", "externalLinks") + dir.create(path = externalLinksDir, recursive = TRUE) + for (i in 1:length(externalLinks)) + write_file(body = externalLinks[[i]], + fl = file.path(externalLinksDir, sprintf("externalLink%s.xml", i))) } - xfNode$fontId <- fontId - xfNode <- append(xfNode, list("applyFont" = "1")) - } - - - ## numFmt - if(!is.null(style$numFmt)){ - if(as.integer(style$numFmt$numFmtId) > 0){ - numFmtId <- style$numFmt$numFmtId - if(as.integer(numFmtId) > 163L){ - - tmp <- style$numFmt$formatCode - - styles$numFmts <<- unique(c(styles$numFmts, - sprintf('', numFmtId, tmp) - )) - } + ## externalLinks rels + if (length(externalLinksRels)) { + externalLinksRelsDir <- + file.path(tmpDir, "xl", "externalLinks", "_rels") + dir.create(path = externalLinksRelsDir, recursive = TRUE) - xfNode$numFmtId <- numFmtId - xfNode <- append(xfNode, list("applyNumberFormat" = "1")) + for (i in 1:length(externalLinksRels)) + write_file(body = externalLinksRels[[i]], + fl = file.path( + externalLinksRelsDir, + sprintf("externalLink%s.xml.rels", i) + )) } - } - - ## Fill - if(!is.null(style$fill)){ - fillNode <- .self$createFillNode(style) - if(!is.null(fillNode)){ - fillId <- which(styles$fills == fillNode) - 1L - - if(length(fillId) == 0){ - fillId <- length(styles$fills) - styles$fills <<- c(styles$fills, fillNode) - } - xfNode$fillId <- fillId - xfNode <- append(xfNode, list("applyFill" = "1")) + + # printerSettings + printDir <- file.path(tmpDir, "xl", "printerSettings") + dir.create(path = printDir, recursive = TRUE) + for (i in 1:nSheets) + writeLines(genPrinterSettings(), file.path(printDir, sprintf("printerSettings%s.bin", i))) + + ## media (copy file from origin to destination) + for (x in media) + file.copy(x, file.path(xlmediaDir, names(media)[which(media == x)])) + + ## VBA Macro + if (!is.null(vbaProject)) + file.copy(vbaProject, xlDir) + + ## write worksheet, worksheet_rels, drawings, drawing_rels + .self$writeSheetDataXML(xldrawingsDir, + xldrawingsRelsDir, + xlworksheetsDir, + xlworksheetsRelsDir) + + ## write sharedStrings.xml + ct <- Content_Types + if (length(sharedStrings) > 0) { + write_file( + head = sprintf( + '', + length(sharedStrings), + attr(sharedStrings, "uniqueCount") + ), + body = stri_join(sharedStrings, collapse = "", sep = " "), + tail = "", + fl = file.path(xlDir, "sharedStrings.xml") + ) + } else{ + ## Remove relationship to sharedStrings + ct <- ct[!grepl("sharedStrings", ct)] + } + + if (nComments > 0) + ct <- + c( + ct, + '' + ) + + ## write [Content_type] + write_file( + head = '', + body = pxml(ct), + tail = '', + fl = file.path(tmpDir, "[Content_Types].xml") + ) + + + styleXML <- styles + styleXML$numFmts <- + stri_join(sprintf('', length(styles$numFmts)), + pxml(styles$numFmts), + '') + styleXML$fonts <- + stri_join(sprintf('', length(styles$fonts)), + pxml(styles$fonts), + '') + styleXML$fills <- + stri_join(sprintf('', length(styles$fills)), + pxml(styles$fills), + '') + styleXML$borders <- + stri_join(sprintf('', length(styles$borders)), + pxml(styles$borders), + '') + styleXML$cellStyleXfs <- + c( + sprintf('', length(styles$cellStyleXfs)), + pxml(styles$cellStyleXfs), + '' + ) + styleXML$cellXfs <- + stri_join(sprintf('', length(styles$cellXfs)), + pxml(styles$cellXfs), + '') + styleXML$cellStyles <- + stri_join( + sprintf('', length(styles$cellStyles)), + pxml(styles$cellStyles), + '' + ) + styleXML$dxfs <- + ifelse( + length(styles$dxfs) == 0, + '', + stri_join( + sprintf('', length(styles$dxfs)), + stri_join(unlist(styles$dxfs), sep = " ", collapse = ""), + '' + ) + ) + ## write styles.xml + write_file( + head = '', + body = pxml(styleXML), + tail = '', + fl = file.path(xlDir, "styles.xml") + ) + + ## write workbook.xml + workbookXML <- workbook + workbookXML$sheets <- + stri_join("", pxml(workbookXML$sheets), "") + if (length(workbookXML$definedNames) > 0) + workbookXML$definedNames <- + stri_join("", + pxml(workbookXML$definedNames), + "") + + + + if (length(workbookProtection) > 0) { + # Worksheet protection needs to be right after fileVersion, fileSharing and workbookPr, otherwise Excel will complain + workbookXML <- + append(workbookXML, + list(workbookProtection = workbookProtection), + after = max(which( + names(workbookXML) %in% c("fileVersion", "fileSharing", "workbookPr") + ))) } + + + write_file( + head = '', + body = pxml(workbookXML), + tail = '', + fl = file.path(xlDir, "workbook.xml") + ) + workbook$sheets <<- + workbook$sheets[order(sheetOrder)] ## Need to reset sheet order to allow multiple savings + + ## compress to xlsx + wd <- getwd() + tmpFile <- + basename(tempfile(fileext = ifelse(is.null(vbaProject), ".xlsx", ".xlsm"))) + on.exit(expr = setwd(wd), add = TRUE) + + ## zip it + setwd(dir = tmpDir) + cl <- + ifelse( + !is.null(getOption("openxlsx.compresssionLevel")), + getOption("openxlsx.compresssionLevel"), + getOption("openxlsx.compresssionevel", 6) + ) + zip::zip( + zipfile = tmpFile, + files = list.files( + tmpDir, + full.names = FALSE, + recursive = TRUE, + include.dirs = FALSE, + all.files = TRUE + ), + compression_level = cl + ) + + ## reset styles - maintain any changes to base font + baseFont <- styles$fonts[[1]] + styles <<- + genBaseStyleSheet(styles$dxfs, + tableStyles = styles$tableStyles, + extLst = styles$extLst) + styles$fonts[[1]] <<- baseFont + + + return(file.path(tmpDir, tmpFile)) + + } +) + + + +Workbook$methods( + updateSharedStrings = function(uNewStr) { + ## Function will return named list of references to new strings + uStr <- uNewStr[which(!uNewStr %in% sharedStrings)] + uCount <- attr(sharedStrings, "uniqueCount") + sharedStrings <<- append(sharedStrings, uStr) + + attr(sharedStrings, "uniqueCount") <<- uCount + length(uStr) + } - - ## Border - if(any(!is.null(c(style$borderLeft, style$borderRight, style$borderTop, style$borderBottom, style$borderDiagonal)))){ +) + + + +Workbook$methods( + validateSheet = function(sheetName) { + if (!is.numeric(sheetName)) + sheetName <- replaceIllegalCharacters(sheetName) - borderNode <- .self$createBorderNode(style) - borderId <- which(styles$borders == borderNode) - 1L + if (is.null(sheet_names)) + stop("Workbook does not contain any worksheets.", call. = FALSE) - if(length(borderId) == 0){ - borderId <- length(styles$borders) - styles$borders <<- c(styles$borders, borderNode) + if (is.numeric(sheetName)) { + if (sheetName > length(sheet_names)) + stop(sprintf("This Workbook only has %s sheets.", length(sheet_names)), call. = + FALSE) + + return(sheetName) + + } else if (!sheetName %in% sheet_names) { + stop(sprintf("Sheet '%s' does not exist.", sheetName), call. = FALSE) } - xfNode$borderId <- borderId - xfNode <- append(xfNode, list("applyBorder" = "1")) + return(which(sheet_names == sheetName)) + } - - - # if(!is.null(style$xfId)) - # xfNode$xfId <- style$xfId - - childNodes = "" - - ## Alignment - if(!is.null(style$halign) | !is.null(style$valign) | !is.null(style$wrapText) | !is.null(style$textRotation) | !is.null(style$indent)){ +) + + + +Workbook$methods( + getSheetName = function(sheetIndex) { + if (any(length(sheet_names) < sheetIndex)) + stop(sprintf("Workbook only contains %s sheet(s).", length(sheet_names))) - attrs <- list() - alignNode <- "', + tableStyle, + as.integer(showFirstColumn), + as.integer(showLastColumn), + as.integer(showRowStripes), + as.integer(showColumnStripes) + ) + + + tables <<- + c( + tables, + build_table_xml( + table = table, + tableStyleXML = tableStyleXML, + ref = ref, + colNames = gsub("\n|\r", "_x000a_", colNames), + showColNames = showColNames, + withFilter = withFilter + ) + ) + names(tables) <<- c(nms, ref) + attr(tables, "sheet") <<- c(tSheets, sheet) + attr(tables, "tableName") <<- c(tNames, tableName) + + worksheets[[sheet]]$tableParts <<- + append(worksheets[[sheet]]$tableParts, + sprintf('', id)) + attr(worksheets[[sheet]]$tableParts, "tableName") <<- + c(tNames[tSheets == sheet & + !grepl("openxlsx_deleted", tNames, fixed = TRUE)], tableName) + + + + ## update Content_Types + Content_Types <<- + c( + Content_Types, + sprintf( + '', + id + ) + ) + + ## create a table.xml.rels + tables.xml.rels <<- append(tables.xml.rels, "") + + ## update worksheets_rels + worksheets_rels[[sheet]] <<- c( + worksheets_rels[[sheet]], + sprintf( + '', + id, + id + ) + ) + + + } +) + + + + + + + + + +Workbook$methods( + writeDrawingVML = function(dir) { + for (i in 1:length(comments)) { + id <- 1025 + + cd <- unlist(lapply(comments[[i]], "[[", "clientData")) + nComments <- length(cd) + + ## write head + if (nComments > 0 | length(vml[[i]]) > 0) { + write( + x = stri_join( + ' + + + + + + + ' + ), + file = file.path(dir, sprintf("vmlDrawing%s.vml", i)), + sep = " " + ) + + } + + if (nComments > 0) { + for (j in 1:nComments) { + id <- id + 1L + write( + x = genBaseShapeVML(cd[j], id), + file = file.path(dir, sprintf("vmlDrawing%s.vml", i)), + append = TRUE + ) + } + } + + if (length(vml[[i]]) > 0) + write(x = vml[[i]], + file = file.path(dir, sprintf("vmlDrawing%s.vml", i)), + append = TRUE) + + if (nComments > 0 | length(vml[[i]]) > 0) { + write(x = '', + file = file.path(dir, sprintf("vmlDrawing%s.vml", i)), + append = TRUE) + worksheets[[i]]$legacyDrawing <<- + '' + } + + } + } +) + + + +Workbook$methods( + updateStyles = function(style) { + ## Updates styles.xml + xfNode <- list( + numFmtId = 0, + fontId = 0, + fillId = 0, + borderId = 0, + xfId = 0 + ) + + + alignmentFlag <- FALSE + + ## Font + if (!is.null(style$fontName) | + !is.null(style$fontSize) | + !is.null(style$fontColour) | + !is.null(style$fontDecoration) | + !is.null(style$fontFamily) | + !is.null(style$fontScheme)) { + fontNode <- .self$createFontNode(style) + fontId <- which(styles$fonts == fontNode) - 1L + + if (length(fontId) == 0) { + fontId <- length(styles$fonts) + styles$fonts <<- append(styles[["fonts"]], fontNode) + + } + + xfNode$fontId <- fontId + xfNode <- append(xfNode, list("applyFont" = "1")) + } + + + ## numFmt + if (!is.null(style$numFmt)) { + if (as.integer(style$numFmt$numFmtId) > 0) { + numFmtId <- style$numFmt$numFmtId + if (as.integer(numFmtId) > 163L) { + tmp <- style$numFmt$formatCode + + styles$numFmts <<- unique(c( + styles$numFmts, + sprintf( + '', + numFmtId, + tmp + ) + )) + } + + xfNode$numFmtId <- numFmtId + xfNode <- append(xfNode, list("applyNumberFormat" = "1")) + } + } + + ## Fill + if (!is.null(style$fill)) { + fillNode <- .self$createFillNode(style) + if (!is.null(fillNode)) { + fillId <- which(styles$fills == fillNode) - 1L + + if (length(fillId) == 0) { + fillId <- length(styles$fills) + styles$fills <<- c(styles$fills, fillNode) + } + xfNode$fillId <- fillId + xfNode <- append(xfNode, list("applyFill" = "1")) + } + } + + ## Border + if (any(!is.null( + c( + style$borderLeft, + style$borderRight, + style$borderTop, + style$borderBottom, + style$borderDiagonal + ) + ))) { + borderNode <- .self$createBorderNode(style) + borderId <- which(styles$borders == borderNode) - 1L + + if (length(borderId) == 0) { + borderId <- length(styles$borders) + styles$borders <<- c(styles$borders, borderNode) + } + + xfNode$borderId <- borderId + xfNode <- append(xfNode, list("applyBorder" = "1")) + } + + + # if(!is.null(style$xfId)) + # xfNode$xfId <- style$xfId + + childNodes = "" + + ## Alignment + if (!is.null(style$halign) | + !is.null(style$valign) | + !is.null(style$wrapText) | + !is.null(style$textRotation) | !is.null(style$indent)) { + attrs <- list() + alignNode <- "") + + alignmentFlag <- TRUE + xfNode <- append(xfNode, list("applyAlignment" = "1")) + + childNodes = stri_join(childNodes, alignNode) + } + + if (!is.null(style$hidden) | !is.null(style$locked)) { + xfNode <- append(xfNode, list("applyProtection" = "1")) + protectionNode <- "") + childNodes = stri_join(childNodes, protectionNode) + } + + if (length(childNodes) > 0) { + xfNode <- + stri_join("", + childNodes, + '') + } else{ + xfNode <- + stri_join("") + } + + styleId <- which(styles$cellXfs == xfNode) - 1L + if (length(styleId) == 0) { + styleId <- length(styles$cellXfs) + styles$cellXfs <<- c(styles$cellXfs, xfNode) + } + + + return(as.integer(styleId)) + + } +) + + + + + +Workbook$methods( + updateCellStyles = function() { + flag <- TRUE + for (style in cellStyleObjects) { + ## Updates styles.xml + xfNode <- list( + numFmtId = 0, + fontId = 0, + fillId = 0, + borderId = 0 + ) + + + alignmentFlag <- FALSE + + ## Font + if (!is.null(style$fontName) | + !is.null(style$fontSize) | + !is.null(style$fontColour) | + !is.null(style$fontDecoration) | + !is.null(style$fontFamily) | + !is.null(style$fontScheme)) { + fontNode <- .self$createFontNode(style) + fontId <- which(styles$font == fontNode) - 1L + + if (length(fontId) == 0) { + fontId <- length(styles$fonts) + styles$fonts <<- append(styles[["fonts"]], fontNode) + + } + + xfNode$fontId <- fontId + xfNode <- append(xfNode, list("applyFont" = "1")) + } + + + ## numFmt + if (!is.null(style$numFmt)) { + if (as.integer(style$numFmt$numFmtId) > 0) { + numFmtId <- style$numFmt$numFmtId + if (as.integer(numFmtId) > 163L) { + tmp <- style$numFmt$formatCode + + styles$numFmts <<- unique(c( + styles$numFmts, + sprintf( + '', + numFmtId, + tmp + ) + )) + } + + xfNode$numFmtId <- numFmtId + xfNode <- append(xfNode, list("applyNumberFormat" = "1")) + } + } + + ## Fill + if (!is.null(style$fill)) { + fillNode <- .self$createFillNode(style) + if (!is.null(fillNode)) { + fillId <- which(styles$fills == fillNode) - 1L + + if (length(fillId) == 0) { + fillId <- length(styles$fills) + styles$fills <<- c(styles$fills, fillNode) + } + xfNode$fillId <- fillId + xfNode <- append(xfNode, list("applyFill" = "1")) + } + } + + ## Border + if (any(!is.null( + c( + style$borderLeft, + style$borderRight, + style$borderTop, + style$borderBottom, + style$borderDiagonal + ) + ))) { + borderNode <- .self$createBorderNode(style) + borderId <- which(styles$borders == borderNode) - 1L + + if (length(borderId) == 0) { + borderId <- length(styles$borders) + styles$borders <<- c(styles$borders, borderNode) + } + + xfNode$borderId <- borderId + xfNode <- append(xfNode, list("applyBorder" = "1")) + } + + xfNode <- + stri_join("") + + if (flag) { + styles$cellStyleXfs <<- xfNode + flag <- FALSE + } else{ + styles$cellStyleXfs <<- c(styles$cellStyleXfs, xfNode) + } + + + } + + } +) + + + + + + + + +Workbook$methods( + getBaseFont = function() { + baseFont <- styles$fonts[[1]] + + sz <- getAttrs(baseFont, "" + + ## size + if (is.null(style$fontSize[[1]])) { + fontNode <- + stri_join(fontNode, sprintf('', names(baseFont$size), baseFont$size)) + } else{ + fontNode <- + stri_join(fontNode, sprintf('', names(style$fontSize), style$fontSize)) + } + + ## colour + if (is.null(style$fontColour[[1]])) { + fontNode <- + stri_join(fontNode, + sprintf( + '', + names(baseFont$colour), + baseFont$colour + )) + } else{ + if (length(style$fontColour) > 1) { + fontNode <- stri_join(fontNode, sprintf('', + stri_join( + sapply(1:length(style$fontColour), function(i) + sprintf('%s="%s"', names(style$fontColour)[i], style$fontColour[i])), + sep = " ", + collapse = " " + ))) + + } else{ + fontNode <- + stri_join(fontNode, + sprintf( + '', + names(style$fontColour), + style$fontColour + )) + } + + + + } + + + ## name + if (is.null(style$fontName[[1]])) { + fontNode <- + stri_join(fontNode, + sprintf('', names(baseFont$name), baseFont$name)) + } else{ + fontNode <- + stri_join(fontNode, + sprintf('', names(style$fontName), style$fontName)) + } + + ### Create new font and return Id + if (!is.null(style$fontFamily)) + fontNode <- + stri_join(fontNode, sprintf('', style$fontFamily)) + + if (!is.null(style$fontScheme)) + fontNode <- + stri_join(fontNode, sprintf('', style$fontScheme)) + + if ("BOLD" %in% style$fontDecoration) + fontNode <- stri_join(fontNode, '') + + if ("ITALIC" %in% style$fontDecoration) + fontNode <- stri_join(fontNode, '') + + if ("UNDERLINE" %in% style$fontDecoration) + fontNode <- stri_join(fontNode, '') + + if ("UNDERLINE2" %in% style$fontDecoration) + fontNode <- stri_join(fontNode, '') + + if ("STRIKEOUT" %in% style$fontDecoration) + fontNode <- stri_join(fontNode, '') + + stri_join(fontNode, "") + + } +) + + +Workbook$methods( + createBorderNode = function(style) { + borderNode <- "") + + if (!is.null(style$borderLeft)) + borderNode <- + stri_join( + borderNode, + sprintf('', style$borderLeft), + sprintf( + '', + names(style$borderLeftColour), + style$borderLeftColour + ), + '' + ) + + if (!is.null(style$borderRight)) + borderNode <- + stri_join( + borderNode, + sprintf('', style$borderRight), + sprintf( + '', + names(style$borderRightColour), + style$borderRightColour + ), + '' + ) + + if (!is.null(style$borderTop)) + borderNode <- + stri_join( + borderNode, + sprintf('', style$borderTop), + sprintf( + '', + names(style$borderTopColour), + style$borderTopColour + ), + '' + ) + + if (!is.null(style$borderBottom)) + borderNode <- + stri_join( + borderNode, + sprintf('', style$borderBottom), + sprintf( + '', + names(style$borderBottomColour), + style$borderBottomColour + ), + '' + ) + + if (!is.null(style$borderDiagonal)) + borderNode <- + stri_join( + borderNode, + sprintf('', style$borderDiagonal), + sprintf( + '', + names(style$borderDiagonalColour), + style$borderDiagonalColour + ), + '' + ) + + stri_join(borderNode, "") + + } +) + + +Workbook$methods( + createFillNode = function(style, patternType = "solid") { + fill <- style$fill + + ## gradientFill + if (any(grepl("gradientFill", fill))) { + fillNode <- fill #stri_join("", fill, "") + + } else if (!is.null(fill$fillFg) | !is.null(fill$fillBg)) { + fillNode <- + stri_join('', + sprintf('', patternType)) + + if (!is.null(fill$fillFg)) + fillNode <- + stri_join(fillNode, sprintf( + '', + stri_join( + stri_join(names(fill$fillFg), '="', fill$fillFg, '"'), + sep = " ", + collapse = " " + ) + )) + + if (!is.null(fill$fillBg)) + fillNode <- + stri_join(fillNode, sprintf( + '', + stri_join( + stri_join(names(fill$fillBg), '="', fill$fillBg, '"'), + sep = " ", + collapse = " " + ) + )) + + fillNode <- stri_join(fillNode, "") + + } else{ + return(NULL) + } + + return(fillNode) + + } +) + + + + + + + +Workbook$methods( + setSheetName = function(sheet, newSheetName) { + if (newSheetName %in% sheet_names) + stop(sprintf("Sheet %s already exists!", newSheetName)) + + sheet <- validateSheet(sheet) + + oldName <- sheet_names[[sheet]] + sheet_names[[sheet]] <<- newSheetName + + ## Rename in workbook + sheetId <- + regmatches(workbook$sheets[[sheet]], + regexpr('(?<=sheetId=")[0-9]+', workbook$sheets[[sheet]], perl = TRUE)) + rId <- + regmatches(workbook$sheets[[sheet]], + regexpr('(?<= r:id="rId)[0-9]+', workbook$sheets[[sheet]], perl = TRUE)) + workbook$sheets[[sheet]] <<- + sprintf('', + newSheetName, + sheetId, + rId) + + ## rename styleObjects sheet component + if (length(styleObjects) > 0) { + styleObjects <<- lapply(styleObjects, function(x) { + if (x$sheet == oldName) + x$sheet <- newSheetName + + return(x) + + }) + + } + + ## rename defined names + if (length(workbook$definedNames) > 0) { + belongTo <- getDefinedNamesSheet(workbook$definedNames) + toChange <- belongTo == oldName + if (any(toChange)) { + newSheetName <- sprintf("'%s'", newSheetName) + tmp <- + gsub(oldName, newSheetName, workbook$definedName[toChange], fixed = TRUE) + tmp <- gsub("'+", "'", tmp) + workbook$definedNames[toChange] <<- tmp + + } + + + } + + } +) + + +Workbook$methods( + writeSheetDataXML = function(xldrawingsDir, + xldrawingsRelsDir, + xlworksheetsDir, + xlworksheetsRelsDir) { + ## write worksheets + nSheets <- length(worksheets) + + for (i in 1:nSheets) { + ## Write drawing i (will always exist) skip those that are empty + if (any(drawings[[i]] != "")) { + write_file( + head = '', + body = pxml(drawings[[i]]), + tail = '', + fl = file.path(xldrawingsDir, stri_join("drawing", i, ".xml")) + ) + + write_file( + head = '', + body = pxml(drawings_rels[[i]]), + tail = '', + fl = file.path(xldrawingsRelsDir, stri_join("drawing", i, ".xml.rels")) + ) + } else{ + worksheets[[i]]$drawing <<- character(0) + } + + ## vml drawing + if (length(vml_rels[[i]]) > 0) + file.copy(from = vml_rels[[i]], + to = file.path( + xldrawingsRelsDir, + stri_join("vmlDrawing", i, ".vml.rels") + )) + + + + if (isChartSheet[i]) { + chartSheetDir <- file.path(dirname(xlworksheetsDir), "chartsheets") + chartSheetRelsDir <- + file.path(dirname(xlworksheetsDir), "chartsheets", "_rels") + + if (!file.exists(chartSheetDir)) { + dir.create(chartSheetDir, recursive = TRUE) + dir.create(chartSheetRelsDir, recursive = TRUE) + } + + write_file( + body = worksheets[[i]]$get_prior_sheet_data(), + fl = file.path(chartSheetDir, stri_join("sheet", i, ".xml")) + ) + + write_file( + head = '', + body = pxml(worksheets_rels[[i]]), + tail = '', + fl = file.path(chartSheetRelsDir, sprintf("sheet%s.xml.rels", i)) + ) + + } else{ + ## Write worksheets + ws <- worksheets[[i]] + hasHL <- + ifelse(length(worksheets[[i]]$hyperlinks) > 0, TRUE, FALSE) + + ## reorder sheet data + worksheets[[i]]$order_sheetdata() + + + prior <- ws$get_prior_sheet_data() + post <- ws$get_post_sheet_data() + + worksheets[[i]]$sheet_data$style_id <<- + as.character(worksheets[[i]]$sheet_data$style_id) + + if (length(rowHeights[[i]]) == 0) { + write_worksheet_xml( + prior = prior, + post = post, + sheet_data = ws$sheet_data, + R_fileName = file.path(xlworksheetsDir, sprintf("sheet%s.xml", i)) + ) + + } else{ + ## row heights will always be in order and all row heights are given rows in preSaveCleanup + write_worksheet_xml_2( + prior = prior, + post = post, + sheet_data = ws$sheet_data, + row_heights = unlist(rowHeights[[i]]), + R_fileName = file.path(xlworksheetsDir, sprintf("sheet%s.xml", i)) + ) + + } + + worksheets[[i]]$sheet_data$style_id <<- integer(0) + + + ## write worksheet rels + if (length(worksheets_rels[[i]]) > 0) { + ws_rels <- worksheets_rels[[i]] + if (hasHL) { + h_inds <- stri_join(1:length(worksheets[[i]]$hyperlinks), "h") + ws_rels <- + c(ws_rels, unlist( + lapply(1:length(h_inds), function(j) + worksheets[[i]]$hyperlinks[[j]]$to_target_xml(h_inds[j])) + )) + } + + ## Check if any tables were deleted - remove these from rels + if (length(tables) > 0) { + table_inds <- which(grepl("tables/table[0-9].xml", ws_rels)) + + if (length(table_inds) > 0) { + ids <- + regmatches( + ws_rels[table_inds], + regexpr( + '(?<=Relationship Id=")[0-9A-Za-z]+', + ws_rels[table_inds], + perl = TRUE + ) + ) + inds <- + as.integer(gsub("[^0-9]", "", ids, perl = TRUE)) - 2L + table_nms <- attr(tables, "tableName")[inds] + is_deleted <- + grepl("openxlsx_deleted", table_nms, fixed = TRUE) + if (any(is_deleted)) + ws_rels <- ws_rels[-table_inds[is_deleted]] + + } + } + + + + write_file( + head = '', + body = pxml(ws_rels), + tail = '', + fl = file.path(xlworksheetsRelsDir, sprintf("sheet%s.xml.rels", i)) + ) + + } + + }## end of isChartSheet[i] + + } ## end of loop through 1:nSheets + + invisible(0) + + } +) + + + + + +Workbook$methods( + setRowHeights = function(sheet, rows, heights) { + sheet = validateSheet(sheet) + + ## remove any conflicting heights + flag <- names(rowHeights[[sheet]]) %in% rows + if (any(flag)) + rowHeights[[sheet]] <<- rowHeights[[sheet]][!flag] + + nms <- c(names(rowHeights[[sheet]]), rows) + allRowHeights <- unlist(c(rowHeights[[sheet]], heights)) + names(allRowHeights) <- nms + + allRowHeights <- + allRowHeights[order(as.integer(names(allRowHeights)))] + + rowHeights[[sheet]] <<- allRowHeights + + } +) + + +Workbook$methods( + deleteWorksheet = function(sheet) { + # To delete a worksheet + # Remove colwidths element + # Remove drawing partname from Content_Types (drawing(sheet).xml) + # Remove highest sheet from Content_Types + # Remove drawings element + # Remove drawings_rels element - if(!is.null(style$textRotation)) - alignNode <- paste(alignNode, sprintf('textRotation="%s"', style$textRotation)) + # Remove vml element + # Remove vml_rels element - if(!is.null(style$halign)) - alignNode <- paste(alignNode, sprintf('horizontal="%s"', style$halign)) + # Remove rowHeights element + # Remove styleObjects on sheet + # Remove last sheet element from workbook + # Remove last sheet element from workbook.xml.rels + # Remove element from worksheets + # Remove element from worksheets_rels + # Remove hyperlinks + # Reduce calcChain i attributes & remove calcs on sheet + # Remove sheet from sheetOrder + # Remove queryTable references from workbook$definedNames to worksheet + # remove tables - if(!is.null(style$valign)) - alignNode <- paste(alignNode, sprintf('vertical="%s"', style$valign)) + sheet <- validateSheet(sheet) + sheetNames <- sheet_names + nSheets <- length(unlist(sheetNames, use.names = FALSE)) + sheetName <- sheetNames[[sheet]] - if(!is.null(style$indent)) - alignNode <- paste(alignNode, sprintf('indent="%s"', style$indent)) + colWidths[[sheet]] <<- NULL + sheet_names <<- sheet_names[-sheet] - if(!is.null(style$wrapText)){ - if(style$wrapText) - alignNode <- paste(alignNode, 'wrapText="1"') - } + ## remove last drawings(sheet).xml from Content_Types + Content_Types <<- + Content_Types[!grepl(sprintf("drawing%s.xml", nSheets), Content_Types)] + ## remove highest sheet + Content_Types <<- + Content_Types[!grepl(sprintf("sheet%s.xml", nSheets), Content_Types)] - alignNode <- paste0(alignNode, "/>") + drawings[[sheet]] <<- NULL + drawings_rels[[sheet]] <<- NULL - alignmentFlag <- TRUE - xfNode <- append(xfNode, list("applyAlignment" = "1")) + vml[[sheet]] <<- NULL + vml_rels[[sheet]] <<- NULL - childNodes = paste0(childNodes, alignNode) - } - - if (!is.null(style$hidden) | !is.null(style$locked)) { - xfNode <- append(xfNode, list("applyProtection" = "1")) - protectionNode <- "") - childNodes = paste0(childNodes, protectionNode) - } - - if(length(childNodes) > 0){ - xfNode <- paste0("", childNodes, '') - }else{ - xfNode <- paste0("") - } - - styleId <- which(styles$cellXfs == xfNode) - 1L - if(length(styleId) == 0){ - styleId <- length(styles$cellXfs) - styles$cellXfs <<- c(styles$cellXfs, xfNode) - } - - - return(as.integer(styleId)) - -}) - - - - - -Workbook$methods(updateCellStyles = function(){ - - - flag <- TRUE - for(style in cellStyleObjects){ + rowHeights[[sheet]] <<- NULL + comments[[sheet]] <<- NULL + isChartSheet <<- isChartSheet[-sheet] - ## Updates styles.xml - xfNode <- list(numFmtId = 0, - fontId = 0, - fillId = 0, - borderId = 0) + ## sheetOrder + toRemove <- which(sheetOrder == sheet) + sheetOrder[sheetOrder > sheet] <<- + sheetOrder[sheetOrder > sheet] - 1L + sheetOrder <<- sheetOrder[-toRemove] - alignmentFlag <- FALSE + ## remove styleObjects + if (length(styleObjects) > 0) + styleObjects <<- + styleObjects[unlist(lapply(styleObjects, "[[", "sheet"), use.names = FALSE) != sheetName] - ## Font - if(!is.null(style$fontName) | - !is.null(style$fontSize) | - !is.null(style$fontColour) | - !is.null(style$fontDecoration) | - !is.null(style$fontFamily) | - !is.null(style$fontScheme)){ + ## Need to remove reference from workbook.xml.rels to pivotCache + removeRels <- + worksheets_rels[[sheet]][grepl("pivotTables", worksheets_rels[[sheet]])] + if (length(removeRels) > 0) { + ## sheet rels links to a pivotTable file, the corresponding pivotTable_rels file links to the cacheDefn which is listing in workbook.xml.rels + ## remove reference to this file from the workbook.xml.rels + fileNo <- + as.integer(unlist(regmatches( + removeRels, + gregexpr('(?<=pivotTable)[0-9]+(?=\\.xml)', removeRels, perl = TRUE) + ))) + toRemove <- + stri_join( + sprintf("(pivotCacheDefinition%s\\.xml)", fileNo), + sep = " ", + collapse = "|" + ) - fontNode <- .self$createFontNode(style) - fontId <- which(styles$font == fontNode) - 1L + fileNo <- which(grepl(toRemove, pivotTables.xml.rels)) + toRemove <- + stri_join( + sprintf("(pivotCacheDefinition%s\\.xml)", fileNo), + sep = " ", + collapse = "|" + ) - if(length(fontId) == 0){ - - fontId <- length(styles$fonts) - styles$fonts <<- append(styles[["fonts"]], fontNode) - - } + ## remove reference to file from workbook.xml.res + workbook.xml.rels <<- + workbook.xml.rels[!grepl(toRemove, workbook.xml.rels)] - xfNode$fontId <- fontId - xfNode <- append(xfNode, list("applyFont" = "1")) } + ## As above for slicers + ## Need to remove reference from workbook.xml.rels to pivotCache + removeRels <- grepl("slicers", worksheets_rels[[sheet]]) + if (any(removeRels)) + workbook.xml.rels <<- + workbook.xml.rels[!grepl(sprintf("(slicerCache%s\\.xml)", sheet), workbook.xml.rels)] - ## numFmt - if(!is.null(style$numFmt)){ - if(as.integer(style$numFmt$numFmtId) > 0){ - numFmtId <- style$numFmt$numFmtId - if(as.integer(numFmtId) > 163L){ - - tmp <- style$numFmt$formatCode - - styles$numFmts <<- unique(c(styles$numFmts, - sprintf('', numFmtId, tmp) - )) - } - - xfNode$numFmtId <- numFmtId - xfNode <- append(xfNode, list("applyNumberFormat" = "1")) + ## wont't remove tables and then won't need to reassign table r:id's but will rename them! + worksheets[[sheet]] <<- NULL + worksheets_rels[[sheet]] <<- NULL + + if (length(tables) > 0) { + tableSheets <- attr(tables, "sheet") + tableNames <- attr(tables, "tableName") + + inds <- + tableSheets %in% sheet & + !grepl("openxlsx_deleted", attr(tables, "tableName"), fixed = TRUE) + tableSheets[tableSheets > sheet] <- + tableSheets[tableSheets > sheet] - 1L + + ## Need to flag a table as deleted + if (any(inds)) { + tableSheets[inds] <- 0 + tableNames[inds] <- + stri_join(tableNames[inds], "_openxlsx_deleted") } + attr(tables, "tableName") <<- tableNames + attr(tables, "sheet") <<- tableSheets } - ## Fill - if(!is.null(style$fill)){ - fillNode <- .self$createFillNode(style) - if(!is.null(fillNode)){ - fillId <- which(styles$fills == fillNode) - 1L - - if(length(fillId) == 0){ - fillId <- length(styles$fills) - styles$fills <<- c(styles$fills, fillNode) - } - xfNode$fillId <- fillId - xfNode <- append(xfNode, list("applyFill" = "1")) - } + + ## drawing will always be the first relationship and printerSettings second + if (nSheets > 1) { + for (i in 1:(nSheets - 1L)) + worksheets_rels[[i]][1:3] <<- genBaseSheetRels(i) + } else{ + worksheets_rels <<- list() } - ## Border - if(any(!is.null(c(style$borderLeft, style$borderRight, style$borderTop, style$borderBottom, style$borderDiagonal)))){ - - borderNode <- .self$createBorderNode(style) - borderId <- which(styles$borders == borderNode) - 1L - - if(length(borderId) == 0){ - borderId <- length(styles$borders) - styles$borders <<- c(styles$borders, borderNode) - } - - xfNode$borderId <- borderId - xfNode <- append(xfNode, list("applyBorder" = "1")) + + ## remove sheet + sn <- + unlist(lapply(workbook$sheets, function(x) + regmatches( + x, regexpr('(?<= name=")[^"]+', x, perl = TRUE) + ))) + workbook$sheets <<- workbook$sheets[!sn %in% sheetName] + + ## Reset rIds + if (nSheets > 1) { + for (i in (sheet + 1L):nSheets) + workbook$sheets <<- + gsub(stri_join("rId", i), + stri_join("rId", i - 1L), + workbook$sheets, + fixed = TRUE) + } else{ + workbook$sheets <<- NULL } - xfNode <- paste0("") + ## Can remove highest sheet + workbook.xml.rels <<- + workbook.xml.rels[!grepl(sprintf("sheet%s.xml", nSheets), workbook.xml.rels)] - if(flag){ - styles$cellStyleXfs <<- xfNode - flag <- FALSE - }else{ - styles$cellStyleXfs <<- c(styles$cellStyleXfs, xfNode) + ## definedNames + if (length(workbook$definedNames) > 0) { + belongTo <- getDefinedNamesSheet(workbook$definedNames) + workbook$definedNames <<- + workbook$definedNames[!belongTo %in% sheetName] } + invisible(1) } - -}) - - - - - +) - -Workbook$methods(getBaseFont = function(){ - - baseFont <- styles$fonts[[1]] - - sz <- getAttrs(baseFont, "" - - ## size - if(is.null(style$fontSize[[1]])){ - fontNode <- paste0(fontNode, sprintf('', names(baseFont$size), baseFont$size)) - }else{ - fontNode <- paste0(fontNode, sprintf('', names(style$fontSize), style$fontSize)) - } - - ## colour - if(is.null(style$fontColour[[1]])){ - fontNode <- paste0(fontNode, sprintf('', names(baseFont$colour), baseFont$colour)) - }else{ +Workbook$methods( + addDXFS = function(style) { + dxf <- '' + dxf <- stri_join(dxf, createFontNode(style)) + fillNode <- NULL - if(length(style$fontColour) > 1){ - - fontNode <- paste0(fontNode, sprintf('', - paste(sapply(1:length(style$fontColour), function(i) sprintf('%s="%s"', names(style$fontColour)[i], style$fontColour[i])), collapse = " "))) - - }else{ - fontNode <- paste0(fontNode, sprintf('', names(style$fontColour), style$fontColour)) - } + if (!is.null(style$fill$fillFg) | !is.null(style$fill$fillBg)) + dxf <- stri_join(dxf, createFillNode(style)) + if (any(!is.null( + c( + style$borderLeft, + style$borderRight, + style$borderTop, + style$borderBottom, + style$borderDiagonal + ) + ))) + dxf <- stri_join(dxf, createBorderNode(style)) + dxf <- stri_join(dxf, "", sep = " ") + if (dxf %in% styles$dxfs) + return(which(styles$dxfs == dxf) - 1L) + dxfId <- length(styles$dxfs) + styles$dxfs <<- c(styles$dxfs, dxf) + + return(dxfId) } - - - ## name - if(is.null(style$fontName[[1]])){ - fontNode <- paste0(fontNode, sprintf('', names(baseFont$name), baseFont$name)) - }else{ - fontNode <- paste0(fontNode, sprintf('', names(style$fontName), style$fontName)) - } - - ### Create new font and return Id - if(!is.null(style$fontFamily)) - fontNode <- paste0(fontNode, sprintf('', style$fontFamily)) - - if(!is.null(style$fontScheme)) - fontNode <- paste0(fontNode, sprintf('', style$fontScheme)) - - if("BOLD" %in% style$fontDecoration) - fontNode <- paste0(fontNode, '') - - if("ITALIC" %in% style$fontDecoration) - fontNode <- paste0(fontNode, '') - - if("UNDERLINE" %in% style$fontDecoration) - fontNode <- paste0(fontNode, '') - - if("UNDERLINE2" %in% style$fontDecoration) - fontNode <- paste0(fontNode, '') - - if("STRIKEOUT" %in% style$fontDecoration) - fontNode <- paste0(fontNode, '') - - paste0(fontNode, "") - -}) - - -Workbook$methods(createBorderNode = function(style){ - - borderNode <- "") - - if(!is.null(style$borderLeft)) - borderNode <- paste0(borderNode, sprintf('', style$borderLeft), sprintf('', names(style$borderLeftColour), style$borderLeftColour), '') - - if(!is.null(style$borderRight)) - borderNode <- paste0(borderNode, sprintf('', style$borderRight), sprintf('', names(style$borderRightColour), style$borderRightColour), '') - - if(!is.null(style$borderTop)) - borderNode <- paste0(borderNode, sprintf('', style$borderTop), sprintf('', names(style$borderTopColour), style$borderTopColour), '') - - if(!is.null(style$borderBottom)) - borderNode <- paste0(borderNode, sprintf('', style$borderBottom), sprintf('', names(style$borderBottomColour), style$borderBottomColour), '') - - if(!is.null(style$borderDiagonal)) - borderNode <- paste0(borderNode, sprintf('', style$borderDiagonal), sprintf('', names(style$borderDiagonalColour), style$borderDiagonalColour), '') - - paste0(borderNode, "") - -}) - - -Workbook$methods(createFillNode = function(style, patternType = "solid"){ - - fill <- style$fill - - ## gradientFill - if(any(grepl("gradientFill", fill))){ - - fillNode <- fill #paste0("", fill, "") - - }else if(!is.null(fill$fillFg) | !is.null(fill$fillBg)){ - - fillNode <- paste0('', sprintf('', patternType)) - - if(!is.null(fill$fillFg)) - fillNode <- paste0(fillNode, sprintf('', paste(paste0(names(fill$fillFg), '="', fill$fillFg, '"'), collapse = " "))) - - if(!is.null(fill$fillBg)) - fillNode <- paste0(fillNode, sprintf('', paste(paste0(names(fill$fillBg), '="', fill$fillBg, '"'), collapse = " "))) - - fillNode <- paste0(fillNode, "") - - }else{ - return(NULL) - } - - return(fillNode) - -}) - - - - +) -Workbook$methods(setSheetName = function(sheet, newSheetName){ - - if(newSheetName %in% sheet_names) - stop(sprintf("Sheet %s already exists!", newSheetName)) - - sheet <- validateSheet(sheet) - - oldName <- sheet_names[[sheet]] - sheet_names[[sheet]] <<- newSheetName - - ## Rename in workbook - sheetId <- regmatches(workbook$sheets[[sheet]], regexpr('(?<=sheetId=")[0-9]+', workbook$sheets[[sheet]], perl = TRUE)) - rId <- regmatches(workbook$sheets[[sheet]], regexpr('(?<= r:id="rId)[0-9]+', workbook$sheets[[sheet]], perl = TRUE)) - workbook$sheets[[sheet]] <<- sprintf('', newSheetName, sheetId, rId) - - ## rename styleObjects sheet component - if(length(styleObjects) > 0){ +Workbook$methods( + dataValidation = function(sheet, + startRow, + endRow, + startCol, + endCol, + type, + operator, + value, + allowBlank, + showInputMsg, + showErrorMsg) { + sheet = validateSheet(sheet) + sqref <- + stri_join(getCellRefs(data.frame( + "x" = c(startRow, endRow), + "y" = c(startCol, endCol) + )), + sep = " ", + collapse = ":") - styleObjects <<- lapply(styleObjects, function(x){ - - if(x$sheet == oldName) - x$sheet <- newSheetName + header <- + sprintf( + '', + type, + operator, + allowBlank, + showInputMsg, + showErrorMsg, + sqref + ) + + + if (type == "date") { + origin <- 25569L + if (grepl( + 'date1904="1"|date1904="true"', + stri_join(unlist(workbook), sep = " ", collapse = ""), + ignore.case = TRUE + )) + origin <- 24107L - return(x) + value <- as.integer(value) + origin - }) - - } - - ## rename defined names - if(length(workbook$definedNames) > 0){ + } - belongTo <- getDefinedNamesSheet(workbook$definedNames) - toChange <- belongTo == oldName - if(any(toChange)){ + if (type == "time") { + origin <- 25569L + if (grepl( + 'date1904="1"|date1904="true"', + stri_join(unlist(workbook), sep = " ", collapse = ""), + ignore.case = TRUE + )) + origin <- 24107L - newSheetName <- sprintf("'%s'", newSheetName) - tmp <- gsub(oldName, newSheetName, workbook$definedName[toChange], fixed = TRUE) - tmp <- gsub("'+", "'", tmp) - workbook$definedNames[toChange] <<- tmp + t <- format(value[1], "%z") + offSet <- + suppressWarnings(ifelse(substr(t, 1, 1) == "+", 1L,-1L) * (as.integer(substr(t, 2, 3)) + as.integer(substr(t, 4, 5)) / 60) / 24) + if (is.na(offSet)) + offSet[i] <- 0 + + value <- as.numeric(as.POSIXct(value)) / 86400 + origin + offSet } + form <- + sapply(1:length(value), function(i) + sprintf("%s", i, value[i], i)) + worksheets[[sheet]]$dataValidations <<- + c(worksheets[[sheet]]$dataValidations, + stri_join(header, stri_join(form, collapse = ""), "")) + + invisible(0) } - -}) +) + -Workbook$methods(writeSheetDataXML = function(xldrawingsDir, xldrawingsRelsDir, xlworksheetsDir, xlworksheetsRelsDir){ - - ## write worksheets - nSheets <- length(worksheets) - - for(i in 1:nSheets){ +Workbook$methods( + dataValidation_list = function(sheet, + startRow, + endRow, + startCol, + endCol, + value, + allowBlank, + showInputMsg, + showErrorMsg) { + sheet = validateSheet(sheet) + sqref <- + stri_join(getCellRefs(data.frame( + "x" = c(startRow, endRow), + "y" = c(startCol, endCol) + )), + sep = " ", + collapse = ":") + data_val <- + sprintf( + '', + allowBlank, + showInputMsg, + showErrorMsg, + sqref + ) - ## Write drawing i (will always exist) skip those that are empty - if(any(drawings[[i]] != "")){ - write_file(head = '', - body = pxml(drawings[[i]]), - tail = '', - fl = file.path(xldrawingsDir, paste0("drawing", i,".xml"))) - - write_file(head = '', - body = pxml(drawings_rels[[i]]), - tail = '', - fl = file.path(xldrawingsRelsDir, paste0("drawing", i,".xml.rels"))) - }else{ - worksheets[[i]]$drawing <<- character(0) - } + formula <- + sprintf("%s", value) + sqref <- sprintf('%s', sqref) - ## vml drawing - if(length(vml_rels[[i]]) > 0) - file.copy(from = vml_rels[[i]], to = file.path(xldrawingsRelsDir, paste0("vmlDrawing", i,".vml.rels"))) + xmlData <- + stri_join(data_val, formula, sqref, '') + + worksheets[[sheet]]$extLst <<- + c(worksheets[[sheet]]$extLst, xmlData) + + invisible(0) + } +) + + + +Workbook$methods( + conditionalFormatting = function(sheet, + startRow, + endRow, + startCol, + endCol, + dxfId, + formula, + type, + values, + params) { + sheet = validateSheet(sheet) + sqref <- + stri_join(getCellRefs(data.frame( + "x" = c(startRow, endRow), + "y" = c(startCol, endCol) + )), collapse = ":") - if(isChartSheet[i]){ - - chartSheetDir <- file.path(dirname(xlworksheetsDir), "chartsheets") - chartSheetRelsDir <- file.path(dirname(xlworksheetsDir), "chartsheets", "_rels") - - if(!file.exists(chartSheetDir)){ - dir.create(chartSheetDir, recursive = TRUE) - dir.create(chartSheetRelsDir, recursive = TRUE) + ## Increment priority of conditional formatting rule + if (length(worksheets[[sheet]]$conditionalFormatting) > 0) { + for (i in length(worksheets[[sheet]]$conditionalFormatting):1) { + priority <- + regmatches( + worksheets[[sheet]]$conditionalFormatting[[i]], + regexpr( + '(?<=priority=")[0-9]+', + worksheets[[sheet]]$conditionalFormatting[[i]], + perl = TRUE + ) + ) + priority_new <- as.integer(priority) + 1L + + priority_pattern <- sprintf('priority="%s"', priority) + priority_new <- sprintf('priority="%s"', priority_new) + + ## now replace + worksheets[[sheet]]$conditionalFormatting[[i]] <<- + gsub(priority_pattern, + priority_new, + worksheets[[sheet]]$conditionalFormatting[[i]], + fixed = TRUE) + } - write_file(body = worksheets[[i]]$get_prior_sheet_data(), fl = file.path(chartSheetDir, paste0("sheet", i,".xml"))) + } + + nms <- c(names(worksheets[[sheet]]$conditionalFormatting), sqref) + + if (type == "colorScale") { + ## formula contains the colours + ## values contains numerics or is NULL + ## dxfId is ignored - write_file(head = '', - body = pxml(worksheets_rels[[i]]), - tail = '', - fl = file.path(chartSheetRelsDir, sprintf("sheet%s.xml.rels", i))) + if (is.null(values)) { + if (length(formula) == 2L) { + cfRule <- + sprintf( + ' + + + ', + formula[[1]], + formula[[2]] + ) + } else{ + cfRule <- + sprintf( + ' + + + ', + formula[[1]], + formula[[2]], + formula[[3]] + ) + } + + } else{ + if (length(formula) == 2L) { + cfRule <- + sprintf( + ' + + + ', + values[[1]], + values[[2]], + formula[[1]], + formula[[2]] + ) + } else{ + cfRule <- + sprintf( + ' + + + ', + values[[1]], + values[[2]], + values[[3]], + formula[[1]], + formula[[2]], + formula[[3]] + ) + } + + } - }else{ + } else if (type == "dataBar") { + # forumula is a vector of colours of length 1 or 2 + # values is NULL or a numeric vector of equal length as formula - ## Write worksheets - ws <- worksheets[[i]] - hasHL <- ifelse(length(worksheets[[i]]$hyperlinks) > 0, TRUE, FALSE) + if (length(formula) == 2L) { + negColour <- formula[[1]] + posColour <- formula[[2]] + } else{ + posColour <- formula + negColour <- "FFFF0000" + } - ## reorder sheet data - worksheets[[i]]$order_sheetdata() + guid <- + stri_join("F7189283-14F7-4DE0-9601-54DE9DB", + 40000L + length(worksheets[[sheet]]$extLst)) + showValue <- 1 + if ("showValue" %in% names(params)) + showValue <- as.integer(params$showValue) - prior <- ws$get_prior_sheet_data() - post <- ws$get_post_sheet_data() + gradient <- 1 + if ("gradient" %in% names(params)) + gradient <- as.integer(params$gradient) - worksheets[[i]]$sheet_data$style_id <<- as.character(worksheets[[i]]$sheet_data$style_id) + border <- 1 + if ("border" %in% names(params)) + border <- as.integer(params$border) - if(length(rowHeights[[i]]) == 0){ - - write_worksheet_xml(prior = prior, - post = post, - sheet_data = ws$sheet_data, - R_fileName = file.path(xlworksheetsDir, sprintf("sheet%s.xml", i))) - - }else{ + if (is.null(values)) { + cfRule <- + sprintf( + ' + + + + {%s} + ', + showValue, + posColour, + guid + ) - ## row heights will always be in order and all row heights are given rows in preSaveCleanup - write_worksheet_xml_2(prior = prior, - post = post, - sheet_data = ws$sheet_data, - row_heights = unlist(rowHeights[[i]]), - R_fileName = file.path(xlworksheetsDir, sprintf("sheet%s.xml", i))) + } else{ + cfRule <- + sprintf( + ' + + + + + {%s}', + showValue, + values[[1]], + values[[2]], + posColour, + guid + ) } - worksheets[[i]]$sheet_data$style_id <<- integer(0) + worksheets[[sheet]]$extLst <<- + c( + worksheets[[sheet]]$extLst, + gen_databar_extlst( + guid = guid, + sqref = sqref, + posColour = posColour, + negColour = negColour, + values = values, + border = border, + gradient = gradient + ) + ) + } else if (type == "expression") { + cfRule <- + sprintf( + '%s', + dxfId, + formula + ) - ## write worksheet rels - if(length(worksheets_rels[[i]]) > 0 ){ - - ws_rels <- worksheets_rels[[i]] - if(hasHL){ - h_inds <- paste0(1:length(worksheets[[i]]$hyperlinks), "h") - ws_rels <- c(ws_rels, unlist(lapply(1:length(h_inds), function(j) worksheets[[i]]$hyperlinks[[j]]$to_target_xml(h_inds[j])))) - } - - ## Check if any tables were deleted - remove these from rels - if(length(tables) > 0){ - table_inds <- which(grepl("tables/table[0-9].xml", ws_rels)) - - if(length(table_inds) > 0){ - - ids <- regmatches(ws_rels[table_inds], regexpr('(?<=Relationship Id=")[0-9A-Za-z]+', ws_rels[table_inds], perl = TRUE)) - inds <- as.integer(gsub("[^0-9]", "", ids, perl = TRUE)) - 2L - table_nms <- attr(tables, "tableName")[inds] - is_deleted <- grepl("openxlsx_deleted", table_nms, fixed = TRUE) - if(any(is_deleted)) - ws_rels <- ws_rels[-table_inds[is_deleted]] - - } - } - - - - write_file(head = '', - body = pxml(ws_rels), - tail = '', - fl = file.path(xlworksheetsRelsDir, sprintf("sheet%s.xml.rels", i)) + + } else if (type == "duplicatedValues") { + cfRule <- + sprintf('', + dxfId) + + + + } else if (type == "containsText") { + cfRule <- + sprintf( + ' + NOT(ISERROR(SEARCH("%s", %s))) + ', + dxfId, + values, + values, + unlist(strsplit(sqref, split = ":"))[[1]] ) - - } - }## end of isChartSheet[i] - - } ## end of loop through 1:nSheets - - invisible(0) - -}) - - - - - -Workbook$methods(setRowHeights = function(sheet, rows, heights){ - - sheet = validateSheet(sheet) - - ## remove any conflicting heights - flag <- names(rowHeights[[sheet]]) %in% rows - if(any(flag)) - rowHeights[[sheet]] <<- rowHeights[[sheet]][!flag] - - nms <- c(names(rowHeights[[sheet]]), rows) - allRowHeights <- unlist(c(rowHeights[[sheet]], heights)) - names(allRowHeights) <- nms - - allRowHeights <- allRowHeights[order(as.integer(names(allRowHeights)))] - - rowHeights[[sheet]] <<- allRowHeights - -}) - - -Workbook$methods(deleteWorksheet = function(sheet){ - - # To delete a worksheet - # Remove colwidths element - # Remove drawing partname from Content_Types (drawing(sheet).xml) - # Remove highest sheet from Content_Types - # Remove drawings element - # Remove drawings_rels element - - # Remove vml element - # Remove vml_rels element - - # Remove rowHeights element - # Remove styleObjects on sheet - # Remove last sheet element from workbook - # Remove last sheet element from workbook.xml.rels - # Remove element from worksheets - # Remove element from worksheets_rels - # Remove hyperlinks - # Reduce calcChain i attributes & remove calcs on sheet - # Remove sheet from sheetOrder - # Remove queryTable references from workbook$definedNames to worksheet - # remove tables - - sheet <- validateSheet(sheet) - sheetNames <- sheet_names - nSheets <- length(unlist(sheetNames, use.names = FALSE)) - sheetName <- sheetNames[[sheet]] - - colWidths[[sheet]] <<- NULL - sheet_names <<- sheet_names[-sheet] - - ## remove last drawings(sheet).xml from Content_Types - Content_Types <<- Content_Types[!grepl(sprintf("drawing%s.xml", nSheets), Content_Types)] - - ## remove highest sheet - Content_Types <<- Content_Types[!grepl(sprintf("sheet%s.xml", nSheets), Content_Types)] - - drawings[[sheet]] <<- NULL - drawings_rels[[sheet]] <<- NULL - - vml[[sheet]] <<- NULL - vml_rels[[sheet]] <<- NULL - - rowHeights[[sheet]] <<- NULL - comments[[sheet]] <<- NULL - isChartSheet <<- isChartSheet[-sheet] - - ## sheetOrder - toRemove <- which(sheetOrder == sheet) - sheetOrder[sheetOrder > sheet] <<- sheetOrder[sheetOrder > sheet] - 1L - sheetOrder <<- sheetOrder[-toRemove] - - - ## remove styleObjects - if(length(styleObjects) > 0) - styleObjects <<- styleObjects[unlist(lapply(styleObjects, "[[", "sheet"), use.names = FALSE) != sheetName] - - ## Need to remove reference from workbook.xml.rels to pivotCache - removeRels <- worksheets_rels[[sheet]][grepl("pivotTables", worksheets_rels[[sheet]])] - if(length(removeRels) > 0){ - - ## sheet rels links to a pivotTable file, the corresponding pivotTable_rels file links to the cacheDefn which is listing in workbook.xml.rels - ## remove reference to this file from the workbook.xml.rels - fileNo <- as.integer(unlist(regmatches(removeRels, gregexpr('(?<=pivotTable)[0-9]+(?=\\.xml)', removeRels, perl = TRUE)))) - toRemove <- paste(sprintf("(pivotCacheDefinition%s\\.xml)", fileNo), collapse = "|") - - fileNo <- which(grepl(toRemove, pivotTables.xml.rels)) - toRemove <- paste(sprintf("(pivotCacheDefinition%s\\.xml)", fileNo), collapse = "|") - - ## remove reference to file from workbook.xml.res - workbook.xml.rels <<- workbook.xml.rels[!grepl(toRemove, workbook.xml.rels)] - - } - - ## As above for slicers - ## Need to remove reference from workbook.xml.rels to pivotCache - removeRels <- grepl("slicers", worksheets_rels[[sheet]]) - if(any(removeRels)) - workbook.xml.rels <<- workbook.xml.rels[!grepl(sprintf("(slicerCache%s\\.xml)", sheet), workbook.xml.rels)] - - ## wont't remove tables and then won't need to reassign table r:id's but will rename them! - worksheets[[sheet]] <<- NULL - worksheets_rels[[sheet]] <<- NULL - - if(length(tables) > 0){ - - tableSheets <- attr(tables, "sheet") - tableNames <- attr(tables, "tableName") - - inds <- tableSheets %in% sheet & !grepl("openxlsx_deleted", attr(tables, "tableName"), fixed = TRUE) - tableSheets[tableSheets > sheet] <- tableSheets[tableSheets > sheet] - 1L - - ## Need to flag a table as deleted - if(any(inds)){ - tableSheets[inds] <- 0 - tableNames[inds] <- paste0(tableNames[inds], "_openxlsx_deleted") - } - attr(tables, "tableName") <<- tableNames - attr(tables, "sheet") <<- tableSheets - } - - - ## drawing will always be the first relationship and printerSettings second - if(nSheets > 1){ - for(i in 1:(nSheets-1L)) - worksheets_rels[[i]][1:3] <<- genBaseSheetRels(i) - }else{ - worksheets_rels <<- list() - } - - - ## remove sheet - sn <- unlist(lapply(workbook$sheets, function(x) regmatches(x, regexpr('(?<= name=")[^"]+', x, perl = TRUE)))) - workbook$sheets <<- workbook$sheets[!sn %in% sheetName] - - ## Reset rIds - if(nSheets > 1){ - for(i in (sheet+1L):nSheets) - workbook$sheets <<- gsub(paste0("rId", i), paste0("rId", i-1L), workbook$sheets, fixed = TRUE) - }else{ - workbook$sheets <<- NULL - } - - ## Can remove highest sheet - workbook.xml.rels <<- workbook.xml.rels[!grepl(sprintf("sheet%s.xml", nSheets), workbook.xml.rels)] - - ## definedNames - if(length(workbook$definedNames) > 0){ - belongTo <- getDefinedNamesSheet(workbook$definedNames) - workbook$definedNames <<- workbook$definedNames[!belongTo %in% sheetName] - } - - invisible(1) - -}) - - -Workbook$methods(addDXFS = function(style){ - - dxf <- '' - dxf <- paste0(dxf, createFontNode(style)) - fillNode <- NULL - - if(!is.null(style$fill$fillFg) | !is.null(style$fill$fillBg)) - dxf <- paste0(dxf, createFillNode(style)) - - if(any(!is.null(c(style$borderLeft, style$borderRight, style$borderTop, style$borderBottom, style$borderDiagonal)))) - dxf <- paste0(dxf, createBorderNode(style)) - - dxf <- paste(dxf, "") - if(dxf %in% styles$dxfs) - return(which(styles$dxfs == dxf) - 1L) - - dxfId <- length(styles$dxfs) - styles$dxfs <<- c(styles$dxfs, dxf) - - return(dxfId) -}) - - - -Workbook$methods(dataValidation = function(sheet, startRow, endRow, startCol, endCol, type, operator, value, allowBlank, showInputMsg, showErrorMsg){ - - sheet = validateSheet(sheet) - sqref <- paste(getCellRefs(data.frame("x" = c(startRow, endRow), "y" = c(startCol, endCol))), collapse = ":") - - header <- sprintf('', - type, operator, allowBlank, showInputMsg, showErrorMsg, sqref) - - - if(type == "date"){ - - origin <- 25569L - if(grepl('date1904="1"|date1904="true"', paste(unlist(workbook), collapse = ""), ignore.case = TRUE)) - origin <- 24107L - - value <- as.integer(value) + origin - - } - - if(type == "time"){ + } else if (type == "between") { + cfRule <- + sprintf( + '%s%s', + dxfId, + formula[1], + formula[2] + ) + + + } - origin <- 25569L - if(grepl('date1904="1"|date1904="true"', paste(unlist(workbook), collapse = ""), ignore.case = TRUE)) - origin <- 24107L + worksheets[[sheet]]$conditionalFormatting <<- + append(worksheets[[sheet]]$conditionalFormatting, cfRule) - t <- format(value[1], "%z") - offSet <- suppressWarnings(ifelse(substr(t,1,1) == "+", 1L, -1L) * (as.integer(substr(t,2,3)) + as.integer(substr(t,4,5)) / 60) / 24) - if(is.na(offSet)) offSet[i] <- 0 + names(worksheets[[sheet]]$conditionalFormatting) <<- nms - value <- as.numeric(as.POSIXct(value)) / 86400 + origin + offSet + invisible(0) - } - - form <- sapply(1:length(value), function(i) sprintf("%s", i, value[i], i)) - worksheets[[sheet]]$dataValidations <<- c(worksheets[[sheet]]$dataValidations, paste0(header, paste(form, collapse = ""), "")) - - invisible(0) - -}) - - + } +) -Workbook$methods(dataValidation_list = function(sheet, startRow, endRow, startCol, endCol, value, allowBlank, showInputMsg, showErrorMsg) { - - sheet = validateSheet(sheet) - sqref <-paste(getCellRefs(data.frame("x" = c(startRow, endRow), "y" = c(startCol, endCol))), collapse = ":") - data_val <- sprintf('',allowBlank,showInputMsg, showErrorMsg, sqref) - - formula <- sprintf("%s", value) - sqref <- sprintf('%s', sqref) - - xmlData <-paste0(data_val, formula, sqref, '') - - worksheets[[sheet]]$extLst <<- c(worksheets[[sheet]]$extLst, xmlData) - - invisible(0) -}) -Workbook$methods(conditionalFormatting = function(sheet, startRow, endRow, startCol, endCol, dxfId, formula, type, values, params){ - - sheet = validateSheet(sheet) - sqref <- paste(getCellRefs(data.frame("x" = c(startRow, endRow), "y" = c(startCol, endCol))), collapse = ":") - - - - ## Increment priority of conditional formatting rule - if(length(worksheets[[sheet]]$conditionalFormatting) > 0){ +Workbook$methods( + mergeCells = function(sheet, startRow, endRow, startCol, endCol) { + sheet <- validateSheet(sheetName = sheet) - for(i in length(worksheets[[sheet]]$conditionalFormatting):1){ - - priority <- regmatches(worksheets[[sheet]]$conditionalFormatting[[i]], regexpr('(?<=priority=")[0-9]+', worksheets[[sheet]]$conditionalFormatting[[i]], perl = TRUE)) - priority_new <- as.integer(priority) + 1L - - priority_pattern <- sprintf('priority="%s"', priority) - priority_new <- sprintf('priority="%s"', priority_new) + sqref <- + getCellRefs(data.frame( + "x" = c(startRow, endRow), + "y" = c(startCol, endCol) + )) + exMerges <- + regmatches(worksheets[[sheet]]$mergeCells, + regexpr("[A-Z0-9]+:[A-Z0-9]+", worksheets[[sheet]]$mergeCells)) + + if (!is.null(exMerges)) { + comps <- + lapply(exMerges, function(rectCoords) + unlist(strsplit(rectCoords, split = ":"))) + exMergedCells <- build_cell_merges(comps = comps) + newMerge <- unlist(build_cell_merges(comps = list(sqref))) - ## now replace - worksheets[[sheet]]$conditionalFormatting[[i]] <<- gsub(priority_pattern, priority_new, worksheets[[sheet]]$conditionalFormatting[[i]], fixed = TRUE) + ## Error if merge intersects + mergeIntersections <- + sapply(exMergedCells, function(x) + any(x %in% newMerge)) + if (any(mergeIntersections)) + stop( + sprintf( + "Merge intersects with existing merged cells: \n\t\t%s.\nRemove existing merge first.", + stri_join(exMerges[mergeIntersections], collapse = "\n\t\t") + ) + ) } + worksheets[[sheet]]$mergeCells <<- + c(worksheets[[sheet]]$mergeCells, + sprintf( + '', + stri_join(sqref, collapse = ":", sep = + " ") + )) + + } - - nms <- c(names(worksheets[[sheet]]$conditionalFormatting), sqref) - - if(type == "colorScale"){ +) + + + +Workbook$methods( + removeCellMerge = function(sheet, startRow, endRow, startCol, endCol) { + sheet = validateSheet(sheet) - ## formula contains the colours - ## values contains numerics or is NULL - ## dxfId is ignored + sqref <- + getCellRefs(data.frame( + "x" = c(startRow, endRow), + "y" = c(startCol, endCol) + )) + exMerges <- + regmatches(worksheets[[sheet]]$mergeCells, + regexpr("[A-Z0-9]+:[A-Z0-9]+", worksheets[[sheet]]$mergeCells)) - if(is.null(values)){ - - if(length(formula) == 2L){ - cfRule <- sprintf(' - - - ', formula[[1]], formula[[2]]) - }else{ - cfRule <- sprintf(' - - - ', formula[[1]], formula[[2]], formula[[3]]) - } - - }else{ + if (!is.null(exMerges)) { + comps <- + lapply(exMerges, function(x) + unlist(strsplit(x, split = ":"))) + exMergedCells <- build_cell_merges(comps = comps) + newMerge <- unlist(build_cell_merges(comps = list(sqref))) - if(length(formula) == 2L){ - cfRule <- sprintf(' - - - ', values[[1]], values[[2]], formula[[1]], formula[[2]]) - }else{ - cfRule <- sprintf(' - - - ', values[[1]], values[[2]], values[[3]], formula[[1]], formula[[2]], formula[[3]]) - } + ## Error if merge intersects + mergeIntersections <- + sapply(exMergedCells, function(x) + any(x %in% newMerge)) } + ## Remove intersection + worksheets[[sheet]]$mergeCells <<- + worksheets[[sheet]]$mergeCells[!mergeIntersections] - }else if(type == "dataBar"){ - # forumula is a vector of colours of length 1 or 2 - # values is NULL or a numeric vector of equal length as formula + } +) + + + + + +Workbook$methods( + freezePanes = function(sheet, + firstActiveRow = NULL, + firstActiveCol = NULL, + firstRow = FALSE, + firstCol = FALSE) { + sheet = validateSheet(sheet) + paneNode <- NULL - if(length(formula) == 2L){ - negColour <- formula[[1]] - posColour <- formula[[2]] - }else{ - posColour <- formula - negColour <- "FFFF0000" + if (firstRow) { + paneNode <- + '' + } else if (firstCol) { + paneNode <- + '' } - guid <- paste0("F7189283-14F7-4DE0-9601-54DE9DB", 40000L + length(worksheets[[sheet]]$extLst)) - - showValue <- 1 - if("showValue" %in% names(params)) - showValue <- as.integer(params$showValue) - - gradient <- 1 - if("gradient" %in% names(params)) - gradient <- as.integer(params$gradient) - - border <- 1 - if("border" %in% names(params)) - border <- as.integer(params$border) - if(is.null(values)){ + if (is.null(paneNode)) { + if (firstActiveRow == 1 & firstActiveCol == 1) + ## nothing to do + return(NULL) + if (firstActiveRow > 1 & firstActiveCol == 1) { + attrs <- sprintf('ySplit="%s"', firstActiveRow - 1L) + activePane <- "bottomLeft" + } - cfRule <- sprintf(' - - - - {%s} - ', showValue, posColour, guid) + if (firstActiveRow == 1 & firstActiveCol > 1) { + attrs <- sprintf('xSplit="%s"', firstActiveCol - 1L) + activePane <- "topRight" + } - }else{ + if (firstActiveRow > 1 & firstActiveCol > 1) { + attrs <- + sprintf('ySplit="%s" xSplit="%s"', + firstActiveRow - 1L, + firstActiveCol - 1L) + activePane <- "bottomRight" + } - cfRule <- sprintf(' - - - - - {%s}', showValue, values[[1]], values[[2]], posColour, guid) + topLeftCell <- + getCellRefs(data.frame(firstActiveRow, firstActiveCol)) + + paneNode <- + sprintf( + '', + stri_join(attrs, collapse = " ", sep = " "), + topLeftCell, + activePane, + activePane + ) } - worksheets[[sheet]]$extLst <<- c(worksheets[[sheet]]$extLst, gen_databar_extlst(guid = guid, - sqref = sqref, - posColour = posColour, - negColour = negColour, - values = values, - border = border, - gradient = gradient)) + worksheets[[sheet]]$freezePane <<- paneNode + + } +) + + + +Workbook$methods( + insertImage = function(sheet, + file, + startRow, + startCol, + width, + height, + rowOffset = 0, + colOffset = 0) { + ## within the sheet the drawing node's Id refernce an id in the sheetRels + ## sheet rels reference the drawingi.xml file + ## drawingi.xml refernece drawingRels + ## drawing rels reference an image in the media folder + ## worksheetRels(sheet(i)) references drawings(j) - }else if(type == "expression"){ + sheet = validateSheet(sheet) - cfRule <- sprintf('%s', dxfId, formula) + imageType <- regmatches(file, gregexpr("\\.[a-zA-Z]*$", file)) + imageType <- gsub("^\\.", "", imageType) + imageNo <- length((drawings[[sheet]])) + 1L + mediaNo <- length(media) + 1L - }else if(type == "duplicatedValues"){ + startCol <- convertFromExcelRef(startCol) - cfRule <- sprintf('', dxfId) + ## update Content_Types + if (!any(grepl(stri_join("image/", imageType), Content_Types))) + Content_Types <<- + unique(c( + sprintf( + '', + imageType, + imageType + ), + Content_Types + )) + ## drawings rels (Reference from drawings.xml to image file in media folder) + drawings_rels[[sheet]] <<- c( + drawings_rels[[sheet]], + sprintf( + '', + imageNo, + mediaNo, + imageType + ) + ) + ## write file path to media slot to copy across on save + tmp <- file + names(tmp) <- stri_join("image", mediaNo, ".", imageType) + media <<- append(media, tmp) - }else if(type == "containsText"){ + ## create drawing.xml + anchor <- + '' - cfRule <- sprintf(' - NOT(ISERROR(SEARCH("%s", %s))) - ', dxfId, values, values, unlist(strsplit(sqref, split = ":"))[[1]]) + from <- sprintf( + ' + %s + %s + %s + %s + ' , + startCol - 1L, + colOffset, + startRow - 1L, + rowOffset + ) - }else if(type == "between"){ + drawingsXML <- stri_join( + anchor, + from, + sprintf( + '', + width, + height + ), + genBasePic(imageNo), + '', + '' + ) - cfRule <- sprintf('%s%s', dxfId, formula[1], formula[2]) + ## append to workbook drawing + drawings[[sheet]] <<- c(drawings[[sheet]], drawingsXML) } - - worksheets[[sheet]]$conditionalFormatting <<- append(worksheets[[sheet]]$conditionalFormatting, cfRule) - - names(worksheets[[sheet]]$conditionalFormatting) <<- nms - - invisible(0) - -}) +) - -Workbook$methods(mergeCells = function(sheet, startRow, endRow, startCol, endCol) { - - sheet <- validateSheet(sheetName = sheet) - - sqref <- getCellRefs(data.frame("x" = c(startRow, endRow), "y" = c(startCol, endCol))) - exMerges <- regmatches(worksheets[[sheet]]$mergeCells, regexpr("[A-Z0-9]+:[A-Z0-9]+", worksheets[[sheet]]$mergeCells)) - - if(!is.null(exMerges)){ +Workbook$methods( + preSaveCleanUp = function() { + ## Steps + # Order workbook.xml.rels: + # sheets -> style -> theme -> sharedStrings -> tables -> calcChain + # Assign workbook.xml.rels children rIds, 1:length(workbook.xml.rels) + # Assign workbook$sheets rIds 1:nSheets + # + ## drawings will always be r:id1 on worksheet + ## tables will always have r:id equal to table xml file number tables/table(i).xml - comps <- lapply(exMerges, function(rectCoords) unlist(strsplit(rectCoords, split = ":"))) - exMergedCells <- build_cell_merges(comps = comps) - newMerge <- unlist(build_cell_merges(comps = list(sqref))) + ## Every worksheet has a drawingXML as r:id 1 + ## Every worksheet has a printerSettings as r:id 2 + ## Tables from r:id 3 to nTables+3 - 1 + ## HyperLinks from nTables+3 to nTables+3+nHyperLinks-1 + ## vmlDrawing to have rId - ## Error if merge intersects - mergeIntersections <- sapply(exMergedCells, function(x) any(x %in% newMerge)) - if(any(mergeIntersections)) - stop(sprintf("Merge intersects with existing merged cells: \n\t\t%s.\nRemove existing merge first.", paste(exMerges[mergeIntersections], collapse = "\n\t\t"))) + sheetRIds <- + as.integer(unlist(regmatches( + workbook$sheets, + gregexpr('(?<=r:id="rId)[0-9]+', workbook$sheets, perl = TRUE) + ))) - } - - worksheets[[sheet]]$mergeCells <<- c(worksheets[[sheet]]$mergeCells, sprintf('', paste(sqref, collapse = ":"))) - - -}) - - - -Workbook$methods(removeCellMerge = function(sheet, startRow, endRow, startCol, endCol){ - - sheet = validateSheet(sheet) - - sqref <- getCellRefs(data.frame("x" = c(startRow, endRow), "y" = c(startCol, endCol))) - exMerges <- regmatches(worksheets[[sheet]]$mergeCells, regexpr("[A-Z0-9]+:[A-Z0-9]+", worksheets[[sheet]]$mergeCells)) - - if(!is.null(exMerges)){ + nSheets <- length(sheetRIds) + nExtRefs <- length(externalLinks) + nPivots <- length(pivotDefinitions) - comps <- lapply(exMerges, function(x) unlist(strsplit(x, split = ":"))) - exMergedCells <- build_cell_merges(comps = comps) - newMerge <- unlist(build_cell_merges(comps = list(sqref))) + ## add a worksheet if none added + if (nSheets == 0) { + warning("Workbook does not contain any worksheets. A worksheet will be added.", + call. = FALSE) + .self$addWorksheet("Sheet 1") + nSheets <- 1L + } - ## Error if merge intersects - mergeIntersections <- sapply(exMergedCells, function(x) any(x %in% newMerge)) + ## get index of each child element for ordering + sheetInds <- + which(grepl( + "(worksheets|chartsheets)/sheet[0-9]+\\.xml", + workbook.xml.rels + )) + stylesInd <- which(grepl("styles\\.xml", workbook.xml.rels)) + themeInd <- + which(grepl("theme/theme[0-9]+.xml", workbook.xml.rels)) + connectionsInd <- + which(grepl("connections.xml", workbook.xml.rels)) + extRefInds <- + which(grepl("externalLinks/externalLink[0-9]+.xml", workbook.xml.rels)) + sharedStringsInd <- + which(grepl("sharedStrings.xml", workbook.xml.rels)) + tableInds <- which(grepl("table[0-9]+.xml", workbook.xml.rels)) - } - - ## Remove intersection - worksheets[[sheet]]$mergeCells <<- worksheets[[sheet]]$mergeCells[!mergeIntersections] - - -}) - - - - - -Workbook$methods(freezePanes = function(sheet, firstActiveRow = NULL, firstActiveCol = NULL, firstRow = FALSE, firstCol = FALSE){ - - sheet = validateSheet(sheet) - paneNode <- NULL - - if(firstRow){ - paneNode <- '' - }else if(firstCol){ - paneNode <- '' - } - - - if(is.null(paneNode)){ - if(firstActiveRow == 1 & firstActiveCol == 1) ## nothing to do - return(NULL) + ## Reordering of workbook.xml.rels + ## don't want to re-assign rIds for pivot tables or slicer caches + pivotNode <- + workbook.xml.rels[grepl("pivotCache/pivotCacheDefinition[0-9].xml", + workbook.xml.rels)] + slicerNode <- + workbook.xml.rels[which(grepl("slicerCache[0-9]+.xml", workbook.xml.rels))] + + ## Reorder children of workbook.xml.rels + workbook.xml.rels <<- + workbook.xml.rels[c( + sheetInds, + extRefInds, + themeInd, + connectionsInd, + stylesInd, + sharedStringsInd, + tableInds + )] + + ## Re assign rIds to children of workbook.xml.rels + workbook.xml.rels <<- + unlist(lapply(1:length(workbook.xml.rels), function(i) { + gsub('(?<=Relationship Id="rId)[0-9]+', + i, + workbook.xml.rels[[i]], + perl = TRUE) + })) + + workbook.xml.rels <<- c(workbook.xml.rels, pivotNode, slicerNode) + + + + if (!is.null(vbaProject)) + workbook.xml.rels <<- + c( + workbook.xml.rels, + sprintf( + '', + 1L + length(workbook.xml.rels) + ) + ) + + ## Reassign rId to workbook sheet elements, (order sheets by sheetId first) + workbook$sheets <<- + unlist(lapply(1:length(workbook$sheets), function(i) { + gsub('(?<= r:id="rId)[0-9]+', i, workbook$sheets[[i]], perl = TRUE) + })) + + ## re-order worksheets if need to + if (any(sheetOrder != 1:nSheets)) + workbook$sheets <<- workbook$sheets[sheetOrder] - if(firstActiveRow > 1 & firstActiveCol == 1){ - attrs <- sprintf('ySplit="%s"', firstActiveRow - 1L) - activePane <- "bottomLeft" - } - - if(firstActiveRow == 1 & firstActiveCol > 1){ - attrs <- sprintf('xSplit="%s"', firstActiveCol - 1L) - activePane <- "topRight" - } - - if(firstActiveRow > 1 & firstActiveCol > 1){ - attrs <- sprintf('ySplit="%s" xSplit="%s"', firstActiveRow - 1L, firstActiveCol - 1L) - activePane <- "bottomRight" - } - - topLeftCell <- getCellRefs(data.frame(firstActiveRow, firstActiveCol)) - - paneNode <- sprintf('', - paste(attrs, collapse = " "), topLeftCell, activePane, activePane) - - } - - worksheets[[sheet]]$freezePane <<- paneNode - -}) - - - -Workbook$methods(insertImage = function(sheet, file, startRow, startCol, width, height, rowOffset = 0, colOffset = 0){ - - ## within the sheet the drawing node's Id refernce an id in the sheetRels - ## sheet rels reference the drawingi.xml file - ## drawingi.xml refernece drawingRels - ## drawing rels reference an image in the media folder - ## worksheetRels(sheet(i)) references drawings(j) - - sheet = validateSheet(sheet) - - imageType <- regmatches(file, gregexpr("\\.[a-zA-Z]*$", file)) - imageType <- gsub("^\\.", "", imageType) - - imageNo <- length((drawings[[sheet]])) + 1L - mediaNo <- length(media) + 1L - - startCol <- convertFromExcelRef(startCol) - - ## update Content_Types - if(!any(grepl(paste0("image/", imageType), Content_Types))) - Content_Types <<- unique(c(sprintf('', imageType, imageType), Content_Types)) - - ## drawings rels (Reference from drawings.xml to image file in media folder) - drawings_rels[[sheet]] <<- c(drawings_rels[[sheet]], - sprintf('', imageNo, mediaNo, imageType)) - - ## write file path to media slot to copy across on save - tmp <- file - names(tmp) <- paste0("image", mediaNo,".", imageType) - media <<- append(media, tmp) - - ## create drawing.xml - anchor <- '' - - from <- sprintf( - ' - %s - %s - %s - %s - ' , startCol - 1L, colOffset, startRow - 1L, rowOffset) - - drawingsXML <- paste0( - anchor, - from, - sprintf('', width, height), - genBasePic(imageNo), - '', - '' - ) - - - ## append to workbook drawing - drawings[[sheet]] <<- c(drawings[[sheet]], drawingsXML) - -}) - - - -Workbook$methods(preSaveCleanUp = function(){ - - - ## Steps - # Order workbook.xml.rels: - # sheets -> style -> theme -> sharedStrings -> tables -> calcChain - # Assign workbook.xml.rels children rIds, 1:length(workbook.xml.rels) - # Assign workbook$sheets rIds 1:nSheets - # - ## drawings will always be r:id1 on worksheet - ## tables will always have r:id equal to table xml file number tables/table(i).xml - - ## Every worksheet has a drawingXML as r:id 1 - ## Every worksheet has a printerSettings as r:id 2 - ## Tables from r:id 3 to nTables+3 - 1 - ## HyperLinks from nTables+3 to nTables+3+nHyperLinks-1 - ## vmlDrawing to have rId - - sheetRIds <- as.integer(unlist(regmatches(workbook$sheets, gregexpr('(?<=r:id="rId)[0-9]+', workbook$sheets, perl = TRUE)))) - - nSheets <- length(sheetRIds) - nExtRefs <- length(externalLinks) - nPivots <- length(pivotDefinitions) - - ## add a worksheet if none added - if(nSheets == 0){ - warning("Workbook does not contain any worksheets. A worksheet will be added.", call. = FALSE) - .self$addWorksheet("Sheet 1") - nSheets <- 1L - } - - ## get index of each child element for ordering - sheetInds <- which(grepl("(worksheets|chartsheets)/sheet[0-9]+\\.xml", workbook.xml.rels)) - stylesInd <- which(grepl("styles\\.xml", workbook.xml.rels)) - themeInd <- which(grepl("theme/theme[0-9]+.xml", workbook.xml.rels)) - connectionsInd <- which(grepl("connections.xml", workbook.xml.rels)) - extRefInds <- which(grepl("externalLinks/externalLink[0-9]+.xml", workbook.xml.rels)) - sharedStringsInd <- which(grepl("sharedStrings.xml", workbook.xml.rels)) - tableInds <- which(grepl("table[0-9]+.xml", workbook.xml.rels)) - - - ## Reordering of workbook.xml.rels - ## don't want to re-assign rIds for pivot tables or slicer caches - pivotNode <- workbook.xml.rels[grepl("pivotCache/pivotCacheDefinition[0-9].xml", workbook.xml.rels)] - slicerNode <- workbook.xml.rels[which(grepl("slicerCache[0-9]+.xml", workbook.xml.rels))] - - ## Reorder children of workbook.xml.rels - workbook.xml.rels <<- workbook.xml.rels[c(sheetInds, extRefInds, themeInd, connectionsInd, stylesInd, sharedStringsInd, tableInds)] - - ## Re assign rIds to children of workbook.xml.rels - workbook.xml.rels <<- unlist(lapply(1:length(workbook.xml.rels), function(i) { - gsub('(?<=Relationship Id="rId)[0-9]+', i, workbook.xml.rels[[i]], perl = TRUE) - })) - - workbook.xml.rels <<- c(workbook.xml.rels, pivotNode, slicerNode) - - - - if(!is.null(vbaProject)) - workbook.xml.rels <<- c(workbook.xml.rels, sprintf('', 1L + length(workbook.xml.rels))) - - ## Reassign rId to workbook sheet elements, (order sheets by sheetId first) - workbook$sheets <<- unlist(lapply(1:length(workbook$sheets), function(i) { - gsub('(?<= r:id="rId)[0-9]+', i, workbook$sheets[[i]], perl = TRUE) - })) - - ## re-order worksheets if need to - if(any(sheetOrder != 1:nSheets)) - workbook$sheets <<- workbook$sheets[sheetOrder] - - - - ## re-assign tabSelected - state <- rep.int("visible", nSheets) - state[grepl("hidden", workbook$sheets)] <- "hidden" - visible_sheet_index <- which(state %in% "visible")[[1]] - - workbook$bookViews <<- sprintf('', - visible_sheet_index-1L, - visible_sheet_index-1L) - - worksheets[[visible_sheet_index]]$sheetViews <<- sub('( tabSelected="0")|( tabSelected="false")', ' tabSelected="1"', worksheets[[visible_sheet_index]]$sheetViews, ignore.case = TRUE) - if(nSheets > 1){ - for(i in (1:nSheets)[!(1:nSheets) %in% visible_sheet_index]) - worksheets[[i]]$sheetViews <<- sub(' tabSelected="(1|true|false|0)"', ' tabSelected="0"', worksheets[[i]]$sheetViews, ignore.case = TRUE) - } - - - - - - if(length(workbook$definedNames) > 0){ - sheetNames <- sheet_names[sheetOrder] - belongTo <- getDefinedNamesSheet(workbook$definedNames) + ## re-assign tabSelected + state <- rep.int("visible", nSheets) + state[grepl("hidden", workbook$sheets)] <- "hidden" + visible_sheet_index <- which(state %in% "visible")[[1]] - ## sheetNames is in re-ordered order (order it will be displayed) - newId <- match(belongTo, sheetNames) - 1L - oldId <- as.numeric(regmatches(workbook$definedNames, regexpr('(?<= localSheetId=")[0-9]+', workbook$definedNames, perl = TRUE))) + workbook$bookViews <<- + sprintf( + '', + visible_sheet_index - 1L, + visible_sheet_index - 1L + ) - for(i in 1:length(workbook$definedNames)){ - if(!is.na(newId[i])) - workbook$definedNames[[i]] <<- gsub(sprintf('localSheetId=\"%s\"', oldId[i]), sprintf('localSheetId=\"%s\"', newId[i]), workbook$definedNames[[i]], fixed = TRUE) + worksheets[[visible_sheet_index]]$sheetViews <<- + sub( + '( tabSelected="0")|( tabSelected="false")', + ' tabSelected="1"', + worksheets[[visible_sheet_index]]$sheetViews, + ignore.case = TRUE + ) + if (nSheets > 1) { + for (i in (1:nSheets)[!(1:nSheets) %in% visible_sheet_index]) + worksheets[[i]]$sheetViews <<- + sub( + ' tabSelected="(1|true|false|0)"', + ' tabSelected="0"', + worksheets[[i]]$sheetViews, + ignore.case = TRUE + ) } - } - - - - - ## update workbook r:id to match reordered workbook.xml.rels externalLink element - if(length(extRefInds) > 0){ - newInds <- as.integer(1:length(extRefInds) + length(sheetInds)) - workbook$externalReferences <<- paste0("", - paste0(sprintf('', newInds), collapse = ""), - "") - } - - ## styles - numFmtIds <- 50000L - for(i in which(!isChartSheet)) - worksheets[[i]]$sheet_data$style_id <<- rep.int(x = as.integer(NA), times = worksheets[[i]]$sheet_data$n_elements) - - - for(x in styleObjects){ - if(length(x$rows) > 0 & length(x$cols) > 0){ - - this.sty <- x$style$copy() - - if(!is.null(this.sty$numFmt)){ - if(this.sty$numFmt$numFmtId == 9999){ - this.sty$numFmt$numFmtId <- numFmtIds - numFmtIds <- numFmtIds + 1L - } - } - - - ## convert sheet name to index - sheet <- which(sheet_names == x$sheet) - sId <- .self$updateStyles(this.sty) ## this creates the XML for styles.XML - - cells_to_style <- paste(x$rows, x$cols, sep = ",") - existing_cells <- paste(worksheets[[sheet]]$sheet_data$rows, worksheets[[sheet]]$sheet_data$cols, sep = ",") + + + + + + if (length(workbook$definedNames) > 0) { + sheetNames <- sheet_names[sheetOrder] - ## In here we create any style_ids that don't yet exist in sheet_data - worksheets[[sheet]]$sheet_data$style_id[existing_cells %in% cells_to_style] <<- sId + belongTo <- getDefinedNamesSheet(workbook$definedNames) + ## sheetNames is in re-ordered order (order it will be displayed) + newId <- match(belongTo, sheetNames) - 1L + oldId <- + as.numeric(regmatches( + workbook$definedNames, + regexpr( + '(?<= localSheetId=")[0-9]+', + workbook$definedNames, + perl = TRUE + ) + )) - new_cells_to_append <- which(!cells_to_style %in% existing_cells) - if(length(new_cells_to_append) > 0){ - - worksheets[[sheet]]$sheet_data$style_id <<- c(worksheets[[sheet]]$sheet_data$style_id, rep.int(x = sId, times = length(new_cells_to_append))) - - worksheets[[sheet]]$sheet_data$rows <<- c(worksheets[[sheet]]$sheet_data$rows, x$rows[new_cells_to_append]) - worksheets[[sheet]]$sheet_data$cols <<- c(worksheets[[sheet]]$sheet_data$cols, x$cols[new_cells_to_append]) - worksheets[[sheet]]$sheet_data$t <<- c(worksheets[[sheet]]$sheet_data$t, rep(as.integer(NA), length(new_cells_to_append))) - worksheets[[sheet]]$sheet_data$v <<- c(worksheets[[sheet]]$sheet_data$v, rep(as.character(NA), length(new_cells_to_append))) - worksheets[[sheet]]$sheet_data$f <<- c(worksheets[[sheet]]$sheet_data$f, rep(as.character(NA), length(new_cells_to_append))) - worksheets[[sheet]]$sheet_data$data_count <<- worksheets[[sheet]]$sheet_data$data_count + 1L - - worksheets[[sheet]]$sheet_data$n_elements <<- as.integer(length(worksheets[[sheet]]$sheet_data$rows)) - - + for (i in 1:length(workbook$definedNames)) { + if (!is.na(newId[i])) + workbook$definedNames[[i]] <<- + gsub( + sprintf('localSheetId=\"%s\"', oldId[i]), + sprintf('localSheetId=\"%s\"', newId[i]), + workbook$definedNames[[i]], + fixed = TRUE + ) } } - } - - - ## Make sure all rowHeights have rows, if not append them! - for(i in 1:length(worksheets)){ - if(length(rowHeights[[i]]) > 0){ - - rh <- as.integer(names(rowHeights[[i]])) - missing_rows <- rh[!rh %in% worksheets[[i]]$sheet_data$rows] - n <- length(missing_rows) - - if(n > 0){ + + + + ## update workbook r:id to match reordered workbook.xml.rels externalLink element + if (length(extRefInds) > 0) { + newInds <- as.integer(1:length(extRefInds) + length(sheetInds)) + workbook$externalReferences <<- + stri_join( + "", + stri_join( + sprintf('', newInds), + collapse = "" + ), + "" + ) + } + + ## styles + numFmtIds <- 50000L + for (i in which(!isChartSheet)) + worksheets[[i]]$sheet_data$style_id <<- + rep.int(x = as.integer(NA), times = worksheets[[i]]$sheet_data$n_elements) + + + for (x in styleObjects) { + if (length(x$rows) > 0 & length(x$cols) > 0) { + this.sty <- x$style$copy() + + if (!is.null(this.sty$numFmt)) { + if (this.sty$numFmt$numFmtId == 9999) { + this.sty$numFmt$numFmtId <- numFmtIds + numFmtIds <- numFmtIds + 1L + } + } - worksheets[[i]]$sheet_data$style_id <<- c(worksheets[[i]]$sheet_data$style_id, rep.int(as.integer(NA), times = n)) - worksheets[[i]]$sheet_data$rows <<- c(worksheets[[i]]$sheet_data$rows, missing_rows) - worksheets[[i]]$sheet_data$cols <<- c(worksheets[[i]]$sheet_data$cols, rep.int(as.integer(NA), times = n)) + ## convert sheet name to index + sheet <- which(sheet_names == x$sheet) + sId <- + .self$updateStyles(this.sty) ## this creates the XML for styles.XML - worksheets[[i]]$sheet_data$t <<- c(worksheets[[i]]$sheet_data$t, rep(as.integer(NA), times = n)) - worksheets[[i]]$sheet_data$v <<- c(worksheets[[i]]$sheet_data$v, rep(as.character(NA), times = n)) - worksheets[[i]]$sheet_data$f <<- c(worksheets[[i]]$sheet_data$f, rep(as.character(NA), times = n)) - worksheets[[i]]$sheet_data$data_count <<- worksheets[[i]]$sheet_data$data_count + 1L + cells_to_style <- stri_join(x$rows, x$cols, sep = ",") + existing_cells <- + stri_join(worksheets[[sheet]]$sheet_data$rows, + worksheets[[sheet]]$sheet_data$cols, + sep = ",") - worksheets[[i]]$sheet_data$n_elements <<- as.integer(length(worksheets[[i]]$sheet_data$rows)) + ## In here we create any style_ids that don't yet exist in sheet_data + worksheets[[sheet]]$sheet_data$style_id[existing_cells %in% cells_to_style] <<- + sId + + new_cells_to_append <- + which(!cells_to_style %in% existing_cells) + if (length(new_cells_to_append) > 0) { + worksheets[[sheet]]$sheet_data$style_id <<- + c(worksheets[[sheet]]$sheet_data$style_id, + rep.int(x = sId, times = length(new_cells_to_append))) + + worksheets[[sheet]]$sheet_data$rows <<- + c(worksheets[[sheet]]$sheet_data$rows, x$rows[new_cells_to_append]) + worksheets[[sheet]]$sheet_data$cols <<- + c(worksheets[[sheet]]$sheet_data$cols, x$cols[new_cells_to_append]) + worksheets[[sheet]]$sheet_data$t <<- + c(worksheets[[sheet]]$sheet_data$t, rep(as.integer(NA), length(new_cells_to_append))) + worksheets[[sheet]]$sheet_data$v <<- + c(worksheets[[sheet]]$sheet_data$v, + rep(as.character(NA), length(new_cells_to_append))) + worksheets[[sheet]]$sheet_data$f <<- + c(worksheets[[sheet]]$sheet_data$f, + rep(as.character(NA), length(new_cells_to_append))) + worksheets[[sheet]]$sheet_data$data_count <<- + worksheets[[sheet]]$sheet_data$data_count + 1L + + worksheets[[sheet]]$sheet_data$n_elements <<- + as.integer(length(worksheets[[sheet]]$sheet_data$rows)) + + + } } } - ## write colwidth XML - if(length(colWidths[[i]]) > 0) - invisible(.self$setColWidths(i)) + + ## Make sure all rowHeights have rows, if not append them! + for (i in 1:length(worksheets)) { + if (length(rowHeights[[i]]) > 0) { + rh <- as.integer(names(rowHeights[[i]])) + missing_rows <- rh[!rh %in% worksheets[[i]]$sheet_data$rows] + n <- length(missing_rows) + + if (n > 0) { + worksheets[[i]]$sheet_data$style_id <<- + c(worksheets[[i]]$sheet_data$style_id, + rep.int(as.integer(NA), times = n)) + + worksheets[[i]]$sheet_data$rows <<- + c(worksheets[[i]]$sheet_data$rows, missing_rows) + worksheets[[i]]$sheet_data$cols <<- + c(worksheets[[i]]$sheet_data$cols, + rep.int(as.integer(NA), times = n)) + + worksheets[[i]]$sheet_data$t <<- + c(worksheets[[i]]$sheet_data$t, rep(as.integer(NA), times = n)) + worksheets[[i]]$sheet_data$v <<- + c(worksheets[[i]]$sheet_data$v, + rep(as.character(NA), times = n)) + worksheets[[i]]$sheet_data$f <<- + c(worksheets[[i]]$sheet_data$f, + rep(as.character(NA), times = n)) + worksheets[[i]]$sheet_data$data_count <<- + worksheets[[i]]$sheet_data$data_count + 1L + + worksheets[[i]]$sheet_data$n_elements <<- + as.integer(length(worksheets[[i]]$sheet_data$rows)) + + } + } + + ## write colwidth XML + if (length(colWidths[[i]]) > 0) + invisible(.self$setColWidths(i)) + + } } - -}) +) -Workbook$methods(addStyle = function(sheet, style, rows, cols, stack){ - - sheet <- sheet_names[[sheet]] - - if(length(styleObjects) == 0){ - - styleObjects <<- list(list(style = style, - sheet = sheet, - rows = rows, - cols = cols)) - }else if(stack){ - - nStyles <- length(styleObjects) +Workbook$methods( + addStyle = function(sheet, style, rows, cols, stack) { + sheet <- sheet_names[[sheet]] - ## ********** Assume all styleObjects cells have one a single worksheet ********** - ## Loop through existing styleObjects - newInds <- 1:length(rows) - keepStyle <- rep(TRUE, nStyles) - for(i in 1:nStyles){ + if (length(styleObjects) == 0) { + styleObjects <<- list(list( + style = style, + sheet = sheet, + rows = rows, + cols = cols + )) + } else if (stack) { + nStyles <- length(styleObjects) - if(sheet == styleObjects[[i]]$sheet){ - - ## Now check rows and cols intersect - ## toRemove are the elements that the new style doesn't apply to, we remove these from the style object as it - ## is copied, merged with the new style and given the new data points - - ex_row_cols <- paste(styleObjects[[i]]$rows, styleObjects[[i]]$cols, sep = "-") - new_row_cols <- paste(rows, cols, sep = "-") - - - ## mergeInds are the intersection of the two styles that will need to merge - mergeInds <- which(new_row_cols %in% ex_row_cols) - - ## newInds are inds that don't exist in the current - this cumulates until the end to see if any are new - newInds <- newInds[!newInds %in% mergeInds] - - - ## If the new style does not merge - if(length(mergeInds) > 0){ + ## ********** Assume all styleObjects cells have one a single worksheet ********** + ## Loop through existing styleObjects + newInds <- 1:length(rows) + keepStyle <- rep(TRUE, nStyles) + for (i in 1:nStyles) { + if (sheet == styleObjects[[i]]$sheet) { + ## Now check rows and cols intersect + ## toRemove are the elements that the new style doesn't apply to, we remove these from the style object as it + ## is copied, merged with the new style and given the new data points + + ex_row_cols <- + stri_join(styleObjects[[i]]$rows, styleObjects[[i]]$cols, sep = "-") + new_row_cols <- stri_join(rows, cols, sep = "-") - to_remove_from_this_style_object <- which(ex_row_cols %in% new_row_cols) - ## the new style intersects with this styleObjects[[i]], we need to remove the intersecting rows and - ## columns from styleObjects[[i]] - if(length(to_remove_from_this_style_object) > 0){ + ## mergeInds are the intersection of the two styles that will need to merge + mergeInds <- which(new_row_cols %in% ex_row_cols) + + ## newInds are inds that don't exist in the current - this cumulates until the end to see if any are new + newInds <- newInds[!newInds %in% mergeInds] + + + ## If the new style does not merge + if (length(mergeInds) > 0) { + to_remove_from_this_style_object <- + which(ex_row_cols %in% new_row_cols) + + ## the new style intersects with this styleObjects[[i]], we need to remove the intersecting rows and + ## columns from styleObjects[[i]] + if (length(to_remove_from_this_style_object) > 0) { + ## remove these from style object + styleObjects[[i]]$rows <<- + styleObjects[[i]]$rows[-to_remove_from_this_style_object] + styleObjects[[i]]$cols <<- + styleObjects[[i]]$cols[-to_remove_from_this_style_object] + + if (length(styleObjects[[i]]$rows) == 0 | + length(styleObjects[[i]]$cols) == 0) + keepStyle[i] <- + FALSE ## this style applies to no rows or columns anymore + + + } - ## remove these from style object - styleObjects[[i]]$rows <<- styleObjects[[i]]$rows[-to_remove_from_this_style_object] - styleObjects[[i]]$cols <<- styleObjects[[i]]$cols[-to_remove_from_this_style_object] + ## append style object for intersecting cells - if(length(styleObjects[[i]]$rows) == 0 | length(styleObjects[[i]]$cols) == 0) - keepStyle[i] <- FALSE ## this style applies to no rows or columns anymore + ## we are appending a new style + keepStyle <- + c(keepStyle, TRUE) ## keepStyle is used to remove styles that apply to 0 rows OR 0 columns + ## Merge Style and append to styleObjects + styleObjects <<- + append(styleObjects, list( + list( + style = mergeStyle(styleObjects[[i]]$style, newStyle = style), + sheet = sheet, + rows = rows[mergeInds], + cols = cols[mergeInds] + ) + )) } - ## append style object for intersecting cells - - ## we are appending a new style - keepStyle <- c(keepStyle, TRUE) ## keepStyle is used to remove styles that apply to 0 rows OR 0 columns - ## Merge Style and append to styleObjects - styleObjects <<- append(styleObjects, list(list(style = mergeStyle(styleObjects[[i]]$style, newStyle = style), - sheet = sheet, - rows = rows[mergeInds], - cols = cols[mergeInds]))) - - } + } ## if sheet == styleObjects[[i]]$sheet - } ## if sheet == styleObjects[[i]]$sheet + } ## End of loop through styles + ## remove any styles that no longer have any affect + if (!all(keepStyle)) + styleObjects <<- styleObjects[keepStyle] - } ## End of loop through styles - - ## remove any styles that no longer have any affect - if(!all(keepStyle)) - styleObjects <<- styleObjects[keepStyle] - - ## append style object for non-intersecting cells - if(length(newInds) > 0){ + ## append style object for non-intersecting cells + if (length(newInds) > 0) { + styleObjects <<- append(styleObjects, list(list( + style = style, + sheet = sheet, + rows = rows[newInds], + cols = cols[newInds] + ))) + + } - styleObjects <<- append(styleObjects, list(list(style = style, - sheet = sheet, - rows = rows[newInds], - cols = cols[newInds]))) - } - + } else{ + ## else we are not stacking + + styleObjects <<- append(styleObjects, list(list( + style = style, + sheet = sheet, + rows = rows, + cols = cols + ))) + + + } ## End if(length(styleObjects) > 0) else if(stack) {} - }else{ ## else we are not stacking - styleObjects <<- append(styleObjects, list(list(style = style, - sheet = sheet, - rows = rows, - cols = cols))) - } ## End if(length(styleObjects) > 0) else if(stack) {} - - - - -}) + } +) -Workbook$methods(createNamedRegion = function(ref1, ref2, name, sheet, localSheetId = NULL){ - - name <- replaceIllegalCharacters(name) - - if(is.null(localSheetId)){ - workbook$definedNames <<- c(workbook$definedNames, - sprintf('\'%s\'!%s:%s', name, sheet, ref1, ref2 ) - ) - }else{ - workbook$definedNames <<- c(workbook$definedNames, - sprintf('\'%s\'!%s:%s', name, localSheetId, sheet, ref1, ref2) - ) +Workbook$methods( + createNamedRegion = function(ref1, ref2, name, sheet, localSheetId = NULL) { + name <- replaceIllegalCharacters(name) + + if (is.null(localSheetId)) { + workbook$definedNames <<- c( + workbook$definedNames, + sprintf( + '\'%s\'!%s:%s', + name, + sheet, + ref1, + ref2 + ) + ) + } else{ + workbook$definedNames <<- c( + workbook$definedNames, + sprintf( + '\'%s\'!%s:%s', + name, + localSheetId, + sheet, + ref1, + ref2 + ) + ) + } + + } +) + + +Workbook$methods( + validate_table_name = function(tableName) { + tableName <- + tolower(tableName) ## Excel forces named regions to lowercase + + if (nchar(tableName) > 255) + stop("tableName must be less than 255 characters.") + + if (grepl("$", tableName, fixed = TRUE)) + stop("'$' character cannot exist in a tableName") + + if (grepl(" ", tableName, fixed = TRUE)) + stop("spaces cannot exist in a table name") + + # if(!grepl("^[A-Za-z_]", tableName, perl = TRUE)) + # stop("tableName must begin with a letter or an underscore") + + if (grepl("R[0-9]+C[0-9]+", + tableName, + perl = TRUE, + ignore.case = TRUE)) + stop("tableName cannot be the same as a cell reference, such as R1C1") + + if (grepl('^[A-Z]{1,3}[0-9]+$', tableName, ignore.case = TRUE)) + stop("tableName cannot be the same as a cell reference") + + if (tableName %in% attr(tables, "tableName")) + stop(sprintf("Table with name '%s' already exists!", tableName)) + + return(tableName) + } - -}) - - -Workbook$methods(validate_table_name = function(tableName){ - - tableName <- tolower(tableName) ## Excel forces named regions to lowercase - - if(nchar(tableName) > 255) - stop("tableName must be less than 255 characters.") - - if(grepl("$", tableName, fixed = TRUE)) - stop("'$' character cannot exist in a tableName") - - if(grepl(" ", tableName, fixed = TRUE)) - stop("spaces cannot exist in a table name") - - # if(!grepl("^[A-Za-z_]", tableName, perl = TRUE)) - # stop("tableName must begin with a letter or an underscore") - - if(grepl("R[0-9]+C[0-9]+", tableName, perl = TRUE, ignore.case = TRUE)) - stop("tableName cannot be the same as a cell reference, such as R1C1") - - if(grepl('^[A-Z]{1,3}[0-9]+$', tableName, ignore.case = TRUE)) - stop("tableName cannot be the same as a cell reference") - - if(tableName %in% attr(tables, "tableName")) - stop(sprintf("Table with name '%s' already exists!", tableName)) - - return(tableName) - -}) - - -Workbook$methods(check_overwrite_tables = function(sheet - , new_rows - , new_cols - , error_msg = "Cannot overwrite existing table with another table." - , check_table_header_only = FALSE){ - - - - ## check not overwriting another table - if(length(tables) > 0){ - - tableSheets <- attr(tables, "sheet") - sheetNo <- validateSheet(sheet) - - to_check <- which(tableSheets %in% sheetNo & !grepl("openxlsx_deleted", attr(tables, "tableName"), fixed = TRUE)) - - if(length(to_check) > 0){ ## only look at tables on this sheet - - exTable <- tables[to_check] - - rows <- lapply(names(exTable), function(rectCoords) as.numeric(unlist(regmatches(rectCoords, gregexpr("[0-9]+", rectCoords))))) - cols <- lapply(names(exTable), function(rectCoords) convertFromExcelRef(unlist(regmatches(rectCoords, gregexpr("[A-Z]+", rectCoords))))) - - if(check_table_header_only) - rows <- lapply(rows, function(x) c(x[1], x[1])) - - - ## loop through existing tables checking if any over lap with new table - for(i in 1:length(exTable)){ - - existing_cols <- cols[[i]] - existing_rows <- rows[[i]] - - if((min(new_cols) <= max(existing_cols)) & (max(new_cols) >= min(existing_cols)) & (min(new_rows) <= max(existing_rows)) & (max(new_rows) >= min(existing_rows))) - stop(error_msg) +) + + +Workbook$methods( + check_overwrite_tables = function(sheet + , + new_rows + , + new_cols + , + error_msg = "Cannot overwrite existing table with another table." + , + check_table_header_only = FALSE) { + ## check not overwriting another table + if (length(tables) > 0) { + tableSheets <- attr(tables, "sheet") + sheetNo <- validateSheet(sheet) + + to_check <- + which(tableSheets %in% sheetNo & + !grepl("openxlsx_deleted", attr(tables, "tableName"), fixed = TRUE)) + + if (length(to_check) > 0) { + ## only look at tables on this sheet - } - } ## end if(sheet %in% tableSheets) - } ## end (length(tables) > 0) - - invisible(0) - -}) + exTable <- tables[to_check] + + rows <- + lapply(names(exTable), function(rectCoords) + as.numeric(unlist(regmatches( + rectCoords, gregexpr("[0-9]+", rectCoords) + )))) + cols <- + lapply(names(exTable), function(rectCoords) + convertFromExcelRef(unlist(regmatches( + rectCoords, gregexpr("[A-Z]+", rectCoords) + )))) + + if (check_table_header_only) + rows <- lapply(rows, function(x) + c(x[1], x[1])) + + + ## loop through existing tables checking if any over lap with new table + for (i in 1:length(exTable)) { + existing_cols <- cols[[i]] + existing_rows <- rows[[i]] + + if ((min(new_cols) <= max(existing_cols)) & + (max(new_cols) >= min(existing_cols)) & + (min(new_rows) <= max(existing_rows)) & + (max(new_rows) >= min(existing_rows))) + stop(error_msg) + + } + } ## end if(sheet %in% tableSheets) + } ## end (length(tables) > 0) + + invisible(0) + + } +) -Workbook$methods(show = function(){ - - - exSheets <- sheet_names - nSheets <- length(exSheets) - nImages <- length(media) - nCharts <- length(charts) - nStyles <- length(styleObjects) - - exSheets <- replaceXMLEntities(exSheets) - showText <- "A Workbook object.\n" - - ## worksheets - if(nSheets > 0){ - showText <- c(showText, "\nWorksheets:\n") +Workbook$methods( + show = function() { + exSheets <- sheet_names + nSheets <- length(exSheets) + nImages <- length(media) + nCharts <- length(charts) + nStyles <- length(styleObjects) - sheetTxt <- lapply(1:nSheets, function(i){ - - tmpTxt <- sprintf('Sheet %s: "%s"\n', i, exSheets[[i]]) + exSheets <- replaceXMLEntities(exSheets) + showText <- "A Workbook object.\n" + + ## worksheets + if (nSheets > 0) { + showText <- c(showText, "\nWorksheets:\n") - if(length(rowHeights[[i]]) > 0){ + sheetTxt <- lapply(1:nSheets, function(i) { + tmpTxt <- sprintf('Sheet %s: "%s"\n', i, exSheets[[i]]) - tmpTxt <- append(tmpTxt, c("\n\tCustom row heights (row: height)\n\t", - paste(sprintf("%s: %s", names(rowHeights[[i]]), round(as.numeric(rowHeights[[i]]), 2)), collapse = ", ") - ) - ) - } + if (length(rowHeights[[i]]) > 0) { + tmpTxt <- + append(tmpTxt, + c( + "\n\tCustom row heights (row: height)\n\t", + stri_join( + sprintf("%s: %s", names(rowHeights[[i]]), round(as.numeric( + rowHeights[[i]] + ), 2)) + , + collapse = ", ", + sep = " " + ) + )) + } + + + if (length(colWidths[[i]]) > 0) { + cols <- names(colWidths[[i]]) + widths <- unname(colWidths[[i]]) + + widths[widths != "auto"] <- + as.numeric(widths[widths != "auto"]) + tmpTxt <- + append(tmpTxt, + c( + "\n\tCustom column widths (column: width)\n\t ", + stri_join( + sprintf("%s: %s", cols, substr(widths, 1, 5)), + sep = " ", + collapse = ", " + ) + )) + tmpTxt <- c(tmpTxt, "\n") + } + c(tmpTxt, "\n\n") + }) + showText <- c(showText, sheetTxt, "\n") - if(length(colWidths[[i]]) > 0){ - cols <- names(colWidths[[i]]) - widths <- unname(colWidths[[i]]) - - widths[widths != "auto"] <- as.numeric(widths[widths != "auto"]) - tmpTxt <- append(tmpTxt, c("\n\tCustom column widths (column: width)\n\t ", - paste(sprintf("%s: %s", cols, substr(widths,1,5)), collapse = ", ")) - ) - tmpTxt <- c(tmpTxt, "\n") - } - c(tmpTxt, "\n\n") - }) + } else{ + showText <- + c(showText, "\nWorksheets:\n", "No worksheets attached\n") + } + + ## images + if (nImages > 0) + showText <- + c(showText, + "\nImages:\n", + sprintf('Image %s: "%s"\n', 1:nImages, media)) + + if (nCharts > 0) + showText <- + c(showText, + "\nCharts:\n", + sprintf('Chart %s: "%s"\n', 1:nCharts, charts)) + + if (nSheets > 0) + showText <- + c(showText, sprintf( + "Worksheet write order: %s", + stri_join(sheetOrder, sep = " ", collapse = ", ") + )) - showText <- c(showText, sheetTxt, "\n") + cat(unlist(showText)) - }else{ - showText <- c(showText, "\nWorksheets:\n", "No worksheets attached\n") } - - ## images - if(nImages > 0) - showText <- c(showText, "\nImages:\n", sprintf('Image %s: "%s"\n', 1:nImages, media)) - - if(nCharts > 0) - showText <- c(showText, "\nCharts:\n", sprintf('Chart %s: "%s"\n', 1:nCharts, charts)) - - if(nSheets > 0) - showText <- c(showText, sprintf("Worksheet write order: %s", paste(sheetOrder, collapse = ", "))) - - cat(unlist(showText)) - -}) +) # ## function to create the below # strs <- "data.frame(" # for(i in 1:nrow(tab)) -# strs <- append(strs, paste0('"', gsub(" ", ".", tolower(tab$Font[[i]])), '" = ', paste(capture.output(dput(unname(unlist(tab[1,2:ncol(tab)])))), collapse = ""), ", \n")) +# strs <- append(strs, stri_join('"', gsub(" ", ".", tolower(tab$Font[[i]])), '" = ', stri_join(capture.output(dput(unname(unlist(tab[1,2:ncol(tab)])))), collapse = ""), ", \n")) # strs[length(strs)] <- gsub(", \\\n$", ")", strs[length(strs)]) # cat(strs) ## Character width lookup table -openxlsxFontSizeLookupTable <- - data.frame( "agency.fb"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.25, 2.42875, 2.7325, 2.7325, 2.875, 2.875, 3.07125, 3.07125), - "aharoni"= c(0.57125, 0.57125, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 2.875), - "algerian"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125), - "andalus"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "angsana.new"= c(0.3925, 0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25), - "angsanaupc"= c(0.3925, 0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25), - "aparajita"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 1, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875), - "arial.black"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625), - "arial.narrow"= c(0.57125, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.07125, 3.21375, 3.21375), - "arial.rounded.mt.bold"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125), - "arial.unicode.ms"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "arial"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "calibri.light"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "calibri"= c(0.71375, 0.8575, 0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "californian.fb"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 2.875, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "calisto.mt"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "cambria.math"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "cambria"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "candara"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "castellar"= c(1.17875, 1.17875, 1.4825, 1.625, 1.625, 1.96375, 1.96375, 2.1075, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125, 4.6075, 4.7675, 4.7675, 5.08875, 5.25, 5.25), - "centaur"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5), - "century.gothic"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "century.schoolbook"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "century"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "chiller"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575), - "colonna.mt"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "comic.sans.ms"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375), - "consolas"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "constantia"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.5, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "cooper.black"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125), - "copperplate.gothic.bold"= c(1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 4.1425, 4.32125, 4.32125, 4.6075, 4.6075, 4.7675, 5.08875, 5.08875, 5.25), - "copperplate.gothic.light"= c(1.17875, 1.17875, 1.4825, 1.625, 1.625, 1.96375, 1.96375, 2.1075, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.7675, 5.08875, 5.25, 5.25), - "corbel"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "cordia.new"= c(0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875), - "david"= c(0.57125, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375), - "dfkai-sb"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "dilleniaupc"= c(0.3925, 0.3925, 0.57125, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.1075), - "dokchampa"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "dotum"= c(0.71375, 0.71375, 1.17875, 1, 1, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125), - "dotumche"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "ebrima"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "edwardian.script.itc"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.21375, 3.3575, 3.3575), - "elephant"= c(1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.5, 3.5, 3.69625, 3.9825, 3.9825, 4.1425, 4.46375, 4.46375, 4.6075, 4.94625, 4.94625, 5.08875, 5.3925, 5.3925, 5.57125), - "engravers.mt"= c(1, 1, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 4.1425, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675), - "eras.bold.itc"= c(1, 1, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125, 4.6075, 4.6075, 4.7675), - "eras.demi.itc"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375), - "eras.light.itc"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "eras.medium.itc"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.69625, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425), - "estrangelo.edessa"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "eucrosiaupc"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875), - "euphemia"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125), - "fangsong"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "felix.titling"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125), - "fixedsys"= c(1, 1, 1, 1, 1, 1, 1, 1, 2.25, 2.25, 2.25, 2.25, 2.25, 2.25, 2.25, 2.25, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 4.7675, 4.7675, 4.7675, 4.7675), - "footlight.mt.light"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "forte"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "franklin.gothic.book"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 4.1425, 4.1425, 4.32125), - "franklin.gothic.demi.cond"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625), - "franklin.gothic.demi"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 4.1425, 4.1425, 4.32125), - "franklin.gothic.heavy"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 4.1425, 4.1425, 4.32125), - "franklin.gothic.medium.cond"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625), - "franklin.gothic.medium"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 4.1425, 4.1425, 4.32125), - "frankruehl"= c(0.57125, 0.57125, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 2.875), - "freesiaupc"= c(0.57125, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375), - "freestyle.script"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875), - "french.script.mt"= c(0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875), - "gabriola"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 1, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875), - "gadugi"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "gautami"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125), - "georgia"= c(1, 1.17875, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125, 4.46375), - "gigi"= c(0.8575, 0.8575, 0.8575, 0.8575, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.625, 1.625, 1.96375, 1.96375, 1.96375, 2.42875, 2.42875, 2.42875, 2.7325, 2.7325, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.5, 3.83875), - "gill.sans.mt.condensed"= c(0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875), - "gill.sans.mt.ext.condensed.bold"= c(0.3925, 0.3925, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.42875, 2.42875), - "gill.sans.mt"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "gill.sans.ultra.bold.condensed"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.1425), - "gill.sans.ultra.bold"= c(1.32125, 1.4825, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.875, 3.07125, 3.07125, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.25, 5.57125, 5.71375, 5.71375, 6.0175, 6.19625, 6.3575), - "gisha"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "gloucester.mt.extra.condensed"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325), - "goudy.old.style"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "goudy.stout"= c(1.32125, 1.4825, 1.625, 1.80375, 1.96375, 2.25, 2.25, 2.42875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.83875, 3.83875, 3.9825, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.25, 5.3925, 5.57125, 5.875, 6.0175, 6.0175), - "gulim"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.4825, 1.80375, 1.80375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "gulimche"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "gungsuh"= c(0.71375, 0.71375, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125), - "gungsuhche"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "haettenschweiler"= c(0.57125, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375), - "harlow.solid.italic"= c(0.785, 0.785, 0.92875, 0.92875, 1.1075, 1.285, 1.285, 1.42875, 1.625, 1.625, 1.7675, 1.94625, 1.94625, 2.1425, 2.1425, 2.285, 2.285, 2.46375, 2.66, 2.66, 2.80375, 2.9825, 2.9825, 3.125, 3.32125, 3.32125, 3.5, 3.5, 3.6425), - "harrington"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "high.tower.text"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5), - "impact"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825), - "imprint.mt.shadow"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "informal.roman"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.69625, 3.83875), - "irisupc"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325), - "iskoola.pota"= c(0.71375, 0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.96375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "jasmineupc"= c(0.57125, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.07125, 3.21375, 3.21375), - "jokerman"= c(1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 4.1425, 4.32125, 4.32125, 4.6075, 4.6075, 4.7675, 5.08875, 5.08875, 5.25), - "juice.itc"= c(0.3925, 0.57125, 0.71375, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.58875), - "kaiti"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "kalinga"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 3.9825), - "kartika"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "khmer.ui"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "kodchiangupc"= c(0.3925, 0.3925, 0.57125, 0.57125, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.25, 2.42875), - "kristen.itc"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125), - "kunstler.script"= c(0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.42875), - "lao.ui"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "latha"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "leelawadee"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "levenim.mt"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "lilyupc"= c(0.57125, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.07125, 3.21375), - "lucida.bright"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375), - "lucida.calligraphy"= c(1.07125, 1.25, 1.42875, 1.58875, 1.58875, 1.91, 1.94625, 2.1075, 2.25, 2.3925, 2.58875, 2.7675, 2.91, 2.91, 3.285, 3.285, 3.42875, 3.57125, 3.7675, 3.94625, 4.08875, 4.2325, 4.285, 4.6075, 4.6075, 4.75, 4.94625, 5.08875, 5.2675), - "lucida.console"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375), - "lucida.fax"= c(1, 1, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425, 4.46375, 4.46375, 4.6075), - "lucida.handwriting"= c(1.07125, 1.25, 1.42875, 1.58875, 1.58875, 1.91, 2.1075, 2.1075, 2.3925, 2.3925, 2.625, 2.7675, 2.91, 3.05375, 3.285, 3.42875, 3.42875, 3.7325, 3.7675, 3.94625, 4.08875, 4.2325, 4.42875, 4.6075, 4.75, 4.75, 5.08875, 5.08875, 5.2675), - "lucida.sans.typewriter"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375), - "lucida.sans.unicode"= c(1, 1, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425, 4.46375, 4.46375, 4.6075), - "lucida.sans"= c(1, 1, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425, 4.46375, 4.46375, 4.6075), - "magneto"= c(1.17875, 1.32125, 1.625, 1.625, 1.80375, 2.1075, 2.1075, 2.25, 2.58875, 2.7325, 2.7325, 3.07125, 3.21375, 3.21375, 3.5, 3.69625, 3.69625, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.25, 5.3925, 5.57125, 5.71375), - "maiandra.gd"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875, 4.1425, 4.1425, 4.32125), - "malgun.gothic"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "mangal"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "marlett"= c(1.625, 1.80375, 2.1075, 2.25, 2.42875, 2.7325, 2.875, 3.07125, 3.3575, 3.5, 3.69625, 3.9825, 4.1425, 4.32125, 4.6075, 4.7675, 4.94625, 5.25, 5.3925, 5.57125, 5.875, 6.0175, 6.19625, 6.5, 6.6425, 6.82125, 7.125, 7.2675, 7.46375), - "matura.mt.script.capitals"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.7675), - "meiryo.ui"= c(0.8575, 1, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375), - "meiryo"= c(0.8575, 1, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375), - "microsoft.himalaya"= c(0.3925, 0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25), - "microsoft.jhenghei.ui"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.1425), - "microsoft.jhenghei"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.1425), - "microsoft.new.tai.lue"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "microsoft.phagspa"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "microsoft.sans.serif"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "microsoft.tai.le"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "microsoft.uighur"= c(0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875), - "microsoft.yahei.ui"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 4.1425, 4.1425, 4.32125), - "microsoft.yahei"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 4.1425, 4.1425, 4.32125), - "microsoft.yi.baiti"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625), - "miriam.fixed"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125), - "miriam"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575), - "mistral"= c(0.57125, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375), - "modern.no..20"= c(0.57125, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 2.875, 3.07125, 3.21375, 3.21375), - "modern"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575), - "mongolian.baiti"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "monotype.corsiva"= c(0.6425, 0.785, 0.92875, 0.92875, 0.96375, 1.1075, 1.285, 1.285, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.9825, 2.1425, 2.17875, 2.32125, 2.32125, 2.46375, 2.46375, 2.69625, 2.83875, 2.83875, 2.9825, 3.0175, 3.17875, 3.3575, 3.3575, 3.535), - "moolboran"= c(0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875), - "ms.gothic"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "ms.mincho"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "ms.outlook"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "ms.pgothic"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "ms.pmincho"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "ms.reference.sans.serif"= c(1, 1, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.6075), - "ms.reference.specialty"= c(1.96375, 2.25, 2.58875, 2.7325, 2.875, 3.3575, 3.5, 3.69625, 4.1425, 4.32125, 4.46375, 4.7675, 5.08875, 5.25, 5.57125, 5.71375, 6.0175, 6.3575, 6.5, 6.6425, 7.125, 7.2675, 7.46375, 7.8925, 8.08875, 8.2325, 8.535, 8.8575, 9), - "ms.sans.serif"= c(0.71375, 0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.32125, 1.32125, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 1.96375, 2.58875, 2.58875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.07125, 3.07125, 3.07125, 3.5, 3.5, 3.5, 3.83875, 3.83875), - "ms.serif"= c(0.57125, 0.71375, 0.71375, 1, 1, 1.17875, 1.17875, 1.17875, 1.32125, 1.625, 1.625, 2.1075, 2.1075, 2.1075, 2.25, 2.25, 2.25, 2.25, 2.58875, 2.58875, 2.58875, 3.69625, 3.69625, 3.69625, 2.875, 3.69625, 3.69625, 3.5, 3.5), - "ms.ui.gothic"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "mt.extra"= c(1.625, 1.80375, 2.1075, 2.25, 2.42875, 2.7325, 2.875, 3.07125, 3.3575, 3.5, 3.69625, 4.1425, 4.32125, 4.46375, 4.7675, 4.94625, 5.08875, 5.3925, 5.57125, 5.71375, 6.0175, 6.19625, 6.3575, 6.6425, 6.82125, 6.9825, 7.2675, 7.46375, 7.6075), - "mv.boli"= c(1, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.08875), - "narkisim"= c(0.57125, 0.57125, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 2.875), - "niagara.engraved"= c(0.3925, 0.3925, 0.3925, 0.57125, 0.57125, 0.71375, 0.8575, 0.8575, 1, 1, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.80375, 1.80375, 1.96375, 1.96375), - "niagara.solid"= c(0.3925, 0.3925, 0.57125, 0.57125, 0.57125, 0.71375, 0.8575, 0.8575, 1, 1, 1, 1, 1.17875, 1.17875, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.80375, 1.80375, 1.96375, 1.96375), - "nirmala.ui"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "nsimsun"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "nyala"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "ocr.a.extended"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375), - "old.english.text.mt"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "onyx"= c(0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1, 1, 1, 1.17875, 1.17875, 1.17875, 1.32125, 1.32125, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.80375, 1.80375, 1.80375, 1.96375, 1.96375, 1.96375), - "palace.script.mt"= c(0.42875, 0.42875, 0.6425, 0.6425, 0.6425, 0.785, 0.785, 0.92875, 0.96375, 1.1075, 1.1075, 1.1075, 1.285, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.66, 1.80375, 1.80375, 1.9825, 1.9825, 1.9825, 2.17875, 2.17875, 2.32125, 2.32125, 2.32125), - "palatino.linotype"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "papyrus"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.07125, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 4.1425, 4.1425, 4.32125), - "parchment"= c(0.25, 0.25, 0.25, 0.25, 0.3925, 0.3925, 0.3925, 0.3925, 0.57125, 0.57125, 0.57125, 0.71375, 0.71375, 0.71375, 0.8575, 0.8575, 0.8575, 0.8575, 1, 1, 1, 1, 1.17875, 1.17875, 1.17875, 1.17875, 1.32125, 1.32125, 1.32125), - "perpetua.titling.mt"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625), - "perpetua"= c(0.71375, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.21375), - "plantagenet.cherokee"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625), - "playbill"= c(0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.42875), - "pmingliu-extb"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575), - "pmingliu"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575), - "poor.richard"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "pristina"= c(0.57125, 0.8575, 1, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5), - "raavi"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.7675), - "rage.italic"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625), - "rockwell.condensed"= c(0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875), - "rockwell.extra.bold"= c(1, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.9825, 4.1425, 4.1425, 4.46375, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875), - "rockwell"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825), - "rod"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125), - "roman"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575), - "sakkal.majalla"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875), - "script.mt.bold"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "script"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 1, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875), - "segoe.print"= c(1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.96375, 2.1075, 2.1075, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.3575, 3.3575, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.25, 5.3925), - "segoe.script"= c(1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.96375, 2.1075, 2.1075, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.3575, 3.3575, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.25, 5.3925), - "segoe.ui.light"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625), - "segoe.ui.semibold"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "segoe.ui.semilight"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "segoe.ui.symbol"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "segoe.ui"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "shonar.bangla"= c(0.71375, 0.71375, 0.8575, 0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.42875, 2.7325, 2.7325, 2.7325, 2.875, 2.875, 3.07125), - "showcard.gothic"= c(1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425, 4.32125), - "shruti"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125), - "simhei"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "simplified.arabic.fixed"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125), - "simplified.arabic"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "simsun-extb"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "simsun"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "small.fonts"= c(0.71375, 0.71375, 1, 1.32125, 1.32125, 1.32125, 1.625, 1.625, 1.625, 2.1075, 2.1075, 2.1075, 2.25, 2.25, 2.58875, 2.875, 2.58875, 2.58875, 2.875, 2.875, 2.875, 3.5, 3.5, 3.5, 3.5, 3.69625, 3.69625, 3.69625, 3.69625), - "snap.itc"= c(1.32125, 1.4825, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 5.08875, 5.25, 5.3925, 5.57125, 5.71375, 5.875, 6.19625, 6.3575, 6.3575), - "sylfaen"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "symbol"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "tahoma"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "tempus.sans.itc"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625), - "terminal"= c(1, 1, 1, 1.625, 1.625, 1.32125, 1.32125, 1.32125, 1.32125, 2.25, 2.25, 2.25, 2.25, 2.25, 3.5, 3.5, 3.5, 3.5, 2.875, 2.875, 2.875, 4.46375, 4.46375, 4.46375, 4.46375, 4.46375, 5.3925, 5.3925, 5.3925), - "times.new.roman"= c(0.71375, 0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.96375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "traditional.arabic"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5), - "trebuchet.ms"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "tunga"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "tw.cen.mt.condensed.extra.bold"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5), - "tw.cen.mt.condensed"= c(0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875), - "tw.cen.mt"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "utsaah"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 1, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875), - "vani"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125, 4.46375), - "verdana"= c(1, 1, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.6075), - "vijaya"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 1, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875), - "viner.hand.itc"= c(1, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 4.94625), - "vivaldi"= c(0.6425, 0.785, 0.785, 0.92875, 0.96375, 1.1075, 1.285, 1.285, 1.4825, 1.4825, 1.625, 1.7675, 1.80375, 1.80375, 1.9825, 2.1425, 2.17875, 2.32125, 2.32125, 2.46375, 2.69625, 2.69625, 2.69625, 2.83875, 3.0175, 3.0175, 3.17875, 3.17875, 3.3575), - "vladimir.script"= c(0.71375, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575), - "vrinda"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "webdings"= c(1.625, 1.80375, 2.1075, 2.25, 2.42875, 2.7325, 2.875, 3.07125, 3.3575, 3.5, 3.69625, 3.9825, 4.1425, 4.32125, 4.6075, 4.7675, 4.94625, 5.25, 5.3925, 5.57125, 5.875, 6.0175, 6.19625, 6.5, 6.6425, 6.82125, 7.125, 7.2675, 7.46375), - "wide.latin"= c(2.1075, 2.25, 2.7325, 2.875, 3.07125, 3.5, 3.69625, 3.83875, 4.1425, 4.46375, 4.6075, 4.94625, 5.25, 5.3925, 5.71375, 6.0175, 6.19625, 6.5, 6.82125, 6.9825, 7.2675, 7.46375, 7.75, 8.08875, 8.2325, 8.535, 8.8575, 9, 9.33875)) - - -openxlsxFontSizeLookupTableBold <- - data.frame( "agency.fb"= c(0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.21375, 3.5), - "aharoni"= c(0.57125, 0.57125, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 2.875), - "algerian"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375), - "andalus"= c(1, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "angsana.new"= c(0.3925, 0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25), - "angsanaupc"= c(0.3925, 0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25), - "aparajita"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 1, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875), - "arial"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "arial.black"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625), - "arial.narrow"= c(0.57125, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.07125, 3.21375, 3.21375), - "arial.rounded.mt.bold"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375), - "arial.unicode.ms"= c(1, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "calibri"= c(0.71375, 0.8575, 0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "calibri.light"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "californian.fb"= c(0.8575, 1, 1, 1.17875, 1.17875, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875, 3.21375, 3.21375, 3.5, 3.69625, 3.69625, 3.69625, 3.83875, 4.1425, 4.1425), - "calisto.mt"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "cambria"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425, 4.32125), - "cambria.math"= c(1, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "candara"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "castellar"= c(1.32125, 1.32125, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375, 4.7675, 4.94625, 4.94625, 5.25, 5.3925, 5.3925), - "centaur"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625), - "century"= c(1, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "century.gothic"= c(0.8575, 0.8575, 1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 3.9825), - "century.schoolbook"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "chiller"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5), - "colonna.mt"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "comic.sans.ms"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375), - "consolas"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "constantia"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "cooper.black"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375), - "copperplate.gothic.bold"= c(1.32125, 1.32125, 1.625, 1.625, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.46375, 4.46375, 4.7675, 4.7675, 4.94625, 5.25, 5.25, 5.3925), - "copperplate.gothic.light"= c(1.32125, 1.32125, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 4.94625, 5.25, 5.3925, 5.3925), - "corbel"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "cordia.new"= c(0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875), - "david"= c(0.57125, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375), - "dfkai-sb"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "dilleniaupc"= c(0.3925, 0.3925, 0.57125, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.1075), - "dokchampa"= c(1, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "dotum"= c(0.8575, 0.8575, 1.32125, 1.17875, 1.17875, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375), - "dotumche"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "ebrima"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "edwardian.script.itc"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.3575, 3.5, 3.5), - "elephant"= c(1.32125, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.69625, 3.69625, 3.83875, 4.1425, 4.1425, 4.32125, 4.6075, 4.6075, 4.7675, 5.08875, 5.08875, 5.25, 5.57125, 5.57125, 5.71375), - "engravers.mt"= c(1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625), - "eras.bold.itc"= c(1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375, 4.7675, 4.7675, 4.94625), - "eras.demi.itc"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425, 4.46375, 4.46375, 4.6075), - "eras.light.itc"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 3.9825), - "eras.medium.itc"= c(1, 1, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.1425, 4.32125), - "estrangelo.edessa"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "eucrosiaupc"= c(0.57125, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 2.875, 3.07125, 3.21375, 3.21375), - "euphemia"= c(1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375), - "fangsong"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "felix.titling"= c(1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375), - "fixedsys"= c(1.21375, 1.21375, 1.21375, 1.21375, 1.21375, 1.21375, 1.21375, 1.21375, 2.46375, 2.46375, 2.46375, 2.46375, 2.46375, 2.46375, 2.46375, 2.46375, 3.7325, 3.7325, 3.7325, 3.7325, 3.7325, 3.7325, 3.7325, 3.7325, 3.7325, 4.9825, 4.9825, 4.9825, 4.9825), - "footlight.mt.light"= c(1, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "forte"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "franklin.gothic.book"= c(1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375), - "franklin.gothic.demi"= c(1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375), - "franklin.gothic.demi.cond"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "franklin.gothic.heavy"= c(1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375), - "franklin.gothic.medium"= c(1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375), - "franklin.gothic.medium.cond"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875), - "frankruehl"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.07125), - "freesiaupc"= c(0.71375, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.21375), - "freestyle.script"= c(0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325), - "french.script.mt"= c(0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325), - "gabriola"= c(0.71375, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 2.875, 3.07125), - "gadugi"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "gautami"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "georgia"= c(1.17875, 1.32125, 1.32125, 1.32125, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.08875), - "gigi"= c(1, 1, 1, 1, 1.32125, 1.4825, 1.4825, 1.80375, 1.80375, 1.80375, 1.80375, 2.1075, 2.1075, 2.1075, 2.58875, 2.58875, 2.58875, 2.875, 2.875, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.69625, 3.9825), - "gill.sans.mt"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "gill.sans.mt.condensed"= c(0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325), - "gill.sans.mt.ext.condensed.bold"= c(0.57125, 0.57125, 0.71375, 0.8575, 0.8575, 1, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875), - "gill.sans.ultra.bold"= c(1.4825, 1.625, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 3.07125, 3.21375, 3.21375, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.6075, 4.7675, 4.94625, 5.08875, 5.25, 5.3925, 5.71375, 5.875, 5.875, 6.19625, 6.3575, 6.5), - "gill.sans.ultra.bold.condensed"= c(1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.32125), - "gisha"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "gloucester.mt.extra.condensed"= c(0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.58875, 2.7325, 2.875, 2.875), - "goudy.old.style"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "goudy.stout"= c(1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.42875, 2.42875, 2.58875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.9825, 3.9825, 4.1425, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.25, 5.3925, 5.57125, 5.71375, 6.0175, 6.19625, 6.19625), - "gulim"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.625, 1.96375, 1.96375, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125), - "gulimche"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "gungsuh"= c(0.8575, 0.8575, 1, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375), - "gungsuhche"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "haettenschweiler"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575), - "harlow.solid.italic"= c(0.92875, 0.92875, 1.07125, 1.07125, 1.285, 1.42875, 1.42875, 1.58875, 1.7675, 1.7675, 1.94625, 2.1075, 2.1075, 2.285, 2.285, 2.42875, 2.42875, 2.66, 2.80375, 2.80375, 2.94625, 3.125, 3.125, 3.32125, 3.46375, 3.46375, 3.6425, 3.6425, 3.80375), - "harrington"= c(1, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "high.tower.text"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "impact"= c(1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425), - "imprint.mt.shadow"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "informal.roman"= c(1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.83875, 3.9825), - "irisupc"= c(0.71375, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575), - "iskoola.pota"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.69625, 3.69625, 3.83875), - "jasmineupc"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5), - "jokerman"= c(1.32125, 1.32125, 1.625, 1.625, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.46375, 4.46375, 4.7675, 4.7675, 4.94625, 5.25, 5.25, 5.3925), - "juice.itc"= c(0.57125, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1, 1.17875, 1.32125, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.7325), - "kaiti"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "kalinga"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125), - "kartika"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "khmer.ui"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "kodchiangupc"= c(0.3925, 0.3925, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.25, 2.42875), - "kristen.itc"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375), - "kunstler.script"= c(0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.58875), - "lao.ui"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "latha"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "leelawadee"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "levenim.mt"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425, 4.32125), - "lilyupc"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5), - "lucida.bright"= c(0.8575, 1, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075), - "lucida.calligraphy"= c(1.25, 1.3925, 1.58875, 1.7325, 1.7325, 2.07125, 2.1075, 2.25, 2.3925, 2.58875, 2.7325, 2.91, 3.05375, 3.05375, 3.42875, 3.42875, 3.57125, 3.7325, 3.94625, 4.08875, 4.2325, 4.3925, 4.42875, 4.75, 4.75, 4.91, 5.08875, 5.2675, 5.42875), - "lucida.console"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425, 4.32125, 4.46375, 4.6075), - "lucida.fax"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.7675), - "lucida.handwriting"= c(1.25, 1.3925, 1.58875, 1.7325, 1.7325, 2.07125, 2.25, 2.25, 2.58875, 2.58875, 2.7675, 2.91, 3.05375, 3.25, 3.42875, 3.57125, 3.57125, 3.91, 3.94625, 4.08875, 4.2325, 4.3925, 4.6075, 4.75, 4.91, 4.91, 5.2675, 5.2675, 5.42875), - "lucida.sans"= c(1, 1, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.6075), - "lucida.sans.typewriter"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375), - "lucida.sans.unicode"= c(1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125, 4.6075, 4.6075, 4.7675), - "magneto"= c(1.17875, 1.32125, 1.625, 1.625, 1.80375, 2.1075, 2.1075, 2.25, 2.58875, 2.7325, 2.7325, 3.07125, 3.21375, 3.21375, 3.5, 3.69625, 3.69625, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.25, 5.3925, 5.57125, 5.71375), - "maiandra.gd"= c(1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375), - "malgun.gothic"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.1425), - "mangal"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "marlett"= c(1.80375, 1.96375, 2.25, 2.42875, 2.58875, 2.875, 3.07125, 3.21375, 3.5, 3.69625, 3.83875, 4.1425, 4.32125, 4.46375, 4.7675, 4.94625, 5.08875, 5.3925, 5.57125, 5.71375, 6.0175, 6.19625, 6.3575, 6.6425, 6.82125, 6.9825, 7.2675, 7.46375, 7.6075), - "matura.mt.script.capitals"= c(1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 4.94625), - "meiryo"= c(1, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375, 4.7675, 4.7675, 4.94625), - "meiryo.ui"= c(1, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375, 4.7675, 4.7675, 4.94625), - "microsoft.himalaya"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.42875), - "microsoft.jhenghei"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125), - "microsoft.jhenghei.ui"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125), - "microsoft.new.tai.lue"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "microsoft.phagspa"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "microsoft.sans.serif"= c(1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "microsoft.tai.le"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "microsoft.uighur"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.58875), - "microsoft.yahei"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375), - "microsoft.yahei.ui"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375), - "microsoft.yi.baiti"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "miriam"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5), - "miriam.fixed"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375), - "mistral"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575), - "modern"= c(0.75, 0.75, 0.8925, 1.035, 1.035, 1.21375, 1.3575, 1.3575, 1.5175, 1.5175, 1.66, 1.83875, 1.83875, 2, 2.1425, 2.1425, 2.285, 2.46375, 2.46375, 2.625, 2.7675, 2.7675, 2.91, 2.91, 3.1075, 3.1075, 3.25, 3.3925, 3.3925), - "modern.no..20"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575), - "mongolian.baiti"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "monotype.corsiva"= c(0.785, 0.92875, 1.07125, 1.07125, 1.1075, 1.285, 1.42875, 1.42875, 1.625, 1.7675, 1.7675, 1.9825, 1.9825, 2.1425, 2.285, 2.32125, 2.46375, 2.46375, 2.66, 2.66, 2.83875, 2.9825, 2.9825, 3.125, 3.17875, 3.3575, 3.5, 3.5, 3.67875), - "moolboran"= c(0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875), - "ms.gothic"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "ms.mincho"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "ms.outlook"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "ms.pgothic"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "ms.pmincho"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "ms.reference.sans.serif"= c(1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.7675), - "ms.reference.specialty"= c(2.1075, 2.42875, 2.7325, 2.875, 3.07125, 3.5, 3.69625, 3.83875, 4.32125, 4.46375, 4.6075, 4.94625, 5.25, 5.3925, 5.71375, 5.875, 6.19625, 6.5, 6.6425, 6.82125, 7.2675, 7.46375, 7.6075, 8.08875, 8.2325, 8.375, 8.71375, 9, 9.16), - "ms.sans.serif"= c(0.8925, 1.035, 1.035, 1.3575, 1.3575, 1.5175, 1.5175, 1.5175, 1.83875, 2, 2, 2.1425, 2.1425, 2.1425, 2.7675, 2.7675, 2.7675, 2.7675, 3.1075, 3.1075, 3.25, 3.25, 3.25, 3.25, 3.7325, 3.7325, 3.7325, 4.0175, 4.0175), - "ms.serif"= c(0.75, 0.8925, 0.8925, 1.21375, 1.21375, 1.3575, 1.3575, 1.3575, 1.5175, 1.83875, 1.83875, 2.285, 2.285, 2.285, 2.46375, 2.46375, 2.46375, 2.46375, 2.7675, 2.7675, 2.7675, 3.875, 3.875, 3.875, 3.1075, 3.875, 3.875, 3.7325, 3.7325), - "ms.ui.gothic"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "mt.extra"= c(1.80375, 1.96375, 2.25, 2.42875, 2.58875, 2.875, 3.07125, 3.21375, 3.5, 3.69625, 3.83875, 4.32125, 4.46375, 4.6075, 4.94625, 5.08875, 5.25, 5.57125, 5.71375, 5.875, 6.19625, 6.3575, 6.5, 6.82125, 6.9825, 7.125, 7.46375, 7.6075, 7.75), - "mv.boli"= c(1.17875, 1.32125, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.3575, 3.3575, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.25, 5.25), - "narkisim"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.07125), - "niagara.engraved"= c(0.57125, 0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.80375, 1.80375, 1.96375, 1.96375, 1.96375, 2.1075, 2.1075), - "niagara.solid"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.17875, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.80375, 1.80375, 1.96375, 1.96375, 1.96375, 2.1075, 2.1075), - "nirmala.ui"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "nsimsun"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "nyala"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "ocr.a.extended"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425, 4.32125, 4.46375, 4.6075), - "old.english.text.mt"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "onyx"= c(0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1, 1.17875, 1.17875, 1.17875, 1.17875, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.4825, 1.625, 1.625, 1.625, 1.96375, 1.96375, 1.96375, 2.1075, 2.1075, 2.1075), - "palace.script.mt"= c(0.6075, 0.6075, 0.785, 0.785, 0.785, 0.92875, 0.92875, 1.07125, 1.1075, 1.285, 1.285, 1.285, 1.42875, 1.4825, 1.625, 1.625, 1.625, 1.7675, 1.80375, 1.9825, 1.9825, 2.1425, 2.1425, 2.1425, 2.32125, 2.32125, 2.46375, 2.46375, 2.46375), - "palatino.linotype"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "papyrus"= c(1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.21375, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.32125, 4.32125, 4.46375), - "parchment"= c(0.3925, 0.3925, 0.3925, 0.3925, 0.57125, 0.57125, 0.57125, 0.57125, 0.71375, 0.71375, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1, 1, 1, 1.17875, 1.17875, 1.17875, 1.17875, 1.32125, 1.32125, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825), - "perpetua"= c(0.71375, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.21375), - "perpetua.titling.mt"= c(1, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 4.94625), - "plantagenet.cherokee"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "playbill"= c(0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.58875), - "pmingliu"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5), - "pmingliu-extb"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5), - "poor.richard"= c(1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425), - "pristina"= c(0.71375, 1, 1.17875, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "raavi"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "rage.italic"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "rockwell"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875, 3.9825), - "rockwell.condensed"= c(0.57125, 0.71375, 0.71375, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 2.875, 3.07125), - "rockwell.extra.bold"= c(1, 1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.42875, 2.42875, 2.7325, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.9825, 4.1425, 4.1425, 4.46375, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875), - "rod"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375), - "roman"= c(0.75, 0.75, 0.8925, 1.035, 1.035, 1.21375, 1.3575, 1.3575, 1.5175, 1.5175, 1.66, 1.83875, 1.83875, 2, 2.1425, 2.1425, 2.285, 2.46375, 2.46375, 2.625, 2.7675, 2.7675, 2.91, 2.91, 3.1075, 3.1075, 3.25, 3.3925, 3.3925), - "sakkal.majalla"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875), - "script"= c(0.6075, 0.6075, 0.75, 0.75, 0.8925, 1.035, 1.035, 1.035, 1.21375, 1.3575, 1.3575, 1.5175, 1.5175, 1.66, 1.83875, 1.83875, 1.83875, 2, 2.1425, 2.1425, 2.285, 2.285, 2.46375, 2.46375, 2.625, 2.625, 2.7675, 2.7675, 2.91), - "script.mt.bold"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "segoe.print"= c(1.17875, 1.17875, 1.4825, 1.625, 1.625, 1.96375, 2.1075, 2.1075, 2.42875, 2.42875, 2.58875, 2.875, 2.875, 3.07125, 3.3575, 3.3575, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.25, 5.3925), - "segoe.script"= c(1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.96375, 2.1075, 2.1075, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.3575, 3.3575, 3.5, 3.83875, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.25, 5.3925), - "segoe.ui"= c(0.8575, 0.8575, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425), - "segoe.ui.light"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.83875), - "segoe.ui.semibold"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625, 3.83875, 3.9825, 3.9825), - "segoe.ui.semilight"= c(1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425), - "segoe.ui.symbol"= c(0.8575, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 3.9825), - "shonar.bangla"= c(0.71375, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875, 2.875), - "showcard.gothic"= c(1.17875, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.32125, 4.46375), - "shruti"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875), - "simhei"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "simplified.arabic"= c(0.8575, 0.8575, 1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425), - "simplified.arabic.fixed"= c(1, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 3.9825, 4.1425, 4.32125, 4.46375, 4.46375), - "simsun"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "simsun-extb"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "small.fonts"= c(0.8925, 0.8925, 1.21375, 1.5175, 1.5175, 1.5175, 1.83875, 1.83875, 1.83875, 2.285, 2.285, 2.285, 2.46375, 2.46375, 2.7675, 3.1075, 2.7675, 2.7675, 3.1075, 3.1075, 3.1075, 3.7325, 3.7325, 3.7325, 3.7325, 3.875, 3.875, 3.875, 3.875), - "snap.itc"= c(1.4825, 1.625, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 5.25, 5.3925, 5.57125, 5.71375, 5.875, 6.0175, 6.3575, 6.5, 6.5), - "sylfaen"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "symbol"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "tahoma"= c(1, 1, 1.32125, 1.32125, 1.4825, 1.625, 1.80375, 1.80375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.58875, 2.875, 2.875, 3.07125, 3.21375, 3.3575, 3.5, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.6075), - "tempus.sans.itc"= c(1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.5, 3.69625, 3.83875, 3.9825, 4.1425, 4.1425, 4.46375, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875), - "terminal"= c(1.21375, 1.21375, 1.21375, 1.83875, 1.83875, 1.5175, 1.5175, 1.5175, 1.5175, 2.58875, 2.58875, 2.58875, 2.58875, 2.58875, 3.7325, 3.7325, 3.7325, 3.7325, 3.1075, 3.1075, 3.1075, 4.46375, 4.46375, 4.46375, 4.46375, 4.46375, 5.6075, 5.6075, 5.6075), - "times.new.roman"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "traditional.arabic"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "trebuchet.ms"= c(0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.83875, 3.83875, 4.1425, 4.1425, 4.32125), - "tunga"= c(0.71375, 0.71375, 0.8575, 1, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575), - "tw.cen.mt"= c(0.71375, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625, 3.83875), - "tw.cen.mt.condensed"= c(0.57125, 0.71375, 0.8575, 0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.07125), - "tw.cen.mt.condensed.extra.bold"= c(0.8575, 0.8575, 1, 1.17875, 1.17875, 1.32125, 1.4825, 1.4825, 1.625, 1.80375, 1.80375, 1.96375, 2.1075, 2.1075, 2.25, 2.42875, 2.42875, 2.58875, 2.7325, 2.7325, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5, 3.69625, 3.69625), - "utsaah"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 1, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875), - "vani"= c(1, 1.17875, 1.4825, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 2.875, 3.21375, 3.21375, 3.3575, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.08875), - "verdana"= c(1.17875, 1.17875, 1.4825, 1.4825, 1.625, 1.96375, 1.96375, 2.1075, 2.25, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.69625, 3.83875, 3.83875, 4.1425, 4.1425, 4.32125, 4.6075, 4.6075, 4.7675, 4.94625, 5.08875, 5.25), - "vijaya"= c(0.57125, 0.57125, 0.71375, 0.71375, 0.8575, 1, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.4825, 1.625, 1.625, 1.80375, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.42875, 2.58875, 2.58875, 2.7325, 2.7325, 2.875), - "viner.hand.itc"= c(1.17875, 1.32125, 1.4825, 1.625, 1.80375, 1.96375, 2.1075, 2.1075, 2.42875, 2.42875, 2.58875, 2.7325, 2.875, 3.07125, 3.21375, 3.3575, 3.3575, 3.69625, 3.69625, 3.83875, 3.9825, 4.1425, 4.32125, 4.46375, 4.6075, 4.7675, 4.94625, 5.08875, 5.08875), - "vivaldi"= c(0.785, 0.92875, 0.92875, 1.07125, 1.1075, 1.285, 1.42875, 1.42875, 1.625, 1.625, 1.7675, 1.94625, 1.9825, 1.9825, 2.1425, 2.285, 2.32125, 2.46375, 2.46375, 2.66, 2.83875, 2.83875, 2.83875, 2.9825, 3.17875, 3.17875, 3.3575, 3.3575, 3.5), - "vladimir.script"= c(0.8575, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.07125, 3.21375, 3.3575, 3.3575, 3.5), - "vrinda"= c(0.71375, 0.8575, 1, 1, 1.17875, 1.32125, 1.32125, 1.4825, 1.625, 1.625, 1.80375, 1.96375, 1.96375, 2.1075, 2.25, 2.25, 2.42875, 2.58875, 2.58875, 2.7325, 2.875, 2.875, 3.07125, 3.21375, 3.21375, 3.3575, 3.5, 3.5, 3.69625), - "webdings"= c(1.80375, 1.96375, 2.25, 2.42875, 2.58875, 2.875, 3.07125, 3.21375, 3.5, 3.69625, 3.83875, 4.1425, 4.32125, 4.46375, 4.7675, 4.94625, 5.08875, 5.3925, 5.57125, 5.71375, 6.0175, 6.19625, 6.3575, 6.6425, 6.82125, 6.9825, 7.2675, 7.46375, 7.6075), - "wide.latin"= c(2.25, 2.42875, 2.875, 3.07125, 3.21375, 3.69625, 3.83875, 3.9825, 4.32125, 4.6075, 4.7675, 5.08875, 5.3925, 5.57125, 5.875, 6.19625, 6.3575, 6.6425, 6.9825, 7.125, 7.46375, 7.6075, 7.8925, 8.2325, 8.375, 8.71375, 9, 9.16, 9.4825)) +openxlsxFontSizeLookupTable <- + data.frame( + "agency.fb" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.25, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.07125 + ), + "aharoni" = c( + 0.57125, + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 2.875 + ), + "algerian" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125 + ), + "andalus" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "angsana.new" = c( + 0.3925, + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25 + ), + "angsanaupc" = c( + 0.3925, + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25 + ), + "aparajita" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875 + ), + "arial.black" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625 + ), + "arial.narrow" = c( + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.21375 + ), + "arial.rounded.mt.bold" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125 + ), + "arial.unicode.ms" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "arial" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "calibri.light" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "calibri" = c( + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "californian.fb" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 2.875, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "calisto.mt" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "cambria.math" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "cambria" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "candara" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "castellar" = c( + 1.17875, + 1.17875, + 1.4825, + 1.625, + 1.625, + 1.96375, + 1.96375, + 2.1075, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125, + 4.6075, + 4.7675, + 4.7675, + 5.08875, + 5.25, + 5.25 + ), + "centaur" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5 + ), + "century.gothic" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "century.schoolbook" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "century" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "chiller" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575 + ), + "colonna.mt" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "comic.sans.ms" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375 + ), + "consolas" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "constantia" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "cooper.black" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125 + ), + "copperplate.gothic.bold" = c( + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 4.1425, + 4.32125, + 4.32125, + 4.6075, + 4.6075, + 4.7675, + 5.08875, + 5.08875, + 5.25 + ), + "copperplate.gothic.light" = c( + 1.17875, + 1.17875, + 1.4825, + 1.625, + 1.625, + 1.96375, + 1.96375, + 2.1075, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.7675, + 5.08875, + 5.25, + 5.25 + ), + "corbel" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "cordia.new" = c( + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875 + ), + "david" = c( + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375 + ), + "dfkai-sb" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "dilleniaupc" = c( + 0.3925, + 0.3925, + 0.57125, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.1075 + ), + "dokchampa" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "dotum" = c( + 0.71375, + 0.71375, + 1.17875, + 1, + 1, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125 + ), + "dotumche" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "ebrima" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "edwardian.script.itc" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.3575 + ), + "elephant" = c( + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.5, + 3.5, + 3.69625, + 3.9825, + 3.9825, + 4.1425, + 4.46375, + 4.46375, + 4.6075, + 4.94625, + 4.94625, + 5.08875, + 5.3925, + 5.3925, + 5.57125 + ), + "engravers.mt" = c( + 1, + 1, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 4.1425, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675 + ), + "eras.bold.itc" = c( + 1, + 1, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125, + 4.6075, + 4.6075, + 4.7675 + ), + "eras.demi.itc" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375 + ), + "eras.light.itc" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "eras.medium.itc" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425 + ), + "estrangelo.edessa" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "eucrosiaupc" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875 + ), + "euphemia" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125 + ), + "fangsong" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "felix.titling" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125 + ), + "fixedsys" = c( + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2.25, + 2.25, + 2.25, + 2.25, + 2.25, + 2.25, + 2.25, + 2.25, + 3.5, + 3.5, + 3.5, + 3.5, + 3.5, + 3.5, + 3.5, + 3.5, + 3.5, + 4.7675, + 4.7675, + 4.7675, + 4.7675 + ), + "footlight.mt.light" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "forte" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "franklin.gothic.book" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 4.1425, + 4.1425, + 4.32125 + ), + "franklin.gothic.demi.cond" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625 + ), + "franklin.gothic.demi" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 4.1425, + 4.1425, + 4.32125 + ), + "franklin.gothic.heavy" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 4.1425, + 4.1425, + 4.32125 + ), + "franklin.gothic.medium.cond" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625 + ), + "franklin.gothic.medium" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 4.1425, + 4.1425, + 4.32125 + ), + "frankruehl" = c( + 0.57125, + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 2.875 + ), + "freesiaupc" = c( + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375 + ), + "freestyle.script" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875 + ), + "french.script.mt" = c( + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875 + ), + "gabriola" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875 + ), + "gadugi" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "gautami" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125 + ), + "georgia" = c( + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125, + 4.46375 + ), + "gigi" = c( + 0.8575, + 0.8575, + 0.8575, + 0.8575, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.625, + 1.625, + 1.96375, + 1.96375, + 1.96375, + 2.42875, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.5, + 3.83875 + ), + "gill.sans.mt.condensed" = c( + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875 + ), + "gill.sans.mt.ext.condensed.bold" = c( + 0.3925, + 0.3925, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875 + ), + "gill.sans.mt" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "gill.sans.ultra.bold.condensed" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "gill.sans.ultra.bold" = c( + 1.32125, + 1.4825, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.875, + 3.07125, + 3.07125, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.25, + 5.57125, + 5.71375, + 5.71375, + 6.0175, + 6.19625, + 6.3575 + ), + "gisha" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "gloucester.mt.extra.condensed" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325 + ), + "goudy.old.style" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "goudy.stout" = c( + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.25, + 5.3925, + 5.57125, + 5.875, + 6.0175, + 6.0175 + ), + "gulim" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.80375, + 1.80375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "gulimche" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "gungsuh" = c( + 0.71375, + 0.71375, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125 + ), + "gungsuhche" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "haettenschweiler" = c( + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375 + ), + "harlow.solid.italic" = c( + 0.785, + 0.785, + 0.92875, + 0.92875, + 1.1075, + 1.285, + 1.285, + 1.42875, + 1.625, + 1.625, + 1.7675, + 1.94625, + 1.94625, + 2.1425, + 2.1425, + 2.285, + 2.285, + 2.46375, + 2.66, + 2.66, + 2.80375, + 2.9825, + 2.9825, + 3.125, + 3.32125, + 3.32125, + 3.5, + 3.5, + 3.6425 + ), + "harrington" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "high.tower.text" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5 + ), + "impact" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825 + ), + "imprint.mt.shadow" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "informal.roman" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "irisupc" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325 + ), + "iskoola.pota" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.96375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "jasmineupc" = c( + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.21375 + ), + "jokerman" = c( + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 4.1425, + 4.32125, + 4.32125, + 4.6075, + 4.6075, + 4.7675, + 5.08875, + 5.08875, + 5.25 + ), + "juice.itc" = c( + 0.3925, + 0.57125, + 0.71375, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.58875 + ), + "kaiti" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "kalinga" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "kartika" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "khmer.ui" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "kodchiangupc" = c( + 0.3925, + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875 + ), + "kristen.itc" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125 + ), + "kunstler.script" = c( + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.42875 + ), + "lao.ui" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "latha" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "leelawadee" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "levenim.mt" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "lilyupc" = c( + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.07125, + 3.21375 + ), + "lucida.bright" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375 + ), + "lucida.calligraphy" = c( + 1.07125, + 1.25, + 1.42875, + 1.58875, + 1.58875, + 1.91, + 1.94625, + 2.1075, + 2.25, + 2.3925, + 2.58875, + 2.7675, + 2.91, + 2.91, + 3.285, + 3.285, + 3.42875, + 3.57125, + 3.7675, + 3.94625, + 4.08875, + 4.2325, + 4.285, + 4.6075, + 4.6075, + 4.75, + 4.94625, + 5.08875, + 5.2675 + ), + "lucida.console" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375 + ), + "lucida.fax" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425, + 4.46375, + 4.46375, + 4.6075 + ), + "lucida.handwriting" = c( + 1.07125, + 1.25, + 1.42875, + 1.58875, + 1.58875, + 1.91, + 2.1075, + 2.1075, + 2.3925, + 2.3925, + 2.625, + 2.7675, + 2.91, + 3.05375, + 3.285, + 3.42875, + 3.42875, + 3.7325, + 3.7675, + 3.94625, + 4.08875, + 4.2325, + 4.42875, + 4.6075, + 4.75, + 4.75, + 5.08875, + 5.08875, + 5.2675 + ), + "lucida.sans.typewriter" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375 + ), + "lucida.sans.unicode" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425, + 4.46375, + 4.46375, + 4.6075 + ), + "lucida.sans" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425, + 4.46375, + 4.46375, + 4.6075 + ), + "magneto" = c( + 1.17875, + 1.32125, + 1.625, + 1.625, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.21375, + 3.21375, + 3.5, + 3.69625, + 3.69625, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.25, + 5.3925, + 5.57125, + 5.71375 + ), + "maiandra.gd" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 4.1425, + 4.1425, + 4.32125 + ), + "malgun.gothic" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "mangal" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "marlett" = c( + 1.625, + 1.80375, + 2.1075, + 2.25, + 2.42875, + 2.7325, + 2.875, + 3.07125, + 3.3575, + 3.5, + 3.69625, + 3.9825, + 4.1425, + 4.32125, + 4.6075, + 4.7675, + 4.94625, + 5.25, + 5.3925, + 5.57125, + 5.875, + 6.0175, + 6.19625, + 6.5, + 6.6425, + 6.82125, + 7.125, + 7.2675, + 7.46375 + ), + "matura.mt.script.capitals" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.7675 + ), + "meiryo.ui" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375 + ), + "meiryo" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375 + ), + "microsoft.himalaya" = c( + 0.3925, + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25 + ), + "microsoft.jhenghei.ui" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "microsoft.jhenghei" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "microsoft.new.tai.lue" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "microsoft.phagspa" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "microsoft.sans.serif" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "microsoft.tai.le" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "microsoft.uighur" = c( + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875 + ), + "microsoft.yahei.ui" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 4.1425, + 4.1425, + 4.32125 + ), + "microsoft.yahei" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 4.1425, + 4.1425, + 4.32125 + ), + "microsoft.yi.baiti" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625 + ), + "miriam.fixed" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125 + ), + "miriam" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575 + ), + "mistral" = c( + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375 + ), + "modern.no..20" = c( + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375 + ), + "modern" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575 + ), + "mongolian.baiti" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "monotype.corsiva" = c( + 0.6425, + 0.785, + 0.92875, + 0.92875, + 0.96375, + 1.1075, + 1.285, + 1.285, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.9825, + 2.1425, + 2.17875, + 2.32125, + 2.32125, + 2.46375, + 2.46375, + 2.69625, + 2.83875, + 2.83875, + 2.9825, + 3.0175, + 3.17875, + 3.3575, + 3.3575, + 3.535 + ), + "moolboran" = c( + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875 + ), + "ms.gothic" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "ms.mincho" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "ms.outlook" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "ms.pgothic" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "ms.pmincho" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "ms.reference.sans.serif" = c( + 1, + 1, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.6075 + ), + "ms.reference.specialty" = c( + 1.96375, + 2.25, + 2.58875, + 2.7325, + 2.875, + 3.3575, + 3.5, + 3.69625, + 4.1425, + 4.32125, + 4.46375, + 4.7675, + 5.08875, + 5.25, + 5.57125, + 5.71375, + 6.0175, + 6.3575, + 6.5, + 6.6425, + 7.125, + 7.2675, + 7.46375, + 7.8925, + 8.08875, + 8.2325, + 8.535, + 8.8575, + 9 + ), + "ms.sans.serif" = c( + 0.71375, + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 1.96375, + 2.58875, + 2.58875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.07125, + 3.07125, + 3.07125, + 3.5, + 3.5, + 3.5, + 3.83875, + 3.83875 + ), + "ms.serif" = c( + 0.57125, + 0.71375, + 0.71375, + 1, + 1, + 1.17875, + 1.17875, + 1.17875, + 1.32125, + 1.625, + 1.625, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.25, + 2.58875, + 2.58875, + 2.58875, + 3.69625, + 3.69625, + 3.69625, + 2.875, + 3.69625, + 3.69625, + 3.5, + 3.5 + ), + "ms.ui.gothic" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "mt.extra" = c( + 1.625, + 1.80375, + 2.1075, + 2.25, + 2.42875, + 2.7325, + 2.875, + 3.07125, + 3.3575, + 3.5, + 3.69625, + 4.1425, + 4.32125, + 4.46375, + 4.7675, + 4.94625, + 5.08875, + 5.3925, + 5.57125, + 5.71375, + 6.0175, + 6.19625, + 6.3575, + 6.6425, + 6.82125, + 6.9825, + 7.2675, + 7.46375, + 7.6075 + ), + "mv.boli" = c( + 1, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.08875 + ), + "narkisim" = c( + 0.57125, + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 2.875 + ), + "niagara.engraved" = c( + 0.3925, + 0.3925, + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 1.96375 + ), + "niagara.solid" = c( + 0.3925, + 0.3925, + 0.57125, + 0.57125, + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 1.96375 + ), + "nirmala.ui" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "nsimsun" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "nyala" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "ocr.a.extended" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375 + ), + "old.english.text.mt" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "onyx" = c( + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 1.96375 + ), + "palace.script.mt" = c( + 0.42875, + 0.42875, + 0.6425, + 0.6425, + 0.6425, + 0.785, + 0.785, + 0.92875, + 0.96375, + 1.1075, + 1.1075, + 1.1075, + 1.285, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.66, + 1.80375, + 1.80375, + 1.9825, + 1.9825, + 1.9825, + 2.17875, + 2.17875, + 2.32125, + 2.32125, + 2.32125 + ), + "palatino.linotype" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "papyrus" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 4.1425, + 4.1425, + 4.32125 + ), + "parchment" = c( + 0.25, + 0.25, + 0.25, + 0.25, + 0.3925, + 0.3925, + 0.3925, + 0.3925, + 0.57125, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.32125 + ), + "perpetua.titling.mt" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625 + ), + "perpetua" = c( + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.21375 + ), + "plantagenet.cherokee" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625 + ), + "playbill" = c( + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.42875 + ), + "pmingliu-extb" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575 + ), + "pmingliu" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575 + ), + "poor.richard" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "pristina" = c( + 0.57125, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5 + ), + "raavi" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.7675 + ), + "rage.italic" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625 + ), + "rockwell.condensed" = c( + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875 + ), + "rockwell.extra.bold" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.9825, + 4.1425, + 4.1425, + 4.46375, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875 + ), + "rockwell" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825 + ), + "rod" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125 + ), + "roman" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575 + ), + "sakkal.majalla" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875 + ), + "script.mt.bold" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "script" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875 + ), + "segoe.print" = c( + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.96375, + 2.1075, + 2.1075, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.25, + 5.3925 + ), + "segoe.script" = c( + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.96375, + 2.1075, + 2.1075, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.25, + 5.3925 + ), + "segoe.ui.light" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625 + ), + "segoe.ui.semibold" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "segoe.ui.semilight" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "segoe.ui.symbol" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "segoe.ui" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "shonar.bangla" = c( + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.7325, + 2.875, + 2.875, + 3.07125 + ), + "showcard.gothic" = c( + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425, + 4.32125 + ), + "shruti" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125 + ), + "simhei" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "simplified.arabic.fixed" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125 + ), + "simplified.arabic" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "simsun-extb" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "simsun" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "small.fonts" = c( + 0.71375, + 0.71375, + 1, + 1.32125, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.625, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.58875, + 2.875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 2.875, + 3.5, + 3.5, + 3.5, + 3.5, + 3.69625, + 3.69625, + 3.69625, + 3.69625 + ), + "snap.itc" = c( + 1.32125, + 1.4825, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 5.08875, + 5.25, + 5.3925, + 5.57125, + 5.71375, + 5.875, + 6.19625, + 6.3575, + 6.3575 + ), + "sylfaen" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "symbol" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "tahoma" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "tempus.sans.itc" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625 + ), + "terminal" = c( + 1, + 1, + 1, + 1.625, + 1.625, + 1.32125, + 1.32125, + 1.32125, + 1.32125, + 2.25, + 2.25, + 2.25, + 2.25, + 2.25, + 3.5, + 3.5, + 3.5, + 3.5, + 2.875, + 2.875, + 2.875, + 4.46375, + 4.46375, + 4.46375, + 4.46375, + 4.46375, + 5.3925, + 5.3925, + 5.3925 + ), + "times.new.roman" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.96375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "traditional.arabic" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5 + ), + "trebuchet.ms" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "tunga" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "tw.cen.mt.condensed.extra.bold" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5 + ), + "tw.cen.mt.condensed" = c( + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875 + ), + "tw.cen.mt" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "utsaah" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875 + ), + "vani" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125, + 4.46375 + ), + "verdana" = c( + 1, + 1, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.6075 + ), + "vijaya" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875 + ), + "viner.hand.itc" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 4.94625 + ), + "vivaldi" = c( + 0.6425, + 0.785, + 0.785, + 0.92875, + 0.96375, + 1.1075, + 1.285, + 1.285, + 1.4825, + 1.4825, + 1.625, + 1.7675, + 1.80375, + 1.80375, + 1.9825, + 2.1425, + 2.17875, + 2.32125, + 2.32125, + 2.46375, + 2.69625, + 2.69625, + 2.69625, + 2.83875, + 3.0175, + 3.0175, + 3.17875, + 3.17875, + 3.3575 + ), + "vladimir.script" = c( + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575 + ), + "vrinda" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "webdings" = c( + 1.625, + 1.80375, + 2.1075, + 2.25, + 2.42875, + 2.7325, + 2.875, + 3.07125, + 3.3575, + 3.5, + 3.69625, + 3.9825, + 4.1425, + 4.32125, + 4.6075, + 4.7675, + 4.94625, + 5.25, + 5.3925, + 5.57125, + 5.875, + 6.0175, + 6.19625, + 6.5, + 6.6425, + 6.82125, + 7.125, + 7.2675, + 7.46375 + ), + "wide.latin" = c( + 2.1075, + 2.25, + 2.7325, + 2.875, + 3.07125, + 3.5, + 3.69625, + 3.83875, + 4.1425, + 4.46375, + 4.6075, + 4.94625, + 5.25, + 5.3925, + 5.71375, + 6.0175, + 6.19625, + 6.5, + 6.82125, + 6.9825, + 7.2675, + 7.46375, + 7.75, + 8.08875, + 8.2325, + 8.535, + 8.8575, + 9, + 9.33875 + ) + ) + + +openxlsxFontSizeLookupTableBold <- + data.frame( + "agency.fb" = c( + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.21375, + 3.5 + ), + "aharoni" = c( + 0.57125, + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 2.875 + ), + "algerian" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375 + ), + "andalus" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "angsana.new" = c( + 0.3925, + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25 + ), + "angsanaupc" = c( + 0.3925, + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25 + ), + "aparajita" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875 + ), + "arial" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "arial.black" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625 + ), + "arial.narrow" = c( + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.21375 + ), + "arial.rounded.mt.bold" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375 + ), + "arial.unicode.ms" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "calibri" = c( + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "calibri.light" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "californian.fb" = c( + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.21375, + 3.21375, + 3.5, + 3.69625, + 3.69625, + 3.69625, + 3.83875, + 4.1425, + 4.1425 + ), + "calisto.mt" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "cambria" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425, + 4.32125 + ), + "cambria.math" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "candara" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "castellar" = c( + 1.32125, + 1.32125, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375, + 4.7675, + 4.94625, + 4.94625, + 5.25, + 5.3925, + 5.3925 + ), + "centaur" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625 + ), + "century" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "century.gothic" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "century.schoolbook" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "chiller" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5 + ), + "colonna.mt" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "comic.sans.ms" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375 + ), + "consolas" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "constantia" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "cooper.black" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375 + ), + "copperplate.gothic.bold" = c( + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.46375, + 4.46375, + 4.7675, + 4.7675, + 4.94625, + 5.25, + 5.25, + 5.3925 + ), + "copperplate.gothic.light" = c( + 1.32125, + 1.32125, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 4.94625, + 5.25, + 5.3925, + 5.3925 + ), + "corbel" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "cordia.new" = c( + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875 + ), + "david" = c( + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375 + ), + "dfkai-sb" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "dilleniaupc" = c( + 0.3925, + 0.3925, + 0.57125, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.1075 + ), + "dokchampa" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "dotum" = c( + 0.8575, + 0.8575, + 1.32125, + 1.17875, + 1.17875, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375 + ), + "dotumche" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "ebrima" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "edwardian.script.itc" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.5 + ), + "elephant" = c( + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.69625, + 3.69625, + 3.83875, + 4.1425, + 4.1425, + 4.32125, + 4.6075, + 4.6075, + 4.7675, + 5.08875, + 5.08875, + 5.25, + 5.57125, + 5.57125, + 5.71375 + ), + "engravers.mt" = c( + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625 + ), + "eras.bold.itc" = c( + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375, + 4.7675, + 4.7675, + 4.94625 + ), + "eras.demi.itc" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425, + 4.46375, + 4.46375, + 4.6075 + ), + "eras.light.itc" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "eras.medium.itc" = c( + 1, + 1, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.1425, + 4.32125 + ), + "estrangelo.edessa" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "eucrosiaupc" = c( + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375 + ), + "euphemia" = c( + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375 + ), + "fangsong" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "felix.titling" = c( + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375 + ), + "fixedsys" = c( + 1.21375, + 1.21375, + 1.21375, + 1.21375, + 1.21375, + 1.21375, + 1.21375, + 1.21375, + 2.46375, + 2.46375, + 2.46375, + 2.46375, + 2.46375, + 2.46375, + 2.46375, + 2.46375, + 3.7325, + 3.7325, + 3.7325, + 3.7325, + 3.7325, + 3.7325, + 3.7325, + 3.7325, + 3.7325, + 4.9825, + 4.9825, + 4.9825, + 4.9825 + ), + "footlight.mt.light" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "forte" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "franklin.gothic.book" = c( + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375 + ), + "franklin.gothic.demi" = c( + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375 + ), + "franklin.gothic.demi.cond" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "franklin.gothic.heavy" = c( + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375 + ), + "franklin.gothic.medium" = c( + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375 + ), + "franklin.gothic.medium.cond" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "frankruehl" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.07125 + ), + "freesiaupc" = c( + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.21375 + ), + "freestyle.script" = c( + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325 + ), + "french.script.mt" = c( + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325 + ), + "gabriola" = c( + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 2.875, + 3.07125 + ), + "gadugi" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "gautami" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "georgia" = c( + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.08875 + ), + "gigi" = c( + 1, + 1, + 1, + 1, + 1.32125, + 1.4825, + 1.4825, + 1.80375, + 1.80375, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.1075, + 2.58875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.69625, + 3.9825 + ), + "gill.sans.mt" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "gill.sans.mt.condensed" = c( + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325 + ), + "gill.sans.mt.ext.condensed.bold" = c( + 0.57125, + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875 + ), + "gill.sans.ultra.bold" = c( + 1.4825, + 1.625, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 3.07125, + 3.21375, + 3.21375, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.25, + 5.3925, + 5.71375, + 5.875, + 5.875, + 6.19625, + 6.3575, + 6.5 + ), + "gill.sans.ultra.bold.condensed" = c( + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.32125 + ), + "gisha" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "gloucester.mt.extra.condensed" = c( + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875 + ), + "goudy.old.style" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "goudy.stout" = c( + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.42875, + 2.42875, + 2.58875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.9825, + 3.9825, + 4.1425, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.25, + 5.3925, + 5.57125, + 5.71375, + 6.0175, + 6.19625, + 6.19625 + ), + "gulim" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.96375, + 1.96375, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125 + ), + "gulimche" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "gungsuh" = c( + 0.8575, + 0.8575, + 1, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375 + ), + "gungsuhche" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "haettenschweiler" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575 + ), + "harlow.solid.italic" = c( + 0.92875, + 0.92875, + 1.07125, + 1.07125, + 1.285, + 1.42875, + 1.42875, + 1.58875, + 1.7675, + 1.7675, + 1.94625, + 2.1075, + 2.1075, + 2.285, + 2.285, + 2.42875, + 2.42875, + 2.66, + 2.80375, + 2.80375, + 2.94625, + 3.125, + 3.125, + 3.32125, + 3.46375, + 3.46375, + 3.6425, + 3.6425, + 3.80375 + ), + "harrington" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "high.tower.text" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "impact" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425 + ), + "imprint.mt.shadow" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "informal.roman" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "irisupc" = c( + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575 + ), + "iskoola.pota" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.69625, + 3.69625, + 3.83875 + ), + "jasmineupc" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5 + ), + "jokerman" = c( + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.46375, + 4.46375, + 4.7675, + 4.7675, + 4.94625, + 5.25, + 5.25, + 5.3925 + ), + "juice.itc" = c( + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.7325 + ), + "kaiti" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "kalinga" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125 + ), + "kartika" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "khmer.ui" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "kodchiangupc" = c( + 0.3925, + 0.3925, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875 + ), + "kristen.itc" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375 + ), + "kunstler.script" = c( + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.58875 + ), + "lao.ui" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "latha" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "leelawadee" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "levenim.mt" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425, + 4.32125 + ), + "lilyupc" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5 + ), + "lucida.bright" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075 + ), + "lucida.calligraphy" = c( + 1.25, + 1.3925, + 1.58875, + 1.7325, + 1.7325, + 2.07125, + 2.1075, + 2.25, + 2.3925, + 2.58875, + 2.7325, + 2.91, + 3.05375, + 3.05375, + 3.42875, + 3.42875, + 3.57125, + 3.7325, + 3.94625, + 4.08875, + 4.2325, + 4.3925, + 4.42875, + 4.75, + 4.75, + 4.91, + 5.08875, + 5.2675, + 5.42875 + ), + "lucida.console" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425, + 4.32125, + 4.46375, + 4.6075 + ), + "lucida.fax" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.7675 + ), + "lucida.handwriting" = c( + 1.25, + 1.3925, + 1.58875, + 1.7325, + 1.7325, + 2.07125, + 2.25, + 2.25, + 2.58875, + 2.58875, + 2.7675, + 2.91, + 3.05375, + 3.25, + 3.42875, + 3.57125, + 3.57125, + 3.91, + 3.94625, + 4.08875, + 4.2325, + 4.3925, + 4.6075, + 4.75, + 4.91, + 4.91, + 5.2675, + 5.2675, + 5.42875 + ), + "lucida.sans" = c( + 1, + 1, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.6075 + ), + "lucida.sans.typewriter" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375 + ), + "lucida.sans.unicode" = c( + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125, + 4.6075, + 4.6075, + 4.7675 + ), + "magneto" = c( + 1.17875, + 1.32125, + 1.625, + 1.625, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.21375, + 3.21375, + 3.5, + 3.69625, + 3.69625, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.25, + 5.3925, + 5.57125, + 5.71375 + ), + "maiandra.gd" = c( + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375 + ), + "malgun.gothic" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "mangal" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "marlett" = c( + 1.80375, + 1.96375, + 2.25, + 2.42875, + 2.58875, + 2.875, + 3.07125, + 3.21375, + 3.5, + 3.69625, + 3.83875, + 4.1425, + 4.32125, + 4.46375, + 4.7675, + 4.94625, + 5.08875, + 5.3925, + 5.57125, + 5.71375, + 6.0175, + 6.19625, + 6.3575, + 6.6425, + 6.82125, + 6.9825, + 7.2675, + 7.46375, + 7.6075 + ), + "matura.mt.script.capitals" = c( + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 4.94625 + ), + "meiryo" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375, + 4.7675, + 4.7675, + 4.94625 + ), + "meiryo.ui" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375, + 4.7675, + 4.7675, + 4.94625 + ), + "microsoft.himalaya" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.42875 + ), + "microsoft.jhenghei" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125 + ), + "microsoft.jhenghei.ui" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125 + ), + "microsoft.new.tai.lue" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "microsoft.phagspa" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "microsoft.sans.serif" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "microsoft.tai.le" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "microsoft.uighur" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.58875 + ), + "microsoft.yahei" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375 + ), + "microsoft.yahei.ui" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375 + ), + "microsoft.yi.baiti" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "miriam" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5 + ), + "miriam.fixed" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375 + ), + "mistral" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575 + ), + "modern" = c( + 0.75, + 0.75, + 0.8925, + 1.035, + 1.035, + 1.21375, + 1.3575, + 1.3575, + 1.5175, + 1.5175, + 1.66, + 1.83875, + 1.83875, + 2, + 2.1425, + 2.1425, + 2.285, + 2.46375, + 2.46375, + 2.625, + 2.7675, + 2.7675, + 2.91, + 2.91, + 3.1075, + 3.1075, + 3.25, + 3.3925, + 3.3925 + ), + "modern.no..20" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575 + ), + "mongolian.baiti" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "monotype.corsiva" = c( + 0.785, + 0.92875, + 1.07125, + 1.07125, + 1.1075, + 1.285, + 1.42875, + 1.42875, + 1.625, + 1.7675, + 1.7675, + 1.9825, + 1.9825, + 2.1425, + 2.285, + 2.32125, + 2.46375, + 2.46375, + 2.66, + 2.66, + 2.83875, + 2.9825, + 2.9825, + 3.125, + 3.17875, + 3.3575, + 3.5, + 3.5, + 3.67875 + ), + "moolboran" = c( + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875 + ), + "ms.gothic" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "ms.mincho" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "ms.outlook" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "ms.pgothic" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "ms.pmincho" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "ms.reference.sans.serif" = c( + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.7675 + ), + "ms.reference.specialty" = c( + 2.1075, + 2.42875, + 2.7325, + 2.875, + 3.07125, + 3.5, + 3.69625, + 3.83875, + 4.32125, + 4.46375, + 4.6075, + 4.94625, + 5.25, + 5.3925, + 5.71375, + 5.875, + 6.19625, + 6.5, + 6.6425, + 6.82125, + 7.2675, + 7.46375, + 7.6075, + 8.08875, + 8.2325, + 8.375, + 8.71375, + 9, + 9.16 + ), + "ms.sans.serif" = c( + 0.8925, + 1.035, + 1.035, + 1.3575, + 1.3575, + 1.5175, + 1.5175, + 1.5175, + 1.83875, + 2, + 2, + 2.1425, + 2.1425, + 2.1425, + 2.7675, + 2.7675, + 2.7675, + 2.7675, + 3.1075, + 3.1075, + 3.25, + 3.25, + 3.25, + 3.25, + 3.7325, + 3.7325, + 3.7325, + 4.0175, + 4.0175 + ), + "ms.serif" = c( + 0.75, + 0.8925, + 0.8925, + 1.21375, + 1.21375, + 1.3575, + 1.3575, + 1.3575, + 1.5175, + 1.83875, + 1.83875, + 2.285, + 2.285, + 2.285, + 2.46375, + 2.46375, + 2.46375, + 2.46375, + 2.7675, + 2.7675, + 2.7675, + 3.875, + 3.875, + 3.875, + 3.1075, + 3.875, + 3.875, + 3.7325, + 3.7325 + ), + "ms.ui.gothic" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "mt.extra" = c( + 1.80375, + 1.96375, + 2.25, + 2.42875, + 2.58875, + 2.875, + 3.07125, + 3.21375, + 3.5, + 3.69625, + 3.83875, + 4.32125, + 4.46375, + 4.6075, + 4.94625, + 5.08875, + 5.25, + 5.57125, + 5.71375, + 5.875, + 6.19625, + 6.3575, + 6.5, + 6.82125, + 6.9825, + 7.125, + 7.46375, + 7.6075, + 7.75 + ), + "mv.boli" = c( + 1.17875, + 1.32125, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.25, + 5.25 + ), + "narkisim" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.07125 + ), + "niagara.engraved" = c( + 0.57125, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 1.96375, + 2.1075, + 2.1075 + ), + "niagara.solid" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 1.96375, + 2.1075, + 2.1075 + ), + "nirmala.ui" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "nsimsun" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "nyala" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "ocr.a.extended" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425, + 4.32125, + 4.46375, + 4.6075 + ), + "old.english.text.mt" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "onyx" = c( + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.17875, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.96375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.1075 + ), + "palace.script.mt" = c( + 0.6075, + 0.6075, + 0.785, + 0.785, + 0.785, + 0.92875, + 0.92875, + 1.07125, + 1.1075, + 1.285, + 1.285, + 1.285, + 1.42875, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.7675, + 1.80375, + 1.9825, + 1.9825, + 2.1425, + 2.1425, + 2.1425, + 2.32125, + 2.32125, + 2.46375, + 2.46375, + 2.46375 + ), + "palatino.linotype" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "papyrus" = c( + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.21375, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.32125, + 4.32125, + 4.46375 + ), + "parchment" = c( + 0.3925, + 0.3925, + 0.3925, + 0.3925, + 0.57125, + 0.57125, + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1, + 1.17875, + 1.17875, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825 + ), + "perpetua" = c( + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.21375 + ), + "perpetua.titling.mt" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 4.94625 + ), + "plantagenet.cherokee" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "playbill" = c( + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.58875 + ), + "pmingliu" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5 + ), + "pmingliu-extb" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5 + ), + "poor.richard" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425 + ), + "pristina" = c( + 0.71375, + 1, + 1.17875, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "raavi" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "rage.italic" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "rockwell" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 3.9825 + ), + "rockwell.condensed" = c( + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 2.875, + 3.07125 + ), + "rockwell.extra.bold" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.42875, + 2.42875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.9825, + 4.1425, + 4.1425, + 4.46375, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875 + ), + "rod" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375 + ), + "roman" = c( + 0.75, + 0.75, + 0.8925, + 1.035, + 1.035, + 1.21375, + 1.3575, + 1.3575, + 1.5175, + 1.5175, + 1.66, + 1.83875, + 1.83875, + 2, + 2.1425, + 2.1425, + 2.285, + 2.46375, + 2.46375, + 2.625, + 2.7675, + 2.7675, + 2.91, + 2.91, + 3.1075, + 3.1075, + 3.25, + 3.3925, + 3.3925 + ), + "sakkal.majalla" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875 + ), + "script" = c( + 0.6075, + 0.6075, + 0.75, + 0.75, + 0.8925, + 1.035, + 1.035, + 1.035, + 1.21375, + 1.3575, + 1.3575, + 1.5175, + 1.5175, + 1.66, + 1.83875, + 1.83875, + 1.83875, + 2, + 2.1425, + 2.1425, + 2.285, + 2.285, + 2.46375, + 2.46375, + 2.625, + 2.625, + 2.7675, + 2.7675, + 2.91 + ), + "script.mt.bold" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "segoe.print" = c( + 1.17875, + 1.17875, + 1.4825, + 1.625, + 1.625, + 1.96375, + 2.1075, + 2.1075, + 2.42875, + 2.42875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.25, + 5.3925 + ), + "segoe.script" = c( + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.96375, + 2.1075, + 2.1075, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.3575, + 3.3575, + 3.5, + 3.83875, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.25, + 5.3925 + ), + "segoe.ui" = c( + 0.8575, + 0.8575, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425 + ), + "segoe.ui.light" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "segoe.ui.semibold" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "segoe.ui.semilight" = c( + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425 + ), + "segoe.ui.symbol" = c( + 0.8575, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 3.9825 + ), + "shonar.bangla" = c( + 0.71375, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 2.875 + ), + "showcard.gothic" = c( + 1.17875, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.32125, + 4.46375 + ), + "shruti" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875 + ), + "simhei" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "simplified.arabic" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425 + ), + "simplified.arabic.fixed" = c( + 1, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.46375 + ), + "simsun" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "simsun-extb" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "small.fonts" = c( + 0.8925, + 0.8925, + 1.21375, + 1.5175, + 1.5175, + 1.5175, + 1.83875, + 1.83875, + 1.83875, + 2.285, + 2.285, + 2.285, + 2.46375, + 2.46375, + 2.7675, + 3.1075, + 2.7675, + 2.7675, + 3.1075, + 3.1075, + 3.1075, + 3.7325, + 3.7325, + 3.7325, + 3.7325, + 3.875, + 3.875, + 3.875, + 3.875 + ), + "snap.itc" = c( + 1.4825, + 1.625, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.25, + 5.3925, + 5.57125, + 5.71375, + 5.875, + 6.0175, + 6.3575, + 6.5, + 6.5 + ), + "sylfaen" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "symbol" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "tahoma" = c( + 1, + 1, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.6075 + ), + "tempus.sans.itc" = c( + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.1425, + 4.46375, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875 + ), + "terminal" = c( + 1.21375, + 1.21375, + 1.21375, + 1.83875, + 1.83875, + 1.5175, + 1.5175, + 1.5175, + 1.5175, + 2.58875, + 2.58875, + 2.58875, + 2.58875, + 2.58875, + 3.7325, + 3.7325, + 3.7325, + 3.7325, + 3.1075, + 3.1075, + 3.1075, + 4.46375, + 4.46375, + 4.46375, + 4.46375, + 4.46375, + 5.6075, + 5.6075, + 5.6075 + ), + "times.new.roman" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "traditional.arabic" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "trebuchet.ms" = c( + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.83875, + 3.83875, + 4.1425, + 4.1425, + 4.32125 + ), + "tunga" = c( + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575 + ), + "tw.cen.mt" = c( + 0.71375, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625, + 3.83875 + ), + "tw.cen.mt.condensed" = c( + 0.57125, + 0.71375, + 0.8575, + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.07125 + ), + "tw.cen.mt.condensed.extra.bold" = c( + 0.8575, + 0.8575, + 1, + 1.17875, + 1.17875, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.7325, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5, + 3.69625, + 3.69625 + ), + "utsaah" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875 + ), + "vani" = c( + 1, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.21375, + 3.21375, + 3.3575, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.08875 + ), + "verdana" = c( + 1.17875, + 1.17875, + 1.4825, + 1.4825, + 1.625, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.69625, + 3.83875, + 3.83875, + 4.1425, + 4.1425, + 4.32125, + 4.6075, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.25 + ), + "vijaya" = c( + 0.57125, + 0.57125, + 0.71375, + 0.71375, + 0.8575, + 1, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.7325, + 2.875 + ), + "viner.hand.itc" = c( + 1.17875, + 1.32125, + 1.4825, + 1.625, + 1.80375, + 1.96375, + 2.1075, + 2.1075, + 2.42875, + 2.42875, + 2.58875, + 2.7325, + 2.875, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.69625, + 3.69625, + 3.83875, + 3.9825, + 4.1425, + 4.32125, + 4.46375, + 4.6075, + 4.7675, + 4.94625, + 5.08875, + 5.08875 + ), + "vivaldi" = c( + 0.785, + 0.92875, + 0.92875, + 1.07125, + 1.1075, + 1.285, + 1.42875, + 1.42875, + 1.625, + 1.625, + 1.7675, + 1.94625, + 1.9825, + 1.9825, + 2.1425, + 2.285, + 2.32125, + 2.46375, + 2.46375, + 2.66, + 2.83875, + 2.83875, + 2.83875, + 2.9825, + 3.17875, + 3.17875, + 3.3575, + 3.3575, + 3.5 + ), + "vladimir.script" = c( + 0.8575, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.07125, + 3.21375, + 3.3575, + 3.3575, + 3.5 + ), + "vrinda" = c( + 0.71375, + 0.8575, + 1, + 1, + 1.17875, + 1.32125, + 1.32125, + 1.4825, + 1.625, + 1.625, + 1.80375, + 1.96375, + 1.96375, + 2.1075, + 2.25, + 2.25, + 2.42875, + 2.58875, + 2.58875, + 2.7325, + 2.875, + 2.875, + 3.07125, + 3.21375, + 3.21375, + 3.3575, + 3.5, + 3.5, + 3.69625 + ), + "webdings" = c( + 1.80375, + 1.96375, + 2.25, + 2.42875, + 2.58875, + 2.875, + 3.07125, + 3.21375, + 3.5, + 3.69625, + 3.83875, + 4.1425, + 4.32125, + 4.46375, + 4.7675, + 4.94625, + 5.08875, + 5.3925, + 5.57125, + 5.71375, + 6.0175, + 6.19625, + 6.3575, + 6.6425, + 6.82125, + 6.9825, + 7.2675, + 7.46375, + 7.6075 + ), + "wide.latin" = c( + 2.25, + 2.42875, + 2.875, + 3.07125, + 3.21375, + 3.69625, + 3.83875, + 3.9825, + 4.32125, + 4.6075, + 4.7675, + 5.08875, + 5.3925, + 5.57125, + 5.875, + 6.19625, + 6.3575, + 6.6425, + 6.9825, + 7.125, + 7.46375, + 7.6075, + 7.8925, + 8.2325, + 8.375, + 8.71375, + 9, + 9.16, + 9.4825 + ) + ) @@ -2950,318 +17500,396 @@ openxlsxFontSizeLookupTableBold <- ## TO BE DEPRECATED -Workbook$methods(conditionalFormatCell = function(sheet, startRow, endRow, startCol, endCol, dxfId, formula, type){ - - sheet = validateSheet(sheet) - sqref <- paste(getCellRefs(data.frame("x" = c(startRow, endRow), "y" = c(startCol, endCol))), collapse = ":") - - ## Increment priority of conditional formatting rule - if(length((worksheets[[sheet]]$conditionalFormatting)) > 0){ - for(i in length(worksheets[[sheet]]$conditionalFormatting):1) - worksheets[[sheet]]$conditionalFormatting[[i]] <<- gsub('(?<=priority=")[0-9]+', i+1L, worksheets[[sheet]]$conditionalFormatting[[i]], perl = TRUE) +Workbook$methods( + conditionalFormatCell = function(sheet, + startRow, + endRow, + startCol, + endCol, + dxfId, + formula, + type) { + sheet = validateSheet(sheet) + sqref <- + stri_join(getCellRefs(data.frame( + "x" = c(startRow, endRow), + "y" = c(startCol, endCol) + )), collapse = ":") + + ## Increment priority of conditional formatting rule + if (length((worksheets[[sheet]]$conditionalFormatting)) > 0) { + for (i in length(worksheets[[sheet]]$conditionalFormatting):1) + worksheets[[sheet]]$conditionalFormatting[[i]] <<- + gsub('(?<=priority=")[0-9]+', + i + 1L, + worksheets[[sheet]]$conditionalFormatting[[i]], + perl = TRUE) + } + + nms <- c(names(worksheets[[sheet]]$conditionalFormatting), sqref) + + if (type == "expression") { + cfRule <- + sprintf( + '%s', + dxfId, + formula + ) + + } else if (type == "dataBar") { + if (length(formula) == 2) { + negColour <- formula[[1]] + posColour <- formula[[2]] + } else{ + posColour <- formula + negColour <- "FFFF0000" + } + + guid <- + stri_join("F7189283-14F7-4DE0-9601-54DE9DB", + 40000L + length(worksheets[[sheet]]$extLst)) + cfRule <- + sprintf( + '{%s}', + posColour, + guid + ) + + } else if (length(formula) == 2L) { + cfRule <- + sprintf( + '', + formula[[1]], + formula[[2]] + ) + + } else{ + cfRule <- + sprintf( + '', + formula[[1]], + formula[[2]], + formula[[3]] + ) + } + + worksheets[[sheet]]$conditionalFormatting <<- + append(worksheets[[sheet]]$conditionalFormatting, cfRule) + + names(worksheets[[sheet]]$conditionalFormatting) <<- nms + + invisible(0) + } - - nms <- c(names(worksheets[[sheet]]$conditionalFormatting), sqref) - - if(type == "expression"){ +) + + + + + + +Workbook$methods( + loadStyles = function(stylesXML) { + ## Build style objects from the styles XML + stylesTxt <- + readLines(stylesXML, warn = FALSE, encoding = "UTF-8") + stylesTxt <- removeHeadTag(stylesTxt) + + ## Indexed colours + vals <- getNodes(xml = stylesTxt, tagIn = "") + if (length(vals) > 0) + styles$indexedColors <<- + stri_join("", vals, "") - cfRule <- sprintf('%s', dxfId, formula) + ## dxf (don't need these, I don't think) + dxf <- getNodes(xml = stylesTxt, tagIn = " 0) { + dxf <- getNodes(xml = dxf[[1]], tagIn = "") + if (length(dxf) > 0) + styles$dxfs <<- dxf + } + + tableStyles <- getNodes(xml = stylesTxt, tagIn = " 0) + styles$tableStyles <<- stri_join(tableStyles, ">") - }else if(type == "dataBar"){ + extLst <- getNodes(xml = stylesTxt, tagIn = "") + if (length(extLst) > 0) + styles$extLst <<- extLst - if(length(formula) == 2){ - negColour <- formula[[1]] - posColour <- formula[[2]] - }else{ - posColour <- formula - negColour <- "FFFF0000" + + ## Number formats + numFmts <- getChildlessNode(xml = stylesTxt, tag = " 0) { + numFmtsIds <- + sapply(numFmts, getAttr, tag = 'numFmtId="', USE.NAMES = FALSE) + formatCodes <- + sapply(numFmts, getAttr, tag = 'formatCode="', USE.NAMES = FALSE) + numFmts <- + lapply(1:length(numFmts), function(i) + list("numFmtId" = numFmtsIds[[i]], "formatCode" = formatCodes[[i]])) + numFmtFlag <- TRUE + } - guid <- paste0("F7189283-14F7-4DE0-9601-54DE9DB", 40000L + length(worksheets[[sheet]]$extLst)) - cfRule <- sprintf('{%s}', posColour, guid) + ## fonts will maintain, sz, color, name, family scheme + if (grepl("", stylesTxt, fixed = TRUE)) { + ## empty font node + fonts <- getNodes(xml = stylesTxt, tagIn = "', formula[[1]], formula[[2]]) + fills <- getNodes(xml = stylesTxt, tagIn = "") + fills <- buildFillList(fills) - }else{ + borders <- getOpenClosedNode(stylesTxt, "") + borders <- + substr( + borders, + start = regexpr("", borders)[1], + stop = regexpr("", borders) - 1L + ) + borders <- getNodes(xml = borders, tagIn = "', formula[[1]], formula[[2]], formula[[3]]) - } - - worksheets[[sheet]]$conditionalFormatting <<- append(worksheets[[sheet]]$conditionalFormatting, cfRule) - - names(worksheets[[sheet]]$conditionalFormatting) <<- nms - - invisible(0) - -}) - - - - - - -Workbook$methods(loadStyles = function(stylesXML){ - - ## Build style objects from the styles XML - stylesTxt <- readLines(stylesXML, warn = FALSE, encoding = "UTF-8") - stylesTxt <- removeHeadTag(stylesTxt) - - ## Indexed colours - vals <- getNodes(xml = stylesTxt, tagIn = "") - if(length(vals) > 0) - styles$indexedColors <<- paste0("", vals, "") - - ## dxf (don't need these, I don't think) - dxf <- getNodes(xml = stylesTxt, tagIn = " 0){ - dxf <- getNodes(xml = dxf[[1]], tagIn = "") - if(length(dxf) > 0) - styles$dxfs <<- dxf - } - - tableStyles <- getNodes(xml = stylesTxt, tagIn = " 0) - styles$tableStyles <<- paste0(tableStyles, ">") - - extLst <- getNodes(xml = stylesTxt, tagIn = "") - if(length(extLst) > 0) - styles$extLst <<- extLst - - - ## Number formats - numFmts <- getChildlessNode(xml = stylesTxt, tag = " 0){ - - numFmtsIds <- sapply(numFmts, getAttr, tag = 'numFmtId="', USE.NAMES = FALSE) - formatCodes <- sapply(numFmts, getAttr, tag = 'formatCode="', USE.NAMES = FALSE) - numFmts <-lapply(1:length(numFmts), function(i) list("numFmtId"= numFmtsIds[[i]], "formatCode"=formatCodes[[i]])) - numFmtFlag <- TRUE - } - - ## fonts will maintain, sz, color, name, family scheme - if(grepl("", stylesTxt, fixed = TRUE)){ ## empty font node - fonts <- getNodes(xml = stylesTxt, tagIn = "") - borders <- substr(borders, start = regexpr("", borders)[1], stop = regexpr("", borders) - 1L) - borders <- getNodes(xml = borders, tagIn = "', paste(names(attr), '="', attr, '"', collapse = " ", sep = "")) - } else { - workbookProtection <<- "" } -}) - +) +Workbook$methods( + protectWorkbook = function(protect = TRUE, + lockStructure = FALSE, + lockWindows = FALSE, + password = NULL) { + attr = c() + if (!is.null(password)) { + attr["workbookPassword"] <- hashPassword(password) + } + if (!missing(lockStructure) && !is.null(lockStructure)) { + attr["lockStructure"] <- toString(as.numeric(lockStructure)) + } + if (!missing(lockWindows) && !is.null(lockWindows)) { + attr["lockWindows"] <- toString(as.numeric(lockWindows)) + } + if (protect) { + workbookProtection <<- + sprintf( + '', + stri_join( + names(attr), + '="', + attr, + '"', + collapse = " ", + sep = "" + ) + ) + } else { + workbookProtection <<- "" + } + } +) diff --git a/R/helperFunctions.R b/R/helperFunctions.R index 731d68f0..2860b470 100644 --- a/R/helperFunctions.R +++ b/R/helperFunctions.R @@ -331,6 +331,9 @@ writeCommentXML <- function(comment_list, file_name){ } +illegalchars <- c('&', '"', "'", '<', '>', "\a", "\b", "\v", "\f") +illegalcharsreplace <- c("&", """, "'", "<", ">", "", "", "", "") + replaceIllegalCharacters <- function(v){ @@ -339,19 +342,9 @@ replaceIllegalCharacters <- function(v){ flg <- vEnc != "UTF-8" if(any(flg)) - v[flg] <- iconv(v[flg], from = "", to = "UTF-8") - - v <- gsub('&', "&", v, fixed = TRUE) - v <- gsub('"', """, v, fixed = TRUE) - v <- gsub("'", "'", v, fixed = TRUE) - v <- gsub('<', "<", v, fixed = TRUE) - v <- gsub('>', ">", v, fixed = TRUE) - - ## Escape sequences - v <- gsub("\a", "", v, fixed = TRUE) - v <- gsub("\b", "", v, fixed = TRUE) - v <- gsub("\v", "", v, fixed = TRUE) - v <- gsub("\f", "", v, fixed = TRUE) + v[flg] <- stri_conv(v[flg], from = "", to = "UTF-8") + + v <- stri_replace_all_fixed(v, illegalchars, illegalcharsreplace, vectorize_all = FALSE) return(v) } diff --git a/R/workbook_write_data.R b/R/workbook_write_data.R index dfe753ae..c3d8e3af 100644 --- a/R/workbook_write_data.R +++ b/R/workbook_write_data.R @@ -34,7 +34,7 @@ Workbook$methods(writeData = function(df, sheet, startRow, startCol, colNames, c dInds <- which(sapply(colClasses, function(x) "date" %in% x)) origin <- 25569L - if(grepl('date1904="1"|date1904="true"', paste(unlist(workbook), collapse = ""), ignore.case = TRUE)) + if(grepl('date1904="1"|date1904="true"', stri_join(unlist(workbook), collapse = ""), ignore.case = TRUE)) origin <- 24107L for(i in dInds) @@ -83,7 +83,7 @@ Workbook$methods(writeData = function(df, sheet, startRow, startCol, colNames, c ## if("list" %in% allColClasses){ for(i in which(sapply(colClasses, function(x) "list" %in% x))) - df[[i]] <- sapply(lapply(df[[i]], unlist), paste, collapse = list_sep) + df[[i]] <- sapply(lapply(df[[i]], unlist), stri_join, collapse = list_sep) } if("formula" %in% allColClasses){ @@ -162,7 +162,7 @@ Workbook$methods(writeData = function(df, sheet, startRow, startCol, colNames, c ## alter the elements of t where we have a formula to be "str" formula_cols <- which(sapply(colClasses, function(x) "openxlsx_formula" %in% x, USE.NAMES = FALSE), useNames = FALSE) - formula_strs <- paste0("", unlist(df[formula_cols], use.names = FALSE), "") + formula_strs <- stri_join("", unlist(df[formula_cols], use.names = FALSE), "") formula_inds <- unlist(lapply(formula_cols, function(i) i + (1:(nRows - colNames) - 1)*nCols + (colNames * nCols)), use.names = FALSE) f_in[formula_inds] <- formula_strs any_functions <- TRUE @@ -222,7 +222,7 @@ Workbook$methods(writeData = function(df, sheet, startRow, startCol, colNames, c if(length(newStrs) > 0){ newStrs <- replaceIllegalCharacters(newStrs) - newStrs <- paste0("", newStrs, "") + newStrs <- stri_join("", newStrs, "") uNewStr <- unique(newStrs) diff --git a/R/writeData.R b/R/writeData.R index 47bc00a5..1daf27cd 100644 --- a/R/writeData.R +++ b/R/writeData.R @@ -1,6 +1,7 @@ #' @name writeData #' @title Write an object to a worksheet #' @author Alexander Walker +#' @import stringi #' @description Write an object to worksheet with optional styling. #' @param wb A Workbook object containing a worksheet. #' @param sheet The worksheet to write to. Can be the worksheet index or name. @@ -40,7 +41,7 @@ #' @param withFilter If \code{TRUE}, add filters to the column name row. NOTE can only have one filter per worksheet. #' @param keepNA If \code{TRUE}, NA values are converted to #N/A in Excel else NA cells will be empty. #' @param name If not NULL, a named region is defined. -#' @param sep Only applies to list columns. The separator used to collapse list columns to a character vector e.g. sapply(x$list_column, paste, collapse = sep). +#' @param sep Only applies to list columns. The separator used to collapse list columns to a character vector e.g. sapply(x$list_column, stri_join, collapse = sep). #' @seealso \code{\link{writeDataTable}} #' @export writeData #' @details Formulae written using writeFormula to a Workbook object will not get picked up by read.xlsx(). @@ -112,7 +113,7 @@ #' ## - vectors/columns with class 'hyperlink' are written as hyperlinks' #' #' v <- rep("https://CRAN.R-project.org/", 4) -#' names(v) <- paste("Hyperlink", 1:4) # Optional: names will be used as display text +#' names(v) <- paste0("Hyperlink", 1:4) # Optional: names will be used as display text #' class(v) <- 'hyperlink' #' writeData(wb, "Cars", x = v, xy = c("B", 32)) #' @@ -122,7 +123,7 @@ #' ## - vectors/columns with class 'formula' are written as formulas' #' #' df <- data.frame(x=1:3, y = 1:3, -#' z = paste(paste0("A", 1:3+1L), paste0("B", 1:3+1L), sep = " + "), +#' z = paste0(paste0("A", 1:3+1L), paste0("B", 1:3+1L), sep = " + "), #' stringsAsFactors = FALSE) #' #' class(df$z) <- c(class(df$z), "formula") @@ -267,12 +268,12 @@ writeData <- function(wb, if(withFilter){ coords <- data.frame("x" = c(startRow, startRow + nRow + colNames - 1L), "y" = c(startCol, startCol + nCol - 1L)) - ref <- paste(getCellRefs(coords), collapse = ":") + ref <- stri_join(getCellRefs(coords), collapse = ":") wb$worksheets[[sheetX]]$autoFilter <- sprintf('', ref) l <- convert_to_excel_ref(cols = unlist(coords[,2]), LETTERS = LETTERS) - dfn <- sprintf("'%s'!%s", names(wb)[sheetX], paste0("$", l, "$", coords[,1], collapse=":")) + dfn <- sprintf("'%s'!%s", names(wb)[sheetX], stri_join("$", l, "$", coords[,1], collapse=":")) dn <- sprintf('', sheetX - 1L, dfn) @@ -314,8 +315,8 @@ writeData <- function(wb, ## named region if(!is.null(name)){ - ref1 <- paste0("$", convert_to_excel_ref(cols = startCol, LETTERS = LETTERS), "$", startRow) - ref2 <- paste0("$", convert_to_excel_ref(cols = startCol + nCol - 1L, LETTERS = LETTERS), "$", startRow + nRow - 1L + colNames) + ref1 <- stri_join("$", convert_to_excel_ref(cols = startCol, LETTERS = LETTERS), "$", startRow) + ref2 <- stri_join("$", convert_to_excel_ref(cols = startCol + nCol - 1L, LETTERS = LETTERS), "$", startRow + nRow - 1L + colNames) wb$createNamedRegion(ref1 = ref1, ref2 = ref2, name = name, sheet = wb$sheet_names[wb$validateSheet(sheet)]) } @@ -421,7 +422,7 @@ writeData <- function(wb, #' #' df <- data.frame(x=1:3, #' y = 1:3, -#' z = paste(paste0("A", 1:3+1L), paste0("B", 1:3+1L), sep = " + "), +#' z = stri_join(stri_join("A", 1:3+1L), stri_join("B", 1:3+1L), sep = " + "), #' z2 = sprintf("ADDRESS(1,%s)", 1:3), #' stringsAsFactors = FALSE) #' diff --git a/man/writeData.Rd b/man/writeData.Rd index 5c2763e8..4c773180 100644 --- a/man/writeData.Rd +++ b/man/writeData.Rd @@ -65,7 +65,7 @@ each column. If "\code{all}" all cell borders are drawn.} \item{name}{If not NULL, a named region is defined.} -\item{sep}{Only applies to list columns. The separator used to collapse list columns to a character vector e.g. sapply(x$list_column, paste, collapse = sep).} +\item{sep}{Only applies to list columns. The separator used to collapse list columns to a character vector e.g. sapply(x$list_column, stri_join, collapse = sep).} } \value{ invisible(0) @@ -142,7 +142,7 @@ writeData(wb, "Cars", x, colNames = TRUE, rowNames = TRUE, ## - vectors/columns with class 'hyperlink' are written as hyperlinks' v <- rep("https://CRAN.R-project.org/", 4) -names(v) <- paste("Hyperlink", 1:4) # Optional: names will be used as display text +names(v) <- paste0("Hyperlink", 1:4) # Optional: names will be used as display text class(v) <- 'hyperlink' writeData(wb, "Cars", x = v, xy = c("B", 32)) @@ -152,7 +152,7 @@ writeData(wb, "Cars", x = v, xy = c("B", 32)) ## - vectors/columns with class 'formula' are written as formulas' df <- data.frame(x=1:3, y = 1:3, - z = paste(paste0("A", 1:3+1L), paste0("B", 1:3+1L), sep = " + "), + z = paste0(paste0("A", 1:3+1L), paste0("B", 1:3+1L), sep = " + "), stringsAsFactors = FALSE) class(df$z) <- c(class(df$z), "formula") diff --git a/man/writeFormula.Rd b/man/writeFormula.Rd index 50ee65e4..23b7baa3 100644 --- a/man/writeFormula.Rd +++ b/man/writeFormula.Rd @@ -45,7 +45,7 @@ writeFormula(wb, 1, x = "A2 + B2", startCol = 10, startRow = 10) df <- data.frame(x=1:3, y = 1:3, - z = paste(paste0("A", 1:3+1L), paste0("B", 1:3+1L), sep = " + "), + z = stri_join(stri_join("A", 1:3+1L), stri_join("B", 1:3+1L), sep = " + "), z2 = sprintf("ADDRESS(1,\%s)", 1:3), stringsAsFactors = FALSE)