You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R/exams包:如何在answerlist中保留代码块的换行格式?

解决schoice题型选项中显示带换行代码块的问题

在R/exams的schoice题型里,answerlist的默认预处理会移除换行,导致verbatim或markdown代码块变成单行。可以通过以下几种方法解决:

方法1:嵌套verbatim环境(原生LaTeX)

直接在answerlist的选项中使用verbatim环境,以原始LaTeX语法编写,避开exams的换行处理逻辑。在Rmd试题文件中示例写法:

Question
========
以下哪个代码片段的执行结果正确?

Answerlist
----------
- \begin{verbatim}
x <- 1:5
result <- sum(x)
print(result)
\end{verbatim}
- \begin{verbatim}
x <- c(2,4,6)
result <- mean(x)
print(result)
\end{verbatim}

这种写法会让生成的.tex文件保留verbatim环境内的换行,编译PDF时就能正常显示多行代码。

方法2:用R代码生成answerlist(更可靠)

如果直接写原始LaTeX仍有问题,可以通过R代码块生成answerlist,借助asis_output确保换行被完整保留:

Question
========
以下哪个代码片段的执行结果正确?

```{r, echo=FALSE}
# 定义带换行的选项内容
answer_options <- c(
  "\\begin{verbatim}\nx <- 1:5\nresult <- sum(x)\nprint(result)\\end{verbatim}",
  "\\begin{verbatim}\nx <- c(2,4,6)\nresult <- mean(x)\nprint(result)\\end{verbatim}"
)

# 生成answerlist,指定markup为latex
answerlist(answer_options, markup = "latex")
## 方法3:使用listings包(支持语法高亮)
如果需要代码语法高亮效果,可以在试题的前置设置中引入`listings`包,再用`lstlisting`环境包裹代码:

首先在Rmd开头添加前置配置:
```r
```{r, echo=FALSE}
knitr::opts_chunk$set(echo = FALSE)
exams::exams_setup(
  tex = list(
    preamble = "\\usepackage{listings}\n\\lstset{language=R, basicstyle=\\ttfamily, breaklines=true}"
  )
)
然后在answerlist中使用:
```r
Answerlist
----------
- \begin{lstlisting}
x <- 1:5
result <- sum(x)
print(result)
\end{lstlisting}
- \begin{lstlisting}
x <- c(2,4,6)
result <- mean(x)
print(result)
\end{lstlisting}

这种方式不仅保留换行,还能给R代码添加语法高亮,提升可读性。

关键原因说明

answerlist的默认文本预处理会将所有换行替换为空格,所以直接用markdown的```代码块或者未嵌套的verbatim都会丢失换行。必须通过原始LaTeX环境(verbatim/lstlisting)包裹代码,确保这些环境内的换行在生成.tex文件时被完整保留。

内容的提问来源于stack exchange,提问作者caiohamamura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:33:23