Notxor tiene un blog

Defenestrando la vida

Minicurso de LaTeX para psicólogos v

Notxor
2021-04-10

El problema en todo proyecto, incluyendo el crear documentación con LaTeX es organizarse. La organización de la tarea es fundamental para llevarlo a cabo, sobre todo si es un proyecto o documento complejo. Por tanto, en el artículo de hoy vamos a ver cómo organizar nuestro documento para poder dividirlo en partes más asequibles en lugar de ir poniendo todo en un sólo fichero monolítico. Además, puesto que veremos la forma de incluir el contenido de un fichero TeX en otro, veremos también cómo definir algunos comandos propios y, en la próxima entrega del minicurso los meteremos en un fichero de estilo para importarlo como cualquier otro paquete. Lo que hará que podamos utilizar de forma sencilla nuestros estilos entre los diferentes documentos que generamos, creándonos plantillas que le darán a nuestra producción estabilidad y presencia.

El concepto de documento maestro

Una forma de dividir el trabajo es utilizar un documento maestro, entendiendo por tal, el fichero que contiene la cabecera y una serie de instrucciones para importar el resto del contenido desde otros ficheros. Lo habitual es que se utilicen dos tipos de ficheros LaTeX para contener el código que generará nuestro documento:

  • .tex: contienen contenido LaTeX que escribimos para generar el documento.
  • .sty: contienen todas las definiciones o comandos que le proporcionan estilo a nuestro documento.

Lo más normal en proyectos grandes, como libros, tesis doctorales, trabajos de fin de grado, etc. La forma más habitual de hacer una importación de contenido LaTeX es utilizar el comando \input{}. Dicho comando recibe como parámetro el nombre, sin la extensión, de un fichero LaTeX. Las llamadas a input pueden incluir contenido que a su vez llame a input para añadir otro contenido. Para verlo de una forma más visual he creado tres ficheros .tex con el siguiente contenido:

  • El fichero aa.tex:

    % Fichero aa.tex
    \begin{itemize}
      \item Empieza el fichero \texttt{aa.tex}
      \item Incluye: \par \input{bb}
      \item El final del fichero \texttt{aa.tex}
    \end{itemize}
    
  • El fichero bb.tex:

    % Fichero bb.tex
    \begin{itemize}
      \item El principio del fichero \texttt{bb.tex}
      \item Incluye: \par \input{cc}
      \item El final del fichero \texttt{bb.tex}
    \end{itemize}
    
  • El fichero cc.tex:

    % El fichero cc.tex
    \begin{itemize}
      \item El contenido del fichero \texttt{cc.tex}
    \end{itemize}
    

Como vemos, el fichero aa.tex incluye a bb.tex y este último incluye el siguiente cc.tex. Después, basta con importar el primero en nuestro fichero de ejemplo:

\input{aa}

El resultado es el siguiente:

Captura-pantalla_input.png

En lugar de trabajar con unas simples listas, podríamos haber utilizado el comando \input para importar apartados completos del documento general: capítulos, secciones, etc. Mover nuestro contenido de un lugar a otro será tan fácil como mover la instrucción de importación a posiciones anteriores o posteriores.

Básicamente, en eso consiste el concepto de documento maestro. Es tan solo un documento donde se especifican las opciones y estilos, manteniendo el contenido independiente del resultado final. De esta forma, cualquier cambio en el estilo de algún tipo de párrafo se propaga automáticamente a lo largo del texto dándole coherencia al resultado final.

Por ejemplo:

\documentclass[11pt,a4]{book}

% Carga de paquetes necesarios
(...)
% Definición de ajustes finos
(...)
% Definición de nuevos comandos

\begin{document}
\maketitle

\tableofcontents
\part{Conceptos básicos}
\chapter{Tema 1}          % Podemos manejar aquí las cabeceras
\input{contenido-tema-1}  % para importar sólo el contenido

\input{tema-2}            % o podemos importarlo todo desde aquí
\input{otro-tema}

\part{Conceptos no tan básicos}
\input{un-tema-avanzado}
(...)
\end{document}

En el código anterior podemos observar la estructura de un documento maestro. Básicamente es una cabecera que define estilos que se complementa con una lista de importaciones de contenido.

Crear nuevos comandos y entornos

En ocasiones los comandos que nos proporciona LaTeX se nos quedan cortos o no funcionan exactamente como queremos, para esto viene bien tener la capacidad de crear un comando nuevo o modificar uno ya existente. Las situaciones en que esto sea necesario pueden ser muy variopintas, pero voy a poner dos ejemplos, aunque sean un poco forzados, para ilustrar que no es nada complicado el hacer nuevos comandos o redefinirlos, si fuera el caso. El formato del comando que crea comandos es el siguiente:

\newcommand{\nombre}[args][opciones]{definición}

