Como parte de mi trabajo como coordinador de la web, suelo ver bastante texto en LaTeX por parte de colaboradores y usuarios. Muchas veces veo formatos y ecuaciones que, en mi humilde opinión (y tampoco es que sea un mega experto), se podrían hacer mejor. De vez en cuando haré artículos como este en el blog, con comentarios sobre como hacer "mejor" algunas cosas.

Lo que más me llama la atención son las formas de alinear las ecuaciones complejas. Por ejemplo, imagínate que queremos dar el cambio a coordenadas esféricas.

La forma más cutre sería poner cada ecuación en su propio entorno matemático. Es tan cutre, que ni siquiera voy a poner el resultado. El principal problema es que resulta imposible alinear las ecuaciones entre si (lo que mejora mucho el resultado), y además el espacio entre ecuaciones es demasiado grande.


Entorno array

Una forma que he visto muchas veces consiste en utilizar el entorno "[FONT=Fixedsys]array[/FONT]",

Código:
\begin{equation}
\begin{array}{ccl}
x & = & r \sin\theta \cos\varphi \ , \\
y & = & r \sin\theta \sin\varphi \ , \\
z & = & r \cos\theta \ .
\end{array}
\end{equation}
que produce

[Error LaTeX: Compilación LaTeX fallida]
Es más o menos el efecto que queremos conseguir, pero hay varios problemas. El principal, a mi modo de entender el LaTeX, es que "[FONT=Fixedsys]array[/FONT]" es para hacer matrices (ese es su significado en inglés), y esto no es una matriz. Esto puede ser una diferencia más bien conceptual que importante, para algunos, pero yo prefiero utilizar las cosas para lo que sirven. ¡Llamame quisquilloso!

El segundo problema, este un poco más práctico, es que las diferentes columnas salen con un espacio demasiado grande. No es el mismo espacio al rededor del igual que hay habitualmente. ¡Queda mal! Si, se puede solucionar cambiando la separación entre columnas de un [FONT=Fixedsys]array[/FONT] con el comando

Código:
\setlength{\arraycolsep}{2pt}
pero esto es poco flexible. Para empezar, imagínate que después necesitas el entorno array para crear una matriz de verdad. Tendrías que cambiar la longitud cada vez, es un engorro.

El tercer inconveniente es que el sistema es rígido, poco flexible. Hay que recurrir a trucos para conseguir ciertos efectos. Por ejemplo, si quisiéramos hacer dos columnas de ecuaciones, dejando una separación entre ellas, hay que dejar una columna en blanco con el espacio necesario. Por ejemplo,

Código:
\begin{equation}
\begin{array}{cclcccl}
x & = & r \sin\theta \cos\varphi \ , &\hspace{1em}&
r & = & \sqrt{x^2+y^2+z^2} \ , \\
y & = & r \sin\theta \sin\varphi \ , &\hspace{1em}&
\theta & = & \arctan \frac{\sqrt{x^2+y^2}}{z} \ , \\
z & = & r \cos\theta \ , &\hspace{1em}&
\varphi & = & \arctan\frac y x \ .
\end{array}
\end{equation}
que, compilado, nos da


Bueno, por lo menos así conseguimos que funcione; pero en realidad nos estamos cargando uno de los principios fundamentales del LaTeX: dejar que sea él quien se ocupe del aspecto de las cosas, nosotros nos centramos en el contenido. Debería ser él quien se ocupe del ancho de las columnas, y todo eso.


Entorno [FONT=Fixedsys]eqnarray[/FONT]

LaTeX trae de serie un entorno que sirve, precisamente, para poner varias ecuaciones juntas. Se llama "[FONT=Fixedsys]eqnarray[/FONT]", y básicamente equivale a un [FONT=Fixedsys]array[/FONT] con la opción rcl; se usa tal que así:

Código:
\begin{eqnarray}
x & = & r \sin\theta \cos\varphi \ , \\
y & = & r \sin\theta \sin\varphi \ , \\
z & = & r \cos\theta \ .
\end{eqnarray}
que produce



Esto ofrece dos ventajas. En primer lugar, numera todas las ecuaciones, individualmente, que puede ser útil. En segundo lugar, está hecho específicamente para ecuaciones.

