我正在使用 exam class 编写大型考试。我想通过排列问题来创建考试的多个版本(至少两个)。我想我在用户手册中看到过类似的东西,但现在我找不到它了。
最初我想用一张包含 100 个问题的问题表来实现这一点。但示例如下:
\documentclass{exam}
\usepackage[utf8]{inputenc}
\usepackage[spanish,shorthands=off]{babel}
\usepackage{cmbright}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{tikz}
\usetikzlibrary{calc, cd}
\newcommand{\n}[1]{\boldsymbol{#1}}
\theoremstyle{definition}
\newtheorem{ej}{Ejercicio}
\newcommand{\tq}{\;|\;}
\title{Conjuntos Abstractos}
\author{}
\date{}
\begin{document}
\maketitle
\begin{questions}
\question Demuestra que iso implica biyectiva.
\question Demuestra que la categoría $1/\mathcal{S}$ tiene todos los límites finitos. Los objetos de $1/\mathcal{S}$ son parejas $(A,a:1\to A)$, donde $A$ es un conjunto abstracto; y las flechas $f:(A,a:1\to A)\to(B,b:1\to B)$ son flechas entre conjuntos abstractos $f:A\to B$ que hacen conmutar al siguiente diagrama
\begin{center}
\begin{tikzcd}
& 1 \arrow[ld, "a"swap] \arrow[rd, "b"] \\
A \arrow[rr, "f"swap] && B
\end{tikzcd}
\end{center}
\question Demuestra que si una categoría $\n{C}$ tiene coproductos y coigualadores entonces tiene todos los colímites.
\question Demuestra que todo igualador es mono.
\question Sean \tikzcd[cramped, sep=small] U \arrow[r, rightarrowtail, "i"] & A \endtikzcd{} e \tikzcd[cramped, sep=small] V \arrow[r, rightarrowtail, "j"] & A \endtikzcd{} subobjetos de $A$. Diremos que $i$ es equivalente ($i\sim j$) a $j$ si $i\subseteq j$ y $j\subseteq i$. Demuestra que la relación $\sim$ es de equivalencia.
\question Sean $A$ un conjuntos abstractos y considera los conjuntos
\begin{gather*}
Sub(A)=\{\tikzcd[cramped, sep=small, ampersand replacement=\&] U \arrow[r, rightarrowtail, "i"] \& A \endtikzcd{}
\tq \text{$i$ es mono}\}/\sim \\
\mathcal{S}(A,B)=\{f:A\to B\tq\text{$f$ es una flecha en $\mathcal{S}$}\}
\end{gather*}
Demuestra que hay una biyección $Sub(A)\cong\mathcal{S}(A,2)$.
\end{questions}
\end{document}
对于结构和文本类型,可以使用 PDFLaTeX、PDFTeX、XeTeX 等进行编译。如果有使用特定编译方法的好的解决方案,我就可以轻松使用它。
有人知道如何做这样的事情吗?
提前致谢
答案1
以下方法确实有效。但请注意,由于 的整个内容randomizedquestions
都是由宏读取的,因此环境内部出现的 catcode 更改不会生效。因此,如果没有 ,egtikzcd
就无法工作ampersand replacement
。
环境采用可选参数来指定您实际想要使用的问题数量。这样,您可以定义 10 个问题,但只使用 5 个。如果可选参数大于实际定义的问题数量,则所有问题都会被使用,而不会出现任何警告或错误。
我希望这对你有用(如果还没有的话,很抱歉你必须更改所有tikzcd
代码才能使用)。ampersand replacement
\documentclass{exam}
\usepackage[utf8]{inputenc}
\usepackage[spanish,shorthands=off]{babel}
\usepackage{cmbright}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{tikz}
\usepackage{expl3}
\usepackage{environ}
\usetikzlibrary{calc, cd}
\newcommand{\n}[1]{\boldsymbol{#1}}
\theoremstyle{definition}
\newtheorem{ej}{Ejercicio}
\newcommand{\tq}{\;|\;}
\ExplSyntaxOn
\seq_new:N \l_luisturcio_questions_seq
\seq_new:N \l_luisturcio_indices_seq
\int_new:N \l_luisturcio_index_int
\int_new:N \l_luisturcio_questions_int
\tl_new:N \l_luisturcio_questions_tl
\tl_new:N \l_luisturcio_index_tl
\bool_new:N \l_luisturcio_loop_bool
\NewEnviron { randomizedquestions } [1][]
{
\luisturcio_sequence_questions:V \BODY
\luisturcio_shuffle_questions:n { #1 }
\luisturcio_create_questions_tl:
\exp_args:Nno \begin{questions} \l_luisturcio_questions_tl \end{questions}
}
\cs_new:Nn \luisturcio_sequence_questions:n
{
\seq_set_split:Nnn \l_luisturcio_questions_seq { \question } { #1 }
\seq_remove_all:Nn \l_luisturcio_questions_seq {}
}
\cs_generate_variant:Nn \luisturcio_sequence_questions:n { V }
\cs_new:Nn \luisturcio_shuffle_questions:n
{
\int_set:Nn \l_luisturcio_questions_int
{ \seq_count:N \l_luisturcio_questions_seq }
\tl_if_empty:nTF { #1 }
{
\int_step_inline:nnnn
{ \l_luisturcio_questions_int } { -\c_one } { \c_one }
}
{
\int_compare:nNnTF { \l_luisturcio_questions_int } > { #1 }
{
\int_step_inline:nnnn
{ \l_luisturcio_questions_int } { -\c_one }
{ \l_luisturcio_questions_int - #1 + \c_one }
}
{
\int_step_inline:nnnn
{ \l_luisturcio_questions_int } { -\c_one } { \c_one }
}
}
{
\int_set:Nn \l_luisturcio_index_int { \int_rand:nn { \c_one } { ##1 } }
\luisturcio_add_to_indices:
}
}
\cs_new:Nn \luisturcio_add_to_indices:
{
\bool_set_true:N \l_luisturcio_loop_bool
\bool_do_while:Nn \l_luisturcio_loop_bool
{
\seq_if_in:NxTF \l_luisturcio_indices_seq
{ \int_use:N \l_luisturcio_index_int }
{
\int_incr:N \l_luisturcio_index_int
}
{
\seq_put_right:Nx \l_luisturcio_indices_seq
{ \int_use:N \l_luisturcio_index_int }
\bool_set_false:N \l_luisturcio_loop_bool
}
}
}
\cs_new:Nn \luisturcio_create_questions_tl:
{
\tl_clear:N \l_luisturcio_questions_tl
\bool_while_do:nn { ! \seq_if_empty_p:N \l_luisturcio_indices_seq }
{
\tl_put_right:Nn \l_luisturcio_questions_tl { \question }
\seq_pop_right:NN \l_luisturcio_indices_seq \l_luisturcio_index_tl
\tl_put_right:Nx \l_luisturcio_questions_tl
{
\seq_item:Nn \l_luisturcio_questions_seq { \l_luisturcio_index_tl }
}
}
}
\ExplSyntaxOff
\title{Conjuntos Abstractos}
\author{}
\date{}
\begin{document}
\maketitle
\begin{randomizedquestions}
\question Demuestra que iso implica biyectiva.
\question Demuestra que la categoría $1/\mathcal{S}$ tiene todos los límites finitos. Los objetos de $1/\mathcal{S}$ son parejas $(A,a:1\to A)$, donde $A$ es un conjunto abstracto; y las flechas $f:(A,a:1\to A)\to(B,b:1\to B)$ son flechas entre conjuntos abstractos $f:A\to B$ que hacen conmutar al siguiente diagrama
\begin{center}
\begin{tikzcd}[ampersand replacement=\&]
\& 1 \arrow[ld, "a"swap] \arrow[rd, "b"] \\
A \arrow[rr, "f"swap] \&\& B
\end{tikzcd}
\end{center}
\question Demuestra que si una categoría $\n{C}$ tiene coproductos y coigualadores entonces tiene todos los colímites.
\question Demuestra que todo igualador es mono.
\question Sean \tikzcd[cramped, sep=small,ampersand replacement=\&] U \arrow[r, rightarrowtail, "i"] \& A \endtikzcd{} e \tikzcd[cramped, sep=small,ampersand replacement=\&] V \arrow[r, rightarrowtail, "j"] \& A \endtikzcd{} subobjetos de $A$. Diremos que $i$ es equivalente ($i\sim j$) a $j$ si $i\subseteq j$ y $j\subseteq i$. Demuestra que la relación $\sim$ es de equivalencia.
\question Sean $A$ un conjuntos abstractos y considera los conjuntos
\begin{gather*}
Sub(A)=\{\tikzcd[cramped, sep=small, ampersand replacement=\&] U \arrow[r, rightarrowtail, "i"] \& A \endtikzcd{}
\tq \text{$i$ es mono}\}/\sim \\
\mathcal{S}(A,B)=\{f:A\to B\tq\text{$f$ es una flecha en $\mathcal{S}$}\}
\end{gather*}
Demuestra que hay una biyección $Sub(A)\cong\mathcal{S}(A,2)$.
\end{randomizedquestions}
\end{document}