如何使用R逐字符复制含LaTeX代码的.tex文件且不修改内容
问题根源
你当前遇到的问题是由两个错误的用法导致的:
readLines默认会自动识别编码、转换字符、丢弃末尾无换行的行,没有明确指定编码的情况下读取非UTF-8文件必然出现乱码write.table本身是为表格数据设计的输出函数,哪怕关闭了行列名、引号等参数,部分版本的R仍会额外添加换行符或执行隐式转义,编码参数为空时会按系统默认编码输出,进一步破坏原文件字符
解决方案
场景1:仅合并tex文件,不需要修改任何内容(完全逐字符复制)
直接用二进制读写模式,完全不解析文件内容,绝对不会修改任何原文件字符、也不会添加额外内容:
# 按合并顺序填写源文件路径 tex_file_list <- c( "path/to/file/a.tex", "path/to/file/b.tex", "path/to/file/c.tex", "path/to/file/d.tex" ) # 二进制模式打开输出文件 out_conn <- file("Mother.tex", open = "wb") # 逐文件原封不动写入 for (tex_path in tex_file_list) { file_size <- file.info(tex_path)$size raw_content <- readBin(tex_path, what = "raw", n = file_size) writeBin(raw_content, out_conn) } close(out_conn)
该方案不需要关心源文件编码,完全逐字节复制,不会产生任何转义、编码转换、额外字符插入的问题,生成的文件和手动拼接的内容100%一致。
场景2:需要插入R计算结果到tex内容中
如果需要修改c.tex的内容插入R计算结果,就明确指定读写编码、用纯文本读写函数避免额外处理:
# 读取时明确指定源文件编码(你源文件是什么编码就填什么,比如GBK、UTF-8、CP936等) cont_a <- paste(readLines("path/to/file/a.tex", encoding = "UTF-8", warn = FALSE), collapse = "\n") cont_b <- paste(readLines("path/to/file/b.tex", encoding = "UTF-8", warn = FALSE), collapse = "\n") cont_d <- paste(readLines("path/to/file/d.tex", encoding = "UTF-8", warn = FALSE), collapse = "\n") # 插入R计算结果生成c部分内容 r_result <- 12345 # 这里替换为你的实际计算结果 cont_c <- paste0("content based on values in r: ", r_result, "\n\\end{frame}") # 合并所有内容 full_content <- paste(cont_a, cont_b, cont_c, cont_d, sep = "\n") # 写入时明确指定输出编码,按字节写入避免转义 writeLines(full_content, con = "Mother.tex", useBytes = TRUE, fileEncoding = "UTF-8")
warn = FALSE用于关闭“文件末尾无换行符”的警告,不影响内容读取useBytes = TRUE强制R按字节写入,不会自动转义LaTeX的反斜杠等特殊字符
内容的提问来源于stack exchange,提问作者Hans Peter
相关产品推荐
相关产品推荐

