如何在exams2nops不同试题分区配置强制/禁止分页规则
exams2nops 分区差异化分页实现方案
核心思路是按题目类型分组生成试卷片段,单独配置分页规则后合并输出,不需要魔改全局LaTeX环境,也不会出现不必要的纸张浪费,同时彻底解决图表、题干被分页截断的问题。
1. 前置准备:按分区整理题目文件
不要把三类题目混在同一个文件列表中传入exams2nops,先按分类单独存放:
- 分区1(纯文本多选题、禁止分页):所有无图、篇幅短的多选题存入单独文件夹,单题内容高度控制在2/3页以内,避免触发同页约束导致的异常留白
- 分区2(带图表多选题、强制分页):所有配图表、需要对照作答的多选题存入单独文件夹,编写题目时固定图片尺寸,不要留LaTeX浮动空间
- 分区3(开放题、强制分页):所有开放题(无论是否带图)存入单独文件夹
2. 分区块生成试卷片段,单独配置分页规则
exams2nops本质是生成LaTeX代码后编译为PDF,给不同分区传入独立的header参数,就能实现互不干扰的分页规则:
分区1配置(禁分页、无强制换页)
用LaTeX原生samepage环境包裹单道题目,只要题目高度不超过单页,就不会出现题干、选项被分页截断的问题,同时题间不强制换页,节省纸张:
p1 <- exams2nops( file = list.files("q1_plain_mchoice/", full.names = TRUE), n = 1, # 替换为实际需要的试卷份数 dir = "temp_parts/", header = c( "\\renewenvironment{question}{\\begin{samepage}\\item}{\\end{samepage}}" ) )
之前直接用
\nopagebreak不生效,是因为该命令只对紧邻的内容生效,无法覆盖整个题目、选项的范围,用samepage包裹整个question环境才能实现完整的同页约束。
分区2、3配置(单题后强制分页)
这两类题目单题占用空间大,配置题后自动分页,保证图表、题干、答题区在同一页:
# 分区2:带图表多选题 p2 <- exams2nops( file = list.files("q2_plot_mchoice/", full.names = TRUE), n = 1, dir = "temp_parts/", header = "\\renewenvironment{question}{\\item}{\\clearpage}" ) # 分区3:开放题 p3 <- exams2nops( file = list.files("q3_open/", full.names = TRUE), n = 1, dir = "temp_parts/", header = "\\renewenvironment{question}{\\item}{\\clearpage}" )
这里用\clearpage代替\newpage,可以顺带处理浮动图片的位置,避免图片飘到分页处被截断。
3. 合并分区输出最终试卷
三个分区的试卷片段生成后,调用exams包内部的合并函数拼接内容,直接输出完整PDF即可:
# 合并三个分区的nops对象 final_exam <- exams:::nops_merge(list(p1, p2, p3)) # 编译输出最终PDF exams:::nops_write_pdf(final_exam, dir = "final_output/")
优化提示
- 带图表的题目编写时,直接在Rmd/Rnw代码块中固定图片宽高,比如设置
fig.height=4, fig.width=6,不要让LaTeX自动调整图片尺寸,减少浮动错位概率 - 分区1的纯文本题如果出现个别超长题,直接移到分区2即可,不需要调整全局配置
- 不需要额外引入第三方LaTeX包,
samepage是LaTeX原生环境,不会和nops的默认模板冲突
内容的提问来源于stack exchange,提问作者JSP
相关产品推荐
相关产品推荐

