Tablas en LaTeX

Sábado, 30 diciembre 2006

Bien, llegadas las Navidades, no es Antena3 la única que se dedica a los refritos y las reposiciones de viejos programas. Por eso, sin ningún tipo de pudor, reedito aquí otro post de LaTeX aparecido en su día en “El Trastero de Mazi“. En el se cuenta como formatear una tabla en LaTeX.

Bueno… llevaba tiempo queriendo escribir éste, mi segundo artículo sobre LaTeX. Esta vez intentaré explicar cómo introducir una tabla en un documento que estemos escribiendo.

Bien, a la hora de introducir nuestra tabla, imaginemos que estamos elaborando un horario para nuestras clases, teclearemos la siguiente secuencia de comandos:

\\begin{table}[h]
\\begin{center}\\begin{tabular}{|c|c|c|c|c|c|}
\\hline
Hora & Lunes & Martes & Miércoles & Jueves & Viernes \\\\
\\hline
8 & Matemáticas & Matemáticas & Matemáticas & Matemáticas & \\\\
\\hline
9 & Programación & Programación & Programación & Programación & Programación \\\\
\\hline
10 & CIA & CIA & Ordenadores & CIA & CIA \\\\
\\hline
11 & Ordenadores & Ordenadores & Ordenadores & Ordenadores & Circuitos \\\\
\\hline
12 & Ordenadores  & Circuitos & Circuitos & Circuitos & \\\\
\\hline
13 & Circuitos & Analógica & Analógica & Analógica & \\\\
\\hline
\\end{tabular}\\end{center}
\\caption{Horario primer cuatrimestre}
\\end{table}

Bien comentamos paso a paso la secuencia:

* El ambiente table del primer comando (\begin{table}[opción]), no es totalmente necesario para la creación de la tabla, pero nos puede resultar beneficioso por dos razones: 1. Para estar seguros de que no ocurrirá “nada raro” en medio de la tabla, de tal forma de que ésta no se corte y continúe en la siguiente página. 2. Para generar tablas numeradas, de tal forma que aparezcan en el índice de tablas. Dentro de los corchetes de la opción, podemos pasar varios parámetros: 1. h: significa que LaTeX creará la tabla en el sitio mismo donde empieza el ambiente table, siempre que esto sea posible. 2. t: esta opción situará la tabla en el borde superior de la página. 3. b: esto provocará que la tabla se sitúe en el borde inferior de la página. 4. p: si usamos esta opción, la tabla será creada en una hoja aparte.

* El ambiente tabular, (\begin{tabular}{|c|l|r|})será el que realmente nos cree la tabla. En él, definiremos el número de columnas de nuestra tabla y la alineación de las mismas. 1. Si escribimos las barras verticales que véis ahí significan eso mismo: que queremos que nuestra tabla tenga líneas verticales que la delimiten y separen sus columnas. 2. Una “c” significa que queremos centrar el contenido de una columna, una “l” que deseamos la alineación a la izquierda del contenido de una columna, una “r” lo mismo pero a la derecha y si escribimos “p{anchura}”, crearemos una columna de una anchura determinada en la que podremos insertar un texto justificado con saltos de línea. También podemos introducir en este espacio la opción “@{.}”, que nos alinearía una columna teniendo en cuenta el punto decimal de las cifras introducidas en ella.

* El comando \hline introduce una línea horizontal y deberemos intoducirlo todas las veces que está ahí arriba si queremos tener todas las líneas horizontales de la tabla.

* Por último, para introducir cada cosa en su columna, se separará cada elemento por un espacio+&, tal y como está escrito. Ah, el comando \caption{texto} nos permite introducir un pequeño texto descriptivo al pie de la tabla. Aunque alguna columna quede vacía, como en este ejemplo pasa varias veces con la última, debemos escribir de todas formas el “&” para obtener un formateado totalmente satisfactorio de la tabla.

Por último (otra vez), LaTeX al crear el índice de tablas y los pies de las mismas, las llama cuadros. ¿Os convence? A mí no, desde luego. Esto lo podemos arreglar y hacer que llame a las cosas por su nombre: tablas. Para eso no tenemos más que introducir estos dos comandos después de la línea que marca el inicio del documento (\begin{document}):

