Dibujemos matrices fácilmente con LaTeX!

Hola buenas... recientemente tuve que realizar la documentación de una práctica y por la cosa de coger soltura la realice 100% en LaTex. Como tenía que hacer diagramitas chulos y tal me puse a buscar que extensión podía ayudarme y encontré una maravillosa: xymatrix. Espero que esto sea un "primeros pasos" de xymatrix ya que la potencia (como todo lo que rodea al LaTex) es increíble y el límite lo ponemos nosotros.

Ingredientes

Para trastear con la receta os hará falta:

  • Unos conocimientos muy mínimos de LaTex.
  • Tener instalado LaTeX/TeTeX.
  • Un buen Makefile y/o rubber.

Excepto el primer requisito... todo es paquete Debian.

Instalación de xymatrix

Instrucciones para Debian (y supongo que Ubuntu):

# apt-get install tetex-extra

Instrucciones para otras distros: ¿hay otras? :-P

El preámbulo

Bueno, sabréis que un documento en LaTex debe tener un pequeño preámbulo donde se define qué tipo de documento se está creando, paquetes que se emplearán, etc. Lo que yo uso para añadir y configurar xymatrix es:

\usepackage{geometry,amsthm,graphics,amssymb,amsmath,latexsym}
\usepackage[all,2cell]{xy} \UseAllTwocells \SilentMatrices

En la documentación oficial de xymatrix emplean un parámetro más al incluir xy, esto es:

\usepackage[all,2cell,dvips]{xy} \UseAllTwocells \SilentMatrices

Pero esto provocaba que no se me dibujasen las flechitas.

Crear una matriz

Pues nada, vamos a crear una matriz de 2x2 con los elementos A, B, C y D:

\[ \xymatrix{
  A & B \\
  C & D}
\]

Activamos el modo matemático (con "\[" y "\]"), en él insertamos un elemento xymatrix con los elementos citados. Los elementos de una columna los separamos con ampersand, es decir "&", y una nueva fila con la doble barra, "\\". Que yo lo haya puesto en distintas líneas en el código ha sido para que se vea más claro, pero podríamos haber hecho:

\[\xymatrix{A&B\\C&D}\]

Los ejemplos anteriores habrían dado como resultado:



La dimensión de una matriz se calcula por el número de columnas de la primera fila y después el número de filas creadas. Esto es importante, todas las filas tienen que tener el mismo número de columnas. Si por ejemplo nuestra matriz no va a tener elemento C debemos hacer lo siguiente:

\[\xymatrix{
A & B \\
  & D}
\]

Recordad que podemos hacer cosas como:

\[\xymatrix{
A && B & C}
\]

En este caso tendríamos una matriz fila de cuatro elementos, en el que el segundo elemento es nulo. Podéis ver como quedaría aquí:



Como último ejemplo de matriz vamos a definir:



Debemos hacer una matriz de tres filas y cinco columnas. ¿Por qué cinco? pues tenemos tres elementos y dos huecos entre ellos en la fila con más columnas de todas. Quedaría como sigue:

\[\xymatrix{
 & &1& & \\
 &2& &3& \\
4& &5& &6}
\]

Los huecos entre ampersand's los coloco para que se vea más claro, pero podría haber escrito:

\[\xymatrix{
&&1&&\\
&2&&3&\\
4&5&6}
\]

O incluso:

\[\xymatrix{&&1&&\\&2&&3&\\4&5&6}\]

El manual de xy tiene los ejemplos en la segunda forma, por lo que más vale entender esto bien, incluso practicarlo un poco. Yo en ejemplos más complicados tuve que usar lápiz y papel para entenderme (menudo informático de pacotilla! :-P). Entendiendo esto bien podemos pasar al siguiente punto: la flechas entre elementos.

Las flechitas

Bien, las flechas tienen un origen y un destino (ohhh), el origen es el elemento donde se crea y el destino es el elemento que le indicaremos nosotros. Todas las flechas tienen dirección por lo que si queréis una bidireccional entre A y B (por ejemplo) debéis crear una entre A y B y otra entre B y A (esto creo que debería estar en el TO-DO de xy).

La forma en la que indicamos el elemento destino es indicando su desplazamiento con respecto al elemento origen. Los desplazamientos se indican con una letra: u,d,l,r; esto es: up, down, left, right (vaaaale: arriba, abajo, izquierda y derecha :-P). Por tanto, si queremos una flecha desde un elemento hasta el siguiente elemento a la izquierda, lo indicaríamos con [l]. Si queremos una flecha desde un elemento hasta el elemento dos lineas mas arriba y una columna más a la derecha pues [uur]. Al principio puede parecer lioso, pero veamos un ejemplo: en la matriz de ejemplo primera, la de 2x2, vamos a hacer un triángulo de flechas entre los elementos A, B y D con el sentido de las agujas del reloj, es decir, lo siguiente:



Pues el código es muy simple:

\[ \xymatrix{
  A \ar[r] & B \ar[d]\\
  C & D \ar[ul]}
\]

Veamos: con \ar añadimos una flecha, un elemento puede tener todas las que quiera, los destinos pueden ser elementos vacíos y tiene que estar obligatoriamente dentro de los límites de la matriz, en caso contrario no compilará. Si no entendéis bien el ejemplo, dibujad en un papel un cuadro de 2x2 y observad los desplazamientos. Ahora vamos a crear una matriz fila de tres elementos: A, B y C, uniremos todos de forma cíclica, es decir: A con B, B con C y C otra vez con A:

