Fundamentos de TikZ

TikZ es el sistema estándar para dibujar gráficos vectoriales directamente dentro de LaTeX, en código. Escribes coordenadas, líneas, círculos, flechas y nodos en el mismo código fuente que la prosa, y la figura se compone con las mismas fuentes y la misma calidad que el texto. Sin idas y vueltas a un programa de dibujo externo; tus figuras se vuelven una parte reproducible del documento. Ese es el tema de esta página.

PGF y TikZ

Primero, los nombres. En la base está PGF (Portable Graphics Format), un motor gráfico de bajo nivel que dibuja realmente las líneas mientras suaviza diferencias de controlador (PDF frente a DVI). Escribir PGF crudo es laborioso. Por eso TikZ es la interfaz amable (una capa de macros) colocada sobre PGF para hacer agradable el dibujo. Ambos fueron creados por Till Tantau.

El nombre TikZ es un acrónimo recursivo de estilo GNU del alemán “TikZ ist kein Zeichenprogramm” (“TikZ no es un programa de dibujo”). Su pronunciación no está fijada oficialmente: se oye /tiks/, /tikts/ o /tik-zee/. En la práctica se habla de “PGF/TikZ” como una sola cosa, y lo que escribimos casi siempre es el lado TikZ.

Empezar es fácil: basta con poner \usepackage{tikz} en el preámbulo, y PGF se carga con él. Funciona directamente con pdfLaTeX, LuaLaTeX y XeLaTeX. Solo cuando pasas por DVI, como con pLaTeX o upLaTeX, debes especificar también un controlador, normalmente dvipdfmx, como opción de clase.

document.tex
\documentclass{article}   % pLaTeX なら \documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}
\begin{document}
We are working on
\begin{tikzpicture}
  \draw (-1.5,0) -- (1.5,0);
  \draw (0,-1.5) -- (0,1.5);
\end{tikzpicture}.
\end{document}

Esto compone el texto “We are working on”, luego dibuja en la misma línea una pequeña cruz, una línea horizontal y otra vertical que pasan por el origen, y termina con un punto. Esa integración de una figura en la línea de texto es la sensación de TikZ.

El entorno tikzpicture

Toda figura se dibuja dentro del entorno tikzpicture (\begin{tikzpicture}\end{tikzpicture}). Es el “lienzo” que contiene una imagen; dentro enumeras los comandos de dibujo. En los corchetes tras el nombre del entorno puedes poner opciones que se aplican a toda la imagen, por ejemplo [scale=2] para duplicar el tamaño o [thick] para engrosar todo.

Para una figura diminuta de una línea no hace falta abrir el entorno: existen las formas en línea \tikz{...} y, para un solo comando, \tikz \draw ...;. Uses la forma que uses, hay una regla que no debes olvidar: cada comando de dibujo termina con punto y coma ;. El punto y coma marca “este camino termina aquí”; olvidarlo es un error, el tropiezo más común al empezar.

latex
% 行内(インライン)
\tikz \draw (0,0) -- (1.5,0);

% 環境(複数のコマンド)
\begin{tikzpicture}
  \draw (-1.5,0) -- (1.5,0) -- (0,-1.5) -- (0,1.5);
\end{tikzpicture}

El modelo de camino — coordenadas y operaciones

Dibujar en TikZ gira en torno al camino (path): una ruta que describe cómo se avanza de punto en punto. El nombre del comando elige cómo se muestra esa ruta. \draw traza el camino como una línea, \fill rellena el interior de un camino cerrado, \filldraw rellena y luego traza el contorno, y \path solo define la ruta sin dibujar nada, útil para colocar coordenadas o nodos que se referenciarán después.

Hay tres formas de especificar un punto. Las cartesianas (x,y) usan centímetros por defecto, así que (1,2) significa 1 cm a la derecha y 2 cm hacia arriba; puedes dar unidades explícitas, como (1cm,2pt). Las polares (angle:radius) se leen como “en esta dirección, esta distancia”, por ejemplo (30:1cm). Si das nombre a un punto, una coordenada nombrada, puedes recuperarlo después por nombre. También existen movimientos relativos: ++(1,0) avanza 1 cm a la derecha *y* actualiza el punto actual, mientras que +(1,0) es relativo al punto inicial sin actualizarlo.

