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
相关产品推荐
相关产品推荐

