在2025-02-23迁移博客到本网站时遇到一些问题,主要是因为在相关与回归部分使用plotly
包制作了一个三维图形,在以前的Rmarkdown博客中,因为未知原因导致从2024年中的一次更新开始就无法在生成PDF文件,所以这个问题没有被发现。
简而言之就是使用plotly
绘制如图所示的双元正态分布图形后,如果Quarto被指定要生成PDF文件,需要载入更多的R包且更新TeXLive的宏包来提供支持。
## 安装和加载所需的包
# install.packages("plotly")
# install.packages("mvtnorm")
library ( plotly )
library ( mvtnorm )
library ( webshot2 )
# 创建网格数据
x <- seq ( 150 , 190 , length.out = 100 )
#身高150-190,等距的100个值
y <- seq ( 50 , 80 , length.out = 100 )
#体重50-80,等距的100个值
grid <- expand.grid ( X = x , Y = y )
#生成 x 和 y 的所有组合,用于构建一个网格数据框,以便计算多元正态分布的概率密度。
# 设置均值和协方差矩阵
mu <- c ( 170 , 65 )
#设置双元正态分布的均值向量,表示均值分别为身高 170 cm 和体重 65 kg
sigma <- matrix ( c ( 100 , 20 , 20 , 25 ) , nrow = 2 )
#设置协方差矩阵,表示身高的方差为 100,体重的方差为 25,身高和体重之间的协方差为 20
# 计算概率密度
z <- dmvnorm ( as.matrix ( grid ) , mean = mu , sigma = sigma )
#计算每个网格点上双元正态分布的概率密度。
# 将概率密度矩阵转换为适合绘图的形状
z_matrix <- matrix ( z , nrow = 100 , ncol = 100 )
# 绘制三维表面图
plot_ly ( x = x , y = y , z = z_matrix , type = "surface" ) %>%
layout ( title = list ( text = "双元正态分布的三维概率密度图" , y= 0.95 ) ,
scene = list ( xaxis = list ( title = "身高 (cm)" ) ,
yaxis = list ( title = "体重 (kg)" ) ,
zaxis = list ( title = "概率密度" ) ) )
上述图像在被转换为PDF文件时,会发生报错:Quarto 文档中包含了一些生成 HTML 输出的函数(比如交互式图表或其他 HTML 小部件),但你当前的目标输出格式是 PDF。由于 PDF 是静态格式,无法直接渲染 HTML 内容,Quarto 会报错并停止执行。
解决方案2
增加支持:如果你仍想输出 PDF,但希望将 HTML 小部件作为静态截图嵌入,可以安装 R 的 webshot
或 webshot2
包。Quarto 会利用它们将 HTML 内容转换为图片。
需要安装:
然后在这段程序的前部导入该包:library(webshot2)
。
也可以使用
但是使用 webshot
还需要安装 PhantomJS
webshot :: install_phantomjs ( )
解决方案3:启用 prefer-html: true 选项
如果你不在乎 HTML 内容在 PDF 中不可见,可以通过添加 prefer-html: true
来跳过这个错误。这种方法会忽略 HTML 输出,PDF 中不会显示相关内容。
解决方法 4:检查并移除 HTML 输出代码
如果你的目标是纯 PDF 输出,且不需要 HTML 小部件,可以检查文档中的代码块,移除或调整生成 HTML 的部分。例如:
如果使用了 R 的 plotly
或 htmlwidgets
,将其替换为静态图形库(如 ggplot2
)。
检查是否有 {r, results='asis'}
或其他生成 HTML 的设置,改为适合 PDF 的输出。
Quarto调用TeXLive报错
在使用方法一进行完善的过程中,terminal输出了一些关于TeX Live的信息:
TeX Live infrastructure update in progress ...
TeX Live infrastructure update in progress ...
Detailed command logging to "C:\texlive\2024\temp\update-self.log"
self update: texlive.infra ( 70084 - > 73495)
texlive.infra.windows ( 69813 - > 71447)
tlperl.windows ( 69939 - > 71515)
Infrastructure update finished successfully.
You may now close this window.
这是因为Quarto的预览过程中触发了TeX Live的更新,这里的输出显示已完成更新,但是preview .qmd
文档仍然不顺利,怀疑没有正确更新,且因为太晚关闭了电脑,导致更新中断。
试着从terminal对TeX Live进行更新,在cmd中使用如下命令
tlmgr update --self --all
你的Windows电脑可能会和我一样报错:
C:\Users\asus > tlmgr update --self --all
Locale 'English_United States.936' is unsupported, and may crash the interpreter.
这是因为:
当你运行 tlmgr update --self --all
来更新 TeX Live 时,出现了 Locale 'English_United States.936' is unsupported, and may crash the interpreter
的警告。这表明 TeX Live 的包管理器(tlmgr
)在你的系统区域设置(locale)下遇到了兼容性问题,可能是因为你的 Windows 系统使用了中文(代码页 936,简体中文 GBK)作为默认区域设置,而 tlmgr
默认期望一个支持的区域设置(如 UTF-8 或英语)。
以下是解决这个问题的步骤:
方案 1:检查系统区域设置
查看当前区域设置 :
按 Win + R
,输入 intl.cpl
,回车,打开“区域”设置。
在“格式”选项卡中,查看当前格式(可能是“中文(简体,中国)”)。
点击“管理”选项卡 -> “更改系统区域设置”,查看“当前系统区域设置”(可能是“中文(简体,中国)”)。
问题原因 :
代码页 936(中文 GBK)不是 TeX Live 的 tlmgr
完全支持的区域设置,可能导致编码或解释器错误。
方案 2:临时更改区域设置运行 tlmgr
为了让 tlmgr
正常工作,可以临时将区域设置为英语(美国),运行更新后再改回。
操作步骤:
更改系统区域设置 :
按 Win + R
,输入 intl.cpl
。
点击“管理”选项卡 -> “更改系统区域设置”。
在下拉菜单中选择“英语(美国)”(English (United States))。
勾选“Beta: 使用 UTF-8 提供全球语言支持”(推荐),然后点击“确定”。
系统会提示重启,点击“立即重启”。
运行更新 :
重启后,打开命令行(cmd
)。
输入:
tlmgr update --self --all
观察是否还有错误,等待更新完成。
恢复区域设置 (可选):
更新完成后,重复上述步骤,将区域设置改回“中文(简体,中国)”,再次重启。
方案 3:使用环境变量绕过区域问题
如果你不想更改系统区域设置,可以通过设置环境变量临时调整 tlmgr
的运行环境。
操作步骤:
打开命令行(cmd
)。
输入以下命令设置临时环境变量:
紧接着运行更新:
tlmgr update --self --all
检查是否成功执行。如果仍然报错,尝试:
set LANG=en_US.UTF-8
tlmgr update --self --all
说明:
LC_ALL
或 LANG
是控制区域设置的环境变量,设置为 en_US.UTF-8
可以让 tlmgr
在英语环境下运行,避免中文编码问题。
这种方法无需重启,适合临时解决。
方案 4:验证更新结果
更新完成后,检查 TeX Live 是否正常工作: 1. 运行: tlmgr info --list installed
查看已安装的包列表,确保更新生效。 2. 返回 Quarto 项目,运行: quarto preview
确认是否还有 TeX 相关的问题。
额外建议
检查 TeX Live 安装 : 如果问题持续存在,可能是 TeX Live 安装不完整。可以尝试重新安装:
使用 PowerShell 或 WSL : 如果 cmd
仍然有问题,可以尝试在 PowerShell 或 Windows Subsystem for Linux (WSL) 中运行 tlmgr
,这些环境可能更好地处理区域设置。
推荐方案
快速解决 :用 Step 3 设置 LC_ALL=en_US.UTF-8
,无需重启,最简单。
彻底解决 :用 Step 2 临时改为英语区域设置,更新后再改回。
我采用了方案 1,在cmd中输入命令后,出现如下:
C:\Users\asus > tlmgr update --self --all
tlmgr.pl: package repository https://mirrors.hust.edu.cn/CTAN/systems/texlive/tlnet ( not verified: gpg unavailable)
tlmgr.pl: saving backups to C:/texlive/2024/tlpkg/backups
tlmgr.pl: no self-updates for tlmgr available
tlmgr.pl: skipping forcibly removed package: extractbb
tlmgr.pl: skipping forcibly removed package: extractbb.windows
[ 1/764, ?? :?? /?? :?? ] update: ebgaramond [8780k] ( 66604 - > 71069) ... done
[ 2/764, 00:16/42:39] update: ebgaramond-maths [567k] ( 52168 - > 74174) ... done
表示在更新中,这个过程大概需要45分钟左右。