Quarto与LaTeX的记录

Author

Simonzhou

Published

2025年2月24日 00:00

Modified

2025年3月2日 23:27

在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 会报错并停止执行。

1 解决方案1

此章节不转换为PDF格式。

2 解决方案2

增加支持:如果你仍想输出 PDF,但希望将 HTML 小部件作为静态截图嵌入,可以安装 R 的 webshotwebshot2 包。Quarto 会利用它们将 HTML 内容转换为图片。

需要安装:

install.packages("webshot2")

然后在这段程序的前部导入该包:library(webshot2)

也可以使用

install.packages("webshot")

但是使用 webshot 还需要安装 PhantomJS

webshot::install_phantomjs()

3 解决方案3:启用 prefer-html: true 选项

如果你不在乎 HTML 内容在 PDF 中不可见,可以通过添加 prefer-html: true 来跳过这个错误。这种方法会忽略 HTML 输出,PDF 中不会显示相关内容。

  • 在 .qmd 文件的 YAML 前置元数据中添加:

    format: pdf: toc: true # 可选{yaml}

4 解决方法 4:检查并移除 HTML 输出代码

如果你的目标是纯 PDF 输出,且不需要 HTML 小部件,可以检查文档中的代码块,移除或调整生成 HTML 的部分。例如:

  • 如果使用了 R 的 plotlyhtmlwidgets,将其替换为静态图形库(如 ggplot2)。

  • 检查是否有 {r, results='asis'} 或其他生成 HTML 的设置,改为适合 PDF 的输出。

示例:

将交互式图表改为静态图表:

# 原代码(生成 HTML)
library(plotly)
plot_ly(data, x = ~x, y = ~y, type = "scatter")

# 修改后(适合 PDF)
library(ggplot2)
ggplot(data, aes(x = x, y = y)) + geom_point()

5 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 或英语)。

以下是解决这个问题的步骤:


5.1 方案 1:检查系统区域设置

  1. 查看当前区域设置
    • Win + R,输入 intl.cpl,回车,打开“区域”设置。
    • 在“格式”选项卡中,查看当前格式(可能是“中文(简体,中国)”)。
    • 点击“管理”选项卡 -> “更改系统区域设置”,查看“当前系统区域设置”(可能是“中文(简体,中国)”)。
  2. 问题原因
    • 代码页 936(中文 GBK)不是 TeX Live 的 tlmgr 完全支持的区域设置,可能导致编码或解释器错误。

5.2 方案 2:临时更改区域设置运行 tlmgr

为了让 tlmgr 正常工作,可以临时将区域设置为英语(美国),运行更新后再改回。

操作步骤:

  1. 更改系统区域设置
    • Win + R,输入 intl.cpl
    • 点击“管理”选项卡 -> “更改系统区域设置”。
    • 在下拉菜单中选择“英语(美国)”(English (United States))。
    • 勾选“Beta: 使用 UTF-8 提供全球语言支持”(推荐),然后点击“确定”。
    • 系统会提示重启,点击“立即重启”。
  2. 运行更新
    • 重启后,打开命令行(cmd)。

    • 输入:

      tlmgr update --self --all
    • 观察是否还有错误,等待更新完成。

  3. 恢复区域设置(可选):
    • 更新完成后,重复上述步骤,将区域设置改回“中文(简体,中国)”,再次重启。

5.3 方案 3:使用环境变量绕过区域问题

如果你不想更改系统区域设置,可以通过设置环境变量临时调整 tlmgr 的运行环境。

操作步骤:

  1. 打开命令行(cmd)。

  2. 输入以下命令设置临时环境变量:

    set LC_ALL=en_US.UTF-8
  3. 紧接着运行更新:

    tlmgr update --self --all
  4. 检查是否成功执行。如果仍然报错,尝试:

    set LANG=en_US.UTF-8
    tlmgr update --self --all

说明:

  • LC_ALLLANG 是控制区域设置的环境变量,设置为 en_US.UTF-8 可以让 tlmgr 在英语环境下运行,避免中文编码问题。
  • 这种方法无需重启,适合临时解决。

5.4 方案 4:验证更新结果

更新完成后,检查 TeX Live 是否正常工作: 1. 运行: tlmgr info --list installed 查看已安装的包列表,确保更新生效。 2. 返回 Quarto 项目,运行: quarto preview 确认是否还有 TeX 相关的问题。


5.5 额外建议

  • 检查 TeX Live 安装: 如果问题持续存在,可能是 TeX Live 安装不完整。可以尝试重新安装:
    • 下载最新版 TeX Live(tug.org/texlive)。
    • 安装时选择“完整安装”以确保所有组件齐全。
  • 使用 PowerShell 或 WSL: 如果 cmd 仍然有问题,可以尝试在 PowerShell 或 Windows Subsystem for Linux (WSL) 中运行 tlmgr,这些环境可能更好地处理区域设置。

5.6 推荐方案

  • 快速解决:用 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分钟左右。