Diagramas conmutativos (tikz-cd / amscd)

«Este diagrama conmuta» es quizá la frase más corta y más cargada de las matemáticas: sustituye a un conjunto de igualdades que ocuparía varias líneas. Un diagrama conmutativo convierte los objetos en puntos y las aplicaciones en flechas, y afirma que dos caminos dirigidos cualesquiera entre el mismo par de objetos componen la misma aplicación. En LaTeX, la manera estándar de dibujar uno es hoy \usepackage{tikz-cd} —el entorno se llama tikzcd, sin guion—, mientras que el paquete de la AMS amscd sigue bastando para retículas rectangulares simples. Esta página construye un cuadrado conmutativo desde cero, reparte las etiquetas a ambos lados de las flechas, las curva y termina en la cuestión de qué paquete cargar.

Qué afirma en realidad «el diagrama conmuta»

Conmutar significa que todo camino dirigido con el mismo origen y el mismo destino da la misma composición. En un cuadrado con A, B, C, D en las esquinas —f arriba de A a B, β a la derecha de B a D, α a la izquierda de A a C y g abajo de C a D—, decir que conmuta equivale exactamente a la única igualdad β∘f = g∘α. Un triángulo enuncia una ecuación, un cuadrado una, un cubo seis, una por cara, todas plegadas en una sola imagen. Cuanto mayor es el diagrama, más se abre la distancia entre lo que contiene el dibujo y lo que costarían las ecuaciones escritas. Un diagrama conmutativo no es adorno: es notación comprimida.

Esa compresión rinde sobre todo en la caza de diagramas (diagram chasing). Las demostraciones del álgebra homológica —el lema de los cinco, el lema de la serpiente— consisten en tomar un elemento en una esquina y empujarlo a lo largo de las flechas, recorriendo el diagrama. La conmutatividad es la regla que garantiza, en cada paso de ese recorrido, que ambas rutas llegan al mismo sitio. El diagrama no es solo una imagen: es el tablero sobre el que se juega la demostración. Estos diagramas entraron en la escritura matemática con el artículo de 1945 que fundó la teoría de categorías; esa historia, y los propios símbolos de flecha, se tratan en la página de las flechas.

Un diagrama es en sí una fórmula en display, así que va dentro de \[\] o de un entorno equation, que le da una línea propia y centrada. Históricamente se escribió todo un estante de paquetes para esta tarea —xypic, diagram, kuvio, entre otros—, pero para trabajo nuevo el campo se ha reducido a dos: tikz-cd, construido sobre el paquete general de dibujo TikZ, y el paquete de la AMS amscd. Se ven por turno.

\usepackage{tikz-cd} y el entorno tikzcd

En el preámbulo va \usepackage{tikz-cd} y en el cuerpo el diagrama se envuelve en \begin{tikzcd}\end{tikzcd}. El nombre del paquete lleva guion; el del entorno, no. Al invertirlos aparece ! LaTeX Error: File 'tikzcd.sty' not found.; al escribir el entorno sin cargar el paquete aparece ! LaTeX Error: Environment tikzcd undefined. Si TikZ ya está cargado, \usetikzlibrary{cd} da exactamente lo mismo. La versión actual en CTAN es la 1.0, con fecha del 4 de mayo de 2021, mantenida por Augusto Stoffel. Las puntas de flecha se distribuyen como biblioteca propia, dibujadas para casar con las flechas de la fuente Computer Modern: por eso las flechas del diagrama no parecen prestadas de otra fuente.

Dentro de tikzcd se escribe exactamente lo mismo que en tabular o matrix: celdas separadas por &, filas por \\. Cada celda se convierte en un nodo del diagrama y su contenido se compone automáticamente en modo matemático, de modo que no hacen falta $. Añadir \arrow a una celda hace brotar una flecha; el alias corto \ar es el mismo comando. La flecha se escribe en la celda de la que parte, y su destino se indica entre corchetes mediante claves de dirección: r derecha, l izquierda, u arriba, d abajo. Se combinan en cadena: [rd] va en diagonal hacia abajo y a la derecha, [rr] alcanza dos celdas más allá. Una misma celda puede emitir tantas flechas como se quiera.