Las operaciones de camino deciden cómo avanza la ruta. -- dibuja una línea recta del punto anterior al siguiente, encadenándolos como (a) -- (b). rectangle crea un rectángulo a partir de dos esquinas opuestas, circle un círculo alrededor de un centro, ellipse una elipse, arc un arco circular y grid una rejilla de líneas. Las curvas vienen de .. controls .. (curva de Bézier) o, como veremos, de to[bend]. Para cerrar una forma, termina con -- cycle y vuelve al inicio.

La forma moderna de pasar argumentos a una forma es usar pares clave-valor en [...]. Un círculo es circle [radius=10pt], una elipse ellipse [x radius=20pt, y radius=10pt], un arco arc [start angle=0, end angle=30, radius=3mm] (de 0° a 30°, radio 3 mm). Para grid, [step=.5cm] fija la separación. El ejemplo siguiente dibuja una rejilla tenue, luego un círculo de radio 1 cm en el origen y una recta del origen a (1,1).

latex
\begin{tikzpicture}
  \draw[step=.5cm, gray, very thin] (-1.4,-1.4) grid (1.4,1.4);
  \draw (0,0) circle [radius=1cm];
  \draw (0,0) -- (1,1);
  \fill[blue!20] (0,0) rectangle (0.5,0.5);
\end{tikzpicture}

La imagen coloca una rejilla gris tenue en pasos de 0,5 cm desde (-1.4,-1.4) hasta (1.4,1.4), y encima un círculo centrado en el origen, una diagonal del origen a (1,1), y un pequeño cuadrado de 0,5 cm en el origen relleno de azul claro. blue!20 significa “20% azul”: azul mezclado con blanco.

Nodos — colocar texto y formas

Un nodo (node) coloca texto o una forma en una coordenada dada; es la herramienta principal para etiquetar figuras. La forma básica es \node[options] (name) at (coordinate) {contents};. Las opciones incluyen draw (trazar un borde), circle o rectangle (la forma), fill=blue!20 (relleno), etc. El name entre paréntesis se convierte en el identificador del nodo, que luego puedes referenciar como (name) o (name.north).

Un patrón que usarás constantemente es colocar primero nodos con nombre y luego conectar esos nombres con líneas. Como unes por nombre de nodo en lugar de coordenadas crudas, las líneas de conexión siguen automáticamente cuando mueves las cosas.

latex
\begin{tikzpicture}
  \node (a) at (0,0)   [draw, circle, fill=blue!20] {A};
  \node (b) at (2.5,0) [draw, circle, fill=blue!20] {B};
  \draw[->] (a) -- (b);
\end{tikzpicture}

Esto dibuja dos nodos circulares azul claro etiquetados “A” y “B”, separados 2,5 cm, y una línea con flecha de A a B. La línea se detiene limpiamente en el borde de cada nodo en lugar de meterse en los círculos.

Los nodos también pueden colocarse a lo largo de un camino. Escribir \draw (a) -- (b) node[midway] {label}; pone una etiqueta en el punto medio (midway) de la línea de a a b; añade above o below para desplazarla fuera de la línea. Es la forma estándar de anotar una conexión.

Opciones y estilos

La apariencia de una línea se controla con opciones entre corchetes. Comunes: grosores thin / thick / very thick; colores como red o blue!50; dashed o dotted; rounded corners; y flechas. Las flechas son -> (punta al final), <- (al inicio), <-> (ambos extremos). De hecho, TikZ adopta una regla pragmática: cualquier opción desconocida que contenga - se interpreta como especificación de flecha.

OpciónSignificado
thick / very thickLíneas más gruesas (hasta ultra thick)
red, fill=blue!50Color de trazo o relleno (!n fija la intensidad)
dashed / dottedLíneas discontinuas o punteadas
rounded cornersRedondear las esquinas de un camino
->, <-, <->Punta de flecha al final, al inicio o en ambos
scale=2Escalar esa imagen o camino por 2

