提问于:
浏览数:
1871
## 编译环境
操作系统
* [10 ] Windows 7/8/10
* [x ] macOS
* [x ] Linux
`若需勾选,请把[ ]改成[x]`
Tex发行版
* [2020 ] TexLive `年份`
* [ ] MikTeX `版本号`
* [ ] CTeX
`若需勾选,请把[ ]改成[x]`
## 我的问题
在此输入你遇到的问题...![](https://wenda.latexstudio.net/data/attach/200606/izANdggK.jpg)
如这个图片内容。
将“乱序”的选项进行排列,使每个选项独占一行。之后,从题干中,提取答案,把题干答案删除,将答案以【答案】A的形式,加到最后一个选项的下一行。
我之前手动做的,重复操作程度太高了,我想使这个排版过程自动化。我之前查了一下,word排版的知识。有word vba,但我又看到评论说 word vba 不如latex.
所以,我来了。我现在考研复习+准备期末阶段。时间确实少。但是确定解决问题的方向,着实得花一些时间。
所以,我来求助了,希望答主们,帮我确定一下,解决这个问题的方向、方法。确定后,我可以自己去学相关知识。
1 回答
2
关于你说的“从题干中提取答案,再把答案从题干中删除”这个过程,我这里就简化成“在排版的时候就知道答案是哪个”,因为每道题都需要手动去输入,所以可以直接把正确答案标记出来。
我这里大概实现了你的需求,主要用的是 `exam` 文档类实现基本环境定义,和 `exam-randomizechoices` 宏包实现选择题的随机排列。它的局限是不能排版多选题。
代码:
```
\documentclass[answers]{exam}
% answers 选项控制是否输出答案,去掉即可取消输出答案
\usepackage{ctex} % 中文支持
\usepackage{listings} % 用于展示代码
\lstset{
numbers=left, % 左边显示行号
language=Java % 默认语言为 Java
}
\renewcommand*\thelstnumber{\the\value{lstnumber})}
% 设置行号为 2) 的形式
\usepackage{exam-randomizechoices} % 随机化选择题
\setrandomizerseed{12} % 设定随机数种子
\renewcommand{\choiceshook}{% 设置选项的缩进
\setlength{\leftmargin}{1em}%
}
\CorrectChoiceEmphasis{} % 将正确答案在题干中显示为普通(默认为 \bfseries)
\newcommand{\ansblnk}{(\quad )} % 显示一个括号
\newcommand{\anshere}{% 输出当前问题的答案,去掉文档类的 answers 选项将不会输出答案
\ifprintanswers
【答案】\noexpand\ref{question@\arabic{question}@correctchoice}
\fi}
\begin{document}
\begin{questions}
\question 有以下程序:
\begin{lstlisting}
System.out.println("");
\end{lstlisting}
该程序的执行结果是\ansblnk
\begin{randomizechoices}
\choice 程序执行后无输出
\choice 程序在第5行出现编译错误
\CorrectChoice 程序执行后输出“Equal”
\choice 程序执行后出现异常
\end{randomizechoices}
\anshere % 输出本题答案
\question 执行完下面的程序片段后,下面的哪些结论是正确的?\ansblnk
\begin{lstlisting}
int a,b,c;
a=1;
b=2;
c=(a+b>3?a++:++b);
\end{lstlisting}
\begin{randomizechoices}
\choice a 的值是2,b 的值是3
\CorrectChoice a 的值是1,b 的值是3
\choice a 的值是2,b 的值是2
\choice c的值是 false
\end{randomizechoices}
\anshere % 输出本题答案
% 问题 \ref{question@\arabic{question}} 的答案是 \ref{question@\arabic{question}@correctchoice}。
\end{questions}
\ifprintanswers
答案:\par\printkeytable
\fi
\end{document}
```
效果:
![](https://wenda.latexstudio.net/data/attach/200606/rCLRTxs0.jpg)
回答: 2020-06-06 11:28
又看了一遍我觉得可能误解了你的意思,不过文档确实可以这么来写,涉及到原来文本到 latex 的转换,你可以自己编写一个程序,把里面的选项之类的替换掉。
-
好的,谢谢你啦。 – 逍遥 2020-06-07 19:39 回复
你的回答
请登录后回答
你的回答将会帮助更多人,请务必认真回答问题。