Blog sobre educación

Exámenes con la clase ‘exam’ en \(\LaTeX\)

LaTeX tiene la clase exam, probablemente poco conocida, que dispone de una enorme cantidad de utilidades para elaborar exámenes escritos. Una de las cosas interesantes que tiene es la posibilidad de hacer los exámenes con las soluciones, que pueden ser imprimidas o no.

Además de esto, podemos controlar la puntuación de cada pregunta y subpregunta, dónde se imprime y cómo, elaborar una tabla final de calificaciones, poner preguntas con puntos extra, disponer de diferentes tipos de espacios para las respuestas (líneas contínuas, de puntos, cuadrícula para gráficas, etc), poner encabezados y pies diferentes en la primera página del resto o elaborar diferentes tipos de preguntas con sus posibles respuestas (tipo test), entre otras muchas cosas. Para ver la descripción completa, con numerosos ejemplos, consultar el documento Using the exam document class.

Estructura

El preámbulo del documento deberá empezar con: \documentclass{exam}. Si deseamos llevar el control de los puntos añadiremos: \documentclass[addpoints]{exam}, también podremos añadir el tamaño de la letra y del papel como suele ser habitual: \documentclass[12pt,a4paper,addpoints]{exam}

Las preguntas utilizan el entorno questions (en plural) y cada pregunta se identifica con \question (en singular). Un par de preguntas quedarían así:

\begin{questions}
  \question Esta es la primera pregunta
  \question Esta es la segunda pregunta
\end{questions}

Añadiendo el resto del código que falta al documento:

\documentclass[12pt,a4paper,addpoints]{exam}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[spanish]{babel}

\begin{document}

\begin{questions}
  \question Esta es la primera pregunta
  \question Esta es la segunda pregunta
\end{questions}

\end{document}

Una vez compilado el resultado de este código no es demasiado espectacular:

Resultado del código anterior

Subpreguntas

Es posible dividir una pregunta en subapartados, concretamente \question puede ser dividido en varios \part que a su vez pueden ser subdivididos en varios \subpart que a su vez pueden ser subdivididos en varios \subsubpart. El funcionamiento es idéntico al de \question (atención al uso del plural y singular de cada entorno):

\documentclass[12pt,a4paper,addpoints]{exam}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[spanish]{babel}

\begin{document}

\begin{questions}
  \question Esta es la primera pregunta
  \begin{parts}
      \part Una subpregunta
      \part Otra subpregunta
  \end{parts}
  \question Esta es la segunda pregunta
  \begin{parts}
      \part Una subpregunta
      \begin{subparts}
          \subpart Una subsubpregunta
          \subpart Otra subsubpregunta
      \end{subparts}
  \end{parts}
\end{questions}

\end{document}
Resultado de añadir dos niveles extra en las preguntas: \part y \subpart

El estilo de la numeración puede ser cambiado a gusto de cada uno, este es el que se obtienen por defecto. El siguiente código, colocado en el preámbulo, nos transforma la numeración anterior en 1.1, 1.2, 1.2.1, etc:

\renewcommand{\thepartno}{\arabic{partno}}
\renewcommand{\partlabel}{\thequestion.\thepartno}

\renewcommand{\thesubpart}{\arabic{subpart}}
\renewcommand{\subpartlabel}{\thequestion.\thepartno.\thesubpart}

\renewcommand{\thesubsubpart}{\arabic{subsubpart}}
\renewcommand{\subsubpartlabel}{\thequestion.\thepartno.\thesubpart.\thesubsubpart}
Si hay más de un subnivel de preguntas quizás esta forma sea más clara.

Puntuación

Vamos a añadir alguna puntuación a las preguntas. Esto se consigue encerrando entre corchetes la numeración detrás de \question, \part, \subpart o \subsubpart. Esta numeración ha de ser entera o bien medios puntos que se representan mediante \half, no es por tanto posible poner 0.25 puntos, 0.1 o números decimales similares. Para evitar que aparezcan los puntos en inglés hay que traducirlos a través de \pointpoints{punto}{puntos}

\documentclass[12pt,a4paper,addpoints]{exam}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[spanish]{babel}

\pointpoints{punto}{puntos}

\begin{document}

