LaTeX y compañía

Informacion sobre LaTeX y programas relacionados

4.5.11

LaTeX previewer y primer contacto con TikZ

LaTeX previewer es un sitio web realmente útil. Te permite escribir un poco de código latex (por ejemplo, una ecuación), y te muestra el resultado de compilarlo, ya sea en forma de bitmap (PNG) o vectorial (SVG).

Al margen de poder usarlo para crear rápidamente una versión PNG o SVG de una fórmula, la verdadera utilidad que yo le encuentro es la de poder probar rápidamente una idea "a ver cómo queda", sin tener que escribir un .tex completo, compilarlo, y abrir el visor PDF.

Y esta utilidad se convierte en una verdadera maravilla cuando estás aprendiendo TikZ. Te permite experimentar con las diferentes sintaxis y ejemplitos que vas encontrando en el manual, e incluso puede usarse como herramienta de trabajo en figuras no muy complejas. Más de una vez he creado mis figuras con LaTeX previewer y cuando las tuve a mi gusto, corté y pegué el código en mi documento.

Para abrir boca, tú mismo puedes probar a introducir el siguiente fragmento de código (TikZ) y compilarlo para ver el resultado. Para que funcione correctamente, no debes olvidar primero pulsar el botón "Packages" y asegurarte de añadir el paquete tikz.

\begin{tikzpicture}
\path (0,0) coordinate (A) {}
  (1,1) coordinate (B) {}
  (3,0) coordinate (C) {};
\draw[dashed] (A) -- (B) -- (C);
\foreach \punto in {A,B,C}
\fill[red] (\punto) circle (2pt) node[above,blue] {\punto};
\end{tikzpicture}

Comentario al código

Aprovecho la entrada para ir desgranando un poco la curiosa sintaxis de TikZ. Como ves, cuando se quiere meter un dibujo TikZ en un documento, se abre un entorno llamado tikzpicture y dentro de él los comandos tikz. No necesita ir a su vez dentro de un entorno figure, a menos que quieras que "flote" y tenga un pie de figura. Esto permite también hacer mini-figuras "en el texto". Cuando la figura es tan simple que cabe en una sola línea de código, puedes usar el comando \tikz en lugar del entorno tikzpicture. Así (pruébalo también en el previewer):

\def\puntorojo{\tikz\fill[red] circle(.5ex);}

R\puntorojo{}j\puntorojo{}.

