miércoles, 3 de junio de 2009

HAL y la burocracia (VII - interactividad)

En un remoto pasado de nuestras conversaciones, enredados en las peculiaridades digestivas de HAL, jugábamos a procurar el alimento de órdenes como grep o cut por la vía directa de lo que llamamos entonces la cañería principal ---el standard input (STDIN), para los redichos--- conectada por defecto con nuestro terminal o consola. En aquel momento se trataba sólo de un curioso experimento preparatorio para comprender el significado y función de las imprescindibles tuberías. El pasatiempo de aquellos primeros contactos con las maravillas de la anatomía de HAL nos vendrá ahora de perlas para añadir interactividad a nuestro guión.

Volvamos a reproducir el experimento, pero ahora con otra orden capaz igualmente de alimentarse a través de la entrada estándar, la orden cat (no confundir con cut). cat es una abreviatura de concatenate y su función inicial es la de concatenar los ficheros que se le den como argumentos e imprimirlos línea a línea en pantalla. Si se le da un único fichero lo imprime tal cual. ¿Pero, qué sucede si no le damos ningún fichero como argumento? Probémoslo:

cat

Tras pulsar 'Enter', nos encontramos en una situación ya familiar, la de poder emitir líneas de texto en la entrada estándar para que cat haga lo que habitualmente hace con las entradas que se le proporcionan, devolverlas tal cual a la salida estándar, que por defecto también está conectada con nuestro terminal. El juego continúa sin fin hasta que solicitamos salir de él con Ctrl+D:

hola
hola
cat
cat
Ctrl+D

Hasta aquí nada nuevo. cat se comporta de una manera bastante estúpida ---pensaría alguno---, se limita a reproducir cada línea introducida, como si se tratase de un echo interactivo.

Parece que algo tan tonto no puede dar mucho de sí. Por el contrario, la utilidad de cat para nuestro propósito se desvela si añadimos a la orden una redirección:

cat >conversacion

Lo único que hace este añadido es redirigir la salida al fichero conversacion. Por tanto, si reproducimos la anterior sesión interactiva, donde la salida de cat ya no la veremos en pantalla ---porque se redirige a ese fichero--- estaremos copiando en él tal cual las líneas que hayamos escrito antes de pulsar Ctrl+D.

Inmediatamente se comprende la utilidad que este comportamiento de cat puede tener para nuestro guión.

Habíamos dejado pendiente la sección correspondiente a las propuestas de actividades que el alumno debe realizar para superar los objetivos y contenidos. Puesto que estas propuestas ---vamos a suponer---, no pueden, en principio, establecerse de antemano, sino que tienen que redactarse de modo expreso para cada alumno suspenso, proporcionar al guión por medio de cat un acceso a la entrada estándar, nos permitirá realizar la redacción de tales propuestas antes de que las sustituciones en la plantilla informe_plantilla.tex tengan efecto.

Esto nos lleva a modificar el guión obtenido el día pasado del modo siguiente [en rojo las nuevas líneas]:

# 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

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

# 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{1-ge-objetivos}/' \
-e 's/CONTENIDOS/\\input{1-ge-minimos}/' \
-e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA > Sancho-Panza.tex

pdflatex Sancho-Panza.tex

La instrucción echo produce un mensaje para el usuario, mientras que la instrucción cat abre la entrada estándar para que el usuario introduzca los datos que se almacenarán en el fichero trabajo_tmp.tex. Este fichero es luego incluido en el fichero Sancho_Panza.tex por obra de la última expresión del sed final.

Se habrá advertido que el usuario debe introducir las propuestas precedidas de '\item', puesto que el entorno LaTeX del que acabarán formando parte es un entorno lista. Esta última complicación se puede evitar fácilmente de forma que al usuario le baste introducir cada propuesta como un línea única (sin el \item). En tal caso, el \item debería añadirlo el propio guión, justo después del cat, con una instrucción como ésta:

sed -i 's/^\(.*\)/\\item \1/' trabajo_tmp.tex

Que la versión presentada en el primer capítulo de esta serie no contenga la simplificación aludida aceleró unos segundos la redacción del guión, aunque a expensas de complicar en parte la interfaz del usuario. Es lo que tiene el modo de obrar "rápido y sucio".

Queda, finalmente, añadir la sección relativa a las propuestas en nuestra plantilla:

...
\begin{document}
\begin{datosAlumno}
Alumno: ALUMNO & CURSO
\end{datosAlumno}
\begin{Objetivos}
OBJETIVOS
\end{Objetivos}
\begin{Contenidos}
CONTENIDOS
\end{Contenidos}
\begin{Propuestas}
RECUPERACIÓN
\end{Propuestas}

\end{document}

A estas alturas, el lector no debería hallar dificultad alguna en realizar por su cuenta las modificaciones que convengan y volver a poner a prueba el guión mejorado.

Resumen

  • La orden cat concatena los ficheros que se le proporcionan como argumentos y los imprime en la salida estándar, por defecto, la pantalla. Si no recibe argumentos toma su entrada de la entrada estándar.

  • Una de las aplicaciones comunes de la orden cat es permitir la creación interactiva de un fichero.

No hay comentarios:

Publicar un comentario