Si repites la misma decoración, lo habitual es nombrarla como estilo y reutilizarla. Defínela en el preámbulo con \tikzset{name/.style={...}}, o en el momento en las opciones de tikzpicture. Por ejemplo, el siguiente fragmento define un estilo help lines y lo aplica a una rejilla.

latex
\tikzset{help lines/.style={color=blue!50, very thin}}

\begin{tikzpicture}
  \draw[help lines] (0,0) grid (3,2);
  \draw[thick, red, ->, rounded corners] (0,0) -- (1,2) -- (3,2);
\end{tikzpicture}

Esto dibuja una rejilla azul tenue de (0,0) a (3,2), luego una línea roja gruesa que se dobla desde el origen hasta (1,2) y luego a (3,2), con esquinas redondeadas y una punta de flecha al final. Como la rejilla usa un estilo, cambiar very thin por thin rediseña toda la rejilla en un solo lugar.

Bibliotecas — cargar las funciones necesarias

El núcleo de TikZ se mantiene deliberadamente pequeño; las funciones especializadas se dividen en bibliotecas que cargas con \usetikzlibrary{...} en el preámbulo, separadas por comas si son varias. Las más útiles:

  • arrows.meta — un conjunto rico y ajustable de puntas de flecha (-{Stealth}, -{Latex}, …). La biblioteca antigua arrows está obsoleta; usa esta.
  • positioning — colocación relativa de nodos, para escribir right=of a o below=1cm of b.
  • calc — aritmética de coordenadas: ($(a)+(1,0)$) es “1 cm a la derecha de a”, y ($(a)!0.5!(b)$) es “el punto medio de a y b”.
  • shapes — muchas formas de nodo más allá de círculo y rectángulo (rombos, estrellas, llamadas). Subdividida, por ejemplo shapes.geometric.
  • decorations — decorar un camino como onda, zigzag, llave y más (por ejemplo decorations.pathmorphing).
  • patterns — rellenar con un patrón, como tramado, líneas o puntos.
  • fit — construir automáticamente una caja que encierre varios nodos.
  • backgrounds — dibujar un marco o fondo en una capa de fondo detrás de la imagen.
  • matrix — alinear nodos en una rejilla (matriz); graphdrawing hace diseño automático (requiere LuaTeX).

El ejemplo siguiente es un pequeño diagrama de flujo que combina arrows.meta y positioning. Solo el primer nodo recibe una coordenada; los demás se colocan relativamente (“a la derecha”, “debajo”) y se unen con puntas de flecha de estilo Stealth.

document.tex
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning}

\begin{tikzpicture}[node distance=1cm, every node/.style={draw, rounded corners}]
  \node (start)            {Start};
  \node (proc)  [right=of start] {Process};
  \node (end)   [right=of proc]  {End};
  \draw[-{Stealth}] (start) -- (proc);
  \draw[-{Stealth}] (proc)  -- (end);
\end{tikzpicture}

Esto produce un diagrama de flujo de izquierda a derecha: tres cajas de esquinas redondeadas etiquetadas “Start”, “Process” y “End”, separadas 1 cm y unidas en orden por puntas Stealth afiladas. El truco es every node/.style, que da a todos los nodos un aspecto común de una vez.

Coste de compilación y externalize

Como LaTeX calcula y dibuja las figuras TikZ elemento por elemento, las imágenes complejas o numerosas hacen que la compilación sea notablemente lenta. Los gráficos y las rejillas densas son especialmente pesados.

El remedio estándar es la biblioteca externalize. Carga \usetikzlibrary{external} y declara \tikzexternalize; cada tikzpicture se compila una sola vez en su propio PDF y se cachea. En ejecuciones posteriores, si el contenido de la figura no ha cambiado, TikZ omite el cálculo e incluye simplemente el PDF terminado. La primera ejecución es lenta, pero los ciclos de edición posteriores se vuelven mucho más rápidos; las figuras se regeneran automáticamente al cambiarlas. También puedes separar una figura grande en su propio archivo y compilarla sola con la clase standalone.