【问题标题】:Displaying \checkmark in latex table在乳胶表中显示 \checkmark
【发布时间】:2019-04-14 01:05:17
【问题描述】:

在一个旧的 .Rnw 文件中,我使用 RODBC 包来读取一个 excel 表并显示一个包含复选标记的乳胶表。

最近,我尝试改变读取excel文件的方式,使用XLConnect包而不是RODBC,但是我遇到了一个问题。我无法再正确显示复选标记符号。注意我传给xtable打印的对象和上一个是一样的,但是结果却不一样!

到这里the excel file 我使用。

这是工作的.Rnw。 (我知道代码绝不是最优的)。文件编码为UTF-8,我使用knitrXeLaTeX编织文件

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage{bbding} % checkmark symbol
\setmainfont[Scale=1.0]{Times New Roman} % Times New Roman
\setsansfont{Times New Roman}

<<eval=TRUE,echo=FALSE,warning=FALSE,message=FALSE,error=FALSE>>=
library(plyr)
library(XLConnect)
library(lubridate)
library(RODBC)
library(stringr)
library(xtable)
library(magrittr)
@

\begin{document}

\begin{center}

{\small
<<eval=TRUE,echo=FALSE,results='asis',warning=FALSE,message=FALSE,error=FALSE>>=

sheet = 'DATA-BOOK.xls' 
con = odbcConnectExcel2007(sheet)
tbls = sqlTables(con)
df <- sqlQuery(con,"SELECT * FROM `r-crosstab$`",stringsAsFactors =FALSE)
close(con)


dfr <- df[,2:ncol(df)]
for (i in 1:ncol(dfr)){
  dfr[i][is.na(dfr[i])] <- ""
}

temp <- adply(dfr,1,function(x) length(x[x!=""]))

dfr <-  apply(dfr,2,function(x) gsub("\\?","\\\\Checkmark",x))

aitia <- paste0("c",1:nrow(dfr))
aitia <- unlist(sapply(aitia,function(x) if (nchar(x) == 2) {x=paste0(str_sub(x, 1, 1),"0",str_sub(x, 2, 2))} else{x} ))
names(aitia)<-NULL
dfr <- cbind(aitia,dfr,temp[ncol(temp)])

dfr1 <- t(dfr)
dfr1 <- apply(dfr1,2,as.character)
rownames(dfr1) <- c(colnames(dfr)[1:(length(colnames(dfr))-1)],"Αθρ.")
colnames(dfr1) <- dfr1[1,]
dfr1 <- dfr1[-1,]

dfr1[nrow(dfr1),] <- paste0("\\textbf{",dfr1[nrow(dfr1),],"}")

print(xtable(dfr1, align=paste0("l|",paste(rep("c|",length(aitia)),collapse="")),
             label='tab_crosstab'), 
      scalebox=0.80, 
      include.rownames=TRUE, 
      hline.after=c(-1:nrow(dfr1)),
      sanitize.text.function = function(x){x}
)

@
}
\end{center}

\end{document}

这是我编译的时候得到的(这是预期的结果)

这就是我面临问题的 .Rnw。你能告诉我我需要改变什么吗?

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage{bbding} % checkmark symbol
\setmainfont[Scale=1.0]{Times New Roman} % Times New Roman
\setsansfont{Times New Roman}

<<eval=TRUE,echo=FALSE,warning=FALSE,message=FALSE,error=FALSE>>=
library(plyr)
library(XLConnect)
library(lubridate)
library(RODBC)
library(stringr)
library(xtable)
library(magrittr)
@

\begin{document}

\begin{center}

{\small
<<eval=TRUE,echo=FALSE,results='asis',warning=FALSE,message=FALSE,error=FALSE>>=

wb <- loadWorkbook('DATA-BOOK.xls', create = FALSE)
df <- readWorksheet(wb, sheet="r-crosstab", check.names=FALSE)

df %>%
dplyr::select(- dplyr::contains("ΑITIO")) %>%
names() -> vnames 

df[vnames] %<>%
dplyr::mutate_if(is.factor, as.character)


dfr <- df[,2:ncol(df)]
for (i in 1:ncol(dfr)){
  dfr[i][is.na(dfr[i])] <- ""
}

temp <- adply(dfr,1,function(x) length(x[x!=""]))

dfr <-  apply(dfr,2,function(x) gsub("√","\\\\Checkmark",x)) # √   <U+221A>

aitia <- paste0("c",1:nrow(dfr))
aitia <- unlist(sapply(aitia,function(x) if (nchar(x) == 2) {x=paste0(str_sub(x, 1, 1),"0",str_sub(x, 2, 2))} else{x} ))
names(aitia)<-NULL
dfr <- cbind(aitia,dfr,temp[ncol(temp)])

dfr1 <- t(dfr)
dfr1 <- apply(dfr1,2,as.character)
rownames(dfr1) <- c(colnames(dfr)[1:(length(colnames(dfr))-1)],"Αθρ.")
colnames(dfr1) <- dfr1[1,]
dfr1 <- dfr1[-1,]

dfr1[nrow(dfr1),] <- paste0("\\textbf{",dfr1[nrow(dfr1),],"}")

print(xtable(dfr1, align=paste0("l|",paste(rep("c|",length(aitia)),collapse="")),
             label='tab_crosstab'), 
      scalebox=0.80, 
      include.rownames=TRUE, 
      hline.after=c(-1:nrow(dfr1)),
      sanitize.text.function = function(x){x}
)
@
}
\end{center}

\end{document}

编译后的 pdf 现在的样子如下:

> sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: i386-w64-mingw32/i386 (32-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=Greek_Greece.1253 
[2] LC_CTYPE=Greek_Greece.1253   
[3] LC_MONETARY=Greek_Greece.1253
[4] LC_NUMERIC=C                 
[5] LC_TIME=Greek_Greece.1253    

attached base packages:
[1] stats     graphics  grDevices utils     datasets 
[6] methods   base     

other attached packages:
 [1] magrittr_1.5         extrafont_0.17      
 [3] xtable_1.8-3         stringr_1.3.1       
 [5] RODBC_1.3-15         lubridate_1.7.4     
 [7] XLConnect_0.2-15     XLConnectJars_0.2-15
 [9] plyr_1.8.4           tidyr_0.8.2         
[11] dplyr_0.7.7         

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.19     Rttf2pt1_1.3.7   rstudioapi_0.8  
 [4] bindr_0.1.1      tidyselect_0.2.5 R6_2.3.0        
 [7] rlang_0.3.0.1    tools_3.5.1      extrafontdb_1.0 
[10] yaml_2.2.0       assertthat_0.2.0

编辑

在下面的一对代码片段中,我尝试最小化示例,省略了一些不相关的部分。同样,第一个是可以正常工作的。同时我注意到,无论我在gsub(在第二个示例中)中使用什么字符串作为替换,结果总是相同的!!!

工作代码:

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage{bbding} % checkmark symbol
\setmainfont[Scale=1.0]{Times New Roman} % Times New Roman
\setsansfont{Times New Roman}

<<eval=TRUE,echo=FALSE,warning=FALSE,message=FALSE,error=FALSE>>=
library(XLConnect)
library(RODBC)
library(xtable)
library(dplyr)
library(magrittr)
@

\begin{document}

{\small
<<eval=TRUE,echo=FALSE,results='asis',warning=FALSE,message=FALSE,error=FALSE>>=

sheet = 'DATA-BOOK.xls' 
con = odbcConnectExcel2007(sheet)
tbls = sqlTables(con)
df <- sqlQuery(con,"SELECT * FROM `r-crosstab$`",stringsAsFactors =FALSE)
close(con)

df %>%
dplyr::select(- dplyr::contains("ΑITIO")) %>%
names() -> vnames 

df[vnames] %<>%
mutate_if(is.factor, as.character) %>% 
mutate_if(is.character, funs(coalesce(., "")))
names(df)[1] <- "TITLE"

dfr <-  apply(df,2,function(x) gsub("\\?","\\\\Checkmark",x))
rownames(dfr) <- NULL
dfr1 <- t(dfr)
dfr1[1,] <- paste0("c",1:19)

print(xtable(dfr1), 
      scalebox=0.80, 
      hline.after=c(-1:nrow(dfr1)),
      sanitize.text.function = function(x){x}
)
@
}

\end{document}

不工作的代码:

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage{bbding} % checkmark symbol
\setmainfont[Scale=1.0]{Times New Roman} % Times New Roman
\setsansfont{Times New Roman}

<<eval=TRUE,echo=FALSE,warning=FALSE,message=FALSE,error=FALSE>>=
library(XLConnect)
library(RODBC)
library(xtable)
library(dplyr)
library(magrittr)
@

\begin{document}

{\small
<<eval=TRUE,echo=FALSE,results='asis',warning=FALSE,message=FALSE,error=FALSE>>=

wb <- loadWorkbook('DATA-BOOK.xls', create = FALSE)
df <- readWorksheet(wb, sheet="r-crosstab", check.names=FALSE)

df %>%
dplyr::select(- dplyr::contains("ΑITIO")) %>%
names() -> vnames 

df[vnames] %<>%
mutate_if(is.factor, as.character) %>% 
mutate_if(is.character, funs(coalesce(., "")))
names(df)[1] <- "TITLE"

dfr <-  apply(df,2,function(x) gsub("√","\\\\Checkmark",x)) # √   <U+221A>
dfr1 <- t(dfr)
dfr1[1,] <- paste0("c",1:19)

print(xtable(dfr1), 
      scalebox=0.80, 
      include.rownames=TRUE, 
      hline.after=c(-1:nrow(dfr1)),
      sanitize.text.function = function(x){x}
)
@
}

\end{document}

【问题讨论】:

  • 这可能是一个可重现的例子,但它远不是一个最小的例子。您能否尝试隔离问题并忽略不相关的部分?您不需要数百个单元格、列名、行名和一堆包来检查复选标记的显示方式。
  • @CL。我编辑添加了一对离最小化不远的示例。
  • @GeorgeDontas 我在 MaxOSX Mojave 上运行了您的代码,它使用 R 3.5.1 产生了正确的结果。让我在 Windows 10 上运行相同的设置。看看我是否得到不同的结果。我感觉这是 Windows 字体问题...dropbox.com/s/yg71jryn6r3gc80/53243041v1.pdf?dl=0

标签: r latex knitr xtable


【解决方案1】:

问题在于gsub 行的格式。

建议的解决方案:

替换:

dfr &lt;- apply(df,2,function(x) gsub("√","\\\\Checkmark",x)) # √ &lt;U+221A&gt;

dfr &lt;- apply(dfr,2,function(x) gsub("\u221A","\\\\Checkmark",x)) # √ &lt;U+221A&gt;

结果:

https://www.dropbox.com/s/evzknzobfwh0ag1/53243041v2.pdf?dl=0

设置:

我在 Windows 10 上使用 RStudio 和 R3.5.1 进行了测试,使用 knitr 和 XeLatex 进行排版。

说明:

.rnw 文件在编译时会创建一个中间 .tex 文件作为输出,然后将其转换为 pdf。您必须以正确的格式将代码 \u221A" 传递给 pdf 格式化应用程序。

【讨论】:

    猜你喜欢
    • 2017-07-18
    • 2015-05-31
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2022-10-14
    相关资源
    最近更新 更多