Donde:

\nombre
es el nombre del comando.
args
es un número menor de 9 que indica el número de argumentos del comando.
opciones
define las opciones del comando... como implica el uso de condicionales en el código, lo pongo para que sepáis que existe, pero no es contenido para un uso básico de LaTeX.
definición
es texto LaTeX sin más, los argumentos dentro de la definición tendrán el formato #n, donde n indica el número de orden recibido.

¿Complicado? Parece que dicho así en abstracto lo es, pero es bastante más sencillo en la práctica. Vamos a ver un ejemplo sencillo: imagina que no tienes en el teclado los caracteres «» necesarios para utilizar las comillas españolas. Sin embargo, quieres utilizar las comillas a la española y no a la inglesa. ¿Qué hacemos? Pues definir un comando que al llamarlo las escriba por nosotros. Para ello definimos el siguiente comando:

\newcommand{\comillas}[1]{\guillemotleft{#1}\guillemotright}

Es decir, hemos definido el comando \comillas, que recibe 1 parámetro y que escribe \guillemotleft («) delante del parámetro #1 y después añade un \guillemotright (»).

Si añadimos en la cabecera dicho comando, podremos escribir en cualquier sitio de nuestro documentos, ─también de los documentos que importemos─, texto que haga referencia o llame a nuestro comando:

\section{Definición de nuevos comandos}

He creado un nuevo comando que me permitan poner \comillas{comillas
españolas} con más facilidad.

Repasando el funcionamiento del comando, podemos ver en este ejemplo, que el comando \comillas recibe un parámetro #1 con valor comillas españolas y, por tanto en la salida, lo rodea de un carácter \guillemotleft delante y un carácter \guillemotright detrás. Por otro lado, el mismo efecto se podría conseguir utilizando << delante y >> detrás, sin necesidad de crear un comando específico. El resultado en nuestro documento será:

Captura-pantalla_comando.png

Igual que podemos definir comandos, también podemos definir entornos de texto. El comando para hacerlo es muy similar:

\newenvironment{nombre}[args][opciones]{comienzo}{final}

La diferencia con la definición de comandos es que necesita dos bloques de código. La primera, comienzo, determina todos los comandos que afectarán al bloque de texto contenido en el entorno. La segunda, final, se compondrá de los comandos que restauren la presentación o características de los párrafos del documento que se han modificado en el primero bloque. Para verlo más claro, va un ejemplo. Pretendemos hacer que nuestras citas se remarquen visualmente mejor, nos gusta que el tamaño de la letra sea un poco más pequeño y que utilice letra cursiva para remarcar visualmente que ese texto no lo hemos escrito nosotros. El código podría ser el siguiente:

\newenvironment{cita}{%
  \small\it\begin{quotation}
    }{%
    \end{quotation}
  }

En el código anterior definimos un entorno llamado cita. Podríamos haber creado todo el entorno desde cero, definido márgenes, tipos de letra, familia de la fuente, etc. Todas esas definiciones irían en el primer bloque del comando. Posteriormente, deberíamos reestablecer los márgenes, fuentes y familia de la fuente, en el segundo bloque. Sin embargo, en LaTeX ya existe un entorno quotation que nos modifica los márgenes izquierdo y derecho del contenido para remarcar que es una cita textual de otro documento, libro u obra. Por lo tanto, vamos a aprovecharlo y puesto que sólo necesitamos que la letra sea un poco más pequeña (\small) y que se muestre en cursiva (\it), le forzamos a que inicie un bloque \quotation con estas opciones y cuando acabe, que restaure el estilo de texto cerrando dicho entorno.

Para hacer una prueba de funcionamiento he añadido el siguiente texto, tras añadir el comando anterior a nuestra cabecera:

Esto es una cita realizada con un entorno definido mediante la
redefición de un párrafo con el comando \texttt{newenvironment}
propio.

\begin{cita}
  Esto es una cita realizada con el comando de entorno definido y
  personalizado. Hay que observar que \emph{se aprovecha} la
  existencia de un formato de párrafo \comillas{ya existente} para
  modificar mínimamente el contenido.

  Y podemos ver que se pueden emplear sin problemas otros comandos que
  hemos definido nosotros.
\end{cita}

El resultado obtenido es el siguiente:

Captura-pantalla_entorno.png

Como vemos es muy sencillo el crear nuestros propios comandos y entornos, basándonos en los ya existentes. Crear comandos o entornos desde cero es algo más complejo y se sale de las pretensiones de este minicurso. Por otro lado, es posible que nuestras necesidades pasen por modificar el comportamiento de un comando o de un entorno ya existentes y que se pueda aplicar con el mismo nombre de comando o entorno. Si es así, si lo que hacemos en redefinir comandos previos, LaTeX nos lanzará un error. Para evitar eso debemos utilizar los comandos:

\renewcommand{\nombre}[args][opciones]{definición}
\renewenvironment{nombre}[args][opciones]{comienzo}{final}

Las opciones de las definiciones son las mismas para los renew que para los new, la única diferencia es que si utilizamos new, a secas, LaTeX interpreta que estamos creando un comando totalmente nuevo. Por tanto, si ya existía, nos lanzará un error para avisarnos de que estamos intentando crear un comando con un nombre ya utilizado. Si utilizamos renew interpretará que lo que queremos es redefinir un comando si existe y, si no existe lo creará.

Contadores

LaTeX utiliza una serie de contadores y/o variables para realizar algunas tareas de numeración a lo largo de los documentos. Por ejemplo, el número de página, el número de capítulo, el de la sección, el orden del ítem en una lista de tipo enumerate, etc. También podremos crear los nuestros, pero la necesidad de crear un contador o variable también sobrepasa el uso básico de LaTeX para meterse en profundidades de programación. De momento, en este minicurso, nos vamos a quedar con la posibilidad de modificar un contador ya existente, que ya es suficiente para un uso básico.

Por defecto, la lista de contadores con que cuenta LaTeX en un documento de clase book es la siguiente:

Tipo de uso contador significado
Estructura de documento page Página
  part Parte
  chapter Capítulo
  section Sección
  subsection Apartado
  subsubsection Subapartado
  paragraph Párrafo
  subparagraph Subpárrafo
Para entornos flotantes equation Ecuaciones
  figure Figuras
  table Tablas
Para anotaciones footnote Nota al pie
Para enumeraciones enumi 1er nivel de la lista
  enumii 2º nivel de la lista
  enumiii 3er nivel de la lista
  enumiv 4º nivel de la lista

Para obtener una cadena formateada con su valor, se suele utilizar el nombre de contador con the, ─el artículo en inglés─, delante. Esto es así, porque muchos de ellos pueden mostrarse encadenados. Por ejemplo, el índice de una sección suele estar formado por el número de capítulo y el número de sección. Hablar de los contadores y sus idiosincrasias así en abstracto es complejo, mejor es ver cómo funcionan y cómo podemos utilizarlos según nuestras necesidades.

Vamos a poner un par de ejemplos para ilustrar cómo se trabaja con los contadores de una manera más avanzada. Para empezar, con un primer ejemplo que podemos necesitar: comenzamos una enumeración, y resulta que debemos detenerla para dar una explicación algo más larga. Cerramos el entorno enumerate, escribimos nuestra explicación y cuando queremos retomarla abriendo de nuevo el entorno enumerate resulta que la numeración vuelve a comenzar por el 1.

Observa el siguiente código:

\begin{minipage}[c]{0.40\linewidth}
  Por algún motivo necesitamos realizar una enumeración:

  \begin{enumerate}
  \item Ítem 1
  \item Ítem 2
  \item Ítem 3
  \end{enumerate}

  Aquí se interrumpe la enumeración para dar alguna explicación,
  cuando lo retomamos ocurre lo siguiente, si no modificamos el valor
  del contador:

  \begin{enumerate}
  \item Ítem 4
  \item Ítem 5
  \end{enumerate}
\end{minipage}
\hfill
\begin{minipage}[c]{0.45\linewidth}
  Los motivos para hacer la enumeración puede ser los mismos que en el
  caso de aquí al lado:

  \begin{enumerate}
  \item Ítem 1 
  \item Ítem 2
  \item Ítem 3
  \end{enumerate}

  Y también tenemos que interrumpir la enumeración, dando
  explicaciones, por el motivo que sea. Ahora bien, en este caso
  modificamos el valor del contador:

  \begin{enumerate}
    \setcounter{enumi}{3}
  \item Ítem 4
  \item Ítem 5
  \end{enumerate}
\end{minipage}

El resultado será el siguiente:

Captura-pantalla_cambiar-contador.png

No te pierdas en el código, sólo he definido dos minipáginas para poder mostrar el efecto de no modificar el contador (a la izquierda) y de modificarlo (a la derecha). Como podemos ver en la imagen, la enumeración de la derecha se retoma con el ítem 4, mientras que la de la izquierda comienza a numerar de nuevo. Para hacerlo, si miramos el segundo entorno enumerate de la segunda minipage, he utilizado el comando \setcounter

\setcounter{contador}{valor}

Donde,

contador
Es el nombre del contador que queremos modificar.
valor
Es el valor que se quiere establecer.

Hay que tener en cuenta, que cuando el entorno enumerate inicia su contador lo hace puesto a 0 porque luego cada comando \item lo actualiza. De esta manera es recomendable pensar, para no liarnos, que debemos establecer el valor del contador a aquél que tenía cuando lo interrumpimos.

Ahora bien, una cosa son los contadores y otra es cómo se visualizan en el código. Pongo un ejemplo completo y después lo explicaré:

\subsection{Visualización de contadores}

Cambiar los valores por defecto de los contadores de enumeración:

\begin{enumerate}
\item \texttt{enumi}
  \begin{enumerate}
  \item \texttt{enumii}
    \begin{enumerate}
    \item \texttt{enumiii}
      \begin{enumerate}
      \item \texttt{enumiv}
      \end{enumerate}
    \end{enumerate}
  \end{enumerate}
\end{enumerate}

\renewcommand{\theenumi}{\Alph{enumi}}
\renewcommand{\labelenumi}{({\theenumi})}
\renewcommand{\theenumii}{\alph{enumii}}
\renewcommand{\labelenumii}{--{\theenumii}--}
\renewcommand{\theenumiii}{\Roman{enumiii}}
\renewcommand{\labelenumiii}{{\theenumiii}:}
\renewcommand{\theenumiv}{\alph{enumi}.\arabic{enumii} -- \Alph{enumiii}).\Roman{enumiv}}
\renewcommand{\labelenumiv}{{\theenumiv}~$\bullet$}

\begin{enumerate}
\item \texttt{enumi}
  \begin{enumerate}
  \item \texttt{enumii}
    \begin{enumerate}
    \item \texttt{enumiii}
      \begin{enumerate}
      \item \texttt{enumiv}
        \renewcommand{\theenumiv}{\arabic{enumi}.\arabic{enumii}.\arabic{enumiii}.\arabic{enumiv}.}
      \item etiqueta cambiada sobre la marcha.
      \end{enumerate}
    \end{enumerate}
  \end{enumerate}
\end{enumerate}

Sí, podemos escribir comandos en cualquier sitio de nuestro documento. Cuando lo hacemos en la cabecera, afectará a todo el documento, mientras que si lo hacemos en otros lugares, afectará sólo al contenido del documento que se encuentra tras él. Por tanto, en cualquier sitio podemos utilizar un \renewcommand, como ilustra el ejemplo anterior.

El resultado del código de ejemplo anterior en nuestro documento es el siguiente:

Captura-pantalla_visualizar-contadores.png

Como se puede apreciar utilizo el comando \renewcommand, porque estoy modificando instrucciones que ya estaban definidas. Además, también hay que llamar la atención, que una cosa es el contador (enumi), otra su representación (theenumi) y otra la etiqueta que utilizamos en la enumeración (labelenumi). Y para rematar, también contamos con varias formas de enumeración:

Comando Tipo
\arabic Número normal
\Roman Número romano en mayúscula
\roman Número romano en minúscula
\Alph Letra mayúscula
\alph Letra minúscula

Para ilustrar cómo funcionan los distintos tipos de numeración de los contadores he introducido una tabla en nuestro fichero de ejemplo:

\begin{table}[ht]
  \centering
  \begin{tabular}{lr}
    {\bf Formato} & {\bf Resultado}\\
    \hline
    \verb|\arabic{section}| & \arabic{section} \\
    \verb|\Roman{section}|  & \Roman{section} \\
    \verb|\roman{section}|  & \roman{section} \\
    \verb|\Alph{section}|   & \Alph{section} \\
    \verb|\alph{section}|   & \alph{section} \\
    \hline
  \end{tabular}
  \caption{Tipos de numeración}
  \label{tab:tipos-numeracion}
\end{table}

El resultado es el siguiente:

Captura-pantalla_tabla-numeracion.png

Conclusión

Para acabar el minicurso nos queda hablar de crear nuestro primer archivo de estilos LaTeX. Una vez que hemos visto cómo podemos definir y redefinir comandos y entornos, la tarea será fácil. El fichero .sty que crearemos será sencillo, importará algunos estilos externos y los modificará con los comandos que ya hemos visto. Introduciré algún comando nuevo y presentaré algún paquete útil para afinar en el aspecto de nuestros documentos. Con todo esto, creo que nuestro minicurso llegará a su fin. No te pierdas la última entrega.

Recuerda que nuestro fichero de ejemplo ha ido creciendo poco a poco y que podéis descargarlo con las últimas modificaciones de este enlace. A su vez, también puedes descargar el pdf generado.

Categoría: latex

Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, he decidido no proporcionar dicha opción en el Blog. Si alguien quiere comentar algo, me puede encontrar en esta cuenta de Mastodon, también en esta otra cuenta de Mastodon y en Diaspora con el nick de Notxor.

Si usas habitualmente XMPP (si no, te recomiendo que lo hagas), puedes encontrar también un pequeño grupo en el siguiente enlace: notxor-tiene-un-blog@salas.suchat.org

Disculpen las molestias.