\\renewcommand{\\tablename}{Tabla}

\\renewcommand{\\listtablename}{Indice de tablas}

Si introducís estos comandos en la plantilla del primer post, comprobaréis que se crea una tabla de 6 columnas. La forma de añadir filas, que creo es lo menos evidente, es cerrar línea con doble contrabarra “\\” y luego trazar la línea de separación horizontal con \hline. Bueno, ahora sí que nada más. con esto y un bizcocho… Si queda algo poco claro, pido perdón de antemano. Dudas, ya sabéis. Agur.”

Aparte de eso, saludos a todos, y desearles una feliz salida y entrada de Año. Ciao.

Anuncios

Un poquito de LaTeX (II)

Lunes, 18 diciembre 2006

A continuación, se resuelven una serie de dudas que generó el primer artículo sobre LaTeX que publiqué en “El Trastero de Mazi“. Son un par de cosillas acerca de la compilación y la codificación de caracteres en LaTeX. Aquí van esas dos cuestioncillas que no estaban demasiado claras en su día. Espero que sea útil esta “reedición” de aquellos posts. Un saludo a todos.

“Bueno, con esta segunda entrada, espero dejar zanjadas un par de cuestiones que parecen ser que no quedaron del todo claras ayer con el primer artículo sobre LaTeX.

Lo primero, deciros que he creado la categoría “LaTeX”, donde iré dejando todos los posts que pueda escribir sobre el tema. Así, creo que satisfago, al menos en parte, la sugerencia que me hacía Javi sobre crear un enlace al posts de ayer. De esta forma, los tendrás todos juntitos, sólo te tocará buscar el que quieres :).

En segundo lugar, voy a explicar un poco más detalladamente el proceso para compilar un documento. Escribiremos el documento con un editor cualquiera. Como ya dije, nos vale cualquiera, nano, vim, joe…etc. El fichero, lo guardaremos con extensión .tex. Una vez que lo hayamos escrito, lo podemos compilar con el comando:

$ latex archivo.tex

Esto nos generará varios archivos de salida, lo único que nos interesa realmente es el archivo .dvi que nos genera, ya que los demás los podemos considerar transparentes a nosotros. Podemos convertir este .dvi a .ps o .pdf con los comandos dvips y dvipdf respectivamente. Sin embargo, nos podemos ahorrar todos estos pasos y compilar directamente sacando la salida directamente a .pdf con el comando:

$ pdfelatex archivo.tex

Bien, con esto, espero haber dejado claro el tema de la compilación al que se refería Javi.

Por otro lado, con el tema de la codificación de caracteres me meteré otro día (ayer sólo se trataba de crear una plantilla de documento estándar), sólo decir que el paquete que metía el otro día \usepackage[latin1]{inputenc}, llevaba la opción [latin1], que sirve para las codificaciones ISO, porque es la que usa LaTeX por defecto. Otro día explicaré más a fondo cómo usar UTF y varias otras.

Para acabar, quería explicar un poco mejor qué hace el paquete babel. Este paquete se encarga de que, si escribimos en un idioma distinto del inglés, todo encaje a la perfección. Me explico. Se encarga de separarnos las palabras con corrección de acuerdo a las reglas ortógraficas del idioma en el que escribimos, de traducir el nombre de las secciones y epígrafes a ese idioma (si no lo ponemos, en castellano en vez de capítulos tendremos chapters). Es, por tanto, importante incluir este paquete en las cabeceras para escribir en castellano, ya que si no el compilador creerá que nuestro idioma es el inglés (el que viene por defecto) y habrá algunas cosas que no queden como deseamos.

Si hay algo que no esté claro, ya sabéis donde preguntarlo. Un saludo.”

Un poquito de LaTeX

Jueves, 14 diciembre 2006

Bien el otro día publiqué el primer artículo sobre LaTeX del blog, y si bien están al alcance de la mano los primeros artículos del tema que he escrito, me parece buena idea publicarlos otra vez, ahora en este blog, y así tenerlos todos reunidos. Sin nada más que decir, aquí copio y pego el primer artículo de LaTeX de mi primer blog:

