viernes, 5 de junio de 2009

HAL y la burocracia (XI)

Entre el guión original y la última versión obtenida en el proceso de reconstrucción que estamos siguiendo, hay ya muy pocas diferencias, todas ellas relativamente triviales.

En primer lugar, y con objeto de aliviar la exposición, hemos partido de un presupuesto falso, a saber, que los ficheros reales de objetivos y mínimos ---los del autor--- contenían sólo la etiqueta de LaTeX \item. La realidad es un poco más compleja. En tales ficheros aparecían, además, las etiquetas: \section, \subsection, \subsubsection, \paragraph, \begin{itemize} y \end{itemize}. Ahora bien, la plantilla a partir de la cual se generan los informes particulares de cada alumno cuenta con que los ficheros incluidos mediante \input en los entornos Objetivos y Contenidos constan de líneas precedidas por la etiqueta \item y que ninguna otra etiqueta LaTeX está presente. Esto significa que los ficheros originales curso-objetivos.tex y curso-minimos.tex deben sufrir un proceso de depuración antes de ser incluidos mediante \input. Una forma sencilla de lograrlo es utilizar una instrucción sed que elimine todas las etiquetas mencionadas, excepto \item:

sed -e '/\\.*section/d' \
-e '/\\.itemize/d' \
-e '/\\paragraph/d' ${CURSO}-objetivos.tex

sed -e '/\\.*section/d' \
-e '/\\.itemize/d' \
-e '/\\paragraph/d' ${CURSO}-minimos.tex

Puesto que el proceso de depuración debe aplicarse, como acabamos de ver, tanto al fichero de objetivos como al de mínimos, y puesto que, como aprendimos ayer, hay que rehuir de las redundancias, es oportuno utilizar aquí un fichero que contenga las expresiones sed anteriormente definidas y que se pase como argumento a sed (mediante su opción -f) en sendas órdenes de depuración.

Creamos, pues, el fichero que llamaremos limpiar_tex.sed, cuyo contenido será:

/\\.*section/d
/\\.*itemize/d
/\\paragraph/d

Y, dado que el fichero en cuestión es un dato de entrada al mismo nivel que el fichero $NOTAS o el directorio $PROGRAMACION, una variable inicial que se refiera al nuevo fichero parece lo más indicado:

# Fichero sed para limpiar etiquetas LaTeX
NOLATEX=limpiar_tex.sed


Ahora podemos pasar ese fichero como argumento de la opción -f de sed para obtener los ficheros de objetivos y mínimos que se incluirán en los ficheros .tex resultantes de las conversiones realizadas sobre la plantilla:

sed -f $NOLATEX ${CURSO}-$OBJETIVOS > objetivos_tmp.tex
sed -f $NOLATEX ${CURSO}-$CONTENIDOS > contenidos_tmp.tex

Se habrá notado que el resultado se redirige a un par de ficheros temporales, que serán, en último término, los que se incluirán en el fichero .tex de cada informe. Es evidente que es esto lo que queremos y no, por ejemplo, sobreescribir los ficheros originales de objetivos y mínimos.

Para mayor claridad y versatilidad, se pueden definir dos variables puestas al valor del nombre del fichero de objetivos y mínimos de cada caso, variables que pueden a su vez pasarse como argumentos de las órdenes sed anteriormente citadas en el lugar de los propuestos antes:

# Ficheros que contienen los objetivos y contenidos del curso
# en que el alumno está matriculado
F_OBJETIVOS=${PROGRAMACION}/${CURSO}-$OBJETIVOS
F_CONTENIDOS=${PROGRAMACION}/${CURSO}-$CONTENIDOS


# Los objetivos y contenidos en un formato apto para la plantilla
# a partir de la que se genera el informe
sed -f $NOLATEX $F_OBJETIVOS > objetivos_tmp.tex
sed -f $NOLATEX $F_CONTENIDOS > contenidos_tmp.tex


Lo que resta es, simplemente, modificar adecuadamente, las expresiones correspondientes de la última orden sed, que, claramente, acaba adquiriendo un aspecto mucho más amigable (sin las comillas dobles, sin variables y sin la triple barra invertida):

# Versión previa
sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \
-e "s/CURSO/$CURSO_OUTPUT/" \
-e "s/OBJETIVOS/\\\input{${CURSO}-${OBJETIVOS}}/" \
-e "s/CONTENIDOS/\\\input{${CURSO}-${CONTENIDOS}}/" \
-e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA > ${ALUMNO}.tex

# Nueva versión
sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \
-e "s/CURSO/$CURSO_OUTPUT/" \
-e 's/OBJETIVOS/\\input{objetivos_tmp}/' \
-e 's/CONTENIDOS/\\input{contenidos_tmp}/' \
-e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA > ${ALUMNO}.tex

La nueva versión del guión, generar_informes-4, con estas incorporaciones de última hora, queda como sigue:

# Directorio que contiene la programación del curso
PROGRAMACION="$HOME/guiones/informe_suspensos"

# Fichero que contiene la plantilla LaTeX del informe
PLANTILLA=informe_plantilla.tex

# Fichero que contiene las notas de los alumnos
NOTAS=notas

# Sufijo de los ficheros de objetivos por cursos
OBJETIVOS=objetivos.tex

# Sufijo de los ficheros de contenidos por cursos
CONTENIDOS=minimos.tex

# La nota mínima para aprobar el curso
NOTA_MINIMA=5

# Fichero sed para limpiar etiquetas LaTeX
NOLATEX=limpiar_tex.sed


for linea in $(cat $NOTAS)
do
if [ $(echo $linea | cut -d':' -f3) -lt $NOTA_MINIMA ]
then
# Nombre y curso del alumno tal como constan en el fichero $NOTAS
ALUMNO=$(echo $linea | cut -d':' -f1)
CURSO=$(echo $linea | cut -d':' -f2)

# El nombre del alumno y curso con el formato que tendrán en la salida impresa
ALUMNO_OUTPUT=$(echo $ALUMNO | sed -e 's/-/ /g')
CURSO_OUTPUT=$(echo $CURSO | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \
-e 's/ge/EE/' \
-e 's/gm/EP/')

# Ficheros que contienen los objetivos y contenidos del curso
# en que el alumno está matriculado
F_OBJETIVOS=${PROGRAMACION}/${CURSO}-$OBJETIVOS
F_CONTENIDOS=${PROGRAMACION}/${CURSO}-$CONTENIDOS


# Los objetivos y contenidos en un formato apto para la plantilla
# a partir de la que se genera el informe
sed -f $NOLATEX $F_OBJETIVOS > objetivos_tmp.tex
sed -f $NOLATEX $F_CONTENIDOS > contenidos_tmp.tex


# Las propuestas de trabajo se deben introducir interactivamente
echo "Introduzca propuestas de trabajo para $ALUMNO_OUTPUT [\item ... (^D para salir)]: "
cat > trabajo_tmp.tex

sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \
-e "s/CURSO/$CURSO_OUTPUT/" \
-e 's/OBJETIVOS/\\input{objetivos_tmp}/' \
-e 's/CONTENIDOS/\\input{contenidos_tmp}/' \
-e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA > ${ALUMNO}.tex

pdflatex ${ALUMNO}.tex
fi
done

No hay comentarios:

Publicar un comentario