Pero, sigue sin ser perfecto. La distancia al rededor del igual sigue siendo incorrecta. Además, a veces puede convenir no numerar todas las ecuaciones; por ejemplo, en el caso de las coordenadas esféricas, ¿vamos a necesitar hacer referencias a las componentes por separado? Sería mejor poner un número general. Otro ejemplo es cuando realizamos un cálculo por pasos. Por ejemplo,

Código:
\begin{eqnarray}
I & = & \int_0^1 \mathrm{d} x\ x \mathrm{e}^{-x^2} \nonumber\\
& = & \left. -\frac12 \mathrm{e}^{-x^2} \right|_0^1\nonumber \\
& = & \frac12 \left( 1 - \frac1e \right) \ .
\end{eqnarray}
Como veis, la única opción para que no saliera el número es utilizar el comando \nonumber. El resultado es



No está mal, pero estaría mejor si el número quedaba en medio. La única forma sería volver a recurrir al entorno array.


Paquetes de la AMS: entornos [FONT=Fixedsys]gather[/FONT] y [FONT=Fixedsys]align[/FONT]

La Sociedad Americana de Matemáticas, la AMS ha desarrollado una serie de paquetes que resultan muy útiles para mejorar las capacidades de LaTeX. Yo, como mucha gente, los cargo en todos mis documentos sistemáticamente. El que nos salvará en este caso es el paquete [FONT=Fixedsys]amsmath[/FONT] y sus entornos avanzados para el modo matemático.

Empezaremos por el entorno [FONT=Fixedsys]gather[/FONT]. Su función, como su nombre en inglés indica, es agrupar ecuaciones, sin más, en múltiples líneas. Es útil para agrupar diferentes ecuaciones que no tienen una estructura común, y que por tanto no tiene sentido alinear. Por ejemplo,

Código:
\begin{gather}
\int_0^1 \mathrm{d} x\ x \mathrm{e}^{-x^2} = \frac12 \left( 1 - \frac1e \right) \ , \\
\mathrm{e} =  2.71828 \ .
\end{gather}
que produce



Pero lo que nos importa a nosotros son ecuaciones alineadas. Para eso tenemos el entorno [FONT=Fixedsys]align[/FONT]. Funciona de una forma muy simple: se sitúa un sólo amperstand (&) en el punto de alineación de las ecuaciones; dos barras invertidas para separar líneas. Y ya está. Volvamos a nuestro ejemplo del cambio a esféricas:

Código:
\begin{align}
x & = r \sin\theta \cos\varphi \ , \\
y & = r \sin\theta \sin\varphi \ , \\
z & = r \cos\theta \ .
\end{align}
Que produce un resultado prácticamente perfecto:



Perfectamente alineado, con un número en cada línea, y el espacio al rededor del igual es el que debe ser.

Pero el entorno [FONT=Fixedsys]array[/FONT] aún esconde más posibilidades. Por ejemplo, podemos hacer varias columnas de ecuaciones; basta con separarlas con un amperstand extra. Por ejemplo,

Código:
\begin{align}
x & = r \sin\theta \cos\varphi \ , &
r & = \sqrt{x^2+y^2+z^2} \ , \\
y & = r \sin\theta \sin\varphi \ , &
\theta & =  \arctan \frac{\sqrt{x^2+y^2}}{z} \ , \\
z & = r \cos\theta \ , &
\varphi & = \arctan\frac y x \ .
\end{align}
Que, de nuevo, deslumbra por su eficacia,



El propio [FONT=Fixedsys]align[/FONT] se encarga de calcular la distancia justa entre columnas de ecuaciones. De eso se trata, que LaTeX se encarga de estas cosas por si solo. Esta característica es útil, por ejemplo, para dar varios valores a la vez:

Código:
\begin{align}
e & = 1.60217646 \cdot 10^{-19}\mathrm{C}\ , &
\hbar & = 1.05457148 \cdot 10^{-34}\mathrm{Js}\ , &
m_e & = 9.10938188\cdot 10^{-31}\mathrm{kg} \ .
\end{align}
que produce