“Una de las poquitas cosas que sé hacer en este mundillo de frikis, es la edición de documentos en LaTeX. Es por eso que he decidido escribir una serie de artículos, en los que explicaré un poco cómo realizar un documento usando esta herramienta.

Por ser lo primero que escribo de este estilo, ando un poco perdido, así que pido perdón de antemano si lo que leéis os resulta muy simplón o muy complicado. Empezaré tratando de explicar la estructura básica de un documento.

La primera línea que deberemos incluir tendrá esta forma:

\documentclass[parametro1,parametro2,parametro3…]{tipo_documento}

En tipo_documento incluiremos alguno de éstos:

  • book: con esto lograremos un estilo de libro, vendrá dividido en partes (\part), capítulos (\chapter) y secciones (\section).
  • article: crearemos un documento al estilo de los artículos científicos. Es uno de los más usados junto al tipo anterior (book). Permite las divisiones en secciones (\section) y subsecciones (\subsection), y, a pesar de lo que he leído por ahí, también permite la división en partes (\part). Con este tipo podremos escribir prácticamente todos los documentos que necesitemos.
  • report: es parecido a article, pero cuenta además con una división en capítulos (\chapter) y que la numeración de tablas y fórmulas va por capítulos y no consecutivamente por todo el documento.
  • letter: este estilo sería el adecuado para escribir cartas.
  • slides: para presentar diapositivas.

Existen otros tipos como pueden ser proc, ltxdoc, ltxguide o minimal, pero no creo que necesitéis usarlos nunca, así que no contaré nada de ellos.

En el apartado de parámetros, introduciremos algunos como éstos:

  • Tamaño de letra, escrito en puntos, por ejemplo: 12pt.
  • Clase de papel, como puede ser a4paper.
  • Lenguaje del documento. Idioma en el que está escrito el documento (spanish, english,…).
  • Impresión por una o dos caras, con los parámetros oneside o twoside, respectivamente.

Después de esta línea, incluiremos varias de la forma: \usepackage{}. La cabecera usepackage nos permite incluir paquetes que proporcionan diferentes utilidades de LaTeX. La sintaxis consiste en indicar el paquete que queremos cargar y las opciones con que queremos hacerlo:

\\usepackage[opcion1,opcion2,opcion3]{nombre_paquete}

Algunos ejemplos pueden ser:

\\usepackage[spanish]{babel} % Paquete para poner el idioma en español.
\\usepackage[latin1]{inputenc} % Caracteres con acentos.
\\usepackage{latexsym} % Símbolos.
\\usepackage{graphicx} % Inclusión de gráficos.
\\frenchspacing %Espacia el contenido de una forma más elegante.

Como ya habréis observado, “%” sirve para introducir comentarios en el texto.

Después de esto, con la inclusión de todos los paquetes que mejor se adecúen a nuestras necesidades, incluiremos otras cabeceras, como:

\\title{} % Dentro de las llaves, incluiremos en cada una lo que corresponda
\\author{} %título, autor y fecha
\\date{}

\pagestyle{} % define el estilo de página. Éste puede ser:

  • plain : opción por defecto, coloca el número de página abajo y centrado, además no pone encabezado.
  • headings: coloca toda la información en el encabezado (nombre de capítulo, sección o subsección y página), dejando el pie de página vacío.
  • empty: dejaremos vacíos tanto el encabezado como el pie de página.
  • myheadings: similar a headings, pero nos da la posibilidad de añadir información propia a través de los comandos markboth y markright

Estas opciones para controlar el estilo de la página son muy limitadas. Si queremos obtener un diseño más completo podemos emplear el paquete fancyhdr. Para emplear el paquete incluiremos la cabecera \usepackage{fancyhdr}, y en la opción pagestyle incluiremos lo siguiente: fancy: sirve para que LaTeX emplee el paquete fancyhdr en el formateo de la cabecera y pie de página del documento.