Lo primero que llama la atención en TikZ es que su sintaxis usa corchetes, llaves y paréntesis en una forma que al principio parece caótica o caprichosa. También algunas veces tiene palabras reservadas que comienzan por \ como otros comandos tex (\path, \draw, \fill, mientras que otras no llevan la barra delante (node, circle). En realidad hay un orden dentro del caos y cuando te acostumbras ya no necesitas pensarlo. Esta es la regla general:

  • Corchetes [ ] para indicar opciones (estilos) de los comandos de dibujo, como por ejemplo el color, aunque hay muchos más.
  • Paréntesis ( ) para especificar las coordenadas de un punto, como en (0,0), o los nombres que queramos asignarles a esas coordenadas, como (A), (B), etc. También se usan paréntesis para pasar parámetros a algunas funciones TikZ, como por ejemplo para especificar el radio del círculo en la función circle.
  • Llaves para delimitar argumentos a los comandos que comienzan por \, como en latex, aunque no se usan muy a menudo con este cometido. En el ejemplo hay un caso en {A,B,C} que es un argumento de \foreach. También se usan llaves para delimitar los contenidos de un "nodo" (que es como TikZ llama a lo que yo llamaría "etiqueta", es decir, un texto situado en un lugar concreto del dibujo para anotar o describir parte del mismo). El texto que ponemos entre llaves en este caso es cualquier cosa válida para LaTeX, lo que implica que podemos usar fórmulas, matemáticas, lo que sea (¡incluso tablas!). En el ejemplo este uso aparece en {\punto}, aunque requiere un poco más de explicación, porque \punto es una macro cuyo valor se va asignando en el bucle \foreach. Más adelante explico esto.
  • Para especificar "caminos" (que son secuencias de coordenadas, en las cuales podemos ir poniendo texto, u otros elementos gráficos), o para pintar esos caminos con un trazo, se usan primitivas de TikZ, que están definidas como comandos LaTeX y por tanto sus nombres comienzan por \, como \path, \draw, \fill, etc. También hay otras macros que proporcionan utilidades especiales, como hacer bucles (\foreach), definir estilos, realizar cálculos de expresiones matemáticas, etc. De éstas últimas no hay en este primer ejemplo, pero ya vendrán.
  • Por último, si como parte de un camino queremos meter en él algún objeto geométrico "predefinido" tal como un círculo, rectángulo, rejilla, etc. o tambíen un "nodo" (que como ya dije es un tipo de elemento gráfico que simplemente es un contenedor de texto LaTeX), las palabras reservadas para estos objetos no comienzan por la barra. Así tenemos: node, circle, etc. La sintaxis que sigue a estas palabras es un poco variable, ya que depende de la palabra en cuestión. Por ejemplo, tras node podemos poner corchetes, si vamos a especificar opciones del nodo (como above, blue), y también podemos poner paréntesis si queremos asignarle un nombre a ese nodo para usarlo más adelante para referirnos a él (en el ejemplo no se da este caso), y finalmente, de forma obligatoria deberemos usar llaves para especificar el contenido del nodo, es decirl el texto que aparecerá ahí. Incluso si en algún caso queremos crear un nodo que no contenga texto, aún así deben ponerse las llaves. En cambio, si el objeto es circle, como vemos la sintaxis obliga a que usemos paréntesis a continuación, para especificar el radio del círculo. Aquí es donde la sintaxis puede parecer más inconsistente, y donde la práctica es insustituible.

Una vez aclarada la sintaxis, veamos línea a línea qué hace nuestro código:

\path (0,0) coordinate (A) {}
  (1,1) coordinate (B) {}
  (3,0) coordinate (C) {};

Lo anterior podría haber ido en una sola línea. Para TikZ es un solo comando, y el punto y coma final (obligatorio) es la marca de dónde termina. El comando \path espera una secuencia de coordenadas, y en cada una de ellas podría ir algún objeto gráfico o no. El resultado de \path es invisible, a menos que contenga objetos gráficos en las coordenadas especificadas.

En este ejemplo, el camino está compuesto por tres coordenadas. La primera es (0,0>, y en ella colocamos un objeto gráfico que es coordinate. Una coordinate es un objeto invisible, cuya única función es poder asignarle un nombre a la coordenada que acabamos de usar. En el ejemplo, a esa coordenada le asignamos el nombre (A). Internamente TikZ implementa el objeto coordinate como un tipo de node, pero sin dimensiones. Esto explica que obligatoriamente aparezca {}, pues las llaves son obligatorias para indicar el contenido del nodo, incluso cuando el contenido está vacío como en este caso.

De forma análoga se asigna el nombre (B) a la coordenada en (1,1) y el nombre (C) a la que hay en (3,0). Por cierto que habrás notado que las coordenadas no llevan unidades. Por defecto se trata de centrímetros.

\draw[dashed] (A) -- (B) -- (C);

El comando \draw es como \path, es decir, espera una secuencia de coordenadas y opcionalmente objetos gráficos a poner en ellas, pero a diferencia de \path que es "invisible", el comando \draw pinta líneas o curvas uniendo esas coordenadas. En nuestro caso, el conector usado entre coordenadas ha sido --, lo que indica que debe dibujarse un segmento rectilíneo entre ellas. Para las coordenadas podría haber puesto números como (0,0), etc, pero he usado en cambio los nombres que había asignado anteriormente a esas cordenadas, lo que hace el código más legible y fácil de mantener. Observa también que el comando \draw lleva una opción de estilo [dashed] que causa que la línea dibujada sea discontinua.

\foreach \punto in {A,B,C}

Aquí viene uno de los comandos más interesantes de TikZ. Tanto es así que tiene su paquete separado, por si quieres usar \foreach para otras cosas que no sean dibujos, sin tener que incluir TikZ completo (para este caso \usepackage{foreach}). Como imaginas por su nombre, este comando permite realizar bucles. El primer parámetro tras \foreach es el nombre de una macro que tú eliges para la ocasión. Esta macro irá tomando diferentes valores en cada iteración del bucle. Después debe aparecer la palabra reservada in y por último, entre llaves y separado por comas, la lista de valores que quieres que tome la macro. En nuestro caso, el bucle iterará tres veces y \punto irá tomando los valores A, B y C en cada iteración. (En realidad \foreach es aún más potente, pero ya lo iremos viendo en otras entradas).

Por último, \foreach necesita el código a ejecutar en cada iteración del bucle. Este código debería ir entre llaves, pero si se trata de un código "de una línea" (un comando TikZ terminado en punto y coma), puedes omitir las llaves, como he hecho yo en este caso.

 \fill[red] (\punto) circle (2pt) node[above,blue] {\punto};

En la primera iteración, \punto se expande como A, por lo que la línea anterior se convierte en esta otra:

 \fill[red] (A) circle (2pt) node[above,blue] {A};

Veamos qué significa. En primer lugar tenemos \fill, que es como \path, solo que rellena el camino dibujado y los objetos que hay en él. El color de relleno es una opción de estilo, [red], y el camino en sí, en este caso, se compone de una única coordenada, (A). En dicha coordenada ponemos dos objetos gráficos en esta ocasión. El primero es el círculo de radio 2pt, y el segundo es un node que contiene el texto A (observa las llaves alrededor del contenido del nodo). Además el nodo recibe dos opciones de estilo: above indica que el texto del nodo debe aparecer encima de la coordenada en cuestión (saldrá encima del círculo). blue obviamente es el color del texto.

Es decir, pintará un circulito rojo en la coordenada (A) y encima de él, el texto "A". Y en la siguiente iteración del bucle hará lo propio con la coordenada B, y finalmente la C. Potente ¿eh?

Sintaxis alternativas

TikZ ofrece muchas formas diferentes de expresar la misma figura, lo cual está bien para que cada cual encuentre la que mejor se ajusta a su forma de pensar sobre el problema. A veces sin embargo tanta variedad produce duda y confusión, sobre todo mientras se está aprendiendo. Veamos algunas otras formas en las que podía haber codificado la figura anterior.

En lugar de hacer primero un \path sobre el cual ir definiendo coordenadas, para después dibujarlas con \draw, podría haberlo hecho todo en el mismo paso, así:

\draw[dashed] (0,0) coordinate (A) {}  
           -- (1,1) coordinate (B) {}  
           -- (3,0) coordinate (C) {};
Observa que, además de cambiar \path por \draw[dashed], he tenido que añadir el operador -- para conectar las coordenadas. Sin él tampoco sería visible la línea, ya que si en un comando \draw aparece una coordenada que no está precedida de --, lo que hace TikZ es simplemente "levantar el lápiz" y moverse a esa posición, sin dibujar línea hasta esa coordenada

En la sintaxis anterior, y también la primera en que usé \path parece un poco torpe el tener que poner todas esas llaves sin nada dentro. Como ya se explicó, se debe a que coordinate es un tipo de node y se requiere especificar su contenido textual entre llaves, incluso cuando esté vacío. Para colmo, es que en un nodo de tipo coordinate ¡debe ir obligatoriamente vacío! Parece un contrasentido que se nos obligue a especificar un contenido vacío en este caso, cuando ha de serlo forzosamente.

Por ello, TikZ proporciona el comando \coordinate que sirve para especificar una secuencia de nodos de tipo coordinate, con la idea de asignarles nombres como en el ejemplo anterior, y con la ventaja de que no es necesario especificar en este caso el contenido vacío de cada nodo. En este caso, sin embargo, cambia ligeramente la forma de asignar coordenadas al nodo, ya que en lugar de estar dando una serie de coordenadas y en cada una de ellas poniendo un objeto coordinate, lo que haremos será especificar un objeto coordinate asignarle una posici, mediante la función at.

Es decir, en lugar de:

\path (0,0) coordinate (A) {};
pondríamos
\coordinate (A) at (0,0);
Usando esta sintaxis el código queda un poco más limpio, si bien hay que separar cada coordenada en un comando \coordinate independiente, a diferencia de \path o \draw que permiten en un solo comando especificar varias coordenadas.
\coordinate (A) at (0,0);
\coordinate (B) at (1,1);
\coordinate (C) at (3,0);

Etiquetas:

Comentarios:

  1. Me quedo todo claro ahora.
     
Publicar un comentario en la entrada
 
 

Powered by Blogger