\begin{questions}
  \question Esta es la primera pregunta
  \begin{parts}
      \part[2] Una subpregunta
      \part[1] Otra subpregunta
  \end{parts}
  \question[3] Esta es la segunda pregunta

\end{questions}

\end{document}
Si no se especifica nada los puntos aparecen al principio entre paréntesis, pero este comportamiento puede ser cambiado.

Hay muchas opciones referentes a los puntos destacamos las siguientes:

  • Corchetes en lugar de paréntesis: \bracketedpoints
  • En el margen izquierdo: \pointsinmargin
  • En el margen derecho: \pointsinrightmargin

En los dos últimos casos aparecerá nada más el número entre paréntesis (o corchetes si lo hemos cambiado) para que aparezca también el texto punto o puntos hay que añadir: \marginpointname{ \points}. Por ejemplo, aquí tenemos la puntuación en el margen izquierdo entre corchetes:

\documentclass[12pt,a4paper,addpoints]{exam}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[spanish]{babel}

\pointpoints{punto}{puntos}

\marginpointname{ \points} %Texto tras el número
\pointsinmargin %Puntos en el margen izquierdo
\bracketedpoints %Puntos entre corchetes

\begin{document}

\begin{questions}
  \question Esta es la primera pregunta
  \begin{parts}
      \part[2] Una subpregunta
      \part[1] Otra subpregunta
  \end{parts}
  \question[3] Esta es la segunda pregunta

\end{questions}

\end{document}
Puntuación en el margen

Hay más opciones, como colocar la puntuación al final de las subpreguntas, poner un título a cada pregunta y poner la calificación a este título, etc., véase el apartado 4 de Using the exam document class.

Soluciones

Uno de los aspectos más interesantes de esta clase es la de que podemos poner las soluciones que aparecerán o no según deseemos en cada momento.

Las soluciones utilizan el entorno solution y van justo después de cada pregunta. Para imprimir la solución se utiliza \printanswers. Además aparece el texto Solution (en inglés) para traducirlo usamos \renewcommand{\solutiontitle}{\textbf{Solución: }} y lógicamente podemos cambiarlo por otra expresión o dejar las llaves vacías para que no aparezca nada en absoluto. Veamos un ejemplo, donde además añadimos una pregunta de selección múltiple y otra con espacios en blanco.

\documentclass[12pt,a4paper,addpoints]{exam}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[spanish]{babel}

\pointpoints{punto}{puntos}

\renewcommand{\solutiontitle}{\textbf{Solución: }}

%\printanswers

\begin{document}

\begin{questions}
  \question Referente a las <<novelas cortas>> de Alarcón, responde las siguientes preguntas.
  \begin{parts}
      \part[1] ¿En qué siglo se escribió La Buenaventura?
      \begin{checkboxes}
          \choice XVII
          \choice XVIII
          \CorrectChoice XIX
      \end{checkboxes}
      \part[9] Escribe el primer párrafo de La Buenaventura
      \begin{solution}[4cm]
          No sé qué día de Agosto del año 1816 llegó a las puertas de
          la Capitanía general de Granada cierto haraposo y grotesco
          gitano, de sesenta años de edad, de oficio esquilador y de
          apellido o sobrenombre Heredia, caballero en flaquísimo y
          destartalado burro mohíno, cuyos arneses se reducían a una
          soga atada al pescuezo; y, echado que hubo pie a tierra, dijo
          con la mayor frescura <<que quería ver al Capitán general.>>
      \end{solution}
  \end{parts}
  \question[2] Pedro Antonio de \fillin[Alarcón] nació en \fillin[1833] y murió en \fillin[1891].

\end{questions}

\end{document}

%\printanswers está desactivado al tener el símbolo del porcentaje delante, por lo tanto, las preguntas se imprimen sin solución. El espacio dejado en la pregunta 1b es de 4cm y lo hemos indicado al iniciar el entorno \begin{solution}[4cm] de esa pregunta. Si se omiten los corchetes no se dejará ningún espacio.

El resultado del código anterior es:

Si ahora eliminamos el % de \printanswers se imprimirá con las respuestas:

Si deseamos eliminar el recuadro de la solución, añadiremos al preámbulo: \unframedsolutions.

La solución empieza donde empieza la pregunta por lo que se puede desaprovechar mucho espacio por el lado izquierdo. Es posible escribir desde el principio izquierdo, para ello hay que utilizar: \fullwidth{\begin{solution}...\end{solution}}