Con todo esto, podríamos tener ya una plantilla tipo para la edición de nuestros documentos. La emplearemos para hacer el típico programa de “Hola Mundo”:

\\documentclass[a4paper,12pt]{article}
\\usepackage[spanish]{babel}
\\usepackage[latin1]{inputenc} % Caracteres con acentos.
\\usepackage{latexsym} % Símbolos
\\usepackage{graphicx} % Inclusión de gráficos.
\\usepackage{float}
\\frenchspacing

\\title{Hola Mundo}
\\author{ {Oficina de Software Libre}\\\\
{Escuela Universitaria Politécnica}}
\\date{Mayo, 2.005} % La doble contrabarra "\\\\" introduce una nueva línea

\\pagestyle{headings} % páginas con encabezado básico

\\begin{document}

\\maketitle % Se crea una especie de portada
\\newpage
\\tableofcontents % Se genera un índice de materias
\\newpage
\\listoffigures % Índice de figuras
\\newpage % Saltamos de página
\\listoftables % Índice de tablas
\\newpage
\\section{Hola Mundo}
Hola Mundo

\\end{document} % Evidentemente, no tiene ningún sentido tener
% todos esos índices para un "Hola Mundo", pero es sólo un
% ejemplo de plantilla :)

Si escribís y compiláis ese documento, veréis que genera 5 folios en formato .pdf.

Bueno, no sé si he sido muy chapas, si es así lo siento. Espero que haya alguien a quien le haya interesado lo que he escrito aquí. Puede venir bien en algún momento, ¿no? Un saludito.

P.D. Quizá he dado demasiadas cosas por supuestas, pero lo único que se necesita para escribir LaTeX, es un editor de texto cualquiera (nano, vim, joe…) y los paquetes básicos de LaTeX: tetex-extra y los paquetes tetex-base y tetex-bin. Creo que no me equivoco al decir que con estos tres paquetes es suficiente para echar a andar con LaTeX. El documento, deberemos guardarlo con extensión .tex, luego se compila con el comando “latex archivo.tex” y después podemos sacar la salida en formato .pdf, por ejemplo, con el comando ” pdfelatex archivo.tex”. “

Métodos en Java

Domingo, 10 diciembre 2006

Todo programa (clase) en Java, tiene una serie de elementos fijos. Un elemento que aparece siempre será el método. Cada clase Java es casi seguro que tendrá algún método. Resaltar aquí que si tenemos un programa en que una clase llame a otras, la clase desde donde empiece la ejecución, y sólo está, será la que lleve el método main, el cual ya quedó más o menos explicado aquí.

Explicaremos ahora algunas cosas más sobre los métodos en Java.

A la hora de definirlo la sintaxis será la siguiente:

tipo_devuelto nombre_metodo(parametros){
sentencias;

sentencias;

....

}

Así, si tenemos un método que se llame calculaMinimo, que nos devuelva a otro sitio el valor minimo de tres enteros que le pasemos escribiremos:

int calculaMinimo(int n1, int n2, int n3){

sentencias;

...
return minimo;
}

Con lo cual, le estaremos pasando tres enteros y devolviendo en la última línea el valor mínimo calculado al lugar donde haya sido llamado el método calculaMinimo. Un método puede recibir y devolver cualquier clase de dato:

  • Datos primitivos: puede ser cualquiera de los ocho tipos primitivos (Boolean, true o false, Char, Enteros, byte, short, int, long o Reales, float y double).
  • Puede llevar antes del nombre la palabra void en vez del tipo de dato devuelto si no queremos que devuelva ningún valor.
  • Además pueden devolver objetos. La condición es que el objeto devuelto debe corresponderse con la clase citada en la definición del método o con una subclase de la misma. Esto ya lo entenderemos cuando hablemos de qué son clases y cuando sepamos qué es la herencia.

Una cosa más a tener en cuenta es que si no definimos el método como void deberemos tener obligatoriamente una sentencia return para devolver un dato dentro del método.