\[\xymatrix{
  A \ar[r]& B \ar[r]& C \ar[ll]}
\]

Si compiláis veréis lo siguiente:



Deberíamos poder arquear la flecha para que esto no ocurra, es decir, queremos obtener lo siguiente:



Pues el código es muy simple, simplemente debemos añadir lo siguiente:

\[\xymatrix{
  A \ar[r]& B \ar[r]& C \ar@/^/[ll]}
\]

Para arquear una flecha añadimos la arroba al final de ar después viene lo siguiente: "/^/" indica cómo debe ser el arco. La concavidad/convexidad es relativa a la dirección de la flecha, "/^/" lo hace de una forma y "/_/" de la otra. También podemos aumentar la curvatura: "/^1pc/", "/^2pc/", etc.

Algunos ejemplos

Hasta aquí supondré q lo entendéis todo bien e incluso lo habéis probado. Si no entendéis bien lo anterior... esto os va a resultar algo extraño...

Vamos a dibujar cuatro elementos formando un cuadrado pero con un quinto elemento central, todos los elementos exteriores tendrán una flecha hacia el elemento central:

\[\xymatrix{
A \ar[dr]& & B \ar[dl] \\
  & E & \\
C \ar[ur] & & D \ar[ul]}
\]

Que resulta en lo siguiente:



Ahora vamos a dibujar un cubo, para saber cómo debemos representar un cubo mediante una xymatrix os recomiendo el uso de lápiz y papel... tal vez este ejemplo empiece a ser un poco extraño... ;-)

\[\xymatrix{
   & E \ar[rr]&& F \ar[dd]\\
 A \ar[rr]\ar[ur]&& B \ar[dd]\ar[ur]&\\
   & G \ar[uu]&& H \ar[ll]\\
 C \ar[uu]\ar[ur]&& D \ar[ll]\ar[ur]&}
\]

Con lo que obtendríamos un bonito:



Y finalmente una rayada: no voy a decir de que se trata para que a alguno le pique la curiosidad y lo pruebe :-P .Sólo diré que de la figura completa hay cuatro aristas curvadas para que no se emborrone el resultado final. Además, hay un elemento más que complica el ejemplo: todas las flechas son bidireccionales ;-), en fin, ahí tenéis:

\[ \xymatrix{
  &   & 2 \ar[rrrr]\ar@/_1pc/[dddddd]\ar[dl]\ar[ddr]&   &   &   & 3 \ar[llll]\ar@/^1pc/[dddddd]\ar[dl]\ar[ddl]\\
  & 0 \ar[rrrr]\ar@/_1pc/[dddddd]\ar[ur]\ar[ddr]&   &   &   & 1 \ar[llll]\ar@/^1pc/[dddddd]\ar[ur]\ar[ddl]&   \\
  &   &   & 10 \ar[rr]\ar[dd]\ar[dl]\ar[uul]&   & 11 \ar[ll]\ar[dd]\ar[dl]\ar[uur]&   \\
  &   & 8 \ar[rr]\ar[dd]\ar[ur]\ar[uul]&   & 9 \ar[ll]\ar[dd]\ar[ur]\ar[uur]&   &   \\
  &   &   & 14 \ar[uu]\ar[rr]\ar[dl]\ar[ddl]&   & 15 \ar[ll]\ar[uu]\ar[dl]\ar[ddr]&   \\
  &   & 12 \ar[rr]\ar[uu]\ar[ur]\ar[ddl]&   & 13 \ar[ll]\ar[uu]\ar[ur]\ar[ddr]&   &   \\
  &   & 6 \ar@/^1pc/[uuuuuu]\ar[rrrr]\ar[dl]\ar[uur]&   &   &   & 7 \ar[llll]\ar@/_1pc/[uuuuuu]\ar[dl]\ar[uul] \\
  & 4 \ar@/^1pc/[uuuuuu]\ar[rrrr]\ar[ur]\ar[uur]&   &   &   & 5 \ar[llll]\ar@/_1pc/[uuuuuu]\ar[ur]\ar[uul]&   }
\]

Si entendéis este ejemplo podréis hacer cualquier otra cosa de este tipo. El manual de xymatrix es todavía mas rayante...

Enlaces de interés

Manual de xymatrix
Y como siempre que escribo una receta...
Manual de xypic
Lo de xypic no lo conocía pero parece que es bastante mejor que xymatrix... habrá que echarle un ojo ;-)

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de david.villa

Esta receta...

…pide a gritos unas capturas/pantallazos

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de int-0

Aleeeee....

Ahí tenéis las capturas... se ven un poco feunas pero ha sido por rasterizar el PDF con el GIMP a baja resolución... el caso es que os hacéis una idea... no?
------------------------------------------
For Happy Lusers! Try this as root!
dd if=/dev/zero of=/dev/hda bs=1G count=10
------------------------------------------

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Imagen de int-0

Pues si...

Pero tenía que terminarla ipso-facto y lo de subir imagenes adjuntas no me quedó muy claro... ¿se puede hacer con eso que sale al editar una receta de "subir adjuntos"? si es así... ¿sólo puedo subir una?

En fin... que si lo tenía pensado pero tiempo y.... ganas... Sticking out tongue
------------------------------------------
For Happy Lusers! Try this as root!
dd if=/dev/zero of=/dev/hda bs=1G count=10
------------------------------------------

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Bacano

Parcero! esto esta muy bacano, gracias por los apuntes!