使用 exams2nops 创建可填写的 PDF 表单
Create fillable PDF form with exams2nops
我们考虑通过 exams2nops
将开卷考试作为 可填写的 PDF 表格 分发。这个想法是学生不打印 PDF 并用笔标记他们的答案,而是在他们的 PDF 中以电子方式填写他们的答案(例如使用 Acrobat Reader),然后将该 PDF 发回给我们(或上传)通过 Moodle)。那么,PDF就是"scanned"/从PDF中提取答案。
目前,MC/SC 个答案的复选框不可点击;自由文本答案的文本字段也可以是可填写的文本输入字段。当前的 PDF 导出不执行此操作。
有人做过吗?如果我想实现这个,哪里是一个好的起点?也许 nops.tex?
(我们知道导出到 Moodle 中的交互式测验是另一种选择)。
TL;DR
exams2nops()
不支持这个并且不会朝这个方向扩展,因为它的重点是为 printing/scanning/etc. 生成 PDF 考试
exams2pdf()
可以自定义使用不同的 LaTeX 模板,您可以尝试使用 {hyperref}
包设置合适的模板。
- 对生成的 PDF 表单的支持在 PDF 查看器之间有很大差异,通常 Acrobat Reader 是唯一具有良好支持的。
- 我对学生系统的异构性以及通过电子邮件发送解决方案的个人经验是,这不是一个非常可靠的解决方案,但会成为很多问题的根源。就个人而言,我会避免走这条路。
- 如果您的大学拥有 Moodle 系统,我建议您通过
exams2moodle()
生成考试。至少系统稳定的责任在大学。
详情:
通过使用 {hyperref}
包,您可以使用 {Form}
环境以及 \CheckBox{}
、\TextEntry{}
等命令。这里给出一个简要概述:https://tex.stackexchange.com/questions/14842/creating-fillable-pdfs
更详细的工作示例可在以下位置找到:https://martin-thoma.com/creating-pdf-forms-with-latex/
基于这些,我改编了 R/exams 包中提供的 exam.tex
模板,并设置了一个 form.tex
模板。完整的 LaTeX 代码包含在下面。这会尝试执行以下操作:
- 设置完成后可以通过电子邮件提交的表单。
- 表单包含 "fixed" 个姓名和学号字段。
- 然后它设置命令
\exnum
、\exstring
、exmchoice
等可以被exams2pdf()
使用的命令。有关详细信息,请参阅 vignette("exams", package = "exams")
中的第 3 节。因此,这些命令会根据给定考试的需要经常重复。
- 最后有 "Submit" 或 "Clear" 表单的按钮。
为了便于说明,请尝试:
exams2pdf(
c("deriv.Rmd", "swisscapital.Rmd", "boxplots.Rmd", "ttest.Rmd", "function.Rmd", "lm.Rmd"),
template = "form.tex"
)
下面的 form.tex
需要在您当前的工作目录中。
结果是 form1.pdf
自动显示在您的默认 PDF 查看器中(请参阅 options(pdfviewer = ...)
)。或者,您也可以添加参数 dir = "."
以将文件存储在当前工作目录中。
对我来说,在 Debian GNU/Linux 上,使用 TeXLive 这可以工作并生成一个 PDF 文件,可以使用 Evince PDF 查看器查看和填写。但是,"Submit" 和 "Clear" 都不起作用。
当我在 Windows 10 中的 Acrobat Reader 下打开同一个文件时,只有 Name/ID 的 TextEntry 字段起作用,其他的不起作用。复选框有效,但 (a) 的所有复选框都已链接,所有 (b) 等也是如此。
我的印象是,像这样即时编写 {Form}
不适用于 Acrobat Reader。但我希望能指出如何解决这个问题。另一种方法是在所有表单元素等中使用独特的 name
标签准确编码特定考试所需的表单
奖金说明:
下面的模板还激活了 {attachfile}
LaTeX 包,该包可用于将文件(例如数据集)嵌入到 PDF 中。这对我有用,但只适用于 Acrobat Reader。为了自动将所有 \url{}
命令(为上面使用的 lm
练习创建的命令)转换为 \attachfile{}
命令,exams2pdf()
的开发版本获得了一个参数 attachfile = FALSE
可以设置为 TRUE
。有关更多详细信息,请参阅 R-Forge R/exams 论坛中的此主题:
https://R-Forge.R-project.org/forum/forum.php?thread_id=32091&forum_id=4377&group_id=1337
LaTeX 模板: form.tex
\documentclass[10pt,a4paper]{article}
%% packages
\usepackage[utf8]{inputenc}
\usepackage{a4wide,color,verbatim,Sweave,url,xargs,amsmath,booktabs,longtable,eurosym}
%%% %% optionally: two-column layout for exercise form
%%% \usepackage{multicol}
%% embed supplementary data files etc.
\usepackage{attachfile}
\attachfilesetup{color=0.5 0 0}
%% support PDF forms
\usepackage{hyperref}
%% new environments
\newenvironment{question}{\item}{}
\newenvironment{solution}{\comment}{\endcomment}
\newenvironment{answerlist}{\renewcommand{\labelenumi}{(\alph{enumi})}\begin{enumerate}}{\end{enumerate}}
%% paragraphs
\setlength{\parskip}{0.7ex plus0.1ex minus0.1ex}
\setlength{\parindent}{0em}
%% compatibility with pandoc
\providecommand{\tightlist}{\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
\setkeys{Gin}{keepaspectratio}
%% fonts: Helvetica
\usepackage{helvet}
\IfFileExists{sfmath.sty}{
\RequirePackage[helvet]{sfmath}
}{}
\renewcommand{\sfdefault}{phv}
\renewcommand{\rmdefault}{phv}
\newcommandx{\exmchoice}[9][2=-,3=-,4=-,5=-,6=-,7=-,8=-,9=-]{%
\CheckBox[name=a, width=1em]{(a)}~~%
\if #2- \else \CheckBox[name=b, width=1em]{(b)}~~ \fi%
\if #3- \else \CheckBox[name=c, width=1em]{(c)}~~ \fi%
\if #4- \else \CheckBox[name=d, width=1em]{(d)}~~ \fi%
\if #5- \else \CheckBox[name=e, width=1em]{(e)}~~ \fi%
\if #6- \else \CheckBox[name=f, width=1em]{(f)}~~ \fi%
\if #7- \else \CheckBox[name=g, width=1em]{(g)}~~ \fi%
\if #8- \else \CheckBox[name=h, width=1em]{(h)}~~ \fi%
\if #9- \else \CheckBox[name=i, width=1em]{(i)}~~ \fi%
}
\newcommandx{\exclozechoice}[9][2=-,3=-,4=-,5=-,6=-,7=-,8=-,9=-]{\setcounter{enumiii}{1}%
\CheckBox[name=ca, width=1em]{\roman{enumiii}.} \stepcounter{enumiii}%
\if #2- \else \CheckBox[name=cb, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #3- \else \CheckBox[name=cc, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #4- \else \CheckBox[name=cd, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #5- \else \CheckBox[name=ce, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #6- \else \CheckBox[name=cf, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #7- \else \CheckBox[name=cg, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #8- \else \CheckBox[name=ch, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #9- \else \CheckBox[name=ci, width=1em]{\roman{enumiii}.} \fi%
}
\newcommand{\exnum}[9]{\TextField[name=num, width=4cm]{}}
\newcommand{\exstring}[1]{\TextField[name=string, width=4cm]{}}
%% new commands
\makeatletter
\newcommand{\ID}[1]{\def\@ID{#1}}
\newcommand{\Date}[1]{\def\@Date{#1}}
\ID{00001}
\Date{YYYY-MM-DD}
%% \exinput{header}
\newcommand{\myID}{\@ID}
\newcommand{\myDate}{\@Date}
\makeatother
%% headings
\markboth{\textnormal{\bf \large Statistics Exam: \myID}}%
{\textnormal{\bf \large Statistics Exam: \myID}}
\pagestyle{myheadings}
\begin{document}
%% title page
\thispagestyle{empty}
{\sf
\textbf{\LARGE{R University}}
\textbf{\large{Statistics Exam \myDate \hfill Exam ID \myID}}
\vspace*{2cm}
\begin{Form}[action=mailto:info@example.com,encoding=html,method=post]
\begin{tabular}{ll}
\textbf{Name} & \TextField[name=Name, width=10cm]{}\
\textbf{Student ID} & \TextField[name=ID, width=10cm]{}\
\end{tabular}
\vspace*{1cm}
%%% \begin{multicols}{2}
%% \exinput{questionnaire}
%%% \end{multicols}
\Submit{Submit} ~~ \Reset{Clear}
\end{Form}
}
\newpage
\begin{enumerate}
%% \exinput{exercises}
\end{enumerate}
\end{document}
我们将这样组织考试:
- 学生下载使用 exams2nops 创建的 pdf
- 学生使用 Adobe Acrobat Reader DC(免费:https://get.adobe.com/de/reader/?promoid=P79NQR4R&mv=other)打开 pdf 并通过“符号”选项用 X 标记方框
- 学生将考试的第一个填写页面上传回来(通过打印为 pdf)。这样做的好处是设置的十字架不能再更改了。
- 正常的考试评估流程开始...
我们考虑通过 exams2nops
将开卷考试作为 可填写的 PDF 表格 分发。这个想法是学生不打印 PDF 并用笔标记他们的答案,而是在他们的 PDF 中以电子方式填写他们的答案(例如使用 Acrobat Reader),然后将该 PDF 发回给我们(或上传)通过 Moodle)。那么,PDF就是"scanned"/从PDF中提取答案。
目前,MC/SC 个答案的复选框不可点击;自由文本答案的文本字段也可以是可填写的文本输入字段。当前的 PDF 导出不执行此操作。
有人做过吗?如果我想实现这个,哪里是一个好的起点?也许 nops.tex?
(我们知道导出到 Moodle 中的交互式测验是另一种选择)。
TL;DR
exams2nops()
不支持这个并且不会朝这个方向扩展,因为它的重点是为 printing/scanning/etc. 生成 PDF 考试
exams2pdf()
可以自定义使用不同的 LaTeX 模板,您可以尝试使用{hyperref}
包设置合适的模板。- 对生成的 PDF 表单的支持在 PDF 查看器之间有很大差异,通常 Acrobat Reader 是唯一具有良好支持的。
- 我对学生系统的异构性以及通过电子邮件发送解决方案的个人经验是,这不是一个非常可靠的解决方案,但会成为很多问题的根源。就个人而言,我会避免走这条路。
- 如果您的大学拥有 Moodle 系统,我建议您通过
exams2moodle()
生成考试。至少系统稳定的责任在大学。
详情:
通过使用 {hyperref}
包,您可以使用 {Form}
环境以及 \CheckBox{}
、\TextEntry{}
等命令。这里给出一个简要概述:https://tex.stackexchange.com/questions/14842/creating-fillable-pdfs
更详细的工作示例可在以下位置找到:https://martin-thoma.com/creating-pdf-forms-with-latex/
基于这些,我改编了 R/exams 包中提供的 exam.tex
模板,并设置了一个 form.tex
模板。完整的 LaTeX 代码包含在下面。这会尝试执行以下操作:
- 设置完成后可以通过电子邮件提交的表单。
- 表单包含 "fixed" 个姓名和学号字段。
- 然后它设置命令
\exnum
、\exstring
、exmchoice
等可以被exams2pdf()
使用的命令。有关详细信息,请参阅vignette("exams", package = "exams")
中的第 3 节。因此,这些命令会根据给定考试的需要经常重复。 - 最后有 "Submit" 或 "Clear" 表单的按钮。
为了便于说明,请尝试:
exams2pdf(
c("deriv.Rmd", "swisscapital.Rmd", "boxplots.Rmd", "ttest.Rmd", "function.Rmd", "lm.Rmd"),
template = "form.tex"
)
下面的 form.tex
需要在您当前的工作目录中。
结果是 form1.pdf
自动显示在您的默认 PDF 查看器中(请参阅 options(pdfviewer = ...)
)。或者,您也可以添加参数 dir = "."
以将文件存储在当前工作目录中。
对我来说,在 Debian GNU/Linux 上,使用 TeXLive 这可以工作并生成一个 PDF 文件,可以使用 Evince PDF 查看器查看和填写。但是,"Submit" 和 "Clear" 都不起作用。
当我在 Windows 10 中的 Acrobat Reader 下打开同一个文件时,只有 Name/ID 的 TextEntry 字段起作用,其他的不起作用。复选框有效,但 (a) 的所有复选框都已链接,所有 (b) 等也是如此。
我的印象是,像这样即时编写 {Form}
不适用于 Acrobat Reader。但我希望能指出如何解决这个问题。另一种方法是在所有表单元素等中使用独特的 name
标签准确编码特定考试所需的表单
奖金说明:
下面的模板还激活了 {attachfile}
LaTeX 包,该包可用于将文件(例如数据集)嵌入到 PDF 中。这对我有用,但只适用于 Acrobat Reader。为了自动将所有 \url{}
命令(为上面使用的 lm
练习创建的命令)转换为 \attachfile{}
命令,exams2pdf()
的开发版本获得了一个参数 attachfile = FALSE
可以设置为 TRUE
。有关更多详细信息,请参阅 R-Forge R/exams 论坛中的此主题:
https://R-Forge.R-project.org/forum/forum.php?thread_id=32091&forum_id=4377&group_id=1337
LaTeX 模板: form.tex
\documentclass[10pt,a4paper]{article}
%% packages
\usepackage[utf8]{inputenc}
\usepackage{a4wide,color,verbatim,Sweave,url,xargs,amsmath,booktabs,longtable,eurosym}
%%% %% optionally: two-column layout for exercise form
%%% \usepackage{multicol}
%% embed supplementary data files etc.
\usepackage{attachfile}
\attachfilesetup{color=0.5 0 0}
%% support PDF forms
\usepackage{hyperref}
%% new environments
\newenvironment{question}{\item}{}
\newenvironment{solution}{\comment}{\endcomment}
\newenvironment{answerlist}{\renewcommand{\labelenumi}{(\alph{enumi})}\begin{enumerate}}{\end{enumerate}}
%% paragraphs
\setlength{\parskip}{0.7ex plus0.1ex minus0.1ex}
\setlength{\parindent}{0em}
%% compatibility with pandoc
\providecommand{\tightlist}{\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
\setkeys{Gin}{keepaspectratio}
%% fonts: Helvetica
\usepackage{helvet}
\IfFileExists{sfmath.sty}{
\RequirePackage[helvet]{sfmath}
}{}
\renewcommand{\sfdefault}{phv}
\renewcommand{\rmdefault}{phv}
\newcommandx{\exmchoice}[9][2=-,3=-,4=-,5=-,6=-,7=-,8=-,9=-]{%
\CheckBox[name=a, width=1em]{(a)}~~%
\if #2- \else \CheckBox[name=b, width=1em]{(b)}~~ \fi%
\if #3- \else \CheckBox[name=c, width=1em]{(c)}~~ \fi%
\if #4- \else \CheckBox[name=d, width=1em]{(d)}~~ \fi%
\if #5- \else \CheckBox[name=e, width=1em]{(e)}~~ \fi%
\if #6- \else \CheckBox[name=f, width=1em]{(f)}~~ \fi%
\if #7- \else \CheckBox[name=g, width=1em]{(g)}~~ \fi%
\if #8- \else \CheckBox[name=h, width=1em]{(h)}~~ \fi%
\if #9- \else \CheckBox[name=i, width=1em]{(i)}~~ \fi%
}
\newcommandx{\exclozechoice}[9][2=-,3=-,4=-,5=-,6=-,7=-,8=-,9=-]{\setcounter{enumiii}{1}%
\CheckBox[name=ca, width=1em]{\roman{enumiii}.} \stepcounter{enumiii}%
\if #2- \else \CheckBox[name=cb, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #3- \else \CheckBox[name=cc, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #4- \else \CheckBox[name=cd, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #5- \else \CheckBox[name=ce, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #6- \else \CheckBox[name=cf, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #7- \else \CheckBox[name=cg, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #8- \else \CheckBox[name=ch, width=1em]{\roman{enumiii}.} \stepcounter{enumiii} \fi%
\if #9- \else \CheckBox[name=ci, width=1em]{\roman{enumiii}.} \fi%
}
\newcommand{\exnum}[9]{\TextField[name=num, width=4cm]{}}
\newcommand{\exstring}[1]{\TextField[name=string, width=4cm]{}}
%% new commands
\makeatletter
\newcommand{\ID}[1]{\def\@ID{#1}}
\newcommand{\Date}[1]{\def\@Date{#1}}
\ID{00001}
\Date{YYYY-MM-DD}
%% \exinput{header}
\newcommand{\myID}{\@ID}
\newcommand{\myDate}{\@Date}
\makeatother
%% headings
\markboth{\textnormal{\bf \large Statistics Exam: \myID}}%
{\textnormal{\bf \large Statistics Exam: \myID}}
\pagestyle{myheadings}
\begin{document}
%% title page
\thispagestyle{empty}
{\sf
\textbf{\LARGE{R University}}
\textbf{\large{Statistics Exam \myDate \hfill Exam ID \myID}}
\vspace*{2cm}
\begin{Form}[action=mailto:info@example.com,encoding=html,method=post]
\begin{tabular}{ll}
\textbf{Name} & \TextField[name=Name, width=10cm]{}\
\textbf{Student ID} & \TextField[name=ID, width=10cm]{}\
\end{tabular}
\vspace*{1cm}
%%% \begin{multicols}{2}
%% \exinput{questionnaire}
%%% \end{multicols}
\Submit{Submit} ~~ \Reset{Clear}
\end{Form}
}
\newpage
\begin{enumerate}
%% \exinput{exercises}
\end{enumerate}
\end{document}
我们将这样组织考试:
- 学生下载使用 exams2nops 创建的 pdf
- 学生使用 Adobe Acrobat Reader DC(免费:https://get.adobe.com/de/reader/?promoid=P79NQR4R&mv=other)打开 pdf 并通过“符号”选项用 X 标记方框
- 学生将考试的第一个填写页面上传回来(通过打印为 pdf)。这样做的好处是设置的十字架不能再更改了。
- 正常的考试评估流程开始...