使用 R Markdown 时,如何在枚举环境中嵌套代码块?

使用 R Markdown 时,如何在枚举环境中嵌套代码块?

当我尝试使用此代码执行此操作时:

---
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

基本上有两件事导致示例代码中出现错误:

  1. 默认情况下,knitr 会在 R 输出中添加前缀##,但您的 TeX 文件中不能包含该前缀。您必须用其他内容代替它。
  2. 代码块不能缩进,因此您必须原谅您的强迫症并将块刷新到源代码的左侧。

因此,仅这一点就可以改进你的代码:

\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} 结束。


总结

  1. 在序言中更新你的命令(例如\newcommand{\benum}{\begin{enumerate}}:)
  2. 不要缩进你的代码块
  3. 使用results="asis"

答案2

当我们点击“编织为 PDF”选项时,R Markdown 会生成一个 .tex 文件。如果 .tex 文件不包含任何错误的 Latex 命令,它将被转换为 PDF,并且 R Markdown 会将其删除(我们永远不会看到它)。我们计划看看如果我们将 R 代码块放在任何列表之外,它会变成什么样的 latex 格式。如果我们得到它,那么我们可以将它放在列表中。假设我们想在有序列表(具有正确格式)内编写一个仅包含 print("Test") 的代码块。步骤:

  1. 首先,我们将块放在任何列表之外。
print("Test")
  1. 但是,我们如何才能看到 .tex 文件。我们输入了错误的 Latex 命令,这样 .tex 文件就不会转换为 PDF,R Markdown 也无法删除它。就像我们输入的 \item(没有 \begin{itemize} 和 \end{itemize})。
  2. 在任何文本编辑器中打开 .tex 文件,复制代码块以及输出(如果有)。在我的例子中,代码是这样的,
\begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{print}\NormalTok{(}\StringTok{"Test"}\NormalTok{)}
\end{Highlighting}
\end{Shaded}

\begin{verbatim}
\## [1] "Test"
\end{verbatim}
  1. 现在,在原始 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}
  1. 删除错误的 Latex 命令。
  2. 点击“编织为 PDF”。在我的例子中,结果是: 在此处输入图片描述

答案3

逐字输出并不完美,但这是一个简单的解决方案:

\begin{itemize}
\item Solution:
  \begin{verbatim}
  ```{r}
  t.test(dados, alternative="greater") 
  ```
  \end{verbatim}
\end{itemize}

相关内容