latex
\usepackage{tikz-cd}   % package has a hyphen; environment does not
\[
\begin{tikzcd}
  A \arrow[r, "f"] \arrow[d, "\alpha"'] & B \arrow[d, "\beta"] \\
  C \arrow[r, "g"']                     & D
\end{tikzcd}
\]

Ese es el cuadrado conmutativo. A, B, C, D ocupan las cuatro esquinas; f va hacia la derecha por arriba, g hacia la derecha por abajo, y α y β bajan por los lados izquierdo y derecho. & separa columnas y \\ separa filas, así que el armazón no es más que A & B \\ C & D. Las flechas son anotaciones insertadas después en ese armazón, y la posición de los objetos no depende en absoluto de cómo se escriban las flechas: el rasgo más agradable del diseño de tikzcd.

Etiquetar una flecha encima o debajo: "f" frente a "f"'

Una cadena entre comillas entre las opciones se convierte en etiqueta, y un apóstrofo ' justo después de la comilla de cierre la pasa al otro lado. La regla no es «encima o debajo», sino a la izquierda del sentido de avance. Para una flecha hacia la derecha, la izquierda es arriba: \arrow[r, "f"] coloca f encima y \arrow[r, "f"'] debajo. Para una flecha hacia abajo, la izquierda es literalmente la izquierda: \arrow[d, "\alpha"] pone α a la izquierda y \arrow[d, "\alpha"'] a la derecha. No hay que memorizar cuatro casos; una sola regla, «a la izquierda del avance», los explica todos.

Una flecha puede llevar cuantas etiquetas se quiera, cada una con sus propias opciones. "\phi" near start se sitúa cerca del origen, "\eta" near end cerca del destino, y "h" description coloca la etiqueta sobre la flecha, recortando la línea detrás con el color del fondo: el recurso habitual cuando una flecha corta necesita un nombre largo. Si el texto de la etiqueta o sus opciones contienen una coma, se protegen con llaves: "{(x,y)}". Como el interior está en modo matemático, las palabras normales requieren \text{…} de amsmath.

latex
\[
\begin{tikzcd}
  A \arrow[r, "\phi" near start, "\psi"', "\eta" near end] & B \\
  X \arrow[r, "h" description] \arrow[rd] & Y \\
                                          & Z
\end{tikzcd}
\]

Curvar flechas y trazar dos entre los mismos objetos

Se usan bend left y bend right, con un ángulo si hace falta: bend left=25. El motivo para curvar es casi siempre el mismo: hay dos aplicaciones entre el mismo par de objetos. Una adjunción, una equivalencia de homotopía, el par de aplicaciones de un coigualador: cada caso pide dos flechas, y trazadas rectas se superponen y se leen como una sola. Curvadas, ambas resultan legibles. Si se las quiere paralelas en vez de curvas, shift left y shift right (valor por defecto 0.56ex) desplazan lateralmente una flecha que sigue siendo recta. Como siempre, «izquierda» se refiere al sentido de avance: bend left se comba hacia la izquierda de la propia flecha.

En los diagramas tridimensionales —un cubo aplastado sobre la página— las aristas del fondo cruzan las del primer plano. Añadir crossing over a una flecha traza primero bajo ella una línea gruesa del color del fondo, de modo que parezca pasar por delante. Las flechas se dibujan en el orden en que se escriben, así que cuando la que debe quedar debajo aparece primero, se aplaza la otra declarándola al revés desde una celda posterior, por ejemplo con from=uu. Que un diagrama de cubo salga bien depende exactamente de estos dos puntos.

latex
\[
\begin{tikzcd}
  A \arrow[r, bend left=25, "f"] \arrow[r, bend right=25, "g"'] & B
\end{tikzcd}
\qquad
\begin{tikzcd}
  A \arrow[dr] & B \arrow[dl, crossing over] \\
  C            & D
\end{tikzcd}
\]

Los estilos de línea y las puntas se cambian igual, añadiendo claves a las opciones de \arrow. Los nombres forman dos familias: nombres cortos y descriptivos como hook o two heads, y nombres tomados de comandos LaTeX existentes sin la barra invertida, como dashrightarrow. Conocer la segunda convención permite adivinar una clave en lugar de buscarla. Las claves se acumulan: \arrow[r, tail, two heads, dashed] produce de una vez una flecha con cola, con punta doble y discontinua. Las claves habituales se reúnen a continuación.

ClaveEfecto
hookUn gancho (⊂) en la base; inclusiones e inyecciones
hook'El mismo gancho, curvado hacia el otro lado
tailUna cola en el inicio; la otra marca de inyectividad
two headsPunta doble; sobreyecciones
dashedLínea discontinua; por convención, una aplicación determinada de forma única
dottedLínea punteada; clave heredada de TikZ
squigglyUna flecha ondulada
equalUna línea doble, una igualdad, en lugar de una flecha
maps toUna barra vertical en la base (el ↦ de \mapsto)
RightarrowFlecha de doble trazo; 2-celdas y transformaciones naturales
dashrightarrowLa forma de \dashrightarrow (ejemplo del nombrado sin barra invertida)
bend leftSe arquea a la izquierda del avance; bend left=25 fija el ángulo
bend rightSe arquea a la derecha del avance
shift leftDesplaza lateralmente una flecha recta (0.56ex por defecto); para pares paralelos
crossing overColoca debajo una línea gruesa del color del fondo, para que la flecha parezca pasar por delante
phantomHace invisible la flecha; solo quedan sus etiquetas, lo que permite colocar un símbolo fuera de la retícula
descriptionOpción de etiqueta: pone la etiqueta sobre la línea y recorta la línea detrás

Colocar un signo de isomorfismo como etiqueta es otro giro habitual: \arrow[r, dashed, "\simeq"] pone ≃ sobre una flecha discontinua (y \sim funciona igual). Y como tikz-cd está construido sobre TikZ, acepta directamente las claves propias de TikZ: color=…, dotted, in=…/out=… y demás. Su alcance expresivo es en la práctica el de todo TikZ, lo que también significa que, cuando algo se atasca, el manual que hay que abrir quizá sea el de TikZ y no el de tikz-cd.

Ajustar los espacios y marcar un cuadrado cartesiano

Los espacios se fijan en el argumento opcional del entorno: \begin{tikzcd}[column sep=large, row sep=small]. Se aceptan tanto dimensiones (2em) como nombres (tiny, small, large, huge), y sep fija filas y columnas a la vez. Querer ensanchar solo la dirección que lleva las etiquetas largas es una necesidad bastante frecuente como para que estas dos claves merezcan recordarse.

La pequeña esquina ⌜ que señala un cuadrado cartesiano (producto fibrado) no tiene clave propia. El recurso es poner una etiqueta sobre una flecha invisible: \arrow[rd, phantom, "\ulcorner", very near start]. La clave phantom borra la flecha, y la etiqueta que queda se aloja justo dentro de la esquina superior izquierda (para un cocartesiano, \lrcorner cerca de la inferior derecha). Aquí acecha una trampa: \ulcorner no es un símbolo del núcleo de LaTeX sino de AMSFonts, así que olvidar \usepackage{amssymb} detiene la compilación con ! Undefined control sequence. Además, las etiquetas de una flecha phantom se anclan por su centro y se componen a tamaño completo \textstyle; para reducirlas hay que escribir \scriptstyle.

latex
\usepackage{amssymb}   % \ulcorner comes from AMSFonts, not core LaTeX
\[
\begin{tikzcd}[column sep=large, row sep=large]
  P \arrow[r, "p"] \arrow[d, "q"'] \arrow[rd, phantom, "\ulcorner", very near start]
    & X \arrow[d, "f"] \\
  Y \arrow[r, "g"'] & Z
\end{tikzcd}
\]

Cuándo basta con amscd: el entorno CD

Cuando el diagrama es una retícula rectangular sin diagonales y se prefiere no arrastrar TikZ a la compilación, amscd es la respuesta. \usepackage{amscd} aporta una sola cosa: el entorno CD. Forma parte del lote amsmath, está actualmente en la v2.1 (14 de abril de 2017) y no depende más que de amsgen. Lo más sabroso es su propia documentación: explica que reproduce la capacidad de diagramas conmutativos de AMS-TeX 2.x, afirma sin rodeos que solo se admiten diagramas rectangulares simples, sin flechas diagonales ni funciones más exóticas, y añade que a muchos usuarios les convendría más un paquete de diagramas más potente, citando diagram, xypic y kuvio. No son muchos los paquetes que mandan al lector a otra parte en su párrafo de apertura.

El contenido es una matriz de & y \\, como en tikz-cd, pero cada flecha se escribe como un token especial que empieza por @. En horizontal, @>>> apunta a la derecha y @<<< a la izquierda; en vertical, @VVV apunta abajo —la V de «vertical»— y @AAA arriba, leyendo la A como una punta dirigida hacia arriba. La igualdad de línea doble es @= en horizontal y @| en vertical. Un punto de la retícula sin flecha recibe la «flecha nula» @. para mantener alineadas las columnas. Las flechas horizontales van entre dos objetos de la misma fila; las verticales, en la fila justo debajo de su objeto.

Las etiquetas se insertan entre los caracteres que componen la flecha, y aquí está el hecho que explica de golpe todo lo demás. Según la documentación de la AMS, el material entre el primer y el segundo > se compone como superíndice, y el que va entre el segundo y el tercero, como subíndice. De ahí que @>f>> ponga f arriba, @>>g> ponga g abajo y @>f>g> coloque una a cada lado. Es también la razón de que las etiquetas salgan en cuerpo pequeño: una flecha de amscd es, en el fondo, un símbolo de relación muy ancho con índices. Las flechas verticales siguen la misma regla, con los índices a los costados: @VfVV pone f a la izquierda de una flecha descendente y @VVfV a la derecha.

TokenSignificado
@>>>Flecha hacia la derecha
@<<<Flecha hacia la izquierda
@VVVFlecha hacia abajo (V de «vertical»)
@AAAFlecha hacia arriba (la A leída como una punta hacia arriba)
@>f>>Flecha hacia la derecha con f encima (la ranura de superíndice)
@>>g>Flecha hacia la derecha con g debajo (la ranura de subíndice)
@>f>g>f encima y g debajo
@VfVVFlecha hacia abajo con f a su izquierda
@VVfVFlecha hacia abajo con f a su derecha
@=Línea doble horizontal (una igualdad)
@|Línea doble vertical (@\vert es lo mismo)
@.Flecha nula: rellena un punto de la retícula sin flecha
latex
\usepackage{amscd}
\[
\begin{CD}
  A            @>f>>      B \\
  @V\alpha VV              @VV\beta V \\
  C            @>>g>      D
\end{CD}
\]

Es exactamente el mismo cuadrado que en el ejemplo de tikz-cd. A la izquierda, @V\alpha VV coloca α a la izquierda de la flecha; a la derecha, @VV\beta V coloca β a su derecha, de modo que ambas etiquetas miren hacia fuera del cuadrado. Abajo, @>>g> pone g bajo su flecha. El entorno CD también está en modo matemático, así que va, como tikz-cd, dentro de una fórmula en display. A continuación, el ejemplo del manual de la AMS, que supone \End definido como nombre de operador, al estilo de \operatorname.

latex
% from the AMS amscd manual; \End must be defined as an operator name
\[
\begin{CD}
  S^{{\mathcal{W}}_\Lambda}\otimes T   @>j>>   T \\
  @VVV                                 @VV{\End P}V \\
  (S\otimes T)/I                       @=      (Z\otimes T)/J
\end{CD}
\]

La fila superior traza una flecha desde el objeto izquierdo hasta T a la derecha, con j encima. La fila central crea las dos flechas verticales: sin etiqueta en la columna izquierda y con End P a la derecha de la flecha en la columna derecha. La fila inferior une sus dos objetos con la línea doble @=. Las llaves de {\End P} agrupan una etiqueta de varios tokens en una sola unidad. Y si hacen falta flechas gruesas, discontinuas, bidireccionales o en color sin salir de amscd, el paquete de extensión amscdx (v2.2x, 2019) añade justo eso, manteniendo intacta la restricción a la geometría rectangular.

tikz-cd o amscd: cómo elegir

La decisión se reduce casi a una sola pregunta: ¿hace falta una flecha diagonal? Si es así, amscd queda fuera. Si basta con una retícula rectangular, amscd es más ligero en dependencias y más breve de escribir. La lista siguiente desglosa un poco esa única pregunta.

  • Hacen falta flechas diagonales o curvastikz-cd. amscd solo hace horizontal y vertical; inclinar no es incómodo, es imposible.
  • Control fino de puntas y estilos de línea (inyecciones hook/tail, sobreyecciones two heads, discontinuas, líneas dobles) → tikz-cd.
  • Basta un diagrama rectangular simple y las dependencias deben seguir siendo ligerasamscd. Sin TikZ la composición es más rápida y el preámbulo se mantiene corto.
  • Cuestión de gusto: el @>f>> de amscd es breve pero peculiar; el \arrow[r, "f"] de tikz-cd es más largo, pero sigue siendo legible seis meses después.
  • Ruta de salida: los diagramas de tikz-cd no se muestran correctamente en visores DVI. Presuponen pdflatex, lualatex o xelatex, motores que emiten PDF directamente, o una conversión de DVI a PDF/PS. amscd no tiene esa restricción.
  • Si de verdad hace falta un diagrama: para dos objetos y una flecha, \xrightarrow{f} de amsmath en el propio texto lo resuelve todo.

Dos apuntes finales, para cuando se hereda un documento antiguo. tikz-cd conserva la forma anterior a la sintaxis con comillas —\arrow[opciones]{dirección}{etiquetas}, por ejemplo \arrow{r}{f}—, mantenida por compatibilidad. Existen además los comandos abreviados \rar, \dar, \uar, \lar, y los diagonales como \drar; \rar es sencillamente \arrow{r}. Conviene evitar ambos en trabajo nuevo: ceñirse siempre a \arrow[r, "f"] es una cortesía hacia uno mismo dentro de medio año.