En Java, podemos definir objetos con el mismo nombre que reciban distintos tipos de datos. Esto se llama sobrecargar los métodos. Eso sí los métodos deben devolver la misma clase de dato (si uno es void, el que se llame igual también será void, aunque uno y otro reciban parámetros distintos). Esto nos permite en un programa, si un método tiene que hacer algo en concreto con un tipo de dato y luego queremos hacerlo con otro tipo de dato, definir dos veces el mismo método y cambiar sólo el argumento que le pasamos, no definir dos métodos con dos nombres distintos.

Una clase especial de métodos son los constructores, que son métodos que se llaman igual que la clase en la que están definidos, y que básicamente se usan para inicializar nuevos objetos del tipo de la clase (idea de objeto y clase).

Sonido en Debian con dmix

Viernes, 1 diciembre 2006

¡Hola!

Llevaba un tiempo bastante mosqueado con mi Debian por el tema del sonido. El problema me resultaba un tanto extraño y, hasta donde llegan mis conocimiento, no tenia solución: los sonidos de sistema así como los del escritorio (Gnome, of course) y los de diversos programas (amsn, gaim, beep-media-player) funcionaban bien, pero tenía ahí la espinita clavada. Al reproducir un vídeo, en cualquier formato, podía visualizarlo, pero no escucharlo. Totalmente frustrante. A continuación explicaré como se consigue solucionar este molesto tema.

Probé mil soluciones, lo primero instalé los codecs de Windows, el paquete w32codecs, porque tengo un montón de vídeos en .avi o .wmv, del repositorio de Debian Marillat. Nada. Reconfiguré alsa. Nada. Instalé paquetes adicionales de alsa, como alsaplayer-esd. Nada. Imposible mil búsquedas en San google, que todo lo sabe, pues tampoco. Nothing de nothing. Encontré una “solución”, que no era tal, ya que conseguía sonido en los reproductores de vídeo a costa de matar el esd y quedarme sin sonido en Gnome :(. Desesperado y hasta los cojones de todo, acudí a Mario, mi “gurú” particular, jeje. En cuanto se lo expliqué dijo la palabra clave: dmix.

¿Qué es dmix? Quizá a alguien le pase lo que a mí, que le dicen dmix y es como si no le dijeran nada. El dmix es un plugin que tiene alsa para solucionar el siguiente problema, el que tienen algunas tarjetas de sonido (la mía es una de ellas, una Realtek ALC850 integrada en placa compatible con AC97) al no poder reproducir varias salidas de sonido a la vez. Lo que hace dmix es generar un mezclador virtual, por así decirlo, resolviendo el problema mediante software.

Veamos lo que hay que hacer para usarlo. Lo primero matar el esd e instalar un par de librerias:

# killall esd
# apt-get install libesd-alsa0 alsa-oss

Una vez hecho esto, ya podemos hacer uso de dmix. Para ello editamos el fichero /etc/asound.conf. Yo por ejemplo no lo tenia, pero lo creé y funcionó también.

# software mixing across all apps.

#

# http://alsa.opensrc.org/index.php?page=AlsaSharing

# http://alsa.opensrc.org/index.php?page=DmixPlugin
pcm.dmix0 {

type dmix

ipc_key 219345 # any unique number here

slave {

pcm "hw:0,0"

period_time 0

buffer_time 0

period_size 2048 # jm: much smoother than 1024/8192!

buffer_size 32768

rate 48000

}

bindings {

0 0 # from 0 => to 0

1 1 # from 1 => to 1

}

}

pcm.dsp0 {

type plug

slave.pcm "dmix0"

}

# this makes native ALSA apps default to using dmix

pcm.!default {

type plug

slave.pcm "dmix0"

}

ctl.dsp0 {

type hw

card 0

}

ctl.!default {

type hw

card 0

}

Editamos por último el fichero /etc/libao.conf, y le cambiamos por esto:

default_driver=alsa

Con esto, si Debian ya sabe que debe usar alsa como servidor de sonido. ¡Así de fácil y yo volviéndome loco dos semanas!

Sólo me resta agradecer a Mario la idea, y a Leandro Mocek y su genial post, que seguí al pie de la letra para arreglar el engorro que suponía el no poder un vídeo sin tener que perder el sonido en el sistema.