![使用 R Markdown 时,如何在枚举环境中嵌套代码块?](https://linux22.com/image/300760/%E4%BD%BF%E7%94%A8%20R%20Markdown%20%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E5%9C%A8%E6%9E%9A%E4%B8%BE%E7%8E%AF%E5%A2%83%E4%B8%AD%E5%B5%8C%E5%A5%97%E4%BB%A3%E7%A0%81%E5%9D%97%EF%BC%9F.png)
当我尝试使用此代码执行此操作时:
---
title: "Title"
author: "Me"
date: "31 October 2014"
output:
pdf_document:
includes:
in_header: includes.sty
---
\begin{enumerate}[label=\textbf{\arabic*})]
\item
\begin{enumerate}
\item
```{r}
print("test")
```
\end{enumerate}
\end{enumerate}
includes.sty 仅包含:
\usepackage{enumitem}
R studio 无法将该块识别为有效的代码块(没有语法高亮),并且在编译时出现错误:
! You can't use `macro parameter character #' in horizontal mode.
l.199 #
还有其他方法可以做到这一点吗?
答案1
基本上有两件事导致示例代码中出现错误:
- 默认情况下,knitr 会在 R 输出中添加前缀
##
,但您的 TeX 文件中不能包含该前缀。您必须用其他内容代替它。 - 代码块不能缩进,因此您必须原谅您的强迫症并将块刷新到源代码的左侧。
因此,仅这一点就可以改进你的代码:
\begin{enumerate}
\item
\begin{enumerate}
\item
```{r, comment="", results="asis"}
print("test")
```
\end{enumerate}
\end{enumerate}
您的 PDF 应如下所示:
请注意,最终产品是一个巨大的 TeX-knitr 混合体。它解释了 R markdown,但以 LaTeX 打印了所有内容。请注意三引号如何转换为双引号 + 单引号。删除results="asis"
只会让事情变得更糟,因为答案也会得到这些引号。
我找到了一个Stackoverflow 上的精彩答案这展示了获得正确格式的一个很好的技巧。你只需要重命名你的环境:
---
output: pdf_document
header-includes:
- \newcommand{\benum}{\begin{enumerate}}
- \newcommand{\eenum}{\end{enumerate}}
---
\benum
\item
\benum
\item
```{r, results="asis"}
print("test")
```
\eenum
\eenum
结果:
删除results="asis"
应该会为 R 输出提供更好的(即等宽)格式,但它只会在我的计算机上产生以下错误:
LaTeX 错误:\begin{enumerate} 在输入行 664 处以 \end{document} 结束。
总结
- 在序言中更新你的命令(例如
\newcommand{\benum}{\begin{enumerate}}
:) - 不要缩进你的代码块
- 使用
results="asis"
答案2
当我们点击“编织为 PDF”选项时,R Markdown 会生成一个 .tex 文件。如果 .tex 文件不包含任何错误的 Latex 命令,它将被转换为 PDF,并且 R Markdown 会将其删除(我们永远不会看到它)。我们计划看看如果我们将 R 代码块放在任何列表之外,它会变成什么样的 latex 格式。如果我们得到它,那么我们可以将它放在列表中。假设我们想在有序列表(具有正确格式)内编写一个仅包含 print("Test") 的代码块。步骤:
- 首先,我们将块放在任何列表之外。
print("Test")
- 但是,我们如何才能看到 .tex 文件。我们输入了错误的 Latex 命令,这样 .tex 文件就不会转换为 PDF,R Markdown 也无法删除它。就像我们输入的 \item(没有 \begin{itemize} 和 \end{itemize})。
- 在任何文本编辑器中打开 .tex 文件,复制代码块以及输出(如果有)。在我的例子中,代码是这样的,
\begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{print}\NormalTok{(}\StringTok{"Test"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}
\begin{verbatim}
\## [1] "Test"
\end{verbatim}
- 现在,在原始 R Markdown 文件中,将其粘贴到 \item 之后。
\begin{enumerate}
\item \begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{print}\NormalTok{(}\StringTok{"Test"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}
\begin{verbatim}
## [1] "Test"
\end{verbatim}
\end{enumerate}
答案3
逐字输出并不完美,但这是一个简单的解决方案:
\begin{itemize}
\item Solution:
\begin{verbatim}
```{r}
t.test(dados, alternative="greater")
```
\end{verbatim}
\end{itemize}