Por supuesto, existe la versión de algin que no numera las ecuaciones, basta con añadir un asterisco al nombre: [FONT=Fixedsys]align*[/FONT].

Dentro de otras ecuaciones

A menudo, también se recurre a [FONT=Fixedsys]array[/FONT] para generar partes de una ecuación con varias lineas, dentro de una ecuación de una sóla linea. Es un poco de trabalenguas, si no lo has entendido el siguiente ejemplo te lo aclarará (espero), una función definida a trozos:
Código:
\begin{equation}
\Theta(x) = \left\{
\begin{array}{cl}
x & \text{si}\ x>0 \\
0 & \text{si}\ x=0 \\
-x& \text{si}\ x<0
\end{array}
\right.
\end{equation}
que compilado toma el siguiente aspecto:


Con lo que sabemos, todos nos iría mejor si pudiéramos usar las capacidades de [FONT=Fixedsys]align[/FONT] dentro de otra ecuación. Pues bien, alegraos por que podemos. El paquete de las AMS viene con otro entorno, llamado [FONT=Fixedsys]aligned[/FONT], que hace lo mismo que [FONT=Fixedsys]align[/FONT], pero estando dentro de otro entorno. Por ejemplo,

Código:
\begin{equation}
\left.
\begin{aligned}
r & = \text{constante}\\
0 & \le \theta \le \pi\\
0 & \le \varphi \le 2\pi
\end{aligned} \right\} \Longrightarrow \text{Superficie esf\'erica}
\end{equation}
que, compilado, queda de nuevo perfecto.


También existe una versión para usar [FONT=Fixedsys]gather[/FONT] dentro de otras ecuaciones; su nombre es [FONT=Fixedsys]gathered[/FONT]. Y el funcionamiento es idéntico,
Código:
\begin{equation}
 \left.
 \begin{gathered}
 r = \text{constante}\\
 0 \le \theta \le \pi\\
 0 \le \varphi \le 2\pi
 \end{gathered} \right\} \Longrightarrow \text{Superficie esf\'erica}
\end{equation}
que produce un resultado similar, pero con las tres sub-ecuaciones centradas en vez de alineadas,


Este sistema también nos permite crear ecuaciones bien alineadas con un sólo número bien centrado. Volviendo a la integral anterior,

Código:
\begin{equation}
\begin{aligned}
I & =  \int_0^1 \mathrm{d} x\ x \mathrm{e}^{-x^2} \nonumber\\
& = \left. -\frac12 \mathrm{e}^{-x^2} \right|_0^1\nonumber \\
& = \frac12 \left( 1 - \frac1e \right) \ .
\end{aligned}
\end{equation}
que produce el efecto deseado




Nota sobre el uso en el foro

Como sabéis, en el foro (y blogs) se puede usar la etiqueta [tex]ecuación[/tex] para introducir ecuaciones LaTeX en los mensajes. El foro, internamente, pone el texto entre las etiquetas dentro de un entorno matemático, así que no podemos usar [FONT=Fixedsys]align[/FONT] y [FONT=Fixedsys]gather[/FONT] directamente. Pero, por supuesto, sí podemos utilizar las versiones acabadas en [FONT=Fixedsys]ed[/FONT]. Por ejemplo, la ecuación del último ejemplo dado se puede poner en el foro directamente como:

Código:
[tex=1]\begin{aligned}
I & =  \int_0^1 \mathrm{d} x\ x \mathrm{e}^{-x^2} \nonumber\\
& = \left. -\frac12 \mathrm{e}^{-x^2} \right|_0^1\nonumber \\
& = \frac12 \left( 1 - \frac1e \right) \ .
\end{aligned}[/tex]
Y aún hay más

En el paquete AMSmath hay definidos muchos más entornos y comandos útiles. Por ejemplo, habréis notado que para escribir texto normal uso [FONT=Fixedsys]\text[/FONT] en vez del usual [FONT=Fixedsys]\textrm[/FONT]. Hay más entornos especiales para alinear ecuaciónes. Destacan [FONT=Fixedsys]multline, subequations, split, flalign, alignat y alignedat[/FONT], entre muchas otras opciones. Puedes leer más acerca de las inmensas posibilidades del paquete en su documentación.