Emmanuel
Briand,
Departamento Matemática Aplicada I,
Universidad de Sevilla,
22 de marzo de 2020. Revisado: 15 de julio de 2023.
Ver también: BBLearnTools
La información es este tutorial se aplica a Blackboard Original, pero no al nuevo Blackboard Ultra.
En la Universidad de Sevilla se utiliza el “entorno de aprendizaje” Blackboard Learn. El editor de formulas matemáticas proporcionado en Blackboard (MathType) es poco cómodo. Una alternativa, poco documentada, consiste en utilizar Mathjax 2. En el caso de la creación de pruebas de Blackboard, presenta algunas dificultades adicionales. Aquí explico cómo consigo crear pruebas de Blackboard con formulas interpretadas por Mathjax.
En este tutorial, crearemos preguntas y “bancos de preguntas” en
formato .txt
listas para cargar en Blackboard. Nos
interesamos específicamente a la manera de integrar formulas de
matemáticas en el texto de las preguntas.
Al lector que no es familiar con la manera de crear pruebas en Blackboard, le aconsejamos echar una ojeada a la página de ayuda de Blackboard relevante, y en particular la lista de los tipos de pregunta. Suponemos que el lector tiene alguna familiaridad con la sintaxis LaTeX.
Vamos a crear una prueba de Blackboard con una pregunta de tipo NUM (“Numérica calculada”). El formato en el cuál debe ser escrita la pregunta, viene indicado en esta documentación de Blackboard. Las formulas matemáticas serán interpretadas por Mathjax.
Aquí está la prueba tal y como aparecerá a los estudiantes en Blackboard.
Se trata de calcular un determinante. Se incluye “datos para copiar y pegar” para permitir resolver el ejercicio mediante SAGE u otro sistema de cálculo símbolico (aunque obviamente en este ejemplo, el ordenador no debería no ser necesario… es cierto que podría haber elegido un mejor ejemplo…).
Hay dos maneras de entrar el texto de la pregunta en Blackboard:
Elegimos la segunda manera, ya que es la única manera que sirve para crear un largo banco de pruebas con el mismo patrón, de manera automatizada, cosa que vamos a querer hacer luego.
A continuación está el texto que escribimos en un fichero, mediante
un editor de texto (o un Notebook de SAGE o PYTHON), para generar la
pregunta. (No es el contenido del fichero .txt
que
cargaremos en Blackboard; dicho fichero se obtendrá de este texto
aplicando algunas transformaciones).
Hallar el determinante de la matriz \(A\), donde
\[&2\\3&4\end{bmatrix}
A=\begin{bmatrix}1
\]<br>
<hr>
Datos para copiar y pegar:<br>
<br>
<span style="font-family:Courier New;">
A = matrix([[1, 2], [3, 4]])</span>
<hr>
Tu respuesta:
Observaciones:
\(...\)
$$...$$
o de
\[...\]
.<br>
. Los
otros (saltos de línea del editor de texto) les vamos a quitar porque
Blackboard los entiende como separadores de preguntas.Tenemos que aplicar algunas transformaciones al texto, o bien dentro del editor con una herramienta Find and Replace, o con un script de algún lenguaje de programación aplicado al fichero de texto.
<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML" async>
</script>
).NUM <tab>
, y
al final <tab> -2 <tab> <tab>
<newline>
(donde en vez de <tab>
y
<newline>
hay que insertar una tabulación, o una
nueva línea, respectivamente). Esto es para indicar a Blackboard que la
pregunta es de tipo NUM (numérica calculada) y que la respuesta es -2.
Entre los dos últimos <tab>
podríamos poner una
tolerancia para la respuesta, algo que no es pertinente en este caso;
dejamos el campo vacío..txt
, sino Blackboard no lo cargará. En este
ejemplo, lo guardo como det.bb.txt.Aquí está este fichero. Ojo que aquí no se ven las tabulaciones.
<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML" async> </script>Hallar el determinante de la matriz \(A\), donde \[A=\begin{bmatrix}1&2\\3&4\end{bmatrix}\]<br><hr> Datos para copiar y pegar:<br><br><span style="font-family:Courier New;"> A = matrix([[1, 2], [3, 4]])</span><hr>Tu respuesta: -2 NUM
Procederemos finalmente a cargar este fichero como pregunta de prueba blackboard.
En el menú del curso, desplegamos el menú Herramientas del curso y pinchamos en Exámenes, Encuestas y Bancos de preguntas.
A continuación, en la página Exámenes, Encuestas y Bancos de preguntas, pinchamos en Bancos de preguntas.
En la página Información sobre banco de preguntas, proporcionamos una descripción del banco de preguntas, y le damos al botón Enviar. Luego, en la página Lienzo del banco de preguntas, pinchamos en Cargar preguntas:
Procederemos a cargar el fichero .txt
que hemos
preparado. No sale un resumen de la pregunta.
Dando al botón “vista preliminar”, tendremos una vista preliminar de la pregunta ¡Ojo con esta vista preliminar: no siempre revela todos los fallos que podemos haber cometido. En particular, algunas formulas LaTeX pueden ser bien interpretadas por MathJax en la vista preliminar, y mal en la vista de usuario, porque Blackboard habrá insertado tags HTML para poner el texto en forma, entretanto.
Las tareas de preparación del texto de pueden automatizar con algún
programa. Lo hacemos con PYTHON, con una función
prepare_question
cuyo código está aquí. Aquí
esta la llamada a la función, con las operaciones de lectura y escritura
de los ficheros.
# importamos la función. Para python3 o Sage9:
from CODE.prepare_for_blackboard import prepare_question
# Para Sage < 9, cambiar en
# load("CODE/prepare_for_blackboard.py")
# Se puede también copiar y pegar el contenido del fichero.
= r"""
texto Hallar el determinante de la matriz \(A\), donde
\[
A=\begin{bmatrix}1&2\\3&4\end{bmatrix}
\]
<br>
<hr>
Datos para copiar y pegar:
<br>
<br>
<span style="font-family:Courier New;">
A = matrix([[1, 2], [3, 4]])
</span>
<hr>
Tu respuesta:
"""
= prepare_question(texto)
texto_bb = -2
answer = 0
tolerance import csv
'blackboard', delimiter='\t', quoting=csv.QUOTE_NONE, quotechar='')
csv.register_dialect(with open('EJEMPLOS/det.bb.txt', 'w') as f:
= csv.writer(f, 'blackboard')
writer "NUM", texto_bb, answer, tolerance]) writer.writerow([
Comento: la función prepare_question
toma dos
argumentos:
Digamos que queremos producir 150 ejercicios del tipo del anterior, pero con datos numéricos distintos. Estos 150 ejercicios serán cargados en Blackboard para formar un banco de preguntas, como descrito en el ejemplo 1.
Utilizamos un patrón, o “texto con campos variables”. Utilizamos un lenguaje de programación para generar los datos y las respuestas que corresponden (suelo utilizar SAGE, aquí utilizaremos simplemente PYTHON) y el código anterior para insertar los datos en el patrón y escribir las 150 variaciones del ejercicio en un mismo fichero.
El código para producir las 150 variantes sería el que sigue.
# importamos la función. Para python3 o Sage9:
from CODE.prepare_for_blackboard import prepare_question
# Para Sage < 9, cambiar en
# load("CODE/prepare_for_blackboard.py")
# Se puede también copiar y pegar el contenido del fichero.
# patrón
= r"""
patron REF: 0101191211-%(i)s
<hr>
Hallar el determinante de la matriz \(A\), donde
\[
A=\begin{bmatrix}
%(a)s & %(b)s \\ %(c)s & %(d)s
\end{bmatrix}
\]
<br>
<hr>
Datos para copiar y pegar:
<br>
<br>
<span style="font-family:Courier New;">
A = matrix([[%(a)s ,%(b)s], [%(c)s, %(d)s]])
</span>
<hr>
Tu respuesta:
"""
# Generación de los datos
import random
= 123
seed
random.seed(seed)
def dice():
r"""
Sortea un entero desde -5 hasta 5.
"""
return random.randint(-5,5)
# 150 sucesiones de 4 enteros aleatorios
= [(dice(), dice(), dice(), dice() ) for i in range(150) ]
datos # Guardo los datos
with open('EJEMPLOS/det.datos.txt', 'w') as f:
str(datos))
f.write(
# Escritura del banco de pregunta
import csv
'blackboard', delimiter='\t', quoting=csv.QUOTE_NONE, quotechar='')
csv.register_dialect(
= 0
tolerance with open('EJEMPLOS/det.pools.txt', 'w') as f:
= csv.writer(f, 'blackboard')
writer for (i, (a,b,c,d)) in enumerate(datos):
= prepare_question(patron, {'i':i, 'a':a, 'b':b, 'c':c, 'd':d})
texto_bb = a*d-b*c
answer "NUM", texto_bb, answer, tolerance]) writer.writerow([
Comentarios:
csv
para leer y escribir en
este fichero.Después de escribir el fichero de banco de pregunta, es conveniente
visualizar por lo menos una pregunta. Para esto, se puede extraer del
fichero el texto de la primera pregunta, escribirlo en un nuevo fichero
.html
y visualizar dicho fichero HTML en un navegador.
A continuación enseñamos como hacer la extracción con PYTHON.
import csv
'blackboard', delimiter='\t', quoting=csv.QUOTE_NONE, quotechar='')
csv.register_dialect(with open('EJEMPLOS/det.pool.txt', 'r') as f:
= csv.reader(f, 'blackboard')
reader = next(reader)
row0 # se aisla el segundo campo, que contiene el texto de la pregunta
= row0[1]
texto with open('EJEMPLOS/det.pool_test.html', 'w') as f:
f.write(texto)
.txt
, con SAGEEnseñamos aquí como producir un banco de 150 preguntas del mismo tipo
que el anterior, utilizando esta vez SAGE en vez de PYTHON, y la
función random_matrix
de SAGE,
"CODE/prepare_for_blackboard.py")
load(
= r"""
patron REF: 0101191213-%(i)s
<hr>
Hallar el determinante de la matriz \(A\), donde
\[
A=%(A)s
\]
<br>
<hr>
Datos para copiar y pegar:
<br>
<br>
<span style="font-family:Courier New;">
A = matrix(2, 2, %(L)s)
</span>
<hr>
Tu respuesta:
"""
# Generación de los datos
= 123
my_seed
set_random_seed(my_seed)
# 150 matrices
= [(random_matrix(ZZ, 2, 2, x=-5, y=6 )) for i in range(150) ]
datos # Guardo los datos
with open('EJEMPLOS/det2.datos.txt', 'w') as f:
str(datos))
f.write(
# Escritura del banco de preguntas
import csv
'blackboard', delimiter='\t', quoting=csv.QUOTE_NONE, quotechar='')
csv.register_dialect(
= 0
tolerance with open('EJEMPLOS/det2.pool.txt', 'w') as f:
= csv.writer(f, 'blackboard')
writer for (i, A) in enumerate(datos):
= prepare_question(patron,
texto_bb 'i':i, 'A':latex(A), 'L': str(A.list() ) } )
{= A.det()
answer "NUM", texto_bb, answer, tolerance]) writer.writerow([
Blackboard transforma
$$A=\left(\begin{array}{rrrrr}-3281 & 58680 & -246330 & 364840 & -175770 \\-2445 & 43913 & -184590 & 273420 & -131670 \\-1955 & 35160 & -147754 & 218680 & -105210 \\-\frac{6515}{4} & 29295 & -\frac{246015}{2} & 181870 & -\frac{174825}{2} \\-1395 & 25080 & -105210 & 155400 & -74620\end{array}\right).$$ Sea
en
<span style='word-break:break-all;word-wrap:break-word'>$$A=\left(\begin{array}{rrrrr}-3281</span> & 58680 & -246330 & 364840 & -175770 \\-2445 & 43913 & -184590 & 273420 & -131670 \\-1955 & 35160 & -147754 & 218680 & -105210 \\-\frac{6515}{4} & 29295 & -\frac{246015}{2} & 181870 & -\frac{174825}{2} \\-1395 & 25080 & -105210 & 155400 & -74620\end{array}\right).$$ Sea
Es revelado por el examen del código fuente de la página web de
cuestionario presentado a los estudiantes por Blackboard (¡El problema
NO se aprecia en la vista preliminar presentada después de cargar las
preguntas!). El código HTML contiene un </span>
después del primer coeficiente de la matriz, que impide el tratamiento
correcto de la formula por MathJax.
Otros tipos de preguntas pueden plantear problemas específicos. Por
ejemplo, en las preguntas de tipo “FIB_PLUS” (“Rellenar los espacios en
blanco con varias opciones”), los corchetes [...]
tienen
una significación especial (delimitan los espacios en blanco). Es
necesario escapar todos los otros corchetes de apertura.
.txt
de banco de preguntas para
Blackboard