R markdown PDF 无法正确显示代码块中的符号 ^

Dex*_*nan 6 markdown latex r pandoc r-markdown

我正在将 R markdown 编织为 PDF。我在图中的标签之一包含表达式 $\\times10^23$。

\n
---\ntitle: "Untitled"\noutput: pdf_document\ndate: "2023-06-24"\n---\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(echo = TRUE)\n```\n\n## R Markdown\n\n```{r}\nplot(1, type="n", ylab=expression(paste("Count (\\u00d7",10^23/L,")")))\n```\n\n
Run Code Online (Sandbox Code Playgroud)\n

然而,knitted PDF 显示不同的符号 10^23 和 10\xcb\x8623。由于这个不同的 Unicode 符号,复制代码将返回错误。

\n

在此输入图像描述

\n

感谢您的任何评论。

\n

Jon*_*ley 5

简短的回答

\n

由于我不完全理解的原因(见下文),为我解决这个问题的是使用 xelatex (或 lualatex)作为引擎来编译.tex为 pdf 的引擎。

\n

RStudio 中有一个设置,据说可以在 中进行全局设置Tools > Global Options ...,在左侧窗格中选择“Sweave”,然后将“使用:将 LaTex 排版为 PDF”旁边的下拉列表更改为“XeLaTeX”。

\n

在为我编译 R Markdown 文件时,更改该设置实际上并没有改变任何内容(默认值仍然是 pdflatex),但我可以通过替换output: pdf_document为以下内容来在文件的 YAML 标头中指定乳胶引擎:

\n
output:\n  pdf_document:\n    latex_engine: xelatex\n
Run Code Online (Sandbox Code Playgroud)\n

从标头中包含此内容的文件生成的 pdf 应该在 R 代码块(以及其他位置)中具有预期的插入字符。

\n

更长的答案

\n

R Markdown 输出为 pdf,首先运行 R 代码并收集输出(通过函数knit()),然后使用Pandoc.tex将生成的 Markdown 转换为 LaTeX ( ) ,然后使用TeX引擎将 LaTeX 文件编译为 pdf(请参阅R Markdown 文档了解详情)。pandoc 和 TeX 引擎(甚至可能是显示文件的 pdf 程序)都可以在屏幕上最终复制的字符中发挥作用。

\n

我知道的

\n

我们希望在输出中包含的字符(以便我们可以将其粘贴到控制台中)是 ASCII 代码 94 (^),它是一个“插入符 - 抑扬符”字符;但是我们从 R Markdown 的默认设置中得到的是 ASCII 代码 136 (\xcb\x86),这是一个“修饰符字母抑扬音重音”——换句话说,是一个下面没有字母的字符重音。不过,我不认为这是 R Markdown 的错。

\n

据我所知,Pandoc 做了一些与输出中插入符号的处理方式相关的事情。特别是,潘多克:

\n
    \n
  • r将带有语法高亮显示的所有代码(即带有 的所有代码块的内容echo=TRUEVerbatim从 LaTeX 包中放入自定义环境中favyvrb
  • \n
  • 将所有纯代码块(没有语法突出显示),包括控制台输出放入纯verbatim环境中(LaTeX 区分大小写,因此这与环境不同Verbatim
  • \n
  • 将文档中插入符号 (“^”) 字符的每个实例替换为\\^{}Latex 输出中的 --- 环境内容verbatim(即纯代码块,包括控制台输出)和数学模式 ( $...$) 除外。\n
      \n
    • 在数学模式下,“^”实际上产生一个指数,而\\^被 Pandoc 替换\\textasciicircum:在数学模式下不允许使用此命令,并且 Latex 引擎会生成警告,但会继续。讽刺的是,在这种情况下,pdf 中的输出是 ASCII 字符代码 136,这与 LaTeX 文档中的其他上下文不同(见下文)。
    • \n
    • 请注意,这\\^{}不仅在数学模式下不允许,而且在乳胶引擎编译时会导致错误。这可能就是 Pandoc\\textasciicircum在这种情况下使用的原因,尽管数学模式中有更好的替代方案(请参阅下面的链接)。
    • \n
    \n
  • \n
\n

在 Latex 中表示该字符的方法有很多种,具体取决于上下文(纯文本、逐字记录或数学模式)。有关一些选项和详细信息,请参阅“综合 LaTeX 符号列表”和此 StackOverflow 答案。

\n

\\^{}并且\\textasciicircum通常在乳胶中呈现为“等效”表示,至少在文本模式下。但根据我的经验,情况并非总是如此。通常(但并非总是),我发现使用 pdflatex 引擎,\\^{}会产生重音字符(ASCII 代码 136,不是我们想要的),而\\textasciicircum会产生插入符号(ASCII 代码 94,我们想要的)。\n这对我来说很有意义,考虑到\\^{}乳胶也使用该命令为字母添加扬抑符,通过将该字母放在大括号中作为参数(例如,\\^{o}生成“\xc3\xb4”)。因此,如果没有参数,该命令的语义就是不带字母的重音。

\n

我还知道 XeTeX 和 luaTeX 处理输入编码和字体的方式与 pdfTeX 不同。更改 TeX 引擎会导致输出中出现不同的字符,这一事实表明问题可能与字体有关,但也可能与它们本身处理命令的方式有关。但这就是我的知识和理解力所耗尽的地方。

\n

我不知道什么

\n

为什么 Pandoc 将“^”替换为“ \\^{}”而不是“ \\textasciicircum”?我不知道,但我已经在 pandoc-discuss 邮件列表上提出了这个问题,并且在撰写本文时我正在等待回复。 编辑:这是 Pandoc 中的错误吗?

\n

为什么 XeTeX 和 luaTeX 的渲染方式\\^{}与 pdfTeX 不同?以我有限的经验,\\^{}并且\\textasciicircum会有所不同(但在“独立”文档类中则不然,我不明白为什么),但在使用 xelatex 或 lualatex 时它们都会产生相同的输出字符。

\n

奇怪的是,“综合乳胶符号列表”中的 ASCII 代码 94(表 583)和 136(表 585)条目似乎颠倒了:根据asciivalue.com ,出现在 ASCII 字符代码 94 旁边的字符实际上是 136,并且反之亦然。但显示的字符是由所示命令生成的:即,\\^{}生成 ASCII 字符代码 136 和\\textasciicircum代码 94,尽管文档在表中声明了这一点。这是文档中的错误,还是 pdfLaTeX 中的错误?或者是其他东西?由于这些在功能和语义上是不同的 ASCII 字符,为什么本文档(和其他文档)声称“ \\^{}”和“\\textasciicircum ”?是等价的?

\n