tag:blogger.com,1999:blog-58288672024-03-13T20:22:59.077+01:00LaTeX y compañiaInformacion sobre LaTeX y programas relacionadosUnknownnoreply@blogger.comBlogger34125tag:blogger.com,1999:blog-5828867.post-15539645385263069692011-05-09T10:53:00.009+02:002011-05-11T10:47:43.795+02:00Flechas con borde en TikZ<p>A veces es deseable añadir un borde a una línea, especialmente si ésta línea pasa por una zona del dibujo en la que hay tramas en tonos oscuros que dificultan la visión. Compara las dos imágenes inferiores:</p>
<div align="center">
<img src="https://lh4.googleusercontent.com/_pchMbzB-_4E/TcexlxHJklI/AAAAAAAABOM/qQMx6NisbME/flechas-con-borde.png" />
</div>
<p>Parece que debería ser sencillo añadir un borde a una línea, o que TikZ debería tener una opción para esto, pero lo cierto es que no la tiene, por lo que habrá que recurrir a trucos más o menos sucios.</p>
<p>
Por ejemplo, TikZ tiene la capacidad de dibujar líneas dobles, lo cual en realidad es realizado por el método de pintar primero una más gruesa de lo deseado (por defecto en color negro), para después pintar encima de ella otra línea menor grosor (por defecto en color blanco). Esto crea la sensación de que hay una línea doble negra con un espacio blanco separando:</p>
<table>
<tr><td>
<img src="https://lh3.googleusercontent.com/_pchMbzB-_4E/Tce0pn2xxaI/AAAAAAAABOU/VyfgvU0cUIY/linea%20doble.png" width="250px" />
</td><td>
<pre>
\tikz
{
\draw (0,0) node (A) {A}
(2,1) node (B) {B};
\draw[double] (A) -- (B);
}
</pre></td></tr></table>
<p>Es posible hacer que la linea más gruesa inicial sea blanca, y la más fina interior sea negra, de modo que se consiga el efecto de "borde" buscado:</p>
<table><tr><td>
<img src="https://lh3.googleusercontent.com/_pchMbzB-_4E/Tce57rnNxpI/AAAAAAAABOk/o5LV_HO-x8w/linea%20doble.png" width="250px"/>
</td><td>
<pre>
\tikz
{
\draw (0,0) node (A) {A}
(2,1) node (B) {B};
\fill[gray] (1,.5) circle (4mm);
\draw[white,double=black] (A) -- (B);
}
</pre>
</td></tr></table>
<p>Sin embargo la solución anterior plantea problemas si queremos colocar una punta de flecha al final (o al principio, o en ambos lados) de la línea, ya que la punta de flecha es dibujada en el mismo color que la línea exterior más gruesa(en el ejemplo anterior sería blanca, y por tanto no visible) y además sin borde. </p>
<p>Por tanto el añadir <code>[double]</code> a nuestra línea no nos sirve si ésta tiene una punta de flecha, como en el ejemplo inicial. Para conseguir el efecto deseado, tenemos que usar el mismo truco que usa TikZ con <code>[double]</code>, pero incluyendo a la punta de flecha. Esto es, tenemos que dibujar primero la línea en blanco (o en el color que queramos darle al borde de la línea), y más gruesa de lo normal, incluyendo las puntas de flecha que también saldrán más gruesas, y seguidamente pintar encima en negro (o en el color que queramos que nuestra línea tenga por dentro) la misma línea y con la misma flecha, pero en un grosor menor (lo que hará que la flecha también sea más pequeña.</p>
<p>En realidad aparece otro problema. Si hacemos lo anterior, la punta de flecha "gorda" que pintamos en la primera pasada y la de la más fina que pintamos en la segunda, ambas terminarían en las mismas coordenadas, con lo que la punta de flecha no tendría el borde deseado. La figura inferior te aclarará a qué me refiero:</p>
<table><tr><td>
<img src="https://lh6.googleusercontent.com/_pchMbzB-_4E/Tce-ZR6dyEI/AAAAAAAABOs/d0M2v0ZuJ3c/linea%20doble.png" width="300px" />
</td><td>
<pre>
\usetikzlibrary{arrows}
\tikz
{
\fill[gray] (1,.5) circle (5mm);
\draw[yellow, -latex', line width=2pt] (0,0) -- (1,.5);
\draw[black, -latex', line width=1pt] (0,0) -- (1,.5);
}
</pre>
</td></tr></table>
<p>Observa cómo he creado la figura anterior. El primer <code>\draw</code> dibuja el "borde" en amarillo, mediante el truco de pintar la línea más gorda (<code>line width=2pt</code>). El segundo <code>\draw</code> pinta el interior de la línea, en negro y con un grosor menor (<code>line width=1pt</code>).</p>
<p>
La punta de flecha se añade mediante la opción de sintaxis muy oscura <code>-latex'</code>, que quizás merece la pena explicar. Cuando se quiere añadir una punta de flecha al final, habitualmente se pone la opción <code>-></code>, que intenta parecerse a un segmento con una punta de flecha al final. Si queremos que sea el extremo inicial de la línea el que lleve la punta, la opción es <code><-</code>. Para una línea con flechas en ambos extremos la opción es <code><-></code>.</p>
<p> Las opciones anteriores añaden a la línea la punta de flecha "por defecto" que es más bien fea. Si se quieren añadir otros tipos de punta de flecha, es necesario poner el <code>\usetikzlibrary{arrows}</code> que aparece al principio. Esto nos da nuevos tipos de punta de flecha, y todos ellos tienen un nombre que se basa en las opciones antes decritas, pero cambiando <code>></code> o <code><</code> por otra cosa. Una de estas puntas de flecha se llama <code>latex'</code> (con apóstrofe y todo, es que hay otra que se llama <code>latex</code> a secas). Esto explica la extraña sintaxis de la opción <code>-latex'</code> que significa por tanto "añade al final de la línea una punta de flecha del tipo <code>latex'</code>, que es, como ves en la figura anterior una punta con sus bordes levemente curvos.
</p>
<p>Pero a lo que íbamos, el truco no ha funcionado porque las puntas de flecha se solapan a partir de la coordenada de sus puntas, en lugar de sus centros. La solución es por tanto dibujar la segunda línea (la negra) más corta que la primera, para que la flecha negra caiga "justo encima" de la amarilla. Es decir, en lugar de llegar hasta la coordenada <code>(1,0.5)</code> donde está el centro del círculo, debe terminar "un poco antes". El problema es ¿cuánto antes? Y ¿cómo calcular las coordenadas (x,y) del punto en que debe terminar?</p>
<p>La respuesta tiene dos partes. Primero ¿cuánto más corta hay que hacer la línea? Por desgracia la respuesta depende del tipo de flecha usado, y del grosor de la línea (tanto de la "exterior" como de la "interior"). Tras ensayos y errores he llegado a que hacer la línea interior 1.8pt más corta que la exterior da buenos resultados para este tipo de punta de flecha, y usando estos grosores de línea.</p>
<p>Segundo: si ya sé que la línea negra ha de ser 1.8pt más corta que la amarilla, ¿cómo calcular las coordenadas finales de esa línea? Parece que ha de ser enormemente complicado, pues hay que tener en cuenta la pendiente de la línea, etc. Por suerte TikZ tiene una opción llamada "<code>shorten ></code>", que permite especificar una cantida a acortar al final de la línea. Cuidado con el nombre de la opción, que es raro. El nombre de esta opción contiene un "<code>></code>", como ves, y separado por un espacio de "<code>shorten</code>". A esta opción se le asigna un valor mediante el signo <code>=</code>, por lo que en nuestro caso quedaría así: "<code>shorten >=1.8pt</code>". Y el resultado es:
</p>
<table><tr><td>
<img src="https://lh6.googleusercontent.com/_pchMbzB-_4E/TcfCnkaUBJI/AAAAAAAABOw/0WD0laUvEXg/linea%20doble.png" width="300px" />
</td><td>
<pre>
\usetikzlibrary{arrows}
\tikz
{
\fill[gray] (1,.5) circle (5mm);
\draw[yellow, -latex', line width=2pt] (0,0) -- (1,.5);
\draw[black, -latex', line width=1pt, shorten >=1.8pt]
(0,0) -- (1,.5);
}
</pre></td></tr></table>
<p>Esta es la idea básica. Ahora mejoraremos la legibilidad del código haciendo uso de los estilos de TikZ. Voy a crear un estilo llamado "flecha con borde" que se ocupe de hacer todo lo anterior, es decir, de añadir una punta de flecha al final de la línea, de pintar primero una línea más gorda en el color que el usuario prefiera, y después otra línea interior más fina y que sea 1.8pt más corta. Para poder hacer esto, TikZ proporciona la opción llamada <code>preaction</code>, que puede formar parte de un estilo y se ejecuta antes de que TikZ dibuje el código "normal" correspondiente a esa línea.</p>
<p>En nuestro caso, aprovecharemos la opción <code>preaction</code> del estilo <code>flecha con borde</code> para dibujar la línea gorda que va debajo, y en otro color. Después usaremos otras opciones del estilo <code>flecha con borde</code> para especificar el grosor y menor longitud de la que va encima. El código es el siguiente:</p>
<table><tr><td>
<img src="https://lh4.googleusercontent.com/_pchMbzB-_4E/TcfFGhfiOAI/AAAAAAAABO0/crAdF3bSbrE/linea%20doble.png" width="300px" />
</td><td>
<pre>
\usetikzlibrary{arrows}
\tikzset{
flecha con borde/.style={
line width=1pt,
shorten >=1.8pt,
-latex',
preaction={draw, #1, line width=2pt, shorten >=0pt},
}
flecha con borde/.default=white,
}
\tikz
{
\fill[gray] (1,.5) circle (5mm);
\draw[red, flecha con borde] (0,0) -- (1,.5);
}
</pre></td></tr></table>
<p>Empecemos por el final, y fíjate en cómo ha quedado ahora la línea que dibuja la flecha. Simplemente <code>\draw[red, flecha con borde]</code> y las coordenadas de inicio y fin de la línea. Obviamente <code>red</code> es el color en el que quiero dibujar la línea, con su flecha, y <code>flecha con borde</code> es el nombre del estilo que se ocupa de añadirle un borde blanco, o de otro color si por ejemplo hubiera puesto <code>flecha con borde=yellow</code>. Fíjate que los nombres de estilos o de cualquier otra opción TikZ pueden llevar espacios, lo cual queda mucho más legible que algo como <code>FlechaConBorde</code> o <code>flecha_con_borde</code>.</p>
<p>Y ahora veamos cómo se ha definido el estilo. Se ha hecho fuera de la figura (de este modo este estilo puede ser usado por diferentes figuras del documento) a través de la macro <code>\tikzset</code>. En realidad esta macro no es sólo para definir estilos, sino para asignar valores a las "claves" que usa TikZ. TikZ maneja todas sus opciones y su configuración a través de un sofisticado mecanismo de "claves", similar en concepto a la que proporciona el paquete <code>keyval</code>, pero diferente. En ciertos aspectos más sencilla de usar. En nuestro caso, usamos <code>\tikzset</code> para crear un estilo, de modo que me centraré en este uso.</p>
<p>Para crear un nuevo estilo, basta inventar un nombre para él (pongamos "<code>ejemplo</code>", y hacer uso de la "clave" <code>ejemplo/.style</code> a la que asignamos todas las opciones que queremos que se ejecuten cuando usemos ese estilo. Así, puedo definir un estilo que fije un color de línea y un grosor y un tipo de punta de flecha, y cada vez que use ese estilo se aplicarán estas opciones (aunque algunas de ellas pueden ser sobreescritas por otras opciones presentes en cada figura).</p>
<p>Además, los estilos pueden recibir un parámetro (sólo uno), al cual nos referimos dentro del estilo como <code>#1</code>. Por ejemplo, en nuestra <code>flecha con borde</code> he elegido que el color del borde sea un parámetro, de modo que el usuario pueda poner, como dije antes, <code>flecha con borde=yellow</code>. Podría haber elegido que el parámetro fuese el grosor de la línea, por ejemplo, pero en este caso no lo encontré tan útil. Si quisiera tener varios aspectos parametrizables, tendría que hacer uso de otras "claves" y acceder a ellas. Otro día hablo de eso.
</p>
<p>Observa lo que hay escrito tras <code>flecha con borde/.style=</code>, verás que se abre una llave y después se listan una serie de parejas "clave=valor", aunque en algunos casos aparece solo "clave" sin ningún valor asignado. Esta lista de parejas va separada por comas. Así, en nuestro caso tenemos las claves:
<ul>
<li><b><code>line width</code></b> que recibe el valor <code>1pt</code> y será el grosor de la línea a dibujar (la interna). Se dibujará en el color que se haya especificado en el comando <code>\draw</code> que esté usando este estilo, y si no se especifica otro, será en negro.</li>
<li><b><code>shorten ></code></b> que recibe el valor <code>1.8pt</code> y es la cantidad a acortar al final de la línea.</li>
<li><b><code>-latex'</code></b> que es una opción que no recibe valor y que indica el tipo de flecha que se usará al final de la línea (TikZ busca si en el nombre de una opción hay un guión, e intenta interpretarlo como un tipo de flecha, de modo que la opción <code>-loquesea</code> se intenta interpretar como <code>arrows=-loquesea</code>).</li>
<li><b><code>preaction</code></b> que recibe como valor otra lista de opciones entre llaves. Cuando aparece la clave <code>preaction</code>, TikZ dibuja dos veces la línea, la primera con las opciones dadas en esta clave, y la segunda con las opciones que se apliquen en ese momento. Esto nos permite dibujar el "borde gordo" antes de que se dibuje la línea más fina. Como opciones para este borde gordo tenemos:</li>
<ul>
<li><b><code>draw</code></b> esta opción (sin valores asignados) causa que TikZ dibuje realmente algo. Sin ella no dibujaría la línea gorda.</li>
<li><b><code>#1</code></b> esta opción es el parámetro que se le haya pasado a la clave <code>flecha con borde</code>. Se supone que es un color, y será por tanto el color con que se dibujará la "línea gorda con flecha gorda". Veremos después cómo hacer que si el usuario no especifica ningún color, se dibuje en blanco.</li>
<li><b><code>line width</code></b> con el valor <code>2pt</code> fija el grosor de esta "línea gorda".</li>
<li><b><code>shorten ></code></b> con el valor cero hace que esta línea <i>no sea</i> más corta de lo normal. ¿Por qué es necesario especificar ésto? ¿No es eso la opción por defecto? Ocurre que cuando se ejecuta la <code>preaction</code>, están también activas todas las opciones de estilo de ese momento, en particular todas las opciones de <code>flecha con borde</code>, por lo que hay que sobreescribir (redefinir) las que queramos que sean diferentes, tales como el grosor de línea, el color y la cantidad a acortar al final.<br/>
Puedes ver que no he especificado en el <code>preaction</code> la punta de flecha. No es necesario por que sigue activa la del estilo principal.
</li>
</ul>
</ul>
<p>
Finalmente, cuando el estilo que definimos usa parámetros, es conveniente especificar un valor por defecto para cuando el usuario no se lo asigna. En nuestro caso queremos que el borde sea blanco, y eso se logra con la clave <code>flecha con borde/.default</code>. El valor que asignemos a esa clave, será el valor que se reciba en <code>#1</code> dentro del estilo, si el usuario no asigna otro.
</p>
<p>La explicación ha sido larga, pero han aparecido en ella muchas cosas interesantes. La más importante en mi opinión, la capacidad de crear estilos parametrizados que ayudarán mucho a simplificar el código de las figuras que lo usen, además de servir para uniformizar el aspecto de estas figuras y simplificar los cambios de estilo que afecten a varias de ellas.
</p>Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-5828867.post-76496810351181465242011-05-05T11:44:00.005+02:002011-05-05T12:02:57.706+02:00¿Cómo se llama este símbolo?<p>Uno de los términos de búsqueda más usado por la gente que llega a mi blog es el de "símbolos latex". Esto muestra claramente que una necesidad frecuente del usuario de latex es localizar el paquete y el código que es necesario para mostrar un símbolo concreto.</p>
<p>Ya escribí en <a href="http://ltx.blogspot.com/2003/09/miles-de-smbolos-para-latex.html">un viejo post</a> acerca del <a href="http://www.ctan.org/tex-archive/info/symbols/comprehensive/symbols-a4.pdf">Comprehensive LaTeX symbol list</a> (el cual aparece también en la zona de enlaces de la derecha, como "Lista de símbolos"), el cual, como su nombre indica, contiene prácticamente todos los símbolos matemáticos o inusuales que se pueden necesitar, y por si acaso, también instrucciones para hacer tus propios símbolos. No obstante, incluso con ese documento a mano, se requieren ciertas dotes detectivescas para encontrar lo que se necesita.</p>
<p>Y aquí es donde puede ser útil <a href="http://detexify.kirelabs.org/classify.html">Detexify</a>. El sitio ya no es nuevo, pero nunca lo había mencionado, y creo que a pesar del tiempo que lleva en marcha sigue siendo poco conocido.</p>
<a href="http://1.bp.blogspot.com/-K-jJ13hcEc0/TcJ1qyudNPI/AAAAAAAABNY/y-1VBWwAhDI/s1600/detexify.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 228px;" src="http://1.bp.blogspot.com/-K-jJ13hcEc0/TcJ1qyudNPI/AAAAAAAABNY/y-1VBWwAhDI/s320/detexify.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5603170264433898738" /></a>
<p>La idea detrás de <a href="http://detexify.kirelabs.org/classify.html">Detexify</a> no puede ser más simple. Dibuja a mano alzada (bueno, con el ratón) cómo es el símbolo que buscas, y él te dice qué paquete debes incluir y qué comando ejecutar.</p>
<p>A pesar de la sencillez de la idea, la tecnología detrás de ella es compleja. Y para que funcione correctamente el sistema debe ser "entrenado" por los usuarios. Por suerte, ya que he tardado tanto en escribir acerca de este sitio, probablemente su entrenamiento ya esté completado. Y si no, ¡siempre puedes colaborar a él!
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5828867.post-18462271365728993942011-05-04T16:03:00.016+02:002011-05-05T11:29:51.974+02:00LaTeX previewer y primer contacto con TikZ<a href="http://www.tlhiv.org/ltxpreview/">LaTeX previewer</a> 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).
<p></p>
<p>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.
</p>
<p>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.
</p>
<p>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.
</p>
<pre>\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}
</pre>
<a href="http://www.tlhiv.org/ltxpreview/">
<img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/-sRCMoJ14Rks/TcJYNPEhFmI/AAAAAAAABNQ/25JuJelxIUM/s1600/LaTeX%2BPreviewer.png" />
</a>
<h3>Comentario al código</h3>
<p>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 <code>tikzpicture</code> y dentro de él los comandos tikz. No necesita ir a su vez dentro de un entorno <code>figure</code>, 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 <code>\tikz</code> en lugar del entorno <code>tikzpicture</code>. Así (pruébalo también en el <a href="http://www.tlhiv.org/ltxpreview/">previewer</a>):
</p><pre>\def\puntorojo{\tikz\fill[red] circle(.5ex);}
R\puntorojo{}j\puntorojo{}.
</pre>
<p>
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 <code>\</code> como otros comandos tex (<code>\path</code>, <code>\draw</code>, <code>\fill</code>, mientras que otras no llevan la barra delante (<code>node</code>, <code>circle</code>). En realidad hay un orden dentro del caos y cuando te acostumbras ya no necesitas pensarlo. Esta es la regla general:
</p><ul>
<li><b>Corchetes [ ]</b> para indicar opciones (estilos) de los comandos de dibujo, como por ejemplo el color, aunque hay muchos más.
</li>
<li><b>Paréntesis ( )</b> para especificar las coordenadas de un punto, como en <code>(0,0)</code>, o los nombres que queramos asignarles a esas coordenadas, como <code>(A)</code>, <code>(B)</code>, 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 <code>circle</code>.
</li>
<li>Llaves para delimitar argumentos a los comandos que comienzan por <code>\</code>, como en latex, aunque no se usan muy a menudo con este cometido. En el ejemplo hay un caso en <code>{A,B,C}</code> que es un argumento de <code>\foreach</code>. 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 <code>{\punto}</code>, aunque requiere un poco más de explicación, porque <code>\punto</code> es una macro cuyo valor se va asignando en el bucle <code>\foreach</code>. Más adelante explico esto.
</li>
<li>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 <code>\</code>, como <code>\path</code>, <code>\draw</code>, <code>\fill</code>, etc. También hay otras macros que proporcionan utilidades especiales, como hacer bucles (<code>\foreach</code>), definir estilos, realizar cálculos de expresiones matemáticas, etc. De éstas últimas no hay en este primer ejemplo, pero ya vendrán.
</li>
<li>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: <code>node</code>, <code>circle</code>, etc. La sintaxis que sigue a estas palabras es un poco variable, ya que depende de la palabra en cuestión.
Por ejemplo, tras <code>node</code> podemos poner corchetes, si vamos a especificar opciones del nodo (como <code>above</code>, <code>blue</code>), 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 <code>circle</code>, 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.
</li>
</ul>
<p>Una vez aclarada la sintaxis, veamos línea a línea qué hace nuestro código:</p>
<pre>\path (0,0) coordinate (A) {}
(1,1) coordinate (B) {}
(3,0) coordinate (C) {};
</pre>
<p>
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 <code>\path</code> espera una secuencia de coordenadas, y en cada una de ellas podría ir algún objeto gráfico o no. El resultado de <code>\path</code> es invisible, a menos que contenga objetos gráficos en las coordenadas especificadas.
</p>
<p>En este ejemplo, el camino está compuesto por tres coordenadas. La primera es <code>(0,0></code>, y en ella colocamos un objeto gráfico que es <code>coordinate</code>. Una <code>coordinate</code> 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 <code>(A)</code>. Internamente TikZ implementa el objeto <code>coordinate</code> como un tipo de <code>node</code>, pero sin dimensiones. Esto explica que obligatoriamente aparezca <code>{}</code>, pues las llaves son obligatorias para indicar el contenido del nodo, incluso cuando el contenido está vacío como en este caso. </p>
<p>De forma análoga se asigna el nombre <code>(B)</code> a la coordenada en <code>(1,1)</code> y el nombre <code>(C)</code> a la que hay en <code>(3,0)</code>. Por cierto que habrás notado que las coordenadas no llevan unidades. Por defecto se trata de centrímetros.</p>
<pre>\draw[dashed] (A) -- (B) -- (C);
</pre>
<p>
El comando <code>\draw</code> es como <code>\path</code>, es decir, espera una secuencia de coordenadas y opcionalmente objetos gráficos a poner en ellas, pero a diferencia de <code>\path</code> que es "invisible", el comando <code>\draw</code> pinta líneas o curvas uniendo esas coordenadas. En nuestro caso, el conector usado entre coordenadas ha sido <code>--</code>, lo que indica que debe dibujarse un segmento rectilíneo entre ellas. Para las coordenadas podría haber puesto números como <code>(0,0)</code>, 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 <code>\draw</code> lleva una opción de estilo <code>[dashed]</code> que causa que la línea dibujada sea discontinua.
</p>
<pre>\foreach \punto in {A,B,C}
</pre>
<p>
Aquí viene uno de los comandos más interesantes de TikZ. Tanto es así que tiene su paquete separado, por si quieres usar <code>\foreach</code> para otras cosas que no sean dibujos, sin tener que incluir TikZ completo (para este caso <code>\usepackage{foreach}</code>). Como imaginas por su nombre, este comando permite realizar bucles. El primer parámetro tras <code>\foreach</code> 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 <code>in</code> 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 <code>\punto</code> irá tomando los valores <code>A</code>, <code>B</code> y <code>C</code> en cada iteración. (En realidad <code>\foreach</code> es aún más potente, pero ya lo iremos viendo en otras entradas).</p>
<p></p>Por último, <code>\foreach</code> 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. <p></p>
<pre> \fill[red] (\punto) circle (2pt) node[above,blue] {\punto};
</pre>
<p>En la primera iteración, <code>\punto</code> se expande como <code>A</code>, por lo que la línea anterior se convierte en esta otra:
</p><pre> \fill[red] (A) circle (2pt) node[above,blue] {A};
</pre>
<p>Veamos qué significa. En primer lugar tenemos <code>\fill</code>, que es como <code>\path</code>, solo que rellena el camino dibujado y los objetos que hay en él. El color de relleno es una opción de estilo, <code>[red]</code>, y el camino en sí, en este caso, se compone de una única coordenada, <code>(A)</code>. En dicha coordenada ponemos <b>dos</b> objetos gráficos en esta ocasión. El primero es el círculo de radio <code>2pt</code>, y el segundo es un <code>node</code> que contiene el texto <code>A</code> (observa las llaves alrededor del contenido del nodo). Además el nodo recibe dos opciones de estilo: <code>above</code> indica que el texto del nodo debe aparecer encima de la coordenada en cuestión (saldrá encima del círculo). <code>blue</code> obviamente es el color del texto.
</p>
<p>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?
<h3>Sintaxis alternativas</h3>
<p>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.</p>
<p>En lugar de hacer primero un <code>\path</code> sobre el cual ir definiendo coordenadas, para después dibujarlas con <code>\draw</code>, podría haberlo hecho todo en el mismo paso, así:
<pre>
\draw[dashed] (0,0) coordinate (A) {}
-- (1,1) coordinate (B) {}
-- (3,0) coordinate (C) {};
</pre>
Observa que, además de cambiar <code>\path</code> por <code>\draw[dashed]</code>, he tenido que añadir el operador <code>--</code> para conectar las coordenadas. Sin él tampoco sería visible la línea, ya que si en un comando <code>\draw</code> aparece una coordenada que no está precedida de <code>--</code>, lo que hace TikZ es simplemente "levantar el lápiz" y moverse a esa posición, sin dibujar línea hasta esa coordenada
</p>
<p>En la sintaxis anterior, y también la primera en que usé <code>\path</code> parece un poco torpe el tener que poner todas esas llaves sin nada dentro. Como ya se explicó, se debe a que <code>coordinate</code> es un tipo de <code>node</code> y se requiere especificar su contenido textual entre llaves, incluso cuando esté vacío. Para colmo, es que en un nodo de tipo <code>coordinate</code> ¡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.</p>
<p>Por ello, TikZ proporciona el comando <code>\coordinate</code> que sirve para especificar una secuencia de nodos de tipo <code>coordinate</code>, 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 <code>coordinate</code>, lo que haremos será especificar un objeto <code>coordinate</code> asignarle una posici, mediante la función <code>at</code>.</p>
<p>Es decir, en lugar de:
<pre>
\path (0,0) coordinate (A) {};
</pre>
pondríamos
<pre>
\coordinate (A) at (0,0);
</pre>
Usando esta sintaxis el código queda un poco más limpio, si bien hay que separar cada coordenada en un comando <code>\coordinate</code> independiente, a diferencia de <code>\path</code> o <code>\draw</code> que permiten en un solo comando especificar varias coordenadas.
<pre>
\coordinate (A) at (0,0);
\coordinate (B) at (1,1);
\coordinate (C) at (3,0);
</pre>
</p>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5828867.post-77071854938623245182011-05-03T11:45:00.005+02:002011-05-03T12:44:32.020+02:00¡TikZ es increible!<p>Hace mucho tiempo que no escribía en este blog. Cuando lo comencé (ya hace más de 7 años), mi herramienta favorita para hacer gráficos con LaTeX era metapost. Puede verse esta debilidad mía echando un vistazo a los primeros posts de esta bitácora.
</p>
<p>
Ya en su momento, cuando tuve que elegir qué lenguaje/herramienta utilizar para "dibujar" con LaTeX (pongo comillas porque en este caso la acción de dibujar consiste en escribir, pero ya nos entendemos ¿no?), acababa de aparecer en escena una cosa llamada PGF/TikZ que aún estaba un poco verde. De modo que en su momento me decidí por MetaPost, pero mantuve un ojo en la evolución de TikZ, pues permitía algo importante en aquel momento: que los gráficos generados pudieran ser usables tanto compilando con latex (con la idea de generar PostScript), como con pdflatex (para generar PDF), a partir del mismo fuente.
</p>
<p>
Dediqué mucho tiempo a metapost, y ya se sabe que cuando se domina una herramienta hay una lógica reticencia a probar otras. Sin embargo, hojeando el manual de TikZ muchos de los ejemplos me parecían fascinantes, y cada vez era me parecía más interesante el aprender este lenguaje, pero el manual (¡700 páginas!) me echaba bastante para atrás.
</p>
<p>
Finalmente me decidí a ir haciendo mis primeras pruebas con TikZ. Ya llevo dos años usandolo continuamente para todos los dibujos que he necesitado crear, y tengo que decir que nunca me he arrepentido de la decisión. La idea de crear "estilos" que definen cómo formatear gráficamente las categorías de objetos que nosotros mismos definimos es muy potente. Cambiando solo un par de líneas al principio de nuestro fuente podemos hacer que, por ejemplo, todas las cajas que usemos en todos los diagramas de cajas de nuestro libro, cambien su color de fondo, o el estilo de sus bordes, etc.
</p>
<p>
Un sitio excelente donde poder hacerse una idea de la potencia de TikZ es <a href="http://www.texample.net/">Texample.net</a>, lugar dedicado a coleccionar ejemplos de gráficas de toda índole realizadas con TikZ. Durante un tiempo vigilé esa web periódicamente para estar al tanto de lo que se podía hacer con TikZ. Incluso hay allí alguna contribución mía. Por desgracia, la última actualización de ese sitio tiene ya más de un año. Y el último mensaje del autor es para comunicar que no tiene apenas tiempo para mantenerlo y pedir ayuda para ello. Desde entonces silencio.
</p>
<p>
Para aportar mi granito de arena, planeo ir escribiendo en este blog pequeños fragmentos de TikZ correspondientes a figuras del "mundo real", que he tenido que realizar para mis proyectos o para otros que me lo han pedido, tratando de explicar de paso algunos truquillos para hacer el código más flexible, o más legible, o más interesante en definitiva.
</p>
<p><i>
Permanezcan atentos a este espacio</i> :-)
</p>Unknownnoreply@blogger.com6tag:blogger.com,1999:blog-5828867.post-5166690822795562972009-03-17T10:54:00.004+01:002009-03-17T11:23:19.114+01:00FAQ de LaTeX Visual<p>La <b>FAQ de LaTeX Visual</b> (o más exactamente <a href="http://ctan.tug.org/tex-archive/info/visualFAQ/visualFAQ.pdf">The Visual LaTeX FAQ</a>, ya que el original está en inglés) es un documento que al parecer lleva ya más de tres años publicado, pero que yo acabo de descubrir. Nunca es tarde.</p>
<p>Se trata de un curioso documento PDF que contiene cantidad de ejemplos resueltos de situaciones que más de uno habrá vivido varias veces mientras componía documentos en LaTeX, tales como dos figuras en un mismo entorno que se quieren alinear por arriba, cambio de márgenes a mitad de documento, inicio de un párrafo con una "letra capital" (de mayor tamaño que las demás), texto a doble espacio, enumeraciones interrumpidas por un párrafo que se reanudan a continuación, y un largo etcétera.</p>
<p>Lo llamativo del documento es la forma en que presenta toda esta información. El texto visible realmente no es importante (no es más que texto de relleno en latín). Lo importante es que cada uno de estos "ejemplos" se pueden observar directamente resueltos en el PDF y rodeados de una caja verde, sin más explicaciones. Al poner el ratón encima de la caja verde, aparece un "popup" (sólo si lo estamos visualizando con Acrobat Reader) que explica un poco más de qué trata ese caso particular.</p>
<p>Por ejemplo (imagen inferior), al pie de la primera página, donde iría el número de página, vemos un rectángulo vacío con borde verde. Dejando el ratón encima, el popup nos dice "How to get rid of page numbers". Y si hacemos clic en ese punto, se abrirá el navegador Web y nos llevará directamente a la entrada de la FAQ donde se resuelve esa duda.</p>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_pchMbzB-_4E/Sb959-1dg6I/AAAAAAAAARI/MDpRXWbdNe0/s1600-h/Pantallazo.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 182px;" src="http://2.bp.blogspot.com/_pchMbzB-_4E/Sb959-1dg6I/AAAAAAAAARI/MDpRXWbdNe0/s320/Pantallazo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5314100191066686370" /></a>
<p>En algunos lugares los rectángulos son rojos en lugar de verdes, indicando en este caso que se ha obtenido un resultado inesperado o erróneo (por ejemplo: texto borroso en el pdf, palabras pegadas, o referencias a páginas incorrectas). En este caso el enlace nos lleva a la explicación y solución del problema.
</p>
<p>Es difícil de explicar, y lo mejor es que <a href="http://ctan.tug.org/tex-archive/info/visualFAQ/visualFAQ.pdf">lo veas por tí mismo</a>. Me ha parecido una forma muy original y efectiva de resumir muchas dudas frecuentes, con enlaces a sus soluciones.</p>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5828867.post-53996016303456631662009-03-09T12:31:00.003+01:002009-03-09T19:05:33.907+01:00Aqui veo texto chino<p>Esta entrada puede parecer off-topic (lo es), pero no he podido resistirme a ponerla. Además, como veremos, no está tan alejada de tema como pueda parecer.</p>
<p>Haz lo siguiente: abre el bloc de notas de Windows. Escribe dentro el siguiente texto (sin pulsar retorno de carro al final de la línea):</p>
<pre>
Aqui veo texto chino
</pre>
<p>Guarda el documento con el nombre que quieras y sal del bloc de notas. Ahora abre de nuevo el documento y... ¡sorpresa! ¡Todo sale en chino! Compruebalo.</p>
<p>A pesar de que pueda parecer un <a href="http://es.wikipedia.org wiki/Huevo_de_pascua_%28virtual%29">huevo de pascua</a>, es en realidad un bug del bloc de notas. El asunto está explicado en <a href="http://en.wikipedia.org wiki/Bush_hid_the_facts">Wikipedia</a>, y aquí es donde hay una pequeña relación con el tema del blog. El asunto de las diferentes codificaciones de un fichero (latin1, utf8, etc) es un tema que aparece frecuentemente al migrar documentos latex de una plataforma a otra.</p>
<p>El problema básicamente proviene de que un archivo de texto "plano" no contiene información acerca de qué codificación utilizó el editor que lo creó. Ante esta ausencia de información, al abrir el documento el editor puede tomar diferentes estrategias: asumir que está en una odificación ampliamente utilizada como pueda ser ISO-8859-1 o Windows-1512, intentar "adivinar" qué codificación puede estar usando el fichero haciendo un análisis de los códigos
que contiene, o no intentar adivinar ni suponer nada, sino dejar que el usuario especifique cómo debe interpretarse el fichero (ya sea mediante opciones del editor o ya sea leyendo el valor de las variables de entorno que especifican el lenguaje nativo del usuario).</p>
<p>En el caso del bloc de notas de Windows, la opción elegida es la segunda, esto es, intentar adivinar la codificación del fichero. Como vemos, su algoritmo falla en algunos casos ya que el texto que yo he puesto más arriba, escrito en castellano y en codificación ASCII, es tomado por texto chino en Unicode. Según Wikipedia, bug se dispara por cualquier texto corto formados por
secuencias de 4 códigos ASCII + espacio + 3 ASCII + espacio + 3 ASCII + espacio + 5 ASCII. Aunque, como puede comprobarse, el texto que yo he descubierto no sigue esta secuencia estrictamente y sin embargo también dispara el bug (parece que la clave es el inicio 4+3+3)</p>
<p>Ah, tampoco he podido resistirme a traducir con Google el texto chino resultante. Al parecer dice algo como "Brasero muy árido, torsión de retención-Ching Chao" :-D</p>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5828867.post-23052161364771654032008-12-20T16:57:00.006+01:002008-12-21T18:11:17.406+01:00Marcando "por hacer"<p>A menudo, mientras estamos escribiendo un documento largo, nos encontramos con que dejamos algunas partes meramente esbozadas (o incluso en blanco) con la intención de volver sobre ellas más adelante para completarlas o mejorarlas. Naturalmente, estas partes del documento deberían ser marcadas de alguna forma. Cada uno tenemos nuestros truquitos al respecto. Algunos de los más comunes son:</p><ul><li>Poner un comentario dentro del código fuente LaTeX, con una cadena de texto especial tal como "A REVISAR", de modo que podamos hacer una búsqueda posterior en el fichero para encontrar rápidamente estos puntos. El inconveniente de este enfoque es que en la versión PDF o impresa, tales comentarios no aparecen, por lo que si estamos dando a leer la versión preliminar a otra persona, no tendrá una pista clara de qué partes están incompletas y cuáles no.</li><li>Introducir esas cadenas especiales en el propio texto, no en comentarios. Esto deja constancia tanto en la versión de código fuente como en la versión impresa. El problema es que quizás esas anotaciones "para uno mismo" no deberían estar en el texto principal, pues estorban un poco su lectura.</li><li>Utilizar notas al margen (esto es, el comando \marginpar), para introducir las anotaciones específicas. Esto soluciona los dos problemas anteriores, pero aún tiene un pequeño inconveniente. La nota al margen aparecerá "más o menos" a la altura de la línea en la que se utilizó \marginpar, pero no siempre exactamente donde uno querría. Además, si la nota se refiere a un punto concreto dentro de la línea (p.ej: un espacio entre dos palabras) no hay forma de especificar este dato.</li><li>Para solucionar lo anterior yo me había creado mi propio comando que insertaba en el texto principal una fea y visible caja negra, junto con una nota al margen que explicaba la razón de esa marca. La caja negra actuaba a modo de "llamada" para la nota al margen.</li></ul><p>Pero desde hace unos días tenemos otra alternativa, que yo pienso utilizar la próxima vez que me vea en esta necesidad. Se trata del paquete <a href="http://tug.ctan.org/tex-archive/macros/latex/contrib/todonotes/">Todonotes</a>. La idea es similar a la que yo estaba usando, pero con muchas facilidades para configurar el aspecto final de la nota al margen y de su punto de inserción en el texto principal. Entre otras cosas, permite especificar el color del texto y del fondo de la nota, asi como del borde de la caja que la contiene, y une esta caja mediante una línea al texto principal, al punto donde se insertó la nota en el código fuente. También permite crear notas "en línea", esto es, que no van al margen. Finalmente, casi lo más importante, puede generar una "Lista de notas" que recoge todos los puntos del documento marcados con este tipo de anotaciones, con referencias a cada página y al color usado. Por si no me he explicado bien, creo que un vistazo al <a href="http://www.tex.ac.uk/tex-archive/macros/latex/contrib/todonotes/todonotes.pdf">manual</a> aclarará perfectamente lo que este paquete puede hacer.</p>Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-5828867.post-65102275950508381222007-12-20T10:14:00.000+01:002007-12-20T11:35:37.754+01:00Sutilezas para la división con guiones y el paquete spanish<p>
A raíz de una consulta en la <a href="http://listserv.rediris.es/archives/es-tex.html">lista ES-TEX</a> me entero de que la división de líneas de TeX no se comporta como debería ante ciertos signos que tienen forma de guión (o al menos no se comporta según las normas tipográficas españolas). Estos son sus comportamientos más chocantes:
<ol>
<li>Cuando un guión (<code>-</code>) aparece en una expresión, la línea puede ser cortada en ese punto (comportamiento lógico), pero las palabras que van pegadas al guión no podrán ser divididas (comportamiento chocante). Así si ponemos supercalifraglístico-espialidoso, la línea podrá quedar cortada justo después del guión, dejando «espialidoso» para la línea siguiente, pero en cambio «supercalifragilístico» no será dividido. Como es una palabra muy larga, es muy posible que quede sobresaliendo del margen derecho. Si «supercalifragilístico-espilidoso» cabe completo en una línea, aún así el guión será visible, por lo que aparecerá como una palabra compuesta (un ejemplo más realista: «sistema lógico-matemático»).
</li>
<li>El comando <code>\-</code> inserta un guión opcional. Esto le dice a TeX que puede dividir la palabra por ese punto, si resulta conveniente. No obstante, al meter ese comando dentro de una palabra, se impide que la palabra pueda ser dividida por cualquier otro lugar. De nuevo el ejemplo podría ser <code>
supercalifragilístico\-espialidoso</code>. Al usar <code>\-</code> en lugar de <code>-</code>, si la palabra cabe completa en una línea, el guión no aparece (no es palabra compuesta). Si no cabe, se cortará por el punto especificado en el guión y por ningún otro. El comando puede usarse varias veces dentro de la misma palabra, para especificar diferentes puntos de corte posibles. Es útil para reemplazar las reglas de guionado de TeX cuando está aplicando alguna mal.
</li>
<li>Los guiones largos, raya y semirraya, que se obtienen con los comandos TeX <code>---</code> y <code>--</code> se comportan igual que el guión corto <code>-</code> explicado más arriba. Esto es, se permite que la línea sea dividida después de ese guión, e impide la división de la palabra que va pegada a él. Este es un comportamiento ciertamente indeseado en castellano, puesto que es habitual usar el guión largo a modo de paréntesis para hacer incisos —como éste— y de acuerdo con las reglas de TeX cabe la posibilidad de que el guión que abre el inciso quede al final de una línea, mientras que la palabra que debería ir pegada a él pasa a la línea siguiente. Por la misma causa, si hay un signo de puntuación tras el guión de cierre, —como aquí—, ese signo podría quedar solo al principio de la línea siguiente.
</li>
</ol>
<p>
Por suerte el paquete <b>spanish</b> de <b>babel</b> lo tiene todo previsto, como podemos leer en su <a href="http://www.texytipografia.com/archive/spanish.pdf">documentación</a>. En este paquete se definen una serie de atajos muy útiles para tratar con estos problemas, de forma que el comportamiento de TeX ante estos casos esté controlado por el autor.
</p>
<p>
Estos son los atajos que resuelven cada uno de los problemas anteriores:
<ol>
<li> <b>Atajo: <code>"=</code></b> Permite escribir una palabra compuesta, de modo que las palabras a los lados del guión también puedan ser cortadas. El manual de spanish desaconseja su uso (podrían generar un resultado antiestético), aunque creo que casos como <code>supercalifragilístico"=espialidoso</code> quedan justificados.
</li>
<li> <b>Atajo: <code>"-</code></b> Permite añadir un punto de corte opcional a una palabra. Las palabras a la izquierda y derecha del <code>"-</code> aún podrán ser divididas usando las reglas que use TeX. Un ejemplo. La palabra «semiopaco» en principio podría ser dividida por TeX por diferentes puntos, según las reglas de los patrones de español: «se|mio|pa|co». Como vemos la división «semi|opaco» no aparece contemplada. Para corregir a TeX, podríamos poner <code>semi\-opaco</code>, pero entonces ése será el único punto de corte que TeX contemplará, como explicamos más arriba. Sin embargo, poniendo <code>semi"-opaco</code>, ahora TeX contemplará la posibilidad «semi|opaco» y también las que resulten de dividir «semi» y «opaco» por separado. Téngase en cuenta que «opaco» no permite la división «o|paco», porque dejaría una sola letra al final de la línea (en realidad depende de los valores de <code>\lefthyphenmin</code> y <code>\righthyphenmin</code>, que son configurables). En resumen, los posibles puntos de división contemplados por TeX ahora serían «se|mi|opa|co».
</li>
<li><b>Atajos: <code>~---</code> y <code>~--</code></b> Permiten insertar un guión largo (raya y semirraya) de modo que la línea no pueda ser cortada en ese punto si van pegados a otra palabra. No impide sin embargo que las palabras que van pegadas a ellos puedan ser cortadas. Así, si pongo <code>~---ejemplo~---,</code> los puntos de corte considerados por TeX serán «—ejem|plo—,» Si en lugar de <code>~---</code> hubiera usado la forma estándar <code>---</code>, los puntos de corte posibles habrían sido «—|ejem|plo—|,». Inadmisibles.
</li>
<li><b>Otros casos</b>. Si queremos poner por ejemplo un rango de cifras como 45-60, pero impidiendo que TeX pueda dividir la línea por ese guión, spanish proporciona el <b>atajo ~-</b> para ese fin.<br/>
Las palabras compuestas cuya segunda palabra empieza por «r» y la primera acaba en vocal (como «semi-raya»), si se escriben juntas sin el guión debería doblarse la «r» (y así dar lugar a «semirraya»). Aunque no hay acuerdo sobre esta norma (recomendada por la RAE), si queremos aplicarla, spanish proporciona el <b>atajo <code>"rr</code></b> y así podríamos poner <code>semi"rraya</code>. Esto tiene el efecto de que si la palabra cabe junta en una línea, aparecerá como «semirraya» (con la «r» doble), pero si hay que partir tras «semi-», entonces en la siguiente línea aparecería «raya» (con la «r» sencilla).
</li>
</ol>
<p>Además de todo lo anterior, está el problema de la división de palabras acentuadas. Este problema aparece sólo si usamos fuentes con codificación OT1, ya que estas fuentes no tienen versiones acentuadas de las vocales, y entonces TeX «simula» estos caracteres por el método de insertar dos en el mismo punto (la vocal y su acento), pero esto confunde al mecanismo de guionado que deja de funcionar para esa palabra a partir del punto donde aparece el acento. El paquete spanish intenta también solucionar este problema, pero advierte de que la solución no es perfecta. En las fuentes T1 este problema ya no aparece puesto que estas fuentes sí tienen versiones acentuadas de cada vocal y no es necesario simularlas. Por tanto, si ves que LaTeX divide mal tus palabras acentuadas, asegurate de usar una fuente con codificación T1.
</p>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5828867.post-63627009378555981222007-11-29T19:13:00.000+01:002007-11-29T19:44:20.158+01:00Un truquillo para Firefox<p>
El tema de esta entrada no es sobre LaTeX, realmente, pero ya que muchos de los que usamos LaTeX nos dedicamos a escribir, a veces en otros idiomas, creo que este truquillo puede ser útil a más de uno.
Se trata de un atajo rápido para, desde <a href="http://www.mozilla-europe.org/es/products/firefox/">Firefox</a>, traducir rápidamente una palabra o expresión entre diferentes idiomas, haciendo uso de los <a href="http://translate.google.com/">servicios de Google</a>.
</p>
<ol>
<li>Dirige tu navegador a la página del <a href="http://translate.google.com/translate_dict?hl=es">traductor de Google</a>, donde verás una cajita donde escribir texto, precedida por el mensaje <b>Escribe una palabra:</b> (o <b>Enter word:</b> si accedes a la versión inglesa de la página) y una lista desplegable de posibles traducciones.</li>
<li>Elige en la lista desplegable la opción «<b>Inglés-español</b>», si no estaba previamente elegida.</li>
<li>Pon el ratón en la cajita de escribir texto y pulsa el botón derecho. En el menú contextual que aparece debe haber una opción que diga «<b>Añadir una palabra clave a esta búsqueda...</b>» (si usas la versión inglesa de Firefox dirá «<i>Add a Keyword for this search...</i>»). Elige esa opción. Esto introducirá un marcador en la lista de marcadores, y algo más.</li>
<li>Saldrá un diálogo, pidiéndote:
<ul>
<li><b>Nombre:</b> Es el nombre del marcador. Pon lo que quieras, por ejemplo <i>Diccionario inglés-español de Google</i></li>
<li><b>Palabra clave:</b> Esto es lo bueno, puedes poner aqui un «atajo» consistente en unas pocas letras para poder usar este diccionario en forma relámpago. Por ejemplo, yo aquí he puesto <i>i2e</i>, abreviatura sui-generis de «<i>inglés to español</i>»
</li><li><b>Crear en:</b> Es la carpeta donde guardará el marcador. Ponla a tu gusto, total, gracias a la palabra clave, nunca necesitarás usar tu menú de marcadores para acceder a ella
</li></ul>
</li>
<li>¿Ya está todo? Ya puedes cerrar el traductor de Google. Ahora pongamos que tienes una palabra en inglés que no sabes traducir, por ejemplo <i>slick</i>. Basta que crees una nueva pestaña en Firefox y vayas al lugar donde tecleas las URL (pulsa Ctrl-T para crear la pestaña y Ctrl+L para ir rápidamente a la entrada de URLs, sin usar el ratón). Escribe allí «i2e slick» (sin las comillas)</li>
<li>La palabra clave «i2e» causa que Firefox visite la URL del traductor de google y que rellene el campo de búsqueda con las palabras que pongas detrás (en este caso «slick»), enviando todo a Google y mostrándote su respuesta. Traducción instantánea.
</li>
<li>Repite lo anterior pero con otros sentidos de traducción, por ejemplo Español->inglés (palabra clave «e2i»). El truco funciona con cualquier página que tenga un formulario de búsqueda. Por ejemplo, tengo definida la palabra clave «w» para búsquedas inmediatas en la wikipedia inglesa, y «we» para la wikipedia española.
</li>
</ol>
Me resulta muy útil. Quería compartirlo.Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5828867.post-17633306871676199022007-11-27T09:14:00.003+01:002011-05-03T12:48:39.940+02:00Portadas con LaTeX<p>
LaTeX incluye un comando (<code>\maketitle</code>) para generar el
título del documento, con su lista de autores, etc. En las clases
<code>report</code> y <code>book</code> esto crea una portadilla
estándar. Si queremos personalizarla podemos hacer uso del entorno
<code>titlepage</code>, el cual causa que todo lo que pongamos dentro de
ese entorno salga en una página sola, sin número, y que la página
siguiente a esa tenga el número 1. Hay total libertad para poner lo que
se quiera dentro, y por tanto para hacerse una portada a medida. En la
red podemos encontrar <a
href="http://zoonek.free.fr/LaTeX/LaTeX_samples_title/0.html">varios</a>
<a href="ftp://ftp.di.uminho.pt/pub/ctan/info/latex-samples/TitlePages/titlepages.pdf">ejemplos</a>
</p>
<p>
Por otro lado, si lo que queremos crear no es la portadilla interior,
sino la portada exterior (incluyendo lomo y contraportada), en el <a
href="http://www.tug.org/pracjourn/2007-1/">número 1</a> del <a
href="http://www.tug.org/pracjourn/index.html">PracTeX Journal</a>
tenemos un <a
href="http://www.tug.org/pracjourn/2007-1/robbers/">excelente
artículo</a> que muestra como hacer cosas impresionantes con PSTricks.
</p>Unknownnoreply@blogger.com6tag:blogger.com,1999:blog-5828867.post-32974536023853668512007-11-26T17:21:00.000+01:002007-11-26T17:24:08.507+01:00He visto cosas...He visto cosas en Word que vosotros no creeríais.
<ul><li> He visto listas de <em>items</em> formateadas a base de espacios en blanco.</li><li> He visto docenas de retornos de carro seguidos al final de una página, para forzar el cambio a la página siguiente.</li><li> He visto una tabla de contenidos de un documento de 300 páginas, generada totalmente a mano «<em>para evitar problemas</em>».</li><li> He visto documentos llenos de imágenes en formato bitmap, ocupando gigas y que tardan minutos en «repaginarse».</li><li> He visto menús desplegables de «Estilos» con centenares de estilos definidos, ninguno usado de forma consistente en el documento.</li><li> He visto siete tipos diferentes de «<em>bullets</em>» en el mismo documento, con niveles de indentación inconsistentes.</li><li> He visto documentos impresos llenos de <strong>«¡Error! Marcador no definido»</strong></li><li> He visto intentos de crear documentos multi-archivo con Word. Nunca he visto uno que funcionara.</li><li> He visto horas de trabajo desaparecidas por un súbito cuelgue, y copias de respaldo irrecuperables.</li><li> He visto listas de enumerables cuya numeración, en lugar de comenzar en 1, continuaba de otras de capítulos anteriores, sin que el autor lo notara hasta después de imprimir.</li><li> He visto documentos impresos que no se parecen a lo que se veía en pantalla.</li><li> He visto documentos que, al cambiar de ordenador, cambian completamente su paginación debido a que se usa una impresora diferente.</li><li> He visto el mensaje «<em>¿Desea guardar los cambios efectuados en el documento?</em>» sin haber hecho ningún cambio.</li><li> He visto un documento que, al avanzar tras la última página, se copiaba y pegaba a sí mismo en ese punto, de forma recursiva, aumentando su tamaño hasta colapsar el sistema.</li></ul>Todos esos momentos se perderán en el tiempo, como lágrimas de alegría en la lluvia.
Es hora de LaTeX.Unknownnoreply@blogger.com39tag:blogger.com,1999:blog-5828867.post-1087841606851347072004-06-21T20:02:00.000+02:002006-09-04T23:42:32.130+02:00Más posibilidades para las tablas con tabularx y tabularyA menudo necesitamos hacer una tabla en la que una de las columnas sea un "texto libre" (esto es, un párrafo que LaTeX divida en líneas automáticamente). El tipo de columna previsto para esto es el tipo "p", pero este tipo tiene el inconveniente de que hay que especificarle el ancho. A veces ocurre que preferiríamos especificar el ancho de la tabla completa, en lugar del ancho de cada columna, y que sea LaTeX quien calcule el ancho "ideal" para cada columna de modo que el ancho total de la tabla sea el que le hemos especificado
<p>
Precisamente para esto son los paquetes <a href="http://www.dante.de/CTAN/macros/latex/required/tools">tabularx</a> y <a href="http://www.ctan.org/tex-archive/macros/latex/contrib/carlisle/">tabulary</a>, ambos escritos por David Carlisle. El primero de ellos (<CODE>tabularx</CODE>), tiene ya unos cuantos años, y viene con toda distribución estándar de LaTeX, por lo que es bien conocido del público. Este paquete permite usar el especificador de columna "X". Las columnas que tengan este tipo serán como las "p", pero el ancho lo calcula automáticamente LaTeX. Si la tabla varias columnas de tipo "X", LaTeX dará a todas ellas el mismo ancho, de modo que el ancho total sea el especificado en la cabecera de la tabla.<p>
El segundo (<CODE>tabulary</CODE>) es más reciente, y yo lo he descubierto hoy mismo. Este paquete añade nuevos especificadores de columna, llamados L, R, C y J. Las columnas de este tipo son también "párrafos" (p), para los cuales no es necesario especificar el ancho. Pero en este caso el ancho calculado por LaTeX es proporcional a la longitud del texto más largo en esa columna. Además, dentro de la celda el texto puede ir alineado a la izquierda (tipo L), a la derecha (tipo R), centrado (tipo C) o justificado a ambos lados (tipo J). Otros parámetros permiten especificar el ancho mínimo y máximo permitido a una columna. Parece que este paquete añade a las tablas de LaTeX una funcionalidad deseada por muchos desde hace tiempo.
Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-5828867.post-1081182095831360282004-04-05T18:21:00.000+02:002004-06-03T18:02:04.180+02:00GnuplotGnuplot es un buen programa para creación de gráficas científicas, pero su documentación hace difícil sacarle todo el partido. En la excelente web "<a href="http://t16web.lanl.gov/Kawano/gnuplot/index-e.html">gnuplot tips (not so Frequently Asked Questions)</a>" se da mucha información y ejemplos de uso que son de gran utilidad para aprovechar las posibilidades de este programa.<p>
Gracias a Javier M. Mora por este enlace.
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-5828867.post-1079261422378982442004-03-14T11:50:00.000+01:002004-03-14T11:52:41.733+01:00Herramientas para PDF [<a href="http://www.cs.berkeley.edu/%7Ephelps/Multivalent/Tools/">Multivalent Tools</a>] son un conjunto de herramientas gratuitas, escritas en java, para la manipulación de documentos PDF que permiten realizar desde la línea de comandos interesantes acciones, como comprimir (y optimizar), descomprimir, encriptar, desencriptar, generar imagenes de cada página, extraer texto, buscar, etc...<br> Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5828867.post-1069259732761943502003-11-19T17:35:00.000+01:002003-11-19T17:35:57.340+01:00Pies de figura sin figureHe actualizado mi artículo "<A HREF="http://ltx.blogspot.com/2003_10_01_ltx_archive.html#106683739657547873">Quiero mi figura aquí</A>", para incluir información de cómo colocar un pie de figura (<i>caption</i>) fuera de un entorno <i>figure</i>. El método que explicaba antes no es tan bueno como el que recomiendo ahora: usar el paquete <A HREF="http://www.tug.org/tex-archive/macros/latex/contrib/misc/capt-of.sty">capt-of</A> o el <A HREF="http://www.tug.org/tex-archive/macros/latex/contrib/misc/captdef.sty">captdef</A>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5828867.post-1068496582012988452003-11-11T11:43:00.000+01:002007-02-28T10:10:54.546+01:00Cómo crear figuras EPS desde WindowsEsta es una pregunta que se me hace muy a menudo. Y como la respuesta es larga, he decidido escribirla aquí de una vez por todas. La pregunta puede aparecer bajo formas diversas, siendo una de las más frecuentes <i>¿Cómo puedo incluir una gráfica Excel en LaTeX?</i><p>
Tanto si se trata de una gráfica Excel como de cualquier otra gráfica generada con cualquier programa Windows, el procedimiento es el mismo (si bien la gráfica Excel a menudo presenta un problema particular que comentaré más adelante). Se trata de tener instalado un controlador de impresora PostScript (aunque no tengamos ninguna impresora real), y utilizar ese controlador para "imprimir a fichero". De este modo, el código que se enviaría a la impresora (PS) queda almacenado en un fichero que podrá ser usado como figura en LaTeX. Por desgracia, <i>todos</i> los controladores de impresora de windows que he podido probar (incluso los "oficiales" de Adobe) generan EPS malo, que requiere ser retocado posteriormente. Paso a describir el proceso.<p>
<OL>
<li> <B>Instalar impresora PS</B>. Supondré que tienes instalado Windows XP. En otras versiones de Windows el proceso es análogo.
<OL><li>Ve a "Inicio->Configuracion->Impresoras y faxes" y añade una impresora nueva. Elige "Impresora conectada a este equipo", y cuando te pregunte el puerto al que está conectada, elige <code>FILE:</code> (imprimir a un archivo)
En el modelo de impresora elige <i>Apple Color LaserWriter 12/600</I>. En realidad cualquier impresora PostScript sirve, pero yo siempre he usado esa y nunca he tenido problemas, así que ¿para qué cambiar? Finalmente ¡no la pongas como impresora predeterminada!
<LI> Una vez instalada la impresora, desde el panel de gestión de impresoras pulsa en la nueva con el botón derecho y elige "Propiedades". En la ventana que sale, en la pestaña "General" hay un botón que dice "Preferencias de Impresión". Púlsalo, y en la ventana que sale, pulsa en "Opciones Avanzadas". Esto abrirá una ventana nueva en el que se nos presenta una vista como de "árbol" con las opciones de la impresora. En la rama llamada "Opciones de documento", hay una rama llamada "Opciones Postscript", y en ella una opción llamada "Opción de salida postscript", a la que por defecto windows le ha dado el valor "Optimizar para velocidad". Debes cambiar eso por "Postscript Encapsulado (EPS)".
</OL><p>
<LI><B>Generar el fichero PS</B>. Ve a tu aplicación de dibujo favorita. Haz la figura y cuando la tengas lista, imprímela. Cuando te salga el diálogo de impresión, elige la impresora Apple que hemos instalado en el paso anterior, y dale a imprimir. En ese momento te pedirá un nombre para el fichero que va a generar. Dale el nombre que prefieras, y recuerda en qué carpeta lo has guardado. En unos segundos Windows habrá terminado la impresión, y en el fichero que has especificado tendrás la figura en formato EPS (si bien algunas versiones de windows insisten en ponerle al fichero una extensión <code>.prn</code>, sus contenidos son EPS, por lo que puedes renombrarlo sin problemas). Si los controladores no tuviesen <i>bugs</i>, aquí se terminaría la historia y el EPS resultante podría ser usado como figura en LaTeX. Por desgracia los controladores de windows tienen un importante bug, y es que no generan un <code>BoundingBox</code> correcto.<p>
El <code>BoundingBox</code> es un rectángulo que indica qué parte de la página es la que contiene realmente el dibujo. Para LaTeX esta información es importante, ya que calculará el espacio que ocupa la figura según su <code>BoundingBox</code>. Pero Windows incorrectamente hace el <code>BoundingBox</code> igual a la página completa, por lo que es necesario un paso adicional para arreglarlo.<p>
<LI><b>Arreglando el <code>BoundingBox</code></b>. Para este paso necesitas la aplicación <A HREF="http://www.cs.wisc.edu/~ghost/">Ghostview</A>, pero si estás tratando de insertar figuras EPS en LaTeX seguro que ya la tienes ¿verdad?. Basta que abras con <code>ghostview</code> el fichero que hemos generado en el paso anterior, y que elijas en el menú "File" la opción "PS to EPS". Esto te creará un nuevo fichero que (al menos en teoría) ya tendrá el <code>BoundingBox</code> correcto. Para verificarlo puedes visualizarlo en el ghostview, activando la opción "Show BoundingBox", que te dibujará un rectángulo punteado alrededor del <code>BoundingBox</code>. Si este rectángulo incluye ajustadamente tu figura, todo está correcto. Ya puedes incluir este EPS en un documento LaTeX. Si vas a procesarlo con PDFlatex, debes convertirlo antes en PDF, lo cual también puede hacerse desde <code>ghostview</code><p>
<LI><b>Otras consideraciones</B>. Si el gráfico que intentas convertir ha sido creado con Excel, pueden aparecer problemas adicionales debidos a la propia aplicación Excel, ya que si se selecciona un gráfico en esta aplicación y se manda imprimir, el resultado muchas veces es incorrecto (zonas sin dibujar, zonas negras...), por lo que su conversión a PS también será incorrecta. La única solución que conozco a este <i>bug</i> consiste en copiar el gráfico desde Excel y pegarlo en otra aplicación (Word, por ejemplo), desde la cual se podrá imprimir ya sin problemas.<p>
Por otro lado, existe un programa (<i>shareware</i>) llamado <A HREF="http://www.wmf2eps.de.vu/">wmf2eps</A> que es de ayuda si tienes que hacer muchos gráficos. Habrás comprobado que el método anterior de imprimir a fichero, renombrar resultado, abrirlo en <code>ghostview</code> y volver a guardarlo como EPS, puede resultar tedioso. El programa <code>wmf2eps</code> simplifica el proceso al permitirte seleccionar el gráfico en tu aplicación, "Copiarlo" y "Pegarlo" en el programa <code>wmf2eps</code>. Una vez allí pegado, pulsando un botón será convertido a EPS. En realidad este programa se limita a imprimir el gráfico a una impresora tipo PS (que por tanto debes tener instalada de todas formas), y seguidamente arreglar el <code>BoundingBox</code>.<p>
</OL>
Espero que esta información sea de ayuda a alguien. Si encuentras algún problema al tratar de seguir estos pasos o tienes dudas, deja un comentario en este blog.Unknownnoreply@blogger.com31tag:blogger.com,1999:blog-5828867.post-1067535816322376482003-10-30T18:43:00.000+01:002003-10-30T18:43:23.886+01:00Tutorial sobre LaTeXEn la web del <A HREF="http://www.tug.org.in">Grupo de usuario de TeX indio</A> hay muchas cosas interesantes. Entre ellas un conjunto de <A HREF="http://www.tug.org.in/tutorials.html">tutorials</A> escrito por su equipo especializado. El tutorial sobre LaTeX puede descargarse en forma de un conjunto "presentaciones en pantalla", o en un <A HREF="http://sarovar.org/download.php/120/ltxprimer-1.0.pdf">único documento PDF</A>. Los contenidos parecen muy interesantes, pero además la forma es impecable. También han escrito un conjunto de tutorials exhaustivo sobre PSTricks, lo cual es de agradecer pues la documentación original de este paquete no estaba demasiado bien estructurada.Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5828867.post-1067535000322181732003-10-30T18:30:00.000+01:002003-10-30T18:29:48.020+01:00Escribir algoritmosUn nuevo paquete, <A HREF="http://www.ctan.org/tex-archive/macros/latex/contrib/algorithm2e/">algorithm2e</A> viene a sumarse a los ya existentes para presentar algoritmos en nuestros documentos. Éste parece más configurable y con un resultado más agradable que el de anteriores soluciones como <A HREF="http://www.ctan.org/tex-archive/macros/latex/contrib/alg/">alg</A> o <A HREF="http://www.ctan.org/tex-archive/macros/latex/contrib/algorithms/">algorithms/algorithmic</A>, y con un interfaz más simple.Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-5828867.post-1066837396575478732003-10-22T17:43:00.000+02:002007-01-27T01:38:45.420+01:00Quiero mi figura AQUIEsta es una pregunta bastante frecuente entre los novatos. ¿Cómo puedo hacer que una figura salga en el texto exactamente en el lugar que yo quiero, y no en el que quiera LaTeX? La respuesta más obvia consiste en no poner la figura dentro de un entorno <code>figure</code>, ya que es este entorno quien le dice a LaTeX que tiene permiso para ponerla donde prefiera. Sí, <code>\includegraphics</code> puede ser usado sin necesidad de estar dentro de un <code>figure</code>, pues el entorno <code>figure</code> simplemente indica que su contenido puede "flotar" a otra posición, y que su <i>caption</i> debe llevar la palabra "Figura", pero no que su contenido sea necesariamente un gráfico. Esto suele sorprender a los principiantes.<p>
No obstante, esta solución muchas veces no es satisfactoria, ya que necesitamos que la figura tenga un pie, una numeración y aparezca en la "Lista de figuras" del documento, y todas estas características sólo se logran a través del comando <code>\caption</code>, el cual sólo puede aparecer dentro del entorno <code>figure</code> (u otro flotante). En teoría, LaTeX admite el posicionador <code>[h]</code> para indicar que la figura aparezca en el punto en que aparece en el fuente, en lugar de "flotar" hacia otro punto. Por desgracia esto no es una orden tajante para LaTeX, sino una sugerencia que suele ignorar. <p>
En muchas ocasiones he leido que el posicionador <code>[h!]</code> es una orden más tajante, pero parece que LaTeX suele desobedecerla a menudo también (o quizás no esté implementada en todas las versiones de LaTeX). El caso es que colocar una figura "<i>aqui, aunque quede fea, bajo mi responsabilidad</i>" no parece fácil. Pero en realidad es tan sencillo como incluir el paquete <A HREF="http://www.ctan.org/tex-archive/macros/latex/contrib/float/">float</A> y especificar el posicionador <code>[H]</code> (observar que va en mayúscula)<p>
Para quienes prefieren hacer las cosas de forma retorcida, es posible añadir un <i>caption</i> en cualquier lugar del texto, sin estar necesariamente dentro de un entorno <code>figure</code>. Para ello puede usarse el paquete <A HREF="http://www.tug.org/tex-archive/macros/latex/contrib/misc/capt-of.sty">capt-of</A> o el paquete <A HREF=" http://www.tug.org/tex-archive/macros/latex/contrib/misc/captdef.sty">captdef</A>. Ambos proporcionan una funcionalidad muy similar, y en el fondo usan el mismo mecanismo, por lo que puedes elegir el que más te guste. Usando <code>capt-of</code>, añadirías el pie de figura escribiendo <code>\captionof{figure}{Texto del pie de figura}</code>, mientras que usando <code>captdef</code> el comando a usar sería <code>\figcaption{Texto del pie de figura}</code>. Ambos paquetes son flexibles y permiten añadir captions de tablas o de otros <i>floats</i> que puedas haber definido tú mismo con ayuda del paquete <A HREF="http://www.ctan.org/tex-archive/macros/latex/contrib/float/">float</A>.
Puede usarse un entorno <code>tabular</code> para asegurarse de que la figura y el "falso pie" van siempre juntos.Unknownnoreply@blogger.com151tag:blogger.com,1999:blog-5828867.post-1065394212878796682003-10-21T10:42:00.000+02:002003-10-21T10:42:51.796+02:00Presentaciones con LaTeXMichael Wedman ha preparado <A HREF="http://www.miwie.org/presentations/">un documento</A> en el que recopila las soluciones existentes actualmente para generar presentaciones en pantalla utilizando LaTeX. No sólo cubre la presentación en PDF, sino también en HTML y otros formatos. Para cada solución, muestra un ejemplo, pros y contras.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5828867.post-1066148923091269212003-10-14T18:03:00.000+02:002004-06-03T19:38:46.493+02:00mdwtoolsEn un reciente mensaje en la <A HREF="http://www2.cica.es/Listas/sptex/">lista sptex</A> Laura mencionaba el paquete <A HREF="http://www.ctan.org/tex-archive/macros/latex/contrib/mdwtools/">mdwtools</A>, al cual ya había echado yo un vistazo tiempo atrás, pero lo había olvidado completamente, por lo que ha sido un feliz redescubrimiento.<p>
Este paquete es en realidad un conjunto de ellos. Algunos con utilidad más bien oscura (salvo para TeXpertos), pero otros con una utilidad indudable. He aquí la lista:
<UL>
<LI><B>at</B> Este paquete te permite definir tus propios comandos que, en lugar de comenzar por <CODE>\</CODE>, comienzan por <CODE>@</CODE>. La utilidad de esta rareza se hace clara cuando pretendes definir un comando con nombre muy corto, para que sirva de abreviatura de otro con un nombre mayor. Entonces te das cuenta de que la mayoría de los comandos cuyo nombre consta de un par de letras ya existe (bien como primitiva de TeX o bien como comando latex). O si no existe, siempre queda la duda si no existirá en un paquete que vayamos a usar después. Por ejemplo, usamos a menudo <code>\longrightarrow</code> y nos gustaría abreviarlo como <code>\lra</code> ¿Existirá ya este comando en LaTeX? Usando el paquete <b>at</B>, nuestro comando se llamaría <code>@lra</code> y podemos estar seguros de que no entraremos en conflicto con otros posibles comandos.<p>
Además, permite definir comandos delimitados por cualquier par de caracteres, por lo que podemos usar, por ejemplo <code>@/.../</code> como abreviatura de <code>\emph{...}</code>, o <code>@*...*</code> como abreviatura de <code>\textbf{...}</code> (de hecho, este par de ejemplos vienen ya predefinidos al cargar al paquete <b>at</b>). Sin duda se le pueden encontrar interesantes aplicaciones.
<LI><b>cmtt</b>. Este paquete arregla un problema que puede aparecer al usar los tipos <i>computer modern teletype</i> (<code>\texttt{...}</code>), ya que al parecer la codificación de esta fuente no es estándar y algunos caracteres pueden salir cambiados.
<LI><b>doafter</b>. Esta es una de esas utilidades que sólo tienen sentido para los programadores de TeX avanzados. Yo no entiendo para qué sirve :-)
<LI><b>footnote</B>. Aquí se reimplementa el comando <code>\footnote</code> para que se comporte mejor que el que viene con latex. En particular, el nuevo <code>\footnote</code> admite texto verbatim, y se puede usar en lugares donde el comando original no se podía (como en <i>parboxes</i>)
<LI><b>mdwlist</B>. Esta es una de esas pequeñas joyas. Permite configurar los entornos de tipo lista (<code>itemize</code>, <code>description</code>,...) para que sean más compactos. También ofrece varias soluciones al problema de que, en el entorno <code>description</code> el término a definir sea demasiado largo (en mi opinión, los <code>description</code> generados por LaTeX son más bien feos).
<LI><b>mdwmath</b>. Este minipaquetito implementa una variante de <code>\sqrt</code> que omite la raya horizontal encima del operando. También proporciona algunos símbolos matemáticos.
<LI><b>mdwtab</b> es una reimplementación completa y nueva de los entornos <code>tabular</code> y <code>array</code>, con muchas opciones interesantes. Merece la pena leer con detenimiento la documentación.
<li><b>sverb</b> permite listar código "verbatim", y leerlo desde un fichero. También proporciona un entorno <code>demo</code> que muestra código LaTeX junto con su resultado, ideal para escribir manuales sobre LaTeX
<li><b>syntax</b> ofrece un conjunto de macros para "dibujar" diagramas de gramáticas tipo BNF. Este tipo de diagramas abundan en la propia documentación de la <i>suite</i> <code>mdwtools</code>
</UL>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5828867.post-1065355584836252702003-10-05T23:46:00.000+02:002007-01-19T12:26:41.573+01:00Etiquetas más flexibles para MetaPostMetapost tiene la capacidad de incluir etiquetas (textos) como parte del dibujo. Para ello proporciona la orden <code>label</code> la cual recibe como primer parámetro el texto a mostrar, y como segundo parámetro las coordenadas del punto donde debe aparecer. El primer parámetro (el texto) puede ser de dos tipos diferentes:
<UL>
<LI>Una <i>picture</i>, que es el resultado de una serie de órdenes de dibujo. Lo más habitual es que
esta <i>picture</i> sea el resultado de procesar las directivas <code>btex/etex</code>. Estas directivas causan que el texto comprendido entre ellas sea procesado externamente por TeX, y el resultado de ese procesamiento es insertado de nuevo en la figura metapost, en forma de <i>picture</i>. Esto permite incluir fórmulas o textos que requieran un formateado especial. Por ejemplo:
<pre>
label(btex El valor de $i$ es 3. etex, (0,0));</pre>
El inconveniente es que no se pueden usar variables metapost entre el par <code>etex/btex</code>,
sino tan solo texto «literal».
<LI>Un <i>string</i>, que es una secuencia de caracteres entre comillas. En este caso, TeX no es utilizado. La cadena se emite sin más, en el tipo de letra por defecto. La ventaja de esta segunda forma es que la cadena puede ser construida "dinámicamente", a partir de los contenidos de otras variables metapost. Por ejemplo, la cadena puede ser el resultado de concatenar varias cadenas, como en
<PRE>
label("El valor de i es " & decimal i & ".", (0,0));</PRE>
(recuérdese que <CODE>&</code> es el carácter de concatenación de <i>strings</i> y que <code>decimal</code> es una primitiva que convierte un entero en un <I>string</i>). Sin embargo el inconveniente es que la cadena no puede contener comandos TeX. Si la cadena es, por ejemplo "$i$", el texto que aparecerá será precisamente ese, y no una <i>i</i> en modo matemático.
</UL>
Sería interesante poder combinar lo mejor de ambos enfoques, es decir, poder generar dinámicamente un <i>string</i>, y que sea interpretado por TeX, de modo que al procesar la cadena
<PRE>
"El valor de $i$ es " & decimal i & "."</PRE>
se obtenga el texto «El valor de <i>i</i> es 3.» (suponiendo que ese sea el valor de la variable)<p>
Este es el problema que, de forma independiente, se han planteado dos autores diferentes, y las soluciones a las que ha llegado cada uno son:
<UL>
<LI><A HREF="http://www.ctan.org/tex-archive/graphics/metapost/contrib/macros/latexmp">LatexMP</A>. Esta biblioteca para MetaPost está publicada en <A HREF="http://www.ctan.org">CTAN</A>, y no sólo resuelve el problema anterior, sino que además proporciona un método para lograr etiquetas multicolor sin necesidad de parchear <code>dvitomp</code> (ver <A HREF="http://ltx.blogspot.com/2003_09_01_ltx_archive.html#106425083726331540">mi artículo</A> sobre este tema). Además trae una excelente documentación y ejemplos de uso. El paquete proporciona gran cantidad de opciones de configuración.
<LI><A HREF="http://www.atc.uniovi.es/~jdiaz/tex/latex.mp.zip">latex.mp</A>. Esta biblioteca para MetaPost no está publicada "oficialmente" en ningún lugar (salvo este blog), pero puede descargarse formando parte de la librería <A HREF="http://www.ctan.org/tex-archive/graphics/metapost/contrib/macros/makecirc/">MakeCirc</A>. Es un código mucho más simple y compacto que el de LatexMP, y la documentación es mucho menor (incluída en forma de comentarios en el propio código de la biblioteca). No obstante, salvo por las etiquetas multicolor, ofrece la misma funcionalidad que LatexMP.
</UL>
Creo que latex.mp puede ser más apropiado para ser utilizado como parte de otras bibliotecas. Por ejemplo, ha sido usado en la biblioteca <A HREF="http://www.cnm.es/~pserra/schema/">Schema</A>, para dibujo de circuitos electrónicos, y en la biblioteca <CODE><A HREF="http://www.ctan.org/tex-archive/graphics/metapost/contrib/macros/makecirc/">MakeCirc</A></CODE>, de futura aparición, para el dibujo de circuitos electricos. Por el contrario, LatexMP puede ser más adecuada para el usuario final, sobre todo si requiere etiquetas multicolor.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5828867.post-1065051237111769342003-10-02T00:24:00.000+02:002003-10-02T01:33:56.793+02:00Javier M. Mora me ha dado a conocer este interesante documento: <A HREF="http://www.ntg.nl/doc/eijkhout/ruler.pdf">The TeX ruler</A>, una colección de reglas graduadas de interés para el tipógrafo.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5828867.post-1064836890803346342003-09-29T14:00:00.000+02:002003-09-29T14:01:30.956+02:00Rediseñada la sección de enlaces (a la derecha). Como preveo que irá creciendo, le he dado un formato más limpio, y cada enlace cuenta con una descripcion que puede leerse manteniendo el ratón sobre él.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5828867.post-1064594684992779612003-09-27T00:57:00.000+02:002004-06-29T14:47:24.433+02:00MetaPost, otra vezPues cada vez van apareciendo más páginas dedicadas a este interesante lenguaje de programación de gráficos, pero son difíciles de encontrar, pues sus autores no se anuncian ni ponen estos documentos en CTAN. Esta vez le toca el turno al <A HREF="http://www.ursoswald.ch/metapost/tutorial.html">MetaPost: A very brief tutorial</A> de Urs Oswald. Tan escondido, que ni siquiera tiene enlace desde su <A HREF="http://www.ursoswald.ch">página principal</A>. Este «tutorial» es en realidad una colección de figuras, cada vez más complejas, acompañadas de su fuente y de breves explicaciones. No es para principiantes. Además del tutorial, en la web de Urs Oswald hay también un <A HREF="http://www.ursoswald.ch/metapost/tutorial/PrecedenceDoc/PrecedenceDoc.pdf">interesante documento</A> que explica en qué orden se evalúan los diferentes operadores metapost, lo que ayuda a comprender algunos resultados inesperados.<p>
En la misma línea del «tutorial» de Urs, hay una <A HREF="http://zoonek.free.fr/LaTeX/Metapost/metapost.html">enorme página web</A> con más de 300 ejemplos metapost, cada uno al lado de su código (cuidado, la página es gráficamente intensiva). Gracias a Gustavo por este enlace.Unknownnoreply@blogger.com