Diferentes entornos ‘solution’

Existen diferentes entornos solution que producen diferencias precisamente cuando la solución no se imprime, ya que se generan diferentes patrones de líneas y espacios para que los alumnos respondan. Recordemos que estos espacios verticales se colocan entre corchetes detrás de \begin{solution}[xcm]. Recordemos también que podemos maximizar el espacio horizontal disponible para escribir con \fullwidth{}.

solution

Este es el que hemos usado en los ejemplos anteriores, genera un espacio en blanco cuando \printanswers está desactivado.

\documentclass[12pt,a4paper,addpoints]{exam}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[spanish]{babel}

\pointpoints{punto}{puntos}

\renewcommand{\solutiontitle}{\textbf{Solución: }}

%\printanswers

\begin{document}

\begin{questions}
  \question[1] Pregunta
    \begin{solution}[4cm]
        Solución...
    \end{solution}
    \question[1] Otra pregunta
\end{questions}

\end{document}
Se ha creado un espacio en blanco de 4cm.

solutionorbox

Cuando no imprime la solución, imprime una caja vacía.

\begin{questions}
  \question[1] Pregunta
    \begin{solutionorbox}[4cm]
        Solución...
    \end{solutionorbox}
    \question[1] Otra pregunta
\end{questions}
Caja de 4cm de altura.

solutionorlines

Cuando no imprime la solución, imprime líneas.

\begin{questions}
  \question[1] Pregunta
    \begin{solutionorlines}[4cm]
        Solución...
    \end{solutionorlines}
    \question[1] Otra pregunta
\end{questions}
Líneas, la distancia entre líneas se puede controlar.

solutionordottedlines

Es como la anterior pero con líneas de puntos.

\begin{questions}
  \question[1] Pregunta
    \begin{solutionordottedlines}[4cm]
        Solución...
    \end{solutionordottedlines}
    \question[1] Otra pregunta
\end{questions}

solutionorgrid

Crea una cuadrícula.

\begin{questions}
  \question[1] Pregunta
    \begin{solutionorgrid}[4cm]
        Solución...
    \end{solutionorgrid}
    \question[1] Otra pregunta
\end{questions}

solutionbox

Es como solution pero se reserva el mismo espacio vertical tanto si se imprime la solución como si no. Eso significa que el examen tendrá la misma longitud con soluciones y sin soluciones. El espacio reservado no va entre corchetes sino entre llaves.

\begin{questions}
  \question[1] Pregunta
    \begin{solutionbox}{4cm}
        Solución...
    \end{solutionbox}
    \question[1] Otra pregunta
\end{questions}

Cómo poner todas las soluciones al final

En ocasiones querremos tener todas las soluciones juntas al final del examen. Para esto bastará con copiar las preguntas al final del documento, las encerramos entre \begin{solution}...\end{solution} y sustituimos las preguntas por sus soluciones borrando los enunciados. Si hemos puesto las puntuaciones de cada pregunta, habrá que eliminarlas. Aquí tenemos un ejemplo:

\documentclass[a4paper,addpoints]{exam}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[spanish]{babel}
\usepackage{multicol}

\everymath{\displaystyle} % Todas las fórmulas en modo extendido

\printanswers % Comentar esta línea para ocultar las soluciones

\renewcommand{\solutiontitle}{\textbf{Soluciones:}}

\begin{document}

\begin{questions}
  \question Resuelve las siguientes ecuaciones de primer grado:

      \begin{parts}
          \begin{multicols}{2}
              \part $2(x-3)=1-3(x+4)$.
              \part $5x-4(1-2x)-7(x+1)=1$. 
              \part $3(y-2)-2(y-3)=1-2y$.
              \part $3(2x-5)+4(1-x)=3+3(x-5)$.
          \end{multicols}
      \end{parts}

      \question Resuelve las siguientes ecuaciones de segundo grado

      \begin{parts}
          \begin{multicols}{2}
              \part $x^2=144$.
              \part $(x+2)(x-3)=0$.
              \part $2x^2=32$.
              \part $x^2+2=123$.
          \end{multicols}
      \end{parts}
\end{questions}

% Soluciones -------------------------
\begin{solution}
    \begin{questions}
        \question
        \begin{parts}
            \begin{multicols}{2}
                \part $x=-1$ 
                \part $x=2$ 
                \part  $x=\frac{1}{3}$ 
                \part  $x=1$           
            \end{multicols}
        \end{parts}

        \question
        
        \begin{parts}
            \begin{multicols}{2}
                \part $x=\pm 12$ 
                \part $x=-2,\ x=+3 $ 
                \part $x=\pm4 $ 
                \part $x=\pm11$  
            \end{multicols}
        \end{parts}
    \end{questions}
\end{solution}

\end{document} 
Soluciones al final del examen

Cómo poner la solución en cualquier lado

Utilizando el entorno solution, la solución va siempre separada de la pregunta, en su propio espacio. Sin embargo podemos usar \ifprintanswers para escribirla en cualquier parte que queramos. El funcionamiento es el siguiente:

\ifprintanswers  lo que saldrá si se imprime solución \else lo que saldrá si no se imprime solución \fi

La segunda parte, \else, se puede omitir. Veamos un ejemplo donde se escriben las soluciones a continuación del enunciado. Se utiliza multicols para poner las preguntas en dos columnas.

\documentclass[a4paper,addpoints]{exam}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[spanish]{babel}
\usepackage{multicol}

\everymath{\displaystyle} % Todas las fórmulas en modo extenido

%\printanswers % Descomentar esta línea para ver las soluciones

\begin{document}

\begin{questions}
  \question Resuelve las siguientes ecuaciones con paréntesis
  
      \begin{parts}
          \begin{multicols}{2}
              \part $2(x-3)=1-3(x+4)$. \ifprintanswers $x=-1$ \fi
              \part $5x-4(1-2x)-7(x+1)=1$. \ifprintanswers $x=2$ \fi
              \part $3(y-2)-2(y-3)=1-2y$. \ifprintanswers $x=\frac 1 3 $ \fi
              \part $3(2x-5)+4(1-x)=3+3(x-5)$. \ifprintanswers $x=1 $ \fi
              \part $4(5x-11)-6(8+x)+x=x-1$. \ifprintanswers $x=\frac{13}2$ \fi
              \part $8(5t-3)-1=0$. \ifprintanswers $x=\frac 5 8 $ \fi
          \end{multicols}
      \end{parts}

\end{questions}

\end{document}

El resultado sin soluciones es:

Resultado del código anterior, sin soluciones

Si descomentamos \printanswers, eliminando el % que tiene delante, obtendremos las soluciones:

Las soluciones aparecen tras cada pregunta, intercaladas entre ellas.

(gracias a Rafa S del grupo @MaTex de Telegram por las ideas de poner las respuestas al final del examen y de mezclarlas con las preguntas)

Para terminar

No hemos hablado de las tablas de calificaciones, puntos extra (bonus), tipos de preguntas o encabezados y pies, entre otras cosas. Si crees que esta clase puede serte útil no dejes de consultar Using the exam document class donde encontrarás una descripción de todas las posibilidades que tiene.

Quizás te interese también…

Este artículo forma parte de la serie: La clase exam de \(\LaTeX\)

6 comentarios

  1. Cool.as

    Impresionante, muchas gracias, no conocía exam lo voy a probar

  2. Francisco Gallástegui

    Me gustaría consultares, ¿hay alguna forma de poner una puntuación decimal? Es decir, que entre paréntesis pueda poner que la puntuación de la pregunta es, por ejemplo, 0,5 puntos.
    He probado varias opciones y no me resulta posible.
    Gracias por su atención.
    Un saludo,
    Francisco

    • Juan José de Haro

      Tal como se indica en el texto, solo pueden ponerse medios puntos con \half pero no es posible 0.1, por ejemplo

      • Jose

        Hola,

        He comprobado que una opción ese redefinir el comando \half

        \renewcommand{\half}{,5}

        de forma que, al utilizar \question[2\half] escribirá 2,5. Pero no he podido conseguir que la suma total de puntos la haga bien en este caso.

        Un saludo!

  3. Juan

    Es posible que pueda marcar la respuesta a una pregunta de selección multiple en el pdf y este me indique si es correcta o no

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

© 2024 Bilateria

Tema por Anders